From 20f3396fbb8884ea81c25ae218f3e3db0020e3be Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 1 Sep 2026 10:34:51 -0400 Subject: [PATCH 1/5] fix: converge every gitignore recommendation on the recursive overlay line Phase 1a of the customization-consistency program: every surface that recommends (or, for source-control, appends) a consumer .gitignore line for personal overlays now uses config-cascade's mandated recursive form `.claude/**/*.local.*`. Narrow spellings fixed: `.claude/*.local.*` (codebase-health, mutation-testing, source-control), `.claude/ecosystems/*.local.*` (toolchain, ecosystem-commands), `.claude/ai-briefing/**/*.local.*` and `.claude/autonomy/**/*.local.*`. config-cascade's conformance narrative is updated in the same change: the "Overlay spelling drift" section now records the convergence and the two deliberate exceptions (standards-dir `*.local.md`, work-items' repo-root line per ADR 0015). Documented negative examples, changelog history, and layer-path descriptors deliberately keep the old spellings. Gates: markdownlint clean on touched files, both evals.json parse, skill-quality check-skill PASS on all six touched setup skills. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_014uBXt1tMEReShbpG5gsFUd --- docs/conventions/config-cascade/README.md | 28 ++++++++++--------- docs/conventions/ecosystem-commands/README.md | 2 +- plugins/ai-briefing/skills/setup/SKILL.md | 6 ++-- plugins/autonomy/README.md | 2 +- plugins/autonomy/skills/setup/SKILL.md | 2 +- plugins/codebase-health/README.md | 2 +- plugins/codebase-health/skills/setup/SKILL.md | 4 +-- .../skills/setup/evals/evals.json | 4 +-- .../mutation-testing/skills/setup/SKILL.md | 4 +-- plugins/source-control/README.md | 2 +- .../reference/config-resolution.md | 2 +- plugins/source-control/skills/setup/SKILL.md | 4 +-- .../skills/setup/evals/evals.json | 10 +++---- .../setup/reference/apply-convention.md | 6 ++-- .../toolchain/reference/resolution-ladder.md | 2 +- plugins/toolchain/skills/setup/SKILL.md | 4 +-- 16 files changed, 43 insertions(+), 41 deletions(-) diff --git a/docs/conventions/config-cascade/README.md b/docs/conventions/config-cascade/README.md index d775d3059..b41e304a9 100644 --- a/docs/conventions/config-cascade/README.md +++ b/docs/conventions/config-cascade/README.md @@ -113,9 +113,8 @@ That is the whole convention — **one line, recursive form, for every surface** zero or more directories, so this single rule covers a flat `.claude/source-control.local.md`, a one-deep `.claude/ecosystems/python.local.yaml`, and a profiled `.claude/ai-briefing//x.local.md` alike, while leaving team files tracked. The narrower -`.claude/*.local.*` is what several surfaces currently recommend and it silently fails to ignore any -folder-form overlay; recommend the recursive form instead, and never ask a consumer for two lines -where one is exact. +`.claude/*.local.*` silently fails to ignore any folder-form overlay; recommend the recursive form +only, and never ask a consumer for two lines where one is exact. **No plugin writes the consumer's `.gitignore`.** A setup skill recommends the line and leaves the edit to the consumer; their ignore file is their artifact. @@ -189,8 +188,8 @@ surface, or amend this contract) is a separate human-gated decision. **Undeclared** — divergence with no recorded rationale: -- **`ai-briefing` advertises an overlay layer it does not implement.** Its setup recommends a - `.claude/ai-briefing/**/*.local.*` gitignore line, but no read path resolves a `.local.*` file and +- **`ai-briefing` advertises an overlay layer it does not implement.** Its setup recommends the + recursive `.claude/**/*.local.*` gitignore line, but no read path resolves a `.local.*` file and no file defines what one would do. Its documented resolution covers profile *selection* only, never layer precedence. This is the only surface telling consumers to gitignore a layer that has no effect. @@ -228,11 +227,14 @@ sweep — and each migration updates its own row in the same change. ### Overlay spelling drift -The fleet currently ships four spellings — `.claude/*.local.*`, `.claude/ecosystems/*.local.*`, -`.claude/autonomy/**/*.local.*`, and a bare `*.local.md` inside a setup-owned -`/.gitignore`. Each is narrowly correct for its own surface, and collectively they -defeat the one-line promise: a consumer running three plugins is asked for three lines, and the two -non-recursive spellings would silently miss a nested overlay if their surface ever grew a folder. -The recursive line above subsumes all four. Converging each surface's recommendation on it is a -per-surface change tracked by the rows above, not a rule this contract can retroactively impose on -config already written into consumer repositories. +Every setup surface now recommends (or, for `source-control` and `work-items`, appends) the +recursive line above. The narrow spellings the fleet used to ship — `.claude/*.local.*`, +`.claude/ecosystems/*.local.*`, `.claude/autonomy/**/*.local.*` — were each narrowly correct for +their own surface but collectively defeated the one-line promise: a consumer running three plugins +was asked for three lines, and the non-recursive spellings would silently miss a nested overlay if +their surface ever grew a folder. Two deliberate exceptions remain: the bare `*.local.md` inside +the setup-owned `/.gitignore` (a dedicated ignore file scoped to the standards +root, not the consumer's `.gitignore`), and `work-items`' repo-root +`.work-item-tracker.local.json` line (ADR 0015; outside `.claude/` entirely). This contract does +not retroactively rewrite narrow lines already written into consumer repositories — the recursive +line simply supersedes them where both exist. diff --git a/docs/conventions/ecosystem-commands/README.md b/docs/conventions/ecosystem-commands/README.md index a54cb1435..5cfabea82 100644 --- a/docs/conventions/ecosystem-commands/README.md +++ b/docs/conventions/ecosystem-commands/README.md @@ -55,7 +55,7 @@ Resolution per ecosystem, additive per key: **user-global → team file → loca layer overrides earlier layers key-by-key and never replaces the base file wholesale (the same resolution the extensibility contract specifies for tracked rich config, and the same vendor-defaults-plus-drop-in-overrides shape the UAPI configuration-files specification -standardizes). Recommended consumer `.gitignore` line: `.claude/ecosystems/*.local.*`. +standardizes). Recommended consumer `.gitignore` line: the recursive `.claude/**/*.local.*`. The drop-in folder form is deliberate: each ecosystem is an independent slice with its own lifecycle — adding one is a new file, retiring one is a deletion, and a toolchain change is a single-file diff. diff --git a/plugins/ai-briefing/skills/setup/SKILL.md b/plugins/ai-briefing/skills/setup/SKILL.md index 09d92a2ba..fe420cb02 100644 --- a/plugins/ai-briefing/skills/setup/SKILL.md +++ b/plugins/ai-briefing/skills/setup/SKILL.md @@ -103,9 +103,9 @@ nothing and reports "already configured". install an X API provider. Note the current X access restriction and link the authoritative terms: . 2. **Offer optional overlays.** Offer `audience.md` and declarative `brand.json`, creating only - the files the consumer requests. Keep local logo assets beside `brand.json`. Recommend a - project ignore convention such as `.claude/ai-briefing/**/*.local.*` for personal overlays - while keeping shared profile files tracked. + the files the consumer requests. Keep local logo assets beside `brand.json`. Recommend the + recursive `.claude/**/*.local.*` ignore line for personal overlays while keeping shared + profile files tracked. 3. **`apply install-build-deps` installs the optional build toolchain.** Parse the subaction before invoking a shell and never interpolate raw arguments into a command. Without it, skip this step and change no existing runtime. With it, build and validate a temporary diff --git a/plugins/autonomy/README.md b/plugins/autonomy/README.md index 754575dc9..5d1de039e 100644 --- a/plugins/autonomy/README.md +++ b/plugins/autonomy/README.md @@ -182,7 +182,7 @@ The payload is a fixed vocabulary, never the sentinel token, marker path, cwd, o Setup writes tracked config to `.claude/autonomy/` in the consuming repo (concern-named. The config outlives any plugin restructure). Personal overlays follow the marketplace overlay -convention: `.claude/autonomy/**/*.local.*` stays gitignored; layers resolve per the +convention: the recursive `.claude/**/*.local.*` line keeps them gitignored; layers resolve per the binding-seam ladder: user-global → org binding (when pointed) → project → local overlay, additively. diff --git a/plugins/autonomy/skills/setup/SKILL.md b/plugins/autonomy/skills/setup/SKILL.md index de2c5d9de..aa7e876b6 100644 --- a/plugins/autonomy/skills/setup/SKILL.md +++ b/plugins/autonomy/skills/setup/SKILL.md @@ -76,7 +76,7 @@ ask and offer to persist; otherwise → safe free-tier default). The same file name is the shape at EVERY layer: the user-global layer is `~/.claude/autonomy/binding.json`, the project layer `.claude/autonomy/binding.json`, and each layer's personal overlay `binding.local.json` beside it. The project file is tracked -(team-shared); recommend the consumer `.gitignore` line: `.claude/autonomy/**/*.local.*`. +(team-shared); recommend the recursive consumer `.gitignore` line: `.claude/**/*.local.*`. Layers resolve per the binding-seam ladder. User-global → org binding (when pointed) → project → local overlay. Additively. Capability slices (like telemetry below) add their sections ADDITIVELY under their slice name: a binding without a slice's section is valid diff --git a/plugins/codebase-health/README.md b/plugins/codebase-health/README.md index 70e70d333..8104fee13 100644 --- a/plugins/codebase-health/README.md +++ b/plugins/codebase-health/README.md @@ -62,7 +62,7 @@ hardcodes a repo's layout. /codebase-health:setup apply # interview + write .claude/codebase-health.md (re-runnable) ``` -Add `.claude/*.local.*` to your `.gitignore` so personal overlays stay out of version control while +Add the recursive `.claude/**/*.local.*` line to your `.gitignore` so personal overlays stay out of version control while team config stays tracked. ## Consumer conventions diff --git a/plugins/codebase-health/skills/setup/SKILL.md b/plugins/codebase-health/skills/setup/SKILL.md index 0e2d81af1..a98e6296b 100644 --- a/plugins/codebase-health/skills/setup/SKILL.md +++ b/plugins/codebase-health/skills/setup/SKILL.md @@ -91,8 +91,8 @@ the repo make the values unambiguous; ask only where a dimension's targets genui parse and name real paths, and `git check-ignore -v .claude/codebase-health.md` confirms it is tracked, not ignored (surface the matching pattern and offer to fix `.gitignore` before reporting success). Then **offer the overlay convention**: personal overrides go in - `.claude/codebase-health.local.md`; recommend the consumer add `.claude/*.local.*` to `.gitignore` - if not already covered. A user-global base at `~/.claude/codebase-health.md` is also honored. Layers + `.claude/codebase-health.local.md`; recommend the consumer add the recursive `.claude/**/*.local.*` + line to `.gitignore` if not already covered. A user-global base at `~/.claude/codebase-health.md` is also honored. Layers resolve user-global → team → local overlay, additively. Re-running `apply` after everything passes changes nothing and reports "already configured". diff --git a/plugins/codebase-health/skills/setup/evals/evals.json b/plugins/codebase-health/skills/setup/evals/evals.json index e1285d3c7..45a19266d 100644 --- a/plugins/codebase-health/skills/setup/evals/evals.json +++ b/plugins/codebase-health/skills/setup/evals/evals.json @@ -29,11 +29,11 @@ "id": 3, "name": "writes-tracked-config-not-plugin-dir", "prompt": "/codebase-health:setup apply\n\nJust write a sensible default config for this repo.", - "expected_output": "Materializes the config at the consumer's tracked .claude/codebase-health.md, confirms it is tracked (not gitignored), and offers the .claude/*.local.* overlay/gitignore convention. It never writes configuration into the plugin directory or a plugin data directory.", + "expected_output": "Materializes the config at the consumer's tracked .claude/codebase-health.md, confirms it is tracked (not gitignored), and offers the recursive .claude/**/*.local.* overlay/gitignore convention. It never writes configuration into the plugin directory or a plugin data directory.", "files": [], "expectations": [ "Writes the config to the consumer's tracked .claude/codebase-health.md", - "Offers the .claude/*.local.* personal-overlay and gitignore convention", + "Offers the recursive .claude/**/*.local.* personal-overlay and gitignore convention", "Does not write configuration into the plugin directory or plugin data directory" ] } diff --git a/plugins/mutation-testing/skills/setup/SKILL.md b/plugins/mutation-testing/skills/setup/SKILL.md index a9446f645..c2bdca399 100644 --- a/plugins/mutation-testing/skills/setup/SKILL.md +++ b/plugins/mutation-testing/skills/setup/SKILL.md @@ -130,8 +130,8 @@ unambiguous; ask only where the answer is genuinely the user's. `git add`; never commit on the user's behalf. 10. **Verify after remediation.** Re-run the `check` probes on what was written, including both halves of probe 9, tracked *and* not-ignored, then offer the overlay convention: personal - config overrides in `.claude/mutation-testing.local.md`, and recommend `.claude/*.local.*` in - `.gitignore` if not already covered. State plainly that the same overlay pattern does **not** + config overrides in `.claude/mutation-testing.local.md`, and recommend the recursive + `.claude/**/*.local.*` line in `.gitignore` if not already covered. State plainly that the same overlay pattern does **not** give personal suppressions effect: an arid entry in a `.local.md` is a draft until promoted to the team layer. diff --git a/plugins/source-control/README.md b/plugins/source-control/README.md index b141bad0c..1384935ea 100644 --- a/plugins/source-control/README.md +++ b/plugins/source-control/README.md @@ -259,7 +259,7 @@ repo's owner. The commit-subject / PR-title convention is separate: run **`/source-control:setup`** to interview your repo and write the `source-control.md` config. Idempotent and safe to re-run. Add -`.claude/*.local.*` to your `.gitignore` so the personal overlay layer stays +the recursive `.claude/**/*.local.*` line to your `.gitignore` so the personal overlay layer stays out of version control (no skill here edits your `.gitignore`). Remaining optional environment variables: diff --git a/plugins/source-control/reference/config-resolution.md b/plugins/source-control/reference/config-resolution.md index 950ec9d12..581f3d24d 100644 --- a/plugins/source-control/reference/config-resolution.md +++ b/plugins/source-control/reference/config-resolution.md @@ -312,7 +312,7 @@ normalization, and the resolver (`lib/resolve-convention-pattern.sh`) live in th The overlay convention needs one line in the consuming repo: ```gitignore -.claude/*.local.* +.claude/**/*.local.* ``` No skill in this plugin writes the consumer's root `.gitignore` — `/source-control:setup` recommends diff --git a/plugins/source-control/skills/setup/SKILL.md b/plugins/source-control/skills/setup/SKILL.md index 2a17a9c35..491aa5ad6 100644 --- a/plugins/source-control/skills/setup/SKILL.md +++ b/plugins/source-control/skills/setup/SKILL.md @@ -73,7 +73,7 @@ Per-layer verdicts: - **Team** (`REPO_ROOT/.claude/source-control.md`): present → PASS. **FAIL** when excluded by `.gitignore`. Teammates would never receive the shared convention; report the matching rule. Absent → INFO, remediable by `apply`. -- **Local overlay ignore rule** (`.claude/*.local.*`, covering +- **Local overlay ignore rule** (the recursive `.claude/**/*.local.*`, covering `REPO_ROOT/.claude/source-control.local.md`): probe the ignore rule whether or not the overlay file exists. The rule's job is to be in place **before** the first overlay is written; conditioning the probe on the file already existing @@ -334,7 +334,7 @@ Skill-behavior failure patterns hit in real runs. Add to this section when new o - Enforce the convention at commit time, a project's own `commit-msg` hook (when one exists) remains the authoritative gate; this config only tells the plugin's skills what shape to draft and pre-check against. -- Write the consumer's `.gitignore`, except the one `.claude/*.local.*` line at +- Write the consumer's `.gitignore`, except the one recursive `.claude/**/*.local.*` line at team-layer bind / `apply`. That line must exist before any overlay is written, so `apply` appends it when missing and announces the edit. Everything else in `.gitignore` stays the consumer's. diff --git a/plugins/source-control/skills/setup/evals/evals.json b/plugins/source-control/skills/setup/evals/evals.json index 93524c618..3c001b04a 100644 --- a/plugins/source-control/skills/setup/evals/evals.json +++ b/plugins/source-control/skills/setup/evals/evals.json @@ -93,14 +93,14 @@ "id": 8, "name": "routes-personal-request-to-local-overlay-not-team-file", "prompt": "/source-control:setup apply\n\nI personally want ticket-prefixed subjects like WEB-123: fix the thing on this repo, but don't change what the team uses.", - "expected_output": "Writes .claude/source-control.local.md, not the tracked team .claude/source-control.md, and says which layer it picked before writing. Carries only the keys that differ from the layers below rather than restating the whole config. Verifies the overlay is gitignored — an ignore match is the success condition here, the inverse of the team file's check — never runs git add on it, and if it is not ignored, surfaces the .claude/*.local.* line for the consumer to add rather than editing their .gitignore. Closes by reporting the resulting effective merge, not only the keys written.", + "expected_output": "Writes .claude/source-control.local.md, not the tracked team .claude/source-control.md, and says which layer it picked before writing. Carries only the keys that differ from the layers below rather than restating the whole config. Verifies the overlay is gitignored — an ignore match is the success condition here, the inverse of the team file's check — never runs git add on it, and if it is not ignored, surfaces the recursive .claude/**/*.local.* line for the consumer to add rather than editing their .gitignore. Closes by reporting the resulting effective merge, not only the keys written.", "files": [".claude/source-control.md"], "expectations": [ "Writes the personal overlay path, leaving the tracked team file unmodified", "States which layer it selected before writing", "Writes only the differing keys instead of restating every key from the team layer", "Treats a git check-ignore match on the overlay as success, and never stages the overlay with git add", - "When the overlay is not ignored, recommends the .claude/*.local.* gitignore line instead of editing the consumer's .gitignore", + "When the overlay is not ignored, recommends the recursive .claude/**/*.local.* gitignore line instead of editing the consumer's .gitignore", "Reports the resulting effective merge across layers rather than only the keys just written" ] }, @@ -236,13 +236,13 @@ { "id": 19, "name": "check-reports-missing-overlay-ignore-without-overlay-file", - "prompt": "/source-control:setup check\n\nThe repo has a tracked team .claude/source-control.md and no .claude/source-control.local.md. .gitignore does not mention .claude/*.local.*.", - "expected_output": "Reports FAIL on the local-overlay ignore rule even though no overlay file exists: the rule must be in place before the first overlay is written. Does not classify the missing rule as INFO/pass. Names apply as the remediation, which writes .claude/*.local.* at team-layer bind.", + "prompt": "/source-control:setup check\n\nThe repo has a tracked team .claude/source-control.md and no .claude/source-control.local.md. .gitignore does not mention .claude/**/*.local.*.", + "expected_output": "Reports FAIL on the local-overlay ignore rule even though no overlay file exists: the rule must be in place before the first overlay is written. Does not classify the missing rule as INFO/pass. Names apply as the remediation, which writes the recursive .claude/**/*.local.* line at team-layer bind.", "files": [], "expectations": [ "Probes the ignore rule without requiring the overlay file to exist", "Counts only a repository .gitignore match, not info/exclude or core.excludesFile", - "Missing .claude/*.local.* rule is FAIL, not INFO", + "Missing .claude/**/*.local.* rule is FAIL, not INFO", "Remediation is apply writing the ignore line at team-layer bind" ] } diff --git a/plugins/source-control/skills/setup/reference/apply-convention.md b/plugins/source-control/skills/setup/reference/apply-convention.md index 4591ec304..79de5f898 100644 --- a/plugins/source-control/skills/setup/reference/apply-convention.md +++ b/plugins/source-control/skills/setup/reference/apply-convention.md @@ -257,7 +257,7 @@ With no argument in an interactive session, run the interview: bind time, not to `layer=local`. If `git check-ignore --no-index -v -- .claude/source-control.local.md` reports no match **from a repository `.gitignore`** (ignore `$GIT_DIR/info/exclude` and `core.excludesFile`), - append `.claude/*.local.*` to the consumer `.gitignore`, announce the edit, + append the recursive `.claude/**/*.local.*` line to the consumer `.gitignore`, announce the edit, and stage that line with the team file. For `layer=team`, run these as one Bash tool call so `REPO_ROOT` only needs resolving once: @@ -315,7 +315,7 @@ With no argument in an interactive session, run the interview: echo "FAIL: $OVERLAY is tracked; untrack it with: git rm --cached $OVERLAY" >&2 exit 1 else - echo "FAIL: no ignore rule matches $OVERLAY; add .claude/*.local.* to .gitignore" >&2 + echo "FAIL: no ignore rule matches $OVERLAY; add .claude/**/*.local.* to .gitignore" >&2 exit 1 fi ``` @@ -327,7 +327,7 @@ With no argument in an interactive session, run the interview: proceed to step 7. For the team guard (`IGNORE_MATCH` reported), tell the user the matching `.gitignore` pattern and ask them to either fix `.gitignore` so `.claude/source-control.md` is no longer excluded, or persist the convention to a different layer. For the `layer=local` guard, - surface the failure's own remediation — the `.claude/*.local.*` ignore line for a missing rule, or + surface the failure's own remediation — the recursive `.claude/**/*.local.*` ignore line for a missing rule, or `git rm --cached` for an already-tracked overlay — so the personal overlay does not linger in a shareable state. Re-run this step once the state is fixed. diff --git a/plugins/toolchain/reference/resolution-ladder.md b/plugins/toolchain/reference/resolution-ladder.md index 28afba9a9..1246c6127 100644 --- a/plugins/toolchain/reference/resolution-ladder.md +++ b/plugins/toolchain/reference/resolution-ladder.md @@ -60,4 +60,4 @@ defaults. `/toolchain:setup` is the re-runnable writer for rungs 2 and 3 — it interviews, infers, and writes `.claude/ecosystems/*.yaml` into the consuming repo. Recommend the consumer add -`.claude/ecosystems/*.local.*` to `.gitignore`. +the recursive `.claude/**/*.local.*` line to `.gitignore`. diff --git a/plugins/toolchain/skills/setup/SKILL.md b/plugins/toolchain/skills/setup/SKILL.md index 9808b999c..0c581cfb2 100644 --- a/plugins/toolchain/skills/setup/SKILL.md +++ b/plugins/toolchain/skills/setup/SKILL.md @@ -116,8 +116,8 @@ the contract schema catches typos the tolerant reader would otherwise ignore. Personal per-key overrides go in `.claude/ecosystems/.local.yaml`; a user-global base at `~/.claude/ecosystems/.yaml` is also honored. Layers resolve -user-global → team → local overlay, additively per key. Recommend the consumer add -`.claude/ecosystems/*.local.*` to `.gitignore` if not already covered. +user-global → team → local overlay, additively per key. Recommend the consumer add the recursive +`.claude/**/*.local.*` line to `.gitignore` if not already covered. ## Output From 14ee4b813cb34a0ca9626b5a42acae189148b49a Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 1 Sep 2026 11:18:10 -0400 Subject: [PATCH 2/5] fix: verify tracked setup writes with the check-ignore + ls-files pair MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1c of the customization-consistency program: every setup that writes tracked consumer files now verifies with both probes — git check-ignore -v (not excluded by .gitignore) AND git ls-files --error-unmatch (actually tracked) — the pair bugs/improvement/ mutation-testing already used. check-ignore alone cannot distinguish tracked from written-but-untracked, the guaranteed state right after a fresh write. INVENTORY §6.4 names fixed: codebase-health, code-tidying, toolchain, repo-fleet-hygiene. Sweep additions (same gap): claude-config, work-items, github, songwriting, discovery, verification, planning, review, ai-slop. Excluded: source-control (stronger staged-status probes in its apply spoke), the three exemplars, and overlay-only check-ignore uses per the class definition. work-items trimmed to stay under the 500-line cap. Gates: markdownlint clean, skill-quality check-skill PASS on all 13. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_014uBXt1tMEReShbpG5gsFUd --- plugins/ai-slop/skills/setup/SKILL.md | 6 ++++- plugins/claude-config/skills/setup/SKILL.md | 4 +++- plugins/code-tidying/skills/setup/SKILL.md | 22 ++++++++++++------- plugins/codebase-health/skills/setup/SKILL.md | 9 +++++--- plugins/discovery/skills/setup/SKILL.md | 5 ++++- plugins/github/skills/setup/SKILL.md | 6 ++++- plugins/planning/skills/setup/SKILL.md | 9 +++++++- .../repo-fleet-hygiene/skills/setup/SKILL.md | 13 +++++++++++ plugins/review/skills/setup/SKILL.md | 4 ++++ plugins/songwriting/skills/setup/SKILL.md | 5 ++++- plugins/toolchain/skills/setup/SKILL.md | 13 +++++++---- plugins/verification/skills/setup/SKILL.md | 5 ++++- plugins/work-items/skills/setup/SKILL.md | 7 +++--- 13 files changed, 83 insertions(+), 25 deletions(-) diff --git a/plugins/ai-slop/skills/setup/SKILL.md b/plugins/ai-slop/skills/setup/SKILL.md index fc887731f..716e304e3 100644 --- a/plugins/ai-slop/skills/setup/SKILL.md +++ b/plugins/ai-slop/skills/setup/SKILL.md @@ -44,4 +44,8 @@ Everything `check` does, then the confirmed write: 2. Write ONLY the team layer (`.claude/ai-slop.json`), showing the diff and getting explicit confirmation before writing. Never write the user-global or overlay layers on the user's behalf; name them as options the user edits themselves. -3. Re-run `--show-config` and report the new effective state. +3. Re-run `--show-config` and report the new effective state. Then run the tracked-file pair on + the written team file: `git check-ignore -v .claude/ai-slop.json` reports no match (a match is + FAIL with the pattern) AND `git ls-files --error-unmatch .claude/ai-slop.json` exits 0 + (non-zero right after a fresh write means "written but untracked: commit it to share with the + team", never success). diff --git a/plugins/claude-config/skills/setup/SKILL.md b/plugins/claude-config/skills/setup/SKILL.md index b8894e573..bce3cecf6 100644 --- a/plugins/claude-config/skills/setup/SKILL.md +++ b/plugins/claude-config/skills/setup/SKILL.md @@ -76,7 +76,9 @@ nested worktree the skill was invoked from, then report one row per layer. The s tracked/ignored question has opposite correct answers per layer, so verify each on its own terms: - **user-global** `~/.claude/audit-pass.md`: outside the worktree; no git command applies. INFO only. -- **team** `.claude/audit-pass.md`: must be tracked. Untracked while present is a hard STOP: +- **team** `.claude/audit-pass.md`: must be tracked, probed as the pair — + `git check-ignore -v` reports no match (a match is FAIL with the pattern) AND + `git ls-files --error-unmatch` exits 0. Untracked while present is a hard STOP: teammates never receive the shared suppressions. - **local overlay** `.claude/audit-pass.local.md`: must be gitignored and never staged. Staged or tracked is a FAIL: a personal deviation can reach team history. diff --git a/plugins/code-tidying/skills/setup/SKILL.md b/plugins/code-tidying/skills/setup/SKILL.md index 0718056b7..c290abcef 100644 --- a/plugins/code-tidying/skills/setup/SKILL.md +++ b/plugins/code-tidying/skills/setup/SKILL.md @@ -58,10 +58,13 @@ FAIL. Modify nothing, and do NOT run a tidy sweep. That is `/code-tidying:tidy`. headings. Unkeyed entries name no language to replace. Framing prose above the first `###` is fine. 3. **No unreplaced placeholders**, a lane still containing a template `` resolves to a broken scope glob or watch-for pattern; FAIL, naming the file and the leftover token. -4. **Tracked, not ignored**. Run `git check-ignore -v ` per lane file. A non-empty result means a - `.gitignore` pattern excludes that lane; these lanes are team-shared and take effect only when - committed, so an ignored lane is FAIL with the matching pattern in the remediation line (a directory - can be tracked while a pattern excludes an individual `.md` inside it). +4. **Tracked, not ignored**. Per lane file, run both halves of the tracked-file pair: + `git check-ignore -v ` (a non-empty result means a `.gitignore` pattern excludes that lane; + FAIL with the matching pattern in the remediation line — a directory can be tracked while a + pattern excludes an individual `.md` inside it) AND `git ls-files --error-unmatch ` + (non-zero exit means the lane is un-ignored but untracked: report it — "commit it to share with + the team", downgraded to INFO only when the user confirms it is a deliberately private, + uncommitted lane per the declared deviation below). 5. **Bundled lanes and templates**. INFO: report the bundled lanes and templates available as scaffold sources, so the reader knows what `apply` can generate. @@ -115,10 +118,13 @@ only where a lane's scope genuinely needs the user's call. 5. **Write the lane files.** Materialize each accepted lane at `.claude/tidy-lanes/.md`. Write only lanes the user confirmed; produce no empty scaffolds. 6. **Verify after remediation.** Re-run the `check` probes on each written file, required sections - present, no leftover placeholder, and (per file) `git check-ignore -v ` confirms it is tracked, - not ignored. A non-empty `check-ignore` result means a `.gitignore` pattern excludes that lane; surface - the matching pattern and offer to fix `.gitignore` before reporting success, since these lanes are - team-shared and must be committed to take effect. `/code-tidying:tidy` resolves a lane only from + present, no leftover placeholder, and (per file) both halves of the tracked-file pair: + `git check-ignore -v ` reports no match (a non-empty result means a `.gitignore` pattern + excludes that lane; surface the matching pattern and offer to fix `.gitignore` before reporting + success) AND `git ls-files --error-unmatch ` exits 0 (non-zero means un-ignored but still + untracked, the guaranteed state right after a fresh write, so report "written but untracked: + commit it to share with the team", never success), since these lanes are team-shared and must + be committed to take effect. `/code-tidying:tidy` resolves a lane only from `.claude/tidy-lanes/.md` (then the bundled lane of that name), and its catalog lists `.claude/tidy-lanes/*.md`. There is no user-global or `*.local.*` overlay resolution (declared deviation per the config-cascade contract, #723). Every scaffolded lane is a tracked, team-shared file; diff --git a/plugins/codebase-health/skills/setup/SKILL.md b/plugins/codebase-health/skills/setup/SKILL.md index a98e6296b..827f47a7c 100644 --- a/plugins/codebase-health/skills/setup/SKILL.md +++ b/plugins/codebase-health/skills/setup/SKILL.md @@ -88,9 +88,12 @@ the repo make the values unambiguous; ask only where a dimension's targets genui [`${CLAUDE_PLUGIN_ROOT}/skills/setup/templates/config-template.md`](templates/config-template.md) (replace every placeholder comment with real values; drop unused placeholder rows). 6. **Verify after remediation.** Re-run the `check` probes on the written file. Dimension source lists - parse and name real paths, and `git check-ignore -v .claude/codebase-health.md` confirms it is - tracked, not ignored (surface the matching pattern and offer to fix `.gitignore` before reporting - success). Then **offer the overlay convention**: personal overrides go in + parse and name real paths, and both halves of the tracked-file pair hold: + `git check-ignore -v .claude/codebase-health.md` reports no match (a match is FAIL; surface the + pattern and offer to fix `.gitignore` before reporting success) AND + `git ls-files --error-unmatch .claude/codebase-health.md` exits 0 (non-zero means un-ignored but + still untracked, the guaranteed state right after a fresh write, so report "written but + untracked: commit it to share with the team", never success). Then **offer the overlay convention**: personal overrides go in `.claude/codebase-health.local.md`; recommend the consumer add the recursive `.claude/**/*.local.*` line to `.gitignore` if not already covered. A user-global base at `~/.claude/codebase-health.md` is also honored. Layers resolve user-global → team → local overlay, additively. diff --git a/plugins/discovery/skills/setup/SKILL.md b/plugins/discovery/skills/setup/SKILL.md index 7499a3645..fafa072c7 100644 --- a/plugins/discovery/skills/setup/SKILL.md +++ b/plugins/discovery/skills/setup/SKILL.md @@ -109,7 +109,10 @@ reports "already configured". schema's `type: object`). Verify-or-create the memory root's self-ignoring `.gitignore` (announce the creation). **Never edit the consumer's root `.gitignore`.** 3. **Verify.** Re-read `.claude/topic-docs.yaml` and report its effective values, never claim - persisted on the write alone. + persisted on the write alone. Then run the tracked-file pair on it: `git check-ignore -v` + reports no match (a match is FAIL with the pattern) AND `git ls-files --error-unmatch` exits 0 + (non-zero right after a fresh write means "written but untracked: commit it to share with the + team", never success). ## Output diff --git a/plugins/github/skills/setup/SKILL.md b/plugins/github/skills/setup/SKILL.md index 2e1265894..a5ed9976c 100644 --- a/plugins/github/skills/setup/SKILL.md +++ b/plugins/github/skills/setup/SKILL.md @@ -30,7 +30,7 @@ config). No action given: run `check`, then offer `apply` if anything is missing | Layer | Verdict to check | |---|---| | user-global | exists / absent. No git verdict applies outside the worktree | - | team | must be tracked in git; untracked team config is a hard finding | + | team | must be tracked in git, probed as the pair (`git check-ignore -v` no match AND `git ls-files --error-unmatch` exit 0); untracked team config is a hard finding | | local overlay | must be gitignored and never staged | All three layers absent is a **valid state**, reported as "unconfigured: routing resolves to @@ -72,6 +72,10 @@ config). No action given: run `check`, then offer `apply` if anything is missing never overwrite or append to a consumer's existing conventions. 4. **Idempotency check**: when the merged answers equal the existing config, report "no changes needed" and write nothing. A second run with the same answers must produce zero file changes. + After a team-layer write, re-run the tracked-file pair on each written path + (`git check-ignore -v` no match AND `git ls-files --error-unmatch` exit 0); non-zero `ls-files` + right after a fresh write means "written but untracked: commit it to share with the team", + never success. 5. **Recommend** the recursive gitignore line (`.claude/**/*.local.*`) if the consumer's `.gitignore` lacks it. The edit is theirs to make. diff --git a/plugins/planning/skills/setup/SKILL.md b/plugins/planning/skills/setup/SKILL.md index ae7cf99e8..a1d2c2b50 100644 --- a/plugins/planning/skills/setup/SKILL.md +++ b/plugins/planning/skills/setup/SKILL.md @@ -91,7 +91,10 @@ writes. Every bootstrap write is user-accepted. the user chose. Absent keys mean the documented defaults, so an all-defaults answer may yield a file with `contract_tier: branch` alone or the schema-valid empty mapping `{}` (optionally followed by comments), never a comment-only document, which YAML parses as null. - Preserve every schema key an existing file carries. + Preserve every schema key an existing file carries. After the write, run the tracked-file pair + on it: `git check-ignore -v` reports no match (a match is FAIL with the pattern) AND + `git ls-files --error-unmatch` exits 0 (non-zero right after a fresh write means "written but + untracked: commit it to share with the team", never success). ### Second concern. Standards bootstrap @@ -111,6 +114,10 @@ implement it by reference, do not restate it. Plugin-side notes only: its `standards-contract` frontmatter at the binding's version, and the setup-owned `/.gitignore` containing `*.local.md` (the personal-overlay ignore). Write `.claude/standards.yaml` only when the user relocates the root from the documented default. + After a bootstrap write, run the tracked-file pair on each written team file: + `git check-ignore -v` reports no match (a match is FAIL with the pattern) AND + `git ls-files --error-unmatch` exits 0 (non-zero right after a fresh write means "written but + untracked: commit it to share with the team", never success). - **Optional offers, never demands:** pointer-rule generation for indexed ecosystem surfaces (interactive only), and reorganizing mixed or spread standards content toward the SRP + index shape. diff --git a/plugins/repo-fleet-hygiene/skills/setup/SKILL.md b/plugins/repo-fleet-hygiene/skills/setup/SKILL.md index c1cd6808d..f15ae4b45 100644 --- a/plugins/repo-fleet-hygiene/skills/setup/SKILL.md +++ b/plugins/repo-fleet-hygiene/skills/setup/SKILL.md @@ -69,6 +69,12 @@ with one remediation line per FAIL, and modify nothing. Do NOT run the collector 7. **Discovery skip names**. INFO listing each `fleet.skip` entry. FAIL any value that is empty or contains a path separator (must be a bare directory name). Remind that any present `fleet.skip` **replaces** the audit default skip list rather than appending. +8. **Tracked-file pair** (only when the config lives inside a git worktree, e.g. a project's + tracked `.claude/repo-fleet-hygiene.conf`): `git check-ignore -v ""` reports no match (a + match is FAIL with the pattern — teammates would never receive the config) AND + `git ls-files --error-unmatch ""` exits 0 (non-zero is un-ignored but untracked; FAIL + with "commit it to share with the team"). Skip both, saying so, for the user-global config — + a git verdict outside a worktree is meaningless. ## `apply` (idempotent) @@ -127,6 +133,13 @@ Run `check`, then create or update the config from the supplied arguments. `github.com/owner/repository` - **Discovery skip names**. When present, confirm each `fleet.skip` value is a bare directory name (non-empty, no path separator) + - **Tracked-file pair** (when the config lives inside a git worktree, e.g. the tracked + `.claude/repo-fleet-hygiene.conf`): `git check-ignore -v ""` reports no match (a + match is FAIL with the pattern — teammates would never receive the config) AND + `git ls-files --error-unmatch ""` exits 0 (non-zero means un-ignored but still + untracked, the guaranteed state right after a fresh write; report "written but untracked: + commit it to share with the team", never success). Skip both, saying so, for a config outside + any worktree — a git verdict there is meaningless. Do **not** invoke the collector to verify a write. It is the full fleet walk this skill says it never runs: per-repository network queries across every configured root, minutes on a real fleet, diff --git a/plugins/review/skills/setup/SKILL.md b/plugins/review/skills/setup/SKILL.md index 075030d13..837f773f4 100644 --- a/plugins/review/skills/setup/SKILL.md +++ b/plugins/review/skills/setup/SKILL.md @@ -41,6 +41,10 @@ Plugin-side notes on top of the binding's procedure: its `standards-contract` frontmatter at the binding's version, and the setup-owned `/.gitignore` containing `*.local.md` (the personal-overlay ignore). Write `.claude/standards.yaml` only when the user relocates the root from the documented default. + After a bootstrap write, run the tracked-file pair on each written team file: + `git check-ignore -v` reports no match (a match is FAIL with the pattern) AND + `git ls-files --error-unmatch` exits 0 (non-zero right after a fresh write means "written but + untracked: commit it to share with the team", never success). 3. **Validate every index row path** on each run (external-row validation duty); surface broken rows with an offered fix. 4. **Optional offers, never demands:** reorganizing mixed or spread standards content toward the diff --git a/plugins/songwriting/skills/setup/SKILL.md b/plugins/songwriting/skills/setup/SKILL.md index a9820b0cb..505db58ca 100644 --- a/plugins/songwriting/skills/setup/SKILL.md +++ b/plugins/songwriting/skills/setup/SKILL.md @@ -68,7 +68,10 @@ did not name. `${CLAUDE_PROJECT_DIR}/songwriting/templates/pat-pattison/` directory if absent, then copy each named bundled default verbatim to `.md` as the starting point for the consumer to edit. If an override already exists, show the difference and do not overwrite it without explicit confirmation in this - conversation. Confirm the scaffolded files are tracked, not gitignored. + conversation. Confirm the scaffolded files are tracked, not gitignored, via the pair: + `git check-ignore -v` reports no match (a match is a finding with the pattern) AND + `git ls-files --error-unmatch` exits 0 (non-zero right after a fresh scaffold means "written but + untracked: commit it to share with the team", never success). - **`apply remove ...`**. Delete the named override(s). Offer this for any override `check` found byte-identical to its bundled default; for a diverged override, show what would be lost and confirm first. diff --git a/plugins/toolchain/skills/setup/SKILL.md b/plugins/toolchain/skills/setup/SKILL.md index 0c581cfb2..26b48a7ce 100644 --- a/plugins/toolchain/skills/setup/SKILL.md +++ b/plugins/toolchain/skills/setup/SKILL.md @@ -44,8 +44,10 @@ first**, then report a PASS/FAIL/INFO table; modify nothing. report the ecosystem and its resolved command surface (`build-cmd`/`test-cmd`/`check-cmd`/`fix-cmd`/`code-fix-cmd`). Validate each against the contract's `ecosystem.schema.json`. **FAIL** a schema-invalid file (with the validation error in the - remediation line), or a tracked ecosystem file excluded by `.gitignore` (teammates would never - receive it. Report the matching rule). Otherwise PASS. If `$ARGUMENTS` names one ecosystem, scope + remediation line), an ecosystem file excluded by `.gitignore` (`git check-ignore -v` matches; + teammates would never receive it. Report the matching rule), or an un-ignored but untracked file + (`git ls-files --error-unmatch` exits non-zero; report "commit it to share with the team"). + Otherwise PASS. If `$ARGUMENTS` names one ecosystem, scope the report to just that file. 2. **Unconfigured ecosystems.** INFO: detect which ecosystems the repo has that are *not* yet configured (see the inference signals under `apply`), and note that `/toolchain:check` / @@ -54,8 +56,11 @@ first**, then report a PASS/FAIL/INFO table; modify nothing. ## `apply` (idempotent) -Run `check` first. Then write the accepted ecosystem files. After each write, confirm the file is -tracked (not gitignored). Re-run the `check` probe for that path rather than trusting the write. +Run `check` first. Then write the accepted ecosystem files. After each write, re-run the `check` +probe pair for that path rather than trusting the write: `git check-ignore -v` reports no match, +and `git ls-files --error-unmatch` distinguishes tracked from written-but-untracked (the +guaranteed state right after a fresh write — report "written but untracked: commit it", never +success). ### 1. Read existing config first diff --git a/plugins/verification/skills/setup/SKILL.md b/plugins/verification/skills/setup/SKILL.md index aab3218a7..a027ae40e 100644 --- a/plugins/verification/skills/setup/SKILL.md +++ b/plugins/verification/skills/setup/SKILL.md @@ -81,7 +81,10 @@ reports "already configured". schema's `type: object`). Verify-or-create the memory root's self-ignoring `.gitignore` (announce the creation). **Never edit the consumer's root `.gitignore`.** 3. **Verify.** Re-read `.claude/topic-docs.yaml` and report its effective values, never claim - persisted on the write alone. + persisted on the write alone. Then run the tracked-file pair on it: `git check-ignore -v` + reports no match (a match is FAIL with the pattern) AND `git ls-files --error-unmatch` exits 0 + (non-zero right after a fresh write means "written but untracked: commit it to share with the + team", never success). ## Output diff --git a/plugins/work-items/skills/setup/SKILL.md b/plugins/work-items/skills/setup/SKILL.md index 5cf2b7296..9cbb7f16d 100644 --- a/plugins/work-items/skills/setup/SKILL.md +++ b/plugins/work-items/skills/setup/SKILL.md @@ -96,7 +96,8 @@ when this pass must stop instead of guessing. merge: preserve any existing `config.role_labels` (owned by the role-label pass below) and any other keys. Write `schema_version: "1.0"`, the chosen `provider`, the `config`, and, unless one already exists, the self-describing `docs` pointer (CONTRACT.md "Setup (binding file)"). Confirm - the file is tracked, not ignored. + tracked-not-ignored via the pair: `git check-ignore -v` no match AND `git ls-files + --error-unmatch` exit 0 (non-zero after a fresh write = "written but untracked: commit it"). 5. **Ensure the personal-overlay gitignore line.** The gitignored per-user overlay (`.work-item-tracker.local.json`, allowlisted keys only. CONTRACT.md "Setup (binding file)") sits at the repo root, outside the `.claude/**/*.local.*` convention line, so `apply` must confirm a @@ -180,8 +181,8 @@ check. `work` have nothing to act on; `apply --seed-schedule` seeds it. (Report this only once the root shape validates, probe 3 establishes file presence alone and cannot tell empty from malformed.) 5. **Tracked, not ignored**, a present schedule (and a present binding) must be committed to be - team-shared: `git check-ignore -v` on the resolved paths; a non-empty result is FAIL with the - matching pattern. + team-shared: probe the pair per path — `git check-ignore -v` (match = FAIL with the pattern) + AND `git ls-files --error-unmatch` (non-zero = FAIL: un-ignored but untracked; "commit it"). 6. **Recurring-maintenance role label**. Role-label resolution is an action-entry invariant per the tracker-seam reference; probe it. With no binding (probe 2 INFO) the role remap has nothing to configure. INFO. With a binding present, resolve From fbf030a0bd9e9844d8dac2404c923a72aeca4de5 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 1 Sep 2026 14:15:27 -0400 Subject: [PATCH 3/5] chore: bump the six plugins Phase 1a touched and record the change The changelog-parity gate requires a manifest bump plus a new release entry for every plugin a change set touches (published-version reuse). Patch bumps for ai-briefing, autonomy, codebase-health, mutation-testing, source-control, toolchain with a matching CHANGELOG entry each. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_014uBXt1tMEReShbpG5gsFUd --- plugins/ai-briefing/.claude-plugin/plugin.json | 2 +- plugins/ai-briefing/CHANGELOG.md | 6 ++++++ plugins/autonomy/.claude-plugin/plugin.json | 2 +- plugins/autonomy/CHANGELOG.md | 6 ++++++ plugins/codebase-health/.claude-plugin/plugin.json | 2 +- plugins/codebase-health/CHANGELOG.md | 6 ++++++ plugins/mutation-testing/.claude-plugin/plugin.json | 2 +- plugins/mutation-testing/CHANGELOG.md | 6 ++++++ plugins/source-control/.claude-plugin/plugin.json | 2 +- plugins/source-control/CHANGELOG.md | 6 ++++++ plugins/toolchain/.claude-plugin/plugin.json | 2 +- plugins/toolchain/CHANGELOG.md | 6 ++++++ 12 files changed, 42 insertions(+), 6 deletions(-) diff --git a/plugins/ai-briefing/.claude-plugin/plugin.json b/plugins/ai-briefing/.claude-plugin/plugin.json index 9aa47bf4d..c95038eca 100644 --- a/plugins/ai-briefing/.claude-plugin/plugin.json +++ b/plugins/ai-briefing/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "ai-briefing", - "version": "0.7.8", + "version": "0.7.9", "description": "Build source-backed AI-industry briefings from official vendor publications, configured RSS/Atom feeds, GitHub releases, reputable secondary reporting, and user-supplied URLs. Deduplicate, rank, and present results as markdown or optional HTML/PPTX decks, with repository-owned profile, audience, and brand configuration. Automated X/Twitter collection is disabled; Playwright is used only for deterministic local rendering.", "author": { "name": "Melodic Software", diff --git a/plugins/ai-briefing/CHANGELOG.md b/plugins/ai-briefing/CHANGELOG.md index e518cfdcd..bd51c3404 100644 --- a/plugins/ai-briefing/CHANGELOG.md +++ b/plugins/ai-briefing/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `ai-briefing` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.7.9] + +### Changed + +- `setup` (and the README/reference docs) now recommend config-cascade's mandated recursive `.claude/**/*.local.*` gitignore line for personal overlays instead of a narrow or bespoke spelling (#3582, customization-consistency Phase 1a). + ## [0.7.8] ### Changed diff --git a/plugins/autonomy/.claude-plugin/plugin.json b/plugins/autonomy/.claude-plugin/plugin.json index d0d782301..3fb2fda68 100644 --- a/plugins/autonomy/.claude-plugin/plugin.json +++ b/plugins/autonomy/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "autonomy", - "version": "0.22.8", + "version": "0.22.9", "description": "Governed autonomous agent operation: role-topology, binding-seam, wiring-vs-advisor, telemetry, return-accounting, trigger-dispatch, per-work-class guardrail-matrix, standing-routine-catalog, and design-only runner-charter contracts for climbing the AI-adoption ladder, plus a guided-setup skill that discovers an adopting org's state, writes its schema-versioned binding, wires standards-pinned OTLP emission with a zero-cost file-artifact default, wires human-attested return capture at the task boundary, wires signal adapters with one governed dispatch entrypoint, binds the five-class guardrail matrix to an org's isolation substrates with an in-boundary live-validation probe before recording each fail-closed binding, and stands up standing-routine-catalog classes as scheduled temporal signal adapters behind the one governed queue with free scheduling defaults wired as reviewable changes and each routine's work-class mapping homed on the security surface.", "author": { "name": "Melodic Software", diff --git a/plugins/autonomy/CHANGELOG.md b/plugins/autonomy/CHANGELOG.md index ffb25faa6..a5d776990 100644 --- a/plugins/autonomy/CHANGELOG.md +++ b/plugins/autonomy/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `autonomy` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.22.9] + +### Changed + +- `setup` (and the README/reference docs) now recommend config-cascade's mandated recursive `.claude/**/*.local.*` gitignore line for personal overlays instead of a narrow or bespoke spelling (#3582, customization-consistency Phase 1a). + ## [0.22.8] ### Changed diff --git a/plugins/codebase-health/.claude-plugin/plugin.json b/plugins/codebase-health/.claude-plugin/plugin.json index 8335c2db3..d8a2f470b 100644 --- a/plugins/codebase-health/.claude-plugin/plugin.json +++ b/plugins/codebase-health/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "codebase-health", - "version": "0.8.3", + "version": "0.8.4", "description": "Repo-wide drift audit between docs, config, code, and architecture: verifies every factual claim against reality via parallel subagent fan-out, severity-rates findings, and reports read-only, delegating remediation to the implementation/verification lanes. Audit dimensions are configurable through a tracked .claude/codebase-health.md config file written by the setup skill.", "author": { "name": "Melodic Software", diff --git a/plugins/codebase-health/CHANGELOG.md b/plugins/codebase-health/CHANGELOG.md index 39cadf05f..5b15d146d 100644 --- a/plugins/codebase-health/CHANGELOG.md +++ b/plugins/codebase-health/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `codebase-health` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.8.4] + +### Changed + +- `setup` (and the README/reference docs) now recommend config-cascade's mandated recursive `.claude/**/*.local.*` gitignore line for personal overlays instead of a narrow or bespoke spelling (#3582, customization-consistency Phase 1a). + ## [0.8.3] ### Changed diff --git a/plugins/mutation-testing/.claude-plugin/plugin.json b/plugins/mutation-testing/.claude-plugin/plugin.json index 7a98a35cc..f0332129f 100644 --- a/plugins/mutation-testing/.claude-plugin/plugin.json +++ b/plugins/mutation-testing/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "mutation-testing", - "version": "0.3.6", + "version": "0.3.7", "description": "Measures whether a test suite can actually detect faults, not merely execute code: `/mutation-testing:principles` answers operator, mutant-state, and metric questions from the primary literature; `/mutation-testing:setup` verifies the ecosystem's mutation tool and writes the tracked config; `/mutation-testing:audit` runs diff-scoped mutation analysis and reports surviving mutants, verifying that tracked source was restored and failing the run when it cannot, delegating the productive-versus-arid judgment to a fresh-context reviewer and test authoring to the test lane, and optionally persisting survivors as a findings file the review fix pass consumes.", "author": { "name": "Melodic Software", diff --git a/plugins/mutation-testing/CHANGELOG.md b/plugins/mutation-testing/CHANGELOG.md index c625c3de6..e2e4178db 100644 --- a/plugins/mutation-testing/CHANGELOG.md +++ b/plugins/mutation-testing/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `mutation-testing` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.3.7] + +### Changed + +- `setup` (and the README/reference docs) now recommend config-cascade's mandated recursive `.claude/**/*.local.*` gitignore line for personal overlays instead of a narrow or bespoke spelling (#3582, customization-consistency Phase 1a). + ## [0.3.6] ### Changed diff --git a/plugins/source-control/.claude-plugin/plugin.json b/plugins/source-control/.claude-plugin/plugin.json index 769e5ad26..b9a01749b 100644 --- a/plugins/source-control/.claude-plugin/plugin.json +++ b/plugins/source-control/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "source-control", - "version": "0.55.13", + "version": "0.55.14", "description": "Git and GitHub delivery workflow: /commit (Conventional Commits + Co-authored-by trailer via safe heredoc mechanics), /pull-request (prep, create, CI monitoring, review-comment triage, merge, CI-log fetch), /babysit-prs (self-pacing fleet loop — safe by default; opt-in worker/autopilot tiers add gate-checked merge and thread resolution behind a deterministic Python engine), /babysit-loop (the loop-lane merge lane: a standing or drain loop that invokes babysit-prs per cycle, configured through repo-scoped babysit_loop_* keys on the layered source-control.md seam, with merge authority human-only until the target repo's tracked config adopts the lane, a gate-proven C2-mechanical baseline once adopted, and standing merge-rung raises binding from the team-tracked layer only — with one named exception, where an invocation line explicitly typing both the autopilot tier keyword and the dedicated raise argument --merge c3-this-run widens that single invocation's merge authority up to C3 behind a fresh independent frontier-tier resolver, while C4-structural and C5-untrusted-provenance stay unconditionally human-merge), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (check the effective commit-subject / PR-title convention merged across its config layers and the babysit-prs config, or apply — interview the repo and write the convention config to a chosen layer), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep — never --abort). The commit-subject / PR-title convention is configurable via a source-control.md config written by a re-runnable setup skill, layered across a ~/.claude user-global file, the tracked team file, and a gitignored .claude/source-control.local.md personal overlay merged per key; Conventional Commits is the default when no convention is declared.", "author": { "name": "Melodic Software", diff --git a/plugins/source-control/CHANGELOG.md b/plugins/source-control/CHANGELOG.md index f5fd008ee..1604a5f27 100644 --- a/plugins/source-control/CHANGELOG.md +++ b/plugins/source-control/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `source-control` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.55.14] + +### Changed + +- `setup` (and the README/reference docs) now recommend config-cascade's mandated recursive `.claude/**/*.local.*` gitignore line for personal overlays instead of a narrow or bespoke spelling (#3582, customization-consistency Phase 1a). + ## [0.55.13] ### Changed diff --git a/plugins/toolchain/.claude-plugin/plugin.json b/plugins/toolchain/.claude-plugin/plugin.json index db7b3b2ea..6714ccb72 100644 --- a/plugins/toolchain/.claude-plugin/plugin.json +++ b/plugins/toolchain/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "toolchain", - "version": "0.13.5", + "version": "0.13.6", "description": "Repo-agnostic polyglot verification toolchain: build + test + lint for changed files across .NET, Python, TypeScript, Bash, PowerShell, Markdown, Go, YAML, and cross-cutting surfaces (`/toolchain:check`, `/toolchain:lint` with format-only `--fix` and gated `--code-fix`), plus a re-runnable `/toolchain:setup` with check (report the configured ecosystems and their command surface) and apply (interview, infer, and write the tracked per-ecosystem command config those skills resolve first).", "author": { "name": "Melodic Software", diff --git a/plugins/toolchain/CHANGELOG.md b/plugins/toolchain/CHANGELOG.md index b6db48138..19bedde75 100644 --- a/plugins/toolchain/CHANGELOG.md +++ b/plugins/toolchain/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `toolchain` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.13.6] + +### Changed + +- `setup` (and the README/reference docs) now recommend config-cascade's mandated recursive `.claude/**/*.local.*` gitignore line for personal overlays instead of a narrow or bespoke spelling (#3582, customization-consistency Phase 1a). + ## [0.13.5] ### Changed From 8fde49dbf06f06b8cb303b7a55f07f0785edeaaf Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 1 Sep 2026 14:37:57 -0400 Subject: [PATCH 4/5] chore: bump the thirteen plugins Phase 1c touched and record the change Patch bumps with a matching CHANGELOG entry each, per the changelog-parity gate's published-version-reuse rule. Also merges the Phase 1a branch forward (its own bumps) so this stacked branch stays monotonic above its base. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_014uBXt1tMEReShbpG5gsFUd --- plugins/ai-slop/.claude-plugin/plugin.json | 2 +- plugins/ai-slop/CHANGELOG.md | 6 ++++++ plugins/claude-config/.claude-plugin/plugin.json | 2 +- plugins/claude-config/CHANGELOG.md | 6 ++++++ plugins/code-tidying/.claude-plugin/plugin.json | 2 +- plugins/code-tidying/CHANGELOG.md | 6 ++++++ plugins/codebase-health/.claude-plugin/plugin.json | 2 +- plugins/codebase-health/CHANGELOG.md | 6 ++++++ plugins/discovery/.claude-plugin/plugin.json | 2 +- plugins/discovery/CHANGELOG.md | 6 ++++++ plugins/github/.claude-plugin/plugin.json | 2 +- plugins/github/CHANGELOG.md | 6 ++++++ plugins/planning/.claude-plugin/plugin.json | 2 +- plugins/planning/CHANGELOG.md | 6 ++++++ plugins/repo-fleet-hygiene/.claude-plugin/plugin.json | 2 +- plugins/repo-fleet-hygiene/CHANGELOG.md | 6 ++++++ plugins/review/.claude-plugin/plugin.json | 2 +- plugins/review/CHANGELOG.md | 6 ++++++ plugins/songwriting/.claude-plugin/plugin.json | 2 +- plugins/songwriting/CHANGELOG.md | 6 ++++++ plugins/toolchain/.claude-plugin/plugin.json | 2 +- plugins/toolchain/CHANGELOG.md | 6 ++++++ plugins/verification/.claude-plugin/plugin.json | 2 +- plugins/verification/CHANGELOG.md | 6 ++++++ plugins/work-items/.claude-plugin/plugin.json | 2 +- plugins/work-items/CHANGELOG.md | 6 ++++++ 26 files changed, 91 insertions(+), 13 deletions(-) diff --git a/plugins/ai-slop/.claude-plugin/plugin.json b/plugins/ai-slop/.claude-plugin/plugin.json index 87225f0dc..7a1fedf0e 100644 --- a/plugins/ai-slop/.claude-plugin/plugin.json +++ b/plugins/ai-slop/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "ai-slop", - "version": "0.3.9", + "version": "0.3.10", "description": "Detects and removes AI-writing tells (slop) in checked-in markdown prose: em dashes, emoji formatting, AI vocabulary, negative parallelisms, chatbot phrases, filler, stacked hedging, citation artifacts, and the rest of a catalog distilled from Wikipedia's Signs of AI writing. Read-only audit by default with a deterministic detector plus a judgment rubric; an explicit fix action rewrites findings behind a semantic-diff guard. Findings conform to the detector-findings convention so the review fanout fix relay can consume them.", "author": { "name": "Melodic Software", diff --git a/plugins/ai-slop/CHANGELOG.md b/plugins/ai-slop/CHANGELOG.md index 170a0e58d..b110405ad 100644 --- a/plugins/ai-slop/CHANGELOG.md +++ b/plugins/ai-slop/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [0.3.10] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.3.9] - **Three directory-expansion defects survived 0.3.8.** A tracked file diff --git a/plugins/claude-config/.claude-plugin/plugin.json b/plugins/claude-config/.claude-plugin/plugin.json index 0aa224e11..39bef3e2d 100644 --- a/plugins/claude-config/.claude-plugin/plugin.json +++ b/plugins/claude-config/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "claude-config", - "version": "0.40.2", + "version": "0.40.3", "description": "Nine configuration-health skills (plus setup) for a repo's Claude Code configuration: audit (settings.json / .mcp.json / hooks / plugins / permissions drift), audit-automation-gaps (evidence-gated verdicts on automation gaps), audit-permission-grants (allow-rule / allowed-tools grants for auto-mode durability and portability), audit-permission-state (the permission rules actually in effect — every settings scope merged with per-rule provenance, what auto mode drops on entry, config written where nothing reads it, and which managed intents are enforced versus loosenable), draft-auto-mode-rules (interview and draft a paste-ready autoMode classifier block; prints only, never writes), audit-instructions (locally-owned instruction surfaces vs current model capability — proposes removals/rewrites of instructions the model no longer needs, and detects cross-surface instruction conflicts), audit-prompting-postures (the additive lane — posture guidance the prompting guide says a component's purpose needs but the component does not carry), audit-pass (one coordinated, ordered, resumable pass over a named target — three-scope inventory, run-time-derived exclusion set, stable finding identity, suppression memory, resume, one human gate — delegating every check to the plugin that owns it), and unhobble (the empirical bare-baseline experiment: reversibly strip a repo's standing instructions, log real stumbles against the current model, re-add only what evidence earns).", "author": { "name": "Melodic Software", diff --git a/plugins/claude-config/CHANGELOG.md b/plugins/claude-config/CHANGELOG.md index b1183bcb1..54dc25675 100644 --- a/plugins/claude-config/CHANGELOG.md +++ b/plugins/claude-config/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `claude-config` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.40.3] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.40.2] ### Fixed diff --git a/plugins/code-tidying/.claude-plugin/plugin.json b/plugins/code-tidying/.claude-plugin/plugin.json index 4b25f40d2..5ebcabe15 100644 --- a/plugins/code-tidying/.claude-plugin/plugin.json +++ b/plugins/code-tidying/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "code-tidying", - "version": "0.14.5", + "version": "0.14.6", "description": "Code tidying and comment hygiene: /code-tidying:tidy proactively hunts a rotated, glob-scoped lane for Beck-style tidyings under a research-backed scope budget and ships one tight PR; /code-tidying:batch-simplify sweeps a time window, a branch, or an entire repository through grouped, dependency-ordered simplification waves with a never-drop deferred-items contract; /code-tidying:dissolve-comments enforces self-describing expressive code over a diff or target, widening to the branch diff and then the whole repository when the tree is clean — deletes zero-information comments, dissolves code-expressible ones into names and structure behind a tests gate (safe mode restricts applied edits to removals), and keeps only terse load-bearing comments code cannot express; /code-tidying:audit-comment-residue is a read-only classifier that flags history, plan, conversational, and ticket/PR residue in code comments for author-applied deletion; /code-tidying:audit-dead-code is a read-only whole-repo dead-code hunter running four labelled lanes of unequal confidence (knip for TS/JS, vulture for Python, gopls for Go, and a portable grep lane for shell and other symbol languages), adjudicating every candidate against dynamic-usage evidence into a dead, uncertain, or alive verdict. Project-specific tidy lanes are scaffolded into a tracked .claude/tidy-lanes/ config folder by a re-runnable setup skill.", "author": { "name": "Melodic Software", diff --git a/plugins/code-tidying/CHANGELOG.md b/plugins/code-tidying/CHANGELOG.md index 8974d5a92..42b046381 100644 --- a/plugins/code-tidying/CHANGELOG.md +++ b/plugins/code-tidying/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `code-tidying` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.14.6] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.14.5] ### Changed diff --git a/plugins/codebase-health/.claude-plugin/plugin.json b/plugins/codebase-health/.claude-plugin/plugin.json index d8a2f470b..8c747b169 100644 --- a/plugins/codebase-health/.claude-plugin/plugin.json +++ b/plugins/codebase-health/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "codebase-health", - "version": "0.8.4", + "version": "0.8.5", "description": "Repo-wide drift audit between docs, config, code, and architecture: verifies every factual claim against reality via parallel subagent fan-out, severity-rates findings, and reports read-only, delegating remediation to the implementation/verification lanes. Audit dimensions are configurable through a tracked .claude/codebase-health.md config file written by the setup skill.", "author": { "name": "Melodic Software", diff --git a/plugins/codebase-health/CHANGELOG.md b/plugins/codebase-health/CHANGELOG.md index 5b15d146d..92abb9f95 100644 --- a/plugins/codebase-health/CHANGELOG.md +++ b/plugins/codebase-health/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `codebase-health` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.8.5] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.8.4] ### Changed diff --git a/plugins/discovery/.claude-plugin/plugin.json b/plugins/discovery/.claude-plugin/plugin.json index 2cc9b7bb0..955d4fab8 100644 --- a/plugins/discovery/.claude-plugin/plugin.json +++ b/plugins/discovery/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "discovery", - "version": "0.16.5", + "version": "0.16.6", "description": "Structured discovery before changes: explore the local codebase, run disciplined multi-source external research, and reconstruct why a past decision was made from evidence outside the code — each dispatching a purpose-built subagent by default so the reading stays out of the main conversation, with source tiers, falsification, recency gates, an intent-evidence tier, and a corpus-coverage ledger — persisting EXPLORE.md / RESEARCH.md / INTENT.md index-plus-sidecar handoff artifacts.", "author": { "name": "Melodic Software", diff --git a/plugins/discovery/CHANGELOG.md b/plugins/discovery/CHANGELOG.md index 94ea03aa5..cfbeb2f8d 100644 --- a/plugins/discovery/CHANGELOG.md +++ b/plugins/discovery/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog — discovery plugin +## [0.16.6] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.16.5] ### Fixed diff --git a/plugins/github/.claude-plugin/plugin.json b/plugins/github/.claude-plugin/plugin.json index c17bc93be..1bc1d3a63 100644 --- a/plugins/github/.claude-plugin/plugin.json +++ b/plugins/github/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "github", - "version": "0.3.5", + "version": "0.3.6", "description": "GitHub admin-plane audit, advice, and guided setup over the authenticated user's own gh CLI: billing and cost control, security posture, rulesets and settings drift, Actions policy, and every other org/repo/enterprise settings area. Grounded in live state and current official GitHub docs (zero vendored knowledge); read-only by default, every mutation user-in-loop.", "author": { "name": "Melodic Software", diff --git a/plugins/github/CHANGELOG.md b/plugins/github/CHANGELOG.md index 71eb4492c..55323fdc0 100644 --- a/plugins/github/CHANGELOG.md +++ b/plugins/github/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `github` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.3.6] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.3.5] ### Changed diff --git a/plugins/planning/.claude-plugin/plugin.json b/plugins/planning/.claude-plugin/plugin.json index 87c99c4c7..47575b368 100644 --- a/plugins/planning/.claude-plugin/plugin.json +++ b/plugins/planning/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "planning", - "version": "0.34.4", + "version": "0.34.5", "userConfig": { "use_ask_user_question": { "type": "boolean", diff --git a/plugins/planning/CHANGELOG.md b/plugins/planning/CHANGELOG.md index 211419008..634c8a3b6 100644 --- a/plugins/planning/CHANGELOG.md +++ b/plugins/planning/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `planning` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.34.5] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.34.4] ### Changed diff --git a/plugins/repo-fleet-hygiene/.claude-plugin/plugin.json b/plugins/repo-fleet-hygiene/.claude-plugin/plugin.json index d1631e4d4..5c41db190 100644 --- a/plugins/repo-fleet-hygiene/.claude-plugin/plugin.json +++ b/plugins/repo-fleet-hygiene/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "repo-fleet-hygiene", - "version": "0.23.10", + "version": "0.23.11", "description": "Cross-repository Git/GitHub fleet discovery, evidence rollup, and a gated apply verb that executes a prior fleet action plan behind one confirmation. Audit stays read-only and confidence-tiered; apply mutates only with --apply plus interactive confirmation or --yes.", "author": { "name": "Melodic Software", diff --git a/plugins/repo-fleet-hygiene/CHANGELOG.md b/plugins/repo-fleet-hygiene/CHANGELOG.md index 7254851e0..f6dd92236 100644 --- a/plugins/repo-fleet-hygiene/CHANGELOG.md +++ b/plugins/repo-fleet-hygiene/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to `repo-fleet-hygiene` are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.23.11] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.23.10] ### Changed diff --git a/plugins/review/.claude-plugin/plugin.json b/plugins/review/.claude-plugin/plugin.json index e1111e678..8903359b5 100644 --- a/plugins/review/.claude-plugin/plugin.json +++ b/plugins/review/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "review", - "version": "0.26.7", + "version": "0.26.8", "description": "Code-review toolkit: six read-only reviewer agents (code, security, architecture, doc drift, build/test/lint, CI-log audit) plus orchestration skills — quality gate, fan-out, and CI lane commands (/review:code-review, /review:security-review) for org reusable workflows.", "author": { "name": "Melodic Software", diff --git a/plugins/review/CHANGELOG.md b/plugins/review/CHANGELOG.md index f524a0bc3..b32c841c0 100644 --- a/plugins/review/CHANGELOG.md +++ b/plugins/review/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `review` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.26.8] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.26.7] ### Changed diff --git a/plugins/songwriting/.claude-plugin/plugin.json b/plugins/songwriting/.claude-plugin/plugin.json index d411f32c7..bb1b31db1 100644 --- a/plugins/songwriting/.claude-plugin/plugin.json +++ b/plugins/songwriting/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "songwriting", - "version": "1.4.9", + "version": "1.4.10", "description": "Songwriting craft companion — nine concern-scoped lyric-craft skills (workflow router, rhyme, object-writing, metaphor, meter-prosody, song-form, co-write, diagnose, practice) applying Pat Pattison's methods, with an object-writing agent that performs the sensory exercise itself and per-skill emission boundaries that route generation to the skill that owns it, plus Suno v5.5 prompt engineering (style prompts, tagged lyrics, genre templates, troubleshooting).", "author": { "name": "Melodic Software", diff --git a/plugins/songwriting/CHANGELOG.md b/plugins/songwriting/CHANGELOG.md index 25a60290a..4b439e334 100644 --- a/plugins/songwriting/CHANGELOG.md +++ b/plugins/songwriting/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `songwriting` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [1.4.10] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [1.4.9] ### Changed diff --git a/plugins/toolchain/.claude-plugin/plugin.json b/plugins/toolchain/.claude-plugin/plugin.json index 6714ccb72..ad0ecc795 100644 --- a/plugins/toolchain/.claude-plugin/plugin.json +++ b/plugins/toolchain/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "toolchain", - "version": "0.13.6", + "version": "0.13.7", "description": "Repo-agnostic polyglot verification toolchain: build + test + lint for changed files across .NET, Python, TypeScript, Bash, PowerShell, Markdown, Go, YAML, and cross-cutting surfaces (`/toolchain:check`, `/toolchain:lint` with format-only `--fix` and gated `--code-fix`), plus a re-runnable `/toolchain:setup` with check (report the configured ecosystems and their command surface) and apply (interview, infer, and write the tracked per-ecosystem command config those skills resolve first).", "author": { "name": "Melodic Software", diff --git a/plugins/toolchain/CHANGELOG.md b/plugins/toolchain/CHANGELOG.md index 19bedde75..5d09b77fc 100644 --- a/plugins/toolchain/CHANGELOG.md +++ b/plugins/toolchain/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `toolchain` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.13.7] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.13.6] ### Changed diff --git a/plugins/verification/.claude-plugin/plugin.json b/plugins/verification/.claude-plugin/plugin.json index c8ae20b52..ca4c4f005 100644 --- a/plugins/verification/.claude-plugin/plugin.json +++ b/plugins/verification/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "verification", - "version": "0.5.6", + "version": "0.5.7", "description": "Outcome-verification stage: prove a change achieved its intended outcome (`/verification:confirm` — a mechanical build/test/lint prerequisite gate, then intent-match + evidence + verdict with the criterion auto-detected by change type), and verify measurable-improvement claims against a planning-time baseline (`/verification:measure`), never fabricating numbers.", "author": { "name": "Melodic Software", diff --git a/plugins/verification/CHANGELOG.md b/plugins/verification/CHANGELOG.md index 3540e7ea0..a19559c37 100644 --- a/plugins/verification/CHANGELOG.md +++ b/plugins/verification/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `verification` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.5.7] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.5.6] ### Changed diff --git a/plugins/work-items/.claude-plugin/plugin.json b/plugins/work-items/.claude-plugin/plugin.json index e2d11d4af..66b0a6638 100644 --- a/plugins/work-items/.claude-plugin/plugin.json +++ b/plugins/work-items/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "work-items", - "version": "0.39.23", + "version": "0.39.24", "description": "Manages development work items through a provider-neutral tracker seam that ships with the plugin (bundled dispatcher plus github, local-markdown, jira, gitea, and linear adapters; seam plugin-dir canonical, adapters consumer-local-first): dashboard, taxonomy-labeled creation, a race-safe assignee-plus-lease claim protocol, recurring-schedule checks, TODO scanning, stale-lease auditing, plan decomposition into vertical-slice items, a macro-journey router over spec containers (rollup, per-container execution shape, next-step routing), raw-intake triage (issues and unsolicited PRs through raw, verified, briefed, autonomous-eligible states), plus the two work-items loop lanes of the loop-lane convention: a self-paced autonomous work-loop drain (work-class admission gate, adaptive item cap, PR-only) and an attended attend-queue escalation lane. The re-runnable setup skill binds the provider (.work-item-tracker.json), seeds the recurring-schedule seam (.github/recurring-schedule.json), and remaps canonical role labels.", "author": { "name": "Melodic Software", diff --git a/plugins/work-items/CHANGELOG.md b/plugins/work-items/CHANGELOG.md index 53af827ba..fb6340c1a 100644 --- a/plugins/work-items/CHANGELOG.md +++ b/plugins/work-items/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `work-items` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.39.24] + +### Changed + +- `setup` verifies tracked config writes with the check-ignore + ls-files pair and reports written-but-untracked instead of success (#3584, customization-consistency Phase 1c). + ## [0.39.23] ### Changed From d35ded98029e814f26c052dbfd2fb983d01241f4 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 1 Sep 2026 20:18:20 -0400 Subject: [PATCH 5/5] chore: ignore the two resolver false-positive gitleaks fingerprints CI scans with --log-opts=--all, so the pre-annotation CLAUDE_TOKEN parser-variable commits fail every PR's hygiene lane regardless of branch content. The fingerprints are annotated false positives. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_014uBXt1tMEReShbpG5gsFUd --- .gitleaksignore | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .gitleaksignore diff --git a/.gitleaksignore b/.gitleaksignore new file mode 100644 index 000000000..5dd49e9b5 --- /dev/null +++ b/.gitleaksignore @@ -0,0 +1,10 @@ +# Gitleaks false-positive fingerprints (commit:file:rule:line). +# +# CLAUDE_TOKEN in resolve-convention-home.sh is the parser sense of "token" +# (the pointer line lifted from a convention-home region), never a credential; +# the generic-api-key rule keys on the identifier and reads the next line +# (CLAUDE_SHIM=0) as the value. The current file carries a gitleaks:allow +# annotation; these entries cover the pre-annotation commits, which the CI +# scan reaches because it runs with --log-opts=--all over every fetched ref. +f7aec1549dec60407a24a7d8ea720696b7b099af:plugins/claude-config/lib/resolve-convention-home.sh:generic-api-key:248 +708739fb2ba1b0196e93f9c07d3293bddfeed2f0:plugins/plugin-quality/lib/resolve-convention-home.sh:generic-api-key:249