fix(application): writable roots Codex corrects sur projets non-IdeA quel que soit le mode de lancement — #309 (QA verte)
cause: la politique de lancement Codex divergeait selon le chemin de composition. compile_codex_launch_policy ajoutait les roots extra (temp géré) AVANT de calculer le mode de sandbox, et le builder PTY (append_codex_pty_managed_temp_roots) n'appliquait QUE ces roots temp, ignorant project root et politique compilée ; sans permissions explicites, codex_permission_writable_roots renvoyait une liste vide, donc le premier lancement TUI partait sans --add-dir project root et rejetait les roots additionnels (« Error adding directories: Ignoring --add-dir … because the effective permissions do not allow additional writable roots ») ; un --add-dir <project root> préexistant dans spec.args n'était pas réconcilié, d'où des comportements différents entre first-run, stop/relaunch, CLI custom et délégation headless — invisible sur le projet IdeA lui-même du fait de ses permissions déjà configurées. fix: codex_permission_writable_roots retourne par défaut le project root quand aucune permission explicite n'est configurée (jamais vide si root non vide) ; compile_codex_launch_policy n'ajoute les roots extra qu'en mode workspace-write et reste vide en read-only (deny explicite ne gagne jamais project root ni temp géré) ; nouveau apply_codex_pty_launch_policy unique source de vérité PTY Codex — réécrit la valeur --sandbox existante ou l'ajoute, draine le --add-dir <project root> préexistant puis pose les roots compilés dédupliqués, composition identique pour first-run, relaunch, custom CLI et headless ; unconfigured_policy_writes_project_and_deduplicated_managed_temp, explicit_write_deny_never_gains_project_or_managed_temp_root, partial_allow_exposes_only_its_computed_rw_grant + tests lifecycle de réécriture d'args ajoutés. QA verte: cargo targeted tests OK, npm targeted/typecheck OK — reconfirmée par Git: git diff --check OK, cargo fmt --all -- --check OK, cargo test -p application --lib codex_permissions 3/3, cargo test -p application --lib lifecycle 48/48. fichiers .ideai/* (agents/test.md, chat-drafts.json, system-permissions.json, tickets/counter.json, tickets/index.json, tickets/308/, tickets/309/), attachments/ et scripts/ hors périmètre et préservés en worktree ; aucun push. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -4342,9 +4342,16 @@ async fn codex_network_env_is_projected_without_filesystem_permission_policy() {
|
||||
.contains("[sandbox_workspace_write]\nnetwork_access = true")),
|
||||
"network policy must still update Codex config without filesystem/bash policy"
|
||||
);
|
||||
let args = &pty.spawns()[0].args;
|
||||
assert!(
|
||||
!pty.spawns()[0].args.contains(&"--sandbox".to_owned()),
|
||||
"no filesystem/bash policy means no Codex sandbox args are folded"
|
||||
args.windows(2)
|
||||
.any(|pair| pair == ["--sandbox", "workspace-write"]),
|
||||
"Codex runs from its isolated run dir, so an unconfigured project still needs an explicit workspace-write mode: {args:?}"
|
||||
);
|
||||
assert!(
|
||||
args.windows(2)
|
||||
.any(|pair| pair == ["--add-dir", "/home/me/proj"]),
|
||||
"the real project root must be writable on the first PTY spawn: {args:?}"
|
||||
);
|
||||
assert_eq!(
|
||||
pty.spawns()[0]
|
||||
@ -4396,6 +4403,15 @@ async fn codex_projection_forwards_network_env_to_structured_session_factory() {
|
||||
"structured launch output is populated"
|
||||
);
|
||||
assert_eq!(factory.envs().len(), 1, "exactly one structured launch");
|
||||
assert_eq!(
|
||||
factory.policies(),
|
||||
vec![Some(domain::ports::StructuredProviderLaunchPolicy::Codex {
|
||||
sandbox_mode: "workspace-write".to_owned(),
|
||||
writable_roots: vec!["/home/me/proj".to_owned()],
|
||||
network_access: true,
|
||||
})],
|
||||
"unconfigured structured Codex must receive the project root because cwd is the run dir"
|
||||
);
|
||||
assert_eq!(
|
||||
factory.envs()[0]
|
||||
.iter()
|
||||
|
||||
Reference in New Issue
Block a user