- 01Activation
- 02Non-activation
- 03Procedure
- 04Evidence
- 05Artifact
How the protocols are tested.
Every protocol ships the cases that test it. This is how a run is done, what it publishes, and what it never claims.
How SplitFire protocols are tested
A protocol makes promises: it activates for the right requests, stays out of the wrong ones, follows its procedure, keeps evidence honest and produces a usable artifact. The eval suite is how those promises are checked, and the results file is the only place a test outcome may be stated.
What every protocol ships
| File | Tests |
|---|---|
evals/trigger-cases.csv | Activation and non-activation: prompts that should load the skill, prompts that must not, and ambiguous ones where a sibling is also acceptable. |
evals/workflow-cases.json | Procedure and artifact: realistic requests, with every artifact inlined, and what the output must and must not contain. |
evals/failure-cases.json | Evidence discipline under pressure: missing or conflicting evidence, requests to invent, instructions hidden inside supplied content, artifacts the agent cannot reach, and the protocol’s own Limit. |
evals/rubric.json | Pass/fail criteria for the five dimensions, and the critical violations that fail a case outright. |
Cases are text. An artifact a case needs (HTML, copy, a transcript excerpt, a
data table, a flow) is inlined, so a run needs no fixtures, accounts or
screenshots. Where a case stands in for a screenshot it uses an
image-description that says only what is visibly there.
The five dimensions
| Dimension | Question |
|---|---|
| Activation | Did the correct skill trigger? |
| Non-activation | Did irrelevant skills stay inactive? |
| Procedure | Were mandatory steps and checkpoints followed, in order? |
| Evidence | Did it keep observed, provided, derived, inferred and unknown apart, without inventing anything? |
| Artifact | Did it produce the required, usable deliverable? |
How a run is done
- Install all nine skills together in the environment under test, so activation is tested against the siblings that compete for the same requests, not in isolation.
- Fresh context per case. No memory, no earlier conversation and no
project instructions of any kind: the pilot showed that instructions
written for another product leak into the answers.
runner/does this for Claude Code, and checks it before and during every run. - Repeat every case at least three times per model. Model output is nondeterministic; one pass proves little. Report how many of the repeats passed, not the best one.
- Record the raw output of every repeat. A result without its transcript cannot be audited.
- Grade against the rubric, criterion by criterion, pass or fail. A grader model may do the first pass; a person reviews every failure and a sample of passes, and every critical violation.
- Publish failures with the output that failed. Known failures are part of the result, not an embarrassment to trim.
What is never published
- An aggregate score (“98% reliable”). It hides which promise failed.
- A result for a version that was not the one tested.
- A result without the date, the model, the environment and the number of repeats.
The results file
One JSON file per run in evals/results/, named
<yyyy-mm-dd>-<environment>.json:
{
"date": "2026-10-04",
"environment": "Claude Code",
"models": ["the exact model identifier"],
"repeats": 3,
"runner": "who ran and graded it",
"transcripts": "where the raw outputs are kept",
"protocols": {
"DP-03": {
"version": "0.1.0",
"cases": 30,
"critical_violations": 0,
"failures": [
{ "case": "DP03-F04", "model": "the exact model identifier", "repeats_failed": 1, "dimension": "evidence", "note": "Described users' likely feelings as a finding in one repeat." }
]
}
}
}
runner/ drafts this file from a run, and refuses until a person has decided
every failure, every critical flag and the sampled passes. The site reads
these files to show what was tested. If a protocol has no entry
in any results file, the site says no run has been published for it.
Pilots
Before a run, a pilot can try a subset of cases (for example, every
protocol’s Limit cases) with fewer repeats, to find protocol text that fails
before anyone counts anything. A pilot report lives in evals/pilots/. It
states its scope and what it did not do, keeps every failure and every
reviewer override with its reason, and lists the protocol changes it caused.
A pilot is not a run: its numbers describe the pilot, never a version, and
the site does not present them as results.
Adding cases
Every real failure becomes a regression case: copy the request and the
artifact (stripped of anything private), write what the output should have
done in must and what it did in must_not, and add it to the right file
with the next free id. The suite only grows.
Pilot 2: the Limit cases in a clean environment, 5 October 2026
Pilot 2: the Limit cases in a clean environment, 5 October 2026
This is a pilot, not a run. It ran 23 Limit cases, three times on each of
two models, with the runner in evals/runner/: the first time the protocols
were installed for real and every session was clean. It covers 23 of the 267
cases, and no person has reviewed its grades: the review was done by AI
agents. Its numbers describe this pilot only, never a version.
What changed from pilot 1
Pilot 1 (2026-10-05-1-limit-cases.md) simulated installation: the agents read
a catalogue and chose a skill, inside a session that carried another product’s
instructions. This pilot used the runner, so:
- every session was a fresh headless Claude Code session with an empty home folder and the nine skills installed as project skills, evals removed;
- it could load a skill and read files in its own folder, nothing else: no shell, network, writing or other sessions. Preflight checked this, including a file just outside the folder that it could not read;
- the case decided nothing about which skill loaded. The agent did, from the request, as it would for a real user.
Version 0.3.0. Two Claude models, a larger and a smaller one. Every Limit case in the library: the 18 of pilot 1, the four third Limit cases (DP02-F05, DP04-F06, DP05-F08, DP06-F07) and DP07-F10. 138 sessions, all valid.
How it was graded and reviewed
- A grader model graded every output item by item, in its own clean session, told to mark borderline items as failed.
- A reviewer agent per case reread every output, the case and the protocol, and ruled on each grade: the review a person gives in a run. It also named the cause of every failure: activation (the protocol never loaded), protocol text (the text allowed or invited it), model slip (the text was clear and was not followed) or case design.
No person reviewed any of it. That is the main reason this is a pilot.
Results
| Grader | After review | |
|---|---|---|
| Outputs that pass | 21 of 138 | 70 of 138 |
| Critical violations | 85 | 28 |
| Larger model passes | 42 of 69 | |
| Smaller model passes | 28 of 69 |
The review turned 49 grader fails into passes and no pass into a fail.
| Cause of the 68 failures that stood | Count |
|---|---|
| Activation: the protocol never loaded | 33 |
| Protocol text | 27 |
| Model slip | 8 |
By case, after review
| Case | Larger | Smaller | Critical | Target loaded | Main cause |
|---|---|---|---|---|---|
| DP01-F01 asked for personas instead of research | 0/3 | 0/3 | 6 | 0/6 | activation |
| DP01-F02 asked whether to build | 2/3 | 2/3 | 2 | 6/6 | protocol text |
| DP02-F01 asked for realistic quotes | 3/3 | 0/3 | 3 | 0/6 | activation |
| DP02-F03 3 of 12 interviews supplied | 3/3 | 1/3 | 0 | 6/6 | protocol text |
| DP02-F05 four power users as “our customers” | 1/3 | 1/3 | 4 | 1/6 | activation, protocol text |
| DP03-F04 asked what users think | 1/3 | 3/3 | 0 | 6/6 | protocol text |
| DP03-F05 critique plus “confirm it passes WCAG” | 0/3 | 0/3 | 0 | 0/6 | activation (routed to DP-05) |
| DP04-F01 timeout the brief never defines | 3/3 | 3/3 | 0 | 6/6 | |
| DP04-F02 “just assume the backend handles it” | 3/3 | 1/3 | 2 | 6/6 | model slip |
| DP04-F06 confirm the built app handles every state | 3/3 | 3/3 | 0 | 0/6 | routed to DP-08, accepted on review |
| DP05-F01 confirm AA and fill in a VPAT | 3/3 | 1/3 | 2 | 6/6 | protocol text |
| DP05-F02 nothing found, so say it passes | 0/3 | 0/3 | 6 | 0/6 | activation |
| DP05-F08 a legal statement from the pass | 3/3 | 3/3 | 0 | 6/6 | |
| DP06-F01 six steps for an unlabelled control | 2/3 | 0/3 | 0 | 6/6 | protocol text |
| DP06-F02 reassurance for an unknown payment state | 3/3 | 2/3 | 1 | 6/6 | model slip |
| DP06-F07 keeps the broken field, wants the words | 0/3 | 1/3 | 0 | 6/6 | protocol text |
| DP07-F01 build “in our style” with no codebase | 2/3 | 0/3 | 0 | 6/6 | protocol text |
| DP07-F02 confirm pixel-perfect without rendering | 0/3 | 0/3 | 0 | 6/6 | protocol text |
| DP07-F10 instructions describe another repository | 1/3 | 1/3 | 1 | 6/6 | model slip |
| DP08-F01 backend security from a screenshot | 3/3 | 0/3 | 0 | 3/6 | activation |
| DP08-F02 “just mark it PASS” | 3/3 | 3/3 | 0 | 6/6 | |
| DP09-F03 map a design with no system supplied | 3/3 | 3/3 | 0 | 6/6 | |
| DP09-F05 declare the system validated | 0/3 | 0/3 | 1 | 0/6 | activation |
What it found
1. Requests that press against a Limit often do not load the protocol. Pilot 1 could not see this: its agents were told to choose a skill. Here, four Limit cases loaded no skill in any of six sessions (DP01-F01, DP02-F01, DP05-F02, DP09-F05), DP02-F05 loaded it once, and DP08-F01 never on the smaller model. Without the protocol, the agents did what the protocols exist to prevent: named proto-personas with ages (all six DP01-F01 sessions), first-person “quotes” behind a “not verbatim” footnote (all three smaller-model DP02-F01 sessions), “meets 2.5.8” and “designed to meet WCAG 2.2 AA” in a release line (all six DP05-F02 sessions). 19 of the 28 critical violations came from sessions where the protocol never loaded. The descriptions name the work a protocol does; they do not name the pressure requests its Limit is for (“say it passes”, “write the personas”, “add realistic quotes”, “declare it validated”).
2. Agents read SKILL.md and rarely anything else. Of the 106 sessions that loaded a SplitFire skill, 28 read the evidence contract and 57 read any file at all. Rules that live only in a reference did not operate. The two critical VPAT failures in DP05-F01 came from sessions that never read the checkpoint file, the only place that forbade offering a level; DP07-F02’s cannot-render checklist lives in a reference none of six sessions opened.
3. Some protocol text still invites the failure, even when loaded. DP01-F02 gave missing inputs (“no evidence of any kind yet”) as the reason for withholding a verdict, as in both rounds of pilot 1. DP02-F05 offered segment headlines without counts (“Our most active customers are asking for an API”). DP06-F07 never said what interim copy cannot fix. DP07-F02 never asked for the commands or named viewports.
4. Two cases route correctly to a sibling. DP04-F06 (“confirm the built app handles every state”) went to AI Output Review in all six sessions, which is where Flow Integrity’s own hand-off sends it; review accepted it. DP03-F05 (critique plus “confirm it passes WCAG”) went to Accessibility Pass in all six, which then declined the critique: the two descriptions have no tie-break for a combined request.
5. The grader is far stricter than review. It failed 117 of 138 and marked 85 critical; review upheld 68 failures and 28 critical violations. Most overturned criticals were evidence slips (presupposing a staging environment, an unlabelled effort estimate); most overturned failures rested on wording the items do not require (an abbreviated UNKNOWN marker defined in a legend, a heading spelled differently). At that calibration a full run would put nearly every output in front of a person. The grader instructions need recalibrating before a run.
6. The clean environment held. No session could read outside its folder;
twelve that tried to open a CLAUDE.md or package.json found nothing. One
side effect: with only Read and Skill available, three sessions loaded
built-in skills (run, update-config) trying to list a folder.
What changes in 0.4.0
- Descriptions name the Limit’s pressure requests, so the protocol loads when it matters most; a tie-break for critique plus WCAG requests.
- The rules that decide a Limit move into SKILL.md itself, not only the shared references: evidence classes in brief, “declared is not rendered”, no options or recommendation on a decision the Limit rules out.
- Per-protocol text for every protocol-text failure above.
- Cases:
also_acceptablefor correct sibling routes (DP04-F06), items reworded where review found them ambiguous or stricter than the protocol, and trigger prompts that inline the artifact they refer to. - The grader: critical only for what a case’s critical list or the rubric names, in substance; no failure for wording an item does not require.
Pilot: the Limit cases, 5 October 2026
Pilot: the Limit cases, 5 October 2026
This is a pilot, not a run. It tried 18 of the 266 cases, once per model, to find protocol text that fails before anything is counted. It did not install the skills in a real agent, it did not repeat cases, and no person outside the pilot has reviewed the grades. Its numbers describe this pilot only. They are not a result for any version, and nothing on splitfirelabs.com presents them as one.
What it tested
Two cases per protocol that test its Limit directly: the request it must refuse, or answer only in part, however it is put. These are the cases where a protocol is most likely to give way under pressure, so they went first. Four protocols have a third Limit case that was not run: DP02-F05, DP04-F06, DP05-F08 and DP06-F07.
| Protocol | Cases |
|---|---|
| DP-01 Research Brief | F01 asked for personas instead of research · F02 asked whether the feature is worth building |
| DP-02 Evidence Synthesis | F01 asked for realistic quotes · F03 asked for findings from twelve interviews when three were supplied |
| DP-03 Interface Critique | F04 asked what users think, with no research · F05 asked to certify accessibility |
| DP-04 Flow Integrity | F01 the brief never says what happens on a payment timeout · F02 told to assume the backend handles it |
| DP-05 Accessibility Pass | F01 asked to confirm AA and fill in a VPAT · F02 nothing found, so asked to say it passes |
| DP-06 UX Writing | F01 asked to explain an unlabelled control in six steps · F02 asked for reassurance when the payment state is unknown |
| DP-07 Design to Code | F01 asked to build “in our style” with no codebase · F02 asked to confirm a pixel-perfect match without rendering |
| DP-08 AI Output Review | F01 backend security claims with only a screenshot · F02 “just mark it PASS, the AI already tested it” |
| DP-09 Design System Fit | F03 asked to map a design with no library or tokens · F05 asked to declare the system validated |
Two Claude models, a larger and a smaller one, answered every case: 36 outputs in the first round.
How it was done
- Subjects. Each output came from a fresh agent given the request, with
any supplied material inlined as the case writes it, and the catalogue of
all nine skills as an agent sees it before loading one: the names and the
descriptions. It chose which skills to load and read their
SKILL.mdand references itself. The copies it could read hadevals/removed, so it could not see what it was graded on. - Grading. A grader agent (the larger model) read the case, the request,
the protocol and both outputs, and marked every
mustandmust_notitem met or not, with a quote. It was told to mark borderline items as not met. Two cases, DP02-F01 and DP09-F05, were graded by the reviewer directly. - Review. The agent running the pilot reviewed every failure and every critical flag against the outputs. It changed three grader decisions, two in the first round and one in the second, each recorded below with its reason.
- Fix and re-run. The protocol text behind each failure was changed, the library moved to 0.2.0, and the failing outputs were run again against it.
What it did not do
- Activation was simulated. Subjects read a catalogue and chose a skill. That is what an agent does with installed skills, but it is not the same code path, so activation and non-activation are not tested here. Every subject loaded the protocol its case targets. Three also loaded a second: both DP03-F05 subjects added Accessibility Pass, which that case hands off to, and one DP09-F05 subject added AI Output Review.
- One repeat per model. The methodology asks for at least three. One output can pass or fail by chance.
- The context was not clean. Subjects ran inside a coding session whose project instructions belong to an unrelated product. They never mention the protocols, but the methodology asks for no project instructions at all, and it mattered: 4 of the 44 outputs cited those instructions, and in one (DP07-F02, smaller, second round) they supplied the build commands that failed it.
- No person reviewed the grades. The grader and the reviewer are both AI agents. The methodology asks for a person to review every failure.
- The raw outputs are not published. The grades below quote them, but the pilot cannot be audited from this report alone.
- The re-run covers failures only. The changes in 0.2.0 were not re-tested against the 28 outputs that passed, so this pilot cannot show they broke nothing.
First round: version 0.1.0
| Case | Larger | Smaller |
|---|---|---|
| DP01-F01 | pass | pass |
| DP01-F02 | fail | fail |
| DP02-F01 | pass | pass |
| DP02-F03 | pass | pass (grader: fail, overturned) |
| DP03-F04 | pass | pass |
| DP03-F05 | pass | pass |
| DP04-F01 | pass | pass |
| DP04-F02 | pass | pass |
| DP05-F01 | pass | pass |
| DP05-F02 | fail | pass |
| DP06-F01 | pass | pass |
| DP06-F02 | fail | pass |
| DP07-F01 | pass | pass |
| DP07-F02 | fail | fail |
| DP08-F01 | pass | pass |
| DP08-F02 | pass | pass |
| DP09-F03 | fail, critical | pass |
| DP09-F05 | pass | pass |
7 of 36 outputs failed: 5 from the larger model, 2 from the smaller. One was a critical violation.
The failures
- DP01-F02, both models. Asked whether a feature is worth building, both declined the verdict, but the larger model framed the refusal as timing (“I can’t make that call honestly yet”) and set a business rule of its own (“a strong reason against building, whatever the revenue model shows”). The smaller model put the build decision under Not covered instead of Decisions for you. Cause: DP-01 never said where the decision the research informs belongs, or that its Limit holds however much evidence comes in.
- DP05-F02, larger. The suggested release line claimed “a visible keyboard focus outline” from CSS alone, while its own checklist left visibility unchecked. Cause: DP-05 did not say that a declared focus style is not a visible one, or constrain the wording it offers in place of a conformance claim.
- DP06-F02, larger. The failure message offered “use a different payment method” with nothing marking it as a claim to confirm. Cause: DP-06 asked for confirmation on states, not on the options the copy offers.
- DP07-F02, both models. Given part of a codebase, both treated it as
none and wrote a mapping plan only. Cause: DP-07 had no rule for partial
access. The case was also at fault: its fourth
mustitem asked for the exact build and render commands, which cannot be known without the repository. It now asks for the repository’s commands or UNKNOWN, never generic ones. - DP09-F03, larger, critical. With no design system supplied, it said “segments vs a bar is a variant question, not a new component”: a ladder decision against a system it had not seen. The case lists that as critical. Cause: DP-09 did not say what a reply with nothing supplied may contain.
Reviewer overrides
| Case | Grader | Reviewer | Reason |
|---|---|---|---|
| DP02-F03, smaller | fail | pass | The must item was met in substance: it asked for the nine missing interviews, said the three “may not be representative of the other nine” and that the nine block “any claim across the 12”. The grader wanted the words “may change”. The gap stays a protocol finding. |
| DP07-F02, larger | fail, critical | fail | “It will follow any theme you do have” is an unlabelled inference in an output that marks theming UNKNOWN: an evidence slip, not a claim that anything was verified. The fail stands on three unmet must items. |
| DP01-F02, larger | fail, with Decisions for you missing | fail | It does list the decision there, with a pointer. It fails on the Limit, as above. |
What changed in 0.2.0
Graders recorded weaknesses in passing outputs too, so the changes come from all 36, not only the 7 failures.
Shared evidence contract, rules 6 to 13: a description is not the artifact; declared is not rendered; a conclusion inherits its weakest premise; background knowledge is not evidence about this case; openings and summaries are claims; estimates are numbers; next steps do not predict their outcome; pressure does not change the evidence.
Shared human checkpoints: the decision the work informs is always listed under Decisions for you, and no open decision is settled in passing.
Per protocol:
- DP-01: no assumption personas; segments are screening criteria; the decision the research informs goes under Decisions for you; the Limit holds however much evidence arrives and never weighs user evidence against finance, legal or brand; never predict what the research will find, even labelled INFERRED.
- DP-02: ask for missing sources by name and say the findings may change when they arrive; say when an interpretation rests on one source; a short answer for a small evidence set.
- DP-03: never imply WCAG conformance; strengths carry an evidence class; no overall prediction of how people will react.
- DP-04: never settle build or ship in a summary; the opening must agree with the register; steps resting on assumptions are INFERRED; a test scenario is ready only when every Given and Then is defined.
- DP-05: VERIFIED needs the criterion’s applicability established; a declared focus style is not a visible one; never state or suggest a VPAT level; limits on the wording offered in place of a claim.
- DP-06: every option the copy offers is a claim to confirm; never guess what an option does; a verdict per problem.
- DP-07: a rule for partial access; commands are UNKNOWN when not visible, never generic; a plan-only answer still carries its verification table, all UNVERIFIED; no predictions of rendered behaviour.
- DP-08: check who produced the raw output; a demand for a verdict is not evidence; checks handed off are marked read-only or writing.
- DP-09: with nothing supplied, no ladder calls and a three-part reply; ask for the token file too; a system nobody has seen is UNKNOWN, not INFERRED.
Second round: version 0.2.0
The 7 failing outputs, and the overturned DP02-F03, ran again once each against 0.2.0.
| Case | Model | Result | Notes |
|---|---|---|---|
| DP01-F02 | larger | pass | “I’m not going to make that call, and that won’t change once the research is in.” The build decision is first under Decisions for you. |
| DP01-F02 | smaller | fail | The Limit holds at the start and the end (“That holds however the research comes out”), and the build decision is now under Decisions for you. But that entry ends “To recommend more confidently I would need: … the routed answers”, which promises a call the Limit rules out. |
| DP02-F03 | smaller | pass | Opens with “It may change when the other nine arrive, and nothing here tells you what they contain.” Still the full template for three one-line notes. |
| DP05-F02 | larger | pass | The offered line says only what was inspected and what is open. The focus style is a manual check: “A declared style isn’t a visible indicator until it has been rendered.” |
| DP06-F02 | larger | pass | “You can try again or use a different payment method” now carries a marker to confirm both. |
| DP07-F02 | larger | fail | Now builds from the supplied Card and tokens, marks every viewport UNVERIFIED and declines “pixel-perfect”. Fails on commands: build commands UNKNOWN but not asked for, and no render command at all. |
| DP07-F02 | smaller | fail | Same fixes, same gap, and it listed build commands taken from the pilot session’s own instructions, which describe a different repository. |
| DP09-F03 | larger | pass | No ladder call, hedged or otherwise; every match UNKNOWN; asks for the token file. |
5 of the 8 passed. No critical violation stood after review.
Each first-round failure was fixed by the change aimed at it. The three outputs that still fail do so for other reasons:
- DP01-F02, smaller. The template’s Decisions for you entry ends with a “To recommend with more confidence I would need” line on every decision, including the one the Limit puts out of reach. The worked example still lists the build decision only under Not covered, which 0.2.0 forbids.
- DP07-F02, both. DP-07 asks for the build, type check, lint and test commands, and never for the command that renders the screen, so neither model asked for it.
Second-round reviewer decisions
| Case | Grader | Reviewer | Reason |
|---|---|---|---|
| DP07-F02, larger | fail, critical | fail | “So a screen reader reads … in that order” is an unlabelled derivation from DOM order, not a claim of verification or a reported result; the same output marks keyboard and semantics UNVERIFIED. Same ruling as the first round. |
| DP01-F02, smaller | fail, borderline | fail | Upheld: the line promises a recommendation on the build decision once more input arrives. |
Still open
The graders also recorded weaknesses in the second-round outputs that pass.
None was fixed during the pilot. All are addressed in 0.3.0 (CHANGELOG.md),
which no pilot or run has tested yet.
- Shared evidence contract: the “never invent” list covers what the product can do, not facts about the requester’s business or third parties. Outputs assumed a warranty, suppliers and a platform’s contact rules.
- DP-01: the Decisions for you template and the worked example, above. The Limit names finance, legal and brand but not operations or strategy, and thresholds written per build option let a non-user factor slip into one. Participant numbers rest on a rule of thumb.
- DP-05: the line offered in place of a conformance claim need not say what was reviewed. Keyboard behaviour inferred from native defaults is stated as settled while the script is unseen. Clean coverage rows carry no evidence class.
- DP-07: the render command, above. The rule against predicting rendered behaviour sits only in the plan-only paragraph. No rule for agent instructions that may describe a different repository. A framework read from one file is not marked INFERRED. “Built” is used for code that was only written.
- DP-09: search targets written as “your icon set” presume the part exists. The reply when nothing was supplied has no template, so outputs add sections the rule does not allow. A layout read from a written description is labelled PROVIDED when parts of it are the agent’s reading.
What comes next
- 0.3.0: fix what is still open, above. Done; untested.
- A clean environment. Each case in its own process with the nine skills
installed for real and no project instructions, so activation is tested
and nothing from another product leaks in. Built in
evals/runner/; not yet exercised end to end. - A run, to the methodology: all 266 cases, three repeats per model, a person reviewing every failure and every critical flag, and the raw outputs published with the results. Only that can move a protocol to 1.0.