--- id: "33a844e0-6a06-46c7-b800-d3497a7f45f4" number: 94 title: "Permissions OpenCode ignorées : opencode.json code en dur bash/edit=ask au lieu de projeter EffectivePermissions" status: "closed" priority: "high" sprint: null links: [] agentRefs: [] createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} createdAt: 1784821271815 updatedAt: 1784823278030 version: 2 --- ## Bug Les permissions configurées dans IdeA pour un agent sous profil OpenCode ne sont PAS appliquées dans le `opencode.json` généré. Le bloc `permission` est codé en dur à `{"bash":"ask","edit":"ask"}` quel que soit le réglage IdeA. ## Repro Config IdeA (agent OpenCode) : Read=Allow, Write=Deny, Delete=Allow, bash=Allow. `opencode.json` généré (run dir) : `"permission":{"bash":"ask","edit":"ask"}`. Attendu : `bash` reflète la posture bash (Allow→"allow"), `edit` reflète la posture Write (Deny→"deny"). Claude et Codex appliquent correctement les permissions ; seul OpenCode est touché. ## Cause racine Le pattern de projection des permissions (`PermissionProjector` + `ProjectorKey::{Claude,Codex}` dans `crates/infrastructure/src/permission/`) est bypassé pour OpenCode. Les générateurs `opencode.json` codent `permission` en dur à 4 endroits : - `crates/application/src/agent/lifecycle.rs:2728-2734` (`opencode_config_json`, variante llamacpp) - `crates/application/src/agent/lifecycle.rs:2814-2820` (`opencode_provider_config_json`, variante cloud) - `crates/infrastructure/src/assistant/mod.rs:406-412` (`opencode_config_json`, doublon) - `crates/infrastructure/src/assistant/mod.rs:494-500` (`opencode_provider_config_json`, doublon) Les call sites (`lifecycle.rs:2361-2378` branche `OpenCodeConfig`, et `assistant/mod.rs:247-256`) ne passent pas les `EffectivePermissions` résolues aux générateurs. ## Mapping attendu (à confirmer par Architect) OpenCode `permission` = map tool→"allow"|"ask"|"deny". IdéA → OpenCode : - `bash` ← posture bash effective - `edit` ← posture Write effective - Read/Delete ne sont pas exprimables dans opencode (pas de clé read/delete) — déjà enforcees par le sandbox Landlock (mémoire `permissions-sandbox-system-state`). ## Périmètre Backend Rust pur. Validation possible par tests unitaires sur les générateurs (`opencode_provider_config_json` est déjà testé à lifecycle.rs:4413 et assistant/mod.rs:639) sans rebuild AppImage. Validation live = rebuild AppImage + relance IdeA.