chore(tickets): sync store local — #287 clos (fix rendezvous cross-project, merge 5d62515) + création #288 (tool MCP idea_restart_self, redémarrage autonome agent; branchage feature/288-agent-self-restart-mcp; exclusion scripts/restart-idea-over-ssh.sh hors périmètre)

This commit is contained in:
2026-09-08 21:18:56 +02:00
parent 5d62515d4e
commit ee259dc93a
9 changed files with 196 additions and 8 deletions

View File

@ -90,3 +90,5 @@
- [project-plugin-skills-multi-harness-contract](project-plugin-skills-multi-harness-contract.md) — memory note project-plugin-skills-multi-harness-contract
- [ticket284-cross-project-contact-plugin-assignment](ticket284-cross-project-contact-plugin-assignment.md) — memory note ticket284-cross-project-contact-plugin-assignment
- [ticket285-sdk-plugin-root-runtime-api](ticket285-sdk-plugin-root-runtime-api.md) — memory note ticket285-sdk-plugin-root-runtime-api
- [ticket287-cross-project-rendezvous-live-activity-fix](ticket287-cross-project-rendezvous-live-activity-fix.md) — memory note ticket287-cross-project-rendezvous-live-activity-fix
- [ticket288-agent-self-restart-architecture](ticket288-agent-self-restart-architecture.md) — memory note ticket288-agent-self-restart-architecture

View File

@ -0,0 +1,51 @@
---
name: ticket287-cross-project-rendezvous-live-activity-fix
description: memory note ticket287-cross-project-rendezvous-live-activity-fix
metadata:
type: project
---
---
name: ticket287-cross-project-rendezvous-live-activity-fix
description: Fix livré du timeout cross-project headlessRendezvous à 600s vers des cibles Codex — le watchdog structured est réarmé par les événements live send_with_tap, avec transcript Claude en fallback.
metadata:
type: project
---
# Ticket #287 — Cross-project headlessRendezvous réarmé par activité live
## Symptôme
Un appel cross-project `UnitySoundTool -> UnityPlugin/Main` a expiré après 10 minutes avec le workstate cible `Failed / headlessRendezvous / 4c3d6b38` et le message `Timeout: rendezvous inactivity window expired for target Main`.
## Cause
Le chemin concerné est le rendez-vous structured/headless (`ask_project_agent_for_mcp -> ask_resolved_agent -> ask_structured`), pas l'ancien rendez-vous MCP `idea_reply`.
Le watchdog réarmable existait déjà, mais la sonde production externe observait surtout les transcripts Claude. UnityPlugin/Main étant un agent Codex, un tour structured actif pouvait ne produire aucun progrès visible pour cette sonde et expirer à la première fenêtre de 600s.
## Contrat livré
Depuis le fix #287, `ask_structured` alimente un jeton monotone local via `AgentSession::send_with_tap`. Chaque `ReplyEvent` live non terminal réarme l'activité du rendez-vous, indépendamment du provider. La sonde transcript reste un fallback externe, notamment pour les adapters qui ne produisent pas d'événements intermédiaires.
Le `Final` reste la seule réponse normale. Absence réelle de tout signe de vie pendant une fenêtre complète => timeout d'inactivité. Activité continue jusqu'au plafond absolu => ceiling active.
## Fichiers et commits
Fichiers touchés:
- `crates/application/src/agent/mod.rs`
- `crates/application/src/agent/structured.rs`
- `crates/application/src/orchestrator/service.rs`
- `crates/application/tests/orchestrator_service.rs`
- `crates/backend/src/lib.rs`
Commit fix: `7716910`.
Merge local develop: `5d62515`.
## Validation
QA verte:
- `cargo fmt --check`
- `cargo test -p application --test orchestrator_service` => 81 passed
- `cargo test -p application orchestrator::rendezvous` => 5 passed
- `cargo test -p infrastructure --test mcp_server` => 40 passed
- `cargo test -p backend` => 87 passed, 7 ignored
AppImage rebuildée le 2026-09-08:
`/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage` (114M).
## Activation
Le binaire actif reste l'AppImage installée. Pour activer le fix en live, remplacer l'AppImage installée puis relancer IdeA. Cette relance tue l'orchestrateur courant, donc elle reste manuelle.

View File

@ -0,0 +1,15 @@
---
name: ticket288-agent-self-restart-architecture
description: memory note ticket288-agent-self-restart-architecture
metadata:
type: project
---
# Ticket #288 — Agent Self-Restart MCP Architecture
Le tool core `idea_restart_self` doit être self-only et requester-scopé via le handshake MCP. Il ne prend pas de target fourni par le modèle. Il retourne seulement un accusé `scheduled`, car le process appelant est ensuite arrêté.
Le restart est un use case applicatif atomique au-dessus des briques existantes: snapshot de reprise, stop runtime, relance via `LaunchAgent` avec `fresh_start=false` et le même `conversation_id`. `LaunchAgent` reste l’unique endroit qui régénère contexte, mémoire, live-state, handoff, capabilities et skills/tools MCP de plugins.
Les événements normatifs sont `AgentRestartRequested`, `AgentRestartPhaseChanged`, `AgentRestartCompleted`, `AgentRestartFailed`. Les séparateurs exacts du CLI custom et l’overlay TUI native sont des projections UI, jamais du contenu conversationnel ni du prompt interne de reprise.
Invariant critique: le restart doit libérer l’état Busy/mailbox même si la connexion MCP disparaît quand l’agent est tué.

View File

@ -1,6 +1,69 @@
---
issueRef: "#287"
version: 1
version: 3
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
updatedAt: 1788891077144
updatedAt: 1788892419182
---
# Ticket #287 — Cross-project rendezvous timeout malgré activité cible
## Symptôme utilisateur
UnitySoundTool a demandé des features à UnityPlugin/Main. L'appel cross-project a expiré après 10 minutes. Workstate cible: `Failed`, `headlessRendezvous`, corrélation `4c3d6b38`, message `Timeout: rendezvous inactivity window expired for target Main`.
## Cadrage Architect
Le chemin concerné n'est pas l'ancien rendez-vous MCP `idea_reply`, mais le chemin structured/headless:
- `ask_project_agent_for_mcp` -> `ask_resolved_agent` -> `ask_structured` dans `crates/application/src/orchestrator/service.rs`.
- Le watchdog réarmable existe déjà dans `crates/application/src/orchestrator/rendezvous.rs`.
- Cause probable confirmée: la sonde production était principalement transcript Claude-only, alors que UnityPlugin/Main utilise Codex. Le watchdog ne voyait donc pas l'activité du tour Codex et expirait à 600s.
## Implémentation DevBackend
Branche: `fix/287-cross-project-rendezvous-timeout`.
Commit fix: `7716910`.
Merge local develop: `5d62515`.
Fichiers modifiés:
- `crates/application/src/agent/mod.rs`
- `crates/application/src/agent/structured.rs`
- `crates/application/src/orchestrator/service.rs`
- `crates/application/tests/orchestrator_service.rs`
- `crates/backend/src/lib.rs`
Contrat livré:
- `ask_structured` utilise désormais un drain tap-aware basé sur `AgentSession::send_with_tap`.
- Chaque `ReplyEvent` live non terminal incrémente un jeton monotone local `Arc<AtomicU64>`.
- Le watchdog fusionne ce jeton local avec la sonde transcript fallback dans une sonde composite monotone.
- Le `Final` reste la seule réponse normale.
- Le transcript Claude devient un fallback, plus la source unique de vivacité.
- Les appels cross-project vers une cible Codex peuvent désormais réarmer la fenêtre d'inactivité tant que l'adapter émet de l'activité live.
## QA
Verdict QA: VERT.
Commandes réelles:
- `cargo fmt --check` OK
- `cargo test -p application --test orchestrator_service` OK, 81 passed
- `cargo test -p application orchestrator::rendezvous` OK, 5 passed
- `cargo test -p infrastructure --test mcp_server` OK, 40 passed
- `cargo test -p backend` OK, 87 passed, 7 ignored
Tests de régression ajoutés:
- `ask_structured_rearms_inactivity_window_from_send_with_tap`
- `ask_structured_without_tap_probe_progress_or_final_times_out`
## Git
Git a committé et mergé localement:
- Fix: `7716910 fix(orchestrator,agent): rendezvous cross-project réarmé par jeton d'activité live model-agnostique — #287`
- Merge develop: `5d62515 merge(orchestrator,agent): rendezvous cross-project réarmé par jeton d'activité live — #287`
Aucune action distante. `develop` est en avance sur `origin/develop`; état post-build propre sauf `scripts/restart-idea-over-ssh.sh` non suivi, hors périmètre.
## AppImage
Workflow `build-appimage` exécuté depuis `develop`:
- `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
Artefact produit:
- `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`
- taille: 114M
- généré le 2026-09-08 à 20:33
## Reste manuel
Pour rendre le correctif actif dans l'application courante, remplacer l'AppImage installée puis relancer IdeA. Ne pas automatiser ici car relancer IdeA tue l'orchestrateur/session active.

View File

@ -2,7 +2,7 @@
id: "d9b44519-1f89-48c6-a909-3c5b9cb2a49f"
number: 287
title: "Cross-project rendezvous timeout malgré activité cible"
status: "inProgress"
status: "closed"
priority: "critical"
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: 1788891077144
updatedAt: 1788891077144
version: 1
updatedAt: 1788892419182
version: 3
---
UnitySoundTool rapporte qu'un appel cross-project vers Main de UnityPlugin a expiré après 10 minutes: workstate Main UnityPlugin = Failed / headlessRendezvous / 4c3d6b38 / Timeout: rendezvous inactivity window expired for target Main. Demande utilisateur: corriger ces timeouts cross-project puis rebuild l'AppImage.

View File

@ -0,0 +1,26 @@
---
issueRef: "#288"
version: 2
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
updatedAt: 1788895080146
---
#288 — Tool MCP de redemarrage autonome d'un agent
## Demande utilisateur
Ajouter un tool MCP permettant a un agent de demander son propre redemarrage apres ajout de capabilities/plugins, pour continuer le travail avec les nouveaux outils disponibles.
## Cadrage UX
- CLI custom: afficher exactement `------- redemarrage de l'agent -------` au call, puis `------- redemarrage de l'agent termine -------` apres injection reussie; en echec `------- redemarrage de l'agent echoue -------` + message court.
- TUI native: ne pas injecter ces separateurs; afficher un overlay avec phases `Redemarrage de l'agent...`, `Arret de l'agent en cours...`, `Relance de l'agent...`, `Reprise du travail...`; garder les progress/messages dans l'overlay jusqu'a idle/fin de travail.
- Le prompt/instruction de reprise interne est invisible dans l'UI humaine et le viewer transcript.
## Cadrage Architecture
- Tool core `idea_restart_self({ reason?: string })` self-only via requester MCP handshake, sans target fourni par le modele.
- Retour MCP immediat: `{ restartId, status: "scheduled", message }`; la relance est prouvee par events/UI car le process appelant est stoppe ensuite.
- Use case atomique: snapshot reprise -> stop runtime -> relance via LaunchAgent avec `fresh_start=false` et meme `conversation_id` -> injection interne invisible -> events completed/failed.
- Events: `AgentRestartRequested`, `AgentRestartPhaseChanged`, `AgentRestartCompleted`, `AgentRestartFailed`.
- Invariant: liberer Busy/mailbox meme si la connexion MCP disparait quand l'agent est tue.
- Memoire durable ajoutee: `ticket288-agent-self-restart-architecture`.
## Etat
Ticket cree et passe inProgress par Main. En attente branche Git puis implementation DevBackend/DevFrontend et validation QA.

View File

@ -0,0 +1,17 @@
---
id: "3d6c1342-58cc-4bc8-bed5-a176f155b9ef"
number: 288
title: "Tool MCP de redémarrage autonome d'un agent"
status: "inProgress"
priority: "high"
sprint: null
links: []
agentRefs: []
attachments: []
createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"}
createdAt: 1788894923196
updatedAt: 1788895080146
version: 2
---
Ajouter un outil MCP permettant à un agent de demander son propre redémarrage pour récupérer de nouvelles capacités (ex. plugin ajouté). Comportement attendu : IdeA arrête l'agent demandeur, le relance, lui injecte le contexte/handoff nécessaire pour reprendre son travail, masque le message interne de reprise, affiche dans la CLI custom des séparateurs de redémarrage puis les progress à la suite, et pour la TUI native affiche un overlay pendant le redémarrage puis y projette les progress jusqu'à fin de travail.

View File

@ -1,3 +1,3 @@
{
"nextNumber": 288
"nextNumber": 289
}

View File

@ -3926,7 +3926,7 @@
"issueRef": "#287",
"path": "287",
"title": "Cross-project rendezvous timeout malgré activité cible",
"status": "inProgress",
"status": "closed",
"priority": "critical",
"sprint": null,
"assignedAgentIds": [],
@ -3934,7 +3934,21 @@
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
"updatedAt": 1788891077144
"updatedAt": 1788892419182
},
{
"issueRef": "#288",
"path": "288",
"title": "Tool MCP de redémarrage autonome d'un agent",
"status": "inProgress",
"priority": "high",
"sprint": null,
"assignedAgentIds": [],
"createdBy": {
"kind": "agent",
"agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d"
},
"updatedAt": 1788895080146
}
]
}