docs: close the L4 roster at 34 of 34, and fix the summary line that reopened it three times - #3478
Merged
Merged
Conversation
…hat reopened it three times The eight Group 2 intra-plugin path-form rows were dispatched as the last open work on the 34-item L4 encapsulation roster. **None of them was open.** All eight were closed on 2026-08-26 by #3380 (6c7a103), the same commit that wrote the roster, whose own message says so: "eight citations written with an implied base of the plugin root while the real base was `reference/`". It fixed them and left the section summary asserting that all 34 still resolved to the citing text the audit quoted. That one sentence is why four passes have now re-derived this roster. No plugins/** file needed an edit, so this change set carries no version bump and no plugin CHANGELOG entry; a bump describing a diff that does not exist is a worse record than none. Verified twice with unrelated expressions, per the sweep record's own decay rule and never by the rostered line numbers, which are stale in all three files. First by the roster's quoted text: zero bare `skills/<s>/<path>` tokens remain in either plugin's reference/ tree, every one now in the anchored `${CLAUDE_PLUGIN_ROOT}/skills/<s>/<path>` form clause 3 requires, and all seven distinct targets exist on disk. Second, without reference to the roster at all, by resolving every citation token in every plugin-level reference/, context/ and agents/ tree plus every plugin README against the base its own form implies: 52 tokens, 0 clause 3 failures. That population strictly contains the eight. Group 3's two heading anchors were closed by the same commit, so the roster stands at 34 closed, 0 open. Recorded judgment, because tidying these rows under the wrong clause would have been easy: ADR 0018's encapsulation half does not reach this class at all. Clause 1 names this exact citing surface and legalises it; clause 2 cannot apply, because both files ship inside one plugin and the runtime absence that motivates it, and the fetched-contract problem the amendment builds on it, cannot occur. Only clause 3 reaches Group 2, and clause 3 is a resolvability rule, not an encapsulation rule. The amendment's fix-an-address / keep-evidence test divides clause 2 applications and does not apply here either. The roster's tables are left verbatim, since its inventory is the part its decay rule says cannot be re-derived, and #3474 and #3475 both closed rows without touching that file. The only edit there is an additive closure stamp above the tables. The substantive record goes in the sweep spec, which also had to be corrected: it asserted Group 2 was "untouched here". Gates: affected-tests.sh --run exit 0, 17 suites; check-changed-skills.sh origin/main (no changed skills); check-changelog-parity.sh --check, --check-order and --check-bump origin/main; validate-plugin-contracts.mjs (52 setup skills, 3040 files); markdownlint 0 issues; typos clean. The --check-bump run first reported four version collisions. They were not from this change set: the branch tip was the pre-squash twin of origin/main's b293df8, identical trees, so the gate read that already-merged commit's bumps as fresh. Rebasing onto origin/main cleared it. Worth naming, because the gate was right to fail and the cause was branch state rather than a real collision. No nested verifier reviewed this diff: no Agent/Task tool was present in this worker's grant, so the fresh-context check the dispatch asked for was not available and is not claimed. Refs #3380, #3474, #3475, `docs/adr/0018-treat-the-plugin-as-the-encapsulation-boundary-for-skill-citation.md`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UmrZGdp1dgbZuPCy7tcRJo
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.
No linked issue
Summary
Closes the L4 roster in
docs/specs/docs-hygiene-sweep-unapplied-remediations.mdat 34 of 34, and fixes the one sentence that reopened it three times.Its Group 2 — eight intra-plugin path-form citations — was the last block anyone believed open. All eight were already closed, by
6c7a1032(#3380) on 2026-08-26: the same commit that wrote the roster.Fix
The eight were closed the day they were recorded
Verified one at a time against the roster's own text test. All eight now read
${CLAUDE_PLUGIN_ROOT}/skills/<skill>/<path>; all seven distinct targets exist on disk. Zeroplugins/**files edited — no bump, no plugin CHANGELOG, noallowed-toolsquestion, because nothing needed changing.#3380's own message names what it did: "eight citations written with an implied base of the plugin root while the real base was
reference/— none of them resolved for any reader".The sentence that cost four passes
#3380 fixed 32 of 34 rows and left its summary line asserting that all 34
path:linecitations "were re-verified on 2026-08-26 and every one resolves" — standing over citations it had just deleted.That line has now sent four separate passes to re-derive the roster from scratch, including this one. A round-five audit caught it for Group 1 (22 of 32 already closed, twelve by #3380 itself); this closes the same hole for Group 2. Both the roster and the sweep spec now carry the correction, and the spec records the generalizable rule:
The roster's inventory rows are left verbatim — that is the part that cannot be re-derived, its decay rule says so, and #3474 and #3475 both closed rows without touching the file. Only an additive closure stamp is appended.
ADR 0018 does not reach this class, and that is the honest answer
Asked whether the ADR reaches intra-plugin citations, the finding is that its encapsulation half does not:
context/,reference/andagents/docs reaching a sibling skill's privates. The roster concedes it: "Legal as citations under ADR 0018, defective as paths."The clause that earned its keep is the ADR's own observation that "proximity did not prevent them": eight of the corpus's ten non-resolving citations sat inside the case the decision legalises.
Verification
Independently re-checked before merge rather than relayed: all seven distinct targets exist on disk; the bare
skills/<s>/reference/form is gone from the cited tree; and the citation atsource-control/reference/config-resolution.mdreads the resolvable${CLAUDE_PLUGIN_ROOT}/…form.Roster delta, second derivation. The first used the roster's text test. The second made no reference to the roster at all: resolve every citation token in every plugin-level
reference/,context/andagents/tree plus every plugin README against the base its own form implies — 52 tokens, 0 clause-3 failures. That population strictly contains the eight, so it confirms the first without sharing its search expression. Group 3's two anchors were also closed by #3380. 34 closed, 0 open.A gate that was right, and a branch that was wrong.
--check-bumpfirst reported four VERSION COLLISIONs. None came from this change set: the branch tip was the pre-squash twin of a commit already onmain(git diff HEAD origin/mainwas empty), so the gate correctly read that merged commit's bumps as unclaimed. Dropping the duplicate cleared it. Worth recording because the same hazard cost an earlier branch in this series a full rebuild.One limitation, stated rather than papered over. No fresh-context verifier reviewed this diff. Nested spawning is unavailable at this depth — the
Agenttool is withheld pre-launch, so there is no call to refuse and no refusal string. A second mechanical derivation with an unrelated expression was substituted, and every line reference in the new table was re-checked against the live tree. That is weaker than a fresh context, and the commit message says so.Related
Refs #3477, refs #3476, refs #3475, refs #3474, refs #3469, refs #3468, refs #3460. Closes the L4 roster.
Generated by Claude Code