Development record
A reading is commissioned about something, so the invocation takes a scope
Context
The maintainer rulings of 2026-08-28 closed the cold-reading assembler's invocation at two operands. Ruling M8 is recorded in itd-183 in these words:
No free text at any position — ruled as M8, stricter than proposed: position and target state only. The ids-only comparative argument proposed here is superseded; it survives only as the recorded fallback if the evaluative position proves to need candidates at invocation.
Brief invariant 15 carries the same closure into the brief: a reading's invocation "carries no free text (position and target state only)".
The reason for that closure is sound and is not in question here. A free-text operand is a channel through which the framing of a request could reach a reading that is supposed to be blind to it. Closing the invocation closed the channel structurally, which is the shape this repository prefers over a promise.
What the closure did not anticipate is that the object it left the instrument
pointed at is too large to hand to anything. Measured over this repository at
one commit, an assembly is about 9.2 MB and roughly 2.4 million estimated
tokens at every position (iss-2608311501186646, and the per-kind figures
itd-198 now reports). Three of the four positions receive a byte-identical item
set (iss-2608311501240566), so the interface cannot express what distinguishes
four readings that are about four different things. The instrument is correct
and unusable, and it is unusable because it cannot be pointed at anything.
itd-183's ac-3 anticipated exactly one revision if a need were shown: "a shape-validated record-id list, never prose", conditioned on the evaluative position proving to need candidates at invocation, and restricted to the intent family. itd-199 needs something wider on all three counts. Reading the fallback as though it already permitted a general scope operand would be a misreading — the kind this repository has been bitten by before, where a rule's spirit is cited and its letter quietly exceeded. Hence this ADR rather than a sentence in an intent.
Decision
The cold-reading assembler's invocation takes a third operand, a scope, in a closed grammar of three token forms: a record id, a record family, or the name of a committed preset. M8's "position and target state only" is superseded to that extent and to no other.
The property M8 and invariant 15 were protecting is restated as the property that now binds: no operand carries prose. That is what the two-operand closure achieved, and it is what the three-operand interface must continue to achieve.
Each token form clears that bar, and the third clears it by a different argument from the first two, which is stated here because conflating them is how the record would come to overclaim:
- A record id and a record family are shape-validated closed forms. A validator either recognises the token or refuses it; there is no residue in which a sentence could travel.
- A preset name is not a record-id list and must not be defended as one. It resolves into a committed file, and that file may name repository paths — it must, because source is 82 per cent of the measured weight and no scope expressible in record ids alone can reach it. The safety argument is different and, at the boundary this ADR governs, stronger: the expansion is reviewed, shape-validated, committed, and inside the dirty gate, so it is a repository fact a reader can audit rather than something typed at a prompt.
No repository path is accepted at the invocation. A path typed at a prompt is prose by another name and is refused, which is what keeps the preset file load-bearing rather than decorative.
Consequences
- Brief invariant 15 moves. Its parenthetical is an exhaustive enumeration of the operands, so it is amended to name the scope and to state the no-prose property directly. The invariant's other clauses — positive inclusion, default exclusion, context isolation, the transcript store's enumerated consumer list — are untouched.
- itd-184's operand pin fires, as designed. The pinned operand set fails closed on any addition so that a new operand must say what it does before it ships. This ADR is that statement; the pin is updated in the same change.
- The preset file joins the dirty gate. An uncommitted edit to it reshapes an assembly as surely as an edit to a record does, and the record-lint configuration is already named into that set by exactly this argument.
- The evaluative position's fallback is not taken. M8's one anticipated revision was conditioned on the comparative position needing candidates at invocation. That condition is not what triggered this decision, and itd-199 makes comparative refuse rather than serve it a corpus that is not its object. The fallback therefore remains unexercised and available, and this ADR does not consume it.
- The blindness core is untouched. A scope changes how much a reader was given. It changes nothing about the seven blindness conditions, which all four definitions carry verbatim and continue to carry. There is no warm definition, and this decision does not create one.
Status note
Accepted by the maintainer on 2026-08-31. It was drafted as proposed and
held there deliberately: it supersedes a maintainer ruling and amends a brief
invariant, and neither is an agent's act. The accompanying amendment to
invariant 15 was drafted in the same change and is adopted with it.
Frontmatter
| id | adr-58 |
|---|---|
| type | adr |
| status | superseded |
| date | 2026-08-31 |
.abcd/development/decisions/adrs/0058-a-reading-is-commissioned-about.md
open on GitHub ↗ · commit history ↗
References5
- adr-55The construal stands in the record; its history does notrelated
- adr-56An exclusion control asserts only what it can proverelated
- itd-183The cold reading sees exactly what the assembler passes — positive inclusion, field projection, and a per-run manifestrelated
- itd-184Four cold-reading definitions, one blindness core — each position licenses a different output, and none may hold another's licencerelated
- itd-199A reading is about something narrower than everything, and its scope is a committed, adjustable choicerelated
Referenced by3
- adr-2609021016272867The comparative reading receives one widening run's candidates, a positional exception to the prior-run exhaust, with the run derived from the record and no operand addedrelated
- adr-2609021016286571The invocation is a position and a target state, and the committed preset for the position supplies the restrelated
- adr-2609021016286571The invocation is a position and a target state, and the committed preset for the position supplies the restsuperseded by
mentions14
- dcn-26090200000000102026-09-02 — The invocation is a position and a target state and nothing else, as the design specifies (maintainer: "all I want is to run Iteration 2 exactly as designed in v4"). adr-2609021016286571 supersedes adr-58: the scope operand and the override stamp go, the committed preset for the position supplies what the reading is handed, and changing it is a commit. adr-2609021016272867 is corrected the same day from a named candidate-run operand to a derived selection: the comparative assembly takes the one committed widening run at the target whose items carry no disposition and no admission, and refuses naming the runs when none or more than one qualifies. Both corrections close the only two points at which the record contradicted the framework's and the companion's letter on the invocation; the earlier entry today that recorded the named operand is superseded by this one.
- dcn-26090200000000112026-09-02 — adr-56's third rule is refined, not contradicted, by the source-and-tests ruling (maintainer): a control that admits an input it cannot examine may pass it only with a per-item unscanned mark in its attestation, so the second rule (an attestation never says more than the examination) carries what the third rule carried; refusal stays the rule for an input the control claims to have examined and could not. Invariant 16 amended to say so. Every ADR is now checked against the framework v4 and the companion v4: adr-58 is superseded by adr-2609021016286571, adr-2609021016272867 is corrected to the derived run, and none of adr-55, adr-57, adr-2609021016275803, adr-2609021016270132, adr-2609021016288378 or adr-2609021016286571 contradicts either document. The two-hundred-thousand-token target is a clarification the documents do not speak to, kept as such.
- 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.
- iss-2609011424116881v0.7.0 ships a verb and four agents the brief does not document anywhere. These
- iss-2609012259585969The readings companion design document counts five disposition states over a four-row table and still describes a two-operand invocation
- iss-2609020626100041ADR owed: the comparative channel admits two fields of one widening run's items from the readings family at one position, a positional exception to the prior-run exhaust
- iss-2609090715154147The convention is that a decision record is never amended in place: when a decision changes, a new record is minted and the old one is marked superseded by it, so the decision history stays legible and a reader of the old record is pointed forward rather than misled. Nothing in the tree states it. The typed-link vocabulary is recorded in .abcd/development/principles/decompose-before-filing.md as supersedes / reverses / duplicates / refines, and adr-58 and adr-2609021016286571 demonstrate the shape in practice, but the rule that amendment is not an option is carried only by example, so an agent or a contributor reaching for the smaller edit has nothing to read that refuses it. The gap surfaced when a relocation of the transcript corpus made adr-29's stated location wrong and the question of amend-versus-supersede had to be asked rather than looked up. Fix: state the rule where the conventions live, in the AGENTS.md decisions section or as a principle under .abcd/development/principles/, naming the two typed links and the one edit a superseded record does receive, and say why: an amended record erases the fact that the decision changed, which is the thing the record family exists to preserve. Detector: the conventions text names the rule and a docs test or record-lint rule refuses a decisions section that omits it, or at minimum the rule is present where a contributor reading AGENTS.md would meet it before editing a record.
- iss-2610262031492489Invariant 15 refuses any path at a reading's invocation, but itd-86's cold reading takes exactly one target document.
- iss-2610262031532200itd-199 ships a scope operand at invocation that it says was 'carried into brief invariant 15'; invariant 15 says that operand is superseded and the operands are position and target only.
- itd-198An assembly reports what it would cost before a reading is commissioned
- itd-2609021003095168The invocation is a position and a target state, and the committed preset for the position supplies what the reading is handed
- spc-69The scope operand: a reading is commissioned about something, in a closed grammar, from a committed preset
- spc-2609021004075744The invocation is a position and a target state: the scope operand and the override stamp leave, and the committed preset for the position is applied by the assembler