Files
IdeA/.ideai/memory/workstate-background-tasks-projection-fix.md
Blomios ebd992e41a docs(memory): notes projet tâches de fond, tickets V1 et checkpoints ticket #1
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>
2026-07-04 00:21:43 +02:00

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.
type
reference

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.