Skip to content

docs: point setup skills' shared reconfiguration and placeholder text at their sources - #15381

Merged
kyle-sexton merged 13 commits into
mainfrom
docs/setup-skills-shared-records
Nov 11, 2026
Merged

kyle-sexton merged 13 commits into
mainfrom
docs/setup-skills-shared-records

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Nov 11, 2026 •

Copy link
Copy Markdown
Member

No related issue: a cross-plugin item the stage-3 skill re-audit withheld for one fix; it has no tracking issue.

Summary

This covers stage-3 re-audit cross-plugin items 3 and 4, both about text repeated across the plugins' setup skills.

  • Item 3: findings guardrails-2, repo-hygiene-12, session-flow-38 and every other setup skill that carries the same paragraph, 30 skills in all. Each restated the plugin-reconfiguration routes: claude plugin configure ... --values-stdin, the 2.1.285 floor, the install --config fallback, the scope details and each route's failure signal. Each also gave "fixed at session start" as the reason to recheck. The plugin CLI reference § plugin configure and the manifest reference § Reference a saved value, both read live on 2026-11-11, do not state that timing, so the claim is dropped rather than pointed at.
  • Item 4: findings ai-slop-7, markdown-format-1, firecrawl-12, guardrails-1, eol-normalizer-1, playwright-11 and every other site, 17 skills in all. They quote the vendor placeholder [shell command execution disabled by policy] and give it no source. No shared reference in the repository documents the string, so each site gets its own pointer record.

Fix

  • Reconfiguration paragraph (30 setup skills). Each site keeps the decisions:

    • reconfigure through the native flow (/plugin configure <plugin>@<marketplace> or a headless route);
    • never uninstall to reconfigure;
    • never write user settings or pluginConfigs;
    • recheck in a fresh session and report only an observed value.

    Each site now cites § The routes and § Caveats every setup skill's short form carries by heading, plus a pointer record (as of 2026-11-11) to plugin CLI reference § plugin configure. Plugin-specific rules stay: which key to set, miro's token handling, source-control's multiple keys, machine-health's Windows path form.

  • Contract (docs/contracts/plugin-reconfiguration/README.md).

    • "The short form setups print" now asks for the shape above.
    • § The routes gains the PowerShell pipe form that machine-health and powershell-format used to carry.
  • Placeholder (17 setup skills). Each site keeps the body-Bash fallback and adds a pointer record to skills § Inject dynamic context, which documents the setting and the placeholder, with as-of 2026-11-11 and recheck trigger "the placeholder text changes". The older Claim/Basis record in typos-format is replaced.

  • Evals. Cases that graded the removed wording now grade the decisions:

    • a regex for the native configure route;
    • a key-and-value regex for the option;
    • cites-convention;
    • no-uninstall, without the restated reason;
    • fresh-session criteria, with no session-start or skill-load reason.

    The graders for the fallback order, "already installed", scope, failure signals, per-key --config and the 2.1.285 floor were first removed. They are restored, re-pointed at the contract that still holds those behaviors (table under Verification). Only the uninstall reason stays ungraded. Cases changed in actionlint, bash-format, biome-format, context-budget, desktop-notification, education (samples only), eol-normalizer, go-format, guardrails, knowledge (legacy evals.json), machine-health, markdown-format, mutation-testing, powershell-format, repo-hygiene, ruff-format, skill-quality and typos-format.

  • Check step 5 in repo-hygiene and rate-limit-guard. Both gave "injected when this skill loads" as the reason a changed option shows only in a fresh session. They keep the fresh-session and observed-value instruction, and each now carries a pointer record (as of 2026-11-11) to plugins manifest reference § Reference a saved value, whose anchor I verified live. No grader cited that wording. rate-limit-guard also drops its unpointed claims about when the module and the StopFailure hook read a changed value (review thread).

  • Contract shipped inside each plugin. The first real-model runs showed that the published URL is unreachable offline. docs/contracts/plugin-reconfiguration/README.md is now a registered shared copy (scripts/shared-copies.txt, plus a cluster entry in scripts/cross-plugin-source-registry.txt) at plugins/<p>/reference/plugin-reconfiguration.md for the 31 plugins whose skills cite it. Those skills link the copy by relative path, for example ../../reference/plugin-reconfiguration.md#the-routes. The contract's one relative link, to the retired-conventions convention, now uses the published URL, since a copy cannot resolve it. Its citation section describes the local copy. The CLI-reference pointer records are unchanged.

  • Print the routes, not only the section names. The base-vs-head comparison below showed head regressing on content this PR moved into the contract. Each setup skill now tells the agent to read the routes and caveats sections and print what they give (the fallback route, its behavior on an already-installed plugin, the scope to pass), leaving out the verified-version record. The contract's short-form section says the same.

  • Review-thread grader fixes.

    • already-installed-still-writes (context-budget, repo-hygiene) is case-insensitive again, and it accepts the contract's own order and a correct reply worded without "still". Replies that negate the behavior are kept as fail samples.
    • no-plugin-command-run in the same two cases has the --help guard.
  • ai-briefing check. It now states that it writes nothing even when the user asks it to create a missing file: it reports the FAIL and routes to apply. The eval run had caught it attempting to Write sources.md.

  • Headless-only route grading (review thread). In the 13 cases whose prompt rules out the interactive dialog, configure-route accepts only claude plugin configure <plugin>@…, and the interactive form is a fail sample. The cites-convention grader this PR added is dropped: the skills never tell the reply to name the convention, and the restored route graders now grade the substance.

  • New ai-briefing eval case. setup-check-missing-sources-read-only is new, because the changed-skills gate requires a suite case tagging a changed skill and ai-briefing's setup skill had none. It grades that check reports the missing sources.md as a FAIL routed to apply and writes nothing.

  • Changelog. One fragment for each of the 35 plugins touched.

Verification

  • The pre-push check-affected hook passes, including changed-skills on all 35 setup skills.
  • validate-cases.py on all 19 touched eval dirs: exit 0, 0 FAIL lines. The WARN lines are the usual allowed_tools and judge-calibration ones.
  • check-matchers.py on the same dirs: ok.
  • markdownlint-cli2 on the 89 changed .md files: 0 issues.
  • Every changed .json parses.
  • scripts/check-changelog-fragments.sh --check: valid. --check-required origin/main: all 35 plugins have a fragment.
  • git grep for values-stdin, fixed at session start and already installed across plugins/*/skills/setup/SKILL.md: no hits.

Removed graders: where each behavior lives now

Rule applied: a grader may stay removed only if neither the skill body nor the contract it points at holds the behavior any longer.

Grader id Cases What it graded before (skill text) Where it lives now Disposition
fallback-after-configure actionlint, bash-format, biome-format, context-budget, desktop-notification, eol-normalizer, go-format, guardrails, markdown-format, powershell-format, repo-hygiene, ruff-format, typos-format "Headless fallback, before 2.1.285: claude plugin install <p>@<marketplace> -s <scope> --config KEY=VALUE", after the preferred configure --values-stdin Contract § The routes, "Headless fallback" Restored: the claude plugin configure <p>@ route, then an install --config <key>=<value> rerun; the --values-stdin flag text is no longer required
rerun-still-writes (llm) / already-installed-still-writes (regex) first: actionlint, bash-format, biome-format, desktop-notification, go-format, markdown-format, powershell-format, ruff-format, typos-format; second: context-budget, repo-hygiene "against an already-installed plugin it prints already installed and still writes the value" Contract § The routes ("saves the value on an already-installed plugin") and its install-rerun record Restored: "still saves the value"; the regex also accepts "saves"
scope-rule / scope-default-user scope-rule: the 13 fallback-after-configure cases except eol-normalizer; scope-default-user: eol-normalizer configure has no scope flag; pass the scope claude plugin list reports; -s defaults to user Contract caveat 2 (Scope) Restored with the contract's terms; "-s defaults to user" is dropped because the contract does not state it
failure-signals guardrails --values-stdin exits 1 on a bad value; the --config rerun exits 0 with a warning Contract caveat 4 (read the exit code and the output; the two routes signal differently) Restored at the contract's level of detail
repeatable-per-key markdown-format, typos-format --config repeats per key Contract § The routes ("--config repeatable per key") Restored unchanged
configure-minimum-release typos-format 2.1.285 floor Contract § The routes Restored unchanged
install-config-fallback, scope-from-plugin-list skill-quality install --config skills_root= fallback; claude plugin list Contract § The routes and caveat 2 Restored unchanged
no-uninstall-with-reason, uninstall-reason the 13 cases above (as no-uninstall-with-reason); skill-quality (as uninstall-reason) an uninstall drops the stored pluginConfigs entry and resets every option to its default In neither the skill nor the contract: the contract's caveats pointer links the upstream What an uninstall deletes and keeps Reason stays removed. The decision is graded by no-uninstall
names-values-stdin mutation-testing --values-stdin Contract § The routes Restored as names-headless-configure (claude plugin configure mutation-testing@). It is not a duplicate: the remaining names-plugin-configure matches only the interactive /plugin configure

Not removed but loosened by the same rule, and left as is, open below: the values-* graders now accept key and value rather than the JSON string form, and configure-route accepts the interactive route. The contract still gives both the string form and the headless route.

Real-model runs

Each run used the with-plugin arm only (--ablation none), --runs 1, the default model (Opus 5.5), --judge-model opus and --no-publish. Each went through docker-links.py run, whose preconditions held: DOCKER_CONFIG unset, both ~/.docker links under /mnt/, and no tls/ directory. The run set was 19 cases: every case with a changed, added or restored llm grader, plus the new ai-briefing case. The llm graders were not calibrated first, so treat them as uncalibrated.

First pass: a defect this PR introduced, fixed since by the plugin-local contract copy (see pass 3). The setup skills now send the agent to the contract and the CLI reference for the headless routes. In every run that asked about them, the sandbox blocked raw.githubusercontent.com and code.claude.com. The agent then:

  • declined to give a command it could not confirm;
  • downloaded the pages with curl -o, which trips no-install;
  • probed claude plugin configure --help, which trips no-plugin-command-run.

As a result the restored graders fail, along with most configure-route and values-* checks. The validity gate reports INVALID for 7 first-pass runs because of with-arm network or permission denials, which means the fact the agent needs is not reachable from the plugin.

Case First pass: failed graders Re-run after grader fixes: failed graders
actionlint su-apply-headless-reenable-never-uninstalls values-true, no-plugin-cli-write†, fallback, rerun-still-writes, scope-rule fresh-session‡, fallback, rerun-still-writes, scope-rule
ai-briefing setup-check-missing-sources-read-only no-write§ n/a
bash-format su-apply-headless-disable-never-uninstalls cites-convention†, rerun-still-writes, scope-rule no-install, rerun-still-writes, scope-rule
bash-format su-check-gitignored-skipped-by-default none (1.00) n/a
biome-format su-apply-headless-toggle-off-no-uninstall configure-route, no-install, fallback, rerun-still-writes, scope-rule n/a
biome-format su-check-gitignored-option-not-a-defect none (1.00) n/a
context-budget su-headless-toggle-configure fresh-session†, fallback, already-installed, scope-rule configure-route, no-plugin-command-run, fallback, already-installed, scope-rule
desktop-notification su-apply-headless-master-key-configure cites-convention, rerun-still-writes, scope-rule configure-route, cites-convention, fallback, rerun-still-writes, scope-rule
eol-normalizer setup-headless-toggle-off-configures-never-uninstalls configure-route, values-false, no-plugin-cli-write†, fallback, scope-default-user cites-convention† (passes on re-grade), fallback, scope-default-user
go-format su-apply-headless-toggle-off-configures cites-convention, no-install, fallback, rerun-still-writes, scope-rule no-install, rerun-still-writes, scope-rule
go-format su-check-gitignored-option-default none (1.00) n/a
guardrails su-apply-headless-toggle-and-no-hooks configure-route, no-install, fallback, scope-rule, failure-signals n/a
markdown-format su-apply-ci-toggle-off-keeps-options configure-route, no-install, fallback, rerun-still-writes, scope-rule, repeatable-per-key n/a
mutation-testing se-apply-user-layer-no-repo-write names-headless-configure n/a
powershell-format su-apply-headless-disable-never-uninstalls values-false, fallback, rerun-still-writes, scope-rule n/a
repo-hygiene setup-headless-toggle-configure configure-route, no-plugin-command-run, fallback, already-installed, scope-rule n/a
ruff-format su-apply-headless-disable-never-uninstalls cites-convention, no-plugin-cli-write†, fallback, rerun-still-writes, scope-rule configure-route, cites-convention, fallback, rerun-still-writes, scope-rule
skill-quality su-check-non-default-root-headless-route install-config-fallback, scope-from-plugin-list n/a
typos-format su-apply-headless-toggle-never-uninstalls no-install, fallback, rerun-still-writes, scope-rule, repeatable-per-key, configure-minimum-release n/a

Footnotes:

  • † Wrong grader, fixed.
    • no-plugin-cli-write matched a read-only claude plugin configure --help in the three cases whose copy lacked the --help exclusion the other copies carry. It passed on re-run in all three.
    • cites-convention missed "reconfiguration convention" and "reconfiguration-convention". The regex is deterministic, so I re-graded the recorded replies offline: they now match.
    • context-budget's fresh-session criterion asked the reply to report a value only the user can observe. It passed on re-run.
  • ‡ Real miss. The re-run reply never mentioned a fresh session. The first run passed it.
  • § Real ai-briefing defect, already in main before this PR. During check, the agent tried to Write sources.md because the user asked; the permission mode refused it. The skill says check creates nothing.

Every other failure in the table comes from the unreachable-contract defect above. A one-run single-arm pass has too few runs (n) to show a gain, so this section reports no scores, only per-grader outcomes. Cost: 8.61 USD (first pass) + 3.36 USD (re-run) = 11.98 USD list-price estimate. The estimate was about 3.8 + 3.1 USD at the 0.2 USD-per-run anchor; the opus judge pushed the average to about 0.45 USD per run. All 26 kept sandboxes were removed by literal path.

Pass 3: with the plugin-local contract copy

Pass 3 re-ran every case that failed or was INVALID in the first pass (16 cases), the same way. Pass 4 then re-ran the 2 cases whose llm criteria were fixed after pass 3. The table shows failing graders as recorded. A configure-route re-grade of every pass-3 reply against the headless-only regex passes all 14 cases that have one (deterministic, offline).

Case Pass 3 score Failed graders Classification
actionlint su-apply-headless-reenable-never-uninstalls 0.82 cites-convention, rerun-still-writes cites-convention dropped (see Fix); rerun-still-writes: model variance, the reply gives the fallback but not "still saves"
ai-briefing setup-check-missing-sources-read-only 1.00 none the check fix holds
bash-format su-apply-headless-disable-never-uninstalls 1.00 none
biome-format su-apply-headless-toggle-off-no-uninstall 1.00 none
context-budget su-headless-toggle-configure 0.80, INVALID cites-reconfiguration-convention, already-installed-still-writes INVALID: the agent fetched the CLI reference that the kept "fetch live" pointer names, and it was denied. Both graders are model variance: the first is a pre-existing grader for something the skill does not instruct, and the reply gives the fallback but not "still saves"
desktop-notification su-apply-headless-master-key-configure 0.92 cites-convention dropped
eol-normalizer setup-headless-toggle-off-configures-never-uninstalls 0.90 cites-convention dropped
go-format su-apply-headless-toggle-off-configures 1.00 none
guardrails su-apply-headless-toggle-and-no-hooks 0.94 cites-convention dropped
markdown-format su-apply-ci-toggle-off-keeps-options 1.00 none
mutation-testing se-apply-user-layer-no-repo-write 1.00 none
powershell-format su-apply-headless-disable-never-uninstalls 0.92 cites-convention dropped
repo-hygiene setup-headless-toggle-configure pass 3: 0.70; pass 4: 0.90 pass 3: cites-reconfiguration-convention, fresh-session, already-installed; pass 4: already-installed-still-writes The fresh-session criterion was wrong (it asked for a value only the user can observe) and was fixed; it passes in pass 4. already-installed and cites: model variance
ruff-format su-apply-headless-disable-never-uninstalls 0.91 cites-convention dropped
skill-quality su-check-non-default-root-headless-route pass 3: 0.73; pass 4: 0.73 pass 3: names-reconfiguration-convention, routes-through-claude-code, install-config-fallback; pass 4: values-skills-root, install-config-fallback, scope-from-plugin-list routes-through-claude-code required a convention pointer the skill does not instruct; it was fixed and passes in pass 4. The rest is model variance: the prompt never asks for a headless route, and the pass-4 reply gave only the interactive one
typos-format su-apply-headless-toggle-never-uninstalls 0.93 no-install The agent read the local copy, then ran curl -o on the CLI reference that the kept "fetch live" pointer names. That is the pointer's instruction meeting no network; the grader is right

Validity gate: pass 3 has 15 of 16 cases VALID, with context-budget INVALID as above; pass 4 has 2 of 2 VALID. Real misses from the first pass:

  • actionlint's fresh-session miss: model variance. The skill text states it, and passes 1 and 3 passed it.
  • desktop-notification, ruff-format and go-format not citing the convention: the skill never instructs the reply to cite it, so that grader is dropped.

Cost: pass 3 7.03 USD (estimate about 7.0 USD from these cases' first-pass costs) and pass 4 0.81 USD. The total across all four passes is 19.82 USD, list-price estimate. All 18 pass-3 and pass-4 sandboxes and the throwaway plugin copies were removed.

Base vs head, non-inferiority (owner rule D10)

The comparison covers 5 cases: every case where a restored, route or variance-called grader failed in passes 3 and 4. Each version ran 3 times per case, with-arm only, on Opus 5.5 with --judge-model opus, through docker-links.py. Base is origin/main's plugin tree (git archive), and both trees carry head's case files, so both versions are scored by the same graders.

The first comparison found head worse beyond noise on three graders:

Grader Base Head
context-budget already-installed-still-writes 3/3 0/3
repo-hygiene already-installed-still-writes 3/3 0/3
skill-quality install-config-fallback 3/3 0/3
skill-quality scope-from-plugin-list 3/3 1/3

The skills named the contract's sections but did not ask for their content, so I fixed the skill text (see Fix) and re-ran those cases on head.

Case Base mean Head mean (after fix) Graders where head < base Head > base
actionlint su-apply-headless-reenable-never-uninstalls 0.93 0.97 (pre-fix head) rerun-still-writes 3/3 vs 2/3, within noise fresh-session 2/3 to 3/3; scope-rule 2/3 to 3/3
context-budget su-headless-toggle-configure 0.80 0.93 none scope-rule 0/3 to 3/3; cites 0/3 to 1/3
repo-hygiene setup-headless-toggle-configure 0.87 0.90 none scope-rule 2/3 to 3/3
skill-quality su-check-non-default-root-headless-route 0.91 0.91 none names-convention: 0/3 on both
typos-format su-apply-headless-toggle-never-uninstalls 1.00 0.98 (pre-fix head) no-install 3/3 vs 2/3, within noise: one run used curl -o on the CLI reference the kept "fetch live" pointer names none

The noise report (--baseline) reads: with-arm change +0.04, 95% interval -0.02 to +0.09. Compare verdict: non-inferior at margin 0.05.

  • Validity gate: VALID for every file except context-budget, which is INVALID on both base and head. Both versions' runs read the plugin's own skills/audit/SKILL.md with sed (blocked by a deny rule) and call Glob, which the case does not allow. Head also attempted fetches of the CLI reference. Read context-budget's numbers as indicative.
  • Grader change during the comparison: the already-installed-still-writes widening (a correct reply worded without "still") was re-graded offline on the recorded replies, since it is deterministic. Base stays 3/3 and head is 3/3.
  • Cost: the first comparison 9.96 USD (estimate about 11.8), the re-run of three cases 3.89 USD, and the re-run of two cases 2.97 USD, for 16.82 USD (list-price estimate). All 45 comparison sandboxes, the base tree and the plugin copies were removed.

Related

Follow-ups:

  • Pre-existing (advisory): eval case descriptions in several setup suites cite SKILL.md line numbers. They were already stale in places, and this change shifts them further. Replace them with section names so later edits cannot invalidate them.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm

kyle-sexton and others added 2 commits November 11, 2026 08:47
… at their sources

Thirty setup skills restated the plugin-reconfiguration routes (the
`claude plugin configure ... --values-stdin` command, its 2.1.285 floor, the
install --config fallback, scope details and each route's failure signal) and
gave "fixed at session start" as the reason to recheck in a fresh session. The
live plugin CLI reference does not state that timing. Each site now keeps the
decisions (native configure flow, never uninstall, never write pluginConfigs,
fresh-session recheck reporting only an observed value) and cites the
plugin-reconfiguration contract's "The routes" and "Caveats" sections by
heading, with a pointer record to the CLI reference's plugin configure
section. The contract's "The short form setups print" section now asks for
that shape, and § The routes gains the PowerShell pipe form two skills used to
carry.

Seventeen setup skills that fall back to a body Bash call when a pre-computed
row reads `[shell command execution disabled by policy]` keep the fallback and
gain a pointer record to the skills docs' "Inject dynamic context" section,
which documents that placeholder; typos-format's older Claim/Basis record is
replaced by it.

Eval cases that graded the removed wording now grade the decisions: the native
configure route, the option key and value, a pointer at the convention, no
uninstall, and the fresh-session recheck. Graders for the fallback order,
"already installed", scope and failure signals are removed with their samples.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
The setup SKILL.md changed in the previous commit, and the changed-skills
gate requires a suite case that tags a changed skill. ai-briefing's setup
skill had none. The case runs check in a repository with no profile and
grades that it reports the missing sources.md as a FAIL routed to apply and
writes or edits no file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-11T13:54:18.352458Z 9db0151 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

kyle-sexton and others added 2 commits November 11, 2026 08:53
…setup check step 5

Both setup checks gave "injected when this skill loads" as the reason a
changed option shows only in a fresh session. Each keeps the fresh-session and
observed-value instruction and now carries a pointer record to the plugins
manifest reference's "Reference a saved value" section, read live 2026-11-11.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

claude-review: 2 inline finding(s) on c3b5e70738693f037a48e17b69c7cd0bb673fdd8; the summary is in this lane's pull request comment.

claude-lane: claude-review

@github-actions

github-actions Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

claude-review reviewed 2ea355e241d8d3f8b80869ae97a69ea7adcae392: read 206 of 206 changed file(s); 0 finding(s), 0 as inline comments.

Chunk 1 of 4 (37 files)

claude-review, chunk 1 of 4 (blocking only). This lane already reviewed earlier heads (c3b5e707, 6059e6fb, 09c95eef), so this pass reports only blocking findings and leaves out advisory ones. I read every hunk of all 37 files in this chunk:

  • the plugin-reconfiguration contract README;
  • the actionlint, ai-briefing, ai-slop and bash-format setup skills;
  • the eval cases for actionlint, bash-format and biome-format, and the new ai-briefing case;
  • the new plugins/actionlint/reference/plugin-reconfiguration.md copy;
  • the 7 changelog fragments.

I also checked the copies in identical.txt:

  • the changelog fragments;
  • the matchers.json and no-uninstall.json samples;
  • the 31 reference/plugin-reconfiguration.md copies.

Each contract copy sits under its own plugin's reference/ directory, and only that plugin's skills link it. No copy's path changes what its content does.

Blocking

None in this chunk.

Earlier threads, re-checked on this head

  • no-network graders in bash-format and biome-format (settled; lines unchanged since resolution). Both setup skills link ../../reference/plugin-reconfiguration.md#the-routes and #caveats-every-setup-skills-short-form-carries, so an offline with-plugin run can read what the restored graders check:

    • fallback-after-configure, from the routes and the --config rerun;
    • rerun-still-writes, from "saves the value on an already-installed plugin";
    • scope-rule, from caveat 2.

    Not reraised.

  • Headless-only configure-route (actionlint, bash-format, biome-format). Each case's pattern is now claude plugin configure <plugin>@\S+, and the interactive /plugin configure form is a fail sample. Not reraised.

Checked, no blocking issue

  • Contract copy: the actionlint copy matches the head README plus a GENERATED header. Its in-document anchor #claude-plugin-install---config-rerun resolves inside the copy. The retired-conventions link now uses the published URL, so it works from inside a plugin.

  • Skill text: each rewritten toggle or stored-value paragraph keeps four decisions:

    • the native flow;
    • never uninstall;
    • never write user settings or pluginConfigs;
    • a fresh-session recheck that reports only an observed value.

    It links both contract sections by real headings and tells the agent to print the fallback, the already-installed behavior and the scope. It also carries a complete Pointer / As of / Recheck trigger record. The placeholder pointer records were added to actionlint, ai-briefing, ai-slop and bash-format.

  • ai-briefing check: the read-only wording now covers a user who asks for the fix. The new case grades it with sources-fail-routes-apply, no-write and no-edit. Its samples sort correctly against those graders. Check step 2 already gives apply as the remediation for a missing sources.md.

  • Changelog fragments: each is bump: patch, which fits a docs and eval-only change. The shared fragment text matches each plugin's changes.

  • Closing issue: none. The PR states it has no tracking issue, so there are no acceptance criteria to check. The PR context holds no embedded instructions.

Not verified

I ran nothing. The validator results and real-model pass tables in the PR description come from the author and are unverified here.

Spend (not a hold): none in this chunk. The PR description reports earlier prepaid eval runs.

Chunk 2 of 4 (38 files)

claude-review, chunk 2 of 4: all 38 listed files read, blocking findings only. The prior-findings file says blocking only: yes, because this lane already reviewed three earlier heads. So this pass reports only blocking findings and drops advisory ones. I read every hunk of every listed file in chunk-2.patch:

  • the setup skills for biome-format, bugs, code-tidying, context-budget, desktop-notification, discipline, disk-hygiene, docs-hygiene, education (setup and quiz-me), eol-normalizer and firecrawl;
  • the eval cases and samples for biome-format, context-budget, desktop-notification, education, eol-normalizer and the go-format case.yaml.

The two whole-file deletions in this chunk (no-uninstall-with-reason.json in desktop-notification and eol-normalizer) are in the diff but on no list, so they are not counted. I read them anyway.

Blocking

None in this chunk.

Earlier findings, re-checked on this head

  • Headless-only configure-route (context-budget, settled by the owner): fixed. The pattern is now claude plugin configure context-budget@\S+, which does not match /plugin configure …, and samples/configure-route.json lists the interactive form as a fail sample. desktop-notification, eol-normalizer and go-format follow the same pattern.

  • Graders that needed the network (context-budget, desktop-notification, go-format, eol-normalizer): fixed. Each rewritten skill paragraph links ../../reference/plugin-reconfiguration.md#the-routes and #caveats-every-setup-skills-short-form-carries. From plugins/<p>/skills/setup/ (and from skills/quiz-me/ in education), those paths resolve to the copy each plugin ships. The facts the restored graders check are in that copy:

    • context-budget copy L38-48: the fallback, "no scope flag", and that the rerun saves the value on an already-installed plugin;
    • L114-115: pass the scope claude plugin list reports, because a rerun at another scope adds an install record there.

    The new scope-rule and scope-default-user criteria ask only for these facts.

  • already-installed-still-writes (context-budget): fixed. flags: 'i' is back, a third branch accepts the contract's own word order, and replies that negate the behavior are excluded. The new pass and fail samples match these branches.

  • no-plugin-command-run --help guard (context-budget): fixed. It now ends \b(?!\s+--help\b), and the new pass sample claude plugin configure --help 2>&1 | head -40 holds it. eol-normalizer's no-plugin-cli-write got the same guard.

Checked, no blocking issue

  • Skill text: each rewritten paragraph keeps the decisions:

    • the native flow;
    • never uninstall to reconfigure;
    • never write user settings or pluginConfigs;
    • a fresh-session recheck that reports only an observed value. discipline does this through its unchanged step 9.

    Each also carries a complete Pointer / As of / Recheck trigger record pointing at the CLI reference. Plugin-specific details are kept, such as code-tidying's hard_exclusions values and docs-hygiene's compress_articles.

  • Placeholder pointer records: added to biome-format, context-budget, desktop-notification, eol-normalizer and firecrawl.

  • The values-* and string-false-value regexes: the key-and-value form still rejects the channel-key near miss (desktop_notification_bell_enabled) and a wrong key (eol_normalizer).

  • Manifests: no plugin.json or marketplace.json changes in this chunk.

  • Identical copies: no first path in identical.txt falls in this chunk. Each reference/plugin-reconfiguration.md copy sits under its own plugin's reference/ directory, where only skills link to it. No copy's path changes what its content does.

Not verified

I ran nothing. The validator results and real-model pass tables in the PR description come from the author and are unverified here.

Spend (not a hold): nothing in this chunk spends credits. The PR description reports prepaid eval runs already spent (about 12 USD for the first two passes, plus passes 3 and 4).

Chunk 3 of 4 (35 files)

claude-review, chunk 3 of 4 (all 35 files read). Blocking only: this lane already reviewed earlier heads, so this pass reports only blocking findings.

I read every hunk of the 35 files in this chunk:

  • the setup skills for go-format, guardrails, harness-config, harness-ops, knowledge, machine-health, markdown-format, miro, mutation-testing, planning, playwright and powershell-format;
  • their eval cases, samples and matchers.json;
  • knowledge's legacy evals.json.

The 5 sample files this chunk deletes whole are in the diff but on no file list, so they are not counted. In identical.txt, go-format/.../samples/no-uninstall.json is the first path of its line; its copies sit under guardrails and powershell-format, and each case's no-uninstall llm grader reads it. Its path changes nothing about what it does.

Blocking

None in this chunk.

Earlier findings, re-checked on this head

None of the earlier threads anchor on a file in this chunk. The headless-only configure-route settlement does cover this chunk's guardrails, markdown-format and powershell-format cases, and it holds on this head:

  • Each pattern is claude plugin configure <plugin>@\S+.
  • Each case lists the interactive /plugin configure <plugin>@<marketplace> as a fail sample.

Checked, no blocking issue

  • Skill text. Each rewritten paragraph keeps the decisions:

    • the native flow;
    • never uninstall to reconfigure;
    • never write user settings or pluginConfigs;
    • a fresh-session recheck that reports only an observed value.

    Each links ../../reference/plugin-reconfiguration.md#the-routes and #caveats-every-setup-skills-short-form-carries, and each of those plugins ships the copy (identical.txt). harness-config and playwright get only the placeholder pointer record, and they link no copy. Each pointer record is complete (Pointer / As of / Recheck trigger). The "fixed at session start" timing reason is gone from every skill in this chunk.

  • Removed PowerShell pipe form. machine-health and powershell-format dropped the Get-Content values.json | claude plugin configure … form. It now lives in the contract (README.md#L27-L28), which every plugin copy reproduces. machine-health keeps its Windows-path JSON escaping rule.

  • Restored graders. These all have offline sources in the plugin-local copy:

    • fallback-after-configure, scope-rule and failure-signals in guardrails;
    • fallback-after-configure, rerun-still-writes, scope-rule and repeatable-per-key in markdown-format;
    • fallback-after-configure, rerun-still-writes and scope-rule in powershell-format.

    This matches the settled no-network threads. guardrails matchers.json drops fallback-after-configure, and case.yaml re-adds it as a plain regex grader. The author reports that check-matchers.py passes; I did not verify that.

  • mutation-testing. The new names-headless-configure grader and its samples agree. names-plugin-configure still grades the interactive route, and this prompt does not rule that route out.

  • "toggle off" values. markdown-format and powershell-format set the option to true under "toggle off", but the base did the same: there, "toggle off" names the failing check, and the remediation re-enables the option. go-format keeps its base false. This PR changes no value.

Not verified

I ran nothing. The validator results and real-model pass tables in the PR description are author-claimed and unverified here.

Closing issue: none (the PR states it has no tracking issue).

Spend (not a hold): none in this chunk. The PR description reports prepaid eval-run spend already incurred.

Chunk 4 of 4 (34 files)

claude-review, chunk 4 of 4 (34 files, all read). Blocking only: this lane has already reviewed 3 earlier heads, so this pass reports only blocking findings.

I read every hunk of the 34 listed files in this chunk:

  • the setup skills for rate-limit-guard, repo-hygiene, ruff-format, session-flow, skill-quality, source-control, typos-format and user-interface;
  • the eval cases for repo-hygiene, ruff-format, skill-quality and typos-format, with their samples (deleted samples included);
  • scripts/shared-copies.txt and scripts/cross-plugin-source-registry.txt.

Blocking

None in this chunk.

Earlier findings, re-checked on this head

  • repo-hygiene configure-route accepted the interactive route (earlier thread): fixed. The pattern is now claude plugin configure repo-hygiene@\S+, so /plugin configure repo-hygiene@… no longer matches. ruff-format and typos-format have the same headless-only pattern, and each lists the interactive form as a fail sample. skill-quality keeps the wider pattern on purpose, since its prompt does not rule out the dialog.
  • rate-limit-guard session-start timing claim (earlier thread): fixed. The module-reload and StopFailure timing sentences are gone. The bullet now states only the fresh-session decision and carries a Pointer / As of / Recheck trigger record.
  • repo-hygiene already-installed-still-writes regex (earlier thread): fixed. flags: 'i' is back, and a third branch accepts the contract's own word order. The contract sentence and "Already installed: the rerun still saves the value." are both pass samples now.
  • repo-hygiene no-plugin-command-run lacked the --help guard (earlier thread): fixed. case.yaml and matchers.json both end …update)\b(?!\s+--help\b), and samples/no-plugin-command-run.json has a --help probe as a pass sample.

Checked, no blocking issue

  • Shared copies: scripts/shared-copies.txt adds 31 docs/contracts/plugin-reconfiguration/README.md → plugins/<p>/reference/plugin-reconfiguration.md lines. They match the 31 copies the diff adds (per identical.txt) one for one. cross-plugin-source-registry.txt adds the matching basename entry and cluster line, the same way as the pr-scope-budget entries. Each copy sits under its plugin's reference/, which only skills link to, so no copy's path changes what its content does.

  • Relative links: each changed skill in this chunk links ../../reference/plugin-reconfiguration.md#the-routes and #caveats-every-setup-skills-short-form-carries. From plugins/<p>/skills/setup/SKILL.md, both resolve to the plugin-local copy. Both headings exist in the head contract (README.md#L17, #L106).

  • typos-format configure-minimum-release vs "leave out the verified-version record": no conflict. The 2.1.285 floor appears in § The routes itself (#L20, #L37), not only in the record. The same goes for repeatable-per-key (#L44).

  • Decisions kept in every rewritten paragraph:

    • the native flow;
    • never uninstall to reconfigure;
    • never write user settings or pluginConfigs (session-flow states this just above its paragraph);
    • a fresh-session recheck that reports only an observed value.

    Plugin-specific rules stay too: source-control's comma-joined multiple keys, routed to the dialog or the install rerun, and user-interface's css_important example.

  • Placeholder pointer records: added to rate-limit-guard, repo-hygiene and ruff-format. typos-format's older Claim/Basis record is replaced by the same record.

Not verified

I had no shell, so I ran nothing. The PR description's validate-cases.py, check-matchers.py and real-model results come from the author and are unverified here.

Spend (not a hold): none in this chunk. The PR description reports prepaid eval runs already spent.

@github-actions

github-actions Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

claude-security-review reviewed 2ea355e241d8d3f8b80869ae97a69ea7adcae392: read 206 of 206 changed file(s); 0 finding(s), 0 as inline comments.

Chunk 1 of 4 (37 files)

Security review (chunk 1 of 4): no security issues found

critical-findings: 0

This lane already reviewed an earlier head, so this pass was blocking only: it reports CRITICAL and IMPORTANT findings only. I read every hunk of all 37 files in .claude-lane/chunks/chunk-1.patch. The copies listed in identical.txt are changelog fragments, eval matchers.json/sample files and plugins/*/reference/plugin-reconfiguration.md doc copies. None of them sits at a path where its content would run or gate anything (hook, workflow, settings or manifest), so no copy acts differently from its first path.

What this chunk changes

  • Setup skills (actionlint, ai-briefing, ai-slop, bash-format): the long reconfiguration paragraph is replaced by links to a plugin-local copy of the plugin-reconfiguration convention, plus pointer records to the upstream docs.
  • Convention (docs/contracts/plugin-reconfiguration/README.md): it gains a PowerShell pipe form, a rewritten short-form section, and an absolute URL for its one relative link. The new plugin-local copy (plugins/actionlint/reference/plugin-reconfiguration.md) is generated from it.
  • Eval cases: regex and LLM graders are re-pointed, no-uninstall-with-reason is replaced by no-uninstall, and a new ai-briefing read-only check case is added.
  • Changelog fragments.

Scope checks

  • Instruction-surface lens. The deleted text restated upstream CLI specifics. Every rule that limited what the agent may do is still there, in each changed skill and in the shipped copy:

    • never uninstall to reconfigure;
    • this skill never writes user settings or pluginConfigs;
    • recheck in a fresh session and report only an observed value.

    The ai-briefing check change makes the read-only rule stricter (check writes nothing even when the user asks; it routes to apply). No guard, block list or allowlist was removed or softened, so no protected class lost its enforcement. I did not open the instruction exception register, because no rule was removed for it to classify.

  • Trust controls. No changed file in this chunk matches a trusted-path glob. No workflow, action, hook, script, token request, kill switch or merge hold is touched.

  • Manifests. No plugin.json or marketplace.json changed and no userConfig key was added or changed, so no manifest lines apply.

  • Grader changes. The (?!\s+--help\b) guard on no-plugin-cli-write (actionlint case.yaml and matchers.json) only exempts a read-only --help probe right after the verb, so a real claude plugin write still fails the case. These changes affect eval quality, not security.

  • Live doc fetches. The new pointer records tell the agent to fetch code.claude.com documentation live. That is reading material in a local session; it does not open a path for untrusted text to reach a credentialed lane.

Settled threads and prior findings. I raised no settled thread again. The only prior entry is this lane's earlier summary comment, which reported 0 findings, so nothing carries over.

Spend. This chunk spends no API credit and starts nothing that bills.

Chunk 2 of 4 (38 files)

Security review (chunk 2 of 4): no security issues found

critical-findings: 0

This lane already reviewed an earlier head, so this review is blocking only: it reports only CRITICAL and IMPORTANT findings. I read every hunk of all 38 files in this chunk's patch. The two deleted no-uninstall-with-reason.json samples, for desktop-notification and eol-normalizer, are not on the file list, and I read their hunks too.

What this chunk changes.

  • 13 skill files rewritten. These are the setup skills for biome-format, bugs, code-tidying, context-budget, desktop-notification, discipline, disk-hygiene, docs-hygiene, education, eol-normalizer and firecrawl, plus education's quiz-me skill. Each rewrites the reconfiguration paragraph, adds a placeholder pointer record, or both.
  • Eval files. The rest are eval cases, prompts and samples whose graders follow the new wording: the configure-route regex, key-and-value regexes, no-uninstall, the restored fallback, rerun and scope graders, and the (?!\s+--help\b) guard on the no-plugin-* graders.

Instruction-surface lens. I checked the rules this chunk takes out of the skill bodies against the register (docs/contracts/instruction-exception-register/README.md, whose Gate 0 classes include irreversible-action and data-integrity):

  • Kept in every rewritten skill: never uninstall to reconfigure, never write user settings or pluginConfigs, and recheck in a fresh session and report only an observed value.
  • Kept in context-budget: print the route for the operator and never run a headless route.
  • Moved, not dropped: the scope warning (a rerun at another scope adds an install record and enables the plugin there) and the failure-signal checks now live in the plugin-local copy of the contract that each skill links and tells the agent to apply. In plugins/biome-format/reference/plugin-reconfiguration.md, caveat 1 (never uninstall) is at L111-112, the scope caveat at L115 and the failure-signal caveat at L122. These copies are identical, registered shared copies shipped inside each plugin, so a reachable rule still enforces each removed one, and no protected action is left unchecked.

Other checks.

  • Trusted paths: no file in this chunk matches a trusted-path glob.
  • Trust controls and manifests: this chunk changes no workflow, action, hook, script, token request, kill switch, merge hold, plugin.json or marketplace.json, so no manifest lines apply and no trust control is widened.
  • New pointers: the pointer records added here point at Anthropic's code.claude.com docs, the same pattern used elsewhere in these skills. They add no new untrusted input to a lane that holds credentials.
  • Graders: the --help lookahead only affects how the eval graders score runs. It gives no actor, token or untrusted text a new path anywhere.
  • Embedded text: none of the PR context, settled threads or prior findings contains embedded instructions to act on.

Settled threads and prior findings. I raised no settled thread again. The only prior finding is this lane's earlier summary, which reported 0 findings, so nothing carries over.

Spend. This change spends no API credit and starts nothing that bills. The PR description reports about 12 USD of eval runs, all done before this review.

Chunk 3 of 4 (35 files)

Security review (chunk 3 of 4): no security issues found

critical-findings: 0

This review was blocking only: this lane already reviewed an earlier head, so it reports only CRITICAL and IMPORTANT findings. I read every hunk of all 35 listed files in .claude-lane/chunks/chunk-3.patch. The two identical copies, guardrails/.../samples/no-uninstall.json and powershell-format/.../samples/no-uninstall.json (both copies of go-format's), are eval sample paths. At those paths the content does nothing more than it does in go-format.

What this chunk changes

  • Setup skill bodies (go-format, guardrails, harness-config, harness-ops, knowledge, machine-health, markdown-format, miro, mutation-testing, planning, playwright, powershell-format): the inline reconfiguration routes are replaced by links to the plugin-local copy ../../reference/plugin-reconfiguration.md. Each also gets a pointer record for the policy placeholder [shell command execution disabled by policy].
  • Eval fixtures: case.yaml, prompt.md, matchers.json and samples in go-format, guardrails, knowledge, machine-health, markdown-format, mutation-testing and powershell-format are regraded against the new wording.

Instruction-surface lens
The rewritten paragraphs remove restated upstream facts. No standing guardrail is removed. Every changed skill keeps these decisions:

  • never uninstall to reconfigure;
  • never write user settings or pluginConfigs (knowledge keeps "never hand-edit pluginConfigs or write Claude Code settings", mutation-testing keeps "Never write pluginConfigs or any settings file yourself");
  • report only a value observed in a fresh session.

I also checked miro's handling of the sensitive token. The skill still tells the agent to:

  • use the claude plugin configure route, which keeps the token off the command line;
  • delete the values file afterwards or pipe the value in from a secrets manager;
  • not rely on the install --config rerun for miro_api_token.

The security note below it, which warns that a CLI argument lands in shell history and the process table, is unchanged. The plugin-local contract copy gives --values-stdin as the preferred route (plugins/miro/reference/plugin-reconfiguration.md#L27). It also says its rerun probe did not cover a sensitive option (L104). So the token keeps the same protection it had. No rule was removed, so the instruction exception register was not needed for this chunk.

Scope checks

  • No workflow, action, hook, script, plugin.json/marketplace.json manifest or userConfig key changed in this chunk, so no manifest lines apply.
  • No file in this chunk matches a trusted-path glob.
  • No trust control (trusted-trigger, lane token, kill switch, merge holds, token broker) is touched.
  • The eval grader changes affect how good the evals are, not security. They give no token, actor or untrusted text a new path.
  • The new pointer records only send the agent to fetch code.claude.com documentation. That reads public pages and sends no repository or session content out.

Settled threads and prior findings

  • I raised no settled thread again.
  • The only prior-findings entry is this lane's earlier 0-finding summary, so nothing carries over.
  • The PR context contains no text that tells the lane what to do.

Spend. This chunk starts nothing that bills. It only changes how eval runs are graded, and those runs spend prepaid API credit.

Chunk 4 of 4 (34 files)

Security review (chunk 4 of 4): no security issues found

critical-findings: 0

This lane already reviewed an earlier head (blocking only: yes), so this review reports only CRITICAL and IMPORTANT findings. I read every hunk of all 34 listed files in this chunk. That is 38 manifest entries minus 4 whole-file deletions, which appear in the diff but on no list. I also read the 4 deletions.

What this chunk changes

  • Setup skills. These are the setup SKILL.md files of rate-limit-guard, repo-hygiene, ruff-format, session-flow, skill-quality, source-control, typos-format and user-interface. Each one's long restatement of the reconfiguration routes is replaced by links to the plugin-local copy ../../reference/plugin-reconfiguration.md, plus a pointer record to the plugin CLI reference.
  • Placeholder pointer records. Several of those skills gain a pointer record for the [shell command execution disabled by policy] placeholder.
  • Eval fixtures. The eval cases and samples for repo-hygiene, ruff-format, skill-quality and typos-format are re-pointed: graders renamed, restored or loosened, samples adjusted.
  • Shared-copy registries. scripts/shared-copies.txt and scripts/cross-plugin-source-registry.txt register the contract's 31 plugin-local copies.

Scope checks

  • Trusted paths. No file in this chunk matches a trusted-path glob. No workflow, action, hook, script, plugin.json or marketplace.json changed, and no userConfig key changed, so no manifest lines apply.
  • Instruction-surface lens. I checked the deleted text against the exception register's protected classes; the register (docs/contracts/instruction-exception-register/README.md) is present and was consulted. Its classes are Gate 0's: irreversible-action, secret-handling, data-integrity, external-publication, legal-compliance and agent-authority. The rules those classes cover survive in every touched skill:
    • "never uninstall to reconfigure";
    • "this skill never writes user settings or pluginConfigs", or its equivalent in rate-limit-guard, session-flow, source-control and user-interface;
    • "report the observed value, never an unobserved change".
  • Delegated failure-signal rule. The per-route rule (read the exit code and the output before reporting a value saved) was not dropped. It moved to the shipped local copy's caveats section, and each skill tells the agent to apply that section. Nothing it guarded is left unchecked.
  • source-control babysit keys. The multi-value keys (babysit_self_logins and the others) still route only through Claude Code's native configure flow. The skill still never hand-edits them, so no new path writes them.
  • no-plugin-* graders. The (?!\s+--help\b) lookahead on the repo-hygiene, ruff-format and typos-format graders exempts only a --help probe right after the verb. That changes eval scoring, not a runtime control.
  • Registries. The shared-copy registry entries map one markdown contract to plugin reference/ paths. They don't change what runs.

Settled threads and prior findings. No settled thread is raised again. The rate-limit-guard and repo-hygiene threads marked lines changed since resolution: yes were eval-quality and wording points, not security findings, and the current lines show the owner's stated fixes. The prior-findings file lists only this lane's earlier summary comment, which had 0 findings, so nothing is carried over.

Embedded text. The PR context contains no directive aimed at this lane.

Spend. This chunk spends no API credit in CI and starts nothing that bills. The eval runs the description reports, about 12 USD list-price estimate, were prepaid model usage outside this change.

@kyle-sexton kyle-sexton added the do-not-merge Hard merge gate: do not merge while applied. label Nov 11, 2026
kyle-sexton and others added 6 commits November 11, 2026 14:41
The first commit removed graders for the install --config fallback, the
already-installed rerun, the scope rule, the failure signals, per-key
--config, the 2.1.285 floor and skill-quality's fallback and list probes.
Each behavior still lives in docs/contracts/plugin-reconfiguration/README.md,
which every changed setup skill points the agent at, so each grader comes
back re-pointed at that behavior rather than the old skill wording: the
fallback regex no longer requires the --values-stdin flag text, and the
scope and rerun criteria follow the contract's caveats. mutation-testing's
names-values-stdin returns as names-headless-configure, since
names-plugin-configure matches only the interactive route. The uninstall
reason stays ungraded: neither the skill nor the contract states it.

Real-model runs showed three wrong graders, fixed here: no-plugin-cli-write
in actionlint, eol-normalizer and ruff-format lacked the --help exclusion
the other copies carry; cites-convention missed "reconfiguration
convention" and "reconfiguration-convention"; context-budget's
fresh-session criterion asked the reply to report a value only the user
can observe.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
…es it

Real-model eval runs showed the setup skills' pointer to the published
contract URL fails offline: the sandbox blocked raw.githubusercontent.com and
code.claude.com in every run, so the agent could not give the routes. The
contract is now a registered shared copy at
plugins/<p>/reference/plugin-reconfiguration.md for the 31 plugins whose
skills cite it, and those skills link the copy by relative path. The
contract's one relative link (to the retired-conventions convention) is now
the published URL, since a copy cannot resolve it, and its citation section
describes the local copy.

ai-briefing's setup check now says it writes nothing even when the user asks
it to create a missing file; it reports the FAIL and routes to apply. The
eval run caught it trying to Write sources.md during check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
…alog

Review on #15381: in the 13 cases whose prompt rules out the interactive
configure dialog (a CI box, or "I cannot use the interactive configure
prompt"), configure-route accepted /plugin configure, so a reply offering
only the route the user cannot use passed. It now accepts only
`claude plugin configure <plugin>@...`, with the interactive form as a fail
sample.

The cites-convention grader this PR added is dropped: the skills never tell
the reply to name the convention, and with the contract now shipped in each
plugin the agent answers from it directly, so the restored route graders
grade the substance. The repo-hygiene fresh-session criterion and the
skill-quality routes criterion no longer ask for more than the skill
instructs.

rate-limit-guard's setup check drops its unpointed claims about when the
module and the StopFailure hook read a changed value, keeping the
fresh-session recheck and the observed-value rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
… cluster

The pre-push cross-plugin-source-drift check failed on the 31 new
reference/plugin-reconfiguration.md copies: it requires every byte-identical
cluster to be registered. They are registered with sync-shared-copies.sh as
their dedicated check, as the standards and pr-scope-budget contract copies
are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

claude-review: 4 inline finding(s) on 6059e6fb0befe7a8b0d25c9baf665c949586cc80; the summary is in this lane's pull request comment.

claude-lane: claude-review

kyle-sexton and others added 2 commits November 11, 2026 15:12
Review on #15381. already-installed-still-writes (context-budget,
repo-hygiene) failed a reply that copies the contract's sentence, "it saves
the value on an already-installed plugin", and lost the base version's case
-insensitive flag; it now accepts that order and is case-insensitive again,
with the contract sentence as a pass sample and a reply that gives the
fallback without the behavior as a fail sample.

no-plugin-command-run in the same two cases counted a read-only
`claude plugin configure --help` as a write; it gets the --help guard the
other no-plugin-* copies carry, with a --help probe as a pass sample. No other
no-plugin-* grader in the touched cases lacked it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
… names

A base-vs-head comparison (3 runs per version per case, same graders on
both) showed head worse than origin/main on graders for content this PR moved
into the contract: context-budget and repo-hygiene stopped saying the
fallback rerun saves the value on an already-installed plugin, and
skill-quality stopped giving the install fallback and the scope to pass. The
skills only named the contract's sections. Each setup skill now tells the
agent to read the routes and caveats sections and print what they give (the
fallback, its behavior on an installed plugin, the scope), leaving out the
verified-version record, which one repo-hygiene run had quoted. The
contract's short-form section says the same.

already-installed-still-writes also accepts a correct reply worded without
"still" ("prints already installed and only saves the value"), with
negated replies kept as fail samples.

After the fix head is at or above base on every grader in all five cases;
noise-report reads non-inferior at margin 0.05 (+0.04, interval -0.02 to
+0.09).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm
@kyle-sexton kyle-sexton removed the do-not-merge Hard merge gate: do not merge while applied. label Nov 11, 2026
@kyle-sexton
kyle-sexton added this pull request to the merge queue Nov 11, 2026
Merged via the queue into main with commit ffcb24e Nov 11, 2026
57 checks passed
@kyle-sexton
kyle-sexton deleted the docs/setup-skills-shared-records branch November 11, 2026 22:38
@github-actions github-actions Bot added the merge-path: owner-agent Post-merge accounting record (README.md, Merge paths) label Nov 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-path: owner-agent Post-merge accounting record (README.md, Merge paths)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant