I1: run paid eval containers with seccomp unconfined so Codex's sandbox can start

Docker's default seccomp profile blocks the user namespaces bubblewrap needs,
so every Codex command in a paid eval failed with 'bwrap: No permissions to
create a new namespace' (codex-review-findings, run 37151477069). Reproduced
in the CI image locally: default profile fails, seccomp=unconfined runs the
command. The runner stays non-root.
This commit is contained in:
garrytan committed 2026-10-03 22:23:57 +00:00
1 parent 3a13b6d0c0
commit ec97187d96
4 files changed
+14 -5

No files matched your search

+3 -1
View File
@@ -129,7 +129,9 @@ jobs:
credentials: credentials:
username: ${{ github.actor }} username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
options: --user runner # Docker's default seccomp profile blocks the user namespaces Codex's
# bubblewrap sandbox needs; without them every Codex command fails.
options: --user runner --security-opt seccomp=unconfined
strategy: strategy:
fail-fast: false fail-fast: false
max-parallel: 8 max-parallel: 8
+6 -2
View File
@@ -161,7 +161,9 @@ jobs:
credentials: credentials:
username: ${{ github.actor }} username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
options: --user runner # Docker's default seccomp profile blocks the user namespaces Codex's
# bubblewrap sandbox needs; without them every Codex command fails.
options: --user runner --security-opt seccomp=unconfined
strategy: strategy:
fail-fast: false fail-fast: false
# Every planned slice starts at once; test/evals-workflow-wiring.test.ts # Every planned slice starts at once; test/evals-workflow-wiring.test.ts
@@ -299,7 +301,9 @@ jobs:
credentials: credentials:
username: ${{ github.actor }} username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
options: --user runner # Docker's default seccomp profile blocks the user namespaces Codex's
# bubblewrap sandbox needs; without them every Codex command fails.
options: --user runner --security-opt seccomp=unconfined
strategy: strategy:
# Two file workers per slice, each retaining two in-file case workers. # Two file workers per slice, each retaining two in-file case workers.
fail-fast: false fail-fast: false
+3 -1
View File
@@ -222,7 +222,9 @@ jobs:
credentials: credentials:
username: ${{ github.actor }} username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
options: --user runner # Docker's default seccomp profile blocks the user namespaces Codex's
# bubblewrap sandbox needs; without them every Codex command fails.
options: --user runner --security-opt seccomp=unconfined
strategy: strategy:
fail-fast: false fail-fast: false
max-parallel: 16 max-parallel: 16
+2 -1
View File
@@ -27,7 +27,8 @@ test('every direct CI paid executor binds a safe unique run/attempt/job/slice id
]); ]);
const ids = new Set<string>(); const ids = new Set<string>();
for (const [workflowIndex, { job, step }] of executors.entries()) { for (const [workflowIndex, { job, step }] of executors.entries()) {
expect(job.container.options).toBe('--user runner'); // Non-root, and Codex's bubblewrap sandbox can create user namespaces (periodic run 37151477069).
expect(job.container.options).toBe('--user runner --security-opt seccomp=unconfined');
const env = { ...job.env, ...step.env }; const env = { ...job.env, ...step.env };
expect(env.EVALS_RUN_ID).toBeString(); expect(env.EVALS_RUN_ID).toBeString();
for (const run of ['36302678692', '36302678693']) { for (const run of ['36302678692', '36302678693']) {