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:
Binary file not shown.
|
After Width: | Height: | Size: 99 KiB |
@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "9a881769-d8e8-410d-85f1-7a3ec2afdde0",
|
||||
"projectId": "97b49ac2-8376-4aa3-8ea9-bf3ac81d0023",
|
||||
"agentId": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d",
|
||||
"sessionId": "7d2abba7-ed93-405f-9fe5-857c8455e436",
|
||||
"filename": "clipboard-image-1788934010151.png",
|
||||
"mime": "image/png",
|
||||
"sizeBytes": 101043,
|
||||
"sourceKind": "clipboard",
|
||||
"storagePath": "agent-chat/7d2abba7-ed93-405f-9fe5-857c8455e436/9a881769-d8e8-410d-85f1-7a3ec2afdde0-clipboard-image-1788934010151.png",
|
||||
"readablePath": "/home/anthony/Documents/Projects/IdeA/.ideai/attachments/agent-chat/7d2abba7-ed93-405f-9fe5-857c8455e436/9a881769-d8e8-410d-85f1-7a3ec2afdde0-clipboard-image-1788934010151.png",
|
||||
"createdAt": 1788934156106
|
||||
}
|
||||
@ -1,8 +1,8 @@
|
||||
---
|
||||
issueRef: "#289"
|
||||
version: 4
|
||||
version: 5
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedAt: 1788900709736
|
||||
updatedAt: 1788901112288
|
||||
---
|
||||
## 2026-09-08 — Main
|
||||
|
||||
@ -59,139 +59,29 @@ Tests QA ajoutés dans `crates/application/tests/orchestrator_service.rs` :
|
||||
- `ask_target_restart_cleans_busy_workstate_and_replaces_structured_registry_entry` : succès same-project post-restart, cible revenue `Idle`, FIFO vide, live-state `Done`, ancienne session structurée absente, session de remplacement enregistrée sur le même agent logique.
|
||||
- `same_project_stop_during_restart_releases_ask_and_leaves_no_replacement_session` : cancel/stop same-project pendant le gap de restart, ask réveillé en erreur explicite de cancel, busy/FIFO/live-state nettoyés, aucune session de remplacement enregistrée.
|
||||
|
||||
Commandes exécutées et sorties pertinentes :
|
||||
Commandes finales vertes :
|
||||
- `cargo fmt --all -- --check`
|
||||
- `cargo test -p application --test orchestrator_service` — 87 passés
|
||||
- `cargo test -p application --lib` — 171 passés
|
||||
- `cargo test -p backend --lib` — 89 passés, 7 ignorés
|
||||
- `cargo check -p backend` — OK
|
||||
|
||||
```bash
|
||||
git status --short --branch
|
||||
```
|
||||
Couverture validée : same-project, cross-project, faux no-reply interdit, failure restart explicite, cancel pendant restart, nettoyage busy/workstate/registry, watchdog réarmé par activité restart.
|
||||
|
||||
```text
|
||||
## fix/289-ask-agent-during-target-restart
|
||||
M .ideai/tickets/counter.json
|
||||
M .ideai/tickets/index.json
|
||||
M crates/application/src/lib.rs
|
||||
M crates/application/src/orchestrator/mod.rs
|
||||
M crates/application/src/orchestrator/service.rs
|
||||
M crates/application/tests/orchestrator_service.rs
|
||||
M crates/backend/src/lib.rs
|
||||
?? .ideai/tickets/289/
|
||||
?? scripts/
|
||||
```
|
||||
Risques résiduels : pas d'E2E vrai provider relancé dans QA ; les 7 tests backend ignorés demandent une permission locale de bind socket.
|
||||
|
||||
```bash
|
||||
cargo test -p application --test orchestrator_service ask_target_restart_keeps_logical_turn_and_returns_post_restart_final -- --nocapture
|
||||
```
|
||||
## 2026-09-08 — Git/Main clôture
|
||||
|
||||
```text
|
||||
test ask_target_restart_keeps_logical_turn_and_returns_post_restart_final ... ok
|
||||
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 84 filtered out; finished in 0.02s
|
||||
```
|
||||
Git a committé le correctif sur la branche feature : `d6d9891`.
|
||||
|
||||
```bash
|
||||
cargo test -p application --test orchestrator_service cross_project_ask_preserves_correlation_across_target_restart -- --nocapture
|
||||
```
|
||||
Git a mergé localement dans `develop` avec merge commit : `321ebda`.
|
||||
|
||||
```text
|
||||
test cross_project_ask_preserves_correlation_across_target_restart ... ok
|
||||
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 84 filtered out; finished in 0.02s
|
||||
```
|
||||
Aucun push distant effectué. État final après build : `develop...origin/develop [ahead 276]`, working tree propre sauf `scripts/` non suivi préexistant et hors périmètre.
|
||||
|
||||
```bash
|
||||
cargo test -p application --test orchestrator_service ask_target_restart_failure_is_explicit_not_no_reply -- --nocapture
|
||||
```
|
||||
Build AppImage exécuté via le skill `build-appimage` :
|
||||
- `npm --prefix frontend run build` — OK.
|
||||
- depuis `crates/app-tauri` : `CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage` — OK.
|
||||
|
||||
```text
|
||||
test ask_target_restart_failure_is_explicit_not_no_reply ... ok
|
||||
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 84 filtered out; finished in 0.01s
|
||||
```
|
||||
Artefact produit : `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`.
|
||||
|
||||
```bash
|
||||
cargo test -p application --test orchestrator_service cross_project_cancel_during_restart_releases_ask_and_correlation -- --nocapture
|
||||
```
|
||||
|
||||
```text
|
||||
test cross_project_cancel_during_restart_releases_ask_and_correlation ... ok
|
||||
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 84 filtered out; finished in 0.00s
|
||||
```
|
||||
|
||||
```bash
|
||||
cargo test -p application --lib restart_control_activity_rearms_inactivity_watchdog -- --nocapture
|
||||
```
|
||||
|
||||
```text
|
||||
test orchestrator::service::tests::restart_control_activity_rearms_inactivity_watchdog ... ok
|
||||
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 170 filtered out; finished in 0.05s
|
||||
```
|
||||
|
||||
```bash
|
||||
cargo test -p application --test orchestrator_service ask_target_restart_cleans_busy_workstate_and_replaces_structured_registry_entry -- --nocapture
|
||||
```
|
||||
|
||||
```text
|
||||
test ask_target_restart_cleans_busy_workstate_and_replaces_structured_registry_entry ... ok
|
||||
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 86 filtered out; finished in 0.02s
|
||||
```
|
||||
|
||||
```bash
|
||||
cargo test -p application --test orchestrator_service same_project_stop_during_restart_releases_ask_and_leaves_no_replacement_session -- --nocapture
|
||||
```
|
||||
|
||||
```text
|
||||
test same_project_stop_during_restart_releases_ask_and_leaves_no_replacement_session ... ok
|
||||
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 86 filtered out; finished in 0.00s
|
||||
```
|
||||
|
||||
```bash
|
||||
cargo fmt --all -- --check
|
||||
```
|
||||
|
||||
```text
|
||||
OK (aucune sortie)
|
||||
```
|
||||
|
||||
```bash
|
||||
cargo test -p application --test orchestrator_service
|
||||
```
|
||||
|
||||
```text
|
||||
running 87 tests
|
||||
test result: ok. 87 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s
|
||||
```
|
||||
|
||||
```bash
|
||||
cargo test -p application --lib
|
||||
```
|
||||
|
||||
```text
|
||||
running 171 tests
|
||||
test result: ok. 171 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
|
||||
```
|
||||
|
||||
```bash
|
||||
cargo test -p backend --lib
|
||||
```
|
||||
|
||||
```text
|
||||
running 96 tests
|
||||
test result: ok. 89 passed; 0 failed; 7 ignored; 0 measured; 0 filtered out; finished in 0.04s
|
||||
```
|
||||
|
||||
```bash
|
||||
cargo check -p backend
|
||||
```
|
||||
|
||||
```text
|
||||
Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.37s
|
||||
```
|
||||
|
||||
Couverture validée :
|
||||
- same-project : Final récupéré après restart et test QA de nettoyage busy/workstate/registre.
|
||||
- cross-project : corrélation conservée jusqu'au Final post-restart puis supprimée.
|
||||
- pas de faux no-reply/timeout pendant restart : failure restart reste `PROCESS` explicite, watchdog réarmé par activité de contrôle restart.
|
||||
- failure restart : erreur explicite contenant la cause provider.
|
||||
- cancel pendant restart : cross-project et same-project couverts.
|
||||
- nettoyage busy/workstate/registry : FIFO vide, `AgentBusyState::Idle`, live-state `Done`, registre structuré remplacé après succès et non recréé après cancel.
|
||||
|
||||
Risques résiduels :
|
||||
- Pas d'E2E AppImage / vrai provider relancé : la preuve porte sur les ports applicatifs, les sessions structurées de test et le câblage backend compilé.
|
||||
- Les 7 tests backend ignorés demandent une permission de bind socket locale ; ils restent hors preuve dans cet environnement.
|
||||
Étape non automatisée volontairement : remplacement de `/home/anthony/Documents/IdeA_0.1.0_amd64.AppImage` et relance d'IdeA, car cela tue l'orchestrateur actif. À faire manuellement quand l'utilisateur est prêt pour activer le correctif dans l'application lancée.
|
||||
@ -2,7 +2,7 @@
|
||||
id: "ae7f4f57-087e-463e-9390-33727e751d4f"
|
||||
number: 289
|
||||
title: "Garantir ask_agent pendant restart de la cible, same-project et cross-project"
|
||||
status: "qa"
|
||||
status: "closed"
|
||||
priority: "high"
|
||||
sprint: null
|
||||
links: []
|
||||
@ -11,7 +11,7 @@ attachments: []
|
||||
createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
|
||||
createdAt: 1788899102915
|
||||
updatedAt: 1788900574986
|
||||
version: 3
|
||||
updatedAt: 1788901112288
|
||||
version: 5
|
||||
---
|
||||
Vérifier et corriger le comportement suivant : lorsqu'un agent cible a été appelé via ask_agent puis se restart, le demandeur doit attendre la fin du restart et le travail repris/après restart doit rester rattaché à cette même cible. Le contrat doit couvrir les appels intra-projet et cross-project, sans perte de résultat ni attribution à un mauvais agent.
|
||||
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.
|
||||
@ -1,3 +1,3 @@
|
||||
{
|
||||
"nextNumber": 290
|
||||
"nextNumber": 291
|
||||
}
|
||||
@ -3954,7 +3954,7 @@
|
||||
"issueRef": "#289",
|
||||
"path": "289",
|
||||
"title": "Garantir ask_agent pendant restart de la cible, same-project et cross-project",
|
||||
"status": "qa",
|
||||
"status": "closed",
|
||||
"priority": "high",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [],
|
||||
@ -3962,7 +3962,23 @@
|
||||
"kind": "agent",
|
||||
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
|
||||
},
|
||||
"updatedAt": 1788900574986
|
||||
"updatedAt": 1788901112288
|
||||
},
|
||||
{
|
||||
"issueRef": "#290",
|
||||
"path": "290",
|
||||
"title": "Corriger le redemarrage agent qui finalise le tour et bloque le chat",
|
||||
"status": "qa",
|
||||
"priority": "high",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [
|
||||
"ab328d90-c307-4771-a3b6-6c56089c8506"
|
||||
],
|
||||
"createdBy": {
|
||||
"kind": "agent",
|
||||
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
|
||||
},
|
||||
"updatedAt": 1788935506924
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user