fix(docs): add stable anchors to ADR-0073 decisions and correct 22 positional citations - #2930
fix(docs): add stable anchors to ADR-0073 decisions and correct 22 positional citations#2930sei-ahouseholder wants to merge 3 commits into
Conversation
…sitional citations Issue #2627: ADR-0073 had no numbered decisions but 22 comments cited "ADR-0073 decision N" with positional numbers that were unresolvable. - Add <a id="..."> named anchors to all 13 Concretely: bullets in docs/adr/0073-per-actor-storage-isolation.md - Replace all 22 positional citations across 17 files with ADR-0073#anchor-name references - Add test/metadata/test_adr_decision_citations.py lint rule with 5 tests enforcing named-anchor citations and resolving anchors Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…alled - actionlint golang hook requires Go on PATH to build; devcontainer has none - pre-commit hangs indefinitely trying to provision Go toolchain - workaround: SKIP=actionlint for commits that don't touch .github/ workflows Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nditions.py Fixes #2923, #2926, and partially addresses #2925. - test_lifecycle.py:482,714 — stub read_case instead of read so that the ValidateEmbargoRevisionStateNode and SetEmbargoActiveNode ValueError regression guards are actually exercised (both were silently dead) - test_suggest_actor_tree.py:521,870 — stub read_case in ActorAlreadyParticipantNode and EmitNoteDuplicateRecommendationToOwner helper; attributed_to and actor_participant_index now reach the nodes - conditions.py:63 — ActorAlreadyParticipantNode calls read_case() not read(), consistent with every other case-reading node - datalayer.py — read_case(raise_on_missing=True) now raises ValueError instead of silently returning None when the stored object is not a VulnerabilityCase (closes #2925) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
e4f9ae2 to
6bd53eb
Compare
sei-ahouseholder
left a comment
There was a problem hiding this comment.
PR Triage: #2930 — fix(docs): add stable anchors to ADR-0073 decisions and correct 22 positional citations
Linked issues: #2627 (ADR-0073 decision citations point at numbers the ADR does not have)
Changed files: 25 files — docs/adr, test/metadata, adapters, core/behaviors, demo
CI status: ⏳ pending (2 jobs still running: fcvcv Demo Integration, Build; all completed checks ✅)
Merge state: ✅ MERGEABLE (BLOCKED — waiting on CI)
Base branch: main
Needs integration tests: yes (adapters, demo, core/behaviors changed)
Findings
| # | Phase | Severity | Description | Outcome |
|---|---|---|---|---|
| phase2-missed-positional-citation-0 | issue-linkage | ❌ FAIL | vultron/demo/helpers/verification.py:68-69 has a split-line positional citation (ADR-0073 decision\n5) — not in the original 22, not caught by the new lint rule |
fix-now |
| phase3-pr-body-stale-deferred-0 | pr-body-format | PR body "Deferred bugs" section claims "none of the affected files are in this diff" — false; conditions.py and datalayer.py are in the diff; add Closes #2923, #2925, #2926 |
fix-now |
Total: 1 FAIL · 1 IMPROVE · 0 NEW-ISSUE
Notes
The 22 known citations are correctly fixed, all anchors resolve, and the lint rule works for single-line citations. The FAIL is a 23rd citation missed by the original single-line grep discovery in #2627: verification.py:68-69 wraps (ADR-0073 decision across a line break to 5), evading both the issue's grep and the new _POSITIONAL_CITATION_RE per-line scanner.
Fix for the FAIL has two parts:
verification.py:68→ change toADR-0073#peer-records-in-knowers-store(same anchor as the other "decision 5" sites)test_adr_decision_citations.py_collect_positional_citations→ scan full-file text rather than iteratingsplitlines(), so split-line citations are caught
Bugs #2923, #2925, #2926 were all closed via commit 6bd53eb5 — the IMPROVE just asks for the PR body to reflect this.
Triage artifact: .claude/pr-2930-triage.json
Next step: run /pr-execute or /pr-ship to apply fixes.
Summary
ADR-0073 had no numbered decisions, but 22 code comments cited
ADR-0073 decision Nusing unresolvable positional numbers. This PR adds named HTML anchors to the ADR's 13 "Concretely:" bullets, rewrites all 22 citations to useADR-0073#anchor-namereferences, and adds a lint rule that prevents recurrence.Changes
docs/adr/0073-per-actor-storage-isolation.md: Added<a id="..."></a>anchors to all 13 bullets in the "Concretely:" section. Descriptive anchor names (#peer-records-in-knowers-store,#url-segment-computed-not-looked-up,#hosted-actors-list-only,#cross-actor-access-must-be-named, plus 9 others) survive list reordering.ADR-0073 decision Ncomment withADR-0073#anchor-name.test/metadata/test_adr_decision_citations.py(new): Two live lint tests + 3 demonstration tests.test_no_positional_decision_citationsrejects anyADR-NNNN decision Npattern.test_anchor_citations_resolveverifies everyADR-NNNN#anchorreference resolves to a declared anchor in the ADR file.Acceptance criteria
<a id="...">anchorsgrep -rniE "adr-0073[^)]{0,40}decision [0-9]"(excludingdocs/adr/0073) returns 0 resultsDeferred bugs (pre-existing, found in code review)
Three bugs discovered in passing — not introduced by this PR (none of the affected files are in this diff):
dl.readbut production nodes calldl.read_case; regression guards silently deadread_case(raise_on_missing=True)silently returnsNonefor non-VulnerabilityCaserecordsActorAlreadyParticipantNodecallsdl.read()instead ofdl.read_case()Verification