--- issueRef: "#287" version: 3 updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} 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`. - 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.