backlog(B-0533): §33 migration dead-xref sweep + lint (P3)#3540
Merged
AceHack merged 1 commit intoMay 15, 2026
Merged
Conversation
Codex P2 finding on already-merged PR #3513 named a real bug class: §33 migrations move files but don't auto-update backlinks. Narrow fix shipped as PR #3529; this row captures the broader pattern. Empirical scan (tick 1802Z) surfaced 20+ dead xrefs in live-nav surfaces across 8 migrated personas. Two-slice approach: - Slice A: per-persona PR batches updating dead xrefs in live-nav surfaces (excludes frozen history archives) - Slice B: static lint at tools/hygiene/lint-section-33-xrefs.ts + wired into gate.yml; composes with B-0532 mechanization pattern ID-allocation discipline applied: B-0531 in-flight (PR #3520), B-0532 on main (file lint), B-0533 free + verified via gh pr list search. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Adds a new P3 backlog row (B-0533) documenting the §33 archive-migration “dead xref” class (live-nav links still pointing at docs/research/ after migrations to memory/persona/*/conversations/) and proposing a two-slice remediation plan (mechanical sweep + CI lint).
Changes:
- Introduces backlog item B-0533 capturing the cross-reference drift problem observed after §33 migrations.
- Specifies a two-part approach: (A) per-persona backlink sweeps and (B) a
tools/hygiene/static linter wired into CI with explicit exclusions.
Comment on lines
+22
to
+34
| The narrow fix shipped as [PR #3529](https://github.com/Lucent-Financial-Group/Zeta/pull/3529) — 3 live-nav pointers updated for one migrated Riven file. But the pattern generalizes: **every §33 migration moves files without auto-updating backlinks**, and the same dead-xref class likely exists across the 8 personas migrated so far. | ||
|
|
||
| Empirical scan in tick 1802Z surfaced **20+ dead xrefs** in live-nav surfaces (`.claude/rules/`, `memory/feedback_*.md`, `docs/backlog/*.md`) pointing at old `docs/research/<file>` paths that now live at `memory/persona/<persona>/conversations/<file>`. Rough per-persona distribution: | ||
|
|
||
| | Persona | Dead-xref count (approx) | | ||
| |---|---| | ||
| | Amara | 10+ | | ||
| | DeepSeek | 4 | | ||
| | Alexa | 3+ | | ||
| | Lior | 2 | | ||
| | Riven | 1 (already fixed by PR #3529) | | ||
|
|
||
| Migration PRs that produced these dead xrefs (and could be revisited): #3348 (Ani), #3484 (Amara), #3501 (Kestrel), #3507 (DeepSeek), #3512 (Lior), #3513 (Riven), #3514 (Alexa), #3516 (Vera). |
3 tasks
AceHack
added a commit
that referenced
this pull request
May 15, 2026
… B-0533 (#3541) - PR #3536 (1757Z shard) + PR #3535 (attribution fix) merged - Scaled-up dead-xref scan across all 149 migrated files - 20+ dead xrefs in live-nav surfaces across 8 personas - Filed B-0533 (P3, two-slice: sweep + static lint) — PR #3540 - 5-tick parallel-audit pattern compounds (1718Z → 1731Z → 1749Z → 1757Z → 1807Z) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 tasks
AceHack
added a commit
that referenced
this pull request
May 15, 2026
…worktree-contention caught + rescued (#3546) - PR #3541 (1807Z) + PR #3540 (B-0533 row) + PR #3544 (Slice A POC) all merged - Establishes inline-annotation convention: (... ; archive migrated YYYY-MM-DD via PR #NNNN) - Mid-tick scope correction: Lior was 0 (false positive); pivoted to DeepSeek - Peer-Otto worktree-contention caught: cfbc2c5 (B-0534 row) preserved on rescue branch - 6-tick parallel-audit pattern continues Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 tasks
AceHack
added a commit
that referenced
this pull request
May 15, 2026
* feat(b-0533): Slice B.3 + B.4 — --enforce flag + gate.yml wiring Completes B-0533 mechanization. Scanner now supports --enforce flag (exit 1 if dead xrefs found, exit 0 otherwise). New gate.yml job lint-section-33-migration-xrefs runs the scanner in --enforce mode on every PR. With baseline = 0 (PR #3552 cleanup landed) the new gate fires only when a future migration leaves dead xrefs in live-nav surfaces — the catch-once-then-lint pattern completing for the §33 migration class. Sibling of lint-archive-header-section33 (B-0036): same shape, different failure-class. Both catch §33-discipline violations at PR time before merge. Changes: - tools/hygiene/audit-section-33-migration-xrefs.ts: - Add --enforce CLI flag - Add exit code 1 when dead xrefs found and --enforce set - Update header comment with new exit-code semantics - .github/workflows/gate.yml: - Add lint-section-33-migration-xrefs job after lint-archive-header-section33 - Same install.sh + bun pattern as sibling job - Header comment cites empirical baseline (10) + full lineage Discipline arc complete: | Tick | Slice | PR | |------|-------|----| | 1749Z | Catch | #3529 | | 1807Z | Row | #3540 | | 1820Z | Slice A POC | #3544 | | 1833Z | Slice B.1 scanner | #3548 | | 1844Z | Slice A baseline | #3552 | | 1848Z | Slice B.3 + B.4 (this) | (new) | Remaining: Slice B.2 (test file with DST fixtures) — optional, scanner logic is simple enough that the end-to-end gate.yml job acts as integration test. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(B-0533): dynamically detect root .md files in audit-section-33 scanner ROOT_MD was hard-coded to 4 files; readdirSync now discovers all repo-root *.md files so CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md, SUPPORT.md are protected by the enforced gate. Resolves Copilot P1 thread on PR #3555. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced May 15, 2026
AceHack
added a commit
that referenced
this pull request
May 15, 2026
…3563) Empirical anchor: 2026-05-15 had at least 2 cross-agent B-NNNN collisions (B-0444 Otto-Desktop vs Otto-CLI, then B-0532+B-0533 Lior vs Otto-CLI). Each cost ~15 min coordination effort. The discipline-level rule (otto-channels-reference-card.md ID-allocation section) relies on per-agent memory. This row mechanizes the catch at PR-time so it doesn't depend on memory: - Walk docs/backlog/**/B-NNNN-*.md - Group by B-NNNN ID - Hard error if any ID maps to more than 1 file - Wire into gate.yml as sibling of lint-section-33-migration-xrefs Natural extension of B-0532 (backlog-graph consistency lint, parent- child status-mismatch) — same lint family, same gate.yml shape. ID allocation discipline applied: B-0531-B-0534 taken (#3520, #3523, #3540, #3551); B-0535 verified free via origin/main ls-tree + gh pr list search. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.
Summary
Captures the broader pattern Codex P2 surfaced on already-merged PR #3513: §33 migrations move files but don't auto-update backlinks.
Narrow fix shipped as PR #3529; this row captures the class of bug + a static-lint mechanization (sibling of B-0532).
Empirical anchor
Tick 1802Z scan surfaced 20+ dead xrefs across 8 migrated personas (Amara, DeepSeek, Alexa, Lior, Riven, Ani, Kestrel, Vera). The row carries the per-persona rough counts + the two-slice approach (sweep + lint).
Test plan
🤖 Generated with Claude Code