Skip to content

Relabel the four positives nothing should have fired on, and keep the one that should - #27

Merged
cmj0121 merged 2 commits into
mainfrom
fix/relabel-on-firing-criterion
Sep 16, 2026
Merged

cmj0121 merged 2 commits into
mainfrom
fix/relabel-on-firing-criterion

Conversation

@cmj0121

@cmj0121 cmj0121 commented Sep 16, 2026

Copy link
Copy Markdown
Owner

Closes #25. Applies the criterion #26 recorded, and corrects a claim #24 and #25 both make.

The criterion

A skill should fire when the request needs something the assistant cannot do unaided — persist state to a file, run a tool, coordinate other agents, emit a machine-readable verdict. Where the assistant can simply comply in the current turn, nothing fires, and a positive expecting one is mislabelled.

Four of the five failures are mislabels under it. One is not — and it was decided against the rule, on evidence.

Four relabelled

agent-page — why is this endpoint slow in production → negative

Verified in the body rather than assumed. Phase 1: "Page reviews the change, not the codebase", after a git diff. Phase 4's Performance Review is a checklist over that diff. Phase 4 also: "No __REVIEW_VERDICT__ reached Page → say so and stop." And the failure-handling preamble: "Every phase below assumes its input arrived — a diff to read, Ellis's findings to build on."

A live latency regression supplies none of the three, so Page stops on turn one. Its nine other positives are all review-of-a-change; this was the only diagnostic one, and the set already carried fix the slow query as a negative.

#24 and #25 both call this "the clearest case for a description edit". Both are wrong — they read a repeatable 0/3 as a description gap when the body says Page was never asked.

agent-hale — the plan is agreed -- write it → negative

The case prompt already supplies a fully settled approach and still fires 0x with spec-writer silent. So the failure is not an empty referent: writing the code a settled plan describes is ordinary compliance in the current turn.

briefing — both cases → negative

The decisive finding is not the one #25 guessed. Both prompts were already written as standing instructions — "about a dozen of these to get through this afternoon", "From here on" — so the standing-versus-one-turn distinction is not what fails. briefing holds no state: allowed-tools: [Read] alone, no config file, no session hook. Nothing it offers is beyond the session's own reach, so answering more briefly is compliable whether it covers one answer or twelve.

One that stands: lingua — stop refining my questions

Decided on evidence, and it comes out against a blanket application of the criterion:

  • SKILL.md Phase 4 lists "stop refining" by name as a mid-session rule change that updates the config file with Edit.
  • refine_question is reloaded by the SessionStart hook every session — so a stop that is not persisted does not stop anything past this one. That is a write, which is exactly what the criterion asks for.

On swapping in lingua off instead, which was suggested: it is the wrong replacement, for two reasons that run opposite to the suggestion. It carries the magic word lingua, so it fires whatever the description says and tests nothing about the description. And the body has it suspend for the session without writing the file — making it the less persistent of the two.

So: not a relabel, which would assert something the body contradicts; and not a replacement, which would delete the evidence — the restate… 3/3 versus stop refining… 0/3 asymmetry is the whole basis of the criterion in #26. The case is left failing on purpose, recorded in about as a body-versus-description mismatch: the description names the on-state and never the off-state. That is the observation which would justify a future description edit.

compactor's #22 clause: stands

#24 asked whether to revert it, since make eval shows compactor firing 0x on every run and the clause therefore cannot be distinguished from doing nothing. Three reasons it stays:

  1. The 0x measurement was taken with the clause in place. Reverting is unmeasured — it trades one unmeasured state for another, at the cost of a catalogue-copy edit across four compared locations.
  2. Under the criterion now settled, it is no longer an anti-theft patch. A standing output style is briefing's, a one-turn re-render is compactor's; the clause states the real boundary.
  3. The blind router and make eval disagree, and the disagreement has a shape #24's own rule bars editing a description on a blind-router reading alone. "Cannot be distinguished from doing nothing" is an absence of evidence, not evidence of absence.

Mechanics

Every relabel that flipped a positive spent an existing negative that asserted the same line by hand, so the line is now drawn by three measured runs instead:

set spent negative restored positive
agent-page fix the slow query before we ship this change, check its timeout and retry handling
agent-hale why is this endpoint slow take unit 3 from the plan, build it test-first, and report what the suite did
briefing (train) summarise the previous answer load the project's output style for this planning run
briefing (validation) condense this table what output style do the planning agents use in this project

Both new briefing positives ask for the one thing the session cannot supply unaided — what this project's output style actually says — mirroring lingua's existing what response language is set for this project.

All four sets keep 20 queries, 10/10, 6/6 train and 4/4 validation. New positives scanned clean against every magic word with the same \b-anchored regex scripts/validate uses; no new cross-set duplicates.

Still 13 cases — none removed. Four had graders/fires.md replaced by graders/does-not-fire.md, matching the house spelling in lingua/translate-readme. Prompts kept verbatim: each is still a realistic turn, and for briefing the firing-favourable standing framing makes it a stronger negative. The spec-writer-silent and both compactor-silent graders are kept, so each briefing case now asserts the criterion's full prediction — neither skill fires.

No briefing description edit. Still 284/320; #9's revert stands.

Expected movement

make eval should go 8/13 → 12/13, with lingua/stop-restating the one deliberate remaining failure. Not run here.

Three follow-ups this opens, none in scope

  1. lingua's description gap is real and unfixed — the off-state of refine_question is unnamed.
  2. briefing's description still claims "when the user asks for shorter output", which its own set now labels negative. Someone has to decide whether the ceiling gets raised or the claim gets dropped.
  3. agent-hale's remaining plain-implementation positives sit on the boundary this relabel establishes and are unmeasured. Worth a run before anyone touches them — not a blanket relabel.

Versions

Nothing moves at any level. Every changed file is under evals/, and since the compactor clause stands, no description changed either.

Checks

make test — all four pass. bash scripts/validate-fixtures — all fixtures behaved as expected.

🤖 Generated with Claude Code

cmj0121 and others added 2 commits September 16, 2026 15:00
`make eval` on dab7767 left five cases at `Skill called 0x`, and in every one
carrying an exclusion grader the supposed thief was silent too. On the criterion
the maintainer settled -- a skill fires when the request needs what the assistant
cannot do unaided -- four of those five are mislabelled, and each case is inverted
to assert the silence it already measured.

- agent-page `why is this endpoint slow in production`: Page reviews a change,
  not a running system. Phase 1 wants a `git diff`, Phase 4's performance list is
  a checklist applied to that diff, and the phase stops when no
  `__REVIEW_VERDICT__` arrived. This overturns what #24 and #25 both claim, that
  the 0/3 is a description gap.
- agent-hale `the plan is agreed -- write it`: the case states the agreed
  approach in full and still fires nothing, because writing the code a settled
  plan describes is ordinary compliance.
- briefing, both cases: briefing holds no state -- `allowed-tools` is `Read`
  alone, no config file, no session hook -- so a standing instruction to answer
  more briefly is one the session can honour by itself, whether it covers one
  answer or a dozen.

Each set keeps 20 queries at 10/10 and its train/validation sizes. Every relabel
spends the negative that had asserted the same line by hand, and the slot restores
a positive naming what the skill supplies that the session cannot: a review of a
change before shipping, a unit built test-first with the suite reported back, and
the project's own output style loaded and read back.

compactor's #22 clause stands. It was measured with the clause in place, so
removing it trades one unmeasured state for another across four files of
catalogue copy, and under the criterion it now states the real boundary rather
than patching a theft that does not happen.

Refs: #25, #24

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The fifth failing case is the one the criterion does not decide by itself, so it
is decided on the body instead. Phase 4 lists `stop refining` by name as a
mid-session rule change that updates the config file with `Edit`, and the
SessionStart hook reloads `refine_question` every session -- so a stop that is
not persisted does not stop anything past this one. That is a write, which is
exactly what the criterion asks for, and the label stands.

`lingua off` is not the sharper phrasing to swap in: it carries the magic word, so
it fires whatever the description says, and the body has it suspend for the
session without writing the file, making it the less persistent of the two.

Relabelling would assert something the body contradicts, and replacing the query
would delete the evidence -- the asymmetry against `restate my question before you
answer it` at 3/3, same skill and same vocabulary, opposite results. So this is
recorded as a body-versus-description mismatch: the description names the on-state
and never the off-state. No query, label or grader changes, and the case stays
failing as the observation that would justify fixing the description.

Refs: #25, #24

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@cmj0121
cmj0121 merged commit a5512b6 into main Sep 16, 2026
2 checks passed
@cmj0121
cmj0121 deleted the fix/relabel-on-firing-criterion branch September 16, 2026 07:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Five committed cases where no skill fires at all

1 participant