Development record
The decomposition discipline requires a cross-record link to be typed with one of four relations, supersedes or reverses or duplicates or refines, and never a vague related. Only the first of those four exists. supersedes is schema-known through recordHandleFields and is carried by fifty-eight decision records and three others, while reverses, duplicates and refines appear in no schema and in no committed record anywhere in the tree: the field list a record may carry is related_adrs, related_intents, builds_on and blocked_by, and a record carrying a key outside the known set is dropped by the reader rather than reported, so writing one of the three missing words would make the record invisible to every surface that reads it. The consequence is that an author following the rule literally either writes a link the tooling silently discards or writes the relation in prose and calls it typed, and the corpus shows the second: records assert a typed link in a heading and carry no frontmatter edge, which reads as done to a human and is invisible to every graph walker. That is the shape enforcement-claims-are-facts refuses, a convention naming a mechanism that does not exist, and it is load-bearing here because the decomposition protocol is the documented gate until its automated rung ships. Fix candidates, none chosen: implement the three missing relations as known fields so the rule can be followed; or narrow the rule to the vocabulary the schema implements and say what an author does with a relation the four words cannot express; or record that prose is the sanctioned form for the three and stop calling them typed. Detector: a record asserting a typed relation in its body carries a frontmatter edge naming the same target, and a relation the schema cannot express is refused at write time rather than dropped in silence.
The decomposition discipline requires a cross-record link to be typed with one of four relations, supersedes or reverses or duplicates or refines, and never a vague related. Only the first of those four exists. supersedes is schema-known through recordHandleFields and is carried by fifty-eight decision records and three others, while reverses, duplicates and refines appear in no schema and in no committed record anywhere in the tree: the field list a record may carry is related_adrs, related_intents, builds_on and blocked_by, and a record carrying a key outside the known set is dropped by the reader rather than reported, so writing one of the three missing words would make the record invisible to every surface that reads it. The consequence is that an author following the rule literally either writes a link the tooling silently discards or writes the relation in prose and calls it typed, and the corpus shows the second: records assert a typed link in a heading and carry no frontmatter edge, which reads as done to a human and is invisible to every graph walker. That is the shape enforcement-claims-are-facts refuses, a convention naming a mechanism that does not exist, and it is load-bearing here because the decomposition protocol is the documented gate until its automated rung ships. Fix candidates, none chosen: implement the three missing relations as known fields so the rule can be followed; or narrow the rule to the vocabulary the schema implements and say what an author does with a relation the four words cannot express; or record that prose is the sanctioned form for the three and stop calling them typed. Detector: a record asserting a typed relation in its body carries a frontmatter edge naming the same target, and a relation the schema cannot express is refused at write time rather than dropped in silence.
Deferral 2026-09-29
Deferred past v0.11.1: The product thinker's ruling M23 of 2026-09-23: support all four relations as typed fields on every record and every reader. Partly delivered: the filing-time match (itd-2609212137116617, shipped) writes duplicates and refines, and the lint resolves them; reverses exists in no schema, and the other families have not been planned. Owed: planning the remainder, which opens on one question: do the missing relations land on every record family at once, or family by family?
Remedy grounds (2026-09-29)
- Ruling M23 (2026-09-23, dcn-2609230000000010) chose to build all four relations; duplicates and refines are schema-known on issues (internal/core/issueschema/issueschema.go), and reverses appears in no schema.
- The body-edge lint is the record's own detector and stops the prose-called-typed shape from recurring.
- Rejected: narrowing the rule to the implemented words, which the ruling declined.
Evidence 2026-10-04 (a downstream lab)
A downstream private project's lab reported that no frontmatter field links an intent to the ADR it carries out, only prose and the ADR's related_intents. Half of that is not so: intent frontmatter accepts related_adrs (record-lint's recordRefFields), and 62 intents in this repository carry it. The half that stands is this record's: related_adrs is the untyped related link the decomposition discipline refuses, no intent verb writes it, and "carries out" is not among the four typed relations of ruling M23, so the remainder's planning also meets the question of whether an intent-to-decision edge needs a relation of its own.
Deferral lapsed 2026-10-23
The deferral past v0.11.1 lapsed long ago and is withdrawn, on the old-majors triage of 2026-10-23. It stays open as a still-real major; no intent carries it yet. The reason it carried stays in the body above.
Checked at the default branch 2026-10-28
Partly met since: record-lint's reference fields now include reverses, duplicates and refines (internal/core/lint/schema.go), so the body's "reverses exists in no schema" is stale for the linter. The issue schema (internal/core/issueschema) still carries no reverses field.
Frontmatter
| id | iss-2609091256264547 |
|---|---|
| type | issue |
| lifecycle | open |
| severity | major |
.abcd/work/issues/open/iss-2609091256264547-three-of-the-four-mandated-typed.md
open on GitHub ↗ · commit history ↗
mentions13
- dcn-26090900000000052026-09-09 — itd-2609091034175565, the claim intent, is split into three records (maintainer, ruling after two adversarial reviews of the widened draft, design/feasibility and record-discipline). The reviews found the expensive parts unsound as drafted: a `claimed_by` stamp on an issue record is invisible to any peer on an older binary, because `issueschema.Known` is a closed allow-list whose reader refuses and skips a record carrying an unknown key and `record_schema` mirrors the refusal into the gate, and version skew is the steady state here (five plugin-cache vintages beside a `go run` checkout); the write-verb refusals fire after the fix is written, because `AGENTS.md` puts `capture resolve` in the same change as the fix; no staleness threshold is safe in both directions for two sessions in one worktree, since the worktree-exists and branch-merged tests are identical for both and a host may fire session-end on a context clear with the human still present; and the pushed half costs a merge-queue pass per claim, measured at fifteen to sixteen minutes on this repository's merge-group `ci` leg. Every collision on record is one of two claim-free shapes. The ruling: itd-2609091416295622 carries the read-only sibling-worktree ledger diff over `git worktree list --porcelain` (no claim, no lease, no hook, no threshold; the piece that ships soonest); itd-2609091416304128 carries `capture resolve` and `capture wontfix` refusing a record terminal at the local `origin/main` ref as last fetched, stating the ref's age and fetching nothing, with the same judgement rendered read-only on `abcd <record-id>`; itd-2609091034175565 keeps the claim, the lease and the refusals as a draft marked not ready, carrying the refusal-surface, liveness and pushed-price questions as open questions and the two-release stamp migration as a hard constraint. The existing record stays the claim so the `promoted_from` trail from iss-2609020716570699 — whose remedy is the claim and the pushed half — stays true rather than being retitled onto a listing the issue never proposed; the two new records reach the issue through `related_intents` on the issue and on themselves, and every relation the schema cannot type is stated in prose as a prose cross-reference (iss-2609091256264547). All three sit in `drafts/`; adoption is the interview's. Rejected: re-scoping the existing record to the listing, which keeps the trail mechanically and breaks it semantically; a fifth relation word for "split from", which is the vague form the decomposition principle forbids.
- dcn-26092300000000102026-09-23 — The four typed relations decompose-before-filing mandates are all supported (product thinker, ruling on iss-2609091256264547, choosing to build over narrowing the rule or sanctioning prose): `reverses`, `duplicates` and `refines` become real typed record fields in the schema and in every reader, beside `supersedes`. Until that lands, those relations are written in prose, the 2026-09-09 practice, because a typed field the readers do not know hides the record from them. Needs planning.
- iss-2608220150157500Issues carry no typed cross-references at all — only body mentions — so any typed-link rendering (the site's by-links arrangement, but equally any future record tooling) shows the entire issue ledger as unlinked. If issue-to-record links are wanted, the capture and resolve verbs are where they would be recorded
- iss-2609170726457256No verb stamps impact or builds_on on an existing intent draft. --impact exists only on the filing call (abcd intent "<text>" --impact) and again at the close that ships the intent (spec close --impact); between those two points a draft that was filed without a judgement has no verb that adds one, and builds_on, a schema-known frontmatter field the readers walk, has no flag on any verb at all. Relayed from the Gropius managed-repo session gropiusllm-56 on 2026-09-17, where two sessions hand-edited the frontmatter of five drafts with sed to set both fields, which bypasses every validator the verbs carry (ParseImpact, the never-internal rule for intents, the record-id shape of a builds_on target). Confirmed against the v0.9.0 command tree: intent plan takes only --production-mode, intent link writes spec_id only, and no verb names builds_on. Sibling records: iss-126 (resolved) gave impact a home at the close, and iss-2609091256264547 (open) covers the three typed relations the schema lacks; this finding is about the one relation it has and the one judgement it accepts, neither of which a verb can write onto a draft. Intent-shaped by the itd-84 four-piece table (a capability: a draft's judged fields are settable through a verb after filing), so the routing to an intent draft is the human's to confirm; recorded here first.
- iss-2609200951237670blocked_by can be written only at capture time, and only against a record that already exists. abcd capture --blocked-by refuses a target absent from the ledger ("not found in the issue ledger; nothing written"), which is right for a typo but leaves no path for the ordinary case: the blocker is captured after the blocked record, or in another lane, and no verb adds the link afterwards (the capture sub-verbs are disposition, list, mentions, promote, resolve and wontfix). The Gropius session gropiusllm-97 hand-wrote blocked_by into frontmatter on 2026-09-20 and found the key's shape by running strings on the binary; the shape is in fact documented (the issue-store README and the capture surface page both carry it), so the discoverability half is that neither the refusal nor the flag help points there. Wanted: a post-hoc link verb, abcd capture link <iss-N> --blocked-by <iss-M> (and its removal), validated the way capture validates the flag, so the edge is written by a verb whichever record came first; and the refusal naming where the field is documented. Sibling of iss-2609091256264547 (the three typed relations the schema lacks): this is the one relation it has and cannot write after the fact.
- itd-2609091034175565Before an agent starts on an item, it reserves it on the shared remote, and everyone who works on the project sees the reservation
- itd-2609091416295622A session sees the records its peers hold before it mints or fixes one
- itd-2609091416304128capture resolve refuses a record the default branch has already closed, judged by the last fetch
- itd-2609151138388536Every Decision Is Its Own Record, and the Log Stops Conflicting
- itd-2609151516525843A Repository Can Ban A Name On Its First Commit, And A Machine Can Ban One Everywhere
- itd-2609212137116617A new capture or draft is matched against the record before it is written
- itd-2609231013154443Every release arrives with a press release composed from what shipped
- itd-2609231434459890abcd's own tests warn before running on an overloaded machine