Skip to content

backlog(B-0533): §33 migration dead-xref sweep + lint (P3)#3540

Merged
AceHack merged 1 commit into
mainfrom
backlog/b0533-section33-migration-dead-xref-sweep-otto-cli-2026-05-15
May 15, 2026
Merged

backlog(B-0533): §33 migration dead-xref sweep + lint (P3)#3540
AceHack merged 1 commit into
mainfrom
backlog/b0533-section33-migration-dead-xref-sweep-otto-cli-2026-05-15

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented May 15, 2026

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

  • B-0533 ID free (B-0531 in-flight, B-0532 on main, B-0533 verified free via `gh pr list`)
  • Frontmatter parses (composes_with: B-0036, B-0532; depends_on: [])
  • CI green (markdownlint, archive-header §33 lint)
  • Auto-merge arms

🤖 Generated with Claude Code

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>
Copilot AI review requested due to automatic review settings May 15, 2026 18:07
@AceHack AceHack enabled auto-merge (squash) May 15, 2026 18:07
@AceHack AceHack merged commit 324dc84 into main May 15, 2026
25 of 26 checks passed
@AceHack AceHack deleted the backlog/b0533-section33-migration-dead-xref-sweep-otto-cli-2026-05-15 branch May 15, 2026 18:10
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).
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>
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>
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>
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>
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.

2 participants