Yuno15
← Tous les travaux

business · 2026

C Brain

Extraire un système de mémoire personnel en logiciel installable — sans en laisser fuir une ligne de vécu.

Rôle
Conception, architecture, extraction, publication open source
Stack
Python, Bash, Electron, WebGL, GitHub Actions, Apache 2.0
Résultat
Publié sous Apache 2.0, 24 versions, CI verte, installable en plugin — et zéro donnée personnelle sortie.

Le problème

Un agent en ligne de commande est brillant à l’intérieur d’une session et amnésique entre deux. J’ai construit pour moi un tronc de connaissance : ce que je résous une fois est distillé en fiche, rangé, relié, et resurgit tout seul la fois suivante. Après un an, il valait plus que n’importe quel projet qu’il avait aidé à écrire.

Le rendre installable par quelqu’un d’autre n’était pas un travail d’emballage. Ce tronc contient des noms de clients, des adresses, des numéros, des chemins vers ma machine. Le publier tel quel, c’est publier ma vie professionnelle.

La contrainte s’est donc écrite en une phrase : livrer le moteur, jamais le vécu.

L’architecture qui rend ça possible

Deux dossiers qui ne se mélangent jamais. engine est du code — jetable, remplacé à chaque mise à jour. trunk est le tronc de notes — il ne bouge que quand l’utilisateur écrit. Une mise à jour ne peut pas toucher au travail de quelqu’un, parce qu’elle n’a pas le droit d’écrire là.

Entre mon Brain vivant et le dépôt public, une chaîne à sens unique : une copie par liste blanche (ce qui n’est pas nommé ne sort pas — une liste noire laisse passer par défaut, et un seul oubli est une fuite), une dépersonnalisation par règles rejouables, puis un contrôle de fuite à 21 marqueurs qui a le droit de bloquer la publication.

Ce qui suit, ce sont trois pannes. Aucune n’a été trouvée en relisant le code.

Panne 1 — le garde-fou s’est retourné contre son propriétaire

En passant la licence en Apache 2.0, plus rien ne pouvait être publié. Apache exige le nom du titulaire du copyright dans les fichiers LICENSE et NOTICE : c’est ce qui fait une licence. Le contrôle de fuite, lui, voyait mon nom et faisait ce pour quoi il avait été écrit — il bloquait.

Trouvé en tentant de publier, pas en auditant. La tentation était d’assouplir le motif. C’était le mauvais geste : un garde-fou qu’on émousse pour se débloquer ne protège plus rien. L’exemption est donc ciblée — le nom du propriétaire est toléré dans ces deux fichiers et sur une ligne de copyright, et nulle part ailleurs. Vérifié après coup : le même nom en prose, un nom de client, une clé en clair déclenchent toujours le rouge.

Panne 2 — une capsule devenue invisible, sans une seule erreur

Le paquet a une petite fenêtre qui montre les agents travailler. En renommant le dossier utilisateur, j’ai remplacé tous les chemins. Sauf un : le motif qui sert à détecter si la fenêtre tourne déjà — il ne commençait pas par ~, donc il n’apparaissait dans aucune recherche de chemin.

Résultat : la capsule devenait invisible pour les deux processus chargés de la relancer et de la compter. Aucun plantage, aucun message. Simplement plus jamais relancée.

Trouvé en préparant une capture pour le README — donc en regardant ce qu’un utilisateur verrait. C’est devenu une règle : après un renommage, chercher aussi les chemins qui ne ressemblent pas à des chemins.

Panne 3 — un tag qui masquait une branche figée

Le script de publication poussait une branche écrite en dur au lieu de la branche courante. Publier depuis la branche française poussait donc le tag… et une branche anglaise déjà à jour. Les commits français ne partaient jamais.

Et rien ne le signalait, parce qu’un tag transporte les objets : la mise à jour fonctionnait chez les utilisateurs, la version existait, la release s’affichait. Seule la branche distante restait figée — pour quiconque la clonerait ensuite.

Trouvé en contrôlant git log origin/branche..branche, qui doit être vide après une publication. Le contrôle est devenu systématique : après un push, on vérifie la branche, pas le tag.

Ce que ça a changé

Le projet est public sous Apache 2.0, 24 versions publiées, installable en plugin Claude Code, avec une intégration continue qui rejoue à chaque commit l’installation complète, la désinstallation, et chaque migration deux fois — en exigeant qu’elle n’ait mangé aucune fiche.

Le résultat qui compte n’est pas le nombre de versions. C’est qu’un système personnel, nourri de données réelles pendant un an, soit devenu un logiciel que n’importe qui peut installer — sans qu’une seule ligne de ce vécu ne soit sortie.

Code source : github.com/Yuno15-bb/c-brain