Development record
A capability is rehearsed end to end before it ships, over a real tree, in a throwaway snapshot
The rule
A capability is rehearsed by running it the way its user will: end to end, over a real repository state, in a snapshot that is discarded afterwards. What the run showed is recorded, whether or not it is good news.
A rehearsal is not a test. Tests answer whether each part behaves as its author intended. The rehearsal answers a question no test is in a position to ask: is the thing usable for the purpose it was built for?
It happens at three rungs, and they catch different failures.
- Per intent. When an intent ships, run what THAT intent delivers. Catches a capability that does not work.
- Per intent, cumulatively. Run what the PHASE can deliver so far, end to end, and rerun it as each intent lands. Catches pieces that work and do not compose. This is the rung that pays, and the one most easily skipped, because every part has just been proved individually.
- At the phase's close. One full run of everything the phase set out to deliver, against the corpus it is meant to serve. Catches a whole that is correct and does not serve its purpose.
The cumulative rung is what turns a phase into something more than a list of merged intents: at any point it can be RUN, so the phase carries a growing, executable demonstration of itself rather than a claim about what it will do once assembled. That demonstration is a deliverable, not a by-product.
Where a step cannot be automated, because it needs a human or a model, the hand-off is written down and then performed. A step that cannot be scripted is the most important one to make visible, never a reason to skip the run.
Why
Measured, not reasoned. The cold-reading workstream shipped thirteen intents across two phases. It ran six adversarial delta reviews, five fidelity audits, and three review rounds on a single eval. Every property it claims was proved, by mutation, against fixtures. Nothing was taken on trust.
The first end-to-end run took about fifteen minutes and found two things:
- the assembled input a reading is handed is about 9.8 MB, roughly 2.45 million
tokens, so no reading can be given one (
iss-2608311501186646); - three of the four reading positions receive a byte-identical item set, though
their definitions state four distinct objects, and one of those objects is not
a subset of the repository at all (
iss-2608311501240566).
Neither is visible from any document, any test, or any review. The evals run over a miniature fixture repository of about thirty files, which is the right corpus for asserting a firewall and the wrong one for asserting that the artefact fits anywhere. The instrument could be, and was, entirely correct and undeliverable at the same time.
The escalation is the whole point, and each rung found what the rung below could not reach:
- a review asks whether the code is right;
- an audit asks whether the promise was kept;
- a rehearsal asks whether the thing works.
On this workstream the audits out-found the reviews, naming defects no builder or reviewer had. The rehearsal then out-found the audits, in a fraction of the time and cost, because the question it asks cannot be answered by reading anything.
And a per-intent rehearsal alone would have missed it. The size defect belongs to the assembler, shipped by an intent in an EARLIER phase, which passed its own tests, its own review and its own audit. The three intents rehearsed here deliver an ingest verb and two evals; none of them, run on its own, hands a reading anything. Only the cumulative question, "what can this phase deliver right now, end to end", reaches an artefact whose size nobody had cause to measure. A defect that lives in the composition is invisible to every gate scoped to a part, and the cumulative rung is the only one that looks at the composition while there is still a phase left to change it.
Why a throwaway snapshot
A real run writes real records. A rehearsal must not enter the record it rehearses over, or the first exercise of a capability silently becomes a production use of it, and the tree carries an artefact nobody commissioned.
This is itd-193 at the scale of a whole capability rather than a single verifier: the copy is the unit of safety, and here the copy is a snapshot of the tree at a real commit with its own initialised repository, so that commit references, hashes and any state keyed on a root commit resolve exactly as they would in earnest.
The gate
- Given an intent whose ship ceremony is beginning, when the ceremony runs, then what that intent delivers has been exercised end to end over a real repository state in a throwaway snapshot, and what the run showed is recorded.
- Given an intent that has just landed in a phase, when its ship ceremony runs, then the phase's cumulative rehearsal is rerun over everything the phase can now deliver, and any behaviour that changed since the previous intent is recorded, including the case where the phase still cannot deliver anything end to end.
- Given a phase reaching its milestone, when it closes, then one full rehearsal is run against the corpus the phase is meant to serve, not a fixture, and its result is part of what the phase reports.
- Given a rehearsal step that needs a human or a model rather than a binary, when the rehearsal is written, then that hand-off is stated explicitly and performed, rather than the run being abandoned as unautomatable.
- Given a rehearsal showing the delivered thing cannot serve its purpose, when the result is recorded, then it is a finding of that intent or that phase, captured before the ship rather than discovered after it. The rehearsal proposes and the maintainer disposes, per verifier-selects-gates-decide: a bad result does not by itself stop a ship, but shipping in ignorance of it is what this rule ends.
Fit
itd-195 is the complement rather than the parent. It makes a claim about a COMPONENT executable. This rule makes the claim that the ASSEMBLED WHOLE works executable, which no per-component claim implies: every part of the cold-reading instrument was individually established and the composition was unusable.
loud-staging is why the result is recorded either way. A rehearsal whose bad news goes unrecorded is a stage that no-ops quietly, and the temptation to leave it unrecorded is strongest exactly when it matters most.
script-first-mvp is why the rehearsal is a script and not a verb. The flow has four steps and only three can be taken by a binary; writing it down is what makes the hand-off visible, and a tool rung is earned later against a corpus of runs rather than designed ahead of one.
Staging
Adopted 2026-08-31 at the documented-protocol rung. The rule binds new work immediately. There is no detector and no verb: the protocol is the gate, and a rehearsal is a hand-run whose script belongs in the local tier until enough of them exist to say what a general one would look like.
One rehearsal exists, of the cold-reading instrument, and it is a phase-close run rather than the ladder this record describes: the per-intent and cumulative rungs were never taken, which is why a defect from an earlier phase surfaced at the end of a later one. Its script is not promoted out of the local tier. Promotion is a later rung and is not assumed here: what a rehearsal looks like for a capability with no model in the loop, or for one whose real corpus cannot be snapshotted cheaply, is unknown and will be learnt from the second and third runs rather than guessed at now.
The existing corpus does not conform. No shipped intent in this repository has been rehearsed, and none is assumed to have been.
Frontmatter
| id | itd-196 |
|---|---|
| type | intent |
| lifecycle | disciplines |
| kind | discipline |
| severity | major |
.abcd/development/intents/disciplines/itd-196-a-capability-is-rehearsed-end-to-end.md
open on GitHub ↗ · commit history ↗
References1
- itd-193A verifier works on a copy: no agent mutates a live worktree to test it, and the tree is proved clean before any act that reads itbuilds on
Referenced by7
- iss-2610262031375064itd-196 runs its cumulative and closing rehearsals per phase, while the mental model retires the phaserelated
- iss-2610262033596296itd-196 keys its cumulative and closing rehearsals on the phase; the reflect surface says the phase was retired and the release is the grainrelated
- iss-2610262040451252itd-196 builds its rehearsal rungs on the phase; the phase glossary entry says the phase is superseded and survives only as history.related
- iss-2610262042291241The glossary calls the phase a retired sequencing unit; the rehearsal discipline builds its rungs on live phasesrelated
- iss-2610262043017551itd-196's cumulative and closing rehearsal rungs are defined over a phase; itd-24 records that phases are retired.related
- iss-2610262043161268itd-196 makes the phase its unit of rehearsal, while itd-2609211913453478 retired the phase as a sequencing unitrelated
- itd-2609020625400445A committed preset declares the window it was calibrated for, and the record holds every preset to its declarationbuilt on by
mentions4
- dcn-26083100000000112026-08-31 — A capability is rehearsed end to end before it ships, at three
- iss-2608311501186646The assembled input for a real reading of this repository is about 9.8 MB at every position, roughly 2.45 million tokens, so no reading can be handed one. Measured by running the shipped assembler over the tree at a real commit: widening 9808456 bytes across 951 items, entailment 10156762 across 1297, comparative and detection the same as widening, with the largest single item at 280242 bytes. Field projection works and is not the problem: 104 of the 951 items are projected to a named field and 847 travel whole, so the whole-file rows dominate by two orders of magnitude. The evals cannot see this because they run over a miniature fixture repository of about thirty files, which is the right corpus for asserting a firewall and the wrong one for asserting that the artefact fits anywhere. Nothing in the record states a size budget for the assembled input, and no criterion measures one, so the instrument can be entirely correct and still undeliverable. The instrument has never been run, which is how this survived thirteen intents.
- iss-2608311501240566Three of the four reading positions receive a byte-identical item set. Comparing the manifests of a real assembly at one commit, widening, comparative and detection each carry the same 951 items with the same fields, and only entailment differs, by the 346 draft and planned items the drafts asymmetry admits. That asymmetry is itd-183's and it works exactly as designed. The other three do not. The definitions state four distinct objects: widening reads the brief, glossary, disciplines, specs and shipped tree; comparative reads the candidate set, which is the widening reading's pre-admission output, against the declared selection criteria; detection reads the shipped tree against the claim record. What the assembler actually passes at comparative and at detection is the widening object unchanged. The comparative case is the sharper one, because its object is not a subset of the repository at all but the output of a previous reading, and the assembler has no channel for it -- spc-64 says as much in passing, that the in-cycle candidate set arrives by whatever channel spc-61 defines and the eval makes no claim about it, but nothing states that the position therefore receives the wrong object. No criterion measures cross-position differentiation, and the evals run on a fixture too small for the difference to show.
- itd-195A claim about how the code behaves is executable, or it is not made