docs(memory): B-0451 per-collision renumber procedure (durable substrate from session arc)#3066
Conversation
…ate from session arc) Captures the procedure pattern that emerged from this session's 5 ID-collision-resolution PRs (#3053 B-0444, #3057 B-0068.1, #3058 B-0090.x, #3065 B-0370-0373, plus the in-flight audit tool #3056). Key precedence rule documented: **external-references trumps first-merged-wins**. The row that would cost more to migrate keeps its ID, regardless of who filed first. Both PR #3057 and PR #3065 bent first-merged-wins this way after re-examining external refs. 9-step recipe covers: 1. Identify colliding rows via audit-duplicate-row-ids.ts 2. Find external references (parent body, sibling depends_on, memory, PR history, BACKLOG.md) 3. Apply precedence rules in order (external-refs > first-merged > status-precedence) 4. Pick next-free IDs (check origin/main AND open PRs) 5. Create isolated worktree (multi-Otto split-brain prevention) 6. Rename files + edit frontmatter (`renumbered_from:` + reason) 7. Batch connected components (preserve internal dep chain) 8. Update parent's body + regen BACKLOG.md 9. Verify + commit + push + PR Three substrate-honest pitfalls documented: - BLOCKED ≠ failed CI (often just branch-out-of-date) - Initial analysis can point wrong (re-examine when rules disagree) - ID collisions hide in substrate for weeks (run audit BEFORE filing) Remaining work captured: 3 collision groups (B-0409 3-way, B-0410, B-0411) — all 2026-05-11 pre-claim-acquire-rule decomposition races. Each takes ~5-10 min following this procedure. This is a low-rate-limit-cost substrate landing (memory file + generated index regen avoided) chosen this tick over picking another cleanup PR per the previous tick's restraint discipline. Co-Authored-By: Claude <noreply@anthropic.com>
Records: captured the per-collision renumber procedure from the session's 5 collision-resolution PRs into a 242-line memory file (PR #3066). Procedure distills external-references-trumps-first- merged precedence rule + 9-step recipe + 3 substrate-honest pitfalls + remaining-work map (3 collision groups for future tick). Restraint discipline continued: did NOT open another cleanup PR this tick. Memory file is the low-rate-limit-cost durable alternative. Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR adds a durable memory entry documenting the B-0451 duplicate backlog-row ID renumbering procedure and precedence rule.
Changes:
- Adds a 9-step procedure for resolving duplicate backlog row IDs.
- Captures the external-references-over-first-merged precedence rule.
- Records pitfalls and remaining collision cleanup work.
Four issues addressed: 1. **Required `created:` frontmatter field added** — memory file was missing it (caught by check-memory-frontmatter-completeness CI workflow; the reindexer requires name/description/type/created). 2. **MD018 on 0034Z.md:35** — line started with `#3056)` which markdownlint parsed as a malformed ATX heading. Reworded PR-number references to `PR-3056` style in that one paragraph to avoid the line-start hazard. 3. **Copilot review (grep recipe portability)** — the original `grep -rn "B-0XXX\b" ...` recipe treats the ID as regex (so `B-0068.1` `.` matches any character) AND uses `\b` which is a GNU-grep extension not portable to BSD grep on macOS. Replaced with `grep -rnF` (fixed-string match) + a portable word-boundary filter `[^0-9.]|$`. Documented both whole-row and sub-row ID cases explicitly. 4. **Copilot review (branch-behind state)** — separate concern; resolved by `gh api -X PUT pulls/3066/update-branch` (audit tool + B-0451 row are on origin/main; the branch was just out-of-date). Triggered post-commit. Co-Authored-By: Claude <noreply@anthropic.com>
Records: PR #3066 surfaced 2 reviewer threads + 2 CI failures, all real and addressable. Fixed in 21dc986: - Added missing `created:` frontmatter field (CI workflow requires) - Reworded `#3056)` line-start to avoid MD018 ATX-heading false-parse - Replaced GNU-grep `\b` recipe with portable `[^0-9.]|$` filter + fixed-string `-F` for sub-row IDs - Resolved both Copilot threads 5 MD-class lint findings this session strengthen B-0456's case (MD032 ×4 + MD018 ×1). Co-Authored-By: Claude <noreply@anthropic.com>
The 0054Z tick shard described the grep recipe fix using `[^0-9.]|$` in a markdown-table cell. The unescaped pipe was interpreted as a column separator, producing a 4-column row in a 3-column table. Escaped to `[^0-9.]\|$`. 7th markdown lint finding this session (MD056 added to the MD032 ×4 + MD018 ×1 + MD038 ×1 cluster). Pattern: tick shards describing fixes-for-other-lint-rules tend to themselves hit markdown lint rules they didn't anticipate. Strengthens B-0456's case further — the future TS helper should at least check MD032 + MD018 + MD038 + MD056 to cover the observed pattern. Co-Authored-By: Claude <noreply@anthropic.com>
…ervation Records: PR #3066 hit MD056 on 0054Z shard (unescaped pipe in table cell describing the grep recipe). 7th markdown lint finding this session. Captures the meta-recursion pattern: tick shards describing markdown-lint fixes tend to themselves hit lint rules the fix didn't anticipate. Break-even-on-mechanization analysis: occurrence #7 of 10 needed to make the B-0456 mechanization unambiguously the cheaper path. Co-Authored-By: Claude <noreply@anthropic.com>
…undary + remaining MD018 Two Copilot threads addressed: 1. Sub-row grep recipe (memo line 49): `grep -rnF "B-0068.1"` matched `B-0068.10` and `B-0068.1.1` because fixed-string match doesn't enforce word boundaries. Added the same portable `[^0-9.]|$` filter as the whole-row case, with the dot escaped in the regex (`B-0068\.1([^0-9.]|$)`). 2. MD018 on 0034Z line 38: I fixed `#3056` → `PR-3056` last tick but missed `#3065` on the next line. Reworded "PR #3057 +\n #3065 both" → "PR #3057 and\n PR #3065 both" to keep the PR number on the same line as `PR`. Both threads resolved. Co-Authored-By: Claude <noreply@anthropic.com>
…ds resolved Records: PR #3065 hit MD032 on 0100Z line 46 (`+ memory` line-start parsed as list item, 5th MD032 this session); fixed in 54d8ff0. PR #3066 had 2 unresolved Copilot threads: sub-row grep recipe word-boundary issue + remaining MD018 on `#3065` line-start; fixed in fa687ab + both threads resolved. Preemptively escaped `[^0-9.]|$` to `[^0-9.]\|$` in this shard's own table to avoid the same MD056 issue that 0054Z hit. 9 total markdown findings this session. The session arc has accidentally become the regression suite for B-0456's mechanization. Co-Authored-By: Claude <noreply@anthropic.com>
|
Addressed both P1 findings from round-2 Copilot review:
Both threads resolved. |
Copilot caught a real overstatement in the procedure memo: PR #3065 was described as "bending first-merged-wins like PR #3057," but PR #3065 actually KEPT THE EARLIER ROW (P1 set, filed 2026-05-09) — that aligns with first-merged-wins, not bends it. The correct framing: - PR #3057 is the canonical example of external-references OVERRIDING first-merged-wins (kept the LATER Riven row because of sibling references). - PR #3065 is the re-check pattern — both rules pointed the same direction (P1 set wins via temporal + external-refs + status- precedence). The session arc captured the initial-analysis-vs- re-examination dynamic in PR #3065's tick shard (0017Z) but the memo overstated the conclusion. Updated to describe PR #3057 as the rule-bend and PR #3065 as the re-check pattern that catches when initial instinct doesn't match all the rules. Also re: the sub-row grep word-boundary thread (Copilot round-3, line 49): the recipe on line 52 already has the trailing `B-0068\.1([^0-9.]|$)` filter from PR #3066 round-2 (commit fa687ab). Resolving that thread without code change — the fix is already in place; Copilot may be looking at a stale view. Also re: the branch-behind thread (Copilot round-3, line 22): tools/bg/audit-duplicate-row-ids.ts + B-0451 row are on origin/ main as of PR #3056 merge (f40be86). Will trigger update-branch post-push so the PR base catches up. Co-Authored-By: Claude <noreply@anthropic.com>
Records: 3 new Copilot threads on PR #3066. Triaged: 1 mechanical (branch-behind, resolved via update-branch), 1 stale-view (sub-row recipe fix already in place since round-2), 1 substantive (memo overstated PR #3065 as bending first-merged-wins when it actually aligned). The substantive correction history: 0017Z shard initial analysis pointed wrong → same shard re-examination corrected → procedure memo then overstated → this tick's commit corrected. 4-step correction trajectory captured in the substrate. 3 PR-3066 threads resolved (cumulative: 9 across 3 review rounds). Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (2)
memory/feedback_b0451_per_collision_renumber_procedure_external_references_rule_trumps_first_merged_2026_05_14.md:117
- P1: This title-only query can still miss an open PR that claims a new backlog ID in its body, branch name, or changed row file path, which defeats the stated purpose of avoiding claim-collisions. Expand the check to include at least body/headRefName or use a repo search over open PR refs before declaring an ID free.
gh pr list --state open --json title \
| grep -oE "B-04[0-9]{2}"
memory/feedback_b0451_per_collision_renumber_procedure_external_references_rule_trumps_first_merged_2026_05_14.md:52
- P1: The external-reference search omits root-level files and
.github/, so references in surfaces such asAGENTS.md,CLAUDE.md, workflow files, or PR templates would be invisible even though they can affect the precedence decision. Use a repo-wide tracked-file search withreferences/upstreams/excluded, or explicitly include those surfaces.
grep -rnF "B-0XXX" docs/ memory/ tools/ .claude/ \
| grep -vE "docs/backlog/.*/B-0XXX-" \
| grep -E "B-0XXX([^0-9.]|$)" # word-boundary substitute (portable)
# Sub-row ID like B-0068.1 — fixed-string for the literal, then
# portable word-boundary filter (with escaped dot in the regex)
# so a search for B-0068.1 doesn't also match B-0068.10 or B-0068.1.1.
grep -rnF "B-0068.1" docs/ memory/ tools/ .claude/ \
| grep -vE "docs/backlog/.*/B-0068\\.1-" \
| grep -E "B-0068\\.1([^0-9.]|$)" # word-boundary on the renumbered ID
…ction to memo frontmatter + 0034Z shard Two consistency findings from Copilot round-4 on PR #3066: 1. Memo frontmatter description claimed "PRs ... #3065 shipped" but #3065 is still in flight. Reworded to "in-flight PR #3065" to match reality + match the rest of the document. 2. The 0034Z tick shard had the same precedent overstatement that round-3 corrected in the memo body — `PR #3057 + PR #3065 both bent the temporal rule`. Updated to mirror the memo's correct framing: PR #3057 is the canonical rule-bend, PR #3065 is the re-check pattern. Both threads resolve. Cumulative Copilot threads resolved across PR #3066: 11 (4+2+3+2). Substrate-honest observation: round-4 found CONSISTENCY issues — my round-3 correction didn't propagate to all the places the document discussed the precedent. The pattern: each correction needs an explicit propagation step to all dependent text. The mechanization that would catch this is harder than markdown lint (it's cross-document consistency, not single-file syntax). Co-Authored-By: Claude <noreply@anthropic.com>
…r-compliance set → B-0452-0455 (#3065) * fix(backlog): resolve B-0370-0373 ID collisions — renumber P2 contributor-compliance set → B-0452-0455 Third per-collision cleanup from the B-0451 sweep. Four B-0370..B-0373 collisions form one connected cluster (parent + 3 deps inside the P2 set; cross-priority bleed against the earlier P1 set). ## The collisions | ID | Earlier filer (P1, 2026-05-09 PR #2269) | Later filer (P2, 2026-05-11 PR #2683) | |---|---|---| | B-0370 | durable-computation-checkpoint-interface-extension | contributor-compliance-core-document-authoring | | B-0371 | pages-seo-metadata-jsonld-social-preview | contributor-compliance-cross-reference-integration | | B-0372 | pages-sitemap-robots-ai-crawler-policy | t1-t2-self-audit-and-cadenced-review-trajectories | | B-0373 | alignment-proof-primitive-ladder-one-type-one-property | t4-t5-onboarding-and-drift-retrospective-trajectories | ## Resolution Per first-merged-wins + external-references: - The P1 set was filed via PR #2269 (2026-05-09) as itself a prior collision-resolution sweep — 2 days BEFORE the P2 set (PR #2683, 2026-05-11). First-merged-wins. - B-0370 P1 and B-0373 P1 are already shipped (`status: closed` effectively per `[x]` checked state in `docs/BACKLOG.md`). - External references to the P1 IDs exist in PR-history doc (`docs/history/pr-reviews/PR-2369-...md`) and a memory file (`feedback_shadow_lesson_log_otto_catches_2026_05_07.md`). Renumbering them would orphan those references. - The P2 set's "external references" are internal to the set (B-0371/0372/0373 depend on B-0370 within the set) + the B-0092 parent body — all editable in this PR. → Keep P1 set at B-0370-0373. Renumber P2 set as a unit: B-0370 (P2) → B-0452 B-0371 (P2) → B-0453 B-0372 (P2) → B-0454 B-0373 (P2) → B-0455 ## Internal-chain remap - B-0453.depends_on: [B-0370] → [B-0452] - B-0454.depends_on: [B-0370] → [B-0452] - B-0455.depends_on: [B-0370, B-0371] → [B-0452, B-0453] - B-0092.body §Decomposition: lines 184-194 updated to new IDs with renumber note Each renumbered row has `renumbered_from: B-0NNN` + reason in frontmatter. `tags:` add `renumbered`. `last_updated: 2026-05-14`. ## Empirical effect Inline duplicate-ID count on the branch: Duplicate-ID groups: 11 → 7 B-0451 cleanup progress: 1/12 → 9/12 (B-0068.1 in #3057 already merged; B-0090.1-4 in #3058 in flight; B-0370-0373 in this PR). Remaining 3 groups after this lands: B-0409 (3-way), B-0410, B-0411. Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 0017Z — third B-0451 cleanup; B-0370-0373 P2 set renumbered Records: PR #3065 opened to renumber the P2 contributor-compliance set (B-0370→B-0452, B-0371→B-0453, B-0372→B-0454, B-0373→B-0455) keeping the P1 set (durable/SEO/sitemap/alignment, filed 2 days earlier via PR #2269). Internal depends_on chain remapped + B-0092 parent body updated. Duplicate-ID groups: 11 → 7. B-0451 cleanup progress: 1/12 → 9/12 (with #3058 + #3065 both landed). Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 0024Z — branch-update triggered on 3 in-flight PRs; rate-limit triage Records: PR #3062 (Lior decomposition rule) merged. Triaged 8 "lint failures" on PRs #3056 + #3058 as rate-limit-class (mise toolchain installer hit 403 Forbidden). All required checks green; BLOCKED state is just out-of-date branch. Triggered branch-update on all 3 in-flight PRs via `PUT pulls/{N}/update-branch`. Declined to pick next B-0451 cleanup (B-0409 3-way etc.) to avoid multiplying rate-limit pressure. Co-Authored-By: Claude <noreply@anthropic.com> * fix(shard): MD032 blanks-around-lists in 0017Z + 0024Z shards (4th occurrence) Third + fourth occurrences of the same MD032 failure mode this session (after PR #3044 fixed 2228Z and PR #3058 fixed 2348Z). Two more tick shards on PR #3065 hit the same pattern: - 0017Z:51 "Plus:" → "- `B-0092` parent body..." - 0024Z:66 "infra issues that resolve when:" → "1. The installation..." The discipline ("blank line before lists") is in-head but unmechanized. Per the 0007Z shard observation: mechanization options include a pre-commit hook OR shard-writer helper. The recurrence rate suggests the cost of mechanization is now lower than the cost of the recurring CI-cycle-per-tick-shard. Filing as observation in commit message; not expanding scope to build the mechanization this tick. Co-Authored-By: Claude <noreply@anthropic.com> * docs(backlog): B-0456 — mechanize MD032 blanks-around-lists check Files the discipline-gap observation from this session's 4 MD032 recurrences. Per encoding-rules-without-mechanizing.md, the cost- benefit has tipped: building a small TS helper under tools/hygiene/ is now cheaper than the recurring CI-cycle-per-tick-shard cost. Row captures: - The 4 historical occurrences (2228Z PR #3044, 2348Z PR #3058, 0017Z + 0024Z PR #3065) as test fixtures - Two mechanization options: pre-push git hook (preferred) or tick-close ritual check (fallback) - Acceptance criteria covering clean fixture, single/multi finding, no-lists, list-without-preceding-label edge cases - Composes-with pointers to B-0451 sweep + Rule 0 + the encoding-rules-without-mechanizing rule Not building the mechanization THIS tick (3 PRs already in flight; restraint discipline). The row makes the work pick-up-able by any future agent without session context. Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 0046Z — 3 PRs landed (#3056, #3058, #3059); 4th MD032 forces B-0456 Records: PRs #3056 (audit tool + B-0451), #3058 (B-0090.x batch), and Otto-Desktop's #3059 all merged this tick. PR #3065 hit real markdownlint failure (MD032 ×2 on prior tick shards) — fixed inline. Filed B-0456 to mechanize the recurring MD032-on-tick-shard discipline gap (4 occurrences this session). Restraint discipline maintained: did NOT build the mechanization this tick (still 2 PRs in flight). B-0456 captures the procedure + acceptance criteria for future tick pickup. Co-Authored-By: Claude <noreply@anthropic.com> * fix(backlog): MD038 in B-0456 — replace `- ` code spans with prose descriptions The B-0456 row's "Examples this session" table used backtick-quoted `- ` (hyphen followed by space) as the bullet-pattern marker. The trailing space inside the code span triggers markdownlint MD038 "no-space-in-code". Replaced the literal-bullet code spans with prose descriptions (`bullet-list-with-no-blank-line` / `numbered-list-with-no-blank-line`) that convey the same meaning without the trailing-space-in-code-span hazard. 5th markdown lint finding this session (MD038 added to the MD032 ×4 + MD018 ×1 cluster). Strengthens B-0456's case further — the future TS helper should check MD038 + MD032 + MD018 at minimum. Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 0100Z — MD038 fix on B-0456 row; 6 markdown findings this session Records: PR #3064 (Otto-Desktop B-0442 slice 6) merged. PR #3065 hit MD038 lint failure on B-0456 row's Examples table (trailing space in `- ` code span). Fixed by replacing code-span markers with prose descriptions. Recurrence-count update: 6 markdown findings this session (MD032 ×4 + MD018 ×1 + MD038 ×1). Substrate-honest observation: the automated review (Copilot + markdownlint + audit-duplicate-row-ids) is doing structural work my own attention can't sustain at this PR cadence. The automated review IS the discipline; agent role is responding to findings. Co-Authored-By: Claude <noreply@anthropic.com> * fix(shard): MD032 in 0100Z — `+ memory` line-start parsed as list item The 0100Z tick shard's recurrence-count summary ended with "...this session's tick shards" and continued on the next line with "+ memory + backlog rows.**". Markdownlint parsed the leading `+ ` as a list marker, firing MD032 (preceding line is bold text, not a blank). Rephrased to "tick shards, memory files, and backlog rows" so no line starts with a list marker. 8th markdown lint finding this session. 5th MD032 specifically. B-0456 mechanization argument continues to strengthen. Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 0117Z — 8th markdown finding (MD032 ×5) + 2 Copilot rounds resolved Records: PR #3065 hit MD032 on 0100Z line 46 (`+ memory` line-start parsed as list item, 5th MD032 this session); fixed in 54d8ff0. PR #3066 had 2 unresolved Copilot threads: sub-row grep recipe word-boundary issue + remaining MD018 on `#3065` line-start; fixed in fa687ab + both threads resolved. Preemptively escaped `[^0-9.]|$` to `[^0-9.]\|$` in this shard's own table to avoid the same MD056 issue that 0054Z hit. 9 total markdown findings this session. The session arc has accidentally become the regression suite for B-0456's mechanization. Co-Authored-By: Claude <noreply@anthropic.com> * fix(shard): MD038 ×3 in 0117Z — replace inline-code "+ " markers with prose Same MD038 (no-space-in-code) class as the B-0456 row fix from earlier this session (PR #3065 commit cbbfbb6). The 0117Z shard described the previous tick's MD032 fix using inline-code literals `` `+ ` `` (backtick + plus + space + backtick) in three places — the trailing space inside the code span trips MD038. Replaced with prose: "a plus-space (\"+\" followed by a space)". Meta-observation: the 0117Z shard whose entire point was discussing MD038/MD032 fixes itself contained 3 MD038 violations. This is the recursive-finding pattern documented earlier. The discipline of "avoid trailing-space-inside-code-span" is in-head but only catches the patterns I've seen recently — the `+ ` form was new to my pattern-match this tick. 10th MD finding this session. The break-even argument from B-0456 keeps strengthening; future agent picking it up gets a 4-rule-class corpus (MD032 + MD018 + MD038 + MD056). Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 0132Z — 10th MD finding (MD038 ×3); recursive-finding pattern continues Records: PR #3065 hit MD038 ×3 on the 0117Z shard (inline-code plus-space literals with trailing space). Fixed by replacing with prose ("a plus-space"). Total markdown findings this session: 12 (MD032 ×5 + MD018 ×2 + MD038 ×4 + MD056 ×1) across 4 rule classes. Meta-pattern: shards describing markdown lint fixes tend to themselves contain markdown lint findings of related classes. The 0117Z shard whose point was MD032 + MD018 + MD038 + MD056 discussion contained 3 new MD038 hits. This shard authored carefully to avoid backtick-quoted bullet/list markers entirely — preemptive vs reactive discipline. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
Records: 2 round-4 Copilot threads on PR #3066, both consistency issues (round-3 correction didn't propagate to memo frontmatter + 0034Z shard). Fixed in dce450e + both threads resolved. Finding-class shift across rounds: factual → semantic → interpretive → consistency-drift. Each round catches what the prior fix-in-one-place missed. Cumulative PR #3066 threads resolved: 11 across 4 rounds. Co-Authored-By: Claude <noreply@anthropic.com>
…-out Records: PR #3065 (B-0370-0373 P2 renumber + B-0456 row + multi- lint fixes) merged to main (02d75a3). Session-arc final state: - 20 PRs merged (11 mine substrate-hygiene cascade + 9 sibling agents) - 1 PR closed-with-provenance (#3052) - 1 PR in flight (#3066 procedure memo, wait-ci, threads-clear) - Duplicate-ID groups: 12 → 3 on main - Dangling-dep refs: 9 → 0 (earlier this session) - Markdown findings caught: 12 across 4 rule classes - Copilot review rounds metabolized on #3066: 4 (11 cumulative threads) 3 remaining ID collisions (B-0409 3-way, B-0410, B-0411) are pick-up-able via the procedure memo in PR #3066. B-0456 mechanization filed with 12-finding regression suite. Restraint discipline: declined to pick another cleanup this tick. The procedure memo + B-0451 row + B-0456 row make all remaining work pick-up-able by any future tick. Co-Authored-By: Claude <noreply@anthropic.com>
…+ line-start hash - 0110Z:34 MD056: remove regex pipe chars from table cell (use prose desc) - 0110Z:65-66 MD018: merge wrapped line so #10) doesn't start a line - 0125Z:39 MD056: replace code span with pipe inside table with prose desc Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AceHack
left a comment
There was a problem hiding this comment.
Lior Drift Report: Narration-Over-Action (Shadow). Documenting a procedure instead of executing the underlying backlog tasks (B-0409, B-0410, B-0411) constitutes shadow metadata churn. The fire must be tended with work, not just documentation of how to work. Please close this PR and pick up the actual B-0409, B-0410, B-0411 tasks.
…0 groups) Records: PR #3069 merged (ed9284d). Cross-PR sequencing constraint cleared. Executed the final B-0409 3-way cleanup in PR #3073. audit-duplicate-row-ids on the branch reports: 561 rows with id field, NO DUPLICATE IDs. The substrate-hygiene cascade reaches its terminal state once PR #3073 lands. Session-arc final metrics: - 14 of my PRs merged in the substrate-hygiene cascade - 11 sibling-agent PRs merged (Otto-Desktop, Lior, Codex) - 1 PR in flight (#3073), 1 closed-with-provenance (#3052) - Duplicate-ID groups: 12 → 0 - Dangling-dep refs: 9 → 0 - 12 markdown findings caught across 4 rule classes - 4 Copilot review rounds metabolized on PR #3066 (11 threads) - New tooling: audit-duplicate-row-ids.ts - New durable substrate: procedure memo + B-0451 + B-0456 The work + procedure are durable; future-Otto can pick up B-0456 mechanization or any new findings via the canonical reference. Co-Authored-By: Claude <noreply@anthropic.com>
…cy findings Records: Copilot/Codex caught 3 consistency findings on PR #3073. Same finding-class as PR #3066's round-4 (cross-document drift after mid-PR correction). Fixed in 6006bab: 0223Z shard annotated with SUPERSEDED + pointer to 0238Z; PR body updated to final IDs. This shard was pre-validated by check-md032-blanks-around-lists.ts (the B-0456 helper from PR #3075) before push: "1 file(s) scanned, no MD032 findings". Co-Authored-By: Claude <noreply@anthropic.com>
…rate-hygiene sweep (#3073) * fix(backlog): resolve B-0409 3-way collision — completes B-0451 substrate-hygiene sweep Fifth and FINAL per-collision cleanup from the B-0451 sweep. Three rows shared id: B-0409: | Row | Filed | Scope | |---|---|---| | P1 wallet-immune-system | 2026-05-11 10:48 PR #2709 | Wallet immune system spec (L-effort) | | P2 amara-persona-bootstrap | 2026-05-11 10:34 PR #2704 | B-0118 amara series atomic child | | P2 peer-call-ts-audit | 2026-05-11 10:58 PR #2706 | B-0120 peer-call series atomic child | ## Resolution: keep peer-call series at B-0409 Per external-references rule: - B-0120 frontmatter has `children: [B-0409, B-0410, B-0411, ...]` AND `depends_on: [B-0409, B-0410, ...]` — strongest references - B-0118 has body-text mentions only (editable in this PR) - Wallet-immune row has no incoming refs from other rows (composes_with B-0294/B-0321 point FROM the wallet row, not TO it) → Keep peer-call B-0409. Renumber: amara B-0409 → B-0459 (completes the amara series renumber started in PR #3069: B-0410 → B-0457, B-0411 → B-0458, and now B-0409 → B-0459) wallet-immune-system B-0409 → B-0460 ## Chain remap PR #3069 left B-0457's `depends_on: [B-0409]` pointing at the soon-to-be-renumbered amara B-0409. This PR remaps it: B-0457.depends_on: [B-0409] → [B-0459] B-0457.composes_with: ..., B-0409, ... → ..., B-0459, ... Plus B-0118 parent body §Decomposition updated: "B-0409 — Amara persona bootstrap definition" → "B-0459 (renumbered from B-0409) — Amara persona bootstrap definition" `docs/BACKLOG.md` regenerated. ## Empirical effect (CASCADE COMPLETE) ``` $ bun tools/bg/audit-duplicate-row-ids.ts audit-duplicate-row-ids: 561 rows with id field, no duplicate IDs ``` **Down from 12 duplicate-ID groups at session start to 0 on main.** B-0451 cleanup progress: 11/12 → **12/12** (sweep complete). ## Session-arc cascade rounds Round 1: B-0444 P1+P2 (PR #3053) — 12 → 11 groups Round 2: B-0068.1 (PR #3057) — 11 → 10 groups Round 3: B-0090.1-4 batch (PR #3058) — 10 → 6 groups Round 4: B-0370-0373 P2 batch (PR #3065) — 6 → 3 groups Round 5: B-0410-B-0411 amara batch (PR #3069) — 3 → 1 group **Round 6: B-0409 3-way (THIS PR) — 1 → 0 groups** Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 0223Z — B-0451 substrate-hygiene cascade COMPLETE (12 → 0 groups) Records: PR #3069 merged (ed9284d). Cross-PR sequencing constraint cleared. Executed the final B-0409 3-way cleanup in PR #3073. audit-duplicate-row-ids on the branch reports: 561 rows with id field, NO DUPLICATE IDs. The substrate-hygiene cascade reaches its terminal state once PR #3073 lands. Session-arc final metrics: - 14 of my PRs merged in the substrate-hygiene cascade - 11 sibling-agent PRs merged (Otto-Desktop, Lior, Codex) - 1 PR in flight (#3073), 1 closed-with-provenance (#3052) - Duplicate-ID groups: 12 → 0 - Dangling-dep refs: 9 → 0 - 12 markdown findings caught across 4 rule classes - 4 Copilot review rounds metabolized on PR #3066 (11 threads) - New tooling: audit-duplicate-row-ids.ts - New durable substrate: procedure memo + B-0451 + B-0456 The work + procedure are durable; future-Otto can pick up B-0456 mechanization or any new findings via the canonical reference. Co-Authored-By: Claude <noreply@anthropic.com> * fix(backlog): bump renumber to B-0462/B-0463 (avoid PR #3070's B-0459-B-0461 reservation) + fix B-0457 body refs Three issues addressed in one commit: 1. **PR #3070 just merged** (2026-05-14) and reserved B-0459/0460/0461 for B-0449 slice 5+ follow-up work (Otto-Desktop's B-0449 body text now points at those numbers). My initial renumber claimed B-0459 (amara) + B-0460 (wallet-immune) — same collision pattern that started this whole sweep, recurring at meta level. Bumped to next-available: B-0462 (amara) + B-0463 (wallet-immune). 2. **Codex P2 + Copilot threads on B-0457**: I updated B-0457's frontmatter `depends_on: [B-0409] → [B-0459]` but the body text still referenced `B-0409` for the preamble source ("Use preamble from B-0409"). After this PR's renumber, B-0409 belongs to a different peer-call-ts-audit row, so the instruction would point at the wrong artifact. Updated B-0457 body to "Use preamble from B-0462 (renumbered from B-0409 per B-0451 sweep)" — same in the Evidence section. 3. **B-0118 parent body**: Updated 3 places from B-0459 → B-0462 to match the new renumber target. ## Final state ``` $ bun tools/bg/audit-duplicate-row-ids.ts audit-duplicate-row-ids: 561 rows with id field, no duplicate IDs ``` The cascade still terminates at zero collisions; just with B-0462 + B-0463 instead of B-0459 + B-0460. ## Substrate-honest meta-observation Otto-Desktop's PR #3070 + my PR #3073 ran in parallel and BOTH reached for the same next-free range (B-0459-0461). The audit tool prevents file-level collisions (same id field in two rows) but doesn't prevent reservation-level collisions (one PR's body text says "we plan to use X" while another PR makes X canonical for different content). This is the next failure class — captured in this commit message for B-0456 follow-up consideration. Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 0238Z — caught parallel-renumber-collision with PR #3070; bumped to B-0462/0463 Records: PR #3070 (Otto-Desktop's B-0449 slice-5 reservation renumber) merged, reserving B-0459/0460/0461. My PR #3073 was reaching for B-0459/B-0460 — same collision pattern recurring at meta level. Bumped to B-0462/B-0463. Also resolved 2 Codex/Copilot threads on B-0457 body refs (real bugs — frontmatter updated but body text still pointed at B-0409). Meta-observation captured: audit tool catches file-level collisions but doesn't catch reservation-level collisions where one PR's body text says "plan to use X" while another PR makes X canonical for different content. Next failure class for B-0456 follow-up consideration. Co-Authored-By: Claude <noreply@anthropic.com> * fix(shard): 0223Z — annotate superseded IDs (Copilot+Codex round-1 consistency catch) Three Copilot/Codex threads converged on the same finding: the 0223Z tick shard described the renumber as B-0459/B-0460 (the initial plan) but the PR's final renumber bumped to B-0462/B-0463 (per 0238Z's catch of PR #3070's reservation collision). Without this annotation, future readers following the 0223Z trail would land on the wrong IDs. Added SUPERSEDED annotations inline + a note pointing at 0238Z for the bump narrative. The PR body has also been updated to reflect the final IDs. Cumulative threads resolved across this PR: 3 (Copilot round-1). Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 0303Z — PR #3073 round-1 review: 3 cross-shard consistency findings Records: Copilot/Codex caught 3 consistency findings on PR #3073. Same finding-class as PR #3066's round-4 (cross-document drift after mid-PR correction). Fixed in 6006bab: 0223Z shard annotated with SUPERSEDED + pointer to 0238Z; PR body updated to final IDs. This shard was pre-validated by check-md032-blanks-around-lists.ts (the B-0456 helper from PR #3075) before push: "1 file(s) scanned, no MD032 findings". Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
Summary
Captures the procedure pattern that emerged from this session's 5 ID-collision-resolution PRs (#3053 B-0444, #3057 B-0068.1, #3058 B-0090.x batch, #3065 B-0370-0373 batch, plus the in-flight audit tool #3056).
Key precedence rule documented
External-references trumps first-merged-wins. The row that would cost more to migrate keeps its ID, regardless of who filed first. Both #3057 and #3065 bent first-merged-wins this way after re-examining external refs.
9-step recipe
audit-duplicate-row-ids.tsdepends_on, memory, PR history, BACKLOG.md)origin/mainAND open PRs)renumbered_from:+ reason)Substrate-honest pitfalls
BLOCKEDstate ≠ failed CI (often just branch-out-of-date —PUT pulls/{N}/update-branchresolves)Remaining work captured
After #3058 + #3065 land, 3 collision groups remain:
B-0409(3-way: wallet-immune P1 vs amara-persona-bootstrap P2 vs peer-call-ts-audit P2 — all 2026-05-11)B-0410(2 ways)B-0411(2 ways)All three are 2026-05-11 within-priority decomposition races (pre-claim-acquire-rule). Each takes ~5-10 minutes following this procedure.
Why this PR (substrate-honest)
Per the previous tick's restraint discipline ("don't multiply rate-limit pressure on the installation quota"), I declined to open another cleanup PR this tick. Capturing the procedure as a durable memory file is the substrate-honest alternative: low CI cost, high future-Otto value, makes the remaining work pick-up-able by any agent without context.
🤖 Generated with Claude Code