l'autre moitié
Des choses que j'ai construites parce que je voulais qu'elles existent.
PANTHEON, c'est le travail. Voici ce que produisent les mêmes instincts quand personne ne paie pour le résultat : un vrai ciel sur un bureau, des éphémérides sans dépendances, et un terminal qui sait dessiner. La discipline est identique ; seuls les enjeux changent.
GNOME Shell · GPL-2.0 · ★3
TerraFirma : un vrai ciel sur votre fond d'écran.
Pas une animation d'un ciel. Le vrai, calculé à partir d'éphémérides pour votre latitude, votre longitude et votre horloge.
La boucle critique est mesurable à dessein
La projection et l'atmosphère se trouvent dans skymath.js, qui n'importe rien de GNOME Shell. Un fichier qui ne peut tourner qu'à l'intérieur d'une session ne peut qu'être deviné ; un fichier qui tourne de façon autonome peut être chronométré. Cette frontière relève du même raisonnement que le lint de pureté qui tient le cœur de PANTHEON à l'écart de sa couche applicative.
Le catalogue d'étoiles et les éphémérides proviennent de tiers et sont crédités dans NOTICE.md. Indiquez-lui une date, puis levez les yeux : pour ce type de logiciel, c'est le seul test qui compte.
Pourquoi la boucle critique a dû sortir → · TerraFirma sur GitHub ↗
extraits et publiés
Trois paquets qui en sont issus.
Le même schéma que pour les six de PANTHEON : construire la chose, trouver la partie réellement réutilisable, l'extraire et la publier selon ses propres termes. Les trois sont sous licence MIT et installables dès maintenant.
braillecanvas v0.4.0 · MIT
Le braille adresse 2×4 points par cellule de caractère, donc un terminal 80×24 est en réalité une toile de 160×96. C'est la différence entre un rendu et de l'art ASCII.
La partie intéressante, c'est la couleur. Chaque cellule porte deux couleurs, une pour les points allumés, une pour les vides, de sorte qu'une cellule à cheval sur un contour, peau contre ciel, conserve le contour au lieu d'en faire une moyenne boueuse. L'erreur de couleur moyenne par point sur cette image passe de 45.7 à 21.3.
Choisir quels points s'allument dans chaque cellule, plutôt que de prendre le motif d'une grille de tramage fixe, fait passer les cellules sans texture de 35.1% à 1.6%.
Deux limites indiquées dans son propre README : en dessous d'environ 90 colonnes, les photographies ne fonctionnent plus, et le monochrome ne peut pas du tout rendre cette image, son visage mesure 159 de luminance contre 192 pour le ciel derrière elle, donc un rendu 1 bit donne par construction une silhouette.
skymaths v0.1.2 · MIT
Astronomie de position sans dépendances : Soleil, Lune, planètes, crépuscule, lever et coucher. Extrait de l'éphéméride de TerraFirma, puis corrigé : le polynôme d'Espenak–Meeus qu'il utilisait n'est publié que pour 1900–1920 et était appliqué à 1986, donnant −534 secondes pour 1950 contre +29 mesurées. Trouvé en le comparant à un almanach publié plutôt qu'à lui-même.
Il tourne sur ce site : en mode sombre, l'arrière-plan est le ciel au-dessus de Cardiff la nuit des Perséides, le 13 août 2026, calculé dans votre navigateur : 5,044 étoiles dans leurs vraies couleurs, la phase de la Lune et les planètes là où elles se trouvaient. Faites défiler pour tourner.
npm i skymaths · npm ↗ · source ↗
starwheel v0.2.3 · MIT · ★4
Un planisphère en direct dans votre terminal, avec les vraies positions des étoiles pour votre lieu et votre minute, dessiné avec braillecanvas. Mon dépôt le plus étoilé, et celui qui m'a appris qu'un correctif qui déplace des pixels publiés n'est jamais deux fois le même correctif : celui-ci borne les itérations là où son pendant découpe, délibérément.
/proc, CPU, mémoire et charge moyenne, sur une fenêtre glissante. Les graphiques fonctionnent bien en dessous du minimum de 90 colonnes qu'exigent les photos, parce qu'ils sont déjà très contrastés.sur cette page, en ce moment
L'art est généré, et la graine ne peut pas s'échapper.
Chaque visuel de ce site : l'image d'en-tête ci-dessus, le favicon, les cartes sociales, les avatars, sort du propre générateur de PANTHEON. Déterministe et à graine : la même graine donne la même image, à chaque fois.
Même contrat des deux côtés
Un moteur côté serveur génère les cartes sociales et les sites des tenants ; un moteur côté navigateur dessine la version animée que vous regardez. Même règle : une graine en entrée, un art reproductible en sortie.
Résistant à l'injection par construction
La graine alimente le PRNG et rien d'autre. elle n'est jamais interpolée dans du balisage ou un style. Un nom de tenant qui est en réalité une charge malveillante dessine une image différente ; il ne dessine pas une balise script. Le même réflexe que dans le reste du système, appliqué à la décoration.
installable, pas seulement lisible
Six garanties, extraites et publiées.
Chacun est sorti de PANTHEON sous la forme d'une promesse unique et vérifiable, puis est parti sur PyPI pour exister de façon autonome. Des agents IA adverses, lancés par moi-même, non indépendants, les ont passés en revue ligne par ligne et ont trouvé de vrais défauts ; les versions ci-dessous sont celles qui suivent ces correctifs, chacune vérifiée en l'installant depuis le registre dans un environnement propre et en relançant la reproduction du relecteur lui-même, et non en se fiant au journal de build.
pantheon-guardrails v0.3.2 · Apache-2.0
Un évaluateur de constitution qui ne sollicite un juge LLM que pour les réponses à fort enjeu, et qui exige que ce juge soit un modèle différent du générateur pour qu'ils ne partagent pas les mêmes angles morts. Auparavant, il ramenait un score hors plage vers le haut : un juge renvoyant {"clarity": 99} obtenait un 1.0 parfait et passait tous les seuils : un garde-fou qui échouait en mode ouvert. Désormais, un juge qui lève une exception, se bloque ou renvoie n'importe quoi produit une évaluation explicitement en échec, bloquante par défaut.
pantheon-ssrf-guard v0.2.1 · Apache-2.0
Une protection de sortie SSRF à deux couches qui résiste au DNS rebinding : elle revérifie l'IP que le socket a réellement atteinte au moment de la connexion, donc un hôte qui se résout en adresse publique puis se relie à loopback ou aux métadonnées cloud est refusé. La revue a montré que l'opener lisait encore les URL file://, car Python installe par défaut des handlers pour d'autres schémas ; il y a désormais une liste d'autorisation http/https explicite à la frontière, redirections comprises, et les proxys d'environnement sont désactivés sauf si vous les demandez.
pantheon-tool-sanitizer v0.3.0 · Apache-2.0
Retire le balisage de protocole d'outil et la contrebande Unicode du texte non fiable des outils MCP avant qu'il n'atteigne le prompt d'un agent. Périmètre honnête : il ne prétend pas arrêter l'injection en prose simple, qui est un problème d'architecture plutôt qu'un problème de chaîne de caractères. Deux correctifs issus de la revue : une entrée adverse de 256 kB prenait 26 secondes de CPU et est désormais refusée d'emblée, et "Read\nthe\tfile" ne devient plus "Readthefile", car un saut de ligne est une frontière de mot.
credit-ledger v0.3.0 · Apache-2.0
Un comptage à l'épreuve des découverts sur Postgres en environ 150 lignes : 100 débits parallèles sur un solde de 50 et exactement 50 réussissent, une facturation exactement une fois malgré les rejeux de webhooks, une isolation imposée par la sécurité au niveau des lignes. La version publiée acceptait auparavant un débit négatif, qui payait le client, et des montants inférieurs à la précision de la colonne, qui facturaient 0.0000 tout en signalant un succès. Une seule règle de montant couvre désormais tous les chemins, et une migration testée existe pour les bases de données déjà en place.
pantheon-ical v0.3.1 · Apache-2.0
iCal aller-retour (RFC 5545) pour les calendriers de réservation en moins de 200 lignes. Une période occupée perdue se lit comme libre, donc le silence est la défaillance dangereuse : un calendrier surdimensionné est refusé plutôt que tronqué, et une règle de récurrence qui déborde le signale au lieu de renvoyer une liste incomplète. Le dernier correctif a borné le travail autant que le résultat : une règle hostile d'une seule ligne construisait auparavant 34 millions d'occurrences en 76 secondes avant d'être rejetée ; elle s'arrête désormais à 401.
pantheon-rls v0.1.1 · Apache-2.0
L'isolation des tenants comme garantie Postgres plutôt que comme habitude applicative : force-RLS plus des droits au moindre privilège, de sorte que la base de données elle-même refuse les lectures et écritures entre tenants. Fail-closed par construction : sans contexte de tenant, on obtient zéro ligne, jamais toutes les lignes, et c'est ce mode de défaillance qui compte quand un bug atteint la production à 3 h du matin.
Chaque correctif ci-dessus est arrivé de la même façon : reproduire d'abord le défaut, corriger la frontière plutôt que le symptôme, puis prouver que le nouveau test échoue quand on réintroduit le bug. Un test qui ne peut pas échouer n'est pas une preuve.
ce sur quoi il tourne
La stack est banale. La frontière, non.
Python 3.12, FastAPI, Postgres, Redis, React avec Vite, un seul Dockerfile derrière nginx. Rien de tout cela n'est un choix digne d'admiration : ce sont les pièces qu'on choisit pour que l'attention puisse aller là où elle compte.
146 fichiers · 14,002 lignes
pantheon-core : le substrat. Indépendant du domaine par contrat : il ne peut pas importer depuis residents ou bundles, et deux vérifications indépendantes font échouer la CI s'il le fait.
210 fichiers · 24,216 lignes
Tests, sur 38,816 lignes de Python. Je n'écris pas l'implémentation à la main, donc la suite n'est pas un filet de sécurité. C'est la spécification, et c'est l'artefact dont je suis réellement l'auteur.
Cinq couches, un seul sens
architect · runtime · guardrails · substrate · primitives, avec providers délibérément hors de la pile, parce qu'il se situe sous deux couches à la fois et que le contrat le dit ouvertement plutôt que de se tordre.
Cette frontière explique pourquoi six composants ont pu être extraits et publiés comme bibliothèques autonomes : l'extraction a surtout consisté à déplacer des fichiers qui n'avaient jamais eu le droit de dépendre des couches inférieures. La version longue, y compris la partie où je me suis trompé →
Même personne, mêmes règles, enjeux moindres.
Personne n'audite un fond d'écran. Si ceux-ci sont construits ainsi, c'est que c'est la seule façon que je connaisse de construire : mesurer, extraire la partie réutilisable, publier ses limites avec, et vérifier les chiffres face à quelque chose d'extérieur au programme.
Posez une question sur n'importe quelle partie de ce travail.
- Quel poste Isaac recherche-t-il ?
- Lesquels de ces éléments tournent en production ?
- Montrez-moi un vrai bug qu'il a trouvé et corrigé