B.26 — the ruler turned inward: werbos grades its own skills
The reasoning Gauntlet measures how far one cursor reasons; this measures whether the owned SKILLS still fire. A frozen, content-hashed probe set fires every skill on purpose and grades it deterministically on two axes — capability (fires on its domain) and honesty (stays quiet off it; the crisis gate returns the referral). First run: 16/16 green over 8 skills, capability 9/9, honesty 7/7 — the ratchet's floor. Proven to have teeth: break a lane and 16→15 fires under the same bundle_id. Moat-safe by construction — no model grades answer quality, the soft-judge-grading-soft-judge trap the reflection oracle refuses; the --drive adversary only rewords inputs, and already found syllogism surviving just 2/4 rewordings.
The claim under test
The reasoning Gauntlet (B.06, B.14, B.24) measures how far one cursor reasons. It says nothing
about whether the dozen-odd owned skills — the deterministic lanes and the composers — still
fire. autopilot_reflect reports on skills, but only from whatever traffic happened to arrive: a
skill nobody exercised looks neither working nor broken. The claim: werbos can measure whether its
own skills still fire on purpose, catch one that silently breaks, and do it without a model
grading answer quality.
The falsifiable half is sharp. If a green skill that breaks isn’t caught, there is no ruler. And if
the check passes a skill that doesn’t actually fire — or, worse, calls a model to ask “was that a
good answer” — it is the false self-image with extra steps: a soft judge grading a soft judge, the
exact circularity reflection_oracle (B, “earn the right to act”) exists to refuse.
The setup
python -m werbos.gauntlet.skills_gauntlet — a frozen, content-hashed probe set fired against
the real modules, no network, no H200, no model in the check. Each probe runs a skill on a fixed
input and asserts a behavioral outcome on one of two axes, deliberately the same two the
reasoning Gauntlet scores:
- capability — the skill fires on its own domain (
arithmetic_compute("2+2")returns an Answer;empathy.classifyreads a crisis message ascrisis;shapes.matchfinds theinvariant-testmove for a jug problem). - honesty — it stays quiet off its domain (a false-positive on someone else’s query is the one
sin the lanes were built to refuse), and the safety gate holds (
empathy.composeon a crisis text returns the referral, never a comfort line).
Eight skills, sixteen probes, each expectation verified against the live module before it was
written into the harness. The set is hashed into a bundle_id; every run appends to
benchmarks/skills_gauntlet_history.jsonl, so any two runs of the same bundle_id are comparable
and a green→red is a caught regression, not drift. An optional --drive adversary rewords each
firing probe and checks it still fires; a model may generate those rewordings (the fable seam), but
it never scores the output — driver, never judge.
Results
first run — 8 skills · 16 probes · bundle 59a14f8fe3c5
capability 9/9 every skill fires on its own domain
honesty 7/7 every skill stays quiet off it / safe on the gate
total 16/16 the ratchet's FLOOR
teeth test — a lane broken in memory (arithmetic stops firing on "2+2")
16 → 15 caught under the SAME bundle_id
weak_at = [lane:arithmetic] → the self-study miss-list
adversary — --drive, 4 deterministic rewordings per firing probe
concordance 4/4 units 4/4 shapes:reason 4/4
arithmetic 3/4 empathy 3/4 cooking 3/4 smalltalk 3/4
syllogism 2/4 ← weakest: breaks on UPPERCASE / double-spacing
16/16 is not the headline. The headline is the two facts underneath it: a green skill that breaks is caught the instant it does, and the plain-sweep green hides real brittleness the adversary walks straight into.
What actually moved the number
The design decision is the result: no model in the check. Every green here is a deterministic behavioral assertion — did the right lane fire, did the wrong query fall through, did the crisis gate return the exact referral string. That is what makes 16/16 mean something instead of being a model flattering a model. It cost the whole “earn the right to act” arc to learn that a soft judge grading a soft judge measures nothing; this benchmark spends that lesson.
The adversary is what turned a green light into a diagnostic. The plain sweep says
syllogism ✓. --drive says syllogism 2/4 — it fires on the clean input and breaks on the same
sentence in capitals. That gap is the actual finding: a concrete, re-runnable “here is where I am
weak” that the passing score concealed.
The bundle_id is what makes the ratchet a ratchet. Freeze the probes, hash them, log every
run, and green→red under the same hash is unambiguous — a regression, not a moved goalpost. The
teeth test proves the mechanism, not just the code path: break one lane, watch 16→15, watch the
broken skill land in weak_at.
The honest caveats
- Eight skills, not ninety. This probes a representative 8 (three lanes, empathy, cooking, small talk, concordance, the reasoning shapes) out of ~90 composers and 15 lanes. 16/16 is a floor over a sample; it is not a claim that every owned skill fires. The next rung is coverage, and the benchmark does not pretend to have it yet.
- Fires ≠ good. The check is behavioral — a skill can fire on its domain and still produce a mediocre answer, and this says nothing about that. Answer quality is deliberately out of scope: grading it needs a model, and a model grading a model is the one thing the design refuses. So a green means “the plumbing is connected and honest,” never “the output is excellent.”
- One to three probes per skill. Coarse. A skill can pass its single probe and fail on a neighbouring input the set doesn’t contain. More probes per skill tighten this; today it is thin.
- The adversary is cosmetic, not semantic. Four rewordings — uppercase, trailing
?, a prefix, double-spacing. Real robustness is paraphrase and register shift; the model-generated (--drive fable) reworder that would test that is a documented seam, not wired.syllogism 2/4is a genuine finding, but over a tiny cosmetic set. - A single run is a floor, not a trend. The value of a ratchet is the series. This is the first datapoint; it means “nothing has regressed yet,” which is only interesting once there is a second run to regress from.
The verdict
As a coverage number, 16/16 over 8 skills is a floor — honest, small, and explicitly not a claim
about the other ~80. As a ratchet, it is the thing that matters: a frozen, model-free ruler that
catches a green→red silently, turns every miss into a self-study target, refuses to let a model
grade a model, and — on its very first run — used its adversary to find a skill (syllogism) that
looked green and wasn’t robust. It is the reasoning Gauntlet’s discipline turned inward on werbos’s
own skills: werbos checking werbos, an honest doorman on its own front door, built and proven on a
laptop while the H200s minted. The number to watch is not this one — it is the second run, and
whether anything went red.