Machine d'états¶
Cette page inclut le contenu complet du document de référence sdlc/SDLC.md. C'est la source de vérité pour la machine d'états : méta-états, workflows par objet (BE / FE / US), mapping des 4 portes G1–G4 (+ boucle MVP→G1) aux transitions, usage de la CLI, invariant de sécurité.
Pour la source exécutable, se reporter à sdlc/schema.js. Pour la documentation par porte avec préconditions, invariants et checks, se reporter à Les 4 portes.
Inclusion directe
Le contenu ci-dessous est inclus depuis sdlc/SDLC.md. Toute modification de la machine d'états doit être faite dans le fichier source — pas ici.
SDLC sdeg-kernel — Machine d'États par Étape Décisionnelle (v3)¶
Source : sdlc/schema.js · CLI : node sdlc/sdlc.js · Registre : .product/sdlc-registry.json
Principe fondateur : LIVING / COLD¶
Décision prise
│
▼
┌───────────┐ La décision GÈLE les artefacts qui l'ont précédée.
│ COLD │ ← Ils deviennent COLD : non modifiables, historique définitif.
└───────────┘ On ne revient pas sur le passé — on ouvre un nouveau grain.
Avant la décision
│
▼
┌───────────┐
│ LIVING │ ← L'artefact évolue, on apprend, on raffine.
└───────────┘ N'importe quel changement est possible.
"On fige le passé en prenant des décisions de design." — Le modèle de connaissance du programme
Les 5 Méta-États¶
| Méta-état | Heat | Signification | Badge |
|---|---|---|---|
NOT_STARTED |
COLD | Ambition non engagée — backlog froid | ○ |
IN_PROGRESS |
LIVING | Artefact actif, mutable, en cours d'apprentissage | ● |
BLOCKED |
LIVING-gelé | En attente d'une dépendance externe (gouvernance, accès, budget) | ◐ |
DONE |
COLD | Décision prise, artefacts gelés, historique définitif | ✓ |
ARCHIVED |
COLD | Déprioritisé sans conclusion formelle | ✕ |
Règle de dérivation : la propriété heat est dérivée du méta-état. On ne la saisit jamais manuellement.
Pourquoi BLOCKED séparé d'IN_PROGRESS ? En contexte entreprise, les instances de gouvernance sont calendrées, les accès attendent une revue conformité, les budgets sont en review. Sans BLOCKED, tout IN_PROGRESS qui attend devient un bruit. BLOCKED = LIVING mais progression gelée en attente d'un événement externe documenté.
Pourquoi distinguer TERMINE / PIVOTED / ARCHIVED dans DONE ?
Ces trois fins de vie ont des significations portfolio radicalement différentes :
- TERMINE : ROI atteint, hypothèse validée → capitalisation dans la vision
- PIVOTED : hypothèse infirmée → apprentissage documenté, nouvelle BE ouverte
- ARCHIVED : déprioritisation → ni succès ni échec formel
Workflow des États par Objet¶
Business Epic (BE)¶
╔══════════════════════════════════════════════════════════════╗
║ COLD — ambition non démarrée ║
║ NOT_STARTED ○ ║
╚══════════════════╤═══════════════════════════════════════════╝
│ Ouverture du cycle de Vision
▼
╔══════════════════════════════════════════════════════════════╗
║ LIVING ║
║ VISION_EN_COURS ● ║
║ Artefacts LIVING : asis · tobe · ehs · lbc · okrs · decision║
╚══════════════════╤═════════════════════════════════╤═════════╝
│ G1 — Vision arrêtée │ BLOCKED ◐
│ Gèle asis+tobe+ehs+lbc+okrs+decision → COLD
▼ ▼
╔══════════════════════════════════════════════════════════════╗
║ COLD côté Vision · LIVING côté plan de dév ║
║ ENGAGE ● ║
╚══════════════════╤═══════════════════════════════════════════╝
│ Ouverture du Plan de dév BE
▼
╔══════════════════════════════════════════════════════════════╗
║ LIVING ║
║ DEV_PLAN_EN_COURS ● ║
║ Artefacts LIVING : plan-dev.md + dossiers Feature ║
╚══════════════════╤═══════════════════════════════════════════╝
│ G2 — Plan de dév BE arrêté
│ Gèle plan-dev.md → COLD ; ≥ 1 FE rattachée
▼
╔══════════════════════════════════════════════════════════════╗
║ DEV_PLAN_ARRETE ● ║
╚══════════════════╤═══════════════════════════════════════════╝
│ Lancement de la fabrication MVP
▼
╔══════════════════════════════════════════════════════════════╗
║ FABRICATION_MVP ● ║
║ Les Features fabriquent ; les USs livrent (G3 puis G4) ║
╚══════════════════╤═══════════════════════════════════════════╝
│ Déploiement MVP en conditions réelles
▼
╔══════════════════════════════════════════════════════════════╗
║ REVUE_MVP ● ║
║ Bilan factuel outcomes réels vs EHS ║
╚══════╤══════════════╤══════════════╤══════════════╤══════════╝
│ │ │ │
TERMINE ✓ │ PERSEVERE ● │ PIVOTED ✓ │ ARCHIVED ✕ │
(ROI max) │ (Re-G1 : │ (hypothèse │ (abandon) │
│ nouveau │ infirmée) │ │
│ cycle) │ │ │
▼ ▼ ▼ ▼
COLD LIVING COLD COLD
████ ▼ ████ ████
VISION_EN_COURS
(boucle MVP→G1)
Feature (FE)¶
NOT_STARTED ○
│ Ouverture du cadrage PRD (parent BE en DEV_PLAN_ARRETE+)
▼
PRD_EN_COURS ●
│ Artefact LIVING : prd.md (problème · personas · succès)
│ Le PRD reste LIVING jusqu'à G3.
▼
FAB_PLAN_EN_COURS ●
│ Artefacts LIVING : spec.md · plan-fab.md · USs
│
│ G3 — Plan de fab FE arrêté
│ Gèle prd.md + spec.md + plan-fab.md → COLD ; ≥ 3 USs INVEST attachées
▼
FAB_PLAN_ARRETE ● [G3]
│ Lancement de la fabrication
▼
FABRICATION ●
│ Quand toutes les USs sont LIVRE → agrégation
▼
LIVRE ✓ COLD ████
v3 (ADR-0009) :
PRD_EN_COURSest un statut LIVING intermédiaire. Il ouvre la rédaction du PRD (problème, personas, critères de succès) avant la décomposition en use cases / USs. La transition directeNOT_STARTED → FAB_PLAN_EN_COURSreste disponible endeprecated: truepour la migration v2→v3.
Récit / User Story (US)¶
NOT_STARTED ○
│ Démarrage dev (parent FE en FAB_PLAN_ARRETE+)
▼
DEV ●
│ TDD : RED → GREEN → REFACTOR
│
│ G4 — Incrément livré
│ Frontmatter requis : pr_url · merge_sha · ci_status ∈ [green, passed, success] · deployed_at
│ Gèle story.md → COLD
▼
LIVRE ✓ COLD ████
Les 4 Portes sdeg + Boucle MVP→G1¶
| Porte | Nom | Objet | Transition | Artefacts gelés |
|---|---|---|---|---|
| G1 | Vision arrêtée | BE | VISION_EN_COURS → ENGAGE | asis · tobe · ehs · lbc · okrs · decision |
| G2 | Plan de dév BE arrêté | BE | DEV_PLAN_EN_COURS → DEV_PLAN_ARRETE | plan-dev.md + ≥ 1 FE rattachée |
| G3 | Plan de fab FE arrêté | FE | FAB_PLAN_EN_COURS → FAB_PLAN_ARRETE | prd.md · spec.md · plan-fab.md + ≥ 3 USs |
| G4 | Incrément livré | US | DEV → LIVRE | story.md (PR mergée, CI verte, déploiement) |
| Re-G1 | Nouveau cycle de vision (boucle MVP→G1) | BE | PERSEVERE → VISION_EN_COURS | — (rouvre la Vision pour un nouveau cycle) |
Pas de porte distincte pour la fin de Feature ni pour la livraison/déploiement : la fin de FE est l'agrégation de toutes ses USs en
LIVRE. La livraison/déploiement est encodée dans le frontmatter de l'US à G4 (deployed_at).
Usage du CLI¶
# Vue d'ensemble du portefeuille
node sdlc/sdlc.js status
# Voir la prochaine porte d'un objet + ses prérequis
node sdlc/sdlc.js check BE-I
# Transitionner (interactif — checklist obligatoire)
node sdlc/sdlc.js move BE-I ENGAGE
# Transitionner avec message de contexte
node sdlc/sdlc.js move BE-I REVUE_MVP --message "MVP Sprint 4 déployé"
# Transitionner sans validation interactive (CI/CD, scripts)
node sdlc/sdlc.js move US-1 LIVRE --force
# Créer un nouvel objet
node sdlc/sdlc.js init be BE-VI "Nouvelle Business Epic"
node sdlc/sdlc.js init fe FE-1 "Feature exemple"
node sdlc/sdlc.js init us US-1 "Récit exemple"
# Voir l'historique des transitions d'un objet
node sdlc/sdlc.js log BE-I
# Valider la cohérence du registre (appelé par le pre-commit hook)
node sdlc/sdlc.js validate
Options globales¶
| Option | Effet |
|---|---|
--force |
Ignore la checklist interactive (conservé dans l'historique) |
--no-git |
Ne crée pas de commit automatique |
--message "texte" |
Ajoute une note de contexte dans l'historique et l'événement |
Architecture des fichiers¶
sdlc/
schema.js ← Source unique de vérité : états et transitions autorisés
sdlc.js ← CLI — SEUL POINT de modification d'état
install-hooks.js ← Installe le pre-commit hook de validation
SDLC.md ← Cette documentation
.product/
sdlc-registry.json ← Registre persistant de l'état de tous les objets
.events/
YYYY-MM-DD-sdlc-<id>-<statut>.md ← Journal des transitions
Invariant de sécurité¶
┌─────────────────────┐
│ sdlc-registry.json │ ← état versionné dans git
└──────────┬──────────┘
│ modifié UNIQUEMENT par
▼
┌─────────────────────┐
│ sdlc/sdlc.js │ ← seul acteur autorisé
└──────────┬──────────┘
│ validé par
▼
┌─────────────────────┐
│ sdlc/schema.js │ ← référentiel des transitions
└─────────────────────┘
pre-commit hook → bloque tout commit qui contient
une modification de sdlc-registry.json non validée
Installation du hook (une fois)¶
Règles de gouvernance¶
- Le registre ne se modifie jamais à la main. Seul
sdlc.jsy écrit. - Chaque transition crée un événement dans
.product/.events/et un commit git. - Un objet COLD est en lecture seule. Toute évolution = nouveau cycle (Re-G1 pour une BE) ou nouvelle BE/FE/US.
- BLOCKED est une transition visible. Il ne faut pas laisser un IN_PROGRESS stagner sans raison documentée.
- PERSEVERE n'est pas un état terminal. C'est une décision de réinvestissement → boucle MVP→G1 : retour à
VISION_EN_COURSpour un nouveau cycle de Vision. - L'historique git + les
.events/sont le journal de bord du programme. Ne jamais amender un commit de transition.
Historique du modèle¶
- v1 (jusqu'à avril 2026) : 10 portes P1–P10. Découpage fin (P1 réception EO, P2 GO Cadrage, P3 GO Fabrication, P4 PI Planning, P5 DOR récit, P6 DoD, P7 validation iso-prod, P8 homologation, P9 déploiement, P10 bilan MVP).
- v2 (à partir d'avril 2026) : 4 portes macro G1–G4 + boucle MVP→G1. Le découpage v1 reste consultable dans le journal et les ADR.
- v3 (ADR-0009, avril 2026) : intégration Nick Tune. Ajout du statut FE
PRD_EN_COURS(artefact PRD LIVING pré-G3, freeze à G3) ; 4 portes G1–G4 inchangées. D3/D4/D5 (skills task-level, skillprd-architect,sdeg-reflection) livrées séparément. Transition legacyfe.NOT_STARTED → FAB_PLAN_EN_COURSconservée endeprecated: truepour la migration v2→v3.