Skip to content

docs: adjudicate the twelve citations the encapsulation sweep created, and flag a fired security re-trigger - #3477

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

docs: adjudicate the twelve citations the encapsulation sweep created, and flag a fired security re-trigger#3477
claude[bot] merged 1 commit into
mainfrom
agent-af5d494e37496164d

Conversation

@claude

@claude claude Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

No linked issue

Summary

Adjudicates the twelve cross-plugin path citations that #3468 created in convention CHANGELOGs and never ruled on, and records a security-review record whose own re-trigger has fired unnoticed.

The population at main is 16 fixed + 35 kept, not 16 + 23: every one of #3468's citation fixes wrote a CHANGELOG entry quoting the path it removed, creating twelve new instances of the shape it was closing. #3475 wrote the governing test into ADR 0018; this applies it to those twelve so a later re-derivation does not re-open them.

Fix

The twelve are all keep-correct, and now say why

A dated changelog entry quoting a citation it removed is the evidence case exactly. That was the expectation going in — it was established rather than assumed, one row at a time, anchored on text rather than line numbers. No CHANGELOG was edited, so no convention version bump or entry is owed.

Three sub-rulings the class needed, now written into the spec rather than left implicit:

  • config-cascade's three rows are the only clause-3 question in the set. They are plugin-relative and resolve against nothing — and the entry says so in the same sentence. Clause 3 governs addresses a doc offers, not strings it quotes in order to report them broken. Forcing resolution would delete the finding.
  • The other nine resolve on disk today, verified one path at a time across eleven distinct targets.
  • No row carries a line or step pin — the part the amendment says rots first. Nothing to drop.

One excluded on purpose and recorded so it is not re-opened: plugins/review/reference/topic-docs.md, added by the same commit. It is a plugin-level non-skill tree, which the amendment routes to its own pass, and the entry declares it a keep rather than quoting it as removed.

A security review whose re-trigger fired

docs/MIGRATION-PLAYBOOK.md records a dometrain review performed at 0.1.0 and states that "a version bump adding a new trust surface re-triggers this review". The manifest now reads 0.2.7 — eleven releases later.

The note added states the reviewed version, the shipping version, that the ACCEPT below it describes 0.1.0 only, and that the re-review is owed and deliberately not performed here. It stops short of asserting a trust surface was added: that is the condition the clause turns on and it cannot be settled by reading the page. Two checks were run to avoid claiming otherwise — sync/SKILL.md still carries disable-model-invocation: true (the premise two of the original surfaces rest on), and the setup skill the record never enumerates shipped in the plugin's first commit, so it is not new-surface evidence. Neither settles the trigger, and the note says so rather than guessing.

Verification

Independently re-checked before merge rather than taken on the worker's report: no docs/conventions/** file appears in the diff (consistent with all-twelve-correct), three sampled citation targets resolve on disk, and dometrain's manifest is 0.2.7.

Roster delta, second derivation. The first pass scanned the six files at rest; the second matched path-shaped tokens in the added lines of c66f26ce only. Same twelve, no addition, no subtraction.

scripts/affected-tests.sh --run                 real exit 0, 23 suites passed or skipped
scripts/check-changelog-parity.sh --check-order 86 changelogs, no duplicates
node scripts/validate-plugin-contracts.mjs      52 setup skills, 3040 files
scripts/check-purged-em-dashes.sh               21 paths, 30 files, clean
markdownlint-cli2 / typos                       0 issues

A decay-rule repair worth naming: the spec's dometrain entry pinned MIGRATION-PLAYBOOK.md:943 — a line this change's own edit would have invalidated. Re-anchored on the record's heading text. That rule ("the check is the text, never the status and never the line number") has been violated three times across this sweep; this is the first time it was caught before landing rather than after.

An empirical finding about the harness, recorded because two earlier claims about it were wrong in opposite directions. This worker's definition declares the Agent tool, and the harness withheld it at spawn: the callable set contained no Agent/Task at all. So nesting is gated by depth, realized as pre-launch tool omission — there is no refusal string because there is no call to refuse. An earlier conclusion that "subagents have no Agent tool" was right in effect and wrong in mechanism; the follow-up guess that the gate is definition-specific was wrong outright.

Related

Refs #3476, refs #3475, refs #3474, refs #3469, refs #3468, refs #3460. Closes the unadjudicated-citation half of the sweep's recorded open remainder.


Generated by Claude Code

…, and close the dometrain staleness

#3468 closed the ADR 0018 encapsulation floor by writing a convention CHANGELOG entry
for each fix, and every entry quotes the path it removed. That manufactured twelve new
instances of the shape the pass was sweeping. The sweep record listed them and stated
they were fine; nothing ruled on them one at a time, so the arithmetic (16 fixed and 35
kept, not 16 and 23) rested on an assumption.

Ruled individually against the test #3475 wrote into ADR 0018's amendment. All twelve are
keep-correct and none is edited. Each sits in a dated entry whose claim is what a named
file contained on that date, quoted as the string the entry removed, with the replacing
invocation named in the same sentence, so no reader is sent to any of them for a rule.

Three sub-rulings the class needed are recorded, because a bare "all twelve are evidence"
is the assumption this was meant to replace. The three config-cascade rows quote
plugin-relative forms that resolve against nothing, and the entry says so: clause 3 does
not fire where the entry asserts non-resolution, since making them resolve would delete
the finding. The other nine resolve on disk from their own implied base, checked one at a
time. None carries a line or step pin, the part the amendment says rots first.

Re-derived with a second expression over the fix commit's added lines rather than a scan
of the files at rest. Same twelve, plus one the roster excludes on purpose:
plugins/review/reference/topic-docs.md, a plugin-level non-skill tree that belongs to the
pass the amendment routes it to, and a declared keep rather than a quoted removal.

Separately, MIGRATION-PLAYBOOK's dometrain record was reviewed at 0.1.0 and the manifest
reads 0.2.7, eleven releases later. Whether any of them added a trust surface is what the
re-trigger clause turns on and no record answers it, which takes a review rather than a
reading. The staleness is now stated in place with the re-review logged as owed. The
review itself is deliberately not performed here.

Refs #3468, refs #3475, refs #3460.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UmrZGdp1dgbZuPCy7tcRJo
@kyle-sexton
kyle-sexton force-pushed the agent-af5d494e37496164d branch from 51c8fa4 to 79ab186 Compare August 28, 2026 15:22
@claude

claude Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor Author

Claude finished @kyle-sexton's task in 4m 32s —— View job


Code review — /review:code-review lane

  • Gather context (PR diff, changed files, CLAUDE.md/AGENTS.md, /review:code-review skill instructions)
  • Review docs/MIGRATION-PLAYBOOK.md changes
  • Review docs/specs/extract-ssot-sweep-2026-08-28.md changes
  • Independently verify author's factual claims (citations resolve, manifest version, etc.)
  • Post findings

No blocking findings. This is a docs-only change (2 files, +53/-14) and the record it adds checks out against the working tree, not just against the author's own claimed verification.

What I independently verified (not just restated from the PR body)

  • All twelve rostered citations in docs/specs/extract-ssot-sweep-2026-08-28.md#L357-L362 match the quoted text and line numbers in the six named CHANGELOGs (config-cascade 12–14, detector-findings 44/57, loop-lane 69, native-references 16–18, permission-rule-hygiene 14, topic-docs 11–12).
  • The nine non-config-cascade targets resolve on disk today: plugins/review/skills/fanout/SKILL.md, plugins/docs-hygiene/skills/audit-noise/scripts/lib/noise-shapes.sh, plugins/source-control/skills/babysit-prs/SKILL.md, plugins/review/skills/quality-gate/context/pr.md, plugins/claude-ops/skills/audit-install-state/SKILL.md, plugins/claude-config/skills/audit-permission-grants, plugins/discovery/skills/setup/SKILL.md, plugins/verification/skills/setup/SKILL.md all exist.
  • The three config-cascade targets genuinely resolve against nothing from that file (skills/audit/scripts/detect.sh, skills/setup/SKILL.md, run-e2e/context/e2e-config.md are plugin-relative paths with no base in a convention README), matching the claim that they're evidence-of-breakage quotes rather than addresses.
  • The excluded thirteenth, plugins/review/reference/topic-docs.md, is exactly what detector-findings 2.8.1 keeps and names — confirmed against that CHANGELOG entry.
  • No docs/conventions/** file is in this diff — confirmed via git diff origin/main...HEAD --stat, consistent with "adjudicated, not edited."
  • dometrain manifest is 0.2.7, and its CHANGELOG.md lists exactly eleven entries after [0.1.0] (0.1.10.2.7), matching "eleven releases landed between."
  • sync/SKILL.md still carries disable-model-invocation: true — confirmed.
  • The new docs/MIGRATION-PLAYBOOK.md note correctly stops short of asserting whether a trust surface was added in those eleven releases — it states the trigger's condition is unresolved and logs the re-review as owed rather than guessing, which is the right call for a docs-only PR (the security lane, not this one, would own actually running that re-review).

One interpretive point worth naming but not blocking: the claim that "clause 3 does not fire" on the three config-cascade rows (because the entry asserts non-resolution rather than offering an address) is a reasonable reading of ADR 0018's amendment, but it's an extension the ADR text doesn't spell out verbatim (that passage says a kept citation still owes clause 3 resolution "whatever it is evidence of"). The PR flags this itself as "the only clause-3 question in the set" rather than asserting it silently, which is the right way to record a judgment call — no action needed.

I did not re-run scripts/affected-tests.sh, markdownlint-cli2, or check-purged-em-dashes.sh myself; the PR body's tool-output block is author-claimed and unverified by me. Everything reported above I confirmed directly by reading the referenced files in this checkout.

@github-actions

Copy link
Copy Markdown

Claude has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count.

@claude
claude Bot merged commit dd6c11f into main Aug 28, 2026
60 checks passed
@claude
claude Bot deleted the agent-af5d494e37496164d branch August 28, 2026 15:31
claude Bot added a commit that referenced this pull request Aug 28, 2026
…reopened it three times (#3478)

The L4 roster's Group 2, eight intra-plugin path-form citations, was the last
block anyone believed open. All eight were already closed, by 6c7a103 (#3380)
on 2026-08-26 -- the same commit that wrote the roster. Its 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 which resolved for any reader.

Verified one at a time against the roster's own text test. All eight now read
${CLAUDE_PLUGIN_ROOT}/skills/<skill>/<path> and all seven distinct targets
exist on disk. Zero plugins/** files edited, so no bump and no plugin changelog
entry: nothing needed changing.

The reason four separate passes each re-derived this roster from scratch is one
sentence. #3380 fixed 32 of 34 rows and left its summary 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. A fifth-round audit caught that for
Group 1, where 22 of 32 were already closed and twelve of those by #3380 itself.
This closes the same hole for Group 2. The generalizable rule is now in the
sweep spec: 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, per its own decay rule that the
inventory is the part that cannot be re-derived, and per the precedent that
#3474 and #3475 both closed rows without touching the file. Only an additive
closure stamp is appended.

On whether ADR 0018 reaches this class, the honest answer is that its
encapsulation half does not. Clause 1 legalises intra-plugin citations and names
this exact citing surface. Clause 2 cannot apply, because both files ship inside
one plugin so the runtime absence motivating it cannot occur, and the 2026-08-28
amendment's fix-an-address / keep-evidence test divides clause 2 applications
only. Only clause 3 reaches Group 2, and clause 3 is a resolvability rule rather
than an encapsulation one: 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.

A second derivation making no reference to the roster resolved 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. Group 3's two anchors were also closed by #3380. 34 closed, 0 open.

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 was substituted and every
line reference re-checked against the live tree, which is weaker than a fresh
context and is recorded as such.

Refs #3477, refs #3476, refs #3475, refs #3474, refs #3469, refs #3468.
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