mikado-method
Une discipline pour restructurer du code dont le graphe de dépendances réel n’est pas connaissable à l’avance : essaie, laisse le compilateur et les tests révéler les dépendances, revert, puis construit les prérequis bottom-up.
Quand l’utiliser
- Changement sur place risquant de casser de façon difficile à prévoir
- Chargé en interne par brownfield-refactorer quand l’humain choisit la restructuration sur place plutôt que Strangler Fig
Structure du skill
Quatre fichiers, pas un seul :
SKILL.md— boucle, format minimal du graphe, gate de validationreferences/graph-format.md— spec annotée complète (marqueurs, arêtesrequires:, gate golden-master), chargée à la demandereferences/worked-example.md— trace complète d’un cycle, chargée à la demandescripts/validate-mikado.sh— validateur Bash déterministe à 8 passes, inspiré du validateur de chaabani-anis/mikado-method (licence MIT) mais réimplémenté pour parser le format Mermaidgraph TDpropre à SKRAFT — pas le format texte en rail-notation de ce projet ; ce n’est pas une copie verbatim
Précondition
Un filet de sécurité vert doit exister (characterize-with-contracts / brownfield-harness-builder). Une couverture faible produit de fausses feuilles ; gate CONCERNS/FAIL → renforcer le harness d’abord.
Les quatre primitives (appliquer exactement)
- Goal — une phrase concrète orientée valeur métier, validée avec l’humain (rejeter les objectifs vagues)
- Naive experiment — worktree isolé, tenter le plus évidemment, lancer build + suite complète ; c’est un CAPTEUR, jamais un brouillon
- Visualize — chaque échec est un prérequis → noeud du graphe avec arête vers le goal ; citer
file:line+ message - Undo — jeter le worktree entièrement ; jamais
git stash, jamais garder du code « presque marchant » ; le revert est gratuit
Contrat de sortie
- Graphe persistant :
.copilot-tracking/skraft-plans/{projectSlug}/refactoring/{YYYY-MM-DD}/mikado-<slug>.md, Mermaidgraph TD, noeuds marqués[ ]/[x](pending/done), classesobservedvsanticipated - Arêtes
-.requires.->en pointillés pour les prérequis partagés entre plusieurs parents — le graphe est un vrai DAG, pas seulement un arbre - Une gate golden-master obligatoire : soit un noeud dont le libellé mentionne « Golden Master », soit un commentaire Mermaid explicite
%% no-golden-master: <raison> - Feuilles implémentées une à une sur la vraie branche, commit vert après chacune
- Signaux terminaux vers
brownfield-refactorer:ADVANCE/EXPAND/DONE/BLOCKED
Validation obligatoire (8 passes)
bash plugins/skraft-framework/skills/mikado-method/scripts/validate-mikado.sh <path-to-graph.md>
À exécuter avant chaque commit de feuille et après chaque commit de mise à jour du graphe. Exit 0 requis pour continuer — jamais avancer sur un graphe non validé.
- Parse — noeuds, arêtes, classes
- Traçabilité — chaque noeud non-goal porte
discovered:+error:, saufanticipated - Validation des références
requires:— toute arête doit résoudre vers un noeud défini - Détection de cycle — arbre + arêtes
requires: - Direction de l’arbre (ancestry via git) — le commit
discovered:de l’enfant doit être ancêtre-ou-égal à celui du parent, message conforme au préfixerefactor(mikado-graph): <what>; gate avec--no-gitpour les fixtures - Détection d’orphelins (avertissement seulement)
- Gate golden-master — noeud « Golden Master » ou
%% no-golden-master: <raison> - Énumération des vraies feuilles — prêtes pour le prochain dispatch
Invariants
- La feuille = prérequis sans enfant non implémenté — jamais démarrer un parent avant ses enfants
- Le graphe est l’artefact — recharger à chaque frontière de re-grounding, jamais le recall
- observed vs anticipated — confirmer une hypothèse par une vraie tentative avant de la traiter en prérequis
requires:= DAG, pas arbre — un prérequis partagé entre deux parents est un lien croisé, jamais dupliqué- Gate golden-master avant la première feuille — noeud « Golden Master » ou déclaration
no-golden-masterexplicite, sinon le validateur bloque - Un spawn
refactoring-workerpar feuille — signauxADVANCE/EXPAND/DONE/BLOCKED
Pourquoi cette forme
Le graphe survit entre itérations ; le code de l’expérience échouée est toujours jeté. Mikado ne fonctionne qu’avec un filet de sécurité — sans tests, rien ne casse parce que rien n’est vérifié, pas parce que rien n’en dépend.
« The main thing that distinguishes legacy code from non-legacy code is tests, or rather a lack of tests. » — Feathers, M., Working Effectively with Legacy Code, 2004.
Customisation autorisée
- Classes de noeuds du graphe (
observed/anticipated) - Granularité des feuilles dispatchées au worker
Voir aussi
- characterize-with-contracts — Précondition : le filet de sécurité vert
- strangler-fig-method — Stratégie alternative (remplacement plutôt que restructuration)
- brownfield-refactorer — Agent qui charge ce skill et pilote la boucle
- refactoring-worker — Implémente chaque feuille dans un contexte frais
- Brownfield — Vue d’ensemble de la famille