Context
#3111 / #3115 corrected the "--config only applies on a fresh install" claim across 25 setup skills and the options-doc generator, and version-stamped the replacement. The claim survives one layer up, in docs/, and the campaign surfaced several adjacent contract gaps. Filed as a separate issue to keep #3115 reviewable.
1. The claim is still asserted, unstamped, in three docs
docs/PLUGIN-PHILOSOPHY.md:262-263
docs/MIGRATION-PLAYBOOK.md:1339,1391-1392
docs/extensibility-contract-smoke-tests.md:21,110-111 — Test C: its stamped observation stands; the inference drawn from it propagated.
Correct and stamp each, matching the house style in plugins/claude-ops/skills/plugins/context/scope-semantics.md ("Empirically verified on Claude Code 2.1.228"). The empirical basis, verified on 2.1.240 against an already-installed plugin with a non-default value:
$ claude plugin install context-budget@melodic-software -s user --config settings_write_ask_enabled=false
✔ Plugin "context-budget@melodic-software" is already installed (scope: user)
→ {"options":{"settings_write_ask_enabled":false}}
Do not overclaim: the claim landed 2026-07-18 (fe28ffa70, #360) with no version stamp and CC 2.1.221 changed install-activation behaviour, so "always false" and "true when written, fixed since" are not distinguishable. The defect is the missing stamp as much as the wrong prescription.
2. The setup contract has no single source of truth
#3115 could not do "change the contract once rather than every consumer": the contract lives in docs/PLUGIN-PHILOSOPHY.md § Setup is explicit and repeatable, which was outside that PR's fence, so 25 setup skills were converged on identical wording instead. That wording now has no home to be derived from, and will drift again.
Two clauses need to land in the contract itself:
- Verify-it-landed —
apply reads the effective value back after routing a reconfiguration, rather than claiming an unobserved change.
- Coverage rule — a plugin declaring
userConfig ships a setup skill unless every declared option is trivial per this document's own trivial test. The unqualified form was tried and rejected: it forced a visualization setup skill whose single medium option matches the trivial definition almost word-for-word, which is the blanket ceremony this document warns against.
3. .claude/source-control.md declares the wrong PR sections
It sets pr_body_required_sections to Summary / Test plan / Related. The actually-enforced gate (melodic-software/ci-workflows/.github/workflows/pr-issue-linkage.yml, consumed by .github/workflows/pr-issue-linkage.yml) requires Summary / Fix / Verification / Related, each non-empty, plus a closing keyword. "Test plan" appears nowhere in the gate. Any author or agent trusting the tracked config writes a PR body that fails CI — observed twice in this campaign.
4. Contradiction: evals for hook-plugin skills
docs/MIGRATION-PLAYBOOK.md lists evals as an explicit skip for hook-plugin skills, while scripts/check-changed-skills.sh --require-evals hard-FAILs without them. In #3115, 9 of 13 eval sets exist only because the gate won the argument against the doc. One of the two is wrong; reconcile deliberately rather than letting the gate keep silently overriding the playbook.
5. Org-agnosticism has no single home
Enforced for autonomy in scripts/validate-plugin-contracts.mjs and for github in that plugin's own test, with no shared definition. Two enforcement sites, one unstated rule.
6. Contract accepts non-conforming plugins
dometrain and miro ship no apply action against a contract that calls it mandatory, and validate-plugin-contracts.mjs accepts them. Both deliberately keep /plugin configure for a sensitive option — which may be a legitimate exemption that the contract should name explicitly rather than tolerate silently.
Related
No linked issue.
Context
#3111 / #3115 corrected the "
--configonly applies on a fresh install" claim across 25 setup skills and the options-doc generator, and version-stamped the replacement. The claim survives one layer up, indocs/, and the campaign surfaced several adjacent contract gaps. Filed as a separate issue to keep #3115 reviewable.1. The claim is still asserted, unstamped, in three docs
docs/PLUGIN-PHILOSOPHY.md:262-263docs/MIGRATION-PLAYBOOK.md:1339,1391-1392docs/extensibility-contract-smoke-tests.md:21,110-111— Test C: its stamped observation stands; the inference drawn from it propagated.Correct and stamp each, matching the house style in
plugins/claude-ops/skills/plugins/context/scope-semantics.md("Empirically verified on Claude Code 2.1.228"). The empirical basis, verified on 2.1.240 against an already-installed plugin with a non-default value:Do not overclaim: the claim landed 2026-07-18 (
fe28ffa70, #360) with no version stamp and CC 2.1.221 changed install-activation behaviour, so "always false" and "true when written, fixed since" are not distinguishable. The defect is the missing stamp as much as the wrong prescription.2. The setup contract has no single source of truth
#3115 could not do "change the contract once rather than every consumer": the contract lives in
docs/PLUGIN-PHILOSOPHY.md § Setup is explicit and repeatable, which was outside that PR's fence, so 25 setup skills were converged on identical wording instead. That wording now has no home to be derived from, and will drift again.Two clauses need to land in the contract itself:
applyreads the effective value back after routing a reconfiguration, rather than claiming an unobserved change.userConfigships a setup skill unless every declared option is trivial per this document's own trivial test. The unqualified form was tried and rejected: it forced avisualizationsetup skill whose singlemediumoption matches the trivial definition almost word-for-word, which is the blanket ceremony this document warns against.3.
.claude/source-control.mddeclares the wrong PR sectionsIt sets
pr_body_required_sectionsto Summary / Test plan / Related. The actually-enforced gate (melodic-software/ci-workflows/.github/workflows/pr-issue-linkage.yml, consumed by.github/workflows/pr-issue-linkage.yml) requires Summary / Fix / Verification / Related, each non-empty, plus a closing keyword. "Test plan" appears nowhere in the gate. Any author or agent trusting the tracked config writes a PR body that fails CI — observed twice in this campaign.4. Contradiction: evals for hook-plugin skills
docs/MIGRATION-PLAYBOOK.mdlists evals as an explicit skip for hook-plugin skills, whilescripts/check-changed-skills.sh --require-evalshard-FAILs without them. In #3115, 9 of 13 eval sets exist only because the gate won the argument against the doc. One of the two is wrong; reconcile deliberately rather than letting the gate keep silently overriding the playbook.5. Org-agnosticism has no single home
Enforced for
autonomyinscripts/validate-plugin-contracts.mjsand forgithubin that plugin's own test, with no shared definition. Two enforcement sites, one unstated rule.6. Contract accepts non-conforming plugins
dometrainandmiroship noapplyaction against a contract that calls it mandatory, andvalidate-plugin-contracts.mjsaccepts them. Both deliberately keep/plugin configurefor asensitiveoption — which may be a legitimate exemption that the contract should name explicitly rather than tolerate silently.Related
No linked issue.