Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 10 additions & 2 deletions .claude/cloud-bootstrap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,14 @@ if [[ -x "$claude_bin" ]] && command -v jq >/dev/null 2>&1; then
"$fleet_list" >/dev/null 2>&1; then
fleet_list=.claude/settings.json
fi
# Every `jq -r` here and below is piped through `tr -d '\r'`. The cloud VM
# this script provisions runs a jq that ends its lines with LF, but the
# Windows build ends them with CRLF, and a plugin id carrying a trailing CR
# compares unequal to the same id read from anywhere else: the accounting
# below then calls every healthy plugin "not installed at user scope". That
# is only reachable when the suite in .claude/hooks/ drives this block on a
# developer's Windows checkout, and the strip costs nothing where jq already
# answers in LF.
mapfile -t wanted < <(
jq -r --arg n "$marketplace_name" --slurpfile f "$fleet_list" \
'(($f[0].enabledPlugins // {}) + (.enabledPlugins // {})) | to_entries[]
Expand Down Expand Up @@ -217,7 +225,7 @@ if [[ -x "$claude_bin" ]] && command -v jq >/dev/null 2>&1; then
[[ -n "$head_sha" && -f "$plugins_registry" ]] || return 1
recorded="$(jq -r --arg id "$id" \
'(.plugins[$id] // []) | map(select(.scope == "user")) | .[0].gitCommitSha // ""' \
"$plugins_registry" 2>/dev/null)"
"$plugins_registry" 2>/dev/null | tr -d '\r')"
[[ -n "$recorded" && "$recorded" != "$head_sha" ]] || return 1
# A commit this clone doesn't have (shallow fetch, force-push): refresh
# rather than guess that the snapshot is current.
Expand Down Expand Up @@ -252,7 +260,7 @@ if [[ -x "$claude_bin" ]] && command -v jq >/dev/null 2>&1; then
fi
recorded="$(jq -r --arg id "$id" \
'(.plugins[$id] // []) | map(select(.scope == "user")) | .[0].gitCommitSha // ""' \
"$plugins_registry" 2>/dev/null)"
"$plugins_registry" 2>/dev/null | tr -d '\r')"
if [[ -z "$recorded" || "$recorded" == "null" ]]; then
printf 'cannot verify snapshot: no user-scope gitCommitSha recorded in %s' \
"$plugins_registry"
Expand Down
3 changes: 1 addition & 2 deletions .claude/rules/skill-bodies-state-current-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ paths:
A skill body is read by the model on every invocation. Its authority is the behavior it
prescribes, not the incident that motivated it, so the body carries the rule and the reason and
nothing about how the rule got there. This follows the bundled `/claude-api prompt-audit` guide
(Group 2, "Brittle skill files"), applied fleet-wide in the 2026-09 audit recorded in
[`docs/specs/prompt-audit-skills-2026-09.md`](../../docs/specs/prompt-audit-skills-2026-09.md).
(Group 2, "Brittle skill files").

Keep out of a skill or agent body:

Expand Down
7 changes: 3 additions & 4 deletions .claude/rules/worktree-base-ref.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: "This repository sets no worktree.baseRef; new worktrees branch from the remote default branch (Claude Code's default). Never add worktree.baseRef: head back, even when a reviewer says a merge dropped it"
description: "This repository sets no worktree.baseRef and never adds one back, even when a review says a merge dropped it; read before editing either settings file"
paths:
- ".claude/settings.json"
- ".claude/settings.local.json"
Expand All @@ -12,9 +12,8 @@ is `fresh`: the repository's default branch as fetched from the remote, so every
starts from the latest `main`. The value `head` branches from the local checkout's HEAD
instead, which spawns worktrees from whatever a session happens to have checked out.

The operator withdrew the `head` override on 2026-09-02 (topic-docs convention 3.1.0, in
[`docs/conventions/topic-docs/CHANGELOG.md`](../../docs/conventions/topic-docs/CHANGELOG.md)),
and the setting stays absent on purpose. Do not add `worktree` to either settings file, and do
The `head` override is withdrawn and the setting stays absent on purpose. Do not add `worktree`
to either settings file, and do
not "restore" it because a diff against another branch shows it missing: `origin/main` can carry
it for a while after a branch that removed it opens, and a review comment reading that diff
will call the removal a regression. It is not. Before restoring any key a review says a merge
Expand Down
14 changes: 14 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1707,6 +1707,20 @@ jobs:
fi
scripts/sync-unwrap-before-compose.sh --check-bump "origin/$BASE_REF"

- name: Verify context-zone cluster matches canonical
if: needs.changes.outputs.run_tests == 'true'
run: scripts/sync-context-zone.sh --check
- name: Verify carrying plugins bumped when canonical changed
if: needs.changes.outputs.run_tests == 'true'
env:
BASE_REF: ${{ github.base_ref }}
run: |
if [ "$GITHUB_EVENT_NAME" != pull_request ]; then
echo "::notice::Declined on a $GITHUB_EVENT_NAME event; there is no base ref to diff against."
exit 0
fi
scripts/sync-context-zone.sh --check-bump "origin/$BASE_REF"

- name: Verify resolve-convention-home cluster matches canonical
if: needs.changes.outputs.run_tests == 'true'
run: scripts/sync-resolve-convention-home.sh --check
Expand Down
3 changes: 2 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ context, read the file directly.
| `.claude/rules/hook-budget.md` | `plugins/*/hooks/**` | Marketplace-wide latency budget for always-on hooks; read before adding or widening a hook |
| `.claude/rules/ruff-pin.md` | `**/*.py` | Python linting runs through the pinned ruff wrapper, never a bare ruff on PATH |
| `.claude/rules/skill-bodies-state-current-rules.md` | `plugins/*/skills/**, plugins/*/agents/**` | Skill and agent bodies state the current rule and its reason, never the incident, PR, or model that motivated it; read before editing any skill body |
| `.claude/rules/worktree-base-ref.md` | `.claude/settings.json, .claude/settings.local.json` | This repository sets no worktree.baseRef; new worktrees branch from the remote default branch (Claude Code's default). Never add worktree.baseRef: head back, even when a reviewer says a merge dropped it |
| `.claude/rules/worktree-base-ref.md` | `.claude/settings.json, .claude/settings.local.json` | This repository sets no worktree.baseRef and never adds one back, even when a review says a merge dropped it; read before editing either settings file |
| `plugins/autonomy/AGENTS.md` | `plugins/autonomy/**` | autonomy plugin: contributor conventions |
| `plugins/machine-health/skills/audit/AGENTS.md` | `plugins/machine-health/skills/audit/**` | machine-health audit skill: contributor conventions |
| `plugins/playbooks/reference/model-adaptation/AGENTS.md` | `plugins/playbooks/reference/model-adaptation/**` | model-adaptation chapters: contributor conventions |
| `plugins/provenance/skills/audit/AGENTS.md` | `plugins/provenance/skills/audit/**` | Editing the provenance audit skill: contributor conventions |
| `plugins/work-items/skills/work-loop/AGENTS.md` | `plugins/work-items/skills/work-loop/**` | work-loop: contributor conventions |

Expand Down
135 changes: 113 additions & 22 deletions docs/specs/prompt-audit-skills-2026-09.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion plugins/ai-briefing/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "ai-briefing",
"version": "0.7.26",
"version": "0.7.27",
"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",
Expand Down
6 changes: 6 additions & 0 deletions plugins/ai-briefing/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.27]

### Changed

- **setup:** eval 3 prompts the contract form `apply install-build-deps` instead of a flag the skill does not accept (prompt-audit follow-up F22).

## [0.7.26]

### Changed
Expand Down
4 changes: 2 additions & 2 deletions plugins/ai-briefing/skills/setup/evals/evals.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@
{
"id": 3,
"name": "build-dependencies-are-explicit-transactional-and-validated",
"prompt": "/ai-briefing:setup --with-build-deps",
"prompt": "/ai-briefing:setup apply install-build-deps",
"expected_output": "Stages the locked build tree in a temporary directory, uses npm ci, installs the Playwright headless Chromium shell and Linux system dependencies where supported, validates a browser launch, and only then swaps the runtime with rollback protection.",
"files": [],
"expectations": [
"Does not install build dependencies without --with-build-deps",
"Does not install build dependencies unless the subaction is apply install-build-deps",
"Uses npm ci and the committed lockfile in a temporary stage",
"Uses Playwright --with-deps on Linux and validates chromium.launch before replacement",
"Preserves the existing runtime if staging, installation, launch, or replacement fails"
Expand Down
2 changes: 1 addition & 1 deletion plugins/architecture/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "architecture",
"version": "0.8.2",
"version": "0.8.4",
"description": "Scans an existing codebase for module-level architecture friction — shallow modules, seam leaks, and locality gaps — using Ousterhout's deep-module lens, presents candidates as a self-contained HTML report, and runs an interview loop on the selected candidate before handing off for planning. Also charts a discovered set of repositories as a C4 system landscape plus an application-portfolio table, and records an architecture decision into the repository's existing ADR convention.",
"author": {
"name": "Melodic Software",
Expand Down
15 changes: 15 additions & 0 deletions plugins/architecture/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,21 @@
All notable changes to the `architecture` plugin are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.

## [0.8.4]

### Fixed

- Restored the landscape and ADR capabilities in the plugin description that main already shipped,
so the catalog names every skill this plugin still carries.

## [0.8.3]

### Changed

- **improve:** the inert `shell: bash` frontmatter key is dropped, since no injection remains in the file (prompt-audit follow-up F12).
- **reference/topic-docs.md:** the contract pointer is the raw markdown URL again (the blob view with a section anchor is not fetchable at run time), and the slug derivation accepts a scan focus named in conversation as well as in the arguments (prompt-audit follow-up F2).
- Point the improve gather block at the dated composition record (prompt-audit follow-up F6)

## [0.8.2]

### Changed
Expand Down
7 changes: 4 additions & 3 deletions plugins/architecture/reference/topic-docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
How the `improve` skill resolves the destination for its durable per-topic artifact.

Implements the topic-docs convention:
<https://github.com/melodic-software/claude-code-plugins/blob/main/docs/conventions/topic-docs/README.md#runtime-guards>.
<https://raw.githubusercontent.com/melodic-software/claude-code-plugins/main/docs/conventions/topic-docs/README.md>.
The contract owns every general rule — tiers, schema, resolution order, slug spec, runtime guards,
no-project-root fallback, non-interactive/forked mode. This document records only this plugin's
deltas.
Expand Down Expand Up @@ -34,8 +34,9 @@ file per run because nothing documented reclaims the temp tree — not a delta o

## Slug derivation

Per the contract's precedence, from this skill's inputs: an explicit scan-focus argument (e.g. a
named module or path) → the current branch name. Form and collision rules are the contract's.
Per the contract's precedence, from this skill's inputs: the scan focus the user named, whether in
the invocation arguments or in the conversation (a module, a subsystem, a path), then the current
branch name. Form and collision rules are the contract's.

## Guards

Expand Down
5 changes: 3 additions & 2 deletions plugins/architecture/skills/improve/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ description: "Scan an existing codebase for module-level friction and architectu
argument-hint: "[action] (e.g., deepening)"
user-invocable: true
disable-model-invocation: false
shell: bash
metadata:
workflow-stage: plan
summary: Scan the codebase for shallow modules and friction, then design the chosen fix several ways
Expand All @@ -25,7 +24,9 @@ anything to decide about.
Treat a failure (not a repository, git unavailable) as an unknown value and carry on. Keep these as
separate body Bash calls rather than pre-compute lines: the harness runs a skill's whole pre-compute
block as one shell invocation, and a worktree-isolated session refuses a compound command that
contains git.
contains git. The dated record for that composition claim is the `source-control` plugin's
[worktree/reference/gather-block.md](https://raw.githubusercontent.com/melodic-software/claude-code-plugins/main/plugins/source-control/skills/worktree/reference/gather-block.md),
"The pre-compute block runs as one shell invocation".

## Variables

Expand Down
2 changes: 1 addition & 1 deletion plugins/autonomy/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "autonomy",
"version": "0.23.2",
"version": "0.23.4",
"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",
Expand Down
16 changes: 16 additions & 0 deletions plugins/autonomy/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,22 @@
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.23.4]

### Changed

- setup and the reference contracts: the AGENTS.md platform bound gains one dated owner record with two sites citing it; the telemetry, escalation, routines, trigger-dispatch, and verification-topology claims are verified, corrected, dated, or removed (prompt-audit follow-up F6)

## [0.23.3]

### Changed

- **reference/autonomous-pipeline-reminder.md:** a long session or context is not a reason to stop (prompt-audit follow-up F18).
- **guardrails, prerequisite-resolution, setup:** name the marketplace's liveness-assertion and seam-phrasing conventions and the `source-control` config-resolution reference by class in words, replacing six relative links that resolve only in the marketplace checkout and that the plugin's org- and vendor-agnostic contract forbids writing as URLs (prompt-audit follow-up F8).
- **reference/autonomous-pipeline-reminder.md, README:** the pasted block now tells a run to check that its evidence supports a state-changing command before running it, and to recover from an error or a gap rather than end the turn on one; the README provenance stamp carries the new source, its fetch date, and a widened recheck trigger (prompt-audit follow-up F2).
- **reference prose:** dropped the sampling-parameter rebuttal from the verification-topology lane rationale, the drafting history from the reminder's applicability section, and two sentences restating rules their own files state elsewhere (prompt-audit follow-up F2).
- Hook prompt text: drop the issue number from the two lane-stop-gate skip notices that reach model context (prompt-audit follow-up F2)

## [0.23.2]

### Changed
Expand Down
10 changes: 7 additions & 3 deletions plugins/autonomy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,15 @@ state and records that binding.
Fable 5 prompting guide, section "Rare cases of early stopping", folded together with the
companion checkpoint instruction that section asks to be paired with it
(<https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5>,
fetched 2026-08-08). It is authored locally rather than reproduced, per this repository's rule
fetched 2026-08-08). The evidence-before-a-state-changing-command sentence and the
recover-instead-of-stopping sentence carry the two behaviors the Claude Fable 5.1 prompting guide
adds in its section "Finish the whole task"
(<https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1>,
fetched 2026-09-06). Both are authored locally rather than reproduced, per this repository's rule
against hand-copying upstream content. The citation lives here rather than in the contract file
because `reference/` docs are written in surface classes and may not name vendors.
**Recheck trigger:** that section changing its clause set, or a second model guide stating the same
guidance in materially different terms.
**Recheck trigger:** either section changing its clause set, a later model guide restating this
guidance in materially different terms, or a model release that supersedes Claude Fable 5.1.
- **Guided setup** (`/autonomy:setup`): discovery-first interview of the adopting org's state,
covering role homes, substrate availability, and budget posture, that writes a schema-versioned
binding under
Expand Down
4 changes: 2 additions & 2 deletions plugins/autonomy/hooks/lane-stop-gate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -465,15 +465,15 @@ if [[ "$ENABLED" != "true" ]]; then
# legitimately-armed-then-stale case; do NOT blame a repo env block.
if hook::notice_once "autonomy-lane-stop-gate-stale-arm" "$INPUT"; then
hook::emit_skip_notice "Stop" \
"autonomy lane-stop gate: this session carries an arm id but no matching arm record is present (it may have expired, been claimed by another session, or been cleaned up), so the gate stays off (#1784). Relaunch the lane through the claude-ops lane launcher to re-arm it."
"autonomy lane-stop gate: this session carries an arm id but no matching arm record is present (it may have expired, been claimed by another session, or been cleaned up), so the gate stays off. Relaunch the lane through the claude-ops lane launcher to re-arm it."
fi
elif [[ "${CLAUDE_PLUGIN_OPTION_LANE_STOP_GATE_ENABLED:-}" == "true" ]]; then
# Enablement claimed on the untrusted env channel with no arm id at all —
# a pre-0.12.0 launcher still delivering over --settings/env, or a repo
# env block attempting the pre-#1784 attack. Surfacing it beats silence.
if hook::notice_once "autonomy-lane-stop-gate-untrusted-enable" "$INPUT"; then
hook::emit_skip_notice "Stop" \
"autonomy lane-stop gate: enablement was claimed on the environment channel only — no managed/user setting configures it and no arm record matches — so the gate stays off (#1784). A lane launched expecting the gate needs the current claude-ops lane launcher (which arms it at launch); a repository cannot opt sessions in via its own settings.json env block."
"autonomy lane-stop gate: enablement was claimed on the environment channel only — no managed/user setting configures it and no arm record matches — so the gate stays off. A lane launched expecting the gate needs the current claude-ops lane launcher (which arms it at launch); a repository cannot opt sessions in via its own settings.json env block."
fi
fi
fi
Expand Down
Loading
Loading