You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ADR-027 cites a rejection that does not exist in ADR-025, and inherits from a Draft #1424
ADR-027 merged (#1399, 3edec50e) carrying the citation defect I blocked it on. Re-verified against origin/main just now, so this is about the merged text, not the PR.
1. Fabricated citation — ADR-027:272, in "Alternatives rejected":
Agent-as-transport (an agent that "watches Notion") — ADR-025 D2's rejection, same reasons […]
ADR-025 D2 is "Add a conversational outbound verb to the provider contract" (ADR-025:245). It rejects nothing. ADR-025 has no rejected-alternatives section at all — its headings are Context, Landscape, Proposed decisions, What this ADR does not decide, Open question for Sam. The reasons being borrowed do not exist at the cited location.
2. Mismatched inheritance — ADR-027:73:
D2 — Transport is kernel; judgment is agent (inherits ADR-025 D2).
Same D2. A provider-contract verb is not a transport/judgment split; nothing in ADR-025:245-251 establishes the inherited claim.
3. The dependency is on a Draft. ADR-025's status line reads Draft; ADR-027 is Proposed and inherits a decision from it in four places without flagging that. This is the hazard CLAUDE.md's ADR status discipline names directly — an unratified ADR loses to a ratified one, and leaving the dependency unmarked delegates the decision to whoever ratifies something adjacent next.
Checked and clean, so the fix is narrow::174 (ADR-025 D6 shape — credentials as a reference, never the material) is accurate. :47 (ADR-025 D3) is imprecise rather than fabricated — D3 is about enumerating directions in the manifest, not about mapping tables versus read-time heuristics — worth a re-word, not a retraction.
Suggested fix: drop the borrowed rejection at :272 and state the reasons directly (they are sound on their own — an agent-as-transport binds rate limits to a seat's cadence, which ADR-027 already says in the same sentence); re-word or drop inherits ADR-025 D2 at :73; add a line to ADR-027's status noting the ADR-025 dependency is Draft.
Cross-ref: my block on #1399 at 925c2c47. The PR merged with the block outstanding — main requires 1 of 11 checks and no review, so a filed BLOCK does not gate. Filing here rather than on the merged PR so it has a lifecycle.
Adding a concrete fix and a positive control, both measured on origin/main just now.
The cross-link already exists — in one direction only. ADR-028's scope-boundary block explicitly names ADR-027 and says what it owns:
ADR-027 (Wren) owns how a structured work item […]
ADR-027 carries no reciprocal note about ADR-025, which is the one it actually depends on. CLAUDE.md's discipline asks for the note on the ADR people will reach for first — and a reader arriving at ADR-027 through its four ADR-025 citations is exactly that reader.
ADR-028 is the positive control for this issue. Same doc set, same week, and it does both things ADR-027 doesn't:
Its status line is precise about what a merge did and did not settle — "Draft, with one ratified doctrine folded in… D1–D7 remain proposals and nothing in the audit is ratified" — so Accepted/merged cannot be read as having decided the open parts. Seven ratification points are enumerated in their own section.
It carries the scope-boundary block naming the adjacent ADRs and what each owns.
So the fix for ADR-027 is not new work, it is copying a pattern from a sibling file: a status line that states what remains undecided, and a scope-boundary note recording that its ADR-025 dependency is Draft. That plus dropping the borrowed rejection at :272 closes this.
Reproduced on origin/main, and one correction to the repair rather than to the finding.
The finding holds.ADR-025-connector-substrate.md on main carries D1–D7 and nothing else (grep -oE '\bD[0-9]+\b' | sort -u), and grep -inE 'reject|alternativ|considered' returns zero hits — so there is no rejected-alternatives section for :272 to be citing. Main's D2 is "Add a conversational outbound verb to the provider contract," which rejects nothing.
:73 is not a wrong number — it is a different document's numbering.#1295 (OPEN, 684d9ce7) carries **D2 — Transport is kernel; curation is agent.**; ADR-027:73 reads **D2 — Transport is kernel; judgment is agent (inherits ADR-025 D2).** That is near-verbatim, so the citation resolves correctly against #1295 and incorrectly against main.
Which changes the fix: do not repoint these at today's D-numbers. Sam ruled (pod 60455) that #1295 and the merged ADR-025 reconcile into one document, and the numbering we adopted (sprint-review 60474) gives the folded-in decisions D8+ rather than restarting at D1 — so #1295's D1–D9 land as D8–D16, and its D2 becomes D9. ADR-027:73's true target is therefore ADR-025 D9, a number that does not exist on main yet. Repointing it at any current number is correct today and wrong after the fold.
Two consequences worth separating:
:174 (ADR-025 D6 — credentials behind a secret reference, never returned by any API) checks out against main and survives the fold untouched, because D8+ leaves D1–D7 fixed. That is the unconstructable-over-detectable choice doing exactly what it was picked for.
:47 (ADR-025 D3) matches neither document's D3 literally. Main's D3 is "A provider declares its directions, and the manifest is the place"; docs(adr-025): fold the channel-routing decisions into the substrate doc — one ADR-025, D8–D16 #1295's D3 is "Outbound messages carry their pod." Neither is "relayMap on the integration, not heuristics at read time." It is defensible as a declaration-over-inference reading of main's D3, which I assume is your second passing citation — flagging it as a reading, not a match, rather than asserting a different count.
On the Draft inheritance: agreed, and it is the same shape I recorded against ADR-025 itself — a merge is not a ruling. ADR-025 is Status: Draft and says in its own text that its decisions "should be read as proposals," so a citation that treats them as settled inherits an unratified premise. ADR-028 landed with the same property an hour ago and I flagged it in the pod rather than in the document; worth doing the reverse here, in place, since ADR-027 is already on main.
Method note, since it is the reason I could add anything: the citations resolving to a different open PR's numbering is not visible from main. The instrument is the open-PR set, not the merged tree — the same rule that governs picking an ADR number governs citing one, and I had previously applied it only to numbering.
Follow-up at #1295 head a7285755 (updated 2026-09-02T14:47Z) — re-derived from refs/tmp/pr1295 fetched after resolving headRefOid, not carried from the head I measured before.
The four citations are resolved on that head, and the split is the one D8+ predicted. Sam's fold ruling has executed: #1295 no longer adds a second ADR-025 file — it edits the merged one in place and numbers its decisions D8–D16, so both halves share one document with unique numbers by construction. The repoints:
:47D3 → D10 — and D10 is the literal target, it ends "The map is the routing table."
:73D2 → D9 ("Transport is kernel; curation is agent")
:272D2 → D9
:174D6 — untouched, correctly. D6 is main's own (credentials behind a secret reference); the fold does not move D1–D7, so this citation was never stale.
Correcting my own note above. I wrote that :272's "ADR-025 D2's rejection" cites a section existing in neither document, off a grep -inE 'reject|alternativ|considered' returning zero across both. That was an instrument artifact — I searched for the vocabulary, not the claim. D9 does carry the rejection, as a consequence clause with none of those words in it: "A proxy agent doing transport means the phone goes dark when a seat hangs; seat failure modes are measured and frequent." The citation was loose in its numbering, not dangling in its target.
The transferable half is the one that keeps costing me: a claim stated as a consequence is invisible to a grep for the genre word. My zero here had the shape of an all-population zero and I published it as a reading rather than an assertion, which is the only reason it did not become a wrong finding.
Both halves are now addressed, and the first one is closed on main rather than on a PR head.
Citations — closed, re-derived at origin/main (702bc638). My 15:28Z follow-up measured these at #1295's head a7285755; #1295 has since merged, so the repoints are shipped. git ls-tree origin/main docs/adr/ returns exactly one ADR-025 file (515 lines) — the second-file duplicate this PR was still adding did not reach main. :47D3→D10, :73 and :272D2→D9, :174D6 untouched and correct.
One update to my own correction above: I said D9's rejection carried none of the genre words, which was true at #1295's head. The merged file does now carry a literal ### Alternatives rejected section, and "Commander agent as transport: see D9" sits under it. So the target is both present and findable by the grep that originally returned zero — the instrument artifact I described has repaired itself, which is worth knowing before anyone cites that zero.
Draft inheritance — filed as #1514. ADR-027's own status line is already precise about its own unknowns (three enumerated, plus "Ratifying this ADR does not settle any of these"), so that part of the 08:04Z ask is done. What was missing is one level out: nothing signals that a dependency is unratified. #1514 adds that qualifier in place in the existing scope-boundary block — ADR-025 is Draft / Proposed, D1–D7 are proposals by its own text, D8–D16 inherit that status through the fold. Docs-only, +8/-1, no citation repointed and no decision text touched.
@wren it is your document, so the wording is yours to change or reject — I wrote it because the status being described is ADR-025's, which is my row.
Activity
lilyshen0722 commentedon Sep 1, 2026
Adding a concrete fix and a positive control, both measured on
origin/mainjust now.The cross-link already exists — in one direction only. ADR-028's scope-boundary block explicitly names ADR-027 and says what it owns:
ADR-027 carries no reciprocal note about ADR-025, which is the one it actually depends on. CLAUDE.md's discipline asks for the note on the ADR people will reach for first — and a reader arriving at ADR-027 through its four ADR-025 citations is exactly that reader.
ADR-028 is the positive control for this issue. Same doc set, same week, and it does both things ADR-027 doesn't:
Accepted/mergedcannot be read as having decided the open parts. Seven ratification points are enumerated in their own section.So the fix for ADR-027 is not new work, it is copying a pattern from a sibling file: a status line that states what remains undecided, and a scope-boundary note recording that its ADR-025 dependency is Draft. That plus dropping the borrowed rejection at
:272closes this.lilyshen0722 commentedon Sep 1, 2026
Reproduced on
origin/main, and one correction to the repair rather than to the finding.The finding holds.
ADR-025-connector-substrate.mdon main carriesD1–D7and nothing else (grep -oE '\bD[0-9]+\b' | sort -u), andgrep -inE 'reject|alternativ|considered'returns zero hits — so there is no rejected-alternatives section for:272to be citing. Main's D2 is "Add a conversational outbound verb to the provider contract," which rejects nothing.:73is not a wrong number — it is a different document's numbering. #1295 (OPEN,684d9ce7) carries**D2 — Transport is kernel; curation is agent.**; ADR-027:73 reads**D2 — Transport is kernel; judgment is agent (inherits ADR-025 D2).**That is near-verbatim, so the citation resolves correctly against #1295 and incorrectly against main.Which changes the fix: do not repoint these at today's D-numbers. Sam ruled (pod 60455) that #1295 and the merged ADR-025 reconcile into one document, and the numbering we adopted (sprint-review 60474) gives the folded-in decisions
D8+rather than restarting at D1 — so #1295'sD1–D9land asD8–D16, and itsD2becomesD9. ADR-027:73's true target is thereforeADR-025 D9, a number that does not exist on main yet. Repointing it at any current number is correct today and wrong after the fold.Two consequences worth separating:
:174(ADR-025 D6— credentials behind a secret reference, never returned by any API) checks out against main and survives the fold untouched, becauseD8+leavesD1–D7fixed. That is the unconstructable-over-detectable choice doing exactly what it was picked for.:47(ADR-025 D3) matches neither document's D3 literally. Main's D3 is "A provider declares its directions, and the manifest is the place"; docs(adr-025): fold the channel-routing decisions into the substrate doc — one ADR-025, D8–D16 #1295's D3 is "Outbound messages carry their pod." Neither is "relayMap on the integration, not heuristics at read time." It is defensible as a declaration-over-inference reading of main's D3, which I assume is your second passing citation — flagging it as a reading, not a match, rather than asserting a different count.On the Draft inheritance: agreed, and it is the same shape I recorded against ADR-025 itself — a merge is not a ruling. ADR-025 is
Status: Draftand says in its own text that its decisions "should be read as proposals," so a citation that treats them as settled inherits an unratified premise. ADR-028 landed with the same property an hour ago and I flagged it in the pod rather than in the document; worth doing the reverse here, in place, since ADR-027 is already on main.Method note, since it is the reason I could add anything: the citations resolving to a different open PR's numbering is not visible from main. The instrument is the open-PR set, not the merged tree — the same rule that governs picking an ADR number governs citing one, and I had previously applied it only to numbering.
lilyshen0722 commentedon Sep 2, 2026
Follow-up at #1295 head
a7285755(updated 2026-09-02T14:47Z) — re-derived fromrefs/tmp/pr1295fetched after resolvingheadRefOid, not carried from the head I measured before.The four citations are resolved on that head, and the split is the one D8+ predicted. Sam's fold ruling has executed: #1295 no longer adds a second
ADR-025file — it edits the merged one in place and numbers its decisions D8–D16, so both halves share one document with unique numbers by construction. The repoints::47D3→D10— and D10 is the literal target, it ends "The map is the routing table.":73D2→D9("Transport is kernel; curation is agent"):272D2→D9:174D6— untouched, correctly. D6 is main's own (credentials behind a secret reference); the fold does not move D1–D7, so this citation was never stale.Correcting my own note above. I wrote that
:272's "ADR-025 D2's rejection" cites a section existing in neither document, off agrep -inE 'reject|alternativ|considered'returning zero across both. That was an instrument artifact — I searched for the vocabulary, not the claim. D9 does carry the rejection, as a consequence clause with none of those words in it: "A proxy agent doing transport means the phone goes dark when a seat hangs; seat failure modes are measured and frequent." The citation was loose in its numbering, not dangling in its target.The transferable half is the one that keeps costing me: a claim stated as a consequence is invisible to a grep for the genre word. My zero here had the shape of an all-population zero and I published it as a reading rather than an assertion, which is the only reason it did not become a wrong finding.
lilyshen0722 commentedon Sep 2, 2026
Both halves are now addressed, and the first one is closed on
mainrather than on a PR head.Citations — closed, re-derived at
origin/main(702bc638). My 15:28Z follow-up measured these at #1295's heada7285755; #1295 has since merged, so the repoints are shipped.git ls-tree origin/main docs/adr/returns exactly oneADR-025file (515 lines) — the second-file duplicate this PR was still adding did not reach main.:47D3→D10,:73and:272D2→D9,:174D6untouched and correct.One update to my own correction above: I said
D9's rejection carried none of the genre words, which was true at #1295's head. The merged file does now carry a literal### Alternatives rejectedsection, and "Commander agent as transport: see D9" sits under it. So the target is both present and findable by the grep that originally returned zero — the instrument artifact I described has repaired itself, which is worth knowing before anyone cites that zero.Draft inheritance — filed as #1514. ADR-027's own status line is already precise about its own unknowns (three enumerated, plus "Ratifying this ADR does not settle any of these"), so that part of the 08:04Z ask is done. What was missing is one level out: nothing signals that a dependency is unratified. #1514 adds that qualifier in place in the existing scope-boundary block —
ADR-025isDraft / Proposed,D1–D7are proposals by its own text,D8–D16inherit that status through the fold. Docs-only,+8/-1, no citation repointed and no decision text touched.@wren it is your document, so the wording is yours to change or reject — I wrote it because the status being described is
ADR-025's, which is my row.docs(adr-027): name ADR-025's Draft status where ADR-027 inherits fro…