Repository navigation
fix(evals): fail an eval run whose every Bash call failed - #10096
Conversation
The session started check found a sandbox that never started only by one Claude Code error string, so a reworded message would let no-shell runs pass. It now also fails a run of 2 or more Bash calls that all failed. Across 206 kept eval traces on this host, 0 of 14 healthy short-TMPDIR runs matched, while 97 of 123 default-/tmp runs did: their commands run but every call reports a failure under the read-only temp directory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
claude-security-review reviewed Incremental review of The change adds The behavior change is that denied Bash calls no longer trigger the "every Bash call failed" invalid-run signal. They are still judged by No trusted-path files changed in this increment, and there are no manifest changes. The PR context contained no embedded directives. critical-findings: 0 |
|
claude-review reviewed Incremental review of 8bba027 against c47e8ad: no findings. The change extracts
Spend: none beyond ordinary lane review runs. |
A denied Bash call is also an is_error result, so a run whose Bash calls were all denied failed session started outright and bypassed the permission denials check's warning path. Denied calls now count toward neither the call nor the failure total, and denials() and shell_failure share one is_denial predicate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No related issue: owner-approved follow-up to #10077 (session 2026-10-25, Q2 option a)
Summary
The
session startedcheck (#10077) found a sandbox that never started only by matching one Claude Code error string, so a reworded message would let no-shell runs pass as VALID again. This adds a second signal that does not depend on any wording: a run with 2 or more Bash calls, every one failed.Fix
run-validity.py:sandbox_failedbecomesshell_failure, which returns a reason. It returns the sandbox-start text when present, else "all N Bash calls failed" when a run made at leastMIN_BASH_CALLS(2) Bash calls and every one came backis_error. A lone failed call (such as agrepthat matches nothing) does not count.Verification
run-validity.test.sh: 59 tests OK. The new INVALID test failed before the change./tmpruns did. Their commands run but reportExit code 1under the read-only temp directory ([BUG] plugin eval: sandbox denies every write in the agent's workspace — //tmp denyWrite covers the /tmp/claude-eval-* root anthropics/claude-code#104631), so the check also catches that broken class, which the gate passed before.Related
🤖 Generated with Claude Code