Compare commits
84 Commits
805d4b70a2
...
506d58956b
| Author | SHA1 | Date | |
|---|---|---|---|
| 506d58956b | |||
| 8e481aed69 | |||
| c246875f6d | |||
| de9c90966d | |||
| c9ce3d7c4e | |||
| 6117177957 | |||
| d538808a0d | |||
| dd1d083a1a | |||
| 1bc5217dbc | |||
| 5254f16095 | |||
| 6391d1c75a | |||
| 7487902ddb | |||
| 917be995a4 | |||
| e457152c66 | |||
| e500e31663 | |||
| fa353f6c0b | |||
| 4ed0b168d2 | |||
| e0cdb4aa56 | |||
| c8fef2a76a | |||
| 955db79e97 | |||
| 5505acc1f6 | |||
| ebad5ff9f2 | |||
| 18e6bedb8b | |||
| f7cae4c0a8 | |||
| 2f7f111545 | |||
| ce5aa2811c | |||
| 62b71776f5 | |||
| c6e34483d3 | |||
| 2d7396a86b | |||
| 51b5d07f35 | |||
| b4b86cdc0e | |||
| 63a7b6165f | |||
| bd5d8d864a | |||
| 83e4df7626 | |||
| 67101ba607 | |||
| e24bb5f1f4 | |||
| 4099b0d1c4 | |||
| fd5c8932ca | |||
| 141c13dabb | |||
| e0ee24e3b5 | |||
| ad1f2257e6 | |||
| 2183dfd291 | |||
| bd335c3a1c | |||
| fe7ed0aa20 | |||
| c67ec4f7bd | |||
| 8cdc44de6e | |||
| 76560ab101 | |||
| b4a01e0ae9 | |||
| c1051ce2f5 | |||
| f7f56e8583 | |||
| ea7a98be03 | |||
| 7ddf4d46b9 | |||
| afbf315e97 | |||
| 9326a4897a | |||
| 8bbd8d3d68 | |||
| 225890b57a | |||
| 9430c65050 | |||
| 631dd4eccf | |||
| b152e33b60 | |||
| 0e594adaf3 | |||
| 221cc8be78 | |||
| 6387fac34f | |||
| 1e0cb16ead | |||
| 8570adb8e0 | |||
| e54ffae0c3 | |||
| 3fff3402ec | |||
| f24f8f12aa | |||
| e64c0b7840 | |||
| 1331c5b2c2 | |||
| 2eb51d3335 | |||
| 55087b5d9b | |||
| 79f06c26d9 | |||
| e6f10d2b74 | |||
| 13d45cb752 | |||
| 9ee7290cde | |||
| 0039958b82 | |||
| a3c0dd410a | |||
| 1c28754b58 | |||
| 338b8707de | |||
| daa93525d7 | |||
| 61e5e41f0d | |||
| 73859a05e1 | |||
| c864d4a692 | |||
| 09e7f212b7 |
0
.ideai/agents/qwen3-5-9b.md
Normal file
0
.ideai/agents/qwen3-5-9b.md
Normal file
0
.ideai/agents/qwen3-code-30b.md
Normal file
0
.ideai/agents/qwen3-code-30b.md
Normal file
0
.ideai/agents/testllamacpp.md
Normal file
0
.ideai/agents/testllamacpp.md
Normal file
6655
.ideai/background-tasks/97b49ac2-8376-4aa3-8ea9-bf3ac81d0023.json
Normal file
6655
.ideai/background-tasks/97b49ac2-8376-4aa3-8ea9-bf3ac81d0023.json
Normal file
File diff suppressed because one or more lines are too long
@ -8,55 +8,26 @@
|
|||||||
- [session-limit-handling-design](session-limit-handling-design.md) — Design valide (detecteur hierarchique + reprise auto annulable) pour les limites de session des agents.
|
- [session-limit-handling-design](session-limit-handling-design.md) — Design valide (detecteur hierarchique + reprise auto annulable) pour les limites de session des agents.
|
||||||
- [git-owns-commit-merge-decisions](git-owns-commit-merge-decisions.md) — Ne jamais demander a l'utilisateur s'il faut committer/merger/brancher : l'agent Git tranche toute la topologie du depot.
|
- [git-owns-commit-merge-decisions](git-owns-commit-merge-decisions.md) — Ne jamais demander a l'utilisateur s'il faut committer/merger/brancher : l'agent Git tranche toute la topologie du depot.
|
||||||
- [conversation-rotation-safety-design](conversation-rotation-safety-design.md) — memory note conversation-rotation-safety-design
|
- [conversation-rotation-safety-design](conversation-rotation-safety-design.md) — memory note conversation-rotation-safety-design
|
||||||
- [checkpoint-orchestrator-designation-restart](checkpoint-orchestrator-designation-restart.md) — memory note checkpoint-orchestrator-designation-restart
|
|
||||||
- [checkpoint-orchestrator-designation-backend-compile-fix](checkpoint-orchestrator-designation-backend-compile-fix.md) — memory note checkpoint-orchestrator-designation-backend-compile-fix
|
|
||||||
- [checkpoint-orchestrator-designation-qa-verdict](checkpoint-orchestrator-designation-qa-verdict.md) — memory note checkpoint-orchestrator-designation-qa-verdict
|
|
||||||
- [checkpoint-orchestrator-designation-appimage-build](checkpoint-orchestrator-designation-appimage-build.md) — memory note checkpoint-orchestrator-designation-appimage-build
|
|
||||||
- [checkpoint-blocked-until-appimage-030-restart](checkpoint-blocked-until-appimage-030-restart.md) — memory note checkpoint-blocked-until-appimage-030-restart
|
|
||||||
- [checkpoint-delivery-submit-logging-fix](checkpoint-delivery-submit-logging-fix.md) — memory note checkpoint-delivery-submit-logging-fix
|
|
||||||
- [checkpoint-workstate-delegation-queue-lot-b](checkpoint-workstate-delegation-queue-lot-b.md) — memory note checkpoint-workstate-delegation-queue-lot-b
|
|
||||||
- [checkpoint-workstate-conversation-summaries-lot-c](checkpoint-workstate-conversation-summaries-lot-c.md) — memory note checkpoint-workstate-conversation-summaries-lot-c
|
|
||||||
- [checkpoint-workstate-controlled-actions-lot-d](checkpoint-workstate-controlled-actions-lot-d.md) — memory note checkpoint-workstate-controlled-actions-lot-d
|
|
||||||
- [checkpoint-work-tab-blank-fix](checkpoint-work-tab-blank-fix.md) — memory note checkpoint-work-tab-blank-fix
|
|
||||||
- [skills-integration-canonical-foundation](skills-integration-canonical-foundation.md) — Topologie d'intégration du chantier skills agent et décision d'abandon de feature/agent-skills.
|
- [skills-integration-canonical-foundation](skills-integration-canonical-foundation.md) — Topologie d'intégration du chantier skills agent et décision d'abandon de feature/agent-skills.
|
||||||
- [idea-program-surface-separation-and-livestate](idea-program-surface-separation-and-livestate.md) — Cadrage du programme post-skills : ce qui existe vs reste, et la règle de frontière surface-agent/humaine.
|
- [idea-program-surface-separation-and-livestate](idea-program-surface-separation-and-livestate.md) — Cadrage du programme post-skills : ce qui existe vs reste, et la règle de frontière surface-agent/humaine.
|
||||||
- [handoff-ls5-summary-bound-and-llm-seam](handoff-ls5-summary-bound-and-llm-seam.md) — Contrat figé de la borne de handoff (perf) et du seam résumeur LLM non activé.
|
- [handoff-ls5-summary-bound-and-llm-seam](handoff-ls5-summary-bound-and-llm-seam.md) — Contrat figé de la borne de handoff (perf) et du seam résumeur LLM non activé.
|
||||||
- [conversation-log-ls6-rotation-and-paginated-read](conversation-log-ls6-rotation-and-paginated-read.md) — Contrat figé de la rétention/rotation du transcript et de la lecture paginée riche (surface humaine).
|
- [conversation-log-ls6-rotation-and-paginated-read](conversation-log-ls6-rotation-and-paginated-read.md) — Contrat figé de la rétention/rotation du transcript et de la lecture paginée riche (surface humaine).
|
||||||
- [conversation-viewer-ls7-frontend](conversation-viewer-ls7-frontend.md) — Contrat figé du viewer de transcript paginé (frontend pur, lecture seule, surface humaine).
|
- [conversation-viewer-ls7-frontend](conversation-viewer-ls7-frontend.md) — Contrat figé du viewer de transcript paginé (frontend pur, lecture seule, surface humaine).
|
||||||
- [live-state-persistence-program-closed-ls8](live-state-persistence-program-closed-ls8.md) — Le programme live-state + persistance conversationnelle est livré et documenté ; pointe la doc de clôture et les points restés ouverts.
|
- [live-state-persistence-program-closed-ls8](live-state-persistence-program-closed-ls8.md) — Le programme live-state + persistance conversationnelle est livré et documenté ; pointe la doc de clôture et les points restés ouverts.
|
||||||
- [resume-after-appimage-rebuild-mcp-e2e](resume-after-appimage-rebuild-mcp-e2e.md) — memory note resume-after-appimage-rebuild-mcp-e2e
|
|
||||||
- [mcp-e2e-findings-reply-wedge-phantom-busy](mcp-e2e-findings-reply-wedge-phantom-busy.md) — memory note mcp-e2e-findings-reply-wedge-phantom-busy
|
|
||||||
- [checkpoint-finding-a-fix-built-live-validation-pending](checkpoint-finding-a-fix-built-live-validation-pending.md) — memory note checkpoint-finding-a-fix-built-live-validation-pending
|
|
||||||
- [git-agent-push-access-gitea-ssh](git-agent-push-access-gitea-ssh.md) — memory note git-agent-push-access-gitea-ssh
|
- [git-agent-push-access-gitea-ssh](git-agent-push-access-gitea-ssh.md) — memory note git-agent-push-access-gitea-ssh
|
||||||
- [rendezvous-no-reply-backstop-design](rendezvous-no-reply-backstop-design.md) — Décision d'architecture sur la fin-de-tour et le backstop no-reply du rendez-vous idea_ask_agent ⇄ idea_reply, après échec live du fix Finding A (77e62e5).
|
- [rendezvous-no-reply-backstop-design](rendezvous-no-reply-backstop-design.md) — Décision d'architecture sur la fin-de-tour et le backstop no-reply du rendez-vous idea_ask_agent ⇄ idea_reply, après échec live du fix Finding A (77e62e5).
|
||||||
- [checkpoint-rendezvous-redesign-devbackend-todo](checkpoint-rendezvous-redesign-devbackend-todo.md) — memory note checkpoint-rendezvous-redesign-devbackend-todo
|
|
||||||
- [backstop-no-reply-live-test-failed-2026-06-23](backstop-no-reply-live-test-failed-2026-06-23.md) — memory note backstop-no-reply-live-test-failed-2026-06-23
|
|
||||||
- [live-state-reboot-reconciliation-design](live-state-reboot-reconciliation-design.md) — memory note live-state-reboot-reconciliation-design
|
- [live-state-reboot-reconciliation-design](live-state-reboot-reconciliation-design.md) — memory note live-state-reboot-reconciliation-design
|
||||||
- [reconcile-live-state-implemented-feature-branch](reconcile-live-state-implemented-feature-branch.md) — memory note reconcile-live-state-implemented-feature-branch
|
|
||||||
- [rendezvous-600s-cap-too-short-heavy-tasks](rendezvous-600s-cap-too-short-heavy-tasks.md) — memory note rendezvous-600s-cap-too-short-heavy-tasks
|
- [rendezvous-600s-cap-too-short-heavy-tasks](rendezvous-600s-cap-too-short-heavy-tasks.md) — memory note rendezvous-600s-cap-too-short-heavy-tasks
|
||||||
- [backstop-fires-on-intra-task-turn-rootcause](backstop-fires-on-intra-task-turn-rootcause.md) — memory note backstop-fires-on-intra-task-turn-rootcause
|
|
||||||
- [mcp-functional-test-plan-2026-06-24](mcp-functional-test-plan-2026-06-24.md) — memory note mcp-functional-test-plan-2026-06-24
|
|
||||||
- [checkpoint-mcp-tests-t1-t5-and-t5-livestate-defect](checkpoint-mcp-tests-t1-t5-and-t5-livestate-defect.md) — memory note checkpoint-mcp-tests-t1-t5-and-t5-livestate-defect
|
|
||||||
- [checkpoint-mcp-t1-t6-green-t7-fix-wrong-layer](checkpoint-mcp-t1-t6-green-t7-fix-wrong-layer.md) — memory note checkpoint-mcp-t1-t6-green-t7-fix-wrong-layer
|
|
||||||
- [mcp-t7-backstop-600s-reply-rejected-livestate-stale](mcp-t7-backstop-600s-reply-rejected-livestate-stale.md) — memory note mcp-t7-backstop-600s-reply-rejected-livestate-stale
|
|
||||||
- [mcp-functional-tests-t1-t9-green-live-2026-06-24](mcp-functional-tests-t1-t9-green-live-2026-06-24.md) — memory note mcp-functional-tests-t1-t9-green-live-2026-06-24
|
|
||||||
- [mcp-t10a-harness-interrupt-does-not-cancel-rendezvous](mcp-t10a-harness-interrupt-does-not-cancel-rendezvous.md) — memory note mcp-t10a-harness-interrupt-does-not-cancel-rendezvous
|
|
||||||
- [mcp-t10b-pending-reboot-verification](mcp-t10b-pending-reboot-verification.md) — memory note mcp-t10b-pending-reboot-verification
|
|
||||||
- [headless-interagent-conversation-objective](headless-interagent-conversation-objective.md) — memory note headless-interagent-conversation-objective
|
- [headless-interagent-conversation-objective](headless-interagent-conversation-objective.md) — memory note headless-interagent-conversation-objective
|
||||||
- [checkpoint-b2-bootstrap-applied-await-codex-reset-1430](checkpoint-b2-bootstrap-applied-await-codex-reset-1430.md) — memory note checkpoint-b2-bootstrap-applied-await-codex-reset-1430
|
|
||||||
- [background-tasks-first-class-design](background-tasks-first-class-design.md) — memory note background-tasks-first-class-design
|
- [background-tasks-first-class-design](background-tasks-first-class-design.md) — memory note background-tasks-first-class-design
|
||||||
- [b7-wiring-anchor-state-rs](b7-wiring-anchor-state-rs.md) — memory note b7-wiring-anchor-state-rs
|
- [b7-wiring-anchor-state-rs](b7-wiring-anchor-state-rs.md) — memory note b7-wiring-anchor-state-rs
|
||||||
- [appimage-build-no-strip-relr-dyn-fix](appimage-build-no-strip-relr-dyn-fix.md) — memory note appimage-build-no-strip-relr-dyn-fix
|
- [appimage-build-no-strip-relr-dyn-fix](appimage-build-no-strip-relr-dyn-fix.md) — memory note appimage-build-no-strip-relr-dyn-fix
|
||||||
- [checkpoint-b7-blocked-codex-session-limit](checkpoint-b7-blocked-codex-session-limit.md) — memory note checkpoint-b7-blocked-codex-session-limit
|
|
||||||
- [issue-ticket-system-design](issue-ticket-system-design.md) — memory note issue-ticket-system-design
|
- [issue-ticket-system-design](issue-ticket-system-design.md) — memory note issue-ticket-system-design
|
||||||
- [checkpoint-issue-ticket-backend-v1-done](checkpoint-issue-ticket-backend-v1-done.md) — memory note checkpoint-issue-ticket-backend-v1-done
|
|
||||||
- [tickets-frontend-v1-done](tickets-frontend-v1-done.md) — État du frontend du système de tickets — livré, vert, décisions de contrat clés.
|
- [tickets-frontend-v1-done](tickets-frontend-v1-done.md) — État du frontend du système de tickets — livré, vert, décisions de contrat clés.
|
||||||
- [tickets-v1-e2e-validated-qa](tickets-v1-e2e-validated-qa.md) — Verdict QA du système de tickets V1 sans attachments sur feature/issue-ticket-system — vert de bout en bout, avec la seule réserve du typage de conflit côté UI.
|
- [tickets-v1-e2e-validated-qa](tickets-v1-e2e-validated-qa.md) — Verdict QA du système de tickets V1 sans attachments sur feature/issue-ticket-system — vert de bout en bout, avec la seule réserve du typage de conflit côté UI.
|
||||||
- [b8-command-runner-pty-framing](b8-command-runner-pty-framing.md) — Cadrage hexagonal figé du lot B8 : runner concret sur le port BackgroundTaskRunner, fermeture de la boucle sink en composition root, contrat de complétion, commandes cancel/retry.
|
- [b8-command-runner-pty-framing](b8-command-runner-pty-framing.md) — Cadrage hexagonal figé du lot B8 : runner concret sur le port BackgroundTaskRunner, fermeture de la boucle sink en composition root, contrat de complétion, commandes cancel/retry.
|
||||||
- [checkpoint-b8-command-runner-loop-closed](checkpoint-b8-command-runner-loop-closed.md) — memory note checkpoint-b8-command-runner-loop-closed
|
|
||||||
- [b8-arbitration-outcomes](b8-arbitration-outcomes.md) — Décisions d'arbitrage Architecture sur les 5 écarts B8 remontés par DevBackend : ce qui reste dans B8 vs part en dette/ticket.
|
- [b8-arbitration-outcomes](b8-arbitration-outcomes.md) — Décisions d'arbitrage Architecture sur les 5 écarts B8 remontés par DevBackend : ce qui reste dans B8 vs part en dette/ticket.
|
||||||
- [b8-in-app-trigger-run-in-background](b8-in-app-trigger-run-in-background.md) — Arbitrage de l'écart de périmètre #1 — la surface agent MCP idea_run_in_background ferme la boucle B8, contrat et lots figés.
|
- [b8-in-app-trigger-run-in-background](b8-in-app-trigger-run-in-background.md) — Arbitrage de l'écart de périmètre #1 — la surface agent MCP idea_run_in_background ferme la boucle B8, contrat et lots figés.
|
||||||
- [checkpoint-t1-wake-delivery-bug-fixed-rebuild-pending](checkpoint-t1-wake-delivery-bug-fixed-rebuild-pending.md) — memory note checkpoint-t1-wake-delivery-bug-fixed-rebuild-pending
|
|
||||||
- [workstate-background-tasks-projection-fix](workstate-background-tasks-projection-fix.md) — Décision d'archi pour rendre visibles Cancel/Retry dans le panneau Work — extension du read-model GetProjectWorkState, contrat DTO et borne de livraison.
|
- [workstate-background-tasks-projection-fix](workstate-background-tasks-projection-fix.md) — Décision d'archi pour rendre visibles Cancel/Retry dans le panneau Work — extension du read-model GetProjectWorkState, contrat DTO et borne de livraison.
|
||||||
- [tickets-t3-frontend-validation-verdict](tickets-t3-frontend-validation-verdict.md) — Verdict de validation frontend du fix T3 (projection backgroundTasks par agent) sur feature/background-tasks-first-class — vert, avec 3 désalignements de contrat mineurs.
|
- [tickets-t3-frontend-validation-verdict](tickets-t3-frontend-validation-verdict.md) — Verdict de validation frontend du fix T3 (projection backgroundTasks par agent) sur feature/background-tasks-first-class — vert, avec 3 désalignements de contrat mineurs.
|
||||||
- [ticket4-restart-on-develop-ebd992e](ticket4-restart-on-develop-ebd992e.md) — Cadrage du redémarrage des annonces inter-agent sur la base pré-canonique develop ebd992e — ce qui existe, l'écart live, la réutilisabilité du backup et le découpage B/F.
|
- [ticket4-restart-on-develop-ebd992e](ticket4-restart-on-develop-ebd992e.md) — Cadrage du redémarrage des annonces inter-agent sur la base pré-canonique develop ebd992e — ce qui existe, l'écart live, la réutilisabilité du backup et le découpage B/F.
|
||||||
@ -75,5 +46,19 @@
|
|||||||
- [ticket28-f1-frontend-delivered](ticket28-f1-frontend-delivered.md) — Lot F1 du ticket #28 livré sur feature/ticket28-firstrun-detect-hang — invariant busy/detectProfiles, flag detecting, timeout UI, test de non-régression.
|
- [ticket28-f1-frontend-delivered](ticket28-f1-frontend-delivered.md) — Lot F1 du ticket #28 livré sur feature/ticket28-firstrun-detect-hang — invariant busy/detectProfiles, flag detecting, timeout UI, test de non-régression.
|
||||||
- [opencode-llamacpp-replaces-ollama](opencode-llamacpp-replaces-ollama.md) — memory note opencode-llamacpp-replaces-ollama
|
- [opencode-llamacpp-replaces-ollama](opencode-llamacpp-replaces-ollama.md) — memory note opencode-llamacpp-replaces-ollama
|
||||||
- [f36-multi-opencode-profiles-frontend](f36-multi-opencode-profiles-frontend.md) — Multiplicité des profils OpenCode locaux côté UI first-run wizard — livrée, verte, sans gap backend.
|
- [f36-multi-opencode-profiles-frontend](f36-multi-opencode-profiles-frontend.md) — Multiplicité des profils OpenCode locaux côté UI first-run wizard — livrée, verte, sans gap backend.
|
||||||
- [f35-launch-status-done-config-crud-blocked](f35-launch-status-done-config-crud-blocked.md) — F35.1 UI statut de lancement du serveur local livrée+verte ; F35.2 config CRUD bloquée sur un DTO figé qui ne matche pas le wire réel + delete manquant.
|
|
||||||
- [f35-config-crud-delivered](f35-config-crud-delivered.md) — F35.2 (config serveur local + sélection dans les profils OpenCode) livrée et verte sur feature/modeles-locaux ; clôt le sprint modèles locaux F34-F36.
|
- [f35-config-crud-delivered](f35-config-crud-delivered.md) — F35.2 (config serveur local + sélection dans les profils OpenCode) livrée et verte sur feature/modeles-locaux ; clôt le sprint modèles locaux F34-F36.
|
||||||
|
- [develop-realigned-to-cli-ui-baseline-2026-07-02](develop-realigned-to-cli-ui-baseline-2026-07-02.md) — Décision de topologie (validée utilisateur) : develop réaligné sur la ligne UI CLI (pre-chat-ui-baseline).
|
||||||
|
- [feature-agent-skill-awareness-design](feature-agent-skill-awareness-design.md) — Design validé + découpage de la feature « surfacer les skills assignés à un agent à la manière MCP » (manifeste + idea_skill_read).
|
||||||
|
- [inter-agent-announcements-feature-and-codex-final-bug](inter-agent-announcements-feature-and-codex-final-bug.md) — Design figé des annonces inter-agent (UI live) + cause racine du bug Final Codex, validé utilisateur le 2026-07-02.
|
||||||
|
- [inter-agent-live-context-shared-per-agent](inter-agent-live-context-shared-per-agent.md) — Décision d'architecture figée : le contexte live inter-agent est PAR AGENT (partagé), pas par paire (validée utilisateur 2026-07-02).
|
||||||
|
- [ticket4-announcements-frontend-f1f2f3](ticket4-announcements-frontend-f1f2f3.md) — Topologie du frontend des annonces inter-agent (store borné, preview requester filtré, overlay cible piloté par le busy/idle par agent) — réintégré sur base develop.
|
||||||
|
- [ticket54-f1-model-download-overlay-frontend](ticket54-f1-model-download-overlay-frontend.md) — Overlay plein-cellule de préparation du serveur modèle local + progression (barre/%/bytes/source), corrélation factorisée, priorité de voile.
|
||||||
|
- [ticket56-visibleelsewhere-derives-from-layout](ticket56-visibleelsewhere-derives-from-layout.md) — Fix frontend du sélecteur d'agent : la désactivation « visible ailleurs » doit venir du layout courant, pas du dernier nodeId du live registry.
|
||||||
|
- [ticket13-f0-frontend-transport-inventory](ticket13-f0-frontend-transport-inventory.md) — Résultat de l'inventaire B0/F0 frontend du chantier client/serveur #13 — la frontière gateways transport-neutres existe déjà, F1 = ajout d'adapters HTTP+WS.
|
||||||
|
- [ticket13-f1-http-ws-adapter-delivered](ticket13-f1-http-ws-adapter-delivered.md) — Le 3e jeu d'adapters frontend (HTTP request/response + squelette WebSocket) du chantier client/serveur #13 est livré et vert, derrière les ports inchangés.
|
||||||
|
- [ticket13-f2-web-readonly-client-delivered](ticket13-f2-web-readonly-client-delivered.md) — Le client web read-only (pairing cookie, liste projets, ouverture read-only + snapshot work-state) du chantier client/serveur #13 est livré et vert.
|
||||||
|
- [ticket13-f3-xterm-websocket-delivered](ticket13-f3-xterm-websocket-delivered.md) — L'adapter WS terminal (round-trip xterm, reconnexion+replay, états connexion) du chantier client/serveur #13 est finalisé et vert côté frontend.
|
||||||
|
- [ticket13-f4-web-agent-surface-delivered](ticket13-f4-web-agent-surface-delivered.md) — L'agent CLI web (agent.launch → terminal.attached, réattache sans relance, cellule agent réutilisant TerminalView) du chantier client/serveur #13 est livré et vert côté frontend.
|
||||||
|
- [ticket13-f5-web-live-surfaces-delivered](ticket13-f5-web-live-surfaces-delivered.md) — Les surfaces live web (workstate live via event.domain, background tasks cancel/retry, inbox, re-synchro au reconnect) du chantier client/serveur #13 sont livrées et vertes.
|
||||||
|
- [frontend-uses-npm-not-pnpm](frontend-uses-npm-not-pnpm.md) — memory note frontend-uses-npm-not-pnpm
|
||||||
|
- [idea-distribution-strategy-desktop-vs-docker](idea-distribution-strategy-desktop-vs-docker.md) — memory note idea-distribution-strategy-desktop-vs-docker
|
||||||
|
|||||||
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
name: backstop-fires-on-intra-task-turn-rootcause
|
|
||||||
description: memory note backstop-fires-on-intra-task-turn-rootcause
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
title: CAUSE RACINE — le backstop tire sur chaque tour interne (turn_duration ≠ retour-au-prompt)
|
|
||||||
type: project
|
|
||||||
description: Le turn-watcher fait tirer le backstop no-reply au PREMIER turn_duration, soit le 1er pas d'agent interne — il casse toute délégation multi-étapes (libération prématurée + rapport perdu). Le test QA pong passait par chance (tâche mono-tour).
|
|
||||||
---
|
|
||||||
# CAUSE RACINE (2026-06-23, prouvée live) — backstop tire sur les tours INTERNES
|
|
||||||
|
|
||||||
## Preuve
|
|
||||||
Cadrage délégué à Architect (tâche multi-étapes, lecture de code) :
|
|
||||||
```
|
|
||||||
562100 [rendezvous] ask started -> Architect turn_timeout_ms=600000
|
|
||||||
564943 [rendezvous] ask returned-to-prompt-no-reply: Architect after_ms=2843
|
|
||||||
564943 [mailbox] complete_without_reply agent=dce19c75 ticket=cc4067fa outcome=sent
|
|
||||||
```
|
|
||||||
- Tiré à **2843 ms** : impossible qu'Architect ait fini un cadrage en 2,8 s.
|
|
||||||
- Au même instant, transcript Architect **toujours en écriture** (Bash/Read en boucle), `idea_reply` count = **0** → Architect **continuait à travailler**.
|
|
||||||
- Transcript = **61 `turn_duration`** : Claude écrit un `turn_duration` **par tour d'agent interne** (chaque appel LLM de la boucle agentique), PAS seulement au retour-au-prompt final.
|
|
||||||
|
|
||||||
## Diagnostic
|
|
||||||
`claude_turn_watcher.rs` fait tirer `turn_ended` au **premier incrément** de `turn_duration` au-dessus de la baseline. Or cet incrément survient dès le **1er pas interne** de l'agent (~secondes). Donc le backstop confond « l'agent a fait un pas de raisonnement » avec « l'agent est retourné au prompt sans répondre ». Pour **toute tâche multi-étapes** : libération prématurée du demandeur « sans réponse » pendant que la cible bosse encore → `idea_reply` final → « no pending request » → **rapport perdu** (travail survit sur disque/branche).
|
|
||||||
|
|
||||||
Le test QA « pong » (backstop-no-reply-live-test-failed-2026-06-23, devenu vert) passait **par chance** : tâche à **un seul tour** ⇒ premier tour = dernier tour. Le fix `encode_cwd` a fait tirer le watcher correctement, mais a **révélé que la CONDITION de tir est fausse**.
|
|
||||||
|
|
||||||
## Conséquence opérationnelle
|
|
||||||
Avec le binaire courant, **aucune délégation substantielle (multi-tours) ne remonte son rapport** : elle est coupée à ~3 s. Workaround Main en attendant le fix : déléguer → surveiller le transcript de la cible jusqu'à inactivité (mtime stable) → récupérer le résultat sur disque/branche ou re-solliciter en léger.
|
|
||||||
|
|
||||||
## Implication pour la refonte (seam liveness/fin-de-tour, validée utilisateur)
|
|
||||||
« Retourné au prompt idle » NE peut PAS être « un turn_duration est apparu ». Le bon signal = **process vivant (`is_agent_live`) + transcript NE grossit PLUS depuis stall_after_ms** (battement de cœur). Tant que le transcript grossit ⇒ l'agent travaille ⇒ ne pas libérer. Le 1er lot du fix devrait **neutraliser ce tir prématuré**. Lié à [[rendezvous-600s-cap-too-short-heavy-tasks]], [[rendezvous-no-reply-backstop-design]], [[backstop-no-reply-live-test-failed-2026-06-23]].
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
name: backstop-no-reply-live-test-failed-2026-06-23
|
|
||||||
description: memory note backstop-no-reply-live-test-failed-2026-06-23
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
title: Backstop no-reply — RE-VALIDATION LIVE VERTE (wedge levé) après fix encode_cwd
|
|
||||||
type: project
|
|
||||||
description: Le backstop no-reply du rendez-vous est validé en live le 2026-06-23 (session post-rebuild) : demandeur libéré ~grâce 2s au lieu de 600s. Reste un point de finition (résultat véhiculé via canal d'erreur).
|
|
||||||
---
|
|
||||||
|
|
||||||
# Backstop no-reply — RE-VALIDATION LIVE : VERTE (2026-06-23, session post-rebuild)
|
|
||||||
|
|
||||||
Remplace le 1er test (ÉCHEC) du même jour. La cause racine était l'encodage du slug projet Claude (`.` non encodé) corrigé dans `crates/infrastructure/src/inspector/claude_paths.rs` (`encode_cwd` → `replace(/[^a-zA-Z0-9]/g,'-')`, double-tiret sur `/.ideai/`). Voir [[checkpoint-rendezvous-redesign-devbackend-todo]] pour la cause racine.
|
|
||||||
|
|
||||||
## Preuves live (idea.log, session a6ced819)
|
|
||||||
Scénario : DevBackend → idea_ask_agent vers QA « pong en prose, SANS idea_reply (volontaire) ».
|
|
||||||
|
|
||||||
```
|
|
||||||
912948 [mcp] ask armed requester=DevBackend(73c853d1) target=QA timeout_ms=600000
|
|
||||||
917707 [turn-watcher] turn_duration detected agent=QA(aefdbd61) count 47->48 -> turn_ended
|
|
||||||
917707 [input-mediator] turn_ended agent=QA no_reply_payload -> mark_idle + grace
|
|
||||||
917707 [input-mediator] turn_ended arming grace agent=QA ticket=0257c630 grace_ms=2000
|
|
||||||
919707 [mailbox] complete_without_reply agent=QA ticket=0257c630 queue_depth_before=1 after=0 outcome=sent
|
|
||||||
```
|
|
||||||
|
|
||||||
Contraste avec l'échec précédent : `turn_ended` = 0 avant le fix, ici il FIRE ; `arm … dir=…IdeA--ideai-run-…` sur dossier EXISTANT ; grâce 2s exacte (917707→919707) ; libération du demandeur via `complete_without_reply outcome=sent`. DevBackend a repris la main en ~13 s mesuré (pas 600 s). Aucun wedge, aucun cascade-timeout.
|
|
||||||
|
|
||||||
## Point de finition résiduel (NON bloquant, follow-up)
|
|
||||||
Le résultat rendu au demandeur passe par le **canal d'erreur** MCP : « agent QA returned to its prompt without calling idea_reply (no answer was rendered); retry the request and ensure the agent replies via idea_reply ». Ce n'est pas un résultat no-reply synthétique structuré (design item c de [[rendezvous-no-reply-backstop-design]]) ; pour un orchestrateur c'est mal distinguable d'un échec transitoire « retry ». À transformer en verdict consommable (follow-up, hors blocage merge).
|
|
||||||
|
|
||||||
## Suite
|
|
||||||
Wedge prouvé levé en live ⇒ garde-fou Git satisfait. Délégué à Git : commit du fix `encode_cwd` (+ test de non-régression `encode_cwd_encodes_dot_in_run_dir_to_double_dash`) sur la branche du backstop, puis décision de merge develop.
|
|
||||||
@ -1,62 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-auto-memory-harvest-lot-e1
|
|
||||||
description: memory note checkpoint-auto-memory-harvest-lot-e1
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — Auto-memory harvest Lot E1
|
|
||||||
|
|
||||||
Date: 2026-06-21
|
|
||||||
|
|
||||||
## État final
|
|
||||||
|
|
||||||
Lot E1 `auto-memory harvest contrôlé` terminé, validé QA et mergé localement dans `develop`.
|
|
||||||
|
|
||||||
Branche finale:
|
|
||||||
- `develop` @ `61c330a` — merge local `feature/controlled-auto-memory-harvest`.
|
|
||||||
- Branche `feature/controlled-auto-memory-harvest` supprimée après merge.
|
|
||||||
- Aucun push, aucun merge vers `main`.
|
|
||||||
- Working tree applicatif propre; seuls résidus non committés: bruit runtime `.ideai/*` volontairement exclu.
|
|
||||||
|
|
||||||
## Commits créés
|
|
||||||
|
|
||||||
- `b12081b` — `feat(memory): récolte automatique contrôlée de la mémoire (Lot E1)`
|
|
||||||
- Domaine: parsing pur de blocs fenced `idea-memory` avec limites et erreurs isolées.
|
|
||||||
- Application: `HarvestMemoryFromTurn` best-effort sur `TurnRole::Response`, persistance via `MemoryStore`, événements `MemorySaved` via `EventBus`.
|
|
||||||
- Orchestrateur: harvest branché après checkpoint/handoff sur chemins de succès ask/reply, non bloquant.
|
|
||||||
- Lifecycle: directive mémoire IdeA injectée dans le contexte convention-file.
|
|
||||||
- App/Tauri: wiring du use case dans `AppState`.
|
|
||||||
- Frontend: refresh du panneau mémoire sur `memorySaved`; patch test-only mock gateway `workState`.
|
|
||||||
|
|
||||||
- `8c7c47c` — `fix(mcp): fallback déterministe du runtime dir socket`
|
|
||||||
- Durcit le choix du runtime dir socket MCP si `XDG_RUNTIME_DIR` est inutilisable.
|
|
||||||
- Commit séparé car indépendant du Lot E1.
|
|
||||||
|
|
||||||
- `61c330a` — `merge(memory): intègre la récolte automatique contrôlée (Lot E1) dans develop`.
|
|
||||||
|
|
||||||
## QA verte
|
|
||||||
|
|
||||||
Commandes QA réelles:
|
|
||||||
- `cargo fmt --all -- --check` OK.
|
|
||||||
- `cargo check -p app-tauri` OK.
|
|
||||||
- `cd frontend && npx tsc --noEmit` OK.
|
|
||||||
- `cd frontend && npx vitest run` OK après patch test-only, `42 passed`, `405 tests`.
|
|
||||||
- `cargo test -p domain memory_harvest -- --nocapture` OK, 14 passed.
|
|
||||||
- `cargo test -p application --test memory_harvest -- --nocapture` OK, 5 passed.
|
|
||||||
- `cargo test -p application --test orchestrator_service harvest -- --nocapture` OK, 4 passed.
|
|
||||||
- `cargo test -p infrastructure --test memory_store idempotent -- --nocapture` OK, 1 passed.
|
|
||||||
- `cargo test --workspace` brut rouge uniquement sur tests AF_UNIX/MCP bloqués par sandbox `Operation not permitted`; workspace filtré strictement sur ces tests environnementaux OK.
|
|
||||||
|
|
||||||
## Décisions produit/techniques
|
|
||||||
|
|
||||||
- Harvest strictement best-effort: jamais bloquant pour réponse, délégation, handoff ou ticket.
|
|
||||||
- Mémoire durable seulement via directive explicite `idea-memory`, plafonnée et validée; pas de log brut, pas de live-state, pas de handoff dans ce mécanisme.
|
|
||||||
- `title` est exigé par directive mais non persisté car l'entité `Memory` n'a pas de champ titre; accepté pour E1 afin de ne pas élargir le lot.
|
|
||||||
- Les fichiers runtime `.ideai/*` générés pendant la session restent hors commits applicatifs.
|
|
||||||
|
|
||||||
## Suite probable
|
|
||||||
|
|
||||||
Prochains chantiers à cadrer par Architect avant implémentation:
|
|
||||||
- persistance conversationnelle/canonical log + handoff incrémental cross-profile;
|
|
||||||
- live-state projet persistant et séparé de la mémoire durable;
|
|
||||||
- synchronisation documentaire architecture après les lots Work B/C/D et E1.
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-b2-bootstrap-applied-await-codex-reset-1430
|
|
||||||
description: memory note checkpoint-b2-bootstrap-applied-await-codex-reset-1430
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
name: checkpoint-b2-bootstrap-applied-await-codex-reset-1430
|
|
||||||
description: Reprise 2026-07-02 15h58 — B1-B6 tâches de fond commités+verts, AppImage fraîche buildée (NO_STRIP), prochaine étape = relance puis B7.
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — chantier tâches de fond de 1re classe (2026-07-02 ~15h58)
|
|
||||||
|
|
||||||
## Fait & COMMITÉ sur `feature/background-tasks-first-class`
|
|
||||||
- `62915ee` fix(codex) Final canal ; `fccc1e2` chore(gitignore) target/ sous-crates.
|
|
||||||
- **B1-B6 tâches de fond** (4 commits) : `f4a55e9` domaine (12 tests) · `c537da5` infra
|
|
||||||
store+sink+mailbox (B2-B4, 7+6+7 tests) · `f94b542` application wake+rendezvous-as-task
|
|
||||||
(B5-B6, agent_wake 5, orchestrator_watcher 11 passed) · `54c8ecf` app-tauri events.
|
|
||||||
- `cargo check --workspace` + `fmt` verts. Validés QA jusqu'à B5.
|
|
||||||
- Cadrage complet : [[background-tasks-first-class-design]]. Ancre de câblage B7 :
|
|
||||||
[[b7-wiring-anchor-state-rs]].
|
|
||||||
|
|
||||||
## AppImage FRAÎCHE prête (à relancer par l'utilisateur)
|
|
||||||
`target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage` (2026-07-02 15:57, 111 Mo),
|
|
||||||
contient B1-B6. Buildée avec `NO_STRIP=true` (sinon linuxdeploy casse sur `.relr.dyn` —
|
|
||||||
cf. [[appimage-build-no-strip-relr-dyn-fix]], correctif à retenir).
|
|
||||||
|
|
||||||
## PROCHAINES ÉTAPES (dès relance sur la nouvelle AppImage)
|
|
||||||
1. **B7** = câbler la chaîne au runtime dans `crates/app-tauri/src/state.rs` (ancre précise
|
|
||||||
dans [[b7-wiring-anchor-state-rs]] : `.with_background_tasks(...)` ABSENT du builder
|
|
||||||
OrchestratorService l.1356-1453 → rendezvous-as-task dormant ; sink/bridge/wake à spawner
|
|
||||||
via `tauri::async_runtime::spawn` ; store per-root façon `AppLiveStateProvider` ; reconcile
|
|
||||||
greffé dans `open_project`). Déléguer à DevBackend (session fraîche recommandée).
|
|
||||||
2. **F1-F4** front (queue depth/queued, panel tâches, badges agent cell, toasts).
|
|
||||||
3. **QA e2e** complet (critères du cadrage) puis rebuild AppImage final (NO_STRIP=true).
|
|
||||||
4. **B8 déféré** : coupler PTY/commandes longues (run_in_background) → BackgroundTask{Command}.
|
|
||||||
|
|
||||||
## Historique du blocage (résolu autrement)
|
|
||||||
B7 a wedgé 4× en délégation DevBackend sur l'ANCIEN binaire (13:30, pré-B4/B6). D'où le
|
|
||||||
rebuild pour déployer les fixes de canal avant de finir. Ne PAS re-tenter B7 sur l'ancien
|
|
||||||
binaire : relancer d'abord.
|
|
||||||
|
|
||||||
Liens : [[background-tasks-first-class-design]], [[b7-wiring-anchor-state-rs]],
|
|
||||||
[[appimage-build-no-strip-relr-dyn-fix]], [[mcp-e2e-findings-reply-wedge-phantom-busy]].
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-b7-blocked-codex-session-limit
|
|
||||||
description: memory note checkpoint-b7-blocked-codex-session-limit
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
name: checkpoint-b7-blocked-codex-session-limit
|
|
||||||
description: RÉSOLU 2026-07-02 — B7 (câblage runtime tâches de fond) + F1-F4 livrés, QA vert, commités ; rebuild AppImage lancé. Historique du blocage Codex conservé.
|
|
||||||
metadata:
|
|
||||||
type: reference
|
|
||||||
---
|
|
||||||
# Checkpoint — B7 + F1-F4 LIVRÉS (2026-07-02) — anciennement bloqué Codex
|
|
||||||
|
|
||||||
## RÉSOLUTION (à jour)
|
|
||||||
Codex est revenu, le cycle complet a tourné via le canal inter-agent (fiable cette fois) :
|
|
||||||
- **B7** câblé par DevBackend dans `crates/app-tauri/src/state.rs` (store per-root routé par
|
|
||||||
project_id façon AppLiveStateProvider, `AppReconcileBackgroundTasks` reconcile boot,
|
|
||||||
`AppWakeSessionProvider`, boucle ready→MediatedInbox→AgentWakeService via
|
|
||||||
`tauri::async_runtime::spawn`, `.with_background_tasks(store,clock)` au builder
|
|
||||||
OrchestratorService ~l.1858) + `commands.rs` (`reconcile_background_tasks` dans open_project).
|
|
||||||
- **F1-F4** front par DevFrontend (workStateNormalization, ProjectWorkStatePanel, LayoutGrid
|
|
||||||
badges Queued/Task done, ProjectsView toast, useProjectWorkState abonné aux events
|
|
||||||
backgroundTaskChanged/agentInboxChanged/agentWakeChanged).
|
|
||||||
- **QA vert** : app-tauri 52/52 (dont test reconcile boot dédié + 4 tests MCP périmés alignés
|
|
||||||
au nouveau protocole : idea_reply retiré→JSON-RPC -32601, idea_ask_agent exposé=13 tools,
|
|
||||||
rendez-vous capture Final inline), domain 224+12, application 5, infrastructure 30+,
|
|
||||||
frontend 449. Zéro régression (les 4 tests MCP échouaient déjà à l'identique sur base @54c8ecf).
|
|
||||||
- **Commité** (pas de push/merge sans validation user) : `e05edc6` backend (B7 + tests),
|
|
||||||
`5d88c95` frontend. `.ideai/memory` + `.ideai/proposals` volontairement non commités.
|
|
||||||
- **Rebuild AppImage** lancé : `NO_STRIP=true` (cf. [[appimage-build-no-strip-relr-dyn-fix]]).
|
|
||||||
|
|
||||||
## Réserves connues (assumées V1, = lot B8 déféré)
|
|
||||||
- Pas de `BackgroundTaskRunner` concret dans infrastructure → le sink de complétion ne s'abonne
|
|
||||||
pas à un runner réel ; complétion d'une commande `run_in_background` post-tour PAS testable
|
|
||||||
e2e (le rendez-vous inter-agent B6/HeadlessRendezvous, lui, EST vivant — c'était la douleur
|
|
||||||
principale). Boutons UI cancel/retry désactivés (pas de commande Tauri) — tooltip explicite.
|
|
||||||
- Prochain lot naturel B8 : runner de commandes couplé PTY (crée BackgroundTask{Command} au
|
|
||||||
spawn, pousse exit/stdout dans le sink) → active le flux run_in_background complet + cancel/retry.
|
|
||||||
|
|
||||||
## Historique du blocage (résolu)
|
|
||||||
Codex était en limite de session ; les 4 workers (Architect/DevBackend/DevFrontend/QA, profil
|
|
||||||
`664cc20c-…-dce4c09c3da4`) tous murés en même temps ; Main+Git sur `…dce3c09c0de4` libres.
|
|
||||||
Décision user = attendre le reset (pas d'entorse Main/Git ne code). Reset survenu → cycle repris.
|
|
||||||
|
|
||||||
Lien : [[b7-wiring-anchor-state-rs]], [[background-tasks-first-class-design]],
|
|
||||||
[[appimage-build-no-strip-relr-dyn-fix]], [[session-limit-handling-design]].
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-b8-command-runner-loop-closed
|
|
||||||
description: memory note checkpoint-b8-command-runner-loop-closed
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# B8 — Runner de commandes + boucle sink fermée (DevBackend, 2026-07-03)
|
|
||||||
|
|
||||||
Base `feature/background-tasks-first-class`. Suite de [[b8-command-runner-pty-framing]]. **Build workspace vert** ; sink tests (6) + tail units (5) + reconcile B7 verts. **Non committé** (Git tranche). QA à suivre.
|
|
||||||
|
|
||||||
## Livré (sous-tâches 1-5)
|
|
||||||
- **Domaine** : nouveau port `BackgroundCommandArchive { spec_for(TaskId)->Option<SpawnSpec> }` (ports.rs, exporté lib). Ajouté car le retry a besoin de la commande d'origine, qui n'est PAS un champ persisté du `BackgroundTask`. **À faire bénir par Architect** (ajout hors port figé).
|
|
||||||
- **Infra** : `background_task.rs` → module dir (`sink.rs` déplacé verbatim, `tail.rs`, `runner.rs`).
|
|
||||||
- `tail.rs` : `BoundedTail` ring UTF-8-safe + `bounded_tail()` + `tail_cap_bytes()` (env `IDEA_BG_TAIL_BYTES`, défaut 8 KiB, clamp [1 KiB, domaine 16 KiB]).
|
|
||||||
- `runner.rs` : `CommandBackgroundRunner` compose `Arc<dyn PtyPort>` + `Arc<dyn Clock>`. `spawn` → pty.spawn(24x80) + worker détaché ; détection de fin = EOF du stream single-consumer ; tail lu du **scrollback** (pas du stream, robuste à la course subscribe) ; exit code via `kill()` (wait après EOF naturel) ; `cancel` = flag+Notify (la branche cancel gagne la course EOF) ; deadline→Expired via select. Implémente `BackgroundTaskRunner` + `BackgroundCommandArchive`. Émet 1 complétion/tâche, n'écrit ni store ni inbox.
|
|
||||||
- **Application** : module `background` : `SpawnBackgroundCommand` (alloue TaskId, create Queued→save Running, runner.spawn ; si spawn KO → task Failed best-effort), `CancelBackgroundTask`, `RetryBackgroundTask` (nouveau TaskId, deadline **droppée** pour éviter l'expiry instantané ; réutilise `create_and_run`).
|
|
||||||
- **Composition root** (state.rs ~1545) : runner + `BackgroundCompletionSink::new(store, ready_tx.clone())` + `sink.start_from_runner(runner)` DANS `tauri::async_runtime::spawn` (Handle::current requis) ; JoinHandle du drain gardé vivant via `.await`. 4 champs AppState + use cases câblés. **Boucle B2 fermée** (avant : sink/runner uniquement en tests).
|
|
||||||
- **app-tauri** : `BackgroundTaskDto` camelCase (aplati result→exitCode/summary/tails), `parse_task_id`, commandes `spawn_background_command` (AJOUTÉE hors liste framing pour rendre la boucle atteignable/testable), `cancel_background_task`, `retry_background_task`, `list_background_tasks` — enregistrées dans invoke_handler.
|
|
||||||
|
|
||||||
## Écarts au cadrage (à arbitrer)
|
|
||||||
1. **Tee PTY live (sous-tâche 6) NON câblé** : le `Broadcast` de `PortablePtyAdapter` est **single-consumer** (chaque `subscribe_output` supersede le précédent). Un tee UI re-souscrirait et **casserait la détection EOF du runner**. Un vrai tee live exige un broadcast multi-consommateur OU un port `wait/try_wait` sur PtyPort → **décision Architect** (PtyPort figé). Documenté dans `runner.rs`.
|
|
||||||
2. **stderr_tail toujours None** : le PTY fusionne stdout/stderr → sortie fusionnée dans `stdout_tail`.
|
|
||||||
3. Port `BackgroundCommandArchive` ajouté (voir ci-dessus).
|
|
||||||
4. `list_background_tasks` sans `agentId` ne renvoie que les complétions non livrées du projet (le store ne sait pas énumérer les tâches ouvertes par projet).
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-blocked-until-appimage-030-restart
|
|
||||||
description: memory note checkpoint-blocked-until-appimage-030-restart
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — blocage délégation Architect jusqu'au redémarrage AppImage 0.3.0
|
|
||||||
|
|
||||||
Date: 2026-06-20
|
|
||||||
|
|
||||||
## État atteint
|
|
||||||
|
|
||||||
Chantier `orchestrator-designation` terminé et intégré localement:
|
|
||||||
- `develop` @ `9c71a5b` après commit runtime post-build.
|
|
||||||
- Worktree propre à ce moment.
|
|
||||||
- AppImage corrigée générée:
|
|
||||||
`/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`
|
|
||||||
- Artefact vérifié:
|
|
||||||
- taille 106M
|
|
||||||
- `--appimage-offset` = `944632`
|
|
||||||
|
|
||||||
## Problème live confirmé
|
|
||||||
|
|
||||||
Deux tentatives de délégation vers Architect ont affiché le texte dans le chat/terminal d'Architect sans le soumettre réellement.
|
|
||||||
L'utilisateur a interrompu et confirmé: « Le message n'arrive pas jusqu'à Architecte visiblement ».
|
|
||||||
|
|
||||||
Ce symptôme correspond au bug live de soumission write-portal/headless delivery corrigé dans `orchestrator-designation`, mais l'application en cours tourne encore avec l'ancien AppImage. Le nouvel artefact n'est pas chargé tant qu'IdeA n'est pas relancé avec l'AppImage 0.3.0.
|
|
||||||
|
|
||||||
## Action effectuée
|
|
||||||
|
|
||||||
Architect stoppé pour éviter un terminal avec tâche fantôme.
|
|
||||||
|
|
||||||
## Prochain chantier prévu après redémarrage
|
|
||||||
|
|
||||||
Git a recommandé:
|
|
||||||
- Prochain chantier: `feature/agent-skill-awareness`.
|
|
||||||
- Architect doit d'abord trancher le chevauchement avec `feature/agent-skills`.
|
|
||||||
- `fix/cold-start-delivery-race` est probablement obsolète/superseded par `feature/agent-skill-awareness`, mais à supprimer seulement après intégration ou décision Git finale.
|
|
||||||
|
|
||||||
## Reprise recommandée
|
|
||||||
|
|
||||||
1. Relancer IdeA avec:
|
|
||||||
`/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`
|
|
||||||
2. Reprendre par une délégation Architect:
|
|
||||||
cadrage `agent-skill-awareness` vs `agent-skills`.
|
|
||||||
3. Ensuite cycle normal: Git -> DevBackend -> QA -> Git.
|
|
||||||
@ -1,88 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-delivery-submit-logging-fix
|
|
||||||
description: memory note checkpoint-delivery-submit-logging-fix
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — hotfix livraison délégation + logs submit
|
|
||||||
|
|
||||||
Date: 2026-06-20
|
|
||||||
|
|
||||||
## Pourquoi ce checkpoint existe
|
|
||||||
|
|
||||||
Après le fix AppImage 0.3.0 précédent, la délégation `Main -> DevBackend` a reproduit le même symptôme que `Main -> Architect` avant redémarrage : le message de délégation apparaît dans l'input de la cellule cible, mais n'est pas soumis.
|
|
||||||
|
|
||||||
Le chantier `feature/agent-skill-awareness-v2` est donc suspendu tant que le canal de délégation n'est pas fiable.
|
|
||||||
|
|
||||||
## Branche et état
|
|
||||||
|
|
||||||
Branche active pendant le hotfix : `feature/agent-skill-awareness-v2`.
|
|
||||||
|
|
||||||
Dirty attendu hors code : fichiers runtime `.ideai/conversations/*`, `.ideai/layouts.json` produits par la session live.
|
|
||||||
|
|
||||||
## Changements code effectués
|
|
||||||
|
|
||||||
Frontend :
|
|
||||||
- `frontend/src/features/terminals/useWritePortal.ts`
|
|
||||||
- Logs détaillés `[write-portal]` : abonnement, attachement front, réception `delegationReady`, chunks de texte, délai avant submit, submit, ack, erreurs.
|
|
||||||
- Fix défensif : `submitSequence: ""` est normalisée vers `"\r"` au lieu d'écrire zéro octet.
|
|
||||||
- En cas d'erreur d'injection, arrêt du retry immédiat infini.
|
|
||||||
- `frontend/src/adapters/terminal.ts`
|
|
||||||
- Logs `[terminal-write]` sur writes non triviaux ou contrôles (`\r`, `\n`, bulk, etc.).
|
|
||||||
- `frontend/src/adapters/input.ts`
|
|
||||||
- Logs `[input-gateway]` pour `delegationDelivered` et `setFrontAttached`.
|
|
||||||
- `frontend/src/domain/index.ts`
|
|
||||||
- Commentaire défaut submit aligné sur ~350 ms.
|
|
||||||
- `frontend/src/features/terminals/useWritePortal.test.tsx`
|
|
||||||
- Test ajouté : `submitSequence: ""` doit envoyer `"\r"`.
|
|
||||||
|
|
||||||
Backend/application/Tauri :
|
|
||||||
- `crates/application/src/orchestrator/service.rs`
|
|
||||||
- `note_delegation_delivered` passe par `application::diag!` persistant.
|
|
||||||
- `set_agent_front_attached` logge les changements d'attachement et le cas médiateur absent.
|
|
||||||
- `crates/infrastructure/src/input/mod.rs`
|
|
||||||
- Logs détaillés `[input-mediator]` : start turn, gate cold start, publish `DelegationReady`, choix front-owned vs headless, bind handle, front attach/detach, headless text/submit start/ok/failure.
|
|
||||||
- Défaut headless `DEFAULT_SUBMIT_DELAY_MS` corrigé de 60 ms à 350 ms pour être aligné avec le write-portal.
|
|
||||||
- Headless normalise aussi une submit sequence vide vers `"\r"`.
|
|
||||||
- `crates/app-tauri/src/commands.rs`
|
|
||||||
- Logs persistants `[pty-write]` autour de `write_terminal` avec session, bytes, contrôle sans contenu bulk.
|
|
||||||
- Logs persistants `[delivery]` pour `delegation_delivered` et `set_front_attached`.
|
|
||||||
|
|
||||||
## Vérifications passées
|
|
||||||
|
|
||||||
- `cargo fmt --all -- --check` : OK.
|
|
||||||
- `npx vitest run src/features/terminals/useWritePortal.test.tsx src/adapters/terminal.test.ts src/features/terminals/TerminalView.portal.test.tsx` : OK, 3 files / 20 tests.
|
|
||||||
- `npx tsc --noEmit` : OK.
|
|
||||||
- `cargo test -p infrastructure input --lib` : OK, 35 tests.
|
|
||||||
- `cargo check -p app-tauri` : OK.
|
|
||||||
- `cargo test -p application --test orchestrator_service` : OK, 45 tests (warning existant `CapturingFs::writes` unused).
|
|
||||||
- `cargo test -p app-tauri --test orchestrator_wiring` : OK, 13 tests.
|
|
||||||
|
|
||||||
## Build AppImage
|
|
||||||
|
|
||||||
Commande Tauri standard : frontend build OK, Rust release OK, bundling Tauri KO avec `failed to run linuxdeploy` comme précédemment.
|
|
||||||
|
|
||||||
Contournement réussi :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ARCH=x86_64 APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 \
|
|
||||||
/tmp/appimage_extracted_02f96dbd6ecc47f616b5a57fb8b7aa60/usr/bin/appimagetool \
|
|
||||||
--runtime-file /tmp/idea-appimage-runtime-x86_64 \
|
|
||||||
/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA.AppDir \
|
|
||||||
/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage
|
|
||||||
```
|
|
||||||
|
|
||||||
Artefact :
|
|
||||||
- `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`
|
|
||||||
- taille : 106M
|
|
||||||
- `--appimage-offset` : `944632`
|
|
||||||
|
|
||||||
## Reprise recommandée
|
|
||||||
|
|
||||||
1. Relancer IdeA avec l'AppImage ci-dessus.
|
|
||||||
2. Reproduire une délégation simple `Main -> DevBackend` ou `Main -> Architect`.
|
|
||||||
3. Si le message reste dans l'input sans être soumis, récupérer les traces :
|
|
||||||
- logs persistants `application::diag!` (chemin configuré au startup, typiquement app-data logs/idea.log), chercher `[delivery]`, `[pty-write]`, `[rendezvous]`.
|
|
||||||
- console frontend, chercher `[write-portal]`, `[terminal-write]`, `[input-gateway]`.
|
|
||||||
- stderr si lancé depuis terminal, chercher `[input-mediator]`.
|
|
||||||
4. Une fois délégation fiable, reprendre `feature/agent-skill-awareness-v2` depuis le cadrage Architect déjà obtenu.
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-finding-a-fix-built-live-validation-pending
|
|
||||||
description: memory note checkpoint-finding-a-fix-built-live-validation-pending
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — Finding A : fix confirmé EN CODE + AppImage clean DÉPLOYÉE → reste la validation e2e LIVE (MAJ 2026-06-23 09:33)
|
|
||||||
|
|
||||||
Suite de [[mcp-e2e-findings-reply-wedge-phantom-busy]] (le défaut) et [[resume-after-appimage-rebuild-mcp-e2e]] (méthode).
|
|
||||||
|
|
||||||
## État du code (OK, vert)
|
|
||||||
- Fix Finding A **mergé dans `develop @ 77e62e5`** (par-dessus feat `c5e5493`).
|
|
||||||
- 3 lots : **Lot 1** préambule `idea_reply` impératif (`infrastructure/src/input/mod.rs` + `application/src/agent/lifecycle.rs`) ; **Lot 2 = LE fix** `with_prompt_ready_pattern("? for shortcuts")` sur le profil Claude (`application/src/agent/catalogue.rs:80`) + overlay `overlay_reference_defaults` ; **Lot 3** backstop timeout typé `TARGET_RETURNED_NO_REPLY` / env `IDEA_ASK_RENDEZVOUS_TIMEOUT_MS` (`infrastructure/src/orchestrator/mcp/server.rs`).
|
|
||||||
- Tests lib qui PROUVENT le seed (re-passés vert le 2026-06-23) : `application::agent::catalogue::mcp_tests::claude_seed_carries_the_measured_prompt_ready_pattern` ✓ et `codex_seed_leaves_prompt_ready_pattern_empty_for_now` ✓.
|
|
||||||
|
|
||||||
## LEÇON D'OUTILLAGE (important, éviter de refaire l'erreur)
|
|
||||||
**Ne PAS utiliser `strings`/`grep` sur le binaire comme oracle de présence du fix.** Le compilateur élimine/inline les littéraux uniques de `catalogue.rs` : `? for shortcuts` ET `codex --version` sont ABSENTS du binaire alors que le code et les tests les portent (les littéraux aussi présents ailleurs — `claude --version`, `.mcp.json`, `CLAUDE.md` — n'apparaissent que par co-référence). Oracle fiable = **tests** + **comportement live**, pas le grep binaire. (Une fausse alarme « build incrémental incohérent » a été levée puis invalidée ainsi.)
|
|
||||||
|
|
||||||
## Mise en service FAITE
|
|
||||||
- Rebuild clean (`cargo clean -p application -p infrastructure` puis recette tauri) → artefact `…/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`.
|
|
||||||
- **Déployé** sur `/home/anthony/Documents/IdeA_0.3.0_amd64.AppImage` (rename atomique ; SHA256 `138714473ed6a87b…` installée == artefact). Ancienne sauvegardée `…AppImage.bak-23pre`.
|
|
||||||
- ⚠️ **L'instance IdeA qui tourne encore est l'ANCIENNE** (FUSE déjà monté). Il faut que **l'utilisateur RELANCE IdeA** pour charger le nouveau binaire — cela redémarre tous les agents, dont Main (la session courante meurt).
|
|
||||||
|
|
||||||
## PROCHAINE ÉTAPE après redémarrage : test e2e LIVE
|
|
||||||
Méthode (rappel) : **NE PAS valider le système inter-agents VIA `idea_ask_agent`**. Piloter via subagents natifs / l'utilisateur. Diag EXTERNE : `ss -xp | grep idea-mcp` (ponts) ; transcripts `~/.claude/projects/<run-dir-encodé>/*.jsonl` (horodatages UTC ; reply réel = `tool_use` idea_reply ; wedge = transcript demandeur figé sur `tool_use` idea_ask_agent sans `tool_result`).
|
|
||||||
|
|
||||||
Scénario qui wedgeait (doit maintenant passer) :
|
|
||||||
1. Faire déléguer **DevBackend → QA** : « réponds juste pong ».
|
|
||||||
2. ATTENDU avec le fix : si QA répond en prose sans `idea_reply`, dans la grâce `PROMPT_READY_GRACE` le retour au prompt idle (`? for shortcuts`) déclenche `complete_without_reply` → **DevBackend reçoit `TargetReturnedNoReply` (retryable) et REPREND la main** (plus de wedge) ; `idea_workstate` QA repasse `working`→`idle`/`done` (plus de Busy fantôme). Lot 1 devrait en plus pousser QA à appeler `idea_reply` (chemin positif → DevBackend reçoit pong).
|
|
||||||
3. Non-régression : chemin positif normal (QA appelle `idea_reply`) → demandeur reçoit le résultat, workstate→done ; livraison 1er tour à froid intacte.
|
|
||||||
4. Calibrer `PROMPT_READY_GRACE` si la fenêtre est trop courte/longue en réel (défaut conservé).
|
|
||||||
|
|
||||||
## Après validation verte
|
|
||||||
Merge `develop` déjà fait. Reste éventuelle release (0.4.0 ?) = décision utilisateur. NB : **Git est de nouveau strictement local, PLUS d'accès push** (la note `git-agent-push-access-gitea-ssh` a été corrigée en ce sens). `develop` est ~69 commits devant `origin/develop` (sync remote hors périmètre Git).
|
|
||||||
|
|
||||||
## Follow-ups différés (hors PR)
|
|
||||||
Capture `prompt_ready_pattern` Codex ; généralisation merge profils de référence ; e2e délégation background (node_id None) / profils MCP défaut / observabilité UI des délégations ; durcissement doc `idea_reply` dans `CLAUDE.md` versionné (router à Git).
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-issue-ticket-backend-v1-done
|
|
||||||
description: memory note checkpoint-issue-ticket-backend-v1-done
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
name: checkpoint-issue-ticket-backend-v1-done
|
|
||||||
description: Checkpoint 2026-07-02 — backend V1 du système de tickets (T1-T5) terminé et vérifié vert sur feature/issue-ticket-system ; frontend F1-F5/F7 + QA formelle en attente du reset Codex.
|
|
||||||
metadata:
|
|
||||||
type: reference
|
|
||||||
---
|
|
||||||
# Checkpoint — système de tickets, backend V1 (T1-T5) fait & vérifié (2026-07-02)
|
|
||||||
|
|
||||||
Cadrage/design = [[issue-ticket-system-design]]. Branche `feature/issue-ticket-system` (base develop a9653bc).
|
|
||||||
|
|
||||||
## FAIT & vérifié (build + tests verts, harvesté sur disque)
|
|
||||||
- **T1** domaine `Issue` : `crates/domain/src/issue.rs` (+ tests `domain/tests/issue.rs`),
|
|
||||||
câblé dans `domain/src/{events.rs,ids.rs,lib.rs,ports.rs}`.
|
|
||||||
- **T2** store FS Markdown + allocator : `crates/infrastructure/src/issues.rs`
|
|
||||||
(`FsIssueStore`, `FsIssueNumberAllocator`, index.json, check version), tests `issue_store.rs`.
|
|
||||||
- **T3** use cases : `crates/application/src/issues/` (Create/Read/List/Update/UpdateCarnet/
|
|
||||||
Link/Unlink/AssignAgent, optimistic concurrency), tests `application/tests/issue_usecases.rs`.
|
|
||||||
- **T4** surface MCP : 10 outils `idea_ticket_{create,read,list,update,update_status,
|
|
||||||
update_priority,read_carnet,update_carnet,link,unlink}` enregistrés dans
|
|
||||||
`infrastructure/src/orchestrator/mcp/{mod,server,tools}.rs`.
|
|
||||||
- **T5** Tauri : `crates/app-tauri/src/tickets.rs` (commands + assign) + câblage composition-root
|
|
||||||
`crates/app-tauri/src/state.rs` (~l.824 : FsIssueStore/FsIssueNumberAllocator/use cases/
|
|
||||||
ticket_tool_provider). `cargo build` workspace OK ; app-tauri 47/51 tests verts.
|
|
||||||
|
|
||||||
## Dette pré-existante à NE PAS confondre avec régression
|
|
||||||
4 tests app-tauri rouges (`mcp_e2e_loopback_tests::{orphan_reply_is_typed_error,
|
|
||||||
ask_then_reply_round_trips_inline (+_codex)}`, `mcp_serve_peer_tests::handshake_then_tools_list`)
|
|
||||||
+ `infrastructure::orchestrator_watcher::ask_request_surfaces_reply_alongside_detail` :
|
|
||||||
tests de l'ANCIEN protocole ask/reply, échouent DÉJÀ sur `develop` vierge (prouvé par stash).
|
|
||||||
Le fix existe sur `feature/background-tasks-first-class` (alignement QA). Résorbés quand
|
|
||||||
background-tasks merge dans develop, ou à cherry-pick. NE PAS les compter contre les tickets.
|
|
||||||
|
|
||||||
## RESTE (bloqué reset Codex — les workers Architect/DevBackend/DevFrontend/QA partagent le
|
|
||||||
profil Codex ; Main+Git libres)
|
|
||||||
- **Frontend V1** : F1 gateway `IssueGateway` · F2 liste filtrable · F3 détail/édition
|
|
||||||
(conflits expectedVersion) · F4 éditeur Carnet Markdown · F5 liens & assignations · F7 `#42`
|
|
||||||
cliquable + pré-remplissage délégation. (F6 attachments = fast-follow hors V1.)
|
|
||||||
- **QA formelle** backend+frontend (create→lire via MCP, #N séquentiel, carnet édité par agent,
|
|
||||||
liens, assignation agent connu, optimistic concurrency conflit).
|
|
||||||
- Puis Git commit final + rebuild AppImage (NO_STRIP=true, cf. [[appimage-build-no-strip-relr-dyn-fix]]).
|
|
||||||
|
|
||||||
## Note process
|
|
||||||
Rendez-vous inter-agent timeout sur tâches LOURDES (binaire courant pré-B7) : l'agent produit
|
|
||||||
quand même le code, harvesté sur disque par Main (build+tests réels) puis commité via Git libre.
|
|
||||||
Confirme l'intérêt de B7/B8 (le rebuild B7 de 21:35 n'est pas encore le binaire lancé).
|
|
||||||
|
|
||||||
Lien : [[issue-ticket-system-design]], [[checkpoint-b7-blocked-codex-session-limit]],
|
|
||||||
[[background-tasks-first-class-design]].
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-mcp-t1-t6-green-t7-fix-wrong-layer
|
|
||||||
description: memory note checkpoint-mcp-t1-t6-green-t7-fix-wrong-layer
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
name: checkpoint-mcp-t1-t6-green-t7-fix-wrong-layer
|
|
||||||
description: T1→T6 verts (non-régression). T7 ROUGE diagnostiqué (fix sur mauvaise couche) PUIS RE-FIX implémenté dans le working tree + vert en tests unitaires. Reste : rebuild AppImage en cours → relance IdeA → re-valider T1→T7 en live → commit Git.
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint tests fonctionnels MCP — run a6ced819 (2026-06-24)
|
|
||||||
|
|
||||||
Plan via skill **mcp-rendezvous-functional-test**, Main = demandeur. Setup chauds : Main/QA/DevFrontend ; froids : Architect/DevBackend/Git.
|
|
||||||
|
|
||||||
## T1→T6 : VERTS sur AppImage 09:21 (aucune régression)
|
|
||||||
T1 visibilité, T2 chaude `pong`, T3 réveil froid Git (1er tour intact), T4 background node_id None, T5 no-reply backstop (live-state purgée), T6 multi-étapes == oracle. Détails dans l'historique. NB outillage : `pgrep -af mcp-server | grep <uuid>` = FAUX positifs (le shell de mesure se matche) → filtrer `ps -eo cmd | grep 'app-tauri mcp-server'`.
|
|
||||||
|
|
||||||
## T7 : défaut trouvé EN LIVE puis CORRIGÉ
|
|
||||||
**Défaut (T7e live, 621 s ≈ 600 s)** : cible en long tour unique > 600 s (transcript en croissance prouvée) coupée par un timeout PLAT `process error: agent session reply timed out`, pas d'extension. Le watchdog du fix précédent vivait côté requester (`server.rs`) mais le seam qui coupe vraiment est `application/src/orchestrator/service.rs` (`ASK_AGENT_TIMEOUT`=600s plat appliqué au drain de tour délégué, ~L1564). **Fix posé sur la mauvaise couche.**
|
|
||||||
|
|
||||||
**RE-FIX implémenté (subagent natif Architect→DevBackend→QA, worktree, ramené dans le main working tree ; HEAD toujours `1efe2f1`, NON committé)** :
|
|
||||||
- Découverte clé : `ClaudeSdkSession::send().await` rend TOUS les `ReplyEvent` en bloc À LA FIN du tour (rien mid-turn) → la vivacité par-événement est inutilisable ; seul signe de vie réel = **sonde transcript** (octets `.jsonl`), comme `server.rs`.
|
|
||||||
- Un seul `run_inactivity_watchdog` générique dans **`crates/application/src/orchestrator/rendezvous.rs`** (NOUVEAU, pur, testé), réutilisé par `service.rs` (le vrai seam) ET `server.rs` (copie privée supprimée → dé-duplication).
|
|
||||||
- Nouveau port `AskLivenessProbe` injecté au composition root `app-tauri/state.rs` → `transcript_activity_token` (+ `with_ask_ceiling`, env `IDEA_ASK_RENDEZVOUS_CEILING_MS`, défaut 4 h). Sans injection ⇒ fallback fenêtre plate = zéro régression.
|
|
||||||
- Issues typées : progrès<plafond → réarme ; progrès+plafond → `AppError::TargetCeilingActive` (code `RENDEZVOUS_CEILING_ACTIVE`, non-retry-aveugle) ; vrai silence → `AgentSessionError::Timeout` inchangé.
|
|
||||||
- Défaut secondaire (busy fantôme) : `mark_target_done_best_effort` sur toutes les branches d'abandon (PTY + structuré).
|
|
||||||
- Fichiers : application `{rendezvous.rs(new), service.rs, error.rs, lib.rs, orchestrator/mod.rs}`, infra `mcp/server.rs`, `app-tauri/state.rs` (+ les modifs infra inspector/lib pré-existantes du 1er fix).
|
|
||||||
- **Preuve réelle (re-vérifiée par Main dans le MAIN TREE)** : `cargo test -p application --lib` 75/0 (dont progressing_target_extends_then_resolves, _hits_ceiling_distinctly, silent_target_expires_no_reply, no_probe_falls_back_to_flat_window, ceiling_active_code) ; `cargo test -p infrastructure --lib` 247/0 ; clippy 0 nouveau warning.
|
|
||||||
|
|
||||||
## PROCHAINE ÉTAPE (reprise après relance IdeA)
|
|
||||||
1. **Rebuild AppImage EN COURS** (recette : `npm --prefix frontend run build` puis depuis `crates/app-tauri/` `APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage` ; artefact `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage` → remplace `/home/anthony/Documents/IdeA_0.3.0_amd64.AppImage`, backup l'ancienne). Log build : scratchpad/rebuild.log.
|
|
||||||
2. **Utilisateur relance IdeA** (tue Main).
|
|
||||||
3. **Reprendre le test depuis T1** (skill). Le but immédiat = **re-valider T7 EN LIVE** : déléguer une charge réelle > 600 s en un long tour (la machine est rapide : `cargo clean && cargo build --release --workspace` en boucle jusqu'à >13 min, transcript en croissance) ⇒ ATTENDU = PAS de timeout à 600 s, extension, reply final livré. Puis enchaîner T8 (parallèles), T9 (transitif A→B→C, Architect+DevBackend froids), T10 (interruption + reconcile reboot).
|
|
||||||
4. **Si live vert : demander à Git de committer** le fix (cf. [[git-owns-commit-merge-decisions]]) ; rendez-vous MCP court marche (T2-T6), donc commit délégable à Git OU subagent natif.
|
|
||||||
|
|
||||||
Lié à [[rendezvous-600s-cap-too-short-heavy-tasks]], [[mcp-functional-test-plan-2026-06-24]], [[mcp-bridge-and-delegation-runtime-notes]].
|
|
||||||
</content>
|
|
||||||
</invoke>
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-mcp-tests-t1-t5-and-t5-livestate-defect
|
|
||||||
description: memory note checkpoint-mcp-tests-t1-t5-and-t5-livestate-defect
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
name: checkpoint-mcp-tests-t1-t5-and-t5-livestate-defect
|
|
||||||
description: Run a6ced819 — relance complète T1→T6 du test fonctionnel MCP sur AppImage 08:41 (fix T5). T5 (live-state purgée sur no-reply) VALIDÉ EN LIVE. Blocage à T7 = défaut plafond 600s connu, non corrigé.
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint tests fonctionnels MCP — run a6ced819 (2026-06-24, relance depuis T1)
|
|
||||||
|
|
||||||
Binaire validé : **AppImage 2026-06-24 08:41:30** (fix live-state no-reply), process en cours = cette AppImage, git HEAD `1efe2f1`. Plan via skill **mcp-rendezvous-functional-test** (Main = demandeur). Voir [[mcp-functional-test-plan-2026-06-24]], [[rendezvous-600s-cap-too-short-heavy-tasks]], [[backstop-fires-on-intra-task-turn-rootcause]].
|
|
||||||
|
|
||||||
## Résultats de la relance T1→T6 (tous ✅)
|
|
||||||
- **T1** visibilité outils ✅ — 3 requesters chauds (Main, QA, DevFrontend) chacun pont ESTAB + 2 mcp-server ; froids (Architect, DevBackend, Git) 0 process.
|
|
||||||
- **T2** cible chaude (QA) ✅ — `pong` inline borné, workstate `done`, pas de busy fantôme.
|
|
||||||
- **T3** réveil à froid (Git) ✅ — nouveau pont (26012/26016), 1er tour `[IdeA·tâche…]` `parentUuid:null` intact, `delivered`, `pong-cold`.
|
|
||||||
- **T4** background node_id None (Git hors layouts.json) ✅ — `bg-step-ok`, multi-`delivered`, pont stable sans dup.
|
|
||||||
- **T5** no-reply backstop ✅ **VALIDÉ EN LIVE (le fix marche)** — Main libéré borné avec `TargetReturnedNoReply` (« returned to its prompt without calling idea_reply », retryable) ET **QA `status:"done"` purgée** (plus de busy fantôme `working`). Défaut historique #1 fermé.
|
|
||||||
- **T6** multi-étapes (QA lit fichier + `find` puis reply) ✅ — pas de libération prématurée, reply réel `header=… ; rs_count=55` (concorde avec `find` indépendant). Piège turn-watcher non déclenché.
|
|
||||||
|
|
||||||
## Blocage actuel : T7 (NON lancé — défaut connu non corrigé)
|
|
||||||
T7 = tâche lourde > plafond 600s. C'est le finding [[rendezvous-600s-cap-too-short-heavy-tasks]] : dépassement du plafond `IDEA_ASK_RENDEZVOUS_TIMEOUT_MS` (défaut 600000) → faux `-32001` + canal de report mort (idea_reply final non livrable), alors que la cible travaille et finit sur la branche. Les pistes (extension sur signe de vie / message « cible active, plafond atteint » distinct du retryable / plafond configurable / pas de cascade) sont **à cadrer Architect, pas encore implémentées**. Lancer T7 en live = figer Main ~10 min pour re-confirmer un défaut déjà documenté.
|
|
||||||
|
|
||||||
## Prochaine étape (décision utilisateur en attente)
|
|
||||||
Trois options sur T7 : (a) le lancer quand même pour re-confirmer (wedge ~10 min) ; (b) ouvrir le cycle de fix du plafond maintenant (Architect→Git→DevBackend→QA, rebuild, reprise T1) ; (c) sauter T7 et continuer T8 (parallèles), T9 (transitif A→B→C), T10 (interruption + reconcile reboot) qui ne dépendent pas du plafond. Architect/DevBackend restent froids pour T9.
|
|
||||||
@ -1,98 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-orchestrator-designation-appimage-build
|
|
||||||
description: memory note checkpoint-orchestrator-designation-appimage-build
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — AppImage rebuild après orchestrator-designation
|
|
||||||
|
|
||||||
Date: 2026-06-20
|
|
||||||
|
|
||||||
## État Git avant build
|
|
||||||
|
|
||||||
Git avait clôturé `feature/orchestrator-designation`:
|
|
||||||
- Commits atomiques créés:
|
|
||||||
- `287681c feat(orchestrator): ...`
|
|
||||||
- `e462136 feat(terminals): ...`
|
|
||||||
- `09f5362 docs: ...`
|
|
||||||
- `5ef001e chore(wip): ...`
|
|
||||||
- Merge local dans `develop`: `55d887f merge(orchestrator): intègre le chantier orchestrator-designation dans develop`.
|
|
||||||
- Branche `feature/orchestrator-designation` supprimée.
|
|
||||||
- Worktree propre à ce moment-là.
|
|
||||||
|
|
||||||
## Rebuild tenté
|
|
||||||
|
|
||||||
Commande initiale:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm --prefix frontend run build && \
|
|
||||||
cd crates/app-tauri && \
|
|
||||||
APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage
|
|
||||||
```
|
|
||||||
|
|
||||||
Résultat:
|
|
||||||
- Frontend build OK.
|
|
||||||
- Rust release build OK: `/home/anthony/Documents/Projects/IdeA/target/release/app-tauri`.
|
|
||||||
- AppDir généré: `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA.AppDir`.
|
|
||||||
- Bundling Tauri KO: `failed to run linuxdeploy`.
|
|
||||||
|
|
||||||
## Contournement réussi
|
|
||||||
|
|
||||||
`appimagetool` extrait existait dans:
|
|
||||||
|
|
||||||
```text
|
|
||||||
/tmp/appimage_extracted_02f96dbd6ecc47f616b5a57fb8b7aa60/usr/bin/appimagetool
|
|
||||||
```
|
|
||||||
|
|
||||||
L'appel direct à appimagetool échouait car réseau restreint:
|
|
||||||
|
|
||||||
```text
|
|
||||||
Failed to download runtime ... pass it to appimagetool with --runtime-file
|
|
||||||
```
|
|
||||||
|
|
||||||
Runtime extrait depuis l'ancienne AppImage locale:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/home/anthony/Documents/IdeA_0.2.0_amd64.AppImage --appimage-offset
|
|
||||||
# 944632
|
|
||||||
|
|
||||||
dd if=/home/anthony/Documents/IdeA_0.2.0_amd64.AppImage \
|
|
||||||
of=/tmp/idea-appimage-runtime-x86_64 \
|
|
||||||
bs=1 count=944632 status=none
|
|
||||||
chmod +x /tmp/idea-appimage-runtime-x86_64
|
|
||||||
```
|
|
||||||
|
|
||||||
Commande finale réussie:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ARCH=x86_64 APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 \
|
|
||||||
/tmp/appimage_extracted_02f96dbd6ecc47f616b5a57fb8b7aa60/usr/bin/appimagetool \
|
|
||||||
--runtime-file /tmp/idea-appimage-runtime-x86_64 \
|
|
||||||
/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA.AppDir \
|
|
||||||
/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage
|
|
||||||
```
|
|
||||||
|
|
||||||
Artefact produit:
|
|
||||||
|
|
||||||
```text
|
|
||||||
/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage
|
|
||||||
Taille: 106M
|
|
||||||
--appimage-offset: 944632
|
|
||||||
```
|
|
||||||
|
|
||||||
## État Git après build
|
|
||||||
|
|
||||||
Le build/la session a laissé du runtime dirty:
|
|
||||||
|
|
||||||
```text
|
|
||||||
## develop...origin/develop [ahead 8]
|
|
||||||
M .ideai/conversations/6bc594e8-a37c-0dbd-1de6-6e3b73002cb4/handoff.md
|
|
||||||
M .ideai/conversations/6bc594e8-a37c-0dbd-1de6-6e3b73002cb4/log.jsonl
|
|
||||||
M .ideai/layouts.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Ne pas nettoyer arbitrairement. Demander à Git de décider si ces fichiers runtime doivent être commités/ignorés au prochain passage.
|
|
||||||
|
|
||||||
## Important live
|
|
||||||
|
|
||||||
L'AppImage en cours d'exécution ne charge pas automatiquement ce nouvel artefact. Pour utiliser les correctifs d'orchestration/write-portal, lancer l'artefact 0.3.0 produit ci-dessus ou remplacer l'AppImage installée hors sandbox si nécessaire.
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-orchestrator-designation-backend-compile-fix
|
|
||||||
description: memory note checkpoint-orchestrator-designation-backend-compile-fix
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — orchestrator-designation backend compile fix
|
|
||||||
|
|
||||||
Date: 2026-06-20
|
|
||||||
|
|
||||||
## Branche
|
|
||||||
|
|
||||||
`feature/orchestrator-designation`.
|
|
||||||
|
|
||||||
## Décision Git
|
|
||||||
|
|
||||||
Finir le chantier courant sur cette branche. Pas de stash, pas de switch. Après tests verts ou résidu qualifié: retour Git pour commits atomiques puis merge local vers `develop`.
|
|
||||||
|
|
||||||
## Incident live
|
|
||||||
|
|
||||||
La délégation vers Architect a été affichée dans son chat mais non soumise. Architect a été stoppé. Symptôme cohérent avec l'AppImage live qui n'intègre pas encore les correctifs WIP write-portal/headless delivery.
|
|
||||||
|
|
||||||
## Vérifications Main avant correction DevBackend
|
|
||||||
|
|
||||||
Verts:
|
|
||||||
- `cargo test -p infrastructure input --lib`: 35 passed.
|
|
||||||
- `cargo test -p application --test orchestrator_service`: 45 passed.
|
|
||||||
- `cd frontend && npx vitest run`: 41 files, 384 tests passed.
|
|
||||||
- `cd frontend && npx tsc --noEmit`: OK.
|
|
||||||
|
|
||||||
Rouge initial:
|
|
||||||
- `cargo test --workspace` ne compilait pas `crates/application/src/orchestrator/context_guard.rs`:
|
|
||||||
- `may_write_directly` appelé avec 2 args au lieu de 3 (`OrchestratorDesignation` manquant).
|
|
||||||
- mauvais champ `orchestrator` mis sur `ManifestEntry` au lieu de `AgentManifest`.
|
|
||||||
- init `AgentManifest` sans `orchestrator`.
|
|
||||||
|
|
||||||
## Correction DevBackend
|
|
||||||
|
|
||||||
DevBackend a modifié `crates/application/src/orchestrator/context_guard.rs`:
|
|
||||||
- `ProposeContext` charge `AgentManifest`, récupère `manifest.orchestrator_designation()`, puis appelle `may_write_directly(requester, &GuardedResource::ProjectContext, &designation)`.
|
|
||||||
- Le `FileGuard` reste un verrou, pas le propriétaire de l'autorisation.
|
|
||||||
- Tests locaux adaptés à `AgentManifest { version, entries, orchestrator }`.
|
|
||||||
|
|
||||||
Validations DevBackend:
|
|
||||||
- `cargo fmt --all && cargo test -p application --test orchestrator_service`: OK, 45 passed.
|
|
||||||
- `cargo test -p application`: OK.
|
|
||||||
- `cargo test --workspace`: compile maintenant plus loin mais échoue dans `app-tauri` sur tests loopback Unix socket sous sandbox (`PermissionDenied`/`Operation not permitted` lors du bind `/run/user/1000/idea-mcp/*.sock`).
|
|
||||||
|
|
||||||
## Prochaine étape
|
|
||||||
|
|
||||||
QA doit qualifier le résidu app-tauri:
|
|
||||||
- confirmer que les suites métier/orchestration sont vertes,
|
|
||||||
- confirmer si les échecs app-tauri sont environnement/sandbox et non régression,
|
|
||||||
- proposer la commande de validation acceptable ou le besoin de correction test/env.
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-orchestrator-designation-qa-verdict
|
|
||||||
description: memory note checkpoint-orchestrator-designation-qa-verdict
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — QA verdict orchestrator-designation
|
|
||||||
|
|
||||||
Date: 2026-06-20
|
|
||||||
|
|
||||||
## Branche
|
|
||||||
|
|
||||||
`feature/orchestrator-designation`.
|
|
||||||
|
|
||||||
## Verdict QA
|
|
||||||
|
|
||||||
Chantier validable sous contrainte d'environnement. Pas de régression fonctionnelle liée à `context_guard.rs`.
|
|
||||||
|
|
||||||
## Commandes vertes qui font foi
|
|
||||||
|
|
||||||
- `cargo fmt --all -- --check`: OK.
|
|
||||||
- `cargo test -p application --test orchestrator_service`: OK, 45 passed.
|
|
||||||
- `cargo test -p application`: OK, suite application complète verte, incluant les tests context guard orchestrateur/proposition.
|
|
||||||
- `cargo test -p infrastructure input --lib`: OK, 35 passed.
|
|
||||||
- `cd frontend && npx vitest run`: OK, 41 files / 384 tests passed.
|
|
||||||
- `cd frontend && npx tsc --noEmit`: OK.
|
|
||||||
|
|
||||||
## Résidu app-tauri
|
|
||||||
|
|
||||||
- `cargo test -p app-tauri --lib`: rouge, 39 passed / 8 failed.
|
|
||||||
- `cargo test --workspace`: rouge sur le même bloc app-tauri.
|
|
||||||
|
|
||||||
Échecs exacts: tests loopback Unix socket:
|
|
||||||
- `mcp_bridge::tests::end_to_end_over_real_loopback`
|
|
||||||
- `state::bind_endpoint_d1_tests::rebind_after_corpse_socket_succeeds`
|
|
||||||
- `state::mcp_e2e_loopback_tests::*`
|
|
||||||
|
|
||||||
Cause qualifiée par QA: contrainte environnement/sandbox. Une sonde Node minimale échoue aussi à `listen()` sur Unix socket avec `EPERM` sous `/run/user/1000` et sous `/tmp`. Donc les tests qui exigent un vrai socket Unix ne sont pas exécutables dans ce sandbox.
|
|
||||||
|
|
||||||
## Prochaine étape
|
|
||||||
|
|
||||||
Retour à Git pour commits atomiques sur `feature/orchestrator-designation`, puis décision de merge local vers `develop` selon sa stratégie. Aucun push.
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-orchestrator-designation-restart
|
|
||||||
description: memory note checkpoint-orchestrator-designation-restart
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — reprise chantier orchestrator-designation
|
|
||||||
|
|
||||||
Date: 2026-06-20
|
|
||||||
|
|
||||||
## Situation
|
|
||||||
|
|
||||||
L'utilisateur a demandé de terminer les chantiers ouverts. Main a repris le cycle proprement.
|
|
||||||
|
|
||||||
## Décision Git obtenue
|
|
||||||
|
|
||||||
Git a inspecté l'état local et décidé:
|
|
||||||
|
|
||||||
- Branche courante: `feature/orchestrator-designation`.
|
|
||||||
- Worktree dirty important mais analysé comme mono-thème: chantier orchestrateur/designation + diagnostic inter-agents.
|
|
||||||
- Ne pas stash, ne pas switch, ne pas ouvrir une nouvelle branche maintenant.
|
|
||||||
- Premier chantier à fermer: `orchestrator-designation` sur la branche actuelle.
|
|
||||||
- Après stabilisation + tests verts: retour à Git pour commits atomiques puis merge local vers `develop`.
|
|
||||||
- Ensuite seulement ouvrir des branches dédiées pour les autres chantiers.
|
|
||||||
|
|
||||||
## Incident de délégation
|
|
||||||
|
|
||||||
Main a tenté de demander à Architect de cadrer `orchestrator-designation` via `idea_ask_agent`.
|
|
||||||
L'utilisateur a interrompu et signalé qu'Architect était bloqué avec le texte de la tâche affiché dans son chat mais non envoyé.
|
|
||||||
|
|
||||||
Interprétation: symptôme cohérent avec les problèmes actuels de write portal / soumission physique PTY / délégation visible-background. Ne pas empiler de nouvelles délégations tant que cette zone n'est pas stabilisée.
|
|
||||||
|
|
||||||
## Prochaine reprise recommandée
|
|
||||||
|
|
||||||
1. Nettoyer/arrêter l'agent Architect bloqué si nécessaire.
|
|
||||||
2. Reprendre le chantier courant localement en lecture seule pour identifier exactement les changements WIP liés à la soumission de délégations.
|
|
||||||
3. Comme Main ne code pas, utiliser la délégation seulement vers un agent dont la soumission est confirmée fonctionnelle, ou lancer les agents en visible et vérifier qu'ils reçoivent réellement la tâche.
|
|
||||||
4. Priorité technique immédiate: fermer `orchestrator-designation`, car la délégation inter-agents fiable conditionne tous les autres chantiers.
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-rendezvous-redesign-devbackend-todo
|
|
||||||
description: memory note checkpoint-rendezvous-redesign-devbackend-todo
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — Backstop no-reply : 1ère validation live ÉCHOUÉE → cause racine corrigée → RE-VALIDATION LIVE EN ATTENTE (MAJ 2026-06-23 ~19:40)
|
|
||||||
|
|
||||||
## Résultat du 1er test live (AppImage 0.3.0 du commit e87c05f) : ÉCHEC reproduisant le wedge
|
|
||||||
Scénario joué : DevBackend→QA `ping (test backstop)`, QA répond `pong` EN PROSE sans `idea_reply`.
|
|
||||||
- QA a bien émis un vrai `turn_duration durationMs=2218` (transcript, ts 17:23:40.161Z).
|
|
||||||
- MAIS `[turn-watcher] turn_ended` JAMAIS émis (`grep -c turn_ended` sur tout le log = **0**) → DevBackend resté coincé → rendez-vous Main→DevBackend a timeout 600s (MCP error -32001).
|
|
||||||
|
|
||||||
## CAUSE RACINE (prouvée) — encodage du slug projet Claude faux
|
|
||||||
Traces `[turn-watcher] arm` : toutes `conversation=<none>` + `baseline … count=0`. Le dossier transcript calculé n'existait pas :
|
|
||||||
- calculé (faux) : `…/-home-…-IdeA-.ideai-run-<uuid>` (point conservé) → `ls` = absent
|
|
||||||
- réel (disque) : `…/-home-…-IdeA--ideai-run-<uuid>` (DOUBLE tiret)
|
|
||||||
`encode_cwd` (crates/infrastructure/src/inspector/claude_paths.rs) ne remplaçait que `/`/`\\` et gardait le `.`. Claude Code encode `replace(/[^a-zA-Z0-9]/g,'-')`. Dir introuvable → conversation non résolue → baseline 0 → `turn_duration` jamais vu → backstop mort.
|
|
||||||
Log de référence : `/home/anthony/.local/share/app.idea.ide/logs/idea.log`.
|
|
||||||
|
|
||||||
## FIX LIVRÉ par DevBackend (NON commité — Git tranche)
|
|
||||||
- `encode_cwd` : `.map(|c| if c.is_ascii_alphanumeric() { c } else { '-' })` (algo exact Claude Code). `/IdeA/.ideai/run` → `-IdeA--ideai-run`.
|
|
||||||
- Test non-régression ajouté `encode_cwd_encodes_dot_in_run_dir_to_double_dash` (PASS). Test Windows maj `C:\\Users\\me`→`C--Users-me`.
|
|
||||||
- DevBackend précise : `count_turn_ends` agrège déjà tous les `.jsonl` du dossier ⇒ pas besoin de choisir un .jsonl ; `conversation=<none>` à l'armement est normal et sans impact une fois le dir correct.
|
|
||||||
|
|
||||||
## QA PRÉ-VALIDATION : VERTE
|
|
||||||
`cargo test --workspace` = **1616 passed, 0 failed** ; `cargo clippy --workspace --all-targets` = 0 erreur. Nouveau test + 5 tests turn-watcher tous PASS.
|
|
||||||
|
|
||||||
## EN COURS : rebuild AppImage (par Main, perms project-root OK)
|
|
||||||
Recette : `npm --prefix frontend run build` puis depuis `crates/app-tauri/` `APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage`. Logs scratchpad fe-build.log / appimage-build.log. Sortie : `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`.
|
|
||||||
|
|
||||||
## SEUL RESTE À FAIRE = RE-VALIDATION LIVE (garde-fou Git : pas de merge sans wedge prouvé levé EN LIVE)
|
|
||||||
1. Utilisateur remplace l'AppImage installée par la nouvelle + relance IdeA (coupe la session).
|
|
||||||
2. Session fraîche : rejouer DevBackend→QA pong-sans-`idea_reply`. ATTENDU cette fois : trace `arm … dir=…IdeA--ideai-run-… conversation=…` sur dossier EXISTANT + baseline NON nulle + `[turn-watcher] turn_duration detected … -> turn_ended` ⇒ libération du demandeur ~grâce (≈2s) avec résultat no-reply synthétique, et non-régression du chemin propre `idea_reply`.
|
|
||||||
3. Si VERT → demander à Git d'amender/committer le fix sur `feature/rendezvous-no-reply-backstop` puis décider du merge develop. Si KO → relayer trace réelle à DevBackend.
|
|
||||||
|
|
||||||
## Trou produit confirmé (hors scope, à planifier)
|
|
||||||
Au reboot, `.ideai/live-state.json` non réconcilié : agents restent `working` fantôme (process morts). Fichier file-guardé, `idea_workstate_set` = self only, aucun reset cross-agent. Manque : réconciliation au boot OU outil orchestrateur de reset.
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-t1-wake-delivery-bug-fixed-rebuild-pending
|
|
||||||
description: memory note checkpoint-t1-wake-delivery-bug-fixed-rebuild-pending
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
name: checkpoint-t1-wake-delivery-bug-fixed-rebuild-pending
|
|
||||||
description: Ticket #1 — T1 VERT live. T3 root cause = tâches de fond jamais projetées dans work-state ; fix BE+FE livré unit-green ; rebuild AppImage en cours ; reste re-QA live T3 + T2 reboot, puis merge.
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint ticket #1 — état au 2026-07-03
|
|
||||||
|
|
||||||
## T1 — VERT (validé live QA)
|
|
||||||
Wake auto du propriétaire à la complétion + `completionDelivered: true` prouvés dans le store (`.ideai/background-tasks/<owner>.json`, task `02aa2493`). Fixes portant T1 (unit-green, NON commités) : wake.rs:119 (mark_completion_delivered dès session.send accepté), structured.rs:121 (drain_reply_stream_with_readiness), agent_wake.rs:504 (régression), + itér.1 MediatedInbox enqueue FIFO sans busy.
|
|
||||||
Note : `idea_workstate_read` n'expose PAS les BackgroundTasks — lire le store JSON.
|
|
||||||
|
|
||||||
## T3 — root cause trouvée + fix livré (unit-green, NON commité)
|
|
||||||
Défaut live : aucun bouton Cancel/Retry dans le panneau Work. Cause = le DTO `AgentWorkState` ne portait pas les tâches de fond et `GetProjectWorkState` n'avait pas de dépendance BackgroundTaskStore → `agent.backgroundTasks` toujours vide en live → section masquée (ProjectWorkStatePanel.tsx:638). Front déjà câblé, seule la projection backend manquait. Vitest verts en trompe-l'œil (payload mocké).
|
|
||||||
Cadrage Architect : mémoire `workstate-background-tasks-projection-fix` (Option A — étendre le read-model unique, best-effort, aucun nouveau port).
|
|
||||||
Livré :
|
|
||||||
- BE (DevBackend) : VO `AgentBackgroundTaskState` + champ `background_tasks` sur AgentWorkState + builder `with_background_tasks` + projection union open/undelivered best-effort (workstate/mod.rs) ; DTO Tauri backgroundTasks (dto.rs) ; wiring state.rs. Tests : `cargo test -p application` 24 passed (workstate.rs), `-p app-tauri` vert, build workspace OK.
|
|
||||||
- FE (DevFrontend) : mapping queued/waiting→pending explicité, test sur vrai shape backend, + correctif tri (finishedAtMs jamais émis → bascule sur updatedAtMs). vitest 460/460, build OK. Verdict : `tickets-t3-frontend-validation-verdict`.
|
|
||||||
- Dette de contrat tracée en ticket #5 (summary non affiché, owner/project inutiles). Low.
|
|
||||||
|
|
||||||
## RESTE À FAIRE (ordre)
|
|
||||||
1. Rebuild AppImage `NO_STRIP=true` — EN COURS (background bixa34tht). Voir [[appimage-build-no-strip-relr-dyn-fix]].
|
|
||||||
2. Utilisateur relance l'AppImage.
|
|
||||||
3. QA re-passe T3 LIVE : T3-a apparition running + Cancel actif ; T3-b Cancel agit → cancelled + Retry actif ; T3-c Retry → nouvelle tâche running ; T3-d borne livraison (tâche livrée disparaît = conforme V1, PAS un bug) ; T3-e isolation par agent ; T3-f non-régression live/busy/tickets. Détail dans cadrage Architect.
|
|
||||||
4. T2 — reconcile après reboot (fin AVANT wake), protocole MANUEL, coordination reboot utilisateur.
|
|
||||||
5. Si T1+T2+T3 verts → Git commit de TOUS les fix (T1 + T3 BE/FE) + merge feature/background-tasks-first-class → develop (résorbe aussi 4 tests protocole MCP périmés rouges sur develop).
|
|
||||||
|
|
||||||
Liens : [[workstate-background-tasks-projection-fix]], [[tickets-t3-frontend-validation-verdict]], [[b8-in-app-trigger-run-in-background]], [[background-tasks-first-class-design]].
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-work-tab-blank-fix
|
|
||||||
description: memory note checkpoint-work-tab-blank-fix
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — Fix onglet Work vide
|
|
||||||
|
|
||||||
Date: 2026-06-21
|
|
||||||
|
|
||||||
## État final
|
|
||||||
|
|
||||||
Correctif frontend de l'onglet Work vide terminé, validé QA (VERT) et mergé localement dans `develop`.
|
|
||||||
|
|
||||||
- `develop` @ `a66881d` — merge local `--no-ff` du fix.
|
|
||||||
- Commit de feature intégré : `3e1e553` (anciennement `9d2f186`, message amendé pour retirer le marqueur `(WIP, QA en attente)`).
|
|
||||||
- Branche `fix/work-tab-blank-page` supprimée après merge.
|
|
||||||
- Aucun push, aucune PR. `develop` en avance de 45 commits sur `origin/develop` (local-only).
|
|
||||||
|
|
||||||
## Contenu du fix
|
|
||||||
|
|
||||||
Normalisation défensive du work-state (`frontend/src/adapters/workStateNormalization.ts` nouveau) + adaptation panneau/mock/tests, pour qu'un work-state partiel/inattendu ne rende plus une page entièrement vide. 5 fichiers, +259/-47.
|
|
||||||
|
|
||||||
## QA verte (sortie réelle)
|
|
||||||
|
|
||||||
- `cd frontend && npx tsc --noEmit` → exit 0.
|
|
||||||
- `cd frontend && npx vitest run` → 42 fichiers / 407 tests passed, exit 0.
|
|
||||||
|
|
||||||
## Branches ouvertes restantes (non mergées dans develop)
|
|
||||||
|
|
||||||
À cadrer/arbitrer avant intégration :
|
|
||||||
- `feature/agent-skills` @ `ef101db` — domaine skills agent + use cases + FS store + injection LaunchAgent (L12).
|
|
||||||
- `feature/agent-skill-awareness` @ `5be8987` — manifeste skills + outil MCP `idea_skill_read` + brief « capacités IdeA » dans contexte agent ; contient aussi un fix input cold-start (`e93a2c1`).
|
|
||||||
- `fix/cold-start-delivery-race` @ `9590eac` — fix livraison délégation cold-start ; branche basée sur d'anciens commits release (0.1.0/0.2.0), potentiellement redondante avec `e93a2c1` de skill-awareness → vérifier avant merge.
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-workstate-controlled-actions-lot-d
|
|
||||||
description: memory note checkpoint-workstate-controlled-actions-lot-d
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — Workstate controlled actions Lot D
|
|
||||||
|
|
||||||
Date: 2026-06-20
|
|
||||||
|
|
||||||
## État final
|
|
||||||
|
|
||||||
Lot D `workstate controlled actions` terminé, validé QA et mergé localement dans `develop`.
|
|
||||||
|
|
||||||
Branche finale:
|
|
||||||
- `develop` @ `c1e99d1` — merge local `feature/workstate-controlled-actions`.
|
|
||||||
- `feature/workstate-controlled-actions` conservée.
|
|
||||||
- Aucun push, aucune branche supprimée.
|
|
||||||
- Working tree propre après décision Git.
|
|
||||||
|
|
||||||
## Commits créés
|
|
||||||
|
|
||||||
- `3408c96` — `feat(workstate): actions contrôlées sur le work-state (Lot D backend)`
|
|
||||||
- Use cases agent-level `AttachLiveAgent` et `StopLiveAgent`.
|
|
||||||
- Commandes Tauri `attach_live_agent` et `stop_live_agent`.
|
|
||||||
- Attach rebind PTY/structured sans spawn; stop PTY/structured.
|
|
||||||
- DTO camelCase et wiring AppState/lib.
|
|
||||||
|
|
||||||
- `1c6441b` — `feat(workstate): UI des actions contrôlées (Lot D frontend)`
|
|
||||||
- Port/adaptateur agent alignés sur le nouveau contrat attach + stop.
|
|
||||||
- Panneau Work: Open, Attach, Stop, View conversation, Copy summary.
|
|
||||||
- Work n'appelle pas `launchAgent`; Stop passe par `stopLiveAgent`; View/Copy n'utilisent que les previews Lot C.
|
|
||||||
|
|
||||||
- `0976648` — `chore(wip): état runtime .ideai (flux conversation live)`
|
|
||||||
- Runtime isolé des commits feature.
|
|
||||||
|
|
||||||
- `c1e99d1` — merge local dans `develop`.
|
|
||||||
|
|
||||||
## QA verte
|
|
||||||
|
|
||||||
Commandes QA/Git validées:
|
|
||||||
- `cargo fmt --all -- --check` OK.
|
|
||||||
- `cargo test -p application --test workstate_actions` OK, 7 passed.
|
|
||||||
- `cargo test -p application --test workstate` OK, 21 passed.
|
|
||||||
- `cargo test -p app-tauri --test dto_agents` OK, 25 passed.
|
|
||||||
- `cargo test -p app-tauri --test list_live_agents_r0b` OK, 5 passed.
|
|
||||||
- `cargo check -p app-tauri` OK.
|
|
||||||
- `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` OK, 25 tests.
|
|
||||||
- `cd frontend && npx vitest run src/adapters/agent.test.ts` OK, 8 tests.
|
|
||||||
- `cd frontend && npx vitest run src/features/layout/singletonAgent.test.tsx src/features/layout/agentAlreadyRunning.test.tsx` OK, 9 tests.
|
|
||||||
- `cd frontend && npx tsc --noEmit` OK.
|
|
||||||
|
|
||||||
Warnings restants uniquement côté Vite sur options `esbuild` dépréciées/ignorées au profit de `oxc`, non bloquants.
|
|
||||||
|
|
||||||
## Décisions produit/techniques
|
|
||||||
|
|
||||||
- Actions Lot D opèrent seulement sur l'état existant; pas de lancement d'agent neuf depuis Work.
|
|
||||||
- Attach ne crée ni session ni cellule; cible déterministe = cellule visible vide côté UI.
|
|
||||||
- Stop ne supprime ni agent, ni tickets, ni handoff/conversation summary.
|
|
||||||
- View/Copy restent limités aux previews bornées Lot C; aucun log brut exposé.
|
|
||||||
|
|
||||||
## Suite probable
|
|
||||||
|
|
||||||
La quadrilogie Work A/B/C/D est intégrée. Prochains chantiers restants à cadrer: persistance conversationnelle/cross-profile plus profonde, mise à jour automatique mémoire/contexte pendant la vie des agents, ou synchronisation documentaire architecture selon priorité Architect/Main.
|
|
||||||
@ -1,60 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-workstate-conversation-summaries-lot-c
|
|
||||||
description: memory note checkpoint-workstate-conversation-summaries-lot-c
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — Workstate conversation summaries Lot C
|
|
||||||
|
|
||||||
Date: 2026-06-20
|
|
||||||
|
|
||||||
## État final
|
|
||||||
|
|
||||||
Lot C `workstate conversation summaries` terminé, validé QA et mergé localement dans `develop`.
|
|
||||||
|
|
||||||
Branche finale:
|
|
||||||
- `develop` @ `6e1ba7e` — merge local `feature/workstate-conversation-summaries`.
|
|
||||||
- `feature/workstate-conversation-summaries` conservée.
|
|
||||||
- Aucun push, aucune branche supprimée.
|
|
||||||
- Working tree propre après décision Git.
|
|
||||||
|
|
||||||
## Commits créés
|
|
||||||
|
|
||||||
- `e9edadc` — `feat(workstate): résumés de conversation dans le read-model (Lot C backend)`
|
|
||||||
- `ProjectWorkState.conversations` top-level.
|
|
||||||
- Résumés best-effort depuis `HandoffStore`, fallback `ConversationLog::last(3)`.
|
|
||||||
- Déduplication des conversation ids issus des tickets, ordre first-seen.
|
|
||||||
- DTO camelCase et câblage Tauri.
|
|
||||||
|
|
||||||
- `c50622e` — `feat(workstate): UI des résumés de conversation (Lot C frontend)`
|
|
||||||
- Types TS `ConversationWorkSummary` et previews.
|
|
||||||
- Mock normalise `conversations: []`.
|
|
||||||
- Panneau Work joint `tickets[].conversationId` vers `conversations[]` et affiche badge + preview compacte.
|
|
||||||
|
|
||||||
- `78500d8` — `chore(wip): état runtime .ideai (flux conversation live)`
|
|
||||||
- Runtime isolé des commits feature.
|
|
||||||
|
|
||||||
- `6e1ba7e` — merge local dans `develop`.
|
|
||||||
|
|
||||||
## QA verte
|
|
||||||
|
|
||||||
Commandes QA finales validées:
|
|
||||||
- `cargo fmt --all -- --check` OK.
|
|
||||||
- `cargo test -p application --test workstate` OK, 21 passed, aucun warning Rust.
|
|
||||||
- `cargo test -p app-tauri --test dto_agents` OK, 21 passed.
|
|
||||||
- `cargo check -p app-tauri` OK.
|
|
||||||
- `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` OK, 2 files / 19 tests.
|
|
||||||
- `cd frontend && npx tsc --noEmit` OK.
|
|
||||||
|
|
||||||
Warnings restants uniquement côté Vite sur options `esbuild` dépréciées/ignorées au profit de `oxc`, non bloquants.
|
|
||||||
|
|
||||||
## Décisions produit/techniques
|
|
||||||
|
|
||||||
- Source primaire: handoff conversationnel existant.
|
|
||||||
- Fallback: derniers tours bornés du log, jamais le log brut complet.
|
|
||||||
- Read-only et best-effort: les erreurs de preview ne bloquent pas `live/busy/tickets`.
|
|
||||||
- Pas de nouvelle persistance, pas de mutation/réparation, pas de nouvelle action UX.
|
|
||||||
|
|
||||||
## Suite probable
|
|
||||||
|
|
||||||
Le prochain lot logique est Lot D: actions UX read/write contrôlées autour du panneau Work (ouvrir/rattacher cellule, voir conversation, arrêter agent, éventuellement copier résumé), à cadrer par Architect avant implémentation.
|
|
||||||
@ -1,62 +0,0 @@
|
|||||||
---
|
|
||||||
name: checkpoint-workstate-delegation-queue-lot-b
|
|
||||||
description: memory note checkpoint-workstate-delegation-queue-lot-b
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Checkpoint — Workstate delegation/queue snapshot Lot B
|
|
||||||
|
|
||||||
Date: 2026-06-20
|
|
||||||
|
|
||||||
## État final
|
|
||||||
|
|
||||||
Lot B `workstate delegation/queue snapshot` terminé, validé QA et mergé localement dans `develop`.
|
|
||||||
|
|
||||||
Branche finale:
|
|
||||||
- `develop` @ `64c2c14` — merge local `feature/workstate-delegation-queue`.
|
|
||||||
- `feature/workstate-delegation-queue` conservée.
|
|
||||||
- Aucun push, aucune branche supprimée.
|
|
||||||
- Working tree propre après décision Git.
|
|
||||||
|
|
||||||
## Commits créés
|
|
||||||
|
|
||||||
- `cc7d99a` — `feat(workstate): snapshot des délégations en file par agent (Lot B backend)`
|
|
||||||
- `QueuedTicketSnapshot` + port read-only `AgentQueueSnapshot`.
|
|
||||||
- Impl `InMemoryMailbox` snapshot FIFO sans cloner les senders.
|
|
||||||
- `GetProjectWorkState.agents[].tickets` avec statut dérivé `inProgress/queued`, source `human/agent`, preview bornée.
|
|
||||||
- DTO Tauri camelCase et wiring `AppState` avec le même mailbox partagé en deux ports.
|
|
||||||
|
|
||||||
- `c600604` — `feat(workstate): UI des délégations en file par agent (Lot B frontend)`
|
|
||||||
- Types TS `AgentTicketState`, `TicketWorkStatus`, `TicketWorkSource`.
|
|
||||||
- Mock gateway normalise `tickets: []`.
|
|
||||||
- Panneau Work affiche les tickets FIFO, source Human/Agent, preview, ticket court.
|
|
||||||
- Refresh ajouté sur `delegationReady`.
|
|
||||||
|
|
||||||
- `5cb99fd` — `chore(wip): état runtime .ideai (flux conversation live, layouts)`
|
|
||||||
- Runtime isolé des commits feature.
|
|
||||||
|
|
||||||
- `64c2c14` — merge local dans `develop`.
|
|
||||||
|
|
||||||
## QA verte
|
|
||||||
|
|
||||||
Commandes QA réelles validées:
|
|
||||||
- `cargo fmt --all -- --check` OK.
|
|
||||||
- `cargo test -p infrastructure mailbox --lib` OK, 13 passed.
|
|
||||||
- `cargo test -p application --test workstate` OK, 12 passed.
|
|
||||||
- `cargo test -p app-tauri --test dto_agents` OK, 20 passed.
|
|
||||||
- `cargo check -p app-tauri` OK.
|
|
||||||
- `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` OK, 2 files / 17 tests.
|
|
||||||
- `cd frontend && npx tsc --noEmit` OK.
|
|
||||||
- QA ajoutée: `cargo test -p domain mailbox --lib` OK, 6 passed.
|
|
||||||
|
|
||||||
Warnings observés uniquement côté Vite sur options `esbuild` dépréciées/ignorées au profit de `oxc`, non bloquants.
|
|
||||||
|
|
||||||
## Décisions produit/techniques
|
|
||||||
|
|
||||||
- Les tickets `human` et `agent` sont inclus dans le snapshot; l'UI distingue explicitement `Human` vs agent/requester au lieu de tout appeler délégation agent.
|
|
||||||
- Le statut est dérivé à la lecture: `inProgress` si le ticket courant correspond au `busy_state`, sinon `queued`.
|
|
||||||
- Pas de nouvelle persistance, pas de lecture `log.jsonl`/handoff, pas d'événement `agentQueueChanged`, pas d'action UX d'annulation/résolution.
|
|
||||||
|
|
||||||
## Suite probable
|
|
||||||
|
|
||||||
Le prochain lot logique du chantier UX conversations/délégations est Lot C: résumés de conversations depuis log/handoff en lecture best-effort, ou Lot D actions UX selon priorité produit. Suivre le cycle Main: Architect -> Git -> DevBackend/DevFrontend -> QA -> Git.
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
name: f35-launch-status-done-config-crud-blocked
|
|
||||||
description: F35.1 UI statut de lancement du serveur local livrée+verte ; F35.2 config CRUD bloquée sur un DTO figé qui ne matche pas le wire réel + delete manquant.
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
Ticket #35 sur `feature/modeles-locaux`.
|
|
||||||
|
|
||||||
**F35.1 LIVRÉ (vert)** : événements `model_server_status_changed`/`agent_launch_failed` déjà exposés via `domain://event`. Consommés dans `useAgents` → `modelServerStatusByServer` (par serverId) + `launchFailureByAgent` (par agentId). Badge `ModelServerLaunchBadge` monté par ligne dans `AgentsPanel`, corrélé via `profile.opencode.localModelServerId`. Contrat réel ≠ DTO figé du ticket : `serverId` sur l'enveloppe (pas par état) ; états camelCase `notConfigured|probing|starting|ready{reused}|failed{code,message}` ; PAS de `baseURL`/`model` émis dans le statut. Je me suis aligné sur le wire réel.
|
|
||||||
|
|
||||||
**F35.2 BLOQUÉ — 3 gaps backend remontés à Main :**
|
|
||||||
1. (bloquant) `save_model_server`/`list_model_servers` transmettent le domaine `LocalModelServerConfig` en `serde(transparent)`, forme IMBRIQUÉE : `{id, kind:"llamaCpp", name, endpoint:{baseURL,port}, model:{id,label,path?,servedName}, binary?, args, autoStart, stopPolicy}`. Le DTO figé du ticket est plat et FAUX (kind "llamacpp", baseURL/port/modelPath/servedModelName/binaryPath à plat). Pire : `model` exige `id`+`label` non-vides (LocalModelRef::new) absents du DTO figé → payload figé rejeté. Besoin arbitrage Architect : (A) couche DTO plate app-tauri qui remplit model.id/label, ou (B) MAJ du DTO figé vers la forme imbriquée + sémantique de model.id/label.
|
|
||||||
2. Pas de commande `delete_model_server`.
|
|
||||||
3. (côté moi) créer `ModelServerGateway`/port/adapter une fois le contrat tranché.
|
|
||||||
|
|
||||||
Saisie simple de `localModelServerId` (F36) laissée en place, pas de régression. tsc propre ; suite 593/593.
|
|
||||||
14
.ideai/memory/frontend-uses-npm-not-pnpm.md
Normal file
14
.ideai/memory/frontend-uses-npm-not-pnpm.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
name: frontend-uses-npm-not-pnpm
|
||||||
|
description: memory note frontend-uses-npm-not-pnpm
|
||||||
|
metadata:
|
||||||
|
type: project
|
||||||
|
---
|
||||||
|
Le dossier `frontend/` s'installe et se build avec **npm**, jamais pnpm (lockfile `package-lock.json`).
|
||||||
|
|
||||||
|
**Ne jamais lancer `pnpm` (ni `corepack pnpm build`, ni le wrapper `pnpm --dir frontend build`) dans `frontend/`** :
|
||||||
|
- `pnpm --dir frontend build` échoue d'abord sur un pré-check `pnpm install` (`ERR_PNPM_IGNORED_BUILDS` sur esbuild).
|
||||||
|
- Surtout, `pnpm install` **clobber** le `node_modules` npm : pnpm aplatit `vite@5.4.21` au top-level alors que `vitest@4.1.x` exige `vite ^6||^7||^8`. Résultat : `ERR_PACKAGE_PATH_NOT_EXPORTED: './module-runner'` dès que vitest spawn son worker pool (>3 fichiers de test). Avec npm, `vite@8` est imbriqué sous `node_modules/vitest/node_modules/vite`, donc tout marche.
|
||||||
|
- Réparation si le clobber arrive : `rm -f frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml && cd frontend && npm install`, puis `git checkout -- frontend/package-lock.json`.
|
||||||
|
|
||||||
|
Commandes correctes sans le wrapper cassé : `cd frontend && npx tsc --noEmit && npx vite build` (build) et `npx vitest run` (tests). Le script `pnpm build` du package.json ne doit pas être utilisé tel quel dans cet environnement.
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
name: idea-distribution-strategy-desktop-vs-docker
|
||||||
|
description: memory note idea-distribution-strategy-desktop-vs-docker
|
||||||
|
metadata:
|
||||||
|
type: project
|
||||||
|
---
|
||||||
|
Stratégie de distribution IdeA validée utilisateur (2026-07-16, suite #13) : DEUX offres au-dessus du MÊME cœur backend (pas de fork métier).
|
||||||
|
|
||||||
|
**Offre 1 — Full desktop** : binaire Tauri `app-tauri` actuel. AppImage Linux (existe, inchangée). Windows explicitement REPORTÉ (garder la portabilité à l'esprit, ne rien introduire de non-portable ; PTY = ConPTY à retester le jour venu). L'AppImage reste desktop PUR — elle ne bundle pas les assets web.
|
||||||
|
|
||||||
|
**Offre 2 — Serveur/client** : image Docker, bâtie sur un binaire serveur HEADLESS `idea-serve` SANS dépendance Tauri/WebKit (pas de dockerisation du binaire Tauri qui traînerait GTK/WebKit pour rien). Cadré faisable en hexagonal par Architect.
|
||||||
|
|
||||||
|
**Point pivot technique** : `server.rs` vit dans `crates/app-tauri` et réutilise indirectement la présentation Tauri via `crate::state::AppState`, `crate::dto::*`, `crate::events::DomainEventDto`, `crate::pty::PtyChunk`, `crate::mcp_endpoint::*`, `ResumeContext`. Le protocole HTTP/WS lui est déjà autonome. Le vrai travail = découpler les DTO (→ crate partagé `presentation-dto`/`backend-api`) puis extraire `crates/web-server` (sur `BackendCore`, pas `AppState`) puis le bin `idea-serve`.
|
||||||
|
|
||||||
|
**Tickets** : #65 (headless, high, L1 DTO→L2 web-server→L3 idea-serve), #66 (Docker, medium, L4 build web http→L5 Dockerfile volumes /data+/workspace→L6 agents CLI conteneur), #64 (folder browser web, dependsOn #66 pour /workspace), #67 (lock inter-process app-data-dir, low).
|
||||||
|
|
||||||
|
**Topologie de branches (décision utilisateur)** : chantier packaging sur `feature/server-client-packaging` (créée depuis `c246875`, tête de `feature/ticket13-pty-websocket`). PAS de merge dans develop tant que l'utilisateur n'a pas validé lui-même la NON-RÉGRESSION desktop-only. Flux final : `feature/server-client-packaging` → `feature/ticket13-pty-websocket` → `develop`. Git rebase la branche packaging si #13 avance.
|
||||||
|
|
||||||
|
Invariants : desktop AppImage ne perd RIEN ; aucun import Tauri dans le bin headless ; même cœur/use cases/stores ; contrat HTTP/WS inchangé sauf lot versionné. Voir [[frontend-uses-npm-not-pnpm]], [[appimage-build-no-strip-relr-dyn-fix]].
|
||||||
@ -1,47 +0,0 @@
|
|||||||
---
|
|
||||||
name: mcp-e2e-findings-reply-wedge-phantom-busy
|
|
||||||
description: memory note mcp-e2e-findings-reply-wedge-phantom-busy
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
name: mcp-e2e-findings-reply-wedge-phantom-busy
|
|
||||||
description: Findings validation MCP e2e live (AppImage 0.3.0) — transport/rendez-vous SAINS ; un seul vrai défaut = wedge si l'agent délégué n'appelle pas idea_reply (pas de timeout serveur).
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Findings validation MCP e2e (live, AppImage 0.3.0) — 2026-06-22
|
|
||||||
|
|
||||||
Contexte : validation réelle du parcours inter-agents (cf. [[resume-after-appimage-rebuild-mcp-e2e]]). Méthode = Main observe en externe (Bash sur `ss -xp` + transcripts `~/.claude/projects/<run-dir-encodé>/*.jsonl`), l'utilisateur déclenche dans l'UI ; on ne valide PAS via `idea_ask_agent`.
|
|
||||||
|
|
||||||
## Scénario 1 — délégation vers agent FROID + cycle complet : VERDICT
|
|
||||||
- ✅ **Réveil à froid** : déléguer vers un agent arrêté relance son pont (`mcp-server --requester <id>` réapparaît, socket ESTAB recompte).
|
|
||||||
- ✅ **1er tour non perdu** : tâche livrée intacte = 1er `user` `[IdeA · tâche de <agent> · ticket <uuid>] …`.
|
|
||||||
- ✅ **Chemin positif `idea_reply`** : quand l'agent cible appelle `idea_reply(ticket,result)`, le bridge répond `reply ... delivered`, le **demandeur reçoit le `tool_result` et reprend la main** (vérifié : DevBackend reçoit `pong` puis continue).
|
|
||||||
- ✅ **Purge live-state** : dès l'`idea_reply`, `idea_workstate` repasse le cible de `working` → `done`, intent vidé.
|
|
||||||
|
|
||||||
➡️ **Transport + protocole de rendez-vous = SAINS.** Bugs historiques 3/4/5 OK sur ce chemin.
|
|
||||||
|
|
||||||
## LE défaut restant (racine unique) — wedge sans `idea_reply`
|
|
||||||
Si l'agent délégué **termine son tour sans appeler `idea_reply`** (ex. tâche triviale « réponds pong » → il répond `pong` en **prose** et s'arrête) :
|
|
||||||
- le **demandeur wedge indéfiniment** dans `idea_ask_agent` (transcript demandeur figé sur le `tool_use` idea_ask_agent, aucun `tool_result`) ;
|
|
||||||
- la **cible reste `working`** sur le ticket périmé dans la live-state ;
|
|
||||||
- **aucun timeout ni récupération** côté serveur. Une interruption utilisateur du `ask` libère le demandeur mais **ne purge pas** le `working` de la cible (purge seulement à l'`idea_reply`).
|
|
||||||
|
|
||||||
➡️ Le « Busy fantôme » n'est PAS un bug d'état indépendant : c'est la **conséquence** de l'absence d'`idea_reply`. Une seule cause à traiter.
|
|
||||||
|
|
||||||
### Pistes correctif (à arbitrer Architect)
|
|
||||||
1. **Durcir contextes agents** : « toute tâche déléguée se termine IMPÉRATIVEMENT par `idea_reply`, même triviale » (cheap, attaque la cause comportementale).
|
|
||||||
2. **Garde-fou serveur (rendez-vous)** : timeout sur l'attente `idea_ask_agent` → renvoyer au demandeur un résultat d'échec/relance explicite + purger le `working` de la cible (idempotent). Touche le contrat rendez-vous + cycle de vie live-state = domaine Architect. Voir [[idea-program-surface-separation-and-livestate]], [[mcp-bridge-and-delegation-runtime-notes]].
|
|
||||||
|
|
||||||
## Diagnostic / repro (rappels)
|
|
||||||
- Ponts : `pgrep -af 'mcp-server --endpoint'` (1 requester = 2 process) ; `ss -xp | grep -c idea-mcp`.
|
|
||||||
- Reply réel = `tool_use` `idea_reply` dans le transcript cible → tool_result `reply ... delivered` (⚠️ ne pas confondre avec les mentions `idea_reply` du CLAUDE.md injecté via attachments).
|
|
||||||
- Wedge demandeur = transcript demandeur s'arrête sur `tool_use` `idea_ask_agent` sans `tool_result`.
|
|
||||||
- ⚠️ Horodatages transcripts = **UTC** ; `ls %H:%M:%S` masque la date → comparer avec `date` + mtime réel (`ls -t`).
|
|
||||||
|
|
||||||
## Restant à tester (scénarios e2e suivants)
|
|
||||||
- Délégation vers agent BACKGROUND (node_id None) — même protocole, vérifier pas de 1er tour perdu.
|
|
||||||
- `ask` sans réponse ne wedge pas durablement la CONNEXION du demandeur (vs juste l'appel) — Bug 5 côté transport.
|
|
||||||
- Profils Claude/Codex utilisent MCP par défaut ; fallback fichier+prose cohérent.
|
|
||||||
- Observabilité UI des délégations/replies (aujourd'hui opaque) — sujet UX.
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
---
|
|
||||||
name: mcp-functional-test-plan-2026-06-24
|
|
||||||
description: memory note mcp-functional-test-plan-2026-06-24
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
name: mcp-functional-test-plan-2026-06-24
|
|
||||||
description: Plan de test FONCTIONNEL du rendez-vous inter-agents MCP (trivial→tordu), à exécuter après rebuild develop HEAD ; méthode, ordre, setup IdeA et critères de réussite.
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Plan de test fonctionnel MCP inter-agents (2026-06-24, run a6ced819)
|
|
||||||
|
|
||||||
Objectif : état des lieux par tests **fonctionnels** (pas unitaires) du rendez-vous `idea_ask_agent` ⇄ `idea_reply`, du trivial au plus tordu. On lance dans l'ordre, on **s'arrête au 1er blocage**, on corrige (cycle Architect→Git→Dev→QA), rebuild+relance, puis on **reprend de T1**. Contexte/historique : [[mcp-e2e-findings-reply-wedge-phantom-busy]], [[backstop-fires-on-intra-task-turn-rootcause]], [[rendezvous-no-reply-backstop-design]], [[rendezvous-600s-cap-too-short-heavy-tasks]], [[reconcile-live-state-implemented-feature-branch]].
|
|
||||||
|
|
||||||
## Contexte binaire au moment du plan
|
|
||||||
- AppImage qui tournait = build **23/06 19:42**, PÉRIMÉ (antérieur à `c6f0f86` encode_cwd, `744de20` backstop no-reply, `886bb0d`/`1efe2f1` reconcile). Décision utilisateur : **rebuild develop HEAD `1efe2f1` puis relance** avant de tester.
|
|
||||||
- Règle structurelle : **binaire qui tourne = AppImage**. Tout fix backend ⇒ rebuild + relance d'IdeA (tue Main). Les tests s'enchaînent SANS relance *à l'intérieur d'une même version* ; chaque cycle de fix = 1 relance.
|
|
||||||
|
|
||||||
## Méthode
|
|
||||||
- **Main est le demandeur** (`idea_ask_agent`) = test fidèle de « si je donne un message à un agent, il me répond ».
|
|
||||||
- Doublé d'**observation externe Bash** : ponts `ss -xp | grep idea-mcp` et `pgrep -af mcp-server` ; transcripts `~/.claude/projects/<run-dir-encodé>/*.jsonl` (horodatages **UTC** ; reply réel = `tool_use` idea_reply→tool_result `reply … delivered` ; wedge demandeur = transcript figé sur `tool_use` idea_ask_agent sans tool_result) ; live-state via `idea_workstate_read`.
|
|
||||||
- Risque résiduel : un wedge non borné fige le tour de Main → l'utilisateur peut interrompre.
|
|
||||||
|
|
||||||
## Setup IdeA à mettre en place avant T1 (consigne utilisateur)
|
|
||||||
1. Relancer IdeA, ouvrir le projet IdeA, **Main visible** (le demandeur).
|
|
||||||
2. Garder **2–3 cellules libres visibles** pour qu'on observe à l'œil les délégations (Main y placera des cibles visibles, ou lance-toi QA + DevFrontend dans des cellules visibles).
|
|
||||||
3. **Laisser Architect, DevBackend, Git ARRÊTÉS (froids)** : T3 testera le réveil à froid ; T9 utilisera Architect+DevBackend froids.
|
|
||||||
4. Cibles chaudes pour T1/T2 : Main les réchauffe lui-même (launch) — pas d'action requise.
|
|
||||||
|
|
||||||
## Ordre des tests (trivial → tordu)
|
|
||||||
- **T1 — Visibilité outils MCP.** Un agent lancé par IdeA voit ses outils sans action manuelle. Vérif : pont ESTAB (`ss`) + 2 process mcp-server par requester.
|
|
||||||
- **T2 — Cible CHAUDE + idea_reply trivial.** Main→ask(agent chaud, « réponds pong via idea_reply »). Attendu : réponse inline `pong`, temps borné, workstate working→done purgé.
|
|
||||||
- **T3 — Réveil à FROID + idea_reply.** Cible arrêtée. Attendu : pont relancé (nouveau mcp-server), **1er tour non perdu** (1er user `[IdeA · tâche…]` intact), reply remonte.
|
|
||||||
- **T4 — Cible BACKGROUND (node_id None).** Délégation vers agent sans cellule visible. Attendu : même protocole, pas de 1er tour perdu (historiquement non testé).
|
|
||||||
- **T5 — NO-REPLY (cible répond en prose, pas d'idea_reply).** Attendu backstop : demandeur libéré en temps borné avec `TargetReturnedNoReply` (retryable), **pas de Busy fantôme** (workstate purgé). DÉFAUT historique #1.
|
|
||||||
- **T6 — Délégation MULTI-ÉTAPES puis idea_reply.** Cible lit plusieurs fichiers / lance une cmd PUIS idea_reply. Attendu : **pas de libération prématurée** pendant le travail, rapport final livré. PIÈGE turn-watcher (cause racine : backstop tirait au 1er tour interne ~3 s).
|
|
||||||
- **T7 — Tâche LOURDE > plafond** (impl + `cargo test`/clippy). Attendu : extension sur signe de vie OU message clair « cible active, plafond atteint » (≠ faux `-32001`) ; idea_reply tardif non perdu. Plafond `IDEA_ASK_RENDEZVOUS_TIMEOUT_MS` (défaut 600000).
|
|
||||||
- **T8 — Délégations PARALLÈLES** (2 cibles en 1 tour Main). Attendu : rendez-vous multiples simultanés OK, multiplexage pont, 2 réponses distinctes.
|
|
||||||
- **T9 — TRANSITIVE A→B→C** (Main→Architect, Architect délègue à DevBackend puis reply à Main). Attendu : rendez-vous imbriqués, 2 attentes simultanées sans deadlock. Cas le plus tordu.
|
|
||||||
- **T10 — INTERRUPTION/annulation + reconcile reboot.** (a) Main interrompt un ask en vol → `working` cible purgé, pas de cascade, idea_reply tardif non-livrable proprement. (b) Au reboot, orphelins status∈{working,waiting,blocked} & session morte → `idle` + marker `STALE_AT_RESTART_MARKER` (use case ReconcileLiveState, cf. [[reconcile-live-state-implemented-feature-branch]]).
|
|
||||||
|
|
||||||
## Critère de fin
|
|
||||||
Tous les T1→T10 verts avec preuve réelle (réponse inline + observation externe cohérente). Sinon : 1er rouge = blocage à corriger, puis reprise de T1.
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
name: mcp-functional-tests-t1-t9-green-live-2026-06-24
|
|
||||||
description: memory note mcp-functional-tests-t1-t9-green-live-2026-06-24
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
title: MCP tests fonctionnels T1→T9 VERTS en live (2026-06-24, AppImage 12:53 HEAD 1efe2f1 + fix T7 non committé)
|
|
||||||
type: project
|
|
||||||
description: Passe complète T1→T9 verte en conditions réelles sur AppImage du 24/06 12:53 ; T5 (backstop no-reply) et T7 (watchdog inactivité >600s) validés live ; reste T10 (interruption + reconcile reboot) qui exige action utilisateur.
|
|
||||||
---
|
|
||||||
# Tests fonctionnels MCP rendez-vous — T1→T9 VERTS live (2026-06-24)
|
|
||||||
|
|
||||||
Run a6ced819, plan [[mcp-functional-test-plan-2026-06-24]]. AppImage **rebuild 12:53 depuis l'arbre de travail** (HEAD `1efe2f1` + le fix T7 watchdog **non committé** mais présent dans les 11 fichiers modifiés du git status → embarqué dans le binaire). Méthode : Main demandeur + observation externe (ss/pgrep/transcripts UTC/workstate).
|
|
||||||
|
|
||||||
## Résultats (preuve réelle)
|
|
||||||
- **T1 visibilité MCP** ✅ : agents chauds = pont ESTAB + 2 mcp-server (app-tauri parent + AppImage) chacun.
|
|
||||||
- **T2 cible chaude + reply trivial** ✅ : DevFrontend → `pong` inline, reply delivered 10:56:51 UTC, workstate done (pas de Busy fantôme).
|
|
||||||
- **T3 réveil à FROID** ✅ : Git froid → `pong-cold` ; nouveau pont spawné, **1er tour `[IdeA·tâche]` intact** (régresseur encode_cwd résolu), reply delivered 10:57:34.
|
|
||||||
- **T4 cible BACKGROUND (node_id None)** ✅ : Git background → `pong-bg`, reply delivered 10:58:14.
|
|
||||||
- **T5 NO-REPLY backstop** ✅ (défaut historique #1 résolu) : cible répond en prose sans idea_reply → demandeur libéré en ~20 s avec erreur retryable « returned to its prompt without calling idea_reply », workstate cible done (PAS de Busy fantôme).
|
|
||||||
- **T6 multi-étapes** ✅ (piège turn-watcher résolu) : DevFrontend lit fichiers + git log PUIS idea_reply ; pas de libération prématurée ; données réelles (142 fichiers, hashes corrects).
|
|
||||||
- **T7 tâche LOURDE >600s** ✅ (défaut historique #2 résolu, validation live du fix watchdog) : QA charge réelle continue 11:00:46→11:12:44 UTC = **~11m58s**, cargo clean+build release+test (1632 passed/0)+clippy+9 relances ; rendez-vous **NON expiré à 600s**, idea_reply accepté au-delà du plafond (aucun « no pending request »), reply delivered 11:13:21.
|
|
||||||
- **T8 PARALLÈLE** ✅ : 2 asks même tour (DevFrontend `alpha-8` + Git `beta-8`), réponses distinctes, multiplexage pont OK.
|
|
||||||
- **T9 TRANSITIF A→B→C** ✅ : Main→Architect→DevBackend (les 2 froids) → `relay:gamma-9:done` ; rendez-vous imbriqués + double réveil à froid sans deadlock ; DevBackend reply delivered 11:14:32.
|
|
||||||
|
|
||||||
## Reste : T10 (exige action utilisateur)
|
|
||||||
- **T10a interruption** : Main interrompt un ask en vol → attendu : workstate cible purgé, pas de cascade, idea_reply tardif proprement non-livrable. NÉCESSITE que l'utilisateur appuie sur interrupt pendant un ask wedgé.
|
|
||||||
- **T10b reconcile reboot** : orphelin status∈{working,waiting,blocked} + session morte → au reboot, use case ReconcileLiveState le passe à idle + `STALE_AT_RESTART_MARKER` (cf. [[reconcile-live-state-implemented-feature-branch]]). NÉCESSITE un reboot d'IdeA (ferme Main).
|
|
||||||
|
|
||||||
## Suite recommandée
|
|
||||||
1. Faire committer le fix T7 par Git (encore non committé, cf. [[git-owns-commit-merge-decisions]] + [[rendezvous-600s-cap-too-short-heavy-tasks]]).
|
|
||||||
2. Exécuter T10 avec l'utilisateur (interrupt + reboot).
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
---
|
|
||||||
name: mcp-t10a-harness-interrupt-does-not-cancel-rendezvous
|
|
||||||
description: memory note mcp-t10a-harness-interrupt-does-not-cancel-rendezvous
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
title: T10a — l'interrupt harness du demandeur n'annule PAS le rendez-vous backend (reply tardif accepté dans le vide)
|
|
||||||
type: reference
|
|
||||||
description: Finding T10a (2026-06-24) — interrompre Main (demandeur) au niveau Claude Code ne propage aucune annulation à IdeA ; la cible finit, son idea_reply est « delivered » dans un demandeur abandonné, et la live-state du demandeur reste working.
|
|
||||||
---
|
|
||||||
# Finding T10a (2026-06-24, run a6ced819)
|
|
||||||
|
|
||||||
## Setup
|
|
||||||
Main → `idea_ask_agent(DevFrontend, "travaille ~90s puis idea_reply late-10a")`. Pendant l'attente, l'utilisateur **interrompt Main** (Échap harness Claude Code). Le tool use `idea_ask_agent` est rejeté côté harness.
|
|
||||||
|
|
||||||
## Observé
|
|
||||||
- DevFrontend a fini ses ~95 s de travail réel (11:20:39→11:22:14 UTC) puis `idea_reply("late-10a")` → **ACCEPTÉ « delivered »** à 11:22:18 (PAS « no pending request »).
|
|
||||||
- DevFrontend workstate = **done** (pas d'orphelin côté cible). Pas de cascade.
|
|
||||||
- **Main (demandeur) workstate resté `working`** : l'interrupt a coupé le tour de Main avant son nettoyage ; le chemin interrupt ne réconcilie pas la live-state du demandeur.
|
|
||||||
|
|
||||||
## Interprétation
|
|
||||||
L'interrupt Claude Code annule le **tool call local** mais le **process Main survit** → la socket MCP (mcp-server du demandeur) reste connectée → IdeA ne reçoit aucun signal d'annulation → le rendez-vous reste pending → le reply tardif de la cible est livré dans un demandeur qui a déjà abandonné (perdu pour Main mais rapporté « delivered »).
|
|
||||||
|
|
||||||
## Conséquence
|
|
||||||
- Le T10a du plan (« annulation en vol → reply tardif non-livrable proprement ») **n'est pas exerçable via interrupt harness** tant que le process demandeur survit. Une vraie annulation exigerait : tuer le process demandeur (drop socket) OU un cancel protocolaire JSON-RPC.
|
|
||||||
- Comportement néanmoins bénin : pas de wedge, pas de cascade, cible réconciliée (done). Seuls écarts : (a) reply tardif « delivered » au lieu de rejeté ; (b) live-state du demandeur laissée working par le chemin interrupt (mais reconcile-au-reboot la rattraperait, cf. [[reconcile-live-state-implemented-feature-branch]]).
|
|
||||||
|
|
||||||
Lié à [[mcp-functional-tests-t1-t9-green-live-2026-06-24]], [[mcp-functional-test-plan-2026-06-24]].
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
---
|
|
||||||
name: mcp-t10b-pending-reboot-verification
|
|
||||||
description: memory note mcp-t10b-pending-reboot-verification
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
title: T10b PASS — reconcile au reboot vérifié, inclut l'orchestrateur (2026-06-24)
|
|
||||||
type: project
|
|
||||||
description: T10b validé live après reboot. ReconcileLiveState ramène l'orphelin Main working→idle en conservant l'intent et purgeant ticket/lastDelegation. Couvre l'orchestrateur. Reste : faire committer par Git les fix non committés (T7 watchdog + reconcile).
|
|
||||||
---
|
|
||||||
# T10b — PASS (reboot reconcile vérifié)
|
|
||||||
|
|
||||||
## Verdict
|
|
||||||
Orphelin armé = Main `working` intent "T10b-ORPHAN-MAIN". Après reboot (run a6ced819), `idea_workstate_read` montre Main :
|
|
||||||
- `status: idle` ✅ (était working)
|
|
||||||
- `intent` conservé ✅
|
|
||||||
- `ticket` purgé ✅ / `lastDelegation` purgé ✅
|
|
||||||
|
|
||||||
Signature `STALE_AT_RESTART_MARKER` complète. **ReconcileLiveState valide ET inclut l'orchestrateur** (Main n'a PAS été exclu malgré la crainte du design open_project). Champ `progress` non exposé par workstate_read mais transition working→idle+intent retenu = concluante.
|
|
||||||
|
|
||||||
## Suite du plan
|
|
||||||
T1→T10 du plan [[mcp-functional-test-plan-2026-06-24]] terminés (T1→T9 verts cf. [[mcp-functional-tests-t1-t9-green-live-2026-06-24]], T10a finding [[mcp-t10a-harness-interrupt-does-not-cancel-rendezvous]], T10b PASS ici).
|
|
||||||
**RESTE : faire committer par Git les fix non committés (T7 backstop/watchdog + reconcile live-state).** cf. [[git-owns-commit-merge-decisions]].
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
---
|
|
||||||
name: mcp-t7-backstop-600s-reply-rejected-livestate-stale
|
|
||||||
description: memory note mcp-t7-backstop-600s-reply-rejected-livestate-stale
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
title: MCP T7b/T7e — backstop 600s rejette le reply tardif et laisse le live-state worker non réconcilié
|
|
||||||
type: reference
|
|
||||||
description: Finding fonctionnel des tests MCP T7b/T7e (2026-06-24) — un idea_reply après dépassement de la fenêtre 600s est refusé « no pending request », et le ticket du worker reste working dans le live-state.
|
|
||||||
---
|
|
||||||
|
|
||||||
# Finding — tests MCP T7 (2026-06-24, QA)
|
|
||||||
|
|
||||||
## Contexte
|
|
||||||
Série de tests du rendez-vous `idea_ask_agent ⇄ idea_reply` et du backstop no-reply (cap ~600s), demandés par Main :
|
|
||||||
- **T7d** (debug build x3, avant-plan) : cumul ~3m49s < 600s → reply OK.
|
|
||||||
- **T7b** (9 étapes `sleep 82`, entrelacées) : le harness BLOQUE tout `sleep` avant-plan → exécutées en run_in_background ; reply OK (tardif mais < fenêtre côté ticket T7b).
|
|
||||||
- **T7e** (release build répété, avant-plan, sans sleep ni bg) : 7 cycles, cumul réel **08:01:14 → 08:14:21 = 13 min 07 s**, franchit largement 600s.
|
|
||||||
|
|
||||||
## Défaut observé
|
|
||||||
À la fin de T7e (et de T7b, terminé au même tour, après >600s d'occupation continue), les DEUX `idea_reply` (tickets `4613262f…` T7b et `d2398b22…` T7e) sont refusés :
|
|
||||||
|
|
||||||
```
|
|
||||||
invalid input: no pending request to reply to for agent aefdbd61-…
|
|
||||||
```
|
|
||||||
|
|
||||||
→ Le backstop a libéré le **demandeur** (Main) côté rendez-vous après dépassement du cap, ce qui est le comportement voulu. MAIS :
|
|
||||||
1. Le **résultat réel** (builds OK, horodatages non falsifiés) ne peut **plus être délivré** : il est perdu pour le demandeur.
|
|
||||||
2. `idea_workstate_read` montre encore le worker QA `status=working ticket=d2398b22…` **après** le rejet du reply → le live-state du **worker** n'est PAS réconcilié quand le backstop ferme le rendez-vous côté demandeur. Incohérence demandeur (libéré) vs worker (toujours working).
|
|
||||||
|
|
||||||
## Conséquence / piste
|
|
||||||
- Le cap 600s du rendez-vous reste trop court pour des tâches lourdes légitimes (cf. [[rendezvous-600s-cap-too-short-heavy-tasks]]) : ici un travail réel et honnête >13 min est « jeté ».
|
|
||||||
- À corriger : quand le backstop ferme un rendez-vous, soit (a) accepter encore un reply tardif (le router vers le demandeur même après timeout / le persister), soit (b) réconcilier le live-state du worker (passer son ticket à done/abandon) pour ne pas laisser un `working` fantôme. Voir [[backstop-fires-on-intra-task-turn-rootcause]] et [[rendezvous-no-reply-backstop-design]].
|
|
||||||
|
|
||||||
## Reproductible
|
|
||||||
Charge avant-plan réelle (`cargo build --release --workspace` en boucle clean) dépassant 600s, puis tenter `idea_reply` sur le ticket d'origine → rejet systématique.
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
---
|
|
||||||
name: reconcile-live-state-implemented-feature-branch
|
|
||||||
description: memory note reconcile-live-state-implemented-feature-branch
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
title: Réconciliation du live-state au reboot — implémentée (feature/reconcile-live-state)
|
|
||||||
type: project
|
|
||||||
description: Le chantier ReconcileLiveState (3 lots) est implémenté et vert (1623 tests), non committé ; détail des fichiers et de l'arbitrage project_id/provider.
|
|
||||||
---
|
|
||||||
|
|
||||||
Implémenté le 2026-06-23 sur `feature/reconcile-live-state` (ticket Main a7fcb5e4, dont le rendez-vous `idea_reply` a expiré pendant le build — résultat consigné ici). **Non committé** (Git tranche). Cadrage : [[live-state-reboot-reconciliation-design]].
|
|
||||||
|
|
||||||
**Résultats réels** : `cargo test --workspace` = **1623 passed, 0 failed**. `cargo clippy --workspace --all-targets` = 0 erreur, aucun warning sur le code ajouté (warnings restants tous pré-existants).
|
|
||||||
|
|
||||||
**Lot 1 (domaine, `crates/domain/src/live_state.rs`)** : `LiveState::reconcile_orphans(is_live, now_ms) -> Vec<LiveEntry>` pure (ne mute pas self). Orphelin = status ∈ {Working,Waiting,Blocked} ET !is_live → réécrit status=Idle, intent gardé, ticket=None, last_delegation=None, progress=Some(`STALE_AT_RESTART_MARKER`), updated_at_ms=now. Const pub `STALE_AT_RESTART_MARKER = "(stale — session not running at restart)"`. +4 tests.
|
|
||||||
|
|
||||||
**Lot 2 (application, nouveau `crates/application/src/workstate/reconcile.rs`)** : use case `ReconcileLiveState` sur `LiveStateStore`+`LiveAgentRegistry`(ISP)+`Clock` ; `execute(ReconcileLiveStateInput{project_id})` charge → reconcile_orphans → upsert par ligne. +3 tests. Exporté via workstate/mod.rs + application/lib.rs.
|
|
||||||
|
|
||||||
**Lot 3 (app-tauri, `state.rs`+`commands.rs`)** : provider par-root `AppReconcileLiveState` (résout root via `ProjectStore::load_project`, `FsLiveStateStore::new(&root)`, registre = `LiveSessions` existant). Champ `reconcile_live_state` sur AppState. Hook best-effort dans `open_project` après `reconcile_layouts`. **Acte système** : écrit le port `LiveStateStore` directement, jamais via `OrchestratorCommand::SetWorkState` → self-only de `idea_workstate_set` préservé par construction.
|
|
||||||
|
|
||||||
**Arbitrage à valider QA/Architect** : la résolution project_id→root se fait au composition root (le store est root-bound), donc `ReconcileLiveState::execute` reçoit bien `ReconcileLiveStateInput{project_id}` (conforme Lot 2 + hook Lot 3 à la lettre) mais ne relit pas project_id dans le flux pur (`_input`). Variante sans ce param redondant = ajustement trivial si souhaité.
|
|
||||||
|
|
||||||
**Fichiers (6)** : domain/src/live_state.rs ; application/src/workstate/reconcile.rs (nouveau) ; application/src/workstate/mod.rs ; application/src/lib.rs ; app-tauri/src/state.rs ; app-tauri/src/commands.rs.
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
name: resume-after-appimage-rebuild-mcp-e2e
|
|
||||||
description: memory note resume-after-appimage-rebuild-mcp-e2e
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
---
|
|
||||||
name: resume-after-appimage-rebuild-mcp-e2e
|
|
||||||
description: Point de reprise — programme live-state CLOS+RELEASÉ (0.3.0), discordance .gitignore D19-4 TRANCHÉE. Prochain chantier = validation MCP e2e UX. Chantiers restants priorisés.
|
|
||||||
metadata:
|
|
||||||
type: project
|
|
||||||
---
|
|
||||||
# Reprise — état au 2026-06-22 (run a6ced819)
|
|
||||||
|
|
||||||
## Où on en est
|
|
||||||
- **Programme live-state / persistance CLOS et RELEASÉ** : `develop` @ `36be0cb` (LS8), `main` @ `29232dd` = `release(0.3.0): intègre develop dans main`. Détail : [[live-state-persistence-program-closed-ls8]]. Doc : `docs/LS8-live-state-persistence-closure.md` + `ARCHITECTURE.md` §21.
|
|
||||||
- **AppImage rebuildée + tournante** : `IdeA_0.3.0_amd64.AppImage` (le nom n'est plus 0.1.0). Le binaire live embarque tout le programme ; 6 ponts MCP connectés/ESTAB observés → point 1 du chantier e2e (agent voit ses outils MCP sans action manuelle) déjà satisfait en réel. Recette rebuild (rappel) : `npm --prefix frontend run build` puis depuis `crates/app-tauri/` `APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage` ; remplacer l'AppImage installée → relancer.
|
|
||||||
- **Discordance .gitignore ↔ D19-4 : TRANCHÉE** (par l'utilisateur) et exécutée par Git → commit `47b3806` sur `develop` (`chore(gitignore): désuivre .ideai/conversations/`). Périmètre réel : seul `.ideai/conversations/` était discordant (16 fichiers suivis, 8 handoff.md + 8 log.jsonl) ; `.ideai/run/` et `.ideai/live-state.json` étaient déjà ignorés/propres. Désuivis (rm --cached, conservés sur disque) + règle ajoutée `.gitignore:58`. Plus une décision en attente.
|
|
||||||
|
|
||||||
## Prochain chantier (priorité 1) : VALIDATION MCP END-TO-END UX
|
|
||||||
Objectif = valider/durcir en situation RÉELLE le parcours inter-agents (le code est probablement bon, Bugs 1→7 corrigés cf. [[mcp-bridge-and-delegation-runtime-notes]], mais ces bugs ne sont apparus qu'en live). À vérifier sur l'AppImage 0.3.0 :
|
|
||||||
1. Un agent lancé par IdeA voit ses outils MCP sans action manuelle. (déjà OK observé)
|
|
||||||
2. Délégation vers agent FROID et vers agent BACKGROUND (node_id None) : tâche bien écrite dans le PTY, pas de 1er tour perdu, pas de `Busy` fantôme après interruption/annulation (Bugs 3/4/6/7).
|
|
||||||
3. Un `ask` sans réponse ne wedge pas la connexion du demandeur (Bug 5).
|
|
||||||
4. Profils Claude/Codex utilisent MCP par défaut ; fallback fichier+prose cohérent sinon.
|
|
||||||
5. Observabilité UI des délégations/replies (aujourd'hui opaque) — sujet UX.
|
|
||||||
|
|
||||||
**CONTRAINTE MÉTHODO** : NE PAS réparer/valider le système inter-agents VIA le système inter-agents (`idea_ask_agent`). Piloter via les **subagents natifs (outil Agent)**, et demander à l'utilisateur de faire tourner l'AppImage + observer (Main ne peut pas valider seul depuis l'intérieur). Diag live : `ss -xp | grep idea-mcp` (ponts connectés) ; `~/.claude/projects/<encoded-run-dir>/*.jsonl` (transcript ; pas de nouveau fichier = tâche jamais soumise).
|
|
||||||
|
|
||||||
## Autres chantiers restants (depuis [[remaining-work-idea-agent-control-ide]])
|
|
||||||
- **Auto-update mémoire/contexte EN COURS de session** (aujourd'hui injection au lancement seulement) — priorité 1.
|
|
||||||
- **Multi-fenêtres / déplacement d'onglet** du registre de sessions — priorité 2 (UI).
|
|
||||||
- Optionnels différés : activation réelle du seam LLM de handoff (contrat figé ADR LS5, défaut heuristique) ; sweep périodique de rotation (idempotent, non câblé).
|
|
||||||
|
|
||||||
## Friction outillage notée (par Git, sans incidence résultat)
|
|
||||||
Le `settings.local.json` du run dir a un `deny` qui bloque Edit/Write et certaines redirections Bash pour les agents en run dir isolé ; Git a dû éditer `.gitignore` via `tee -a`. À assouplir si on veut des éditions de fichiers propres côté run dir.
|
|
||||||
|
|
||||||
## Contrainte d'écriture (rappel)
|
|
||||||
Main + agents en run-dir isolé ne peuvent PAS écrire l'arbre du project root (docs/, ARCHITECTURE.md, .ideai/memory/*.md fichiers) — permissions déniées. Mémoire IdeA : outil `idea_memory_write` (create/replace par slug ; pas de delete). Suppression fichiers mémoire / édition MEMORY.md / CLAUDE.md / .gitignore du project root : passer par **Git**.
|
|
||||||
23
.ideai/memory/ticket13-f0-frontend-transport-inventory.md
Normal file
23
.ideai/memory/ticket13-f0-frontend-transport-inventory.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
name: ticket13-f0-frontend-transport-inventory
|
||||||
|
description: Résultat de l'inventaire B0/F0 frontend du chantier client/serveur #13 — la frontière gateways transport-neutres existe déjà, F1 = ajout d'adapters HTTP+WS.
|
||||||
|
metadata:
|
||||||
|
type: reference
|
||||||
|
---
|
||||||
|
Inventaire B0/F0 (ticket #13 server/client mode), côté frontend TS/React. Doc : `docs/ticket13-f0-frontend-transport-inventory.md`.
|
||||||
|
|
||||||
|
**Constat clé** : la frontière « gateways TS transport-neutres » du plan est DÉJÀ réalisée et testée.
|
||||||
|
- `src/ports/index.ts` = 21 gateways sans Tauri ; toute la couche `features/`+`app/` en dépend via DI (`useGateways()`).
|
||||||
|
- `src/adapters/*` = seul lieu important `@tauri-apps/api`.
|
||||||
|
- Garde L1 `src/app/no-direct-invoke.test.ts` casse la CI si un fichier hors `adapters` importe Tauri / appelle `invoke(`.
|
||||||
|
- `src/app/di.tsx` `resolveGateways()` bifurque déjà Tauri vs mock → F1 = ajouter `createHttpWsGateways()` (3ᵉ impl).
|
||||||
|
|
||||||
|
**Donc F1 = écrire un 2ᵉ jeu d'adapters derrière des ports inchangés, aucun composant métier à réécrire.**
|
||||||
|
|
||||||
|
**Flux Channel (→ WebSocket)** : (1) `terminal.ts` PTY, (2) `agent.ts` PTY agent (réutilise `makeTerminalHandle`), (3) `ticket.ts` `sendTicketChat` `Channel<ReplyChunk>`. Tous modélisés côté port par callback `onData`/`onChunk`. Le contrat PTY WS du carnet mappe 1-pour-1 sur `TerminalHandle` (write/resize/detach/close, detach≠close, scrollback au reattach) → port inchangé pour F3. `TerminalView.tsx` ne connaît que le port.
|
||||||
|
|
||||||
|
**Event portable** : `system.onDomainEvent("domain://event")` (bus domaine) → WS serveur→client.
|
||||||
|
|
||||||
|
**Desktop-only à cadrer** : `system.pickFolder` (dossier = machine serveur ≠ client web → file-picker serveur), `window.ts` (WebviewWindow OS) et `focusedProject.ts` (multi-fenêtres OS) probablement hors V1 web. `uiPreferences` (localStorage) marche tel quel.
|
||||||
|
|
||||||
|
Convention DTO à préserver côté adapter HTTP : commandes snake_case, payloads camelCase souvent enveloppés `{ request: {...} }`.
|
||||||
17
.ideai/memory/ticket13-f1-http-ws-adapter-delivered.md
Normal file
17
.ideai/memory/ticket13-f1-http-ws-adapter-delivered.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
name: ticket13-f1-http-ws-adapter-delivered
|
||||||
|
description: Le 3e jeu d'adapters frontend (HTTP request/response + squelette WebSocket) du chantier client/serveur #13 est livré et vert, derrière les ports inchangés.
|
||||||
|
metadata:
|
||||||
|
type: reference
|
||||||
|
---
|
||||||
|
Ticket #13 lot F1 livré sur feature/ticket13-server-client-mode. Nouveau dossier `frontend/src/adapters/http/` = 3e implémentation des gateways, à côté de Tauri (desktop) et mock.
|
||||||
|
|
||||||
|
**Fichiers** : `httpInvoker.ts` (POST /api/invoke {command,args}, ErrorDto→GatewayError, fetch injectable), `frames.ts` (contrat frames WS B0 + base64), `wsLiveClient.ts` (squelette WS multiplexé : corrélation id↔replyTo, routage terminal.output par session, dispatch event.domain), `requestResponseGateways.ts` (13 gateways R/R, commandes/enveloppes IDENTIQUES aux adapters Tauri), `streamGateways.ts` (HttpSystem/Agent/Ticket/Terminal + makeWsTerminalHandle detach≠close), `unsupported.ts` (Web{Window,FocusedProject,Remote}Gateway, code UNSUPPORTED_ON_WEB), `index.ts` (createHttpWsGateways(config?), endpoints via window.location). Tests : httpInvoker.test.ts, wsLiveClient.test.ts.
|
||||||
|
|
||||||
|
**Seam DI** : `app/di.tsx` → `resolveTransport()` 3-way (mock > http > tauri), web sélectionné par `VITE_TRANSPORT="http"`. Tauri reste défaut (desktop inchangé).
|
||||||
|
|
||||||
|
**Décision de contrat clé (à confirmer DevBackend)** : transport RPC générique `POST /api/invoke {command,args}` choisi PLUTÔT que l'arbre REST du brouillon B0 — préserve 1:1 tous les DTO Tauri, zéro divergence, bascule REST future ne touche que httpInvoker.ts. Autres points à trancher : placement token WS (pas en URL ; navigateur ne peut pas fixer d'en-tête upgrade), forme réponse terminal.open/agent.launch (ack terminal.attached avec session.sessionId), projectId absent du port openTerminal.
|
||||||
|
|
||||||
|
**Reporté F3/B5/B6** (TODO(F3/B5)) : round-trip xterm réel, reconnexion/backpressure, replay seq/gap, sink chat par-session pour sendTicketChat, agents structurés. Pas de serveur avant B3/B4.
|
||||||
|
|
||||||
|
État : build vert (tsc+vite), garde no-direct-invoke verte, 77 fichiers/724 tests verts. Voir [[ticket13-f0-frontend-transport-inventory]].
|
||||||
19
.ideai/memory/ticket13-f2-web-readonly-client-delivered.md
Normal file
19
.ideai/memory/ticket13-f2-web-readonly-client-delivered.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
name: ticket13-f2-web-readonly-client-delivered
|
||||||
|
description: Le client web read-only (pairing cookie, liste projets, ouverture read-only + snapshot work-state) du chantier client/serveur #13 est livré et vert.
|
||||||
|
metadata:
|
||||||
|
type: reference
|
||||||
|
---
|
||||||
|
Ticket #13 lot F2 livré sur feature/ticket13-server-client-mode. Clôture frontend du premier incrément livrable (B0→B4/F2).
|
||||||
|
|
||||||
|
**Nouveau** : `adapters/http/webSession.ts` (WebSession : flag localStorage « paired » — PAS le cookie HttpOnly ; `pair(code)`→POST /api/pair ; `notifyUnauthorized()` clear+notify ; singleton `getWebSession()`), `features/web/` (PairingScreen, WebWorkspace read-only, WebApp gate). Tests : webSession.test.ts, WebApp.test.tsx.
|
||||||
|
|
||||||
|
**Modifié** : httpInvoker (credentials same-origin + callback onUnauthorized sur 401), http/index.ts (câble onUnauthorized→webSession), app/main.tsx (monte <WebApp/> si resolveTransport()==="http", desktop inchangé).
|
||||||
|
|
||||||
|
**Flux** : non-paired→PairingScreen ; pair OK (cookie HttpOnly posé serveur)→WebWorkspace ; 401 d'un /api/invoke→retour pairing ; « se déconnecter »=clear flag local (révocation serveur=B8). Cookie jamais lisible en JS (HttpOnly) : on se fie au 200 + flag de routage.
|
||||||
|
|
||||||
|
**Read-only** : WebWorkspace n'appelle QUE list_projects, open_project, get_project_work_state (via gateways DI). N'appelle PAS onDomainEvent/health/firstRunState → aucune commande hors-allowlist, pas de WS (live update = F3/B5, snapshot ponctuel pour l'instant).
|
||||||
|
|
||||||
|
**À confirmer B4** : get_project_work_state dans l'allowlist ; open_project sans effet de bord dangereux en read-only ; 401 (pas 403) sur cookie manquant ; code HTTP mauvais code /api/pair (401/403 → « Code d'appairage invalide »).
|
||||||
|
|
||||||
|
Build vert, garde no-direct-invoke verte, 79 fichiers/736 tests verts, desktop inchangé. Suite de [[ticket13-f1-http-ws-adapter-delivered]] ; inventaire [[ticket13-f0-frontend-transport-inventory]].
|
||||||
19
.ideai/memory/ticket13-f3-xterm-websocket-delivered.md
Normal file
19
.ideai/memory/ticket13-f3-xterm-websocket-delivered.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
name: ticket13-f3-xterm-websocket-delivered
|
||||||
|
description: L'adapter WS terminal (round-trip xterm, reconnexion+replay, états connexion) du chantier client/serveur #13 est finalisé et vert côté frontend.
|
||||||
|
metadata:
|
||||||
|
type: reference
|
||||||
|
---
|
||||||
|
Ticket #13 lot F3 livré sur feature/ticket13-pty-websocket. Finalise l'adapter WS terminal depuis le squelette F1. Travail 100% dans frontend/src/adapters/http/ ; port TerminalGateway/TerminalHandle et TerminalView INCHANGÉS.
|
||||||
|
|
||||||
|
**wsLiveClient.ts** : machine d'état connexion (connecting/connected/reconnecting/closed, getConnectionState()+onConnectionStateChange), reconnexion auto (backoff, setTimeout injectable) → re-attach_terminal avec lastSeq + repaint scrollback borné + notices « déconnecté »/« reconnecté » écrites dans xterm via le sink. Suivi des sessions terminales (map `terminals`) pour le replay. Routage terminal.status exited → notice + onStatus + untrack. openTerminal/attachTerminal/detachTerminal/closeTerminalSession haut-niveau. API bas-niveau F1 (setOutputSink/send/domain events) conservée pour agent/system gateways.
|
||||||
|
**streamGateways.ts** : HttpTerminalGateway délègue aux nouvelles méthodes ; makeWsTerminalHandle.detach→detachTerminal (untrack, PTY vivant), close→closeTerminalSession (tue).
|
||||||
|
**frames.ts** : AttachedPayload.status? + StatusPayload.
|
||||||
|
|
||||||
|
**Contrat B5 (server.rs) confirmé** : frames terminal.open{cwd,rows,cols} (pas de projectId)/attach{sessionId,rows,cols,lastSeq}/input{sessionId,bytesBase64}/resize/detach/close/ping ↔ terminal.attached{session,scrollback:[{seq,bytesBase64}],nextSeq,status,gap,assignedConversationId}/output{sessionId,seq,bytesBase64}/status{sessionId,status,exitCode}/error/pong. Ack unifié terminal.attached. Scrollback = 1 entrée seq:0 (tous octets) ou vide.
|
||||||
|
|
||||||
|
**Écarts B5 à arbitrer** : (1) pas de replay delta — le serveur rejoue TOUT le scrollback, lastSeq ne sert qu'au flag gap ⇒ duplication possible à la reconnexion (conforme « V1 scrollback borné »). (2) multi-onglets « dernier gagne » SILENCIEUX — l'attachement évincé ne reçoit aucune frame (pas de crash, mais pas d'indication). (3) indication d'état = notices dans xterm (port inchangé).
|
||||||
|
|
||||||
|
**Tests** : terminalGateway.test.ts (round-trip), wsLiveClientReconnect.test.ts (états/reconnexion/exited). Build vert, garde no-direct-invoke verte, 81 fichiers/743 tests verts, desktop inchangé.
|
||||||
|
|
||||||
|
**Bloqueur run live** (dette carnet, hors F3) : `idea --serve` ne sert pas les assets web same-origin ⇒ app web pas lançable en navigateur tant que le lot « servir dist/ » n'est pas fait. Suite de [[ticket13-f1-http-ws-adapter-delivered]], [[ticket13-f2-web-readonly-client-delivered]].
|
||||||
19
.ideai/memory/ticket13-f4-web-agent-surface-delivered.md
Normal file
19
.ideai/memory/ticket13-f4-web-agent-surface-delivered.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
name: ticket13-f4-web-agent-surface-delivered
|
||||||
|
description: L'agent CLI web (agent.launch → terminal.attached, réattache sans relance, cellule agent réutilisant TerminalView) du chantier client/serveur #13 est livré et vert côté frontend.
|
||||||
|
metadata:
|
||||||
|
type: reference
|
||||||
|
---
|
||||||
|
Ticket #13 lot F4 livré sur feature/ticket13-pty-websocket. Rend la surface agent fonctionnelle en mode web via les gateways DI ; CLI serveur, web = affichage.
|
||||||
|
|
||||||
|
**Adapter** : wsLiveClient.launchAgent(params) réutilise attachInternal de F3 → frame agent.launch, ack unifié terminal.attached, session trackée dans la map `terminals` (reconnexion/replay/exited comme un terminal), renvoie {sessionId, scrollback, assignedConversationId, status}. HttpAgentGateway.launchAgent → ws.launchAgent (pose assignedConversationId sur le handle) ; HttpAgentGateway.reattach → ws.attachTerminal (frame terminal.attach, PAS de relance). Chemin bas-niveau F1 dupliqué supprimé.
|
||||||
|
|
||||||
|
**UI (câblage, pas de nouveau composant terminal)** : features/web/WebAgentCell.tsx réutilise TerminalView (agentMode) avec agent gateway DI comme open=launchAgent/reattach=reattach, persiste sessionId. WebWorkspace : affordance « Ouvrir » par agent du snapshot work-state → monte WebAgentCell.
|
||||||
|
|
||||||
|
**Contrat B6 (server.rs) confirmé, aucun écart** : agent.launch payload plat camelCase {projectId,agentId,nodeId,rows,cols,conversationId} → ack terminal.attached{assignedConversationId}. Agent structuré → erreur UNSUPPORTED (canal PTY-only) surfacée par la bannière TerminalView. Réattache = terminal.attach (no respawn). Singleton guard AGENT_ALREADY_RUNNING déjà géré par TerminalView.
|
||||||
|
|
||||||
|
**Points UI à signaler** : (1) l'affordance liste les agents du snapshot work-state ; lister tous les agents exigerait list_agents sur l'allowlist B4. (2) write-portal (injection délégation) NON câblé en web V1 (affichage + frappe seulement). (3) WebAgentCell ne gère pas de nœud layout.
|
||||||
|
|
||||||
|
**Tests** : adapters/http/agentGateway.test.ts (launch/assignedConversationId/reattach/input/output/resize/UNSUPPORTED/NOT_FOUND), WebApp.test.tsx (+ouverture cellule). Build vert, garde no-direct-invoke verte, 82 fichiers/749 tests verts, desktop inchangé.
|
||||||
|
|
||||||
|
**Bloqueur run live** (dette carnet, hors F4) : `idea --serve` ne sert pas les assets web same-origin ⇒ round-trip navigateur pas validable tant que le lot « servir dist/ » n'est pas fait. Suite de [[ticket13-f3-xterm-websocket-delivered]], [[ticket13-f1-http-ws-adapter-delivered]], [[ticket13-f2-web-readonly-client-delivered]].
|
||||||
17
.ideai/memory/ticket13-f5-web-live-surfaces-delivered.md
Normal file
17
.ideai/memory/ticket13-f5-web-live-surfaces-delivered.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
name: ticket13-f5-web-live-surfaces-delivered
|
||||||
|
description: Les surfaces live web (workstate live via event.domain, background tasks cancel/retry, inbox, re-synchro au reconnect) du chantier client/serveur #13 sont livrées et vertes.
|
||||||
|
metadata:
|
||||||
|
type: reference
|
||||||
|
---
|
||||||
|
Ticket #13 lot F5 livré sur feature/ticket13-pty-websocket. Rend les surfaces live fonctionnelles en mode web.
|
||||||
|
|
||||||
|
**Réutilisation clé** : le hook desktop transport-neutre `features/workstate/useProjectWorkState` (refresh du read-model sur event.domain) est réutilisé TEL QUEL — c'est lui qui donne la parité live. PAS de réutilisation de ProjectWorkStatePanel (dépend de useLayout + attach/stop-vers-cellule, spécifiques au grid desktop, hors read-only). WebWorkspace rend une vue lean : agents live/idle/busy, background tasks (Cancel/Retry via workState gateway), inbox par agent, + cellule agent F4.
|
||||||
|
|
||||||
|
**Adapter** : wsLiveClient.needsReconnect() = terminals.size>0 OU domainEventHandler!=null → la reconnexion marche aussi pour un abonnement live sans terminal (le handler domaine persiste à travers la reconnexion). Nouveau webLive.ts = singleton getWebLiveClient()/setWebLiveClient() (createHttpWsGateways enregistre le ws) exposant l'état de connexion au feature web SANS le mettre dans le port SystemGateway. Nouveau hook features/web/useLiveReconnect.ts : re-refresh du read-model sur transition reconnecting→connected (events manqués pendant coupure ; récupération = re-fetch complet du snapshot, pas de replay serveur).
|
||||||
|
|
||||||
|
**À confirmer B7** : (1) cancel_background_task/retry_background_task sur l'allowlist web write. (2) inbox surfacée via le read-model workstate, PAS via un flux notifications distinct (si B7 en a un, non câblé). (3) re-synchro = re-fetch complet (workstate = snapshot complet), pas de delta par event.
|
||||||
|
|
||||||
|
**Tests** : WebWorkspaceLive.test.tsx (event.domain→refresh, background render+cancel, reconnect re-sync), wsLiveClientReconnect (reconnexion pour abonnement domaine). Build vert, garde no-direct-invoke verte, 83 fichiers/753 tests verts, desktop inchangé.
|
||||||
|
|
||||||
|
**Bloqueur run live** (dette carnet, hors F5) : `idea --serve` ne sert pas les assets web same-origin. Suite de [[ticket13-f4-web-agent-surface-delivered]], [[ticket13-f3-xterm-websocket-delivered]], [[ticket13-f2-web-readonly-client-delivered]].
|
||||||
15
.ideai/memory/ticket54-f1-model-download-overlay-frontend.md
Normal file
15
.ideai/memory/ticket54-f1-model-download-overlay-frontend.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
name: ticket54-f1-model-download-overlay-frontend
|
||||||
|
description: Overlay plein-cellule de préparation du serveur modèle local + progression (barre/%/bytes/source), corrélation factorisée, priorité de voile.
|
||||||
|
metadata:
|
||||||
|
type: reference
|
||||||
|
---
|
||||||
|
Ticket #54 livré et vert côté frontend (F1 = overlay, F2 = progression).
|
||||||
|
|
||||||
|
**Contrat** : `ModelServerStatus.downloading { downloadedBytes|totalBytes|percent|source: number|string|null }` (`frontend/src/domain/index.ts`), miroir exact de `ModelServerStatusDto` (`crates/app-tauri/src/events.rs`). Event `modelServerStatusChanged` passé tel quel — pas de mapping de désérialisation.
|
||||||
|
|
||||||
|
**Factorisation** dans `frontend/src/features/agents/modelServerLaunch.ts` : `correlateModelServerStatus` (chaîne `agentId→profileId→opencode.localModelServerId→serverId`), `modelServerOverlayText` (titre+gating de voile), `useModelServerLaunchState(projectId)` (source autonome pour LeafView), et F2 : `formatBytes` (SI base 1000 : o/Ko/Mo/Go) + `describeModelServerDownload` → `{percent(clamp 0..100 ou null=indéterminé), bytesLabel, source}` (null hors `downloading`). AgentsPanel réutilise le helper.
|
||||||
|
|
||||||
|
**Overlay** dans `LeafView`/`LayoutGrid.tsx` (`data-testid=model-server-overlay`, `zIndex CELL_Z.veil`) : titre + barre `role=progressbar` (aria-valuenow seulement en déterminé, sinon barre indéterminée via keyframe `model-server-indeterminate` dans `theme.css`) + label `"X % · A Mo / B Mo"` + ligne source HF. `starting`/`probing` = titre seul, pas de barre. **Priorité : voile modèle au-dessus** des voiles write-portal + F3 (les deux gatés sur `!modelServerOverlay`). Voir [[ticket4-overlay-composition-leafview]].
|
||||||
|
|
||||||
|
Tests : `LayoutGrid.modelServerOverlay.test.tsx` (F1+F2, dont multi-cellules & indéterminé) + unitaire pur `modelServerLaunch.test.ts`. Non-régression `src/features/agents src/features/layout` = 202 verts ; `npx tsc --noEmit` clean.
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
name: ticket56-visibleelsewhere-derives-from-layout
|
||||||
|
description: Fix frontend du sélecteur d'agent : la désactivation « visible ailleurs » doit venir du layout courant, pas du dernier nodeId du live registry.
|
||||||
|
metadata:
|
||||||
|
type: reference
|
||||||
|
---
|
||||||
|
Bug #56 : agent X affiché en cellule A → A bascule sur Y → X désactivé (« visible ailleurs ») en cellule B alors que X n'est plus affiché nulle part.
|
||||||
|
|
||||||
|
Cause : le live registry garde X→nodeId A même après le swap ; `LayoutGrid.visibleElsewhere` lisait `live.nodeId` comme « affiché ici ».
|
||||||
|
|
||||||
|
Fix (frontend pur, ne tue pas la session) dans `frontend/src/features/layout/LayoutGrid.tsx` :
|
||||||
|
- `visibleElsewhere(candidate)` dérive du **layout courant** : truthy uniquement s'il existe une feuille visible ≠ cellule courante avec `leaf.agent === candidate`. Retourne `{ nodeId }`.
|
||||||
|
- `backgroundLive` utilise `!visibleElsewhere(candidate)` au lieu de `!visibleNodeIds.has(live.nodeId)` ; garde `live.nodeId === id` (anti-boucle self-launch).
|
||||||
|
- onChange du select : même dérivation ; sélection inchangée (attachLiveAgent si sessionId sinon setCellAgent).
|
||||||
|
- Prop `visibleNodeIds` supprimé (devenu mort) de tout le threading LayoutGrid→NodeView→Split/Grid/Leaf.
|
||||||
|
|
||||||
|
Invariant préservé : agent réellement épinglé dans une cellule visible reste NON sélectionnable ailleurs.
|
||||||
|
|
||||||
|
Piège de test : un test qui mocke `listLiveAgents` avec un nodeId visible mais **sans** épingler l'agent dans ce leaf ne désactive plus rien — il faut `setCellAgent` réel. Tests dans `singletonAgent.test.tsx` (describe « ticket #56 » + ajustement R0d). Suite frontend : 706 verts.
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
id: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
|
order: 5
|
||||||
|
name: "Gestion des bugs"
|
||||||
|
status: "planned"
|
||||||
|
createdBy: {"kind":"user"}
|
||||||
|
updatedBy: {"kind":"user"}
|
||||||
|
createdAt: 1783923775150
|
||||||
|
updatedAt: 1783923775150
|
||||||
|
version: 1
|
||||||
|
---
|
||||||
@ -36,6 +36,15 @@
|
|||||||
"status": "planned",
|
"status": "planned",
|
||||||
"updatedAt": 1783757205620,
|
"updatedAt": 1783757205620,
|
||||||
"version": 2
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "e28a4d53-8bd2-446a-b0ac-2a017373b8b2",
|
||||||
|
"path": "e28a4d53-8bd2-446a-b0ac-2a017373b8b2",
|
||||||
|
"order": 5,
|
||||||
|
"name": "Gestion des bugs",
|
||||||
|
"status": "planned",
|
||||||
|
"updatedAt": 1783923775150,
|
||||||
|
"version": 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -1,6 +1,54 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#13"
|
issueRef: "#13"
|
||||||
version: 4
|
version: 18
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783329397368
|
updatedAt: 1784184002362
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# Ticket #13 — Server/client mode (carnet de chantier)
|
||||||
|
|
||||||
|
Ticket gated : review agent-utilisateur faite 2026-07-15. Base develop. Aucune action sortante.
|
||||||
|
|
||||||
|
## Arbitrages produit validés (utilisateur)
|
||||||
|
- Remote perso, 1 SEUL user. Pas de multi-tenant. CLI natif via WS PTY, xterm.js inchangé, PTY serveur. SSH écarté.
|
||||||
|
- Desktop Tauri ET client/serveur sur cœur backend commun. Exposition Internet ⇒ TLS/reverse proxy obligatoire.
|
||||||
|
- Packaging `idea --serve`, artefact unique. Auth pairing code + cookie session, jamais dans l'URL.
|
||||||
|
- Multi-fenêtres OS HORS V1 web. B6→B8 + servir dist, validation live groupée à la fin.
|
||||||
|
|
||||||
|
## Contrat de transport figé (Architect)
|
||||||
|
- `POST /api/invoke {command,args}` (allowlist read-only). Cookie session `HttpOnly,Secure,SameSite=Strict` au pairing (`POST /api/pair`). `POST /api/logout` = révocation (B8). Cookie invalide→401 ; mauvais code→403 ; Origin refusée→403.
|
||||||
|
- Frames WS JSON base64, ack unifié `terminal.attached`, output APRÈS l'ack. structured→UNSUPPORTED.
|
||||||
|
- Flags : `--listen`, `--public-origin`, `--allow-remote`, `--trust-reverse-proxy`, `--app-data-dir`, `--web-root` (B8).
|
||||||
|
|
||||||
|
## Plan de lots — TOUS LES LOTS DEV LIVRÉS ✅
|
||||||
|
B0→B8 + F1→F6 livrés/verts/committés. + correctifs live écarts 1/2. Reste : finir la validation live groupée (utilisateur) puis merge develop + clôture.
|
||||||
|
|
||||||
|
## Livrés VERT
|
||||||
|
- develop (e457152) : B0 5505acc · B1 955db79 · B2 c8fef2a · F1 e0cdb4a · B3 4ed0b16 · B4 fa353f6 · F2 e500e31.
|
||||||
|
- feature/ticket13-pty-websocket : B5 917be99 · F3 7487902 · B6 6391d1c · F4 5254f16 · B7 1bc5217 · F5 dd1d083 · B8 d538808 · F6 6117177 · **fix live écarts 1+2 c9ce3d7**.
|
||||||
|
- B8 : sert dist/ same-origin, serve_static durci, `/api/logout`, logs sécurité, doc remote. 57/57.
|
||||||
|
- F6 : logout, 401→pairing, bannière reconnexion, serveur indispo. build+vitest 758/758.
|
||||||
|
|
||||||
|
## ⚙️ Validation live 1er passage (utilisateur) — 3 écarts remontés
|
||||||
|
1. **Erreur `__TAURI_INTERNALS__ undefined` + projets vides** = MA commande de test était incomplète (build sans `VITE_TRANSPORT=http` → build desktop dans le navigateur ; et `--app-data-dir` non pointé sur le dossier desktop). PAS un bug de code.
|
||||||
|
2. **Défaut app-data-dir désaligné** (RÉSOLU c9ce3d7) : `default_app_data_dir()` retournait `~/.local/share/IdeA` alors que le desktop = identifier tauri `app.idea.ide` (`~/.local/share/app.idea.ide`). Corrigé : précédence `--app-data-dir` > `IDEA_APP_DATA_DIR` > `$XDG_DATA_HOME/app.idea.ide` > `$HOME/.local/share/app.idea.ide` + log démarrage `idea --serve: app data dir = <path>`. Doc corrigée (npm + VITE_TRANSPORT=http + avertissement double-writer). Garde-fou lock inter-process app-data-dir = ticket court à créer AVANT d'ouvrir des écritures web.
|
||||||
|
3. **Bouton Browse (créer/ajouter projet) inopérant en web** = `pickFolder()`→`UNSUPPORTED_ON_WEB` (dialogue natif OS absent du navigateur). PAS régression : report documenté F1. Sélection d'un projet EXISTANT couverte par list_projects/open_project (OK une fois écart 2 corrigé). Créer un NOUVEAU projet en web = nouveau lot (folder browser serveur sandboxé + create_project write) → **ticket #64 créé** (dependsOn #13), cadré par Architect, hors #13.
|
||||||
|
|
||||||
|
## ⚠️ RESTE : re-passage validation live (utilisateur, HORS SANDBOX)
|
||||||
|
Commande corrigée :
|
||||||
|
1. `cd frontend && VITE_TRANSPORT=http npx vite build` (npm, jamais pnpm — voir mémoire `frontend-uses-npm-not-pnpm`).
|
||||||
|
2. Fermer l'app desktop, puis `cargo run --release -p app-tauri -- --serve --web-root frontend/dist --app-data-dir ~/.local/share/app.idea.ide` (pairing code + app data dir sur stderr).
|
||||||
|
3. Navigateur `http://127.0.0.1:17373` → écran pairing → code.
|
||||||
|
4. Vérifier : liste projets (existants visibles), ouvrir projet, terminal CLI (frappe→serveur, reload→réattache/scrollback), cellule agent, surfaces live (workstate/background Cancel-Retry/inbox), reconnexion, logout→pairing.
|
||||||
|
|
||||||
|
## Réserves / écarts V1 (acceptés)
|
||||||
|
- Replay V1 = repaint scrollback complet. Multi-onglets « dernier gagne » silencieux. F4 write-portal NON câblé web. Browse créer-projet web → #64. Lock double-writer app-data-dir → ticket court à créer.
|
||||||
|
|
||||||
|
## Branches
|
||||||
|
`feature/ticket13-pty-websocket` (courante). À merger dans develop après validation live OK.
|
||||||
|
|
||||||
|
## Prochaine étape
|
||||||
|
Re-passage validation live (commande corrigée ci-dessus). Si OK → Git merge dans develop → clôture #13. #64 (Browse web) à planifier après. Aucune action sortante sans validation utilisateur.
|
||||||
|
|
||||||
|
## Dette hors chantier
|
||||||
|
Warnings clippy pré-existants crates/domain (fileguard/profile/sprint).
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "036783fa-9856-4643-8c28-653b93ac36e1"
|
id: "036783fa-9856-4643-8c28-653b93ac36e1"
|
||||||
number: 13
|
number: 13
|
||||||
title: "Server/client mode"
|
title: "Server/client mode"
|
||||||
status: "open"
|
status: "inProgress"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: "028179b1-eaf4-41e9-9c1f-7c37125117e6"
|
sprint: "028179b1-eaf4-41e9-9c1f-7c37125117e6"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783184188272
|
createdAt: 1783184188272
|
||||||
updatedAt: 1783329397368
|
updatedAt: 1784184002362
|
||||||
version: 4
|
version: 18
|
||||||
---
|
---
|
||||||
J'aimerais pouvoir utiliser IdeA sous forme de client/server. C'est a dire que IdeA aurait son backend sur une machine et son interface qui serait un frontend web. Les agents etc seraient tous côté server. C'est a dire que la cli de Claude serait celle côté serveur, l'interface client ne serait que l'affichage frontend, une UI. Je pense que tout est faisable, il faudrait cependant parler du côté CLI. Est ce qu'il serait possible de garde rle CLI natif comme il est actuellement, de l'afficher côté client tout en gardant l'installation claude code, codex etc côté serveur ? Peut etre qu'en ssh ça passerait ? Ce ticket ne pourra pas être fait en autonomie par un agent sans une review agent-utilisateur avant.
|
J'aimerais pouvoir utiliser IdeA sous forme de client/server. C'est a dire que IdeA aurait son backend sur une machine et son interface qui serait un frontend web. Les agents etc seraient tous côté server. C'est a dire que la cli de Claude serait celle côté serveur, l'interface client ne serait que l'affichage frontend, une UI. Je pense que tout est faisable, il faudrait cependant parler du côté CLI. Est ce qu'il serait possible de garde rle CLI natif comme il est actuellement, de l'afficher côté client tout en gardant l'installation claude code, codex etc côté serveur ? Peut etre qu'en ssh ça passerait ? Ce ticket ne pourra pas être fait en autonomie par un agent sans une review agent-utilisateur avant.
|
||||||
@ -1,6 +1,15 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#15"
|
issueRef: "#15"
|
||||||
version: 2
|
version: 5
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783329462104
|
updatedAt: 1784093861343
|
||||||
---
|
---
|
||||||
|
## Cadrage Architect — DIFFÉRÉ (2026-07-13)
|
||||||
|
|
||||||
|
#15 (cas DÉLÉGUÉ : A→B via idea_ask_agent, B limité → parquer le waiter de A et re-livrer au reset) est **distinct de #30** (cas direct) et **différé hors sprint**.
|
||||||
|
|
||||||
|
**Motif (Architect)** : le faire maintenant en in-memory serait une rustine fragile — réintroduit un blocage long côté A et ne tient pas les scénarios reboot/crash/redémarrage IdeA déjà identifiés.
|
||||||
|
|
||||||
|
**Prérequis bloquant** : un modèle fiable de *délégation durable runtime-agent identity* (stockage waiter, corrélation requester/target/request, re-livraison idempotente, reprise après reset, comportement si A meurt / B redémarre / IdeA redémarre, expiration/annulation). → design `durable-delegation-runtime-agent-identity-design`.
|
||||||
|
|
||||||
|
**Statut** : reste ouvert, priorité low/stretch conservée. Dépendance baseline #7 maintenue + à rattacher au redesign délégation durable. Ne pas mélanger avec #30.
|
||||||
@ -1,22 +1,28 @@
|
|||||||
---
|
---
|
||||||
id: "5de121f3-1cd1-4a73-bcab-b0a43a7c257f"
|
id: "5de121f3-1cd1-4a73-bcab-b0a43a7c257f"
|
||||||
number: 15
|
number: 15
|
||||||
title: "Limites de session — re-livraison automatique parquée au reset (stretch B5, délégation durable)"
|
title: "[Bloqué par #7 — design durable] Limites de session — re-livraison auto parquée au reset (stretch B5)"
|
||||||
status: "open"
|
status: "open"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: "d8f3f37b-87ca-4509-9116-45a99bc711df"
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
links: [{"target":"#7","kind":"dependsOn"}]
|
links: [{"target":"#7","kind":"dependsOn"}]
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783208599385
|
createdAt: 1783208599385
|
||||||
updatedAt: 1783329462104
|
updatedAt: 1784093861343
|
||||||
version: 2
|
version: 5
|
||||||
---
|
---
|
||||||
Extrait du cadrage Architect du ticket #7 (baseline livrée : propagation inter-agent B1→B3 + F1/F2). Stretch non retenu dans #7.
|
Extrait du cadrage Architect du ticket #7 (baseline livrée : propagation inter-agent B1→B3 + F1/F2). Stretch non retenu dans #7.
|
||||||
|
|
||||||
|
⛔ STATUT (2026-07-15) : BLOQUÉ / PARQUÉ. Dépend de #7 qui est encore en QA (non stabilisé). Architect (triage sprint « Gestion des bugs ») : « le waiter A→B n'est pas parqué/re-livré, l'ask retourne encore une erreur Process ; à traiter APRÈS stabilisation QA de #7/LS7 ». De plus c'est un item de « délégation durable » (in-memory fragile aux redémarrages) qui relève d'un design dédié, pas d'une rustine. Non lançable tant que #7 n'est pas vert et que le design durable-delegation n'est pas cadré. Sorti de la production active du sprint.
|
||||||
|
|
||||||
|
--- Cadrage conservé ---
|
||||||
|
|
||||||
Objectif : quand A délègue à B via idea_ask_agent et que B atteint sa limite, au lieu de demander à A de ré-interroger après le reset, PARQUER le waiter de A par (requester,target) ; au execute_resume de B (reprise auto au reset), RE-LIVRER la tâche d'origine et router la complétion vers le waiter de A s'il est encore vivant (sinon drop, contrainte in-memory).
|
Objectif : quand A délègue à B via idea_ask_agent et que B atteint sa limite, au lieu de demander à A de ré-interroger après le reset, PARQUER le waiter de A par (requester,target) ; au execute_resume de B (reprise auto au reset), RE-LIVRER la tâche d'origine et router la complétion vers le waiter de A s'il est encore vivant (sinon drop, contrainte in-memory).
|
||||||
|
|
||||||
Coût/risque (Architect) : rapproche du modèle de « délégation durable » tout en restant in-memory → fragile aux redémarrages/interruptions de A, ré-introduit une forme de blocage long côté A. À rattacher au design durable-delegation-runtime-agent-identity-design plutôt que de le traiter en rustine in-memory.
|
État actuel (triage) : le rendez-vous délégué détecte RateLimited et arme une reprise de la cible (crates/application/src/orchestrator/service.rs:1854), execute_resume relance l'agent (crates/application/src/agent/session_limit.rs:226) ; mais le waiter A→B n'est pas parqué/re-livré.
|
||||||
|
|
||||||
|
Coût/risque (Architect) : rapproche du modèle « délégation durable » tout en restant in-memory → fragile aux redémarrages/interruptions de A, ré-introduit un blocage long côté A. À rattacher au design durable-delegation-runtime-agent-identity-design plutôt que traité en rustine in-memory.
|
||||||
|
|
||||||
Dépend de : #7 (baseline inter-agent B1→B3). Voir mémoire ticket7-session-limit-interagent-cadrage.
|
Dépend de : #7 (baseline inter-agent B1→B3). Voir mémoire ticket7-session-limit-interagent-cadrage.
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#2"
|
issueRef: "#2"
|
||||||
version: 2
|
version: 6
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783184142093
|
updatedAt: 1784065385002
|
||||||
---
|
---
|
||||||
|
|||||||
@ -1,24 +1,39 @@
|
|||||||
---
|
---
|
||||||
id: "0a492d45-e195-4df7-a2ad-65649372abf0"
|
id: "0a492d45-e195-4df7-a2ad-65649372abf0"
|
||||||
number: 2
|
number: 2
|
||||||
title: "Tâches de fond — dette A : PtyPort::wait/try_wait + tee live UI + robustesse détection de fin"
|
title: "Tâches de fond — dette A : découpler fin de process et flux output PTY (PtyPort::wait/try_wait)"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783082860742
|
createdAt: 1783082860742
|
||||||
updatedAt: 1783184142093
|
updatedAt: 1784065385002
|
||||||
version: 2
|
version: 6
|
||||||
---
|
---
|
||||||
Dette issue de l'arbitrage B8 (mémoire projet: b8-arbitration-outcomes, point 1).
|
Ticket #2 — Tâches de fond : découpler fin de process et flux output PTY.
|
||||||
|
|
||||||
B8 a été accepté sans rendu live des tâches de fond. Le cœur complétion→wake fonctionne, mais la détection de fin du runner repose sur l'EOF du stream PTY single-consumer, ce qui est fragile et empêche un tee UI (une re-souscription UI casserait la détection EOF).
|
REQUALIFIÉ (2026-07-14) : le hub broadcast PTY existe désormais (crates/infrastructure/src/pty/mod.rs), donc l'ancienne contrainte « pas de broadcast multi-consommateur » est OBSOLÈTE. Le volet « tee live UI » est sorti en sous-ticket B/F séparé (voir lien blocks). La dette restante ici est purement backend.
|
||||||
|
|
||||||
Reste à faire :
|
Constat : `CommandBackgroundRunner` détecte encore la fin d'une tâche en drainant `PtyPort::subscribe_output` jusqu'à EOF (crates/infrastructure/src/background_task/runner.rs:187), ce qui couple la lifecycle du process à la consommation de sortie et empêche un tee sans casser la détection.
|
||||||
- Ajouter `PtyPort::wait` / `try_wait` pour découpler la détection d'exit de la consommation d'output (retirer l'EOF-comme-proxy-de-fin).
|
|
||||||
- Une fois découplé, brancher un tee de la sortie PTY vers l'UI pour le rendu live des tâches de fond (F-live).
|
|
||||||
- NE PAS introduire de broadcast multi-consommateur (décision Architect).
|
|
||||||
|
|
||||||
Périmètre touchant un port figé (PtyPort) : cadrage Architect requis avant implémentation.
|
Attendu :
|
||||||
|
- Ajouter au port figé `PtyPort` (crates/domain/src/ports.rs:952) deux opérations explicites :
|
||||||
|
- `async fn wait(&self, handle: &PtyHandle) -> Result<ExitStatus, PtyError>` (attend la fin naturelle + status ; documenter l'idempotence : premier wait consomme, suivants retournent le status mémorisé).
|
||||||
|
- `fn try_wait(&self, handle: &PtyHandle) -> Result<Option<ExitStatus>, PtyError>` (non bloquant : Ok(None) si vivant, Ok(Some(status)) si terminé).
|
||||||
|
- `kill` reste « forcer l'arrêt puis retourner status » ; si déjà terminé, retourne le status mémorisé. NotFound si handle inconnu/purgé. L'exit status est mémorisé dans le registre live tant que la session existe (cohérence wait/try_wait/kill).
|
||||||
|
- Implémenter dans `PortablePtyAdapter` (état d'exit partagé, attendre le child sans dépendre du reader EOF, éviter double wait/kill) et dans tous les fakes de test.
|
||||||
|
- Migrer le runner : remplacer l'attente EOF (runner.rs:187) par une attente sur `pty.wait(&handle)`, concurrencée avec cancel/deadline. La sortie de completion reste prise depuis le scrollback borné ; le runner n'a plus besoin de subscribe_output pour savoir si le process est fini.
|
||||||
|
|
||||||
|
Impact contractuel : port figé modifié → changement source-breaking intra-workspace (tous les adapters/fakes ajoutent wait/try_wait), mais PAS de breaking IPC/front, pas de migration de données.
|
||||||
|
|
||||||
|
Lots : B1 wait/try_wait au port + fakes ; B2 impl PortablePtyAdapter ; B3 migrer CommandBackgroundRunner vers wait ; B4 tests. Taille M.
|
||||||
|
|
||||||
|
QA (point de vérité) :
|
||||||
|
- Fake PtyPort dont l'output n'est jamais drainé (ou consommé par 2 subscribers) mais `wait` résout → le runner complète quand même.
|
||||||
|
- Fake avec subscriber UI actif + runner → completion via `wait`, pas via EOF.
|
||||||
|
- Deadline : si `wait` ne résout pas avant deadline → runner retourne Expired et tue/cleanup correctement.
|
||||||
|
- Cancel : cancel gagne même si l'output continue.
|
||||||
|
- Portable PTY réel : commande courte (`echo hi`) → completion exit 0 sans dépendre d'un drain output.
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#20"
|
issueRef: "#20"
|
||||||
version: 2
|
version: 5
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783331176736
|
updatedAt: 1784049665491
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,16 +2,16 @@
|
|||||||
id: "1be19ee5-fd03-42ea-8df6-da18704807a9"
|
id: "1be19ee5-fd03-42ea-8df6-da18704807a9"
|
||||||
number: 20
|
number: 20
|
||||||
title: "[Backend] Dette ticket_list — matching #ref dans text + curseur opaque/stable"
|
title: "[Backend] Dette ticket_list — matching #ref dans text + curseur opaque/stable"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: null
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
links: [{"target":"#18","kind":"relatesTo"}]
|
links: [{"target":"#18","kind":"relatesTo"}]
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783331172226
|
createdAt: 1783331172226
|
||||||
updatedAt: 1783331176736
|
updatedAt: 1784049665491
|
||||||
version: 2
|
version: 5
|
||||||
---
|
---
|
||||||
Dette backend identifiée pendant le cadrage du sprint UI rework (gate G4), non bloquante pour la popup #18 qui démarre sur le contrat actuel.
|
Dette backend identifiée pendant le cadrage du sprint UI rework (gate G4), non bloquante pour la popup #18 qui démarre sur le contrat actuel.
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#26"
|
issueRef: "#26"
|
||||||
version: 4
|
version: 6
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783491079604
|
updatedAt: 1783861758866
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "2201b898-9c45-4057-9014-5284897507ad"
|
id: "2201b898-9c45-4057-9014-5284897507ad"
|
||||||
number: 26
|
number: 26
|
||||||
title: "[UI] refonte totale de la gestion des menus via agent UX"
|
title: "[UI] refonte totale de la gestion des menus via agent UX"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "medium"
|
priority: "medium"
|
||||||
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783437525356
|
createdAt: 1783437525356
|
||||||
updatedAt: 1783491079604
|
updatedAt: 1783861758866
|
||||||
version: 4
|
version: 6
|
||||||
---
|
---
|
||||||
J'aimerais une refonte totale de l'UX et de l'UI d'IdeA pour tout ce qui touche aux menus. Je n'aime pas la disposition actuelle. Il est important de garder l'aspect fenêtre flottantes, le fait de pouvoir anchor les fenêtres sur le côté d'IdeA, mais je n'aime pas le fait qu'il y ai deux listes déroulantes View et Window. Onne comprends pas vraiemnt la différence. De plus, l'affichage de l'onglet du projet avec le nom "Projet : IdeA" sur lequel cliquer pour changer de projet je n'aime pas. Je pense peut être plutot ajouter un + à côté de l'onglet du projet pour pouvoir ouvrir plusieurs projet en parallèle ? (A l''approbation de UX). Par contre je ne veux pas qu'on touche aux cellules des agents, elles sont très bien comme ça, on se contente des menus et des fenêtres.
|
J'aimerais une refonte totale de l'UX et de l'UI d'IdeA pour tout ce qui touche aux menus. Je n'aime pas la disposition actuelle. Il est important de garder l'aspect fenêtre flottantes, le fait de pouvoir anchor les fenêtres sur le côté d'IdeA, mais je n'aime pas le fait qu'il y ai deux listes déroulantes View et Window. Onne comprends pas vraiemnt la différence. De plus, l'affichage de l'onglet du projet avec le nom "Projet : IdeA" sur lequel cliquer pour changer de projet je n'aime pas. Je pense peut être plutot ajouter un + à côté de l'onglet du projet pour pouvoir ouvrir plusieurs projet en parallèle ? (A l''approbation de UX). Par contre je ne veux pas qu'on touche aux cellules des agents, elles sont très bien comme ça, on se contente des menus et des fenêtres.
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#27"
|
issueRef: "#27"
|
||||||
version: 3
|
version: 6
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783440116446
|
updatedAt: 1783926649550
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "d7459ae0-31ae-49b2-bd93-2419397b0343"
|
id: "d7459ae0-31ae-49b2-bd93-2419397b0343"
|
||||||
number: 27
|
number: 27
|
||||||
title: "[Bug] L'outil assistance IA n'a pas les commandes MCP"
|
title: "[Bug] L'outil assistance IA n'a pas les commandes MCP"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "high"
|
priority: "high"
|
||||||
sprint: null
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783439818722
|
createdAt: 1783439818722
|
||||||
updatedAt: 1783440116446
|
updatedAt: 1783926649550
|
||||||
version: 3
|
version: 6
|
||||||
---
|
---
|
||||||
Il semblerait que l'outil assistance IA des tickets n'ait pas connaissance des tools MCP pour l'edition des tickets. J'ai essayé de demandé à l'assistant de modifié le ticket pour que ça aille dans le sens de la conversation que j'ai eu avec lui et il m'a dabord donné un .md. Quand je lui ai demandé de modifier lui même le ticket, il est allé dans le fichier directement pour apporter des modifications au lieu d'utiliser le tool MCP d'IdeA
|
Il semblerait que l'outil assistance IA des tickets n'ait pas connaissance des tools MCP pour l'edition des tickets. J'ai essayé de demandé à l'assistant de modifié le ticket pour que ça aille dans le sens de la conversation que j'ai eu avec lui et il m'a dabord donné un .md. Quand je lui ai demandé de modifier lui même le ticket, il est allé dans le fichier directement pour apporter des modifications au lieu d'utiliser le tool MCP d'IdeA
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#29"
|
issueRef: "#29"
|
||||||
version: 4
|
version: 5
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783491123831
|
updatedAt: 1783921595742
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "51f19ca1-6b67-491b-b750-735c48a89d4b"
|
id: "51f19ca1-6b67-491b-b750-735c48a89d4b"
|
||||||
number: 29
|
number: 29
|
||||||
title: "[UI] Garder les filtres des tickets entre deux redemarrage"
|
title: "[UI] Garder les filtres des tickets entre deux redemarrage"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783491008871
|
createdAt: 1783491008871
|
||||||
updatedAt: 1783491123831
|
updatedAt: 1783921595742
|
||||||
version: 4
|
version: 5
|
||||||
---
|
---
|
||||||
J'aimerais garder les filtres des tickets en mémoire entre deux redemarrage ou ouverture de la fenetre ou d ela popup de choix de tickets.
|
J'aimerais garder les filtres des tickets en mémoire entre deux redemarrage ou ouverture de la fenetre ou d ela popup de choix de tickets.
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#3"
|
issueRef: "#3"
|
||||||
version: 2
|
version: 6
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783184146749
|
updatedAt: 1784093835732
|
||||||
---
|
---
|
||||||
|
|||||||
@ -1,22 +1,28 @@
|
|||||||
---
|
---
|
||||||
id: "fedd343e-f9c1-467b-bab4-455f51907de7"
|
id: "fedd343e-f9c1-467b-bab4-455f51907de7"
|
||||||
number: 3
|
number: 3
|
||||||
title: "Tâches de fond — dette B : persistance sûre de l'invocation (retry-after-reboot, secrets) + énumération terminale/projet du store"
|
title: "[Différé — design à mûrir] Tâches de fond — dette B : retry durable après reboot"
|
||||||
status: "open"
|
status: "open"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783082860758
|
createdAt: 1783082860758
|
||||||
updatedAt: 1783184146749
|
updatedAt: 1784093835732
|
||||||
version: 2
|
version: 6
|
||||||
---
|
---
|
||||||
Dette issue de l'arbitrage B8 (mémoire projet: b8-arbitration-outcomes, points 2 et 5).
|
Ticket #3 — Tâches de fond : retry après redémarrage sans fuite de secrets dans le projet.
|
||||||
|
|
||||||
En V1, le registre d'invocations pour le retry est in-memory et session-scoped (le SpawnSpec porte des secrets, interdit dans .ideai/background-tasks/*.json qui voyage avec le projet). Conséquences à résorber :
|
⛔ DÉCISION UTILISATEUR (2026-07-15) : DIFFÉRÉ. On ne persiste PAS de secrets en clair machine-local pour l'instant. À reprendre plus tard avec un vrai design sécurisé (keyring OS multiplateforme — Secret Service / Keychain / Credential Manager — ou modèle d'invocation déclaratif avec secret-refs re-résolus au retry depuis profil/env). Le retry-after-reboot reste indisponible en attendant. Ticket sorti de la production active du sprint « Gestion des bugs ».
|
||||||
|
|
||||||
- Retry-after-reboot : persistance SÛRE de l'invocation (redaction des secrets et/ou store machine-local hors projet) pour permettre le retry après un redémarrage d'IdeA.
|
--- Cadrage conservé pour la reprise ---
|
||||||
- Énumération store : aujourd'hui `list_background_tasks` sans agentId ne renvoie que les complétions non livrées du projet ; le store n'énumère pas les tâches terminales/ouvertes par projet (historique completed/failed partiel). Enrichir BackgroundTaskStore pour l'énumération terminale/projet.
|
|
||||||
|
|
||||||
Cadrage Architect requis (persistance de secrets = sensible).
|
REQUALIFIÉ (2026-07-14) :
|
||||||
|
- Volet « énumération terminale/projet du BackgroundTaskStore » : RÉSOLU par l'implémentation actuelle (store durable par projet sous <root>/.ideai/background-tasks, listes open par agent + completions non livrées, routage par projet). RETIRÉ du périmètre.
|
||||||
|
- Reste uniquement le retry après redémarrage. L'invocation d'origine (SpawnSpec) est conservée dans un registre in-memory session-scoped (BackgroundCommandArchive, crates/application/src/background/mod.rs:203) volontairement non persistée dans .ideai car elle peut contenir des secrets. Après reboot, une tâche persistée ne peut donc pas être relancée.
|
||||||
|
|
||||||
|
Option A (écartée pour l'instant par décision utilisateur) : store machine-local hors projet (app-data OS/Tauri), SpawnSpec complet par (project_id, task_id), permissions 0700/0600 best-effort, JSON projet sans secret, retry échouant explicitement si invocation absente. Simple (M) mais persiste des secrets en clair local → refusée à ce stade.
|
||||||
|
|
||||||
|
Piste retenue pour la reprise : keyring OS multiplateforme OU secret-refs déclaratifs (chantier plus large que « low », à cadrer comme design dédié le moment venu).
|
||||||
@ -1,6 +1,25 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#30"
|
issueRef: "#30"
|
||||||
version: 3
|
version: 8
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783491223434
|
updatedAt: 1783941648176
|
||||||
---
|
---
|
||||||
|
## Cadrage Architect (2026-07-13) — cas DIRECT, actionnable
|
||||||
|
|
||||||
|
Débloqué : #27 fermé. #30 ≠ #15 (#15 = cas délégué, différé).
|
||||||
|
|
||||||
|
**Périmètre** : le chemin direct de session agent (agent directement adressé, ex. Main) ne remonte pas la limite vers `SessionLimitService`. Fix = accrocher le détecteur sur le chemin direct, avant résolution finale du tour.
|
||||||
|
|
||||||
|
**Frontière hexagonale** : infra détecte (adapter provider/profil déclaratif extrait la limite du flux structuré/regex → `ReplyEvent::RateLimited { resets_at_ms? }`) ; application arme la reprise (`SessionLimitService::on_rate_limited(agent_id,node_id,conversation_id,resets_at_ms)`) ; app-tauri relaie ; React affiche/annule. Aucune logique provider dans domaine/application.
|
||||||
|
|
||||||
|
**Contrat d'événements** :
|
||||||
|
- `DomainEvent::AgentRateLimited { agent_id, resets_at_ms }`
|
||||||
|
- `DomainEvent::AgentResumeScheduled { agent_id, fire_at_ms }` si reprise armée
|
||||||
|
- reprise auto au reset, annulable via `cancel_resume` (contrat existant conservé)
|
||||||
|
- si heure de reset non récupérable : fallback niveau humain déjà cadré (état suspect + saisie d'heure, pas de silence)
|
||||||
|
|
||||||
|
**Point clé** : identité runtime — résoudre l'agent courant + `node_id` vivant + `conversation_id` via le registre/session meta existant (pas de convention UI). Sans `conversation_id`, ne PAS prétendre la reprise armée.
|
||||||
|
|
||||||
|
**Découpage** : B1 tap `ReplyEvent::RateLimited → on_rate_limited` dans le runner direct ; B2 résolution identité/session (agent_id/node_id/conversation_id) pour l'agent adressé ; B3 tests application/app-tauri (flux direct rate-limit avec resets_at_ms → AgentRateLimited puis AgentResumeScheduled) ; F1 régression badge existant (pas de nouveau contrat) ; F2 QA réelle (limite provoquée/mockée sur Main → heure affichée, annulation, reprise planifiée).
|
||||||
|
|
||||||
|
**Sous-lot adjacent** (ferme #7/F2, mémoire `ticket7-f2-delegated-limit-no-agentratelimited`) : la branche rendez-vous délégué publie seulement `DelegationRateLimited` et doit aussi armer `on_rate_limited(target,…)`. Traité dans la même branche mais en commit séparé.
|
||||||
@ -2,15 +2,15 @@
|
|||||||
id: "f2c4ed9c-ba54-42c1-90aa-0345d4ff4c6b"
|
id: "f2c4ed9c-ba54-42c1-90aa-0345d4ff4c6b"
|
||||||
number: 30
|
number: 30
|
||||||
title: "[Bug] Le handle de limite session n'est pas fonctionnel quand c'est Main qui limite session"
|
title: "[Bug] Le handle de limite session n'est pas fonctionnel quand c'est Main qui limite session"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "medium"
|
priority: "medium"
|
||||||
sprint: null
|
sprint: "d8f3f37b-87ca-4509-9116-45a99bc711df"
|
||||||
links: [{"target":"#27","kind":"blockedBy"}]
|
links: [{"target":"#27","kind":"blockedBy"}]
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783491181648
|
createdAt: 1783491181648
|
||||||
updatedAt: 1783491223434
|
updatedAt: 1783941648176
|
||||||
version: 3
|
version: 8
|
||||||
---
|
---
|
||||||
Lorsque l'agent qui atteint sa limite est celui à qui ont parle, la limite de session n'est pas récupérée par IdeA et n'est pas gérée
|
Lorsque l'agent qui atteint sa limite est celui à qui ont parle, la limite de session n'est pas récupérée par IdeA et n'est pas gérée
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#31"
|
issueRef: "#31"
|
||||||
version: 1
|
version: 4
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783491197541
|
updatedAt: 1784064442657
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,16 +2,16 @@
|
|||||||
id: "83d320f1-766b-4744-b518-8e39a2518e9c"
|
id: "83d320f1-766b-4744-b518-8e39a2518e9c"
|
||||||
number: 31
|
number: 31
|
||||||
title: "Détection de profils séquentielle : N × 800 ms au pire, résultat potentiellement partiel"
|
title: "Détection de profils séquentielle : N × 800 ms au pire, résultat potentiellement partiel"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: null
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
links: [{"target":"#28","kind":"relatesTo"}]
|
links: [{"target":"#28","kind":"relatesTo"}]
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783491197541
|
createdAt: 1783491197541
|
||||||
updatedAt: 1783491197541
|
updatedAt: 1784064442657
|
||||||
version: 1
|
version: 4
|
||||||
---
|
---
|
||||||
## Origine
|
## Origine
|
||||||
Relevé par Git en revue du diff du ticket #28 (merge 710fa8f), hors périmètre du fix.
|
Relevé par Git en revue du diff du ticket #28 (merge 710fa8f), hors périmètre du fix.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#33"
|
issueRef: "#33"
|
||||||
version: 1
|
version: 4
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783492190391
|
updatedAt: 1784048928225
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,16 +2,16 @@
|
|||||||
id: "c3e1fbcc-cedc-48a5-a00e-b22ea8dc90de"
|
id: "c3e1fbcc-cedc-48a5-a00e-b22ea8dc90de"
|
||||||
number: 33
|
number: 33
|
||||||
title: "[Dette] Fallthrough silencieux du routage structuré (lifecycle.rs:1705)"
|
title: "[Dette] Fallthrough silencieux du routage structuré (lifecycle.rs:1705)"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "high"
|
priority: "high"
|
||||||
sprint: null
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
links: [{"target":"#32","kind":"relatesTo"},{"target":"#14","kind":"relatesTo"}]
|
links: [{"target":"#32","kind":"relatesTo"},{"target":"#14","kind":"relatesTo"}]
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783492190391
|
createdAt: 1783492190391
|
||||||
updatedAt: 1783492190391
|
updatedAt: 1784048928225
|
||||||
version: 1
|
version: 4
|
||||||
---
|
---
|
||||||
Cause racine structurelle identifiée par Architect lors du cadrage de #32.
|
Cause racine structurelle identifiée par Architect lors du cadrage de #32.
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#34"
|
issueRef: "#34"
|
||||||
version: 1
|
version: 4
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783492562056
|
updatedAt: 1784050010085
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,16 +2,16 @@
|
|||||||
id: "8dca00bf-ec0f-4da1-a231-46b27c711b78"
|
id: "8dca00bf-ec0f-4da1-a231-46b27c711b78"
|
||||||
number: 34
|
number: 34
|
||||||
title: "[Risque] ChatBridge.scrollback non borné (croissance mémoire)"
|
title: "[Risque] ChatBridge.scrollback non borné (croissance mémoire)"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "medium"
|
priority: "medium"
|
||||||
sprint: null
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
links: [{"target":"#32","kind":"relatesTo"}]
|
links: [{"target":"#32","kind":"relatesTo"}]
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783492562056
|
createdAt: 1783492562056
|
||||||
updatedAt: 1783492562056
|
updatedAt: 1784050010085
|
||||||
version: 1
|
version: 4
|
||||||
---
|
---
|
||||||
Identifié par Architect lors du cadrage de #32 (variante B).
|
Identifié par Architect lors du cadrage de #32 (variante B).
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#35"
|
issueRef: "#35"
|
||||||
version: 5
|
version: 6
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783757457771
|
updatedAt: 1783777898736
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
id: "77ef65a5-bbb8-44d2-a610-27bf15c54a0a"
|
id: "77ef65a5-bbb8-44d2-a610-27bf15c54a0a"
|
||||||
number: 35
|
number: 35
|
||||||
title: "Avoir llamacpp intégré"
|
title: "Avoir llamacpp intégré"
|
||||||
status: "inProgress"
|
status: "closed"
|
||||||
priority: "high"
|
priority: "high"
|
||||||
sprint: "883534aa-7fc1-4d83-a9c0-17cac4a4eea5"
|
sprint: "883534aa-7fc1-4d83-a9c0-17cac4a4eea5"
|
||||||
links: []
|
links: []
|
||||||
@ -10,7 +10,7 @@ agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}
|
|||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783756863540
|
createdAt: 1783756863540
|
||||||
updatedAt: 1783757457771
|
updatedAt: 1783777898736
|
||||||
version: 5
|
version: 6
|
||||||
---
|
---
|
||||||
Nous avons llamacpp qui marche super avec OpencCode à présent. J'aimerais maintenant que llamacpp soit lancé automatiquement via IdeA avec le bon modele à la bonne url et bon port si celui-ci n'est pas encore lancé
|
Nous avons llamacpp qui marche super avec OpencCode à présent. J'aimerais maintenant que llamacpp soit lancé automatiquement via IdeA avec le bon modele à la bonne url et bon port si celui-ci n'est pas encore lancé
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#36"
|
issueRef: "#36"
|
||||||
version: 5
|
version: 6
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783757458773
|
updatedAt: 1783777899737
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
id: "3bb071b9-08eb-4e1b-b4b4-dccee8114a7e"
|
id: "3bb071b9-08eb-4e1b-b4b4-dccee8114a7e"
|
||||||
number: 36
|
number: 36
|
||||||
title: "[UI] Pouvoir déclarer plusieurs profils AI de modeles locaux"
|
title: "[UI] Pouvoir déclarer plusieurs profils AI de modeles locaux"
|
||||||
status: "inProgress"
|
status: "closed"
|
||||||
priority: "medium"
|
priority: "medium"
|
||||||
sprint: "883534aa-7fc1-4d83-a9c0-17cac4a4eea5"
|
sprint: "883534aa-7fc1-4d83-a9c0-17cac4a4eea5"
|
||||||
links: []
|
links: []
|
||||||
@ -10,7 +10,7 @@ agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}
|
|||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783757232381
|
createdAt: 1783757232381
|
||||||
updatedAt: 1783757458773
|
updatedAt: 1783777899737
|
||||||
version: 5
|
version: 6
|
||||||
---
|
---
|
||||||
Actuellement chaque type de profils ne peux déclarer qu'un seul profile AI. J'aimerais que le profile OpenCode puisse permetre d'en décalrer plusieurs différents.
|
Actuellement chaque type de profils ne peux déclarer qu'un seul profile AI. J'aimerais que le profile OpenCode puisse permetre d'en décalrer plusieurs différents.
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#37"
|
issueRef: "#37"
|
||||||
version: 5
|
version: 7
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783757520082
|
updatedAt: 1783878976369
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "a2b6212a-8725-4ace-b8a4-c3a41e2c2988"
|
id: "a2b6212a-8725-4ace-b8a4-c3a41e2c2988"
|
||||||
number: 37
|
number: 37
|
||||||
title: "[UI] garder les tickets dans les sprints, mais ajouter l'affichage du status et la possibiliter de filtrer les tickets"
|
title: "[UI] garder les tickets dans les sprints, mais ajouter l'affichage du status et la possibiliter de filtrer les tickets"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783757421147
|
createdAt: 1783757421147
|
||||||
updatedAt: 1783757520082
|
updatedAt: 1783878976369
|
||||||
version: 5
|
version: 7
|
||||||
---
|
---
|
||||||
Actuelleemnt dans les sprints les tickets sont retirés une fois fait. J'aimerais que les tickets restent dans le sprints mais qu'on ajoute l'affichage du status de chaque ticket. J'aimerais aussi qu'on ai la possibilité de trier les tickets via leur status, leur priorité etc comme sur la liste des tickets
|
Actuelleemnt dans les sprints les tickets sont retirés une fois fait. J'aimerais que les tickets restent dans le sprints mais qu'on ajoute l'affichage du status de chaque ticket. J'aimerais aussi qu'on ai la possibilité de trier les tickets via leur status, leur priorité etc comme sur la liste des tickets
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#38"
|
issueRef: "#38"
|
||||||
version: 5
|
version: 7
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783757636999
|
updatedAt: 1783879443381
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "7e89bfc9-dc56-4656-a154-690f02e69756"
|
id: "7e89bfc9-dc56-4656-a154-690f02e69756"
|
||||||
number: 38
|
number: 38
|
||||||
title: "[UI] Pouvoir ajouter un ticket à un sprint pendant sa création"
|
title: "[UI] Pouvoir ajouter un ticket à un sprint pendant sa création"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783757548614
|
createdAt: 1783757548614
|
||||||
updatedAt: 1783757636999
|
updatedAt: 1783879443381
|
||||||
version: 5
|
version: 7
|
||||||
---
|
---
|
||||||
J'aimerais que dans la création de ticket on puisse lui attribuer un sprint via une popup comme celle du choix de tickets
|
J'aimerais que dans la création de ticket on puisse lui attribuer un sprint via une popup comme celle du choix de tickets
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#39"
|
issueRef: "#39"
|
||||||
version: 3
|
version: 5
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783757851100
|
updatedAt: 1783921595316
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "02ff2d0c-4312-47c3-b84c-834029723fc4"
|
id: "02ff2d0c-4312-47c3-b84c-834029723fc4"
|
||||||
number: 39
|
number: 39
|
||||||
title: "[UI] Fermer toutes les fernetres lors de la fermeture de la fenetre principale principale"
|
title: "[UI] Fermer toutes les fernetres lors de la fermeture de la fenetre principale principale"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783757707896
|
createdAt: 1783757707896
|
||||||
updatedAt: 1783757851100
|
updatedAt: 1783921595316
|
||||||
version: 3
|
version: 5
|
||||||
---
|
---
|
||||||
Quand on ferme la fenetre principale d'IdeA, j'aimerais que toutes les fenêtres IdeA se ferment aussi.
|
Quand on ferme la fenetre principale d'IdeA, j'aimerais que toutes les fenêtres IdeA se ferment aussi.
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#40"
|
issueRef: "#40"
|
||||||
version: 5
|
version: 6
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783757857115
|
updatedAt: 1783922451268
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "6b04c8d1-177c-422a-9955-7fee2e8afdeb"
|
id: "6b04c8d1-177c-422a-9955-7fee2e8afdeb"
|
||||||
number: 40
|
number: 40
|
||||||
title: "[UI] réouvrir les fenetres au lancement d'IdeA"
|
title: "[UI] réouvrir les fenetres au lancement d'IdeA"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
||||||
links: [{"target":"#39","kind":"dependsOn"}]
|
links: [{"target":"#39","kind":"dependsOn"}]
|
||||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783757766786
|
createdAt: 1783757766786
|
||||||
updatedAt: 1783757857115
|
updatedAt: 1783922451268
|
||||||
version: 5
|
version: 6
|
||||||
---
|
---
|
||||||
Au lancement d'IdeA, j'aimerais que les fenêtres fermées lors de la précédentes fermeture de la fenêtre principale d'IdeA soient automatiqument réouvertes dans le même status, position, écran que quand elles ont été fermée
|
Au lancement d'IdeA, j'aimerais que les fenêtres fermées lors de la précédentes fermeture de la fenêtre principale d'IdeA soient automatiqument réouvertes dans le même status, position, écran que quand elles ont été fermée
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#41"
|
issueRef: "#41"
|
||||||
version: 4
|
version: 6
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783757942954
|
updatedAt: 1783878363957
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "7d026901-333a-46a6-87f6-7384bf742310"
|
id: "7d026901-333a-46a6-87f6-7384bf742310"
|
||||||
number: 41
|
number: 41
|
||||||
title: "[UI] Selection multiple lors de la selection de tickets pour les sprints"
|
title: "[UI] Selection multiple lors de la selection de tickets pour les sprints"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "low"
|
priority: "low"
|
||||||
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783757895085
|
createdAt: 1783757895085
|
||||||
updatedAt: 1783757942954
|
updatedAt: 1783878363957
|
||||||
version: 4
|
version: 6
|
||||||
---
|
---
|
||||||
Lorsque je selectionne les tickets pour mes sprints, j'iamerais que la selection me permette d'en choisir plusieurs à la fois pour ne pas avoir à réouvrir chaque fois la fenetre.
|
Lorsque je selectionne les tickets pour mes sprints, j'iamerais que la selection me permette d'en choisir plusieurs à la fois pour ne pas avoir à réouvrir chaque fois la fenetre.
|
||||||
6
.ideai/tickets/42/carnet.md
Normal file
6
.ideai/tickets/42/carnet.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
issueRef: "#42"
|
||||||
|
version: 2
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
updatedAt: 1783877612067
|
||||||
|
---
|
||||||
16
.ideai/tickets/42/issue.md
Normal file
16
.ideai/tickets/42/issue.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
id: "239aff64-a131-47eb-9a95-cc56c8c369c6"
|
||||||
|
number: 42
|
||||||
|
title: "[UI] Clarifier les contrôles d'en-tête de panneau (DockControls) — icônes libellées + tooltips alignés sur le menu Panneaux"
|
||||||
|
status: "closed"
|
||||||
|
priority: "low"
|
||||||
|
sprint: null
|
||||||
|
links: [{"target":"#26","kind":"relatesTo"}]
|
||||||
|
agentRefs: []
|
||||||
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
createdAt: 1783862180616
|
||||||
|
updatedAt: 1783877612067
|
||||||
|
version: 2
|
||||||
|
---
|
||||||
|
Refinement UX suite à #26. Remplacer les glyphes peu explicites des en-têtes de panneaux docké/flottant (◧ ◨ ⧉ ⤢ ✕) par des boutons-icônes libellés + tooltips (title natif), alignés strictement sur les libellés du menu Panneaux. Spec UX figé : IconButton existant (@/shared, pas de lib externe, pas de Tooltip custom), ordre [⇤ Ancré à gauche][⇥ Ancré à droite][□ Flottant][↗ Fenêtre détachée][× Fermé] ; title + aria-label "<action> — <titre panneau>" ; placement courant = actif (aria-pressed=true, bg-raised text-content, ring-1 ring-border-strong) et NON désactivé ; "Fenêtre détachée" masqué pour projects et désactivé sans projet actif ; conteneur flex shrink-0 items-center gap-1. Périmètre strict : DockControls dans ProjectsView.tsx uniquement, aucun changement LayoutGrid/LeafView/cellules agents/write-portal/F3/DockRegion/FloatingWindow/ViewWindow.
|
||||||
6
.ideai/tickets/43/carnet.md
Normal file
6
.ideai/tickets/43/carnet.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
issueRef: "#43"
|
||||||
|
version: 1
|
||||||
|
updatedBy: {"kind":"user"}
|
||||||
|
updatedAt: 1783879315858
|
||||||
|
---
|
||||||
15
.ideai/tickets/43/issue.md
Normal file
15
.ideai/tickets/43/issue.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
id: "63e80352-8ce1-4116-9ec3-b4cb3fc5c077"
|
||||||
|
number: 43
|
||||||
|
title: "Systeme de plugins"
|
||||||
|
status: "open"
|
||||||
|
priority: "medium"
|
||||||
|
sprint: null
|
||||||
|
links: []
|
||||||
|
agentRefs: []
|
||||||
|
createdBy: {"kind":"user"}
|
||||||
|
updatedBy: {"kind":"user"}
|
||||||
|
createdAt: 1783879315858
|
||||||
|
updatedAt: 1783879315858
|
||||||
|
version: 1
|
||||||
|
---
|
||||||
25
.ideai/tickets/44/carnet.md
Normal file
25
.ideai/tickets/44/carnet.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
issueRef: "#44"
|
||||||
|
version: 8
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
updatedAt: 1783976073932
|
||||||
|
---
|
||||||
|
## Résolution (2026-07-13)
|
||||||
|
|
||||||
|
Le first-run wizard tourne désormais en deux **modes explicites** passés en argument (jamais inférés de `isFirstRun`) :
|
||||||
|
- `firstRun` : catalogue de référence seul, tout désélectionné, availability inconnue (détection auto pré-coche les CLI installés).
|
||||||
|
- `edit` (rouvert via *Settings ▸ Configure profiles*, `forceOpen`) : les profils déjà configurés reviennent **pré-sélectionnés avec leur vraie config**, en tête ; les profils de référence dont l'`id` est déjà configuré sont **dédupliqués par `profile.id` uniquement** (plusieurs OpenCode locaux partagent command/adapter mais diffèrent par endpoint/model). La détection auto ne touche PAS la sélection initiale (`preselect:false`).
|
||||||
|
|
||||||
|
Logique pure isolée dans `wizardEntries.ts` (`buildWizardEntries`) pour tester les invariants unitairement.
|
||||||
|
|
||||||
|
### Fichiers
|
||||||
|
- `frontend/src/features/first-run/wizardEntries.ts` (+ `.test.ts`) — nouveaux
|
||||||
|
- `useFirstRun.ts` — `mode` param, charge `listProfiles()` en edit via `Promise.all`
|
||||||
|
- `FirstRunWizard.tsx` — `mode = forceOpen ? "edit" : "firstRun"`
|
||||||
|
- `FirstRunWizard.test.tsx` — étendu
|
||||||
|
|
||||||
|
### QA — vert
|
||||||
|
`npx vitest run wizardEntries.test.ts FirstRunWizard.test.tsx` → 37 passed ; `npx tsc --noEmit` → exit 0.
|
||||||
|
|
||||||
|
### Git
|
||||||
|
Commit `8cdc44d` sur `feature/ticket44-firstrun-keep-profile-info` (base develop), mergé `--no-ff` vers `develop` (`c67ec4f`). Aucune action sortante.
|
||||||
16
.ideai/tickets/44/issue.md
Normal file
16
.ideai/tickets/44/issue.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
id: "d7c17017-f6fb-4e55-8119-8fbc42641f48"
|
||||||
|
number: 44
|
||||||
|
title: "Garder les infos du profils courant sur l'affichage d'edition des profiles"
|
||||||
|
status: "closed"
|
||||||
|
priority: "medium"
|
||||||
|
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
|
||||||
|
links: []
|
||||||
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
|
createdBy: {"kind":"user"}
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
createdAt: 1783879634794
|
||||||
|
updatedAt: 1783976073932
|
||||||
|
version: 8
|
||||||
|
---
|
||||||
|
Si je vais dans l'edition des profiles, le pré-remplissage des profiles ne correspond pas aux profiles existants. C'est a dire que par exemple pour le profiles OpenCode, j'aimerais que si j'en ai déjà un de créé, celui (ou ceux d'affichés) correspondent à celui ou ceux qui existent déjà.
|
||||||
6
.ideai/tickets/45/carnet.md
Normal file
6
.ideai/tickets/45/carnet.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
issueRef: "#45"
|
||||||
|
version: 6
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
updatedAt: 1783925599109
|
||||||
|
---
|
||||||
16
.ideai/tickets/45/issue.md
Normal file
16
.ideai/tickets/45/issue.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
id: "b4e30445-b972-400a-879f-193c9c7aa10e"
|
||||||
|
number: 45
|
||||||
|
title: "[Bug] Erreur OpenCode au lancement IdeA"
|
||||||
|
status: "closed"
|
||||||
|
priority: "medium"
|
||||||
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
|
links: []
|
||||||
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
|
createdBy: {"kind":"user"}
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
createdAt: 1783920311014
|
||||||
|
updatedAt: 1783925599109
|
||||||
|
version: 6
|
||||||
|
---
|
||||||
|
Quand je lance IdeA avec un layout qui contient opencode, j'ai un beandeau d'erreur dans la cellule opencode qui dit : Échec du lancement de l'agent : model server error (port_occupied): port occupied: 8080. Par contre si je relance une cellule une fois IdeA lancé, ça fonctionne et la cellule s'affiche correctement.
|
||||||
6
.ideai/tickets/46/carnet.md
Normal file
6
.ideai/tickets/46/carnet.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
issueRef: "#46"
|
||||||
|
version: 6
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
updatedAt: 1783939380889
|
||||||
|
---
|
||||||
16
.ideai/tickets/46/issue.md
Normal file
16
.ideai/tickets/46/issue.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
id: "1fe837f0-bc97-4b8e-945e-940fdd3c0249"
|
||||||
|
number: 46
|
||||||
|
title: "[Bug] Plus de boutons pour ajouter un projet en onglet"
|
||||||
|
status: "closed"
|
||||||
|
priority: "low"
|
||||||
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
|
links: []
|
||||||
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
|
createdBy: {"kind":"user"}
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
createdAt: 1783923416403
|
||||||
|
updatedAt: 1783939380889
|
||||||
|
version: 6
|
||||||
|
---
|
||||||
|
Il manque un bouton + dans la barre des onglets des projets pour pouvoir ajouter un projet en onglet
|
||||||
6
.ideai/tickets/47/carnet.md
Normal file
6
.ideai/tickets/47/carnet.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
issueRef: "#47"
|
||||||
|
version: 6
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
updatedAt: 1783939089770
|
||||||
|
---
|
||||||
16
.ideai/tickets/47/issue.md
Normal file
16
.ideai/tickets/47/issue.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
id: "0591d2d3-b03e-41bc-8c6b-349fc4ddf1a5"
|
||||||
|
number: 47
|
||||||
|
title: "[Bug] Réouverture de fenêtres non lié au projet"
|
||||||
|
status: "closed"
|
||||||
|
priority: "medium"
|
||||||
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
|
links: []
|
||||||
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
|
createdBy: {"kind":"user"}
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
createdAt: 1783923465694
|
||||||
|
updatedAt: 1783939089770
|
||||||
|
version: 6
|
||||||
|
---
|
||||||
|
Si je suis sur un projet A, et que j'ouvre par exemple le panneau des agents. Si je ferme IdeA et que je réouvre IdeA, comme convenui j'ai ma fenêtre des agents qui s'affiche. Mais il m'affiche directement les agents de mon projet A, alors que je n'ai encore ouvert aucun projet. J'aimerais alors qu'il ne m'affiche rien avec juste un message qui me demande d'ouvrir un projet pour qu'il puisse afficher ce qu'il faut dedans et que ça soit toujours lié au projet en focus
|
||||||
6
.ideai/tickets/48/carnet.md
Normal file
6
.ideai/tickets/48/carnet.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
issueRef: "#48"
|
||||||
|
version: 6
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
updatedAt: 1783924961311
|
||||||
|
---
|
||||||
16
.ideai/tickets/48/issue.md
Normal file
16
.ideai/tickets/48/issue.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
id: "0e449e11-2af9-47ca-83da-03568d9af100"
|
||||||
|
number: 48
|
||||||
|
title: "[Bug] Bandeau d'affichage d'erreur au dessus des boutons de gestion de cellule"
|
||||||
|
status: "closed"
|
||||||
|
priority: "medium"
|
||||||
|
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||||
|
links: []
|
||||||
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
|
createdBy: {"kind":"user"}
|
||||||
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
|
createdAt: 1783923674564
|
||||||
|
updatedAt: 1783924961311
|
||||||
|
version: 6
|
||||||
|
---
|
||||||
|
Les bandeaux d'affichage d'erreur de cellule passent par dessus les boutons de changement d'agent, de split de cellule ou de fermeture de cellule ce qui rend la gestion de la cellule impossible s'il y a une erreur. Il faudrait que les boutons soient par dessus le bandeau d'erreur pour être accessibles
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user