Skip to content

fix(docs): setup-contract drift — unstamped --config claim in three docs, no SSOT for the contract, stale PR-section config #3127

Description

@kyle-sexton

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-landedapply 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions