--- issueRef: "#25" version: 11 updatedBy: {"kind":"user"} updatedAt: 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 --workspace` VERT (app-tauri 63, application 80, infrastructure 254, domain OK). - Test ciblé : `factory.start` reçoit `SessionPlan::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.