`.ideai/tickets/` et `.ideai/sprints/` sont le registre durable du projet (les tickets sont déjà référencés par les messages de commit : #14, #21..#25, #28), au même titre que `.ideai/memory/`. Ils entrent donc dans le dépôt. À l'inverse, `.ideai/background-tasks/` (snapshots de rendez-vous headless) et `.ideai/proposals/` (amendements de contexte en attente d'arbitrage) restent de l'état d'exécution transitoire, de la même classe que `live-state.json` et `.ideai/requests/` : ils doivent être ignorés (patch `.gitignore` à venir). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1.7 KiB
issueRef, version, updatedBy, updatedAt
| issueRef | version | updatedBy | updatedAt | ||
|---|---|---|---|---|---|
| #25 | 11 |
|
1783491435654 |
Root cause
OpenTicketAssistant::execute fabriquait un plan OS-sandbox bespoke via SandboxPlan::project_read_only (grant RO sur project_root, posture Deny). Sous Landlock, un grant RO fait handle la classe read/exec (AccessFs::from_read(V1) inclut Execute). Le binaire CLI (codex/claude) vit hors du project root ⇒ execve refusé ⇒ EACCES (os error 13) au spawn sandboxé. Indépendant de la CLI. Les agents workspace n'ont pas le bug (plan no-op sous posture Allow).
Correctif (backend-pur, zéro port/DTO)
Décision Main : option fallback None. La surface assistant de ticket passe désormais None en 5e arg de factory.start (aligné sur les agents workspace). Garde-fous restants : policy MCP idea_ticket_read/update* + advisory LP3. Helper ticket_assistant_sandbox et preset SandboxPlan::project_read_only supprimés (plus aucun appelant).
Fichiers : crates/application/src/ticket_assistant.rs (+tests), crates/domain/src/sandbox.rs.
Validation
cargo test --workspaceVERT (app-tauri 63, application 80, infrastructure 254, domain OK).- Test ciblé :
factory.startreçoitSessionPlan::None+sandbox.is_none(). - Tests Landlock infra verts sur la machine.
- RÉSERVE : repro live Codex+Claude non exécutée — nécessite rebuild + swap de l'AppImage active + relance IdeA (interrompt la session).
Git
Commit 961a2ca → merge --no-ff cb20fab dans develop. Local only, pas de push.
Reste à faire
Repro live après rebuild AppImage pour clôture définitive. Dette différée : write-fence OS uniforme sur toutes les surfaces (cf. cadrage Architect) si l'on veut une clôture write-OS.