docs(CLAUDE.md): re-derive every section 12 pointer; 3 of 12 had rotted (BACKLOG #1073 R1/R2) - #271
Merged
Merged
Conversation
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
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
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
R1/R2 leftovers from BACKLOG #1073. Docs only --
CLAUDE.mdsection 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 anitem that is closed and archived:
docs/BACKLOG.mddocs/archive/backlog/BACKLOG-CLOSED.mddocs/BACKLOG.mddocs/archive/backlog/BACKLOG-CLOSED.mddocs/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.mdstillresolves, 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.mdsection 4.1 gets NO back-pointerThis 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'smessage 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 againstclaude/ascqm-gap-hunt-findingsisCLAUDE.mdalone;docs/BACKLOG.mdauto-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 anunmerged 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.mdcollisions, this conflict is NOT ledger-bound -- no backlogheadings are added here, so
ledger_check'sowns()never applies and whichever PR lands secondcan be resolved by anyone.
Out of scope, filed separately
docs/CONNECTIONS.md:2436cites[BACKLOG.md](BACKLOG.md) #27for the same archived item --identical defect, different document.
No
.venvin that worktree, so no pytest/mypy. Docs-only; all pre-commit gates passed (ledger gate,leak guard, secret scan). Not claiming a green quartet.