Skip to content

Commit 465a2c6

Browse files
chore: bump to v0.9.1 — beta-polish release
Ships four post-v0.9.0 cleanups bundled as a single release: - fix(version): cross-runtime plugin-version resolution — adds plugin.toml and VERSION fallbacks to /add:version so Codex and Claude share the same skill body. Closes the last F-002 allowlist entry. - fix(claude): rule-parity in runtimes/claude/CLAUDE.md — adds the four M3 rules (cache-discipline, injection-defense, secrets-handling, telemetry) to the @rules/ imports; fixes stale "(15 files)" count → "(19 files)"; new tests/rule-parity/ regression guard. (F-011) - fix(validator): cache-discipline false-positive — narrow verb list (drop run/call, keep invoke/dispatch/sub-agent), make pattern order-agnostic. Clean full scan, strict-mode passes on the four remediated skills. (F-018) - feat(ci): guardrail suites workflow — runs 93 tests across 10 suites + validators + marketplace manifest check on every PR and main push. Clears the F-005 time-boxed exemption from the alpha→beta promotion. Maturity exemptions list in .add/config.json now empty — beta is un-caveated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 9d9a987 commit 465a2c6

71 files changed

Lines changed: 371 additions & 133 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.add/config.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://github.com/MountainUnicorn/add/config.schema.json",
3-
"version": "0.9.0",
3+
"version": "0.9.1",
44
"project": {
55
"name": "ADD",
66
"description": "Agent Driven Development \u2014 Claude Code plugin implementing an AI-native SDLC methodology",
@@ -12,9 +12,7 @@
1212
"promoted_from": "alpha",
1313
"promoted_date": "2026-04-23",
1414
"next_promotion_criteria": "Guardrail suite running in CI and release-blocking; real Claude + Codex install smoke in CI; per-runtime capability matrix in release notes; 60-day stability at beta; marketplace submission approved; 20+ projects using ADD.",
15-
"exemptions": [
16-
"F-005 guardrail CI wiring \u2014 time-boxed to v0.9.x; 10 test suites exist locally with 90 passing tests, lift into .github/workflows/ before v0.10"
17-
]
15+
"exemptions": []
1816
},
1917
"planning": {
2018
"current_milestone": "M3-pre-ga-hardening",

.github/workflows/guardrails.yml

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
name: Guardrail suites
2+
3+
# Runs every local fixture-based test suite plus the marketplace + frontmatter
4+
# validators. Release-blocking: closes F-005 (beta promotion exemption) and
5+
# codifies the 90-test safety net that v0.8.x and v0.9.0 shipped with but had
6+
# never actually run in CI.
7+
#
8+
# Each suite is a single shell script that exits non-zero on failure. The
9+
# matrix runs them in parallel for speed and so one failure doesn't mask
10+
# another. The marketplace-validate job also asserts the CLI's human-readable
11+
# "Validation failed" text, because `claude plugin validate` returns exit 0
12+
# even when the schema rejects (caught during v0.8.1 — F-001).
13+
14+
on:
15+
pull_request:
16+
push:
17+
branches: [main]
18+
19+
jobs:
20+
# ---------- Static validators (Python, no Claude/Codex CLI needed) ----------
21+
22+
frontmatter:
23+
name: Frontmatter validator
24+
runs-on: ubuntu-latest
25+
steps:
26+
- uses: actions/checkout@v4
27+
- uses: actions/setup-python@v5
28+
with:
29+
python-version: '3.12'
30+
- run: python3 scripts/validate-frontmatter.py
31+
32+
cache-discipline:
33+
name: Cache-discipline validator (strict, remediated skills)
34+
runs-on: ubuntu-latest
35+
steps:
36+
- uses: actions/checkout@v4
37+
- uses: actions/setup-python@v5
38+
with:
39+
python-version: '3.12'
40+
- run: |
41+
python3 scripts/validate-cache-discipline.py
42+
python3 scripts/validate-cache-discipline.py --strict \
43+
core/skills/tdd-cycle/ \
44+
core/skills/implementer/ \
45+
core/skills/reviewer/ \
46+
core/skills/verify/
47+
48+
# ---------- Fixture-based suites (bash + jq, no external tools) -------------
49+
50+
fixtures:
51+
name: "Fixture suite: ${{ matrix.suite }}"
52+
runs-on: ubuntu-latest
53+
strategy:
54+
fail-fast: false
55+
matrix:
56+
suite:
57+
- hooks/test-filter-learnings.sh
58+
- test-deletion-guardrail/test-test-deletion-guardrail.sh
59+
- codex-install/test-install-paths.sh
60+
- cache-discipline/test-cache-discipline.sh
61+
- secrets-handling/test-secrets-handling.sh
62+
- agents-md-sync/test-agents-md-sync.sh
63+
- telemetry-jsonl/test-telemetry-jsonl.sh
64+
- security/test-prompt-injection-defense.sh
65+
- rule-parity/test-rule-parity.sh
66+
steps:
67+
- uses: actions/checkout@v4
68+
- name: Install jq
69+
run: sudo apt-get update -qq && sudo apt-get install -y jq
70+
- name: Run tests/${{ matrix.suite }}
71+
run: bash tests/${{ matrix.suite }}
72+
73+
# ---------- Marketplace validation -----------------------------------------
74+
#
75+
# `claude plugin validate` exits 0 even when validation fails (discovered via
76+
# F-001). We grep the stdout for "Validation failed" to turn a silent failure
77+
# into a red CI light.
78+
79+
marketplace-validate:
80+
name: Claude marketplace manifest
81+
runs-on: ubuntu-latest
82+
steps:
83+
- uses: actions/checkout@v4
84+
85+
- name: Install Claude Code CLI
86+
run: |
87+
npm install -g @anthropic-ai/claude-code || {
88+
echo "::warning::Claude CLI install failed — skipping marketplace validation."
89+
echo "SKIP=1" >> "$GITHUB_ENV"
90+
}
91+
92+
- name: Validate root marketplace manifest
93+
if: env.SKIP != '1'
94+
run: |
95+
set +e
96+
out=$(claude plugin validate . 2>&1)
97+
rc=$?
98+
echo "$out"
99+
if echo "$out" | grep -q "Validation failed"; then
100+
echo "::error::Root marketplace manifest validation failed"
101+
exit 1
102+
fi
103+
exit "$rc"
104+
105+
- name: Validate plugin manifest
106+
if: env.SKIP != '1'
107+
run: |
108+
set +e
109+
out=$(claude plugin validate plugins/add 2>&1)
110+
rc=$?
111+
echo "$out"
112+
if echo "$out" | grep -q "Validation failed"; then
113+
echo "::error::Plugin manifest validation failed"
114+
exit 1
115+
fi
116+
exit "$rc"

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,25 @@ Hotfix. Fixes three findings from the plugin-family release-hardening review bef
2727

2828
_(Nothing yet — tracking items go here between releases.)_
2929

30+
## [0.9.1] — 2026-04-23
31+
32+
Beta-polish release. Closes the four follow-ups that accumulated after v0.9.0 shipped: the last plugin-family-review leak, the time-boxed beta-promotion CI exemption, the Claude rule-parity drift, and the cache-discipline validator false-positive that Swarm A flagged at M3 merge.
33+
34+
### Fixed
35+
36+
- **`/add:version` cross-runtime path resolution.** The skill only documented reading `${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json`, which has no Codex equivalent. Added a three-source fallback (`plugin.json``plugin.toml``VERSION`) so the same skill body works on both runtimes — first hit wins, silent fall-through when a source is absent. Removes the last F-002 allowlist entry in `tests/codex-install/test-install-paths.sh`.
37+
- **Claude rule-parity drift (F-011).** `runtimes/claude/CLAUDE.md` was importing 15 rules via `@rules/` — it's been stuck at that count since before M3. The four rules landed in v0.9.0 (`cache-discipline`, `injection-defense`, `secrets-handling`, `telemetry`) are now imported, and the "15 files" count in the Plugin Structure tree diagram is now "19 files". New regression test `tests/rule-parity/test-rule-parity.sh` prevents future drift: asserts every `core/rules/*.md` has a matching `@rules/` import and that the tree-diagram count matches reality.
38+
- **Cache-discipline validator false-positive on `core/skills/init/SKILL.md:1039` (F-018).** `scripts/validate-cache-discipline.py` was matching `/add:verify — run quality gates` (prose in `/add:init`'s output-preview block) as a sub-agent dispatch because its verb list included `run` and `call`. Tightened the 4th `DISPATCH_PATTERN` to require dispatch-specific verbs (`invoke`, `dispatch`, `sub-agent`) and made the regex order-agnostic so "Invoke the /add:test-writer skill" (verb-first prose in `/add:tdd-cycle`) still matches. Validator now passes clean on the full core tree and strict-mode passes on the four remediated skills.
39+
40+
### Added
41+
42+
- **Guardrail CI workflow** (`.github/workflows/guardrails.yml`) — closes the F-005 exemption from the v0.9.0 beta promotion. Runs every local fixture-based suite (93 tests across 10 suites) in parallel on PRs and pushes to main, plus frontmatter validation, cache-discipline validation (default + strict), and Claude marketplace manifest validation (with a grep guard because `claude plugin validate` exits 0 even on schema failure — discovered during v0.8.1 F-001).
43+
- **`tests/rule-parity/test-rule-parity.sh`** — drift guard for F-011. Three checks: every `core/rules/*.md` has a `@rules/` import in `runtimes/claude/CLAUDE.md`, every `@rules/` import points at a real file, and the tree-diagram count matches.
44+
45+
### Changed
46+
47+
- **Beta-promotion exemption cleared.** `.add/config.json` `maturity.exemptions` was holding `[F-005 guardrail CI wiring]` as a time-boxed promise from the v0.9.0 alpha→beta promotion. Now empty.
48+
3049
## [0.9.0] — 2026-04-23
3150

3251
**Pre-GA hardening.** Ships the full M3 milestone in a single coordinated release: seven feature specs built in parallel by agent swarms during a `/add:away` session, squash-merged sequentially with rebase resolutions, and promoted through the v0.8.1 hotfix after the plugin-family review surfaced three shipping bugs. **Maturity: alpha → beta.** ADD is now production-credible for the methodology it prescribes: TDD guardrails that bite, secrets handling that gates deploy, prompt-injection defense with a scan hook and threat model, Codex-native skill emission, OTel-aligned telemetry, stable-prefix cache discipline, tool-portable AGENTS.md generation, and a test-deletion guardrail that defends the signature TDD claim.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<br>
1111
<br>
1212
<a href="https://github.com/MountainUnicorn/add/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT"></a>
13-
<a href="#"><img src="https://img.shields.io/badge/version-0.9.0-brightgreen.svg" alt="Version"></a>
13+
<a href="#"><img src="https://img.shields.io/badge/version-0.9.1-brightgreen.svg" alt="Version"></a>
1414
<a href="#"><img src="https://img.shields.io/badge/Claude_Code-plugin-blueviolet.svg" alt="Claude Code Plugin"></a>
1515
</p>
1616

core/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.9.0
1+
0.9.1

core/skills/version/SKILL.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ Show the current ADD version, compare project config version to plugin version,
1111

1212
## Execution
1313

14-
1. **Read plugin version** from `${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json``version` field
14+
1. **Read plugin version** from `${CLAUDE_PLUGIN_ROOT}/` — try sources in order, first hit wins:
15+
1. `.claude-plugin/plugin.json``version` field (Claude runtime)
16+
2. `plugin.toml``version` field (Codex runtime)
17+
3. `VERSION` (plain-text, single line — fallback for both runtimes)
18+
19+
On the Claude runtime, source 1 is authoritative and sources 2–3 are absent. On the Codex runtime (`${CLAUDE_PLUGIN_ROOT}` resolves to `~/.codex/add`), source 1 is absent; read source 2 or 3. Never emit an error if source 1 is missing — fall through quietly.
1520
2. **Read project version** from `.add/config.json``version` field (if file exists)
1621
3. **Read core/VERSION** if accessible (development installs only)
1722

dist/codex/.agents/skills/add-agents-md/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
---
22
name: add-agents-md
3-
description: "[ADD v0.9.0] Generate or sync a portable AGENTS.md from ADD project state — writes, checks drift, or merges with hand-curated content"
3+
description: "[ADD v0.9.1] Generate or sync a portable AGENTS.md from ADD project state — writes, checks drift, or merges with hand-curated content"
44
argument-hint: "[--write|--check|--merge|--import] [--dry-run]"
55
---
66

7-
# ADD AGENTS.md Skill v0.9.0
7+
# ADD AGENTS.md Skill v0.9.1
88

99
Generate a portable [`AGENTS.md`](https://agents.md) at project root from the project's `.add/` state. `AGENTS.md` is the cross-tool open standard for project-level agent instructions — any agent (Claude Code, Cursor, Codex CLI, Windsurf, Amp, Devin, Copilot) will read it on session start. Publishing one lets mixed-toolchain teams respect the same invariants without installing ADD.
1010

dist/codex/.agents/skills/add-away/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
name: add-away
3-
description: "[ADD v0.9.0] Declare absence — get autonomous work plan for the duration"
3+
description: "[ADD v0.9.1] Declare absence — get autonomous work plan for the duration"
44
argument-hint: "[duration, e.g. '4 hours', '30 minutes', 'end of day']"
55
---
66

@@ -26,7 +26,7 @@ argument-hint: "[duration, e.g. '4 hours', '30 minutes', 'end of day']"
2626
2727
---
2828

29-
# ADD Away Command v0.9.0
29+
# ADD Away Command v0.9.1
3030

3131
The human is stepping away. Establish what work can proceed autonomously and what must wait.
3232

dist/codex/.agents/skills/add-back/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
---
22
name: add-back
3-
description: "[ADD v0.9.0] Return from absence — get briefing on autonomous work"
3+
description: "[ADD v0.9.1] Return from absence — get briefing on autonomous work"
44
---
55

6-
# ADD Back Command v0.9.0
6+
# ADD Back Command v0.9.1
77

88
The human has returned. Provide a concise briefing on what happened during their absence.
99

dist/codex/.agents/skills/add-brand-update/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
name: add-brand-update
3-
description: "[ADD v0.9.0] Update project branding — new colors, fonts, tone, audit artifacts"
3+
description: "[ADD v0.9.1] Update project branding — new colors, fonts, tone, audit artifacts"
44
---
55

66
<!-- ADD AskUserQuestion shim (Codex) -->
@@ -25,7 +25,7 @@ description: "[ADD v0.9.0] Update project branding — new colors, fonts, tone,
2525
2626
---
2727

28-
# ADD Brand Update Command v0.9.0
28+
# ADD Brand Update Command v0.9.1
2929

3030
Update the project's branding configuration with new materials and audit existing generated artifacts for brand consistency. Optionally apply fixes to bring artifacts in line with the new brand.
3131

0 commit comments

Comments
 (0)