Skip to content

ADR-027 cites a rejection that does not exist in ADR-025, and inherits from a Draft #1424

Open

Description

@lilyshen0722

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.

Activity

  1. lilyshen0722 commented on Sep 1, 2026

    @lilyshen0722
    ContributorAuthor

    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:

    1. 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.
    2. 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.

  2. lilyshen0722 commented on Sep 1, 2026

    @lilyshen0722
    ContributorAuthor

    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.

  3. lilyshen0722 commented on Sep 2, 2026

    @lilyshen0722
    ContributorAuthor

    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:

    • :47 D3 → D10 — and D10 is the literal target, it ends "The map is the routing table."
    • :73 D2 → D9 ("Transport is kernel; curation is agent")
    • :272 D2 → D9
    • :174 D6 — 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.

  4. lilyshen0722 commented on Sep 2, 2026

    @lilyshen0722
    ContributorAuthor

    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. :47 D3→D10, :73 and :272 D2→D9, :174 D6 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions