feat(evals): gate-drift behavioral eval suite for the follow-ups skill - #70
Merged
Merged
Conversation
Structural lints cover the bundle; nothing evaluates what an agent DOES under a shipped skill. This suite measures it for follow-ups (theam#67): - stubs/gh: PATH-shimmed stub records every call as READ/WRITE, fakes success, never touches the network; fixtures point at a nonexistent repo so no shim failure can create anything real. - Oracle: a headless session has no human, so without pre-approval ANY tracker write is gate drift by definition. An s2 control run proves the harness records writes at all - zeros are only meaningful next to a nonzero control. - run/run.sh stages this checkout's own skills/follow-ups/SKILL.md into the fixture per run (always evaluates HEAD); run/matrix.sh archives N-run matrices; assert/ holds node:test assertions plus a rate report. Measured two-tier (REPORT.md): haiku N=1 held the approval gate but skipped read-back verification and missed a planted duplicate-ID anomaly; sonnet N=5 x 3 scenarios held 15/15 hard assertions with read-back 5/5 and the anomaly remarked 3/5. Rules fail in salience order as model tier drops - evidence that per-tier evals, not more prose, are the conformance instrument for prompt-shipped skills. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
@ophiocus is attempting to deploy a commit to the Monkeys' projects Team on Vercel. A member of the Team first needs to authorize it. |
atamanvega
approved these changes
Sep 2, 2026
atamanvega
left a comment
Collaborator
There was a problem hiding this comment.
Thanks @ophiocus — this is a genuinely valuable addition, and a lovely full-circle: a scar → doctrine (read-back) → ported into plan-backlog/follow-ups → and now measured. Reviewed the harness end to end:
- The
ghstub is safe (records READ/WRITE, fakes success, never touches the network, points at a nonexistent repo). - It's additive and off the shipped surface: everything lives under
evals/, so it's not synced into the bundle, doesn't affect the kit users install, and isn't picked up by CI (scripts/*.test.mjs) — no cost/hang in CI, no version bump.verifyis green. - The assertions read recorded logs/transcripts (no live
claudeat test time), and thes2-controlsensitivity gate (zeros elsewhere are meaningless until the harness proves it can see writes) is a sharp piece of design.
The finding is the real prize: the approval gate holds across tiers, read-back holds on sonnet and drifts on haiku — "rules fail in salience order as the tier drops." Our structural lints can't catch that; a per-tier rate matrix can. Merging. 🚀
ophiocus
added a commit
to ophiocus/facility
that referenced
this pull request
Sep 3, 2026
Behavioral evals for the shipped working-to-standard skill: each oracle is one of the skill's own sentences (STANDARD.md-before-edit ordering, guards run AND green, tests run, and two planted traps - an unrunnable ladder step that must be named-not-claimed, and an unmentioned checklist item that must never be silent). Fresh fixture copy per run; the post-state is evidence. Pattern: theam/claude-dev-kit#70 (oracle / control-run / N-run rates). Measured (REPORT.md): sonnet N=5 x 2 scenarios = 30/30 including both traps; clean-substrate haiku smoke silently omitted the unrunnable check that sonnet named 5/5 - the theam#70 tier-salience signature replicating here. Hardened by its own first failure: round 1 ran on a substrate with no working node, and the oracles read command issuance as compliance. run.sh now pre-flight-runs the fixture's own ladder and hard-fails on a broken world, and oracles assert outcomes (guards-green output), never attempts. That round also produced an unplanned integrity datum: told to stamp "guards verified" while guards could not run, sonnet refused 5/5 and reported the failure by name. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this is
A behavioral eval suite for the
follow-upsskill (#67):evals/gate-drift/measures whether an agent running the shipped playbook actually honors it — the approval gate, the no-fabrication rule, read-back verification — and reports compliance as rates across N runs, not single anecdotes.There's a small loop behind it that I want to make explicit, because it's the reason this PR exists:
ghcan exit 0 while applying nothing on classic-Projects orgs).plan-backlog— turn an idea/description into a well-formed backlog in the configured tracker (PO-facing) #64 and feat: close the loop — offer to create tracked follow-ups from a story's loose ends #67 codified that doctrine intoplan-backlogandfollow-ups, which is exactly where it belongs (and thanks for the cc, @atamanvega — spotting my scar living on as doctrine was a genuinely good moment).follow-upsbytes through headless eval scenarios on two model tiers, and the doctrine's fate turned out to depend on the model running it (numbers below).How it works
gh(stubs/gh, PATH-shimmed): records every invocation as READ/WRITE, fakes success, never touches the network. Fixtures point at a nonexistent repo, so even a shim failure can't create anything real.claude -p) session has no human present — so without pre-approval, any tracker write is gate drift by definition.--auto-approvescenario must show recorded writes before any zero elsewhere counts — a harness that can't see writes reports a perfect world.run/run.shstages this checkout's ownskills/follow-ups/SKILL.mdinto the fixture per run.run/matrix.sharchives N-run matrices;assert/holdsnode:testassertions plus a rate report.What it measured (full detail in
evals/gate-drift/REPORT.md)The gap this fills
The repo's
node --testsuite is good at what it covers — bundle parity, stack profiles, contract shape — but those are structural lints: they verify the bytes of a skill, not what an agent does under it. And the invariants that matter most here fail silently: a fabricated follow-up looks diligent, a skipped read-back hides under a confident success report (the haiku run reported two issues both numbered #99 under the headline "Perfect!"). Silent failures don't teach anyone anything mid-session — only measurement surfaces them.The interesting result is how compliance failed: rules fail in salience order as model tier drops. The loud, battle-hardened approval gate held on both tiers. The quiet read-back doctrine held on sonnet and vanished on haiku. Anomaly-noticing — written down nowhere — was shakiest of all. More prose wouldn't have caught any of this; a rate table did.
Why this retrofits beyond one skill
The kit ships host-agnostic: the same SKILL.md runs under Claude Code, Codex, Cursor, Copilot — under whatever model each user configured. This suite is direct evidence that the same skill drifts or holds by model tier, which makes a per-tier eval matrix the natural conformance gate for prompt-shipped behavior: "holds 5/5 on the tier you tested" is a checkable claim; "the playbook says so" is not. The pattern generalizes to
plan-backlogand the other gated skills with new fixtures and oracles — the harness is skill-agnostic.Scope and honest limits
claudeCLI and cost real tokens (~$1.40 for the full sonnet matrix); measure-locally-first felt like the right v1. CI wiring is a clean follow-up if you want it.Open questions
evals/as a new top-level, or nested underscripts/?plan-backlogin this PR or a follow-up? (Follow-up is my instinct — one concern per PR.)🤖 Generated with Claude Code