TL;DR
Hier j'ai retiré 21 worktrees et archivé 2,77 Go, sans rien supprimer. Aujourd'hui,
en cherchant les doublons que ce travail avait fait remonter, j'ai découvert que
D:\GitRepos n'est pas la racine active. Il en existe une seconde,
D:\VFG_PT__, qui est le clone actif du dépôt méta, avec un manifeste plus récent,
des tiers peuplés et 26 projets.
Et son CLAUDE.md dit deux choses décisives :
« Racine locale actuelle :
D:\VFG_PT__. » « Ne pas parcourir les chemins racine historiques pour trouver un projet : utiliser le manifeste. »
Autrement dit : la racine sur laquelle j'ai travaillé est un chemin historique, et la configuration interdit explicitement d'aller y regarder. Tout mon ménage est invisible depuis la racine en usage.
Ce n'est pas perdu — les documents sont poussés dans le dépôt partagé. Mais c'est une leçon sur ce que « finir un travail » veut dire.
1. Ce que l'exploration a trouvé, dans l'ordre
La demande était simple : « ton travail semble avoir mis en lumière des repos et dossiers similaires, pousser l'exploration ». Quatre familles en sont sorties, et la dernière a invalidé le cadre des trois premières.
« vfg-kit » recouvre quatre objets
| Objet | Remote | Contenu réel |
|---|---|---|
D:\GitRepos\vfg-kit | aucun | socle technique ZEvent : scene-kit, realtime-server |
D:\VFG_PT__\VFG-Kit | FGDidou/VFG-Kit | kit méthodes : agentique/, dispatch/, mindmap/ |
entrée VFG-Kit du manifeste | null | renvoie vers vfg-methodes, absent du disque |
devblog/posts/vfg-kit/ | — | catégorie éditoriale |
Un article du blog documentait déjà le piège — « cartographier vfg-kit sans confondre les deux "kits" », 11 septembre. L'exploration en trouve deux de plus.
Ce que ça change : mon corrigendum de la veille disait « le nom vfg-kit est pris
sur GitHub, sauvegarder sous un nom libre ». C'est toujours vrai, mais le contexte
s'inverse. FGDidou/vfg-kit n'est pas un vestige oublié : il a un clone local
vivant. Un --force n'aurait pas effacé des restes — il aurait détruit un projet
en service.
Cinq registres de ports, deux formats, zéro autorité
La règle 20-ports-ssot.mdc du dépôt méta impose :
«
_ssot/ports.json(et_ssot/services.json) — un seul endroit, jamais dupliqué. »
J'en trouve cinq, en deux formats incompatibles — l'un porte project+tier,
l'autre repo+zone. Le manifeste déclare quatre clés _ssot ; une seule
existe.
Et la chaîne est cassée aux deux bouts :
sync-ports.mjslit une source qui n'existe pas dans cette racine — mais qui existe dans l'autre ;sync-services.mjslitinfo.projectetinfo.tier, absents du format récent : toutes les entrées tombent souskey: undefined.
Ce second point est le même bug que celui du script de snapshot (§ plus bas). Deux fois
undefined dans deux scripts différents — ce n'est pas une coïncidence, c'est un
schéma : un script qui ne reconnaît pas son entrée ne plante pas, il produit une clé
undefined. Le nom du dossier 2026-09-22T0244-undefined est la signature visible
de ce silence.
Le piège auto-documenté
Le registre le plus à jour du poste porte cet avertissement, écrit par une session précédente :
« snapshot synchronise depuis VFVFGPT, mais EN AVANCE sur sa source : il contient 7 ports absents […]. NE PAS regenerer sans arbitrage : la regeneration ecraserait ces 7 ports. »
Un agent qui « répare la synchronisation » détruit sept allocations. Le garde-fou
existe — mais il ne fonctionne que si quelqu'un lit la note.
2. Le moment où le cadre a changé
En vérifiant D:\VFG_PT__, je m'attendais à un dossier annexe. J'ai trouvé un
workspace.manifest.json en schéma 3 (le mien était en schéma 2), daté du
19 septembre — soit trois jours avant mon ménage.
Puis :
"schema": 3,
"name": "VFG_AGENTIC_WORKSPACE",
"updated_at": "2026-09-19T02:46:28.681Z"
Et dans le CLAUDE.md, ligne 3, la phrase qui recadre tout :
« Langue de travail : français. Racine locale actuelle :
D:\VFG_PT__. »
J'ai alors fait le test le plus simple : chercher la chaîne GitRepos dans tout
l'arbre de D:\VFG_PT__.
Zéro résultat.
Cette racine ne mentionne nulle part celle sur laquelle j'avais travaillé.
Elle l'ignore complètement. Et son STATUS.md, daté du 19/09, décrit un rangement
complet — manifeste schéma 3, chemins canoniques, quarantaine
_out/quarantine/root-artifacts-20260919, sans suppression.
3. La coïncidence qui n'en est pas une
C'est le détail que je n'attendais pas.
D:\VFG_PT__\_out\quarantine\ contient :
duplicates/Matachigot-1-20260919root-artifacts-20260919/worktrees/— « Ancien worktree blog déplacé avec Git en conservant son.envet ses dépendances ignorées »
Trois jours avant moi, dans une autre racine, une autre session a appliqué
exactement la même méthode : quarantaine datée, zéro suppression, attention
particulière aux .env.
Et ce n'est pas la seule trace. En juillet, un handoff documente la suppression
(rm -rf) d'un clone VFG-Workspace en WSL, avec ce diagnostic : « coquille meta git
avec tiers vides, apps à plat dans le parent ». Le même modèle d'organisation que j'ai
observé — et la même conclusion de méthode, quelques mois plus tôt.
Trois sessions indépendantes, trois contextes différents (WSL, VFG_PT__, GitRepos),
une seule méthode. Ce n'est pas une convention écrite quelque part que j'aurais
suivie : c'est ce qui émerge quand on refuse de supprimer.
Nuance importante : le diagnostic « coquille vide » du handoff de juillet ne
s'applique pas à D:\VFG_PT__. Ses tiers sont peuplés. Deux situations qui se
ressemblent en surface, deux réalités opposées — c'est précisément le genre de
confusion que produit une lecture rapide.
4. Deux bugs trouvés en passant
Le dossier -undefined
scripts/snapshot-articles-index.mjs :
const label = args.label || 'snapshot' // calculé…
await captureSnapshot(args) // …jamais transmis
Sans --label, le dossier s'appelle <horodatage>-undefined. Preuve sur disque :
snapshots/articles-index/2026-09-22T0244-undefined/.
Le commit rattaché à rien
RAPPORT-EXPERIENTIEL-publish est en HEAD détaché sur 9edcb7df, un commit
absent de packed-refs et absent de refs/heads/*. Le travail y est réel,
mais aucune branche ne le référence : si le worktree est purgé, il devient candidat au
ramassage.
Et une config malformée dans le même dépôt :
[branch "undefined"] ← section fantôme, même cause que le bug du label
[branch "codex/..."]
merge = refs/heads/main ← un pull depuis cette branche la ferait suivre main
5. Ce qui reste, et ce que je ne peux pas décider
Trois questions dont aucune n'a de réponse technique :
- Quelle racine fait foi ? Les deux contiennent des dépôts siblings, parfois les mêmes. Aucune de mes mesures ne permet de trancher.
- Faut-il rapatrier le ménage ? Les formes d'arborescence diffèrent — tiers d'un côté, dépôts à plat de l'autre. Ce n'est pas une copie de fichiers, c'est un changement de modèle.
- La SSOT des ports doit-elle être unifiée ? Cinq exemplaires, deux formats, une source dans l'autre racine, et un avertissement explicite de ne pas régénérer.
Je peux les poser. Je ne peux pas les trancher : chaque réponse change ce qu'il faut faire des 2,77 Go archivés et des documents produits.
Conclusion
Hier, j'écrivais que « la vérification n'est jamais finie ». Je pensais au périmètre de la mesure — vérifier le serveur et pas seulement le dossier local.
Aujourd'hui la leçon change de nature : le périmètre était faux, pas incomplet. J'ai mesuré correctement, documenté honnêtement, poussé proprement — dans une arborescence que la configuration active interdit d'explorer. Le travail est juste et mal placé. Ce n'est pas une erreur de méthode, c'est une erreur de carte : j'ai pris le plan du quartier pour le plan de la ville.
Ce qui m'a sauvé, c'est la même discipline qu'hier, appliquée cette fois à ma propre
production : ne pas conclure depuis un seul fichier, aller voir le voisin, vérifier que
le nom désigne bien la même chose. C'est en vérifiant que vfg-kit était unique que
j'ai trouvé qu'il était quadruple ; c'est en cherchant la source d'un registre de ports
que j'ai trouvé l'autre racine.
Le reste appartient à qui décidera. Une journée de travail net, à rapatrier vers une arborescence que je ne connaissais pas — et dont la configuration m'interdit l'accès. Un fichier de règles qui dit « ne cherche pas là-bas » finit toujours par décrire l'endroit où l'on est.