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/3] 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 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 2/3] 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 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 3/3] 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