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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "claude-code",
"source": "./plugins/claude-code",
"description": "Reference implementation of the Ironclad standard — multi-agent dev harness for Claude Code.",
"version": "0.9.2",
"version": "0.9.3",
"author": {
"name": "qwerfunch"
},
Expand Down
44 changes: 44 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,50 @@ All notable changes to Cladding are documented here.
Format: [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/).
Versioning: [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html).

## [0.9.3] — The review packet shows how the contract itself moved (2026-08-04)

**In one line:** a pull request now shows which acceptance criteria were rewritten while the code changed, and the architecture gate stops failing on generated build output.

### Added

- **"How the acceptance criteria moved" in `clad report`.** For every feature spec entry the range touched, each criterion is classified new / rewritten / removed / unchanged by matching on its id, alongside the entry's status transition and any EARS pattern shift. Rewriting a requirement to match what you built leaves code and spec agreeing, so no drift check can see it; this is the surface that does.
- **"Declared tests" in `clad report`** — for each criterion, whether the test it names also changed in the range, telling apart a real path that did not change, a concrete path with no file behind it, and a placeholder the harness suggested. It grades nothing: whether a test genuinely verifies its criterion is not mechanically decidable, so the packet shows what was declared and leaves the judgement to the reviewer. The dangling-path case matters because every other existence check in the harness only looks at finished features.
- **The packet names the revision it compared against**, when that is not the commit you named. The range anchors on the merge base of your ref and HEAD, which on a branch that forked earlier is a different commit — an audit artifact that silently compared against something else cannot be reproduced by hand.

### Fixed

- **The architecture gate no longer scans generated build output.** A bundler's output legitimately contains mutual imports, so scanning it reported circular dependencies that exist in no hand-written file — and blocked the gate on them. `dist`, `build`, `out`, `coverage`, `target`, `.next`, `.nuxt`, `.output`, `.svelte-kit` and `.vite` are now excluded, matched at the repository root only, so a source directory that merely happens to be named `build/` deeper in the tree is still scanned. `dist`, `coverage` and the framework caches are excluded at any depth, because a monorepo package or a front-end subdirectory keeps its bundle one level down; `build`, `out` and `target` stay anchored at the root, because they name real source directories often enough that excluding them deeper would drop hand-written code from the scan.

**If your project has its own madge exclusion in force, cladding passes none of its own and your rules are the only ones that apply** — madge replaces its configured exclusions with a command-line flag rather than merging them, so the two cannot coexist. That is decided the way madge decides it: by reading `.madgerc` up the directory tree, plus `$HOME` and `/etc`, and by checking that an exclusion is actually set rather than that a file merely exists.
- **A review range that forked earlier no longer charges the base branch's commits to the range under review.**
- **The packet described itself as four sections when it renders six** — in `clad report --help`, in the module that assembles it, and in the acceptance criterion that enumerates them. The criterion appears as `REWRITTEN` in this release's own packet, which is the correct outcome.
- **A section lead asserted that the code had been changed to match a rewritten criterion.** The population is deliberately status-blind, so the line also sat above entries with no code yet; it is now conditional.
- **A rewritten obligation could pass as unchanged.** The criterion comparison read only the statement, the pattern and the trigger — not `action` and `response`, which state the obligation itself and which four out of five criteria in this project carry. Rewriting one of them classified as no change at all; in this repository's own history that hid 31 rewrites.
- **An instruction the schema rejects.** The `planner` brief asked for an `archive_reason` on a removed acceptance criterion, but that field exists only at feature level and the criterion schema refuses unknown keys — following the instruction failed the sync barrier.
- **A failing scanner said what KIND of problem it found, never which one.** The architecture
stage reported "the code has an import loop" and stopped there, because the code that builds
the message preferred the tool's progress output over its report — madge writes its progress
to one stream and the numbered cycle list to the other — and then cut what survived to two
hundred characters. The gate now shows the list, and the terminal prints the specifics under
the plain sentence instead of replacing them with it. An adopter spent sixteen days on this
and recorded the wrong cause; in a controlled run, three of three agents given the old build
"fixed" it by deleting or rewriting their own build output.
- **Nothing said what language to write a spec entry in.** Four adopter projects diverged on
their own — two reached nearly all Korean titles, two stayed fully English — because the
question was never answered anywhere. The managed AGENTS.md block now answers it: English by
default, but match the entries already in the spec, because those are the project's own voice
and they cannot go stale the way a setting can. Asking for another language covers the title,
the notes and the statement, and carries forward on its own; existing entries are never
rewritten into another language. Only four words are fixed — `when`, `while`, `if`, `where` —
because the gate matches them literally, and only as the FIRST word of a condition, so
`when 앱이 종료될 때` is valid.
- **Nothing shipped to an adopter said how to write an acceptance criterion.** The managed
AGENTS.md block now carries the EARS table — which trigger word each pattern requires, with a
working example per row — and a test asserts every example in it against the real validator,
so the table cannot drift from the rule it teaches. `docs/` is not in the published package,
so agents were reverse-engineering the rules from the minified bundle.
- **Stale and self-contradicting counts across the six READMEs**, where feature and test-file totals disagreed with the spec and, in places, with each other inside the same file.

## [0.9.2] — Completions record whether anything checked them independently (2026-07-26)

**In one line:** every finished feature is now marked `independent` or `self-certified` from the evidence it actually recorded, and cladding stops prescribing how you arrange your agents.
Expand Down
14 changes: 7 additions & 7 deletions README.html
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ <h1>cladding</h1>
<p class="badges">
<a href="https://github.com/qwerfunch/ironclad"><img src="https://img.shields.io/badge/ironclad-L4%20conformant-brightgreen" alt="ironclad"></a>
<a href="https://github.com/qwerfunch/ironclad"><img src="https://img.shields.io/badge/spec-v0.0.23-blue" alt="spec"></a>
<img src="https://img.shields.io/badge/tests-2736%2F2736-brightgreen" alt="tests">
<img src="https://img.shields.io/badge/tests-2815%2F2815-brightgreen" alt="tests">
<img src="https://img.shields.io/badge/detectors-41-brightgreen" alt="detectors">
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-lightgrey" alt="license"></a>
</p>
Expand Down Expand Up @@ -271,7 +271,7 @@ <h1>cladding</h1>
</div>

<p style="text-align:center;font-size:15px;color:#475569;max-width:760px;margin:14px auto 0">
cladding builds <strong>itself with cladding too</strong> — 266 of its 270 features cleared this same gate, the first L4 implementation of the Ironclad standard.
cladding builds <strong>itself with cladding too</strong> — 269 of its 273 features cleared this same gate, the first L4 implementation of the Ironclad standard.
</p>

<!-- ─────────────── What changes ─────────────── -->
Expand Down Expand Up @@ -556,7 +556,7 @@ <h2>Status</h2>
<tr style="border:none">
<td style="text-align:center;width:140px;background:#f8fafc;padding:18px 10px;border-radius:8px;border:none">
<div style="font-size:11px;color:#64748b;letter-spacing:1.5px;text-transform:uppercase;font-weight:600">version</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">v0.9.2</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">v0.9.3</div>
<div style="font-size:11px;color:#64748b">2026-07</div>
</td>
<td style="text-align:center;width:140px;background:#dcfce7;padding:18px 10px;border-radius:8px;border:none">
Expand All @@ -566,7 +566,7 @@ <h2>Status</h2>
</td>
<td style="text-align:center;width:140px;background:#f8fafc;padding:18px 10px;border-radius:8px;border:none">
<div style="font-size:11px;color:#64748b;letter-spacing:1.5px;text-transform:uppercase;font-weight:600">tests</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">2736<span style="font-size:16px;color:#94a3b8">/2736</span></div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">2815<span style="font-size:16px;color:#94a3b8">/2815</span></div>
<div style="font-size:11px;color:#64748b">all pass</div>
</td>
<td style="text-align:center;width:140px;background:#f8fafc;padding:18px 10px;border-radius:8px;border:none">
Expand All @@ -576,13 +576,13 @@ <h2>Status</h2>
</td>
<td style="text-align:center;width:140px;background:#f8fafc;padding:18px 10px;border-radius:8px;border:none">
<div style="font-size:11px;color:#64748b;letter-spacing:1.5px;text-transform:uppercase;font-weight:600">features</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">270</div>
<div style="font-size:11px;color:#64748b">266 done · self-spec</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">273</div>
<div style="font-size:11px;color:#64748b">269 done · self-spec</div>
</td>
</tr>
</table>

<p style="text-align:center;font-size:13px;color:#64748b;margin-top:12px">248 test files · 6 capabilities · coverage drop blocked by the COVERAGE_DROP detector</p>
<p style="text-align:center;font-size:13px;color:#64748b;margin-top:12px">249 test files · 6 capabilities · coverage drop blocked by the COVERAGE_DROP detector</p>

<blockquote style="border-left:4px solid #cbd5e1;padding:8px 16px;margin:24px 0;background:#f8fafc;color:#475569;font-size:14px"><strong>Road to Ironclad 1.0</strong> — 1.0 locks only when <em>two independent implementations pass the L4 conformance fixtures</em> (<a href="https://github.com/qwerfunch/ironclad/blob/main/GOVERNANCE.md">GOVERNANCE § 1</a>). cladding is the first.</blockquote>

Expand Down
8 changes: 4 additions & 4 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<p align="center">
<a href="https://github.com/qwerfunch/ironclad"><img src="https://img.shields.io/badge/ironclad-L4%20conformant-brightgreen" alt="ironclad"/></a>
<a href="https://github.com/qwerfunch/ironclad"><img src="https://img.shields.io/badge/spec-v0.0.23-blue" alt="spec"/></a>
<img src="https://img.shields.io/badge/tests-2736%2F2736-brightgreen" alt="tests"/>
<img src="https://img.shields.io/badge/tests-2815%2F2815-brightgreen" alt="tests"/>
<img src="https://img.shields.io/badge/detectors-41-brightgreen" alt="detectors"/>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-lightgrey" alt="license"/></a>
</p>
Expand All @@ -31,7 +31,7 @@
- **たどれる** — **出荷されたものは記録に残る**: 何を検証したかはコミットされた内容に刻まれ、誰がいつやったかはローカルのセッション台帳に、なぜかは spec に残る — だから引き継ぎもレビューも、掘り起こさずに済む。
- **拡張しても揺るがない** — 人と AI が増えれば、普通は衝突と乖離も増える。だが全員が一つの spec を基準に働くので、それらは自動でせき止められる — だから規模を広げても崩れない。

cladding は **自分自身も cladding で作っている** — 270 個の feature のうち 266 個が同じゲートを通過した、[Ironclad](https://github.com/qwerfunch/ironclad) 標準を L4 で実装した最初の事例だ。
cladding は **自分自身も cladding で作っている** — 273 個の feature のうち 269 個が同じゲートを通過した、[Ironclad](https://github.com/qwerfunch/ironclad) 標準を L4 で実装した最初の事例だ。

<!-- ─────────────── What changes ─────────────── -->

Expand Down Expand Up @@ -347,9 +347,9 @@ clad update # 3. プロジェクト接続と派生状態を更新

| Version | 準拠レベル | Tests | Gate | Features |
|---|---|---|---|---|
| v0.9.2(2026-07) | L4 · [自己申告](https://github.com/qwerfunch/ironclad/blob/main/GOVERNANCE.md) | 2736 / 2736 | 15 段階 · 41 detectors | 270(266 done) |
| v0.9.3(2026-08) | L4 · [自己申告](https://github.com/qwerfunch/ironclad/blob/main/GOVERNANCE.md) | 2815 / 2815 | 15 段階 · 41 detectors | 273(269 done) |

<sub>248 test files · capability 6 個 · カバレッジ低下は COVERAGE_DROP detector がブロック</sub>
<sub>249 test files · capability 6 個 · カバレッジ低下は COVERAGE_DROP detector がブロック</sub>

> **Ironclad 1.0 への道** — 1.0 は *独立した二つの実装が L4 準拠フィクスチャを通過してはじめて* 確定する([GOVERNANCE § 1](https://github.com/qwerfunch/ironclad/blob/main/GOVERNANCE.md))。cladding はその一つ目だ。

Expand Down
14 changes: 7 additions & 7 deletions README.ko.html
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ <h1>cladding</h1>
<p class="badges">
<a href="https://github.com/qwerfunch/ironclad"><img src="https://img.shields.io/badge/ironclad-L4%20conformant-brightgreen" alt="ironclad"></a>
<a href="https://github.com/qwerfunch/ironclad"><img src="https://img.shields.io/badge/spec-v0.0.23-blue" alt="spec"></a>
<img src="https://img.shields.io/badge/tests-2736%2F2736-brightgreen" alt="tests">
<img src="https://img.shields.io/badge/tests-2815%2F2815-brightgreen" alt="tests">
<img src="https://img.shields.io/badge/detectors-41-brightgreen" alt="detectors">
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-lightgrey" alt="license"></a>
</p>
Expand All @@ -304,7 +304,7 @@ <h1>cladding</h1>
</div>

<p class="dogfood-line">
cladding은 <strong>자기 자신도 cladding으로 만든다</strong> — 기능 270개266개가 같은 게이트를 통과했고, Ironclad 표준을 L4로 구현한 첫 사례다.
cladding은 <strong>자기 자신도 cladding으로 만든다</strong> — 기능 273개269개가 같은 게이트를 통과했고, Ironclad 표준을 L4로 구현한 첫 사례다.
</p>

<!-- ─────────────── 무엇이 달라지나 ─────────────── -->
Expand Down Expand Up @@ -590,7 +590,7 @@ <h2>Status</h2>
<tr style="border:none">
<td style="text-align:center;width:140px;background:#f8fafc;padding:18px 10px;border-radius:8px;border:none">
<div style="font-size:11px;color:#64748b;letter-spacing:1.5px;text-transform:uppercase;font-weight:600">version</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">v0.9.2</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">v0.9.3</div>
<div style="font-size:11px;color:#64748b">2026-07</div>
</td>
<td style="text-align:center;width:140px;background:#dcfce7;padding:18px 10px;border-radius:8px;border:none">
Expand All @@ -600,7 +600,7 @@ <h2>Status</h2>
</td>
<td style="text-align:center;width:140px;background:#f8fafc;padding:18px 10px;border-radius:8px;border:none">
<div style="font-size:11px;color:#64748b;letter-spacing:1.5px;text-transform:uppercase;font-weight:600">tests</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">2736<span style="font-size:16px;color:#94a3b8">/2736</span></div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">2815<span style="font-size:16px;color:#94a3b8">/2815</span></div>
<div style="font-size:11px;color:#64748b">all pass</div>
</td>
<td style="text-align:center;width:140px;background:#f8fafc;padding:18px 10px;border-radius:8px;border:none">
Expand All @@ -610,13 +610,13 @@ <h2>Status</h2>
</td>
<td style="text-align:center;width:140px;background:#f8fafc;padding:18px 10px;border-radius:8px;border:none">
<div style="font-size:11px;color:#64748b;letter-spacing:1.5px;text-transform:uppercase;font-weight:600">features</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">270</div>
<div style="font-size:11px;color:#64748b">266 done · 자기 스펙</div>
<div style="font-size:24px;font-weight:800;color:#0f172a;margin:8px 0;letter-spacing:-0.5px">273</div>
<div style="font-size:11px;color:#64748b">269 done · 자기 스펙</div>
</td>
</tr>
</table>

<p style="text-align:center;font-size:13px;color:#64748b;margin-top:12px">248 test files · capability 6개 · coverage는 COVERAGE_DROP detector가 하락 차단</p>
<p style="text-align:center;font-size:13px;color:#64748b;margin-top:12px">249 test files · capability 6개 · coverage는 COVERAGE_DROP detector가 하락 차단</p>

<blockquote style="border-left:4px solid #cbd5e1;padding:8px 16px;margin:24px 0;background:#f8fafc;color:#475569;font-size:14px"><strong>Ironclad 1.0까지의 길</strong> — 1.0은 <em>독립적인 두 개의 구현이 L4 검증 셋을 통과해야</em> 잠긴다 (<a href="https://github.com/qwerfunch/ironclad/blob/main/GOVERNANCE.md">GOVERNANCE § 1</a>). cladding이 첫 번째.</blockquote>

Expand Down
Loading
Loading