Skip to content

docs(CLAUDE.md): re-derive every section 12 pointer; 3 of 12 had rotted (BACKLOG #1073 R1/R2) - #271

Merged
wshallwshall merged 3 commits into
mainfrom
claude/r1-r2-handoff-pointer-rot-3204e2
Aug 7, 2026
Merged

docs(CLAUDE.md): re-derive every section 12 pointer; 3 of 12 had rotted (BACKLOG #1073 R1/R2)#271
wshallwshall merged 3 commits into
mainfrom
claude/r1-r2-handoff-pointer-rot-3204e2

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

R1/R2 leftovers from BACKLOG #1073. Docs only -- CLAUDE.md section 12, +10/-5.

R1 -- three of twelve pointers had rotted, all the same shape

Every section 12 pointer was re-derived against origin/main. Three named the live ledger for an
item that is closed and archived:

item was now
#26 visual/template authoring docs/BACKLOG.md docs/archive/backlog/BACKLOG-CLOSED.md
#27 serial / ASTM docs/BACKLOG.md docs/archive/backlog/BACKLOG-CLOSED.md
#222 typed action vocabulary bare number docs/archive/backlog/BACKLOG-CLOSED.md

#222 was not in the brief -- the sweep found it. The other nine resolve and were left alone,
including #232, which is genuinely still open. ADR 0076's path was added inline because Amendment D
was cited by bare number only.

Why no automated check catches this class: the markdown link to docs/BACKLOG.md still
resolves, so a link checker stays green. Only the human-readable item number silently stops being
findable there. A pointer that half-rots is invisible to every automated check we have, because the
half machines verify is the half that stays valid.

Verified with a checker proven able to fail: all 7 unique links in section 12 extracted and
resolved, and a known-bad path was run through the same checker first to confirm it reports a miss.

R2 -- DECIDED: Code_Quality_Standards.md section 4.1 gets NO back-pointer

This is the record of that decision. It is carried here deliberately, because R2 landed as an
empty commit (75398064) -- the decision was not to add an artifact -- and an empty commit's
message may not survive squash-merge.
Without this paragraph the decision would be lost.

The 5055/ASCQM decline rationale lives in CLAUDE.md section 12 and is referenced, not restated.
Section 11's state-a-load-bearing-fact-once rule governs: a restatement in 4.1 would be a second
definition that drifts from the first.

Known conflict with #269

git merge-tree --write-tree (not --is-ancestor, not a two-dot diff) says the conflict set against
claude/ascqm-gap-hunt-findings is CLAUDE.md alone; docs/BACKLOG.md auto-merges clean.

#269 inserts a new bullet immediately after the #27 bullet edited here. The changes are semantically
independent
and the resolution is keep both sides -- the rewritten #26/#27/#222 pointers and
#269's ISO 5055 bullet. Dropping either loses real content.

This branch was cut from origin/main, not stacked on #269's head, deliberately: basing on an
unmerged PR head is the stacking trap that hides a revert behind a clean three-dot diff. The cost is
that R1 landed as two-of-three rather than one pass.

Unlike the docs/BACKLOG.md collisions, this conflict is NOT ledger-bound -- no backlog
headings are added here, so ledger_check's owns() never applies and whichever PR lands second
can be resolved by anyone.

Out of scope, filed separately

docs/CONNECTIONS.md:2436 cites [BACKLOG.md](BACKLOG.md) #27 for the same archived item --
identical defect, different document.

No .venv in that worktree, so no pytest/mypy. Docs-only; all pre-commit gates passed (ledger gate,
leak guard, secret scan). Not claiming a green quartet.

Section 12's decline markers exist so a decision stays binding after its backlog
item closes and archives. The mechanism works -- #26 and #27 survive only because
they were lifted here. Their own pointers were the ones that had decayed.

Scanned all 12 pointers in section 12 against origin/main (the primary checkout
runs behind and returns confident false negatives). Re-derived each target rather
than trusting the text.

ROTTED, now fixed -- all three named the live ledger for an archived item:
  #26  visual/template authoring -> docs/archive/backlog/BACKLOG-CLOSED.md
  #27  serial / ASTM             -> docs/archive/backlog/BACKLOG-CLOSED.md
  #222 typed action vocabulary   -> docs/archive/backlog/BACKLOG-CLOSED.md
       (#222 was a bare "BACKLOG #222" with no path, which reads as the live
       ledger; it is closed. Not named in the brief -- found by the sweep.)

LEFT AS-IS, verified to resolve:
  ADR 0037 / 0063 / 0039 paths     -- all three files exist
  ADR 0007 (bare, "see section 1") -- section 1 carries the path, file exists
  ADR 0076 Amendment D             -- exists, 0076-typed-action-...md:658
  BACKLOG #232                     -- genuinely still open in docs/BACKLOG.md
  docs/CONNECTIONS.md              -- still carries the serial decline, :2436
  parse_items, section 11, section 1 -- resolve

Added the ADR 0076 path inline, since Amendment D was cited by bare number only.

Verification: extracted every markdown link target in section 12 and resolved it
(7 unique, all OK), with a deliberately-broken path run through the same checker
to prove it can report a miss.

No gate added. A backlog number resolving to an archived item is not mechanically
distinguishable from one resolving to nothing without encoding the archive's
shape, and a gate that fails on a legitimate archive is one people delete.

NOT included: #1073's marker. It is not on origin/main -- it is in PR #269, still
open, and it already cites the archive correctly. Basing on an unmerged PR head is
the stacking trap, so this branch is cut from origin/main. PR #269 inserts a new
bullet immediately after the #27 bullet this commit edits; the two are
semantically independent but adjacent, so expect a textual conflict and keep both.
…ointer to #1073

R2 of the #1073 leftovers. The B5 brief left this "optionally" and nobody had
chosen. Deciding it NO, and recording the decision, because an unresolved
"optionally" is indistinguishable from a deliberate omission six months later --
which is exactly how #1073's own unpinned status came about.

Deliberately no file change. The decision is not to add an artifact, so an empty
commit is the whole record.

The case for was real: section 4.1 is the anti-metric rule the ISO 5055 decline
turns on, and a reader wondering whether 4.1 has ever been applied to a live
proposal gets no answer from 4.1 itself.

Rejected because:

1. R1, in this same branch, is the evidence. Three of section 12's twelve
   pointers had rotted, and the two rotted ones named in the brief were #26 and
   #27 -- the very entries cited as proof that lifting a decline into section 12
   makes it outlive its item. The decision survived; the trail back to it did
   not. This estate's demonstrated failure mode is pointers decaying, not
   decisions being unfindable.

2. It would be a fourth copy of the same pointer (the backlog item, the section
   12 marker, PR #269's prose, and 4.1), in a repo already bitten by the install
   procedure in three copies and the reference table in two.

3. It would be born rotted. #1073 is closed by PR #269 and archives on merge, so
   a clause written today naming docs/BACKLOG.md acquires the exact defect R1
   just cleaned up.

4. Section 4.1 is a four-sentence hard rule carrying no worked examples for any
   of the metrics it bans. A #1073 example would be the only one, which reads as
   though 5055 were the rule's primary case rather than one application of it.

Section 12 holds the binding decision, which is what that mechanism is for.
Reopening needs a reason that outweighs the maintenance cost, not just the
observation that the cross-reference is absent.
@wshallwshall
wshallwshall enabled auto-merge (squash) August 7, 2026 16:12
Resolves the CLAUDE.md section 12 conflict predicted before #269 landed. #269
merged as f28359e while this PR was being opened.

KEPT BOTH SIDES, as the two changes are semantically independent:
  ours   -- the #26 / #27 / #222 pointers re-derived onto BACKLOG-CLOSED.md
  theirs -- #269's new ISO/IEC 5055 / ASCQM decline bullet

DROPPED, and this is the only deletion: main's stale
`([docs/BACKLOG.md](docs/BACKLOG.md) #27, ...)` line. It is the pre-fix text of
the very bullet this branch rewrites, carried in as context by #269's insertion
directly beneath it -- not content #269 authored. Keeping it would have restored
the rot.

Verified after resolution rather than assumed:
  - no conflict markers remain
  - all four spans present: #26, #27, #222 rewrites AND the ISO 5055 bullet
  - the stale #27 line is gone
  - every link target in the merged section 12 resolves (8 unique, all OK),
    with a known-bad path run through the same checker to prove it reports a miss
  - re-resolved every cited number against the post-merge tree: #26/#27/#222
    archived, #232 live, #1073 live-but-closed -- so #269's "once archived"
    wording is correct and its dual citation is satisfied

Merged rather than rebased so the PR's auto-merge arming survives.
@wshallwshall
wshallwshall merged commit befe997 into main Aug 7, 2026
32 checks passed
@wshallwshall
wshallwshall deleted the claude/r1-r2-handoff-pointer-rot-3204e2 branch August 7, 2026 16:17
wshallwshall added a commit that referenced this pull request Aug 7, 2026
…napshot, file #1095 (#276)

Three corrections to the ledger's own accuracy, in one commit because they
cross-reference: #1094 and the ranking note both point at #1095, so splitting
them leaves an intermediate commit citing an item that does not exist yet.

1. #1094 CLOSED as already satisfied when filed; no work performed.

   Its premise is false on origin/main. The repoint it asks for merged as
   befe997 (PR #271) ONE COMMIT BEFORE the item itself landed (7ecff8a, PR
   #272) -- a filing race, not a wrong finding. Re-verified after both: CLAUDE.md
   section 12 now reads "BACKLOG #26 -- closed, so it lives in
   docs/archive/backlog/BACKLOG-CLOSED.md, not in the live ledger", same for #27.

   Banner flipped from the OPEN glyph to a CLOSED one -- replaced, not added, so
   the item still declares exactly one status. The analysis is kept: its point
   that no gate in this repo can catch the class is the argument any future
   check has to answer, and it is now attached to #1095 at true scale.

2. The "Connector & feature-breadth gaps vs. Mirth Connect" section marked a
   historical snapshot.

   All TEN backlog numbers it cites -- #7, #20-#27, #35 -- have closed and moved
   to the archive; none is in this file. So "#7 above" and "#35 below" are false
   directions out of the document, and "P1 -- close first" names work that
   shipped: #20 (FHIR, ADR 0022) and #21 (observability, PR #407). The section
   marks #24 and #35 SHIPPED inline, which makes the unmarked #20/#21 read as
   still open. A reader planning from this picks up finished work.

   Deliberately NOT repointed per-number. Every cited item is archived, so
   attaching an archive path to only the two decline-by-design lines would assert
   by contrast that the other eight are live. Uniform staleness is at least
   detectable; differentiated staleness is not.

3. #1095 filed for the systemic class. Number allocated via
   scripts/coord/alloc.ps1, never grepped.

   Measured on origin/main with parse_items (imported, not re-derived): of 129
   path-bearing BACKLOG.md citations, AT LEAST 69 distinct sites across AT LEAST
   35 files name the live ledger for an archived item. Plus 13 hrefs that do not
   resolve at all, 12 line anchors past EOF (file is 6318 lines; one cites 8429),
   and 31 in-range anchors that drifted onto unrelated text.

   The item's central point is DETECTABILITY, because getting this wrong means
   someone closes it with a linter having fixed a third of it: the 13 broken
   hrefs and 12 past-EOF anchors are catchable, but the 69 wrong-file citations
   and the 31 drifted anchors are NOT -- those links resolve perfectly, and what
   rots is the number or the line beside them.

   It also records that the test is "does the cited FILE contain the item", not
   "is the item CLOSED". Those differ: #1073 is closed and still legitimately in
   the live ledger, so a sweep keyed on closure would corrupt correct citations.

   Prior art found and named rather than duplicated: MIG-35 is already "the
   BACKLOG-reference classifier" folding into MIG-74 in the master test plan
   (:128). The item notes MIG-74 as worded -- "every doc path resolves" -- would
   pass the largest class untouched, since those paths do resolve.

Verification:
  - parse_items diffed before and after: exactly two items changed state, #1094
    (open -> closed) and #1095 (new). No unintended banner churn.
  - backlog_status_check.py: OK, 365 items, each declaring exactly one status.
  - All 7 link targets introduced were resolved from docs/, with a known-missing
    path run through the same checker to prove it can report a miss.
  - The MIG-74 quote was confirmed verbatim in the source file, not paraphrased
    from an agent's summary.
  - Line endings normalized to CRLF to match the file; diff stayed at 50/2
    rather than whole-file churn.

Not included: the ~69-site sweep itself and any gate. Those are #1095's scope,
and a partial repoint is worse than none for the reason given in item 2.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant