Conversation
…ly on transport errors Under promptfoo 0.122.0 every assertion-failed row carries .error (the assertion message) AND failureReason: 1, so the old .error-based FAULT heuristic excluded REAL assertion failures from scoring as transport faults: a 4-pass/1-real-fail scenario read "[OK] 4/4 valid = 1.00 (1 FAULT excluded)" — the exact counterfeit green the gate exists to prevent (observed on PR #93's live routing run). Fix: classify on failureReason, the reliable discriminator. A row is a FAULT only when failureReason == 2/"error", or when it carries an error signal with NO failureReason recorded (legacy fallback for shapes that predate the field); failureReason == 1 is a real FAIL scored against the floor even when .error is present. All fail-closed properties preserved: non-pass with no signals stays FAIL, all-FAULT starvation stays STARVED, floors/min-runs/grouping untouched. Cheap-tier §18 fixtures move to the real 0.122 row shape and gain a new mutation check: a real assertion failure carrying .error must be scored as FAIL, not excluded as FAULT (proven red against the pre-fix script). docs/testing.md statistical-spine prose updated per the standing order; the machine LIVE-INVENTORY block is unchanged (no tier added/removed). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NsPQTo67oovz8ogirsH6uL
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. |
|
Status: intentionally held red. The failing check is Nothing here will be weakened to get green. Plan (owner-approved): two skill-hardening PRs — one per pack, prose changes only where the grader reasons point, each porting this PR's pass-rate fix so it validates on the honest gate, each carrying a real before/after demonstration comment — merge first; this PR then re-runs and merges (or closes as superseded if its diff has fully landed via the ports). PR #93 also ports the fix so its composition run scores truthfully. Generated by Claude Code |
…S4 guard set, proceed definition (run 33342419465) Ported PR #94's pass-rate.sh fix first (cherry-pick b876bb2): FAULT now keys on failureReason, so real assertion failures score against the 0.8 floor instead of being excluded — on the previous head every failing row was FAULT-excluded and scenarios only went red by starvation. Run 33342419465 pass-rate data: routing STARVED (all rows failed) on S4, prove-the-undo, egress-gate, stop-rule; semver-gate 1/5; everything else OK. Trajectory T1 1/5 (proceed=yes rows); T2/T3a/T3b/T4 OK. Owner-approved decisions applied: 1. Migrated single-skill scenarios (prove-the-undo, egress-gate, stop-rule, semver-gate, docs-hygiene, find-before-build, grill-me, tracer-bullets) pin ONLY specialist=<name>; envelope/guards/interaction_owner accept any validator-legal value — route-contract.js still enforces all 8 coherence rules on every row. Legacy rows test routing precedence; composition is tested by S1-S4, which keep every slot pinned (S1/S4 guards required- subset, S2 exact). Calibration negatives and S3 stay fully all-none exact. semver-gate's interaction_owner=semver-gate answers become legal under this rule (no relabel needed). 2. S4 required guard set is prove-the-undo only (extras allowed): with the strengthened request the model expressed "explicit sign-off" as interaction_owner=redgate on 5/5 rows and carried semver-gate as a guard on 0/5 — a data-driven relabel; specialist/envelope/owner stay pinned. 3. Trajectory prompt defines proceed precisely: yes means TRACE/ implementation may begin now; taking the next protocol step (ARM, asking the human, raising/holding a gate) is proceed=no. T1's label stays proceed=no; its frozen prefix already reads consistently ("I'll set up the run directory next" / "go build it"). Beyond the approved list, one generic hedge: the prompt now also asks for the STEP: line exactly once as the final line — five trajectory rows failed with a correct-looking line, which the contract can only do on a duplicated STEP: line or trailing text (cause unverifiable without the artifact); flagged in the PR body, revert if unwanted. Tests: route-contract.test 72/0 (legacy regexes accept the live modal compositions and still reject wrong-specialist / slot-placement misses; a permissive legacy regex matching an incoherent tuple is still rejected by the contract; S4 rejects a guard list without prove-the-undo; S2 with a guard still fails; S1 legacy-string negative control intact), step-contract.test 42/0 (prompt carries the proceed definition). docs/ testing.md routing entry updated per the standing order. Gates: cheap 1183/0, counterfeits 22/0, branch protection in sync, behavior-surfaces in sync, both configs promptfoo-valid. Addresses #88 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NsPQTo67oovz8ogirsH6uL
…ry inspect Under the honest pass-rate gate (ported from #94), the behavioral pack's "just write the persona file" scenario scored 0/3. All three failing rows shared one shape: the subject declined the freehand persona, fired registry `inspect` calls, and stopped — never asking for or stating an effect ceiling (rubric b) and never showing the draft AgentQuery (rubric c). Two prose additions, no rule weakened: - boundary rule: a "just write the persona file" request is an agent-building request; decline and normalize in the same reply. - workflow step 1: ceiling first, in plain words, BEFORE inspect/compile (ask read-only scm:read vs. commenting scm:write, or state the ceiling); then show the draft query JSON with placeholders; inspect calls refine the draft and never replace showing it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NsPQTo67oovz8ogirsH6uL
…nest statistical gate Integration PR carrying: the pass-rate failureReason classification fix (supersedes #94), the redgate landing/destruction MAJOR-gate and red-first hardening, and the agent-compiler ceiling-first prose (supersedes #96). Full fleet green on 4964a8b (run 33592901839): all 13 behavioral packs, routing, cheap, counterfeit, install, deep, scale.
|
Superseded by #95, now merged into Generated by Claude Code |
Resolves the overlap in evals/paid/pass-rate.sh and the cheap self-test in evals/cheap/run.sh by taking main's version: the branch carried the #94 gate-fix cherry-pick, and main now carries that fix plus the narrower .error fallback (FAULT only when failureReason is absent) with its red-first fixture. This branch's own sections are unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NsPQTo67oovz8ogirsH6uL
Resolves the overlap in evals/paid/pass-rate.sh and the cheap self-test in evals/cheap/run.sh by taking main's version: the branch carried the #94 gate-fix cherry-pick, and main now carries that fix plus the narrower .error fallback (FAULT only when failureReason is absent) with its red-first fixture. This branch's own sections are unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NsPQTo67oovz8ogirsH6uL
The defect (fail-open, found live)
evals/paid/pass-rate.shclassified any row carrying a non-empty.errorstring as a FAULT (transport error, excluded from the floor). Under promptfoo 0.122.0 every assertion-failed row ALSO carries.error— the assertion message — alongsidefailureReason: 1. So every real rubric failure was being excluded from scoring as if the model call had 504'd: failures laundered as weather, and a failing run read green. This is the exact counterfeit-green shape the gate exists to prevent.Reproduced 0.122 row shape (echo provider, deliberately failing regex, offline)
Red proof — pre-fix script on a 4-pass/1-real-fail fixture (real 0.122 shape), floor 0.9
A 4/5 = 0.80 scenario passes a 0.90 floor because the real fail was excluded as a FAULT.
Green proof — fixed script on the same fixture
The fix
failureReasonis the discriminator (promptfoo enum: 0 none, 1 assertion, 2 error):failureReason == 2or"error"→ FAULT (excluded)failureReason == 1→ real FAIL, scored against the floor, even when.erroris present.erroralone → FAULT only when the row carries nofailureReason(legacy fallback for result shapes that predate the field)Every fail-closed property preserved: a non-pass with no signals stays FAIL; all-FAULT starvation stays STARVED; floors,
--min-runs/--min-valid, and grouping untouched. Header comment block updated to document the new heuristic.Cheap-tier self-test (evals/cheap/run.sh §18)
Fixtures moved to the real 0.122 row shape (passing rows:
failureReason: 0, error: null; assertion fails:failureReason: 1+.errormessage; transport faults:failureReason: 2+ provider error). All five existing checks still prove their properties, plus a new check: a real assertion failure carrying.erroris scored as FAIL, not excluded as FAULT.New check proven RED against the pre-fix script first:
And green in the cheap tier after the fix:
docs/testing.md
Statistical-spine prose updated per the standing order: FAULT classification is
failureReason-based,.erroralone only as the legacy fallback. The machine LIVE-INVENTORY block is unchanged (no tier added/removed/renamed) — thetesting-doc driftcheap check confirms it matches the live inventory.Gates
Impact on PR #93
PR #93's routing runs to date were floor-soft under the old heuristic — any real assertion failures in those runs were excluded as FAULTs, so its greens do not prove the floor was met. #93 must re-run its routing eval after this merges.
Found during #88's live run (PR #93); hardens the spine documented in docs/testing.md.
🤖 Generated with Claude Code
Generated by Claude Code