Le substrat HVE-Core

SKRAFT n’est pas autonome : il s’exécute sur HVE-Core. C’est ce substrat qui porte l’articulation des phases en architecture — une mémoire partagée (state.json), un protocole de tour, et des transitions conditionnées par les verdicts.

Pourquoi un substrat

Un pipeline en 5 phases, avec un agent et un reviewer par phase, a besoin d’un point de vérité unique : où en est-on, quel verdict a été rendu, combien de reprises ont eu lieu. Sans cela, chaque agent improviserait son propre état et la reprise après interruption serait impossible. HVE-Core fournit cette colonne vertébrale, partagée avec les planners voisins (Security, RAI, SSSC).

state.json — la mémoire du pipeline

L’état persiste en JSON à .copilot-tracking/skraft-plans/{project-slug}/state.json. Champs clés :

{
  "currentPhase": "DISCOVER | DISCUSS | DESIGN | DISTILL | DELIVER | DONE",
  "phaseArtifacts": { "DESIGN": ["adrs/ADR-001-...md"], "...": [] },
  "reviewerVerdicts": { "DESIGN": "APPROVED | REJECTED | NEEDS_REWORK | null" },
  "retryCount": { "DESIGN": 0 },
  "userPreferences": {
    "autonomyTier": "full | partial | manual",
    "depthTier": "comprehensive",
    "maxRetriesPerPhase": 2
  },
  "neighborPlanners": { "securityPlanFile": null, "raiPlanFile": null }
}

Le protocole 6-étapes par tour

À chaque tour, avant toute sortie utilisateur :

  1. READ — charger state.json.
  2. VALIDATE — vérifier le schéma (sinon procédure de récupération).
  3. DETERMINE — inspecter currentPhase, le verdict et retryCount pour décider la prochaine action concrète.
  4. EXECUTE — dispatcher l’agent de phase, dispatcher le reviewer, ou demander une décision humaine.
  5. UPDATE — muter l’état en mémoire (append-only sur les listes ; currentPhase n’avance que sur APPROVED ; incrémenter retryCount sur reprise).
  6. WRITE — persister state.json avant de rendre la main.

Comment les phases s’articulent

Chaque phase lit l’état, écrit ses artefacts datés, puis son reviewer écrit un verdict qui conditionne la transition. L’orchestrateur est l’entrée unique.

flowchart TD
    O([skraft-orchestrator]) -->|READ / WRITE| S[(state.json)]
    O --> D1[DISCOVER]
    D1 --> R1{reviewer}
    R1 -->|APPROVED| D2[DISCUSS]
    R1 -->|NEEDS_REWORK| D1
    D2 --> R2{reviewer}
    R2 -->|APPROVED| D3[DESIGN]
    R2 -->|NEEDS_REWORK| D2
    D3 --> R3{reviewer}
    R3 -->|APPROVED| D4[DISTILL]
    R3 -->|NEEDS_REWORK| D3
    D4 --> R4{reviewer}
    R4 -->|APPROVED| D5[DELIVER]
    R4 -->|NEEDS_REWORK| D4
    D5 --> R5{reviewer}
    R5 -->|APPROVED| DONE([DONE])
    R5 -->|NEEDS_REWORK| D5

Sur REJECTED/NEEDS_REWORK, la même phase est re-dispatchée, retryCount augmente, et currentPhase ne bouge pas. Quand le seuil de reprises est atteint sans APPROVED, l’orchestrateur escalade à l’utilisateur.

Planners voisins

HVE-Core héberge d’autres planners (Security, RAI, SSSC). SKRAFT référence leurs plans via neighborPlanners.* mais n’écrit jamais dans leur répertoire — chaque planner reste maître de ses artefacts.

Voir aussi