Skip to content

fix(docs): correct setup-contract drift in docs and tracked PR config - #3139

Merged
kyle-sexton merged 1 commit into
mainfrom
fix/3127-setup-contract-doc-drift
Aug 23, 2026
Merged

fix(docs): correct setup-contract drift in docs and tracked PR config#3139
kyle-sexton merged 1 commit into
mainfrom
fix/3127-setup-contract-doc-drift

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Closes #3127

Summary

Parts 2–6 of #3127. Part 1 — the unstamped --config claim across three docs — shipped separately in #3173 while this branch was open, and #3173 deliberately did not close the issue. This PR was rebuilt on top of it: every part-1 rewrite here was dropped in favour of what shipped, docs/extensibility-contract-smoke-tests.md is no longer touched at all, and three files remain.

One part-1 delta survives, because #3173's text has a gap this branch's reviewers had already found six times — see the first item under Fix.

Fix

The surviving part-1 delta — scope qualifier at two --scope project steps. Both MIGRATION-PLAYBOOK.md reintegration/onboarding steps pair a --scope project install example with the rerun-writes claim, citing smoke-test C without stating its conditions. The 2.1.240 verification was -s user with a non-sensitive option; project and local were never run. Both sites now state the scope inline, name the shown --scope project as untested, and route the reader to a readback — at the location step 3 records, attributed rather than asserted, since that record itself generalises from --scope local runs alone (smoke-test A). No project-scope install was run to make the sentences true; the qualifier is the fix.

Part 2 — the setup contract's read-back clause (docs/PLUGIN-PHILOSOPHY.md § Setup is explicit and repeatable). #3115 converged its setup skills on identical wording with no contract to derive it from. The clause is stated as a property of the setup skill, not of the apply verb — five plugins ship a setup skill with no apply, so an apply-scoped clause would be false on arrival, which is the defect #3115's own fourth commit existed to fix.

It carries the false-failure hazard the merged skills already describe: the write can succeed while the running session still reports the old value, and reporting that as a failed write is the error the clause prevents. Both timing mechanisms are marked untested, with what smoke-tests B and D actually recorded stated rather than implied.

Part 2's coverage half is already on main via #3115 ("Stated as fleet coverage") and is not re-landed here — one rule, one place.

Part 3 — .claude/source-control.md. pr_body_required_sections set to Summary / Fix / Verification / Related, read from the enforced gate's own requiredSections array at the SHA the caller pins. "Test plan" appears nowhere in the gate. The file records that the gate is the authority, that the caller exempts dependabot[bot] and no other author, and to read the reusable at the pin. Two adjacent corrections: the intro claimed only one key was set here while five are, and the new prose sits above the first ## <key> H2 so the list-valued key's grammar stays intact.

Part 4 — evals doctrine vs the evals gate + #3135. The hook-plugin eval skip rested on a rationale — "no model-invoked skill" — false for a hook plugin shipping a setup skill, which the same paragraph calls warrantable. Narrowed to the case its rationale describes. The gate is then recorded as operative rather than left to win silently: check-changed-skills.sh requires evals for any touched SKILL.md, check-skill.sh hard-FAILs for any shape, and the one CI caller cannot override it. The pure-reference skip remains a live contradiction; #3135 carries the two exits.

Part 5 — org-agnosticism + #3136. The rule had no named home. It now has one, declared a normative target whose enforcement reaches a strict subset — naming what is ungated (the bare org name fleet-wide, agent content entirely) rather than implying coverage, exactly as the setup contract below already models. The sanctioned use is a citation that names a source rather than a target the plugin acts on, with the boundary drawn explicitly: prose citing a URL is conforming, a skill instructed to fetch or write to it is not.

Part 6 — no doc change owed. apply is not unconditionally mandatory: the check-only carve-out already names Native userConfig as a qualifying surface, and dometrain/miro own no writable artifact, so both conform. The residual gap is validator-side — validate-plugin-contracts.mjs passes any skill whose body contains the substring check-only without checking the precondition. Filed as #3137.

Verification

Three files changed; nothing under plugins/** or scripts/**.

  • markdownlint-cli2@0.23.2 with the repo config over all three — 0 issues
  • lychee --offline --config lychee.toml over all three — 0 errors
  • check-contract-clause-coverage.pyPASS; node scripts/validate-plugin-contracts.mjsPASS (50 setup skills, 2817 files); check-changelog-parity.sh --checkPASS; check-skill-count-claims.sh --checkPASS
  • The section list came from gh api on the reusable at the caller's pinned SHA, read out of its requiredSections array. This body is the test: it carries exactly those four headings.

On verification itself — the honest record. This branch shipped eight instances of the defect it exists to correct: a claim outrunning its evidence. Six were caught by human review (one finding, raised across six rounds — an unqualified "verified" beside an untested scope). Two were caught by an unbounded verification criterion instructing the verifier to hunt for what no named criterion covers. None was caught by self-review.

The transferable lesson is not "the verifier was weak". Five bounded passes returned PASS while the scope defect was live, because scope was not among the criteria they were handed: a verifier is bounded by its criteria, so a defect nobody thought to name survives an arbitrary number of green passes. Re-verification now carries the scope criterion explicitly and an open-ended hunt — which is what caught instances seven and eight.

Related

🤖 Generated with Claude Code

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 40s —— View job


Security Review

  • Gather context
  • Invoke /review:security-review
  • Post findings

Skip gate triggered — no security-relevant surface.

This PR is documentation-only: all four changed files are markdown docs
(.claude/source-control.md, docs/MIGRATION-PLAYBOOK.md, docs/PLUGIN-PHILOSOPHY.md,
docs/extensibility-contract-smoke-tests.md). No scripts/**, plugins/**, or
.github/workflows/** paths are touched, confirming the PR body's own claim.

Reviewed the full diff (git diff origin/main...HEAD) for the security-review skill's criteria
regardless:

  • No code, no shell scripts executed by CI, no GitHub Actions workflow changes.
  • Example claude plugin install … command blocks in the docs are illustrative prose only, not
    executed anywhere in this repo — no injection surface.
  • No secrets, tokens, or credentials are introduced or handled differently; the doc changes about
    sensitive: true / credential storage only correct prose describing existing, unchanged behavior.
  • No permission, authorization, or access-control logic is touched.
  • No supply-chain surface (dependency/action pins) is touched.

No security findings to report for this PR.

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 3m 22s —— View job


CI code review — /review:code-review

Scope. Reviewed the full diff (git diff origin/main...HEAD, 4 files, +129/-24: .claude/source-control.md, docs/MIGRATION-PLAYBOOK.md, docs/PLUGIN-PHILOSOPHY.md, docs/extensibility-contract-smoke-tests.md) against this lane's correctness/maintainability criteria. This is a docs-only PR with no plugins/** or scripts/** path touched, per the PR's own claim — confirmed by the diff stat.

What I checked, independently:

  • Cross-referenced every code/line-number citation the PR body makes against the actual source, since a documentation-accuracy PR lives or dies on those being right:
    • scripts/check-changed-skills.sh:69-72 — confirmed: adds --require-evals when a changed skill's SKILL.md differs from base.
    • plugins/skill-quality/scripts/check-skill.sh:690-696 — confirmed: hard-errs on missing evals/evals.json when REQUIRE_EVALS=1, unconditional on skill shape.
    • scripts/validate-plugin-contracts.mjs:60-61 — confirmed: gates on the literal substring check-only (case-insensitive), no precondition check.
    • scripts/validate-plugin-contracts.mjs:80-88 and :245-263 — confirmed: fleet-wide org/publisher token gate, plus a stricter autonomy-specific token set.
    • plugins/github/github.test.sh:63-70 — confirmed: independent grep-based agnosticism sweep over that plugin's own prose.
    • scripts/skill-count-claim-exemptions.txt (cited as the repo's existing exemptions-file idiom) — confirmed it exists.
  • Checked internal consistency of the new/changed prose in docs/PLUGIN-PHILOSOPHY.md (readback clause, coverage-qualifier clause, org-agnosticism paragraph) against the surrounding sections it plugs into (check/apply contract, check-only carve-out, Setup must be: list) — no contradictions found; forward reference to "check-only carve-out (below)" resolves correctly later in the same file.
  • Checked .claude/source-control.md's corrected intro paragraph against plugins/source-control/reference/config-resolution.md's documented grammar (## <key> H2, "closed bullet list" for pr_body_required_sections) — the repositioned note (now above the ## pr_body_required_sections H2) is consistent with that grammar; the H2 body stays a pure bullet list.
  • Verified all relative doc links touched or newly added (docs/CLOUD-SESSIONS.md, docs/conventions/invocation-mode/README.md, docs/extensibility-contract-smoke-tests.md) resolve to real files.
  • Verified heading structure in docs/extensibility-contract-smoke-tests.md wasn't broken by the inserted correction block (Tests A–E still in order, no orphaned headings).

Not independently verified (author-claimed only): the pr_body_required_sections four-entry list was sourced by the author from melodic-software/ci-workflows' requiredSections array via gh api — I don't have network/gh api access in this lane (only gh pr diff/view/comment/review are permitted) to re-fetch that external file myself, so I can't independently confirm the four sections against the reusable workflow's current source. Flagging this as author-claimed rather than confirmed, per this lane's rule against restating unverified claims as verified. Note this repo's own local wrapper, .github/workflows/pr-issue-linkage.yml (untouched by this PR), describes the gate in its header comment as requiring only a closing keyword and a non-empty ## Related section — it doesn't mention Summary/Fix/Verification by name. That's a pre-existing, out-of-diff file so it's not a blocking finding here, but it's worth a quick independent re-check against the reusable's live requiredSections array before treating this as settled, since it's exactly the kind of drift this PR is trying to eliminate.

  • Similarly unverified: the markdownlint-cli2, lychee, and scripts/check-* command outputs listed under Verification — I didn't re-run them myself in this lane.

Findings: None that clear this lane's high-signal bar. The diff is internally consistent, the code/line citations check out against the actual source, and the corrected claims (the --config reconfiguration behavior, the pr_body_required_sections restatement, the setup-contract readback/coverage clauses) read as coherent, well-scoped documentation fixes rather than introducing new drift. No inline comments posted.

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown

Last security-reviewed head: 2f8f7c14d9fc9fd41476ff9d0f9568a50c289dc7. On the next push, the relevance gate compares only the commits since this SHA; delete this comment to force a full re-review.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 86c4bae410

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/extensibility-contract-smoke-tests.md Outdated
Comment thread docs/PLUGIN-PHILOSOPHY.md Outdated
@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown

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

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 5m 18s —— View job


CI code review — /review:code-review

Scope. Reviewed the full diff (gh pr diff 3139, 4 files, +129/-24: .claude/source-control.md, docs/MIGRATION-PLAYBOOK.md, docs/PLUGIN-PHILOSOPHY.md, docs/extensibility-contract-smoke-tests.md) against this lane's correctness/maintainability criteria. Docs-only PR, no plugins/** or scripts/** path touched. (Local checkout note: .claude/source-control.md shows an unrelated uncommitted local revert in this sandbox — irrelevant to review, since gh pr diff and git show <head>:<path> both confirm the actual PR content matches what's described below.)

What I independently checked:

  • Cross-referenced every code/line-number citation the new prose makes against the actual source: scripts/check-changed-skills.sh:60-75, plugins/skill-quality/scripts/check-skill.sh:685-696, scripts/validate-plugin-contracts.mjs:55-92 and :243-266, plugins/github/github.test.sh:58-70 — all confirmed accurate.
  • Confirmed docs/PLUGIN-PHILOSOPHY.md:392's forward reference "check-only skill (below)" resolves to the "Check-only carve-out" section at line 434 in the same file.
  • Confirmed .claude/source-control.md's repositioned note keeps the ## pr_body_required_sections H2 body a pure bullet list, matching the "closed bullet list" grammar plugins/source-control/reference/config-resolution.md:14,35,93 specifies, and that the corrected "only one key is set here" → "only one convention key" intro accurately reflects the file (5 keys total: pr_body_required_sections + 4 babysit_loop_*).
  • Checked internal consistency of the rewritten Test A preamble in docs/extensibility-contract-smoke-tests.md against Test C's correction — the "precaution was unnecessary rather than invalidating" argument holds (a fresh install behaves identically either way).

Finding (posted inline, 2 locations — same issue): docs/MIGRATION-PLAYBOOK.md:1354-1358 and :1405-1411 each pair a --scope project install example with the claim that a rerun "prints already installed and still writes," but the source verification (docs/extensibility-contract-smoke-tests.md Test C, lines 138-140) explicitly scopes that result to a non-sensitive option at user scope and says project/local scope was not covered. Both playbook sites use only a terse "smoke-test C's correction owns the conditions" pointer rather than restating that caveat, right next to an example in the untested scope — a reader could reasonably take project-scope reconfiguration as verified when it isn't. docs/PLUGIN-PHILOSOPHY.md:274-277 states the same underlying fact with the scope caveat inline, which is the pattern I'd suggest mirroring in the playbook.

Considered, not raised as a finding: a GitHub-bot review on this PR flagged that shipped setup skills (plugins/source-control/skills/setup/SKILL.md, plugins/desktop-notification/skills/setup/SKILL.md, plugins/knowledge/skills/setup/SKILL.md, and others) still prescribe uninstall-then-reinstall, which I confirmed by reading those files directly — they do still contain that guidance today. But those files are untouched by this diff (pre-existing, out of this lane's high-signal bar), and the PR body already accounts for the split: it names #3115 as the sibling PR that corrected this same claim across 25 setup skills, with this PR doing the doc/contract half only. Flagging for visibility, not as a blocking finding here.

Not independently verified (author-claimed only, per this lane's rule against restating unverified claims as verified): the pr_body_required_sections four-entry list sourced from melodic-software/ci-workflows's requiredSections array — no gh api access in this lane to re-fetch it; the commit-hash attributions (eefcbb1a2 #81, fe28ffa70 #360) in the Test C correction — this sandbox's shallow clone doesn't reach that history; and the markdownlint-cli2/lychee/check-* script outputs listed under Verification.

Comment thread docs/MIGRATION-PLAYBOOK.md Outdated
Comment thread docs/MIGRATION-PLAYBOOK.md Outdated
@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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


CI code review — /review:code-review

  • Gather context
  • Invoke /review:code-review criteria
  • Review changed files
  • Post findings

Scope. Reviewed the full diff (gh pr diff 3139, 4 files: .claude/source-control.md, docs/MIGRATION-PLAYBOOK.md, docs/PLUGIN-PHILOSOPHY.md, docs/extensibility-contract-smoke-tests.md) against this lane's correctness/maintainability criteria, and cross-checked the PR body's own citations (code line numbers, config-resolution.md grammar rule, forward references within the changed docs) against the actual source.

Independently verified as correct:

  • .claude/source-control.md's pr_body_required_sections (Summary/Fix/Verification/Related) is now a pure closed bullet list under its ## <key> H2, matching the grammar plugins/source-control/reference/config-resolution.md:35-36 and :92-94 specify; the explanatory prose sits above the first H2 as claimed. The "five keys, one restated here" count is correct (1 + four babysit_loop_*).
  • Line citations in docs/MIGRATION-PLAYBOOK.md's new evals paragraph and docs/PLUGIN-PHILOSOPHY.md's new org-agnosticism paragraph check out against current source (scripts/validate-plugin-contracts.mjs:60-61, :80-88, spot-checked).
  • The docs/PLUGIN-PHILOSOPHY.md forward reference "a check-only skill (below) carries it in check" (line 395) resolves correctly to the check-only carve-out later in the same file (line 438).

Finding posted inline (docs/MIGRATION-PLAYBOOK.md:1358): the corrected --config rerun behavior is stated as unqualified "verified on Claude Code 2.1.240" attached to a --scope project command example (twice — lines ~1355-1358 and ~1406-1410), but the underlying verification (docs/extensibility-contract-smoke-tests.md, restated correctly in docs/PLUGIN-PHILOSOPHY.md:278-280) covered only a non-sensitive option at user scope. The second occurrence goes further, asserting categorically "Never uninstall to reconfigure — the rerun is verified" for that same untested-scope command. This is the same class of defect this PR otherwise carefully corrects (an inference read as fact past its tested conditions), just reintroduced one layer down.

Cross-file finding (no changed line carries it — the fleet, not this diff): docs/PLUGIN-PHILOSOPHY.md lands a new, explicit rule at line 280"Never document uninstall-then-reinstall as the way to change a value." As of this PR's HEAD, 24 shipped setup skills still do exactly that, e.g.:

The PR's Related section states #3115 "corrected the same claim in 25 setup skills." That fix is not present in this branch's ancestry (origin/main at this PR's base still carries the old text in all 24 files above) — so either #3115 hasn't merged yet, or the count/scope of what it fixed doesn't match what's still live. Either way, the fleet is immediately non-conforming with the rule this PR just landed, the same situation items 4-6 in the PR body handled by filing a tracking issue rather than leaving silent. Worth either linking this to #3115's actual status or filing a follow-up like #3135-#3137.

No other high-signal findings. The rest of the diff (the readback/coverage clauses in PLUGIN-PHILOSOPHY.md, the extensibility-contract-smoke-tests.md correction block, the evals-skip narrowing) is internally consistent and accurately cited.
· branch fix/3127-setup-contract-doc-drift

Comment thread docs/MIGRATION-PLAYBOOK.md Outdated
@kyle-sexton
kyle-sexton force-pushed the fix/3127-setup-contract-doc-drift branch from c0ae202 to fa6786e Compare August 23, 2026 03:24
@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 51s —— View job


Security Review

  • Gather context
  • Invoke /review:security-review
  • Post findings

Skip gate triggered — no security-relevant surface.

Reviewed the full diff at this head (git diff origin/main...HEAD, matching gh pr diff 3139 at HEAD fa6786e9134016dd4fefa46edad214a942133fee). All four changed files are markdown docs / doc-adjacent config:

  • .claude/source-control.md
  • docs/MIGRATION-PLAYBOOK.md
  • docs/PLUGIN-PHILOSOPHY.md
  • docs/extensibility-contract-smoke-tests.md

No scripts/**, plugins/**, or .github/workflows/** path is touched, confirming the PR body's own claim.

Checked against this lane's criteria regardless:

  • No code, no shell scripts executed by CI, no GitHub Actions workflow changes.
  • Example claude plugin install … / claude plugin uninstall … command blocks (docs/MIGRATION-PLAYBOOK.md, docs/extensibility-contract-smoke-tests.md) are illustrative prose only, not executed anywhere in this repo — no injection surface.
  • No secrets, tokens, or credentials are introduced or handled differently. The sensitive: true / credential-storage passages in docs/PLUGIN-PHILOSOPHY.md and docs/extensibility-contract-smoke-tests.md only correct prose describing existing, unchanged runtime behavior (what --config writes and where) — they don't change how secrets are stored, transmitted, or logged.
  • .claude/source-control.md's pr_body_required_sections change is a documentation-config value (which PR-body headings this repo's merge gate expects), not an access-control or permission setting.
  • No permission, authorization, or access-control logic is touched.
  • No supply-chain surface (dependency/action pins) is touched.

No security findings to report for this PR.
· branch fix/3127-setup-contract-doc-drift

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 2m 48s —— View job


CI code review — /review:code-review

  • Gather context
  • Invoke /review:code-review skill
  • Review changed files
  • Post findings

Scope. Reviewed the full diff (git diff origin/main...HEAD, 4 files, +141/-24: .claude/source-control.md, docs/MIGRATION-PLAYBOOK.md, docs/PLUGIN-PHILOSOPHY.md, docs/extensibility-contract-smoke-tests.md) at HEAD fa6786e, against this lane's correctness/maintainability criteria. Docs-only PR, no plugins/** or scripts/** path touched, matching the PR body's own claim.

What I independently checked against this new HEAD (this PR has been revised several times since the last review; I re-diffed and re-verified rather than trusting prior rounds):

  • Walked the last three commits (235d024, 163404b, fa6786e) individually to see exactly what changed since the prior review round — 163404b fixed the previously-flagged unverified uninstall-hazard overclaim (now correctly marked untested) and corrected two source-attribution errors; 235d024 and fa6786e are provenance-accuracy fixes to the Test C correction block, re-derived rather than trusted (the "25 setup skills" count was dropped as unverifiable — good catch, since fe28ffa70 only touches 17 files).
  • Re-confirmed docs/PLUGIN-PHILOSOPHY.md's new "Coverage, read from the manifest" clause (lines 359-369) correctly depends on and follows the triviality test defined just above it (lines 334-357) — the forward/backward references resolve.
  • Re-confirmed .claude/source-control.md's pr_body_required_sections change and repositioned note against plugins/source-control/reference/config-resolution.md's grammar — consistent.
  • Confirmed the local uncommitted revert of .claude/source-control.md visible in git status in this sandbox is a pre-existing local-checkout artifact, not part of this PR's actual content (git diff origin/main...HEAD and this file's own history confirm the real PR content matches the description above).

Finding (posted inline, 2 locations — same defect, not yet fixed despite four prior review rounds flagging it):
docs/MIGRATION-PLAYBOOK.md:1358 and :1408-1410 each pair a --scope project install example with an unqualified "verified on Claude Code 2.1.240" claim about rerun-writes behavior. The canonical source (docs/extensibility-contract-smoke-tests.md, Test C's correction, added by this same PR) scopes that verification to a non-sensitive option at user scope and says project/local scope was explicitly not covered. docs/PLUGIN-PHILOSOPHY.md:274-280's parallel passage states this caveat inline correctly — the playbook's two sites don't. The second site goes further, issuing a categorical "Never uninstall to reconfigure — the rerun is verified" for the same untested scope. I checked commit 163404b's diff specifically, since it addressed a neighboring overclaim in this exact paragraph family (the uninstall-hazard claim) — it left this scope mismatch untouched. This is the same defect class (an inference read as fact past its tested conditions) the PR's own summary describes correcting elsewhere in this same diff.

No other high-signal findings. The rest of the diff — the readback/coverage clauses in PLUGIN-PHILOSOPHY.md, the org-agnosticism paragraph, the Test A/C correction blocks in extensibility-contract-smoke-tests.md, the evals-skip narrowing in MIGRATION-PLAYBOOK.md, and .claude/source-control.md's corrected pr_body_required_sections — is internally consistent, and this round's code/attribution corrections (235d024, 163404b, fa6786e) hold up against the sources they cite.

Not independently verified (author-claimed only, per this lane's rule): the pr_body_required_sections list's external sourcing from melodic-software/ci-workflows's requiredSections array (no gh api access in this lane), the commit-hash provenance attributions (eefcbb1a2/#81, fe28ffa70/#360) beyond what this sandbox's git history can confirm, and the markdownlint-cli2/lychee/check-* script outputs listed under Verification.
· branch fix/3127-setup-contract-doc-drift

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 51s —— View job


Security Review

  • Gather context
  • Invoke /review:security-review
  • Post findings

Skip gate triggered — no security-relevant surface.

Last security-reviewed head was fa6786e9134016dd4fefa46edad214a942133fee; this run covers the delta up to the current HEAD 97a92aa (git diff fa6786e9...97a92aa), which is one commit:

  • 97a92aa — "fix(docs): mark the skill-load render-timing caveat as untested"

That commit touches only .claude/source-control.md and docs/PLUGIN-PHILOSOPHY.md, both prose-only edits:

  • .claude/source-control.md — adds a note that the org's pr-issue-linkage gate exempts dependabot[bot] and no other author. This documents existing gate behavior; it doesn't change any workflow, permission, or access-control logic in this repo.
  • docs/PLUGIN-PHILOSOPHY.md — softens a claim about ${user_config.*} skill-load timing from an asserted fact to "untested here," and reinforces directing re-checks to a fresh session. Pure documentation-accuracy correction, no behavioral or code change.

Confirmed no scripts/**, plugins/**, or .github/workflows/** path is touched by this delta or by the PR as a whole (git diff origin/main...HEAD --stat — still only the same 4 markdown/doc files as prior reviews). No secrets, credentials, permissions, injection surfaces, or supply-chain pins are introduced or altered.

No security findings to report for this PR.
· branch fix/3127-setup-contract-doc-drift

Comment thread docs/MIGRATION-PLAYBOOK.md Outdated
Comment thread docs/MIGRATION-PLAYBOOK.md Outdated
@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 40s —— View job


Security Review

  • Gather context
  • Invoke /review:security-review
  • Post findings

Skip gate triggered — no security-relevant surface.

Last security-reviewed head was 97a92aa; this run covers the delta up to current HEAD 452dd11 (git diff 97a92aa..452dd11), which is one commit:

  • 452dd11 — "docs: cite the substitution premise, and drop a count adjacent to its list"

That commit touches only .claude/source-control.md and docs/PLUGIN-PHILOSOPHY.md, both pure prose edits:

  • .claude/source-control.md — adds a note that the reusable workflow should be read at the SHA the caller pins rather than its default branch, and drops "four" from "the four pr_body_required_sections values" (five keys total in the file). Documentation-accuracy correction only; no workflow, permission, or access-control logic changes.
  • docs/PLUGIN-PHILOSOPHY.md — adds a smoke-test citation (smoke-test D, Claude Code 2.1.212) for the ${user_config.*} skill-content substitution claim, and clarifies that the agent-content half of that seam is upstream spec, not a local observation. Pure prose sourcing correction, no behavioral or code change.

Confirmed no scripts/**, plugins/**, or .github/workflows/** path is touched by this delta or by the PR as a whole (git diff origin/main...HEAD --stat — still only the same 4 markdown/doc files: .claude/source-control.md, docs/MIGRATION-PLAYBOOK.md, docs/PLUGIN-PHILOSOPHY.md, docs/extensibility-contract-smoke-tests.md). No secrets, credentials, permissions, injection surfaces, or supply-chain pins are introduced or altered by this delta.

No security findings to report for this PR.
· branch fix/3127-setup-contract-doc-drift

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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


CI code review — /review:code-review

  • Gather context
  • Invoke /review:code-review skill
  • Review changed files
  • Post findings

Scope. Reviewed the full diff (gh pr diff 3139, 4 files: .claude/source-control.md, docs/MIGRATION-PLAYBOOK.md, docs/PLUGIN-PHILOSOPHY.md, docs/extensibility-contract-smoke-tests.md) at HEAD 452dd11, against this lane's correctness/maintainability criteria. Docs-only PR, no plugins/** or scripts/** path touched, matching the PR body's own claim. This is the sixth review round on this PR; I re-diffed against the last-reviewed head (fa6786e) rather than trusting prior summaries.

What changed since the last review round (fa6786e452dd11, commits 163404b, 235d024, fa6786e97a92aa452dd11): refinements to .claude/source-control.md (drops an unnecessary "four" count, adds "read the reusable at the SHA the caller pins" — confirmed accurate: .github/workflows/pr-issue-linkage.yml:30 pins @7107b34832a7b6db5d08d3b132621c599fbe5e50, and the exempt-author list there is exactly dependabot[bot], matching the doc) and to docs/PLUGIN-PHILOSOPHY.md (softens the ${user_config.*} render-timing claim from asserted fact to "untested here"). Both hold up.

Finding — posted inline, 2 locations (unresolved across six review rounds on this PR):
docs/MIGRATION-PLAYBOOK.md:1358 and :1410 each pair a --scope project install example with an unqualified "verified on Claude Code 2.1.240" claim about rerun-writes behavior. This PR's own canonical source — docs/extensibility-contract-smoke-tests.md Test C's correction — scopes that verification to a non-sensitive option at user scope, explicitly excluding project/local scope. docs/PLUGIN-PHILOSOPHY.md:274-280 (same PR) states this caveat inline correctly; the two MIGRATION-PLAYBOOK.md sites don't. This has been flagged by Codex and by this lane in every round since fa6786e was first reviewed, and remains unfixed at this HEAD — it's the same defect class (an inference read as fact past its tested conditions) the PR's own summary describes correcting elsewhere in this diff.

No other high-signal findings. The rest of the diff — .claude/source-control.md's corrected pr_body_required_sections and SHA-pin note, the readback/coverage/org-agnosticism clauses in PLUGIN-PHILOSOPHY.md, the Test A/C correction blocks and provenance note in extensibility-contract-smoke-tests.md, and the evals-skip narrowing in MIGRATION-PLAYBOOK.md — is internally consistent and its code/attribution citations check out against current source.

Not independently verified (author-claimed only, per this lane's rule against restating unverified claims as verified): the pr_body_required_sections four-entry list's sourcing from melodic-software/ci-workflows's requiredSections array (no gh api cross-repo access in this lane), the commit-hash provenance attributions (eefcbb1a2/#81, fe28ffa70/#360), and the markdownlint-cli2/lychee/check-* script outputs listed under Verification.
· branch fix/3127-setup-contract-doc-drift

Comment thread docs/MIGRATION-PLAYBOOK.md Outdated
Comment thread docs/MIGRATION-PLAYBOOK.md Outdated
@kyle-sexton
kyle-sexton force-pushed the fix/3127-setup-contract-doc-drift branch from 452dd11 to 5fbd6a9 Compare August 23, 2026 04:26
@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 23s —— View job


Security Review

  • Gather context
  • Invoke /review:security-review
  • Post findings

Skip gate triggered — no security-relevant surface.

Reviewed the full diff at HEAD 5fbd6a9e6c8c36e2bf0128e3adf1286b7e672a2b (git diff origin/main...HEAD). All four changed files remain markdown docs / doc-adjacent config, unchanged in kind from every prior round on this PR:

No scripts/**, plugins/**, or .github/workflows/** path is touched, confirming the PR body's own claim.

The delta since the last-reviewed head is one commit, docs(philosophy): restate verify-it-landed in the careful form the fleet ships, touching only docs/PLUGIN-PHILOSOPHY.md's "Setup is explicit and repeatable" section — it rewords the readback/timing prescription (keeping the ${user_config.*} skill-load citation to smoke-test D, and the hook CLAUDE_PLUGIN_OPTION_* mirror-timing note) without adding any new claim of fact. Pure prose refinement.

Checked against this lane's criteria regardless:

  • No code, no shell scripts executed by CI, no GitHub Actions workflow changes.
  • Example claude plugin install … / claude plugin uninstall … command blocks are illustrative prose only, not executed anywhere in this repo — no injection surface.
  • No secrets, tokens, or credentials are introduced or handled differently. The sensitive: true / credential-storage and CLAUDE_PLUGIN_OPTION_* env-mirror passages only correct prose describing existing, unchanged runtime behavior — they don't change how secrets or config are stored, transmitted, or logged.
  • .claude/source-control.md's pr_body_required_sections change is a documentation-config value (which PR-body headings this repo's merge gate expects) plus a note on which author the gate exempts (dependabot[bot]) — not an access-control or permission change itself.
  • No permission, authorization, or access-control logic is touched.
  • No supply-chain surface (dependency/action pins) is touched.

No security findings to report for this PR.
· branch fix/3127-setup-contract-doc-drift

@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 8s —— View job


Security Review

  • Gather context
  • Invoke /review:security-review
  • Post findings

Skip gate triggered — no security-relevant surface.

Reviewed the full PR diff (gh pr diff 3139) at HEAD c6184fdedf60a47f0088e8dcd69a3ff423702e72. All four changed files remain markdown docs / doc-adjacent config, unchanged in kind from every prior round on this PR:

No scripts/**, plugins/**, or .github/workflows/** path is touched, confirming the PR body's own claim.

The delta since the last-reviewed head (5fbd6a9) is one commit, fix(docs): carry the user-scope qualifier into the playbook's project-scope steps, touching only docs/MIGRATION-PLAYBOOK.md. It adds the user-scope caveat to the two --scope project reconfiguration steps (lines ~84-87 and ~99-106) that code-review flagged in five prior rounds — the rerun-writes claim is now qualified to its verified condition instead of paired unqualified with an untested-scope example. Pure prose correction, no behavioral or code change.

Checked against this lane's criteria regardless:

  • No code, no shell scripts executed by CI, no GitHub Actions workflow changes.
  • Example claude plugin install … / claude plugin uninstall … command blocks are illustrative prose only, not executed anywhere in this repo — no injection surface.
  • No secrets, tokens, or credentials are introduced or handled differently. The sensitive: true / credential-storage and CLAUDE_PLUGIN_OPTION_* env-mirror passages only correct prose describing existing, unchanged runtime behavior — they don't change how secrets or config are stored, transmitted, or logged.
  • .claude/source-control.md's pr_body_required_sections change is a documentation-config value (which PR-body headings this repo's merge gate expects) plus a note on which author the gate exempts (dependabot[bot]) — not an access-control or permission change itself.
  • No permission, authorization, or access-control logic is touched.
  • No supply-chain surface (dependency/action pins) is touched.

No security findings to report for this PR.
· branch fix/3127-setup-contract-doc-drift

…3173

#3173 merged part 1 of #3127 while this branch was open, correcting the
`--config` claim in the same three docs. Its version is good and in
places cleaner than this branch's, so rather than resolve eleven commits
of conflicts, the branch is rebuilt on `main`: every part-1 rewrite here
is dropped in favour of what shipped, and `extensibility-contract-
smoke-tests.md` is now untouched entirely. What remains is the five
things #3173 deliberately left open.

**The one part-1 delta that survives.** Both playbook steps pair a
`--scope project` example with the rerun-writes claim citing smoke-test C
but never stating its conditions. The 2.1.240 verification was `-s user`
with a non-sensitive option; `project`/`local` were never run. Reviewers
raised this six times against this branch's own earlier wording, and the
shipped text has the same gap. Both sites now state the scope inline,
name the shown `--scope project` as untested, and route the reader to a
readback — at the location step 3 records, attributed rather than
asserted, since that record generalises from `--scope local` runs alone.

**Part 2 — the setup contract's read-back clause.** Stated as a property
of the setup SKILL, not the `apply` verb: five plugins ship a setup skill
with no `apply`, so an `apply`-scoped clause would be false on arrival.
Carries the false-failure hazard the merged setup skills already
describe — the write can succeed while the running session reports the
old value, and calling that a failed write is the error. Both timing
mechanisms are marked untested, with what smoke-tests B and D actually
recorded stated rather than implied. Part 2's coverage half is already on
`main` via #3115 and is not re-landed.

**Part 4 — evals.** The hook-plugin skip rested on "no model-invoked
skill", false for a hook plugin shipping a setup skill. Narrowed to what
its rationale supports, with the gate recorded as operative and the
residual pure-reference conflict routed to #3135.

**Part 5 — org-agnosticism** gets a named home, declared a normative
target whose enforcement reaches a strict subset, naming what is ungated
rather than implying coverage. #3136.

**Part 3 — `.claude/source-control.md`** declares the sections the gate
actually enforces, read from the reusable at the pinned SHA.

Part 6 needs no doc change: the check-only carve-out already names the
`userConfig` exemption, so `dometrain` and `miro` conform. The real gap
is validator-side and is #3137.

Refs #3127

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@kyle-sexton
kyle-sexton force-pushed the fix/3127-setup-contract-doc-drift branch from 372ac4a to 2f8f7c1 Compare August 23, 2026 06:54
@claude

claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 58s —— View job


Security Review

  • Gather context
  • Invoke /review:security-review
  • Post findings

Skip gate triggered — no security-relevant surface.

Reviewed the full PR diff (gh pr diff 3139) at HEAD 2f8f7c1. All three changed files remain markdown docs / doc-adjacent config:

No scripts/**, plugins/**, or .github/workflows/** path is touched, confirming the PR body's own claim. This head reflects the rebase described in the PR body ("Rebased onto #3115 after it merged") — the tracked history changed (2f8f7c1/32444dc replace the previously-reviewed c6184fded lineage), but the diff content is the same class of change reviewed in every prior round on this PR: corrected prose about --config reconfiguration scope/conditions, the setup-contract readback/coverage/org-agnosticism clauses, and .claude/source-control.md's pr_body_required_sections restatement.

Checked against this lane's criteria regardless:

  • No code, no shell scripts executed by CI, no GitHub Actions workflow changes.
  • Example claude plugin install … / claude plugin uninstall … command blocks are illustrative prose only, not executed anywhere in this repo — no injection surface.
  • No secrets, tokens, or credentials are introduced or handled differently. The sensitive: true / credential-storage and CLAUDE_PLUGIN_OPTION_* env-mirror passages only correct prose describing existing, unchanged runtime behavior — they don't change how secrets or config are stored, transmitted, or logged.
  • .claude/source-control.md's pr_body_required_sections change is a documentation-config value (which PR-body headings this repo's merge gate expects) plus a note on which author the gate exempts (dependabot[bot]) and to read the reusable workflow at the pinned SHA — not an access-control or permission change itself.
  • No permission, authorization, or access-control logic is touched.
  • No supply-chain surface (dependency/action pins) is touched.

No security findings to report for this PR.
· branch fix/3127-setup-contract-doc-drift

@kyle-sexton

Copy link
Copy Markdown
Contributor Author

No description provided.

@kyle-sexton
kyle-sexton merged commit ef4d539 into main Aug 23, 2026
52 checks passed
@kyle-sexton
kyle-sexton deleted the fix/3127-setup-contract-doc-drift branch August 23, 2026 07:17
kyle-sexton added a commit that referenced this pull request Aug 23, 2026
Closes #3182

## Summary

Post-merge verification of #3139 (merged as `ef4d53959`) found three
defects in the prose it shipped, each the same class that PR existed to
correct: **a claim or rule reaching past what backs it.** They were
filed rather than quietly patched because the content was already on
`main`.

This fixes those three plus the smaller items #3182 lists, in 46 added
lines across three files.

## Fix

**1. The fetch prohibition's stated cause did not entail its stated
rule.** `PLUGIN-PHILOSOPHY.md` sanctioned "a documentation URL", then
condemned any skill instructed to fetch it as having "made the publisher
a runtime dependency". Fetching `code.claude.com` creates no such
dependency, and a practice already shipping in the tree was condemned by
it.

The prohibition now turns on the target's owner and reaches
publisher-owned targets only. For those targets, distinguishing an
instruction to fetch from a citation offered for a reader is genuinely
hard, and the statement says so rather than implying it has been settled
— `plugins/architecture/reference/topic-docs.md` is named as the open
case, and no ticket owns it (#3136 is enforcement-site consolidation,
not this).

**2. The `evidence-bearing` bullet was unsatisfiable as worded.** It
required setup to report "the effective value it observed", while the
same section pins *effective value* to running-session behaviour and
directs verification to a fresh session. A same-session run can only
observe the **stored** value. One word: `effective` → `stored`.

**3. A narrowing presented as a faithful clarification.** The
hook-plugin eval skip stated its rationale as "no model-facing skill at
all" where the prior text said "no model-**invoked** skill". Neither
works: a `setup` skill sets `disable-model-invocation: true`, so either
phrasing is satisfied by a plugin that ships one — admitting as skips
exactly the plugins the rest of the rule excludes. The defect was
stating the condition in terms of invocation mode at all. It now reads
**"no skill carrying a judgment-bearing contract"**, the test the
warrant rule two sentences above already uses. Outcome unchanged: 19
hook plugins ship a setup skill, all 19 carry setup evals.

**Smaller items.** Both paired reconfiguration sites in
`MIGRATION-PLAYBOOK.md` now name the readback location and agree in
substance, including the sensitive-value limit — an asymmetry between
them would have sent a reader reconfiguring a sensitive option at
project scope to look in user settings, find nothing, and report a
failed write, which is the false failure `PLUGIN-PHILOSOPHY.md` exists
to prevent. Their provenance cites seam 1, which documents both halves,
rather than smoke-test C, which explicitly disclaims covering a
sensitive option. The "step 3 above" cross-reference — which pointed
from inside Reintegration's step 1 at Reintegration's own step 3, about
verify-before-retiring — is replaced by a direct citation of seam 1. The
`github.test.sh` sweep's wider/narrower axes are named, and "both steps
of the same job" is corrected to "each running in its own step". The
workflow header's gate description is corrected: the pinned reusable
requires four sections, not a closing keyword plus `## Related`.

## Verification

Local gates at the final commit: `markdownlint-cli2` 0 issues;
`check-contract-clause-coverage.py` exit 0; `lychee --offline` 0 errors
across 103 unique links; `zizmor` no findings. The workflow change is
comment-only, confirmed by diff.

Six fresh-context verification passes, each given the bounded criteria
plus an unbounded criterion instructing it to hunt for claims reaching
past their evidence anywhere in the touched paragraphs. **All six
returned FAIL**, and each round's fixes introduced at least one new
instance of the defect being repaired.

The sixth pass found two, both in the single paragraph this PR had to
*write* rather than cut, and both repairs were deletions: a tracker-wide
"no ticket owns that question" that the tracker contradicts (#432
carries an accepted ruling on it, and
`scripts/skill-portability-tokens.txt` stages a lint class blocked on
that ruling), and a hedge that denied the statement its own preceding
clause had just made. Every deletion from the prior round verified clean
against the tree.

Reviewing where the findings came from settled the approach. Items 2 and
3 were clean from round three onward; essentially every finding from
round two on landed in material added *beyond* what #3182 asked for — an
enumeration of nonconforming instances, a paragraph grounding the
prohibition against the tree, a rewritten security rationale, a
sensitive-value carve-out. Each was written to close the previous
round's finding and opened one or two of its own. The final revision
deletes those elaborations rather than repairing them again, which is
why the diff is 46 lines rather than the 2,926 it peaked at.

Twenty-five instances of the defect class were found across the five
rounds. One was caught by the author re-reading their own writing, four
by the review bots, and the rest by fresh-context verification. **None
by self-review.**

Two things generalise. A verifier is bounded by its criteria, so a
defect nobody names survives any number of green passes — every round's
findings came from the unbounded criterion, not the checklist. And
under-claiming is not the safe direction: round four's findings were
mostly repairs to what round three's *removals* broke. Both directions
are the same failure to say exactly what the evidence supports.

One pre-existing defect is deliberately left alone and filed as #3184:
the workflow header's security rationale ("reads PR body metadata from
the event payload only") is false against the pinned reusable, which
live-refetches. It is outside #3182's scope, the `zizmor` suppression it
backs is independently sound, and three separate rewrites of that
comment block each introduced a new inaccuracy.

## Related

- #3182 — the issue this closes; its line references were verified
against `origin/main` at `ef4d53959`.
- #3139 — introduced this prose; its own post-merge verification found
these defects and filed them rather than patching silently.
- #3184 — the workflow-comment defects this PR deliberately did not
rewrite.
- #3173 — shipped part 1 into the same files; item 3's prior wording is
its text.
- #3136 — enforcement-site consolidation; it does not own the
cite-versus-fetch question, and this PR no longer claims it does.
- #3115 / #3116 / #3148 — the rest of the campaign whose doc half #3139
was.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
kyle-sexton added a commit that referenced this pull request Aug 23, 2026
Closes #3136

## Summary

Org-agnosticism was enforced by two independent token sets in the same
`plugin-gate` job, plus a stricter autonomy sweep, none of which shared
data. The doctrine also named classes the gates did not check.

## Fix

`scripts/org-agnosticism-tokens.txt` is the single token file.
`validate-plugin-contracts.mjs` reads `fleet-id`, `fleet-key`, `setup`,
and `autonomy` from it. `plugins/github/github.test.sh` stays the
documented `github` extension (melodic/medley/pulumi plus github-iac);
the validator fails if that regex drifts. Enforcement is deliberately
those classes — agent content, schema files, and a fleet-wide bare
organization name stay ungated. `docs/PLUGIN-PHILOSOPHY.md` now states
that scope. The staged portability-lint publisher class is pointed at
this file so it cannot become a third set.

## Verification

- `node scripts/validate-plugin-contracts.mjs` — 51 setup skills and
2912 plugin files checked
- `bash plugins/github/github.test.sh` — PASS=36 FAIL=0
- `scripts/check-changelog-parity.sh --check-bump origin/main` — pass

## Related

Refs #3127, #3139, #3115, #3182

---------

Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
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.

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

1 participant