Capitalise la mémoire projet accumulée pendant les chantiers B7/B8 (tâches de fond first-class), le système de tickets V1 et le ticket #1 : design, cadrages d'archi, checkpoints d'avancement et verdicts QA/frontend. Mise à jour de l'index MEMORY.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.6 KiB
name, description, metadata
| name | description | metadata | ||
|---|---|---|---|---|
| workstate-background-tasks-projection-fix | Décision d'archi pour rendre visibles Cancel/Retry dans le panneau Work — extension du read-model GetProjectWorkState, contrat DTO et borne de livraison. |
|
Défaut : AgentWorkState (crates/application/src/workstate/mod.rs:140) ne portait pas les tâches de fond et GetProjectWorkState n'avait pas de dépendance BackgroundTaskStore. Le panneau Work masque la section (ProjectWorkStatePanel.tsx:638, agent.backgroundTasks.length > 0) → aucun bouton Cancel/Retry en live. Le frontend était déjà entièrement câblé (normalizeAgent/normalizeBackgroundTask), il ne manquait que la projection backend.
Décision (frontière) : étendre le read-model unique — ajouter background_tasks: Vec<AgentBackgroundTaskState> à AgentWorkState et brancher BackgroundTaskStore via un builder best-effort with_background_tasks(store) (calqué sur with_conversation_sources), None ⇒ zéro régression. Pas de fetch séparé côté front (garderait la jointure tâche→agent hors du domaine, casserait l'instantané cohérent, dupliquerait les cycles async). Aucun nouveau port/adapter. list_background_tasks (B7) reste comme read-model autonome, hors chemin du panneau.
Contrat : AgentBackgroundTaskState = miroir de BackgroundTaskDto (dto.rs:2886) sans owner/project. Projection dans execute = union list_open_for_agent(agent.id) (per-agent, running/queued/waiting) + list_undelivered_completions() (chargé UNE fois avant la boucle, dispatché par owner_agent_id, pour failed/cancelled → Retry). Best-effort strict : erreur store ⇒ Vec::new() pour l'agent, jamais d'AppError (live/busy/tickets intacts).
Borne V1 assumée : une tâche terminale déjà livrée (wake tiré, completion_delivered=true) n'est plus énumérable (droppée des deux listes) → disparaît du panneau ; Retry seulement dans la fenêtre non-livrée. Conforme à la note « retry session-scoped V1 » de RetryBackgroundTask (background/mod.rs:212). Historique Retry persistant = V2 (ajouterait list_recent_terminal_for_agent au port), ticketable si besoin.
Wiring : .with_background_tasks(state.background_task_store.clone()) dans crates/app-tauri/src/state.rs (ancre b7-wiring-anchor-state-rs) ; le store y est déjà managé (utilisé par list_background_tasks). Lié à b8-in-app-trigger-run-in-background, b8-command-runner-pty-framing, background-tasks-first-class-design, checkpoint-t1-wake-delivery-bug-fixed-rebuild-pending.