fix(backend,orchestrator,chat): tour humain agent_send survit au self-restart — #290 (le tour humain direct agent_send/ws chat.send s'enregistre au RestartRendezvousCoordinator via StructuredHumanTurnGuard: Final/Error de l'ancien provider devient transition de contrôle et non le Final logique; transition_after_provider_terminal_async attend Ready puis accept_ready acquitte le handoff et libère le scheduler, Resume => drain de la session de remplacement avec SELF_RESTART_CONTINUATION_PROMPT, seul le terminal du remplacement est transmis au chat; Failed/Cancelled surfacés explicitement avec libération Busy/FIFO; send_with_tap en erreur pendant restart actif traité comme teardown attendu (stream vide puis attente du remplacement, plus de Final prématuré ni chat bloqué); StopLiveAgent câblé with_restart_rendezvous: stop utilisateur annule le rendez-vous restart; RestartRendezvousRegistration rendu public (state/changed/accept_ready); QA verte: backend self_restart_contract_tests 3/3 dont 2 nouveaux (old terminal ignoré + handoff accepté, failure explicite + busy libéré), application orchestrator_service restart 8/8 dont registration directe du rendez-vous, workstate_actions 9/9, app-tauri chat_bridge 31/31, web-server websocket_chat_send 3/3, cargo check --workspace, fmt --check, diff --check — reconfirmés par Git avant commit; réserves hors périmètre préexistantes: 7 échecs fixture PTY web-server + 2 échecs plugin application; carnet #290 + clôture store #289 inclus; scripts/ hors périmètre; aucun push)
This commit is contained in:
87
.ideai/tickets/290/carnet.md
Normal file
87
.ideai/tickets/290/carnet.md
Normal file
@ -0,0 +1,87 @@
|
||||
---
|
||||
issueRef: "#290"
|
||||
version: 5
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedAt: 1788935506924
|
||||
---
|
||||
# Ticket #290 - Redemarrage agent finalise le tour et bloque le chat
|
||||
|
||||
## Reproduction utilisateur
|
||||
- Date: 2026-09-09.
|
||||
- L'utilisateur demande a Main de se redemarrer puis d'indiquer le succes une fois fini.
|
||||
- Dans la conversation, Main lance le redemarrage, envoie un message, le tour se finit et le message envoye est considere comme Final.
|
||||
- Tentative Stop ensuite: message "Request already stopped".
|
||||
- Le chat reste bloque en ecriture.
|
||||
- Capture: `/home/anthony/Documents/Projects/IdeA/.ideai/attachments/agent-chat/7d2abba7-ed93-405f-9fe5-857c8455e436/9a881769-d8e8-410d-85f1-7a3ec2afdde0-clipboard-image-1788934010151.png`.
|
||||
|
||||
## Attendu
|
||||
- Le restart agent doit provoquer une vraie relance/reprise, pas une simple fin de tour capturee comme Final.
|
||||
- Le chat doit redevenir ecrivable apres redemarrage ou echec controle.
|
||||
- Le message de succes doit correspondre a un redemarrage effectif, pas au tour qui initie le restart.
|
||||
|
||||
## Cadrage UX
|
||||
- Etats visibles attendus: redemarrage demande, agent en reprise, reprise reussie ou echec controle.
|
||||
- Stop ne doit etre cliquable que si une requete stoppable existe; ne pas exposer "Request already stopped" brut.
|
||||
- Le message de succes ne doit etre affiche qu'apres preuve runtime d'un agent relance/reconnecte.
|
||||
|
||||
## Cadrage Architecture
|
||||
- Bug de contrat entre restart autonome et chat humain `agent_send`.
|
||||
- `ask_structured` etait deja restart-aware; `agent_send` devait ignorer le Final de l'ancien runtime pendant restart et attendre la session remplacee.
|
||||
- Correctif backend-first, pas de filtre frontend sur le texte.
|
||||
|
||||
## Implementation DevBackend
|
||||
- Branche: `fix/290-restart-agent-send-premature-final`.
|
||||
- Le tour humain s'enregistre dans `RestartRendezvousCoordinator`.
|
||||
- `Final`/`Error` de l'ancien provider ignore pendant restart actif.
|
||||
- Le drain attend la session de remplacement, envoie le prompt de continuation, puis transmet uniquement le vrai terminal.
|
||||
- Busy/FIFO reste actif jusqu'au vrai resultat, echec explicite ou annulation.
|
||||
- Stop utilisateur annule aussi le rendez-vous restart.
|
||||
- Pas de changement frontend/protocole signale.
|
||||
|
||||
## Fichiers modifies annonces
|
||||
- `crates/application/src/orchestrator/service.rs`
|
||||
- `crates/application/src/orchestrator/mod.rs`
|
||||
- `crates/application/src/lib.rs`
|
||||
- `crates/application/src/workstate/actions.rs`
|
||||
- `crates/application/tests/orchestrator_service.rs`
|
||||
- `crates/backend/src/lib.rs`
|
||||
- `crates/app-tauri/src/commands.rs`
|
||||
- `crates/web-server/src/lib.rs`
|
||||
|
||||
## Validations DevBackend annoncees vertes
|
||||
- `cargo check --workspace`
|
||||
- `cargo test -p backend self_restart_contract_tests -- --nocapture` — 3/3
|
||||
- `cargo test -p application --test orchestrator_service restart -- --nocapture` — 8/8
|
||||
- `cargo test -p application --test workstate_actions -- --test-threads=1` — 9/9
|
||||
- `cargo test -p app-tauri --test chat_bridge` — 31/31
|
||||
- `cargo test -p web-server websocket_chat_send -- --test-threads=1` — 3/3
|
||||
- `cargo fmt --all -- --check`
|
||||
- `git diff --check`
|
||||
|
||||
## Risques signales
|
||||
- Suites globales avec echecs hors perimetre: 7 tests PTY `web-server` et 2 tests package plugin `application`.
|
||||
- QA doit confirmer que ces echecs sont preexistants/hors #290 ou remonter le detail.
|
||||
|
||||
## Validation QA - 2026-09-09
|
||||
|
||||
Verdict: VERT sur le perimetre #290, avec reserves globales reproduites hors perimetre.
|
||||
|
||||
Commandes ciblees executees:
|
||||
- `cargo check --workspace` -> vert.
|
||||
- `cargo test -p backend self_restart_contract_tests -- --nocapture` -> vert, 3 passed.
|
||||
- `cargo test -p application --test orchestrator_service restart -- --nocapture` -> vert, 8 passed.
|
||||
- `cargo test -p application --test workstate_actions -- --test-threads=1` -> vert, 9 passed.
|
||||
- `cargo test -p app-tauri --test chat_bridge` -> vert, 31 passed.
|
||||
- `cargo test -p web-server websocket_chat_send -- --test-threads=1` -> vert, 3 passed.
|
||||
- `cargo fmt --all -- --check` -> vert.
|
||||
- `git diff --check` -> vert.
|
||||
|
||||
Couverture confirmee:
|
||||
- `Final`/`Error` de l'ancien provider pendant restart ne finalise pas le tour humain: couvert par `self_restart_contract_tests::human_turn_ignores_old_terminal_and_accepts_replacement` et par les tests de registration directe du rendezvous restart.
|
||||
- Busy/FIFO reste actif jusqu'au terminal post-restart/echec/annulation: couvert par `self_restart_contract_tests`, `orchestrator_service restart` et `workstate_actions`.
|
||||
- Stop pendant restart annule proprement sans session de remplacement: couvert par `same_project_stop_during_restart_releases_ask_and_leaves_no_replacement_session`.
|
||||
- Non-regression #289 `ask_structured` restart-aware: couverte par `orchestrator_service restart`, incluant ask same-project, cross-project, echec et annulation.
|
||||
|
||||
Suites globales rouges reproduites hors perimetre:
|
||||
- `cargo test -p web-server -- --test-threads=1` -> 103 passed, 7 failed. Les 7 echecs sont les tests PTY `websocket_*terminal*`/`websocket_launch_agent_*` qui recoivent `error` au lieu de `terminal.attached`.
|
||||
- `cargo test -p application -- --test-threads=1` -> rouge dans `tests/layout_usecases.rs`, 2 failed: `create_layout_plugin_validates_active_runtime_contribution_and_persists_root` et `mutate_set_plugin_layout_state_persists_opaque_state`, tous deux sur `NotFound("plugin package")`.
|
||||
17
.ideai/tickets/290/issue.md
Normal file
17
.ideai/tickets/290/issue.md
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
id: "00547de0-3061-4d45-ad9b-f798152f75ce"
|
||||
number: 290
|
||||
title: "Corriger le redemarrage agent qui finalise le tour et bloque le chat"
|
||||
status: "qa"
|
||||
priority: "high"
|
||||
sprint: null
|
||||
links: []
|
||||
agentRefs: [{"agentId":"ab328d90-c307-4771-a3b6-6c56089c8506","role":"assigned"}]
|
||||
attachments: []
|
||||
createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
createdAt: 1788934173642
|
||||
updatedAt: 1788935506924
|
||||
version: 5
|
||||
---
|
||||
Bug rapporte par l'utilisateur le 2026-09-09: apres une demande de redemarrage, l'agent lance le redemarrage puis envoie un message; ce message est considere comme Final, le tour se termine, Stop repond "Request already stopped", et le chat devient bloque en ecriture. Attachement de reproduction: /home/anthony/Documents/Projects/IdeA/.ideai/attachments/agent-chat/7d2abba7-ed93-405f-9fe5-857c8455e436/9a881769-d8e8-410d-85f1-7a3ec2afdde0-clipboard-image-1788934010151.png. Objectif: corriger le flux pour que le redemarrage aboutisse vraiment, que l'utilisateur recupere un chat utilisable, et que le message de succes ne soit pas capture comme final prematurant le rendez-vous.
|
||||
Reference in New Issue
Block a user