fix(orchestrator): ne pas câbler with_structured sur l'orchestrateur (régression 0f8ba38)

Régression introduite par 0f8ba38 : le re-câblage de `.with_structured(...)`
sur `OrchestratorService` (pour activer `drain_with_readiness`, readiness lot 1)
faisait emprunter à `ask_agent` la branche structurée `ensure_structured_session`,
qui ne peut JAMAIS aboutir : depuis le lot B-2 (« Option 1 Terminal + MCP »,
eca2ba9) la fabrique structurée est décâblée de `LaunchAgent`, donc aucun agent
n'a de session structurée — tous tournent en PTY brut et la délégation passe par
les outils MCP. Symptôme : `idea_ask_agent` échouait systématiquement avec
« aucune session structurée vivante après lancement » à chaque relance d'IdeA.

Non détecté par les tests : les e2e loopback câblent leur propre service
structuré complet, jamais le composition root réel (gap tests ≠ composition).

Fix : retirer le `.with_structured` du composition root pour que
`self.structured = None` et que `ask_agent` retombe sur le chemin PTY+MCP
fonctionnel (état pré-0f8ba38). `drain_with_readiness` reste dormant tant que
la voie structurée n'est pas réactivée au composition root.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-14 09:45:39 +02:00
parent 0f8ba38d51
commit aa2f67ae89

View File

@ -891,12 +891,19 @@ impl AppState {
.with_record_turn( .with_record_turn(
Arc::new(AppRecordTurnProvider) as Arc<dyn RecordTurnProvider>, Arc::new(AppRecordTurnProvider) as Arc<dyn RecordTurnProvider>,
Arc::clone(&clock) as Arc<dyn Clock>, Arc::clone(&clock) as Arc<dyn Clock>,
) ),
// Registre des sessions IA structurées (§17.5) : permet à `ask_agent` de // NB (régression corrigée) : on ne câble PAS `.with_structured(...)` ici.
// router une cible structurée (sans PTY) sur sa session et de la drainer via // Décision produit lot B-2 (« Option 1 Terminal + MCP », cf. construction
// `drain_with_readiness` — le `Final` réveille le round-trip ET marque l'agent // de `LaunchAgent` plus haut) : la fabrique structurée est décâblée, donc
// `Idle` (readiness/heartbeat lot 1). // AUCUN agent n'a de session structurée vivante — tous tournent en PTY brut
.with_structured(Arc::clone(&structured_sessions)), // et la délégation passe par les outils MCP (`idea_ask_agent`/`idea_reply`).
// Si l'orchestrateur recevait `with_structured`, `ask_agent` emprunterait la
// branche structurée (`ensure_structured_session`) qui ne peut jamais aboutir
// (le launcher ne crée plus de session structurée) ⇒ erreur systématique
// « aucune session structurée vivante après lancement ». On laisse donc
// `self.structured = None` pour que `ask_agent` retombe sur le chemin PTY+MCP
// fonctionnel. `drain_with_readiness` (readiness/heartbeat lot 1) reste dormant
// tant que la voie structurée n'est pas réactivée au composition root.
); );
// --- Windows (L10) --- // --- Windows (L10) ---