Skip to content

docs: close the L4 roster at 34 of 34, and fix the summary line that reopened it three times - #3478

Merged
claude[bot] merged 1 commit into
mainfrom
agent-a147e2cfa610d0c38
Aug 28, 2026
Merged

docs: close the L4 roster at 34 of 34, and fix the summary line that reopened it three times#3478
claude[bot] merged 1 commit into
mainfrom
agent-a147e2cfa610d0c38

Conversation

@claude

@claude claude Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

No linked issue

Summary

Closes the L4 roster in docs/specs/docs-hygiene-sweep-unapplied-remediations.md at 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. Zero plugins/** files edited — no bump, no plugin CHANGELOG, no allowed-tools question, 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:line citations "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:

A record that fixes findings and updates its own summary in the same commit must update the summary, or the summary outranks the fix for every later reader.

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:

  • Clause 1 legalises them and names this exact citing surface — plugin-level context/, reference/ and agents/ docs reaching a sibling skill's privates. The roster concedes it: "Legal as citations under ADR 0018, defective as paths."
  • Clause 2 cannot apply. Both files ship inside one plugin, so the runtime absence motivating clause 2 — and the fetched-contract problem the 2026-08-28 amendment builds on it — cannot occur. Intra-plugin genuinely differs from cross-plugin: it does not fail on install.
  • The amendment's fix-an-address / keep-evidence test does not reach them either. That test divides clause 2 applications; Group 2 was never a clause 2 matter.
  • Only clause 3 reaches Group 2, and clause 3 is a resolvability rule, not an encapsulation rule. Had these been open, the remedy would have been path form and nothing else.

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 at source-control/reference/config-resolution.md reads 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/ 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, so it confirms the first without sharing its search expression. Group 3's two anchors were also closed by #3380. 34 closed, 0 open.

scripts/affected-tests.sh --run                 real exit 0, 17 suites (captured directly)
scripts/check-changed-skills.sh origin/main     0 — no changed skills
check-changelog-parity --check/-order/-bump     0 / 0 / 0
node scripts/validate-plugin-contracts.mjs      52 setup skills, 3040 files
markdownlint-cli2 / typos                       0 issues

A gate that was right, and a branch that was wrong. --check-bump first reported four VERSION COLLISIONs. None came from this change set: the branch tip was the pre-squash twin of a commit already on main (git diff HEAD origin/main was 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 Agent tool 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

…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
@claude
claude Bot merged commit e7e3a36 into main Aug 28, 2026
60 checks passed
@claude
claude Bot deleted the agent-a147e2cfa610d0c38 branch August 28, 2026 15:35
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.

1 participant