diff --git a/README.md b/README.md index 9d7eb1c..acfef85 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,10 @@ A [Claude Code](https://claude.ai/code) plugin marketplace for **linter-driven d | | Plugin | Version | For | |---|--------|---------|-----| -| 🐹 | [`go-linter-driven-development`](go-linter-driven-development/README.md) | 2.15.1 | Go | -| 🐍 | [`python-linter-driven-development`](python-linter-driven-development/README.md) | 0.4.1 | Python | -| 🧩 | [`linter-driven-development`](linter-driven-development/README.md) | 0.5.0 | Any language without a binding — detects the language at run time | -| ⚛️ | [`ts-react-linter-driven-development`](ts-react-linter-driven-development/README.md) | 2.0.1 | TypeScript + React | +| 🐹 | [`go-linter-driven-development`](go-linter-driven-development/README.md) | 2.16.0 | Go | +| 🐍 | [`python-linter-driven-development`](python-linter-driven-development/README.md) | 0.5.0 | Python | +| 🧩 | [`linter-driven-development`](linter-driven-development/README.md) | 0.6.0 | Any language without a binding — detects the language at run time | +| ⚛️ | [`ts-react-linter-driven-development`](ts-react-linter-driven-development/README.md) | 2.1.0 | TypeScript + React | Plus the coding rules as a single document, for a project that does not use the plugin: diff --git a/go-linter-driven-development/.claude-plugin/plugin.json b/go-linter-driven-development/.claude-plugin/plugin.json index d94f17f..40d3f63 100644 --- a/go-linter-driven-development/.claude-plugin/plugin.json +++ b/go-linter-driven-development/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "go-linter-driven-development", - "version": "2.15.1", + "version": "2.16.0", "description": "Rules-as-data linter-driven development workflow for Go: 12 single-source rule files, thin directional skills (design, TDD implementation, refactoring, testing, review, documentation), a hunter/skeptic/critic review architecture with parallel single-rule reviewers, an over-abstraction skeptic, and a comment critic enforcing the Comment Value Toolbox, plus an OKF-conformant repo brain with a shippable CI conformance gate", "author": { "name": "Dan Mordechay" diff --git a/go-linter-driven-development/CHANGELOG.md b/go-linter-driven-development/CHANGELOG.md index 532da3a..6739421 100644 --- a/go-linter-driven-development/CHANGELOG.md +++ b/go-linter-driven-development/CHANGELOG.md @@ -5,6 +5,26 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio ## [Unreleased] +## [2.16.0] - 2026-10-18 + +### Changed + +- **A whole-repository review leaves the mutant question to scoped reviews.** On + `--all`, the hunter does not judge the question "does a mutant survive a leaf's + tests?". Its receipt reads `per-leaf, not judged`, and its `not reached:` line names + the three leaf directories with the most hits, each as the scoped review that + judges it (`/go-ldd-review `). A scoped review judges the question in full. The lead for + the mutant question also skips `cmd/`, `main.go` and `handlers/`. +- **The god file has a mechanical lead.** The question "is one feature's code spread + across layer directories?" lists the longest files in scope with `wc -l` and checks + each against revive's `file-length-limit` (450 lines). A file over the limit, or with + a `//nolint` that silences the limit, is a violation when it stands in for the + whole slice. +- **The review command says how to cover a large repository.** On a repository + larger than a few dozen source files, `--all` reports `PARTIAL coverage`. The + command names the form that covers everything: one review per directory + (`/go-ldd-review `). + ### Fixed - **A claim that something is missing needs a listing.** A rule hunter that reports @@ -14,6 +34,10 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio hunter once reported a test file as missing when it existed outside the scope. When the hunter's budget leaves no call for the listing, the claim appears in the hunter's `not reached:` line as `unverified`; the report never drops it. +- **A cluster title carries its rule ids.** The review reference shows every cluster + title as `🔗 CLUSTER: — `, the same form as the skill. Agents + followed the reference, so the rule ids were on the lines below the title, and the + report graders missed correct clusters. ## [2.15.1] - 2026-10-15 diff --git a/lang/generic/passthrough/.claude-plugin/plugin.json b/lang/generic/passthrough/.claude-plugin/plugin.json index 83a03dd..ed35253 100644 --- a/lang/generic/passthrough/.claude-plugin/plugin.json +++ b/lang/generic/passthrough/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "linter-driven-development", - "version": "0.5.0", + "version": "0.6.0", "description": "Rules-as-data linter-driven development workflow for any language: the same 12 rules, thin directional skills (design, TDD implementation, refactoring, testing, review, documentation) and hunter/skeptic/critic review as the Go plugin, with the language detected from the repository at run time and its own linter run instead of a bundled one; plus an OKF-conformant repo brain with a shippable CI conformance gate", "author": { "name": "Dan Mordechay" diff --git a/lang/generic/passthrough/CHANGELOG.md b/lang/generic/passthrough/CHANGELOG.md index 6b238b8..626a349 100644 --- a/lang/generic/passthrough/CHANGELOG.md +++ b/lang/generic/passthrough/CHANGELOG.md @@ -5,6 +5,25 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio ## [Unreleased] +## [0.6.0] - 2026-10-18 + +### Changed + +- **A whole-repository review leaves the mutant question to scoped reviews.** On + `--all`, the hunter does not judge the question "does a mutant survive a leaf's + tests?". Its receipt reads `per-leaf, not judged`, and its `not reached:` line names + the three leaf directories with the most hits, each as the scoped review that + judges it (`/ldd-review `). A scoped review judges the question in full. +- **The god file has a mechanical lead.** The question "is one feature's code spread + across layer directories?" lists the longest files in scope with `wc -l` and checks + each against the repository's own file-length limit, when its linter sets one. A file over the limit, or with + a suppression directive that silences the limit, is a violation when it stands in for the + whole slice. +- **The review command says how to cover a large repository.** On a repository + larger than a few dozen source files, `--all` reports `PARTIAL coverage`. The + command names the form that covers everything: one review per directory + (`/ldd-review `). + ### Fixed - **A claim that something is missing needs a listing.** A rule hunter that reports @@ -14,6 +33,10 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio hunter once reported a test file as missing when it existed outside the scope. When the hunter's budget leaves no call for the listing, the claim appears in the hunter's `not reached:` line as `unverified`; the report never drops it. +- **A cluster title carries its rule ids.** The review reference shows every cluster + title as `🔗 CLUSTER: — `, the same form as the skill. Agents + followed the reference, so the rule ids were on the lines below the title, and the + report graders missed correct clusters. ## [0.5.0] - 2026-10-15 diff --git a/lang/go/passthrough/.claude-plugin/plugin.json b/lang/go/passthrough/.claude-plugin/plugin.json index d94f17f..40d3f63 100644 --- a/lang/go/passthrough/.claude-plugin/plugin.json +++ b/lang/go/passthrough/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "go-linter-driven-development", - "version": "2.15.1", + "version": "2.16.0", "description": "Rules-as-data linter-driven development workflow for Go: 12 single-source rule files, thin directional skills (design, TDD implementation, refactoring, testing, review, documentation), a hunter/skeptic/critic review architecture with parallel single-rule reviewers, an over-abstraction skeptic, and a comment critic enforcing the Comment Value Toolbox, plus an OKF-conformant repo brain with a shippable CI conformance gate", "author": { "name": "Dan Mordechay" diff --git a/lang/go/passthrough/CHANGELOG.md b/lang/go/passthrough/CHANGELOG.md index 532da3a..6739421 100644 --- a/lang/go/passthrough/CHANGELOG.md +++ b/lang/go/passthrough/CHANGELOG.md @@ -5,6 +5,26 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio ## [Unreleased] +## [2.16.0] - 2026-10-18 + +### Changed + +- **A whole-repository review leaves the mutant question to scoped reviews.** On + `--all`, the hunter does not judge the question "does a mutant survive a leaf's + tests?". Its receipt reads `per-leaf, not judged`, and its `not reached:` line names + the three leaf directories with the most hits, each as the scoped review that + judges it (`/go-ldd-review `). A scoped review judges the question in full. The lead for + the mutant question also skips `cmd/`, `main.go` and `handlers/`. +- **The god file has a mechanical lead.** The question "is one feature's code spread + across layer directories?" lists the longest files in scope with `wc -l` and checks + each against revive's `file-length-limit` (450 lines). A file over the limit, or with + a `//nolint` that silences the limit, is a violation when it stands in for the + whole slice. +- **The review command says how to cover a large repository.** On a repository + larger than a few dozen source files, `--all` reports `PARTIAL coverage`. The + command names the form that covers everything: one review per directory + (`/go-ldd-review `). + ### Fixed - **A claim that something is missing needs a listing.** A rule hunter that reports @@ -14,6 +34,10 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio hunter once reported a test file as missing when it existed outside the scope. When the hunter's budget leaves no call for the listing, the claim appears in the hunter's `not reached:` line as `unverified`; the report never drops it. +- **A cluster title carries its rule ids.** The review reference shows every cluster + title as `🔗 CLUSTER: — `, the same form as the skill. Agents + followed the reference, so the rule ids were on the lines below the title, and the + report graders missed correct clusters. ## [2.15.1] - 2026-10-15 diff --git a/lang/python/passthrough/.claude-plugin/plugin.json b/lang/python/passthrough/.claude-plugin/plugin.json index 3d0c112..266bf85 100644 --- a/lang/python/passthrough/.claude-plugin/plugin.json +++ b/lang/python/passthrough/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "python-linter-driven-development", - "version": "0.4.1", + "version": "0.5.0", "description": "Rules-as-data linter-driven development workflow for Python: the same 12 rules, thin directional skills (design, TDD implementation, refactoring, testing, review, documentation) and hunter/skeptic/critic review as the Go plugin, rendered with Python knowledge — ruff, ty and mypy routing, pytest, dataclasses and Protocols, threads and asyncio, docstrings; plus an OKF-conformant repo brain with a shippable CI conformance gate", "author": { "name": "Dan Mordechay" diff --git a/lang/python/passthrough/CHANGELOG.md b/lang/python/passthrough/CHANGELOG.md index 7082a34..d637c49 100644 --- a/lang/python/passthrough/CHANGELOG.md +++ b/lang/python/passthrough/CHANGELOG.md @@ -5,6 +5,25 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio ## [Unreleased] +## [0.5.0] - 2026-10-18 + +### Changed + +- **A whole-repository review leaves the mutant question to scoped reviews.** On + `--all`, the hunter does not judge the question "does a mutant survive a leaf's + tests?". Its receipt reads `per-leaf, not judged`, and its `not reached:` line names + the three leaf directories with the most hits, each as the scoped review that + judges it (`/py-ldd-review `). A scoped review judges the question in full. The lead for + the mutant question also skips `handlers/`, `__main__.py`, `main.py` and `cli.py`. +- **The god file has a mechanical lead.** The question "is one feature's code spread + across layer directories?" lists the longest files in scope with `wc -l` and checks + each against 450 lines (ruff has no file-length rule). A file over the limit is a violation when it stands in for the + whole slice. +- **The review command says how to cover a large repository.** On a repository + larger than a few dozen source files, `--all` reports `PARTIAL coverage`. The + command names the form that covers everything: one review per directory + (`/py-ldd-review `). + ### Fixed - **A claim that something is missing needs a listing.** A rule hunter that reports @@ -14,6 +33,15 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio hunter once reported a test file as missing when it existed outside the scope. When the hunter's budget leaves no call for the listing, the claim appears in the hunter's `not reached:` line as `unverified`; the report never drops it. +- **A cluster title carries its rule ids.** The review reference shows every cluster + title as `🔗 CLUSTER: — `, the same form as the skill. Agents + followed the reference, so the rule ids were on the lines below the title, and the + report graders missed correct clusters. +- **The mutant hand check reads the error assertions.** The hand check opens the + leaf's test file, also when the file is outside the review's scope, and reads each + error assertion. An assertion that matches only a word all the leaf's errors share + (`match="tenant"`) lets a removed check or a changed message survive, and it is a + violation. The check runs once for each leaf file in scope, not only where a hit row points. ## [0.4.1] - 2026-10-15 diff --git a/lang/ts-react/passthrough/.claude-plugin/plugin.json b/lang/ts-react/passthrough/.claude-plugin/plugin.json index 1e9b84f..cb2c190 100644 --- a/lang/ts-react/passthrough/.claude-plugin/plugin.json +++ b/lang/ts-react/passthrough/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ts-react-linter-driven-development", - "version": "2.0.1", + "version": "2.1.0", "description": "Rules-as-data linter-driven development workflow for TypeScript + React: the same 12 rules, thin directional skills (design, TDD implementation, refactoring, testing, review, documentation) and hunter/skeptic/critic review as the Go plugin, rendered with TypeScript and React knowledge — ESLint and SonarJS routing, Vitest with React Testing Library and MSW, discriminated unions and `readonly` types, effects and query ownership, JSDoc; plus an OKF-conformant repo brain with a shippable CI conformance gate", "author": { "name": "Dan Mordechay" diff --git a/lang/ts-react/passthrough/CHANGELOG.md b/lang/ts-react/passthrough/CHANGELOG.md index 9261f59..95cb39b 100644 --- a/lang/ts-react/passthrough/CHANGELOG.md +++ b/lang/ts-react/passthrough/CHANGELOG.md @@ -5,6 +5,26 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio ## [Unreleased] +## [2.1.0] - 2026-10-18 + +### Changed + +- **A whole-repository review leaves the mutant question to scoped reviews.** On + `--all`, the hunter does not judge the question "does a mutant survive a leaf's + tests?". Its receipt reads `per-leaf, not judged`, and its `not reached:` line names + the three leaf directories with the most hits, each as the scoped review that + judges it (`/tsr-ldd-review `). A scoped review judges the question in full. The lead for + the mutant question also skips `.tsx` files, `components/`, `hooks/` and `context/`. +- **The god file has a mechanical lead.** The question "is one feature's code spread + across layer directories?" lists the longest files in scope with `wc -l` and checks + each against `sonarjs/max-lines` (600). A file over the limit, or with + a `max-lines` directive that silences the rule, is a violation when it stands in for the + whole slice. +- **The review command says how to cover a large repository.** On a repository + larger than a few dozen source files, `--all` reports `PARTIAL coverage`. The + command names the form that covers everything: one review per directory + (`/tsr-ldd-review `). + ### Fixed - **A claim that something is missing needs a listing.** A rule hunter that reports @@ -14,6 +34,15 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio hunter once reported a test file as missing when it existed outside the scope. When the hunter's budget leaves no call for the listing, the claim appears in the hunter's `not reached:` line as `unverified`; the report never drops it. +- **A cluster title carries its rule ids.** The review reference shows every cluster + title as `🔗 CLUSTER: — `, the same form as the skill. Agents + followed the reference, so the rule ids were on the lines below the title, and the + report graders missed correct clusters. +- **The mutant hand check reads the error assertions.** The hand check opens the + leaf's test file, also when the file is outside the review's scope, and reads each + error assertion. An assertion that matches only a word all the leaf's errors share + (`toThrow('tenant')`) lets a removed check or a changed message survive, and it is a + violation. ## [2.0.1] - 2026-10-15 diff --git a/linter-driven-development/.claude-plugin/plugin.json b/linter-driven-development/.claude-plugin/plugin.json index 83a03dd..ed35253 100644 --- a/linter-driven-development/.claude-plugin/plugin.json +++ b/linter-driven-development/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "linter-driven-development", - "version": "0.5.0", + "version": "0.6.0", "description": "Rules-as-data linter-driven development workflow for any language: the same 12 rules, thin directional skills (design, TDD implementation, refactoring, testing, review, documentation) and hunter/skeptic/critic review as the Go plugin, with the language detected from the repository at run time and its own linter run instead of a bundled one; plus an OKF-conformant repo brain with a shippable CI conformance gate", "author": { "name": "Dan Mordechay" diff --git a/linter-driven-development/CHANGELOG.md b/linter-driven-development/CHANGELOG.md index 6b238b8..626a349 100644 --- a/linter-driven-development/CHANGELOG.md +++ b/linter-driven-development/CHANGELOG.md @@ -5,6 +5,25 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio ## [Unreleased] +## [0.6.0] - 2026-10-18 + +### Changed + +- **A whole-repository review leaves the mutant question to scoped reviews.** On + `--all`, the hunter does not judge the question "does a mutant survive a leaf's + tests?". Its receipt reads `per-leaf, not judged`, and its `not reached:` line names + the three leaf directories with the most hits, each as the scoped review that + judges it (`/ldd-review `). A scoped review judges the question in full. +- **The god file has a mechanical lead.** The question "is one feature's code spread + across layer directories?" lists the longest files in scope with `wc -l` and checks + each against the repository's own file-length limit, when its linter sets one. A file over the limit, or with + a suppression directive that silences the limit, is a violation when it stands in for the + whole slice. +- **The review command says how to cover a large repository.** On a repository + larger than a few dozen source files, `--all` reports `PARTIAL coverage`. The + command names the form that covers everything: one review per directory + (`/ldd-review `). + ### Fixed - **A claim that something is missing needs a listing.** A rule hunter that reports @@ -14,6 +33,10 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio hunter once reported a test file as missing when it existed outside the scope. When the hunter's budget leaves no call for the listing, the claim appears in the hunter's `not reached:` line as `unverified`; the report never drops it. +- **A cluster title carries its rule ids.** The review reference shows every cluster + title as `🔗 CLUSTER: — `, the same form as the skill. Agents + followed the reference, so the rule ids were on the lines below the title, and the + report graders missed correct clusters. ## [0.5.0] - 2026-10-15 diff --git a/python-linter-driven-development/.claude-plugin/plugin.json b/python-linter-driven-development/.claude-plugin/plugin.json index 3d0c112..266bf85 100644 --- a/python-linter-driven-development/.claude-plugin/plugin.json +++ b/python-linter-driven-development/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "python-linter-driven-development", - "version": "0.4.1", + "version": "0.5.0", "description": "Rules-as-data linter-driven development workflow for Python: the same 12 rules, thin directional skills (design, TDD implementation, refactoring, testing, review, documentation) and hunter/skeptic/critic review as the Go plugin, rendered with Python knowledge — ruff, ty and mypy routing, pytest, dataclasses and Protocols, threads and asyncio, docstrings; plus an OKF-conformant repo brain with a shippable CI conformance gate", "author": { "name": "Dan Mordechay" diff --git a/python-linter-driven-development/CHANGELOG.md b/python-linter-driven-development/CHANGELOG.md index 7082a34..d637c49 100644 --- a/python-linter-driven-development/CHANGELOG.md +++ b/python-linter-driven-development/CHANGELOG.md @@ -5,6 +5,25 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio ## [Unreleased] +## [0.5.0] - 2026-10-18 + +### Changed + +- **A whole-repository review leaves the mutant question to scoped reviews.** On + `--all`, the hunter does not judge the question "does a mutant survive a leaf's + tests?". Its receipt reads `per-leaf, not judged`, and its `not reached:` line names + the three leaf directories with the most hits, each as the scoped review that + judges it (`/py-ldd-review `). A scoped review judges the question in full. The lead for + the mutant question also skips `handlers/`, `__main__.py`, `main.py` and `cli.py`. +- **The god file has a mechanical lead.** The question "is one feature's code spread + across layer directories?" lists the longest files in scope with `wc -l` and checks + each against 450 lines (ruff has no file-length rule). A file over the limit is a violation when it stands in for the + whole slice. +- **The review command says how to cover a large repository.** On a repository + larger than a few dozen source files, `--all` reports `PARTIAL coverage`. The + command names the form that covers everything: one review per directory + (`/py-ldd-review `). + ### Fixed - **A claim that something is missing needs a listing.** A rule hunter that reports @@ -14,6 +33,15 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio hunter once reported a test file as missing when it existed outside the scope. When the hunter's budget leaves no call for the listing, the claim appears in the hunter's `not reached:` line as `unverified`; the report never drops it. +- **A cluster title carries its rule ids.** The review reference shows every cluster + title as `🔗 CLUSTER: — `, the same form as the skill. Agents + followed the reference, so the rule ids were on the lines below the title, and the + report graders missed correct clusters. +- **The mutant hand check reads the error assertions.** The hand check opens the + leaf's test file, also when the file is outside the review's scope, and reads each + error assertion. An assertion that matches only a word all the leaf's errors share + (`match="tenant"`) lets a removed check or a changed message survive, and it is a + violation. The check runs once for each leaf file in scope, not only where a hit row points. ## [0.4.1] - 2026-10-15 diff --git a/ts-react-linter-driven-development/.claude-plugin/plugin.json b/ts-react-linter-driven-development/.claude-plugin/plugin.json index 1e9b84f..cb2c190 100644 --- a/ts-react-linter-driven-development/.claude-plugin/plugin.json +++ b/ts-react-linter-driven-development/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ts-react-linter-driven-development", - "version": "2.0.1", + "version": "2.1.0", "description": "Rules-as-data linter-driven development workflow for TypeScript + React: the same 12 rules, thin directional skills (design, TDD implementation, refactoring, testing, review, documentation) and hunter/skeptic/critic review as the Go plugin, rendered with TypeScript and React knowledge — ESLint and SonarJS routing, Vitest with React Testing Library and MSW, discriminated unions and `readonly` types, effects and query ownership, JSDoc; plus an OKF-conformant repo brain with a shippable CI conformance gate", "author": { "name": "Dan Mordechay" diff --git a/ts-react-linter-driven-development/CHANGELOG.md b/ts-react-linter-driven-development/CHANGELOG.md index 9261f59..95cb39b 100644 --- a/ts-react-linter-driven-development/CHANGELOG.md +++ b/ts-react-linter-driven-development/CHANGELOG.md @@ -5,6 +5,26 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio ## [Unreleased] +## [2.1.0] - 2026-10-18 + +### Changed + +- **A whole-repository review leaves the mutant question to scoped reviews.** On + `--all`, the hunter does not judge the question "does a mutant survive a leaf's + tests?". Its receipt reads `per-leaf, not judged`, and its `not reached:` line names + the three leaf directories with the most hits, each as the scoped review that + judges it (`/tsr-ldd-review `). A scoped review judges the question in full. The lead for + the mutant question also skips `.tsx` files, `components/`, `hooks/` and `context/`. +- **The god file has a mechanical lead.** The question "is one feature's code spread + across layer directories?" lists the longest files in scope with `wc -l` and checks + each against `sonarjs/max-lines` (600). A file over the limit, or with + a `max-lines` directive that silences the rule, is a violation when it stands in for the + whole slice. +- **The review command says how to cover a large repository.** On a repository + larger than a few dozen source files, `--all` reports `PARTIAL coverage`. The + command names the form that covers everything: one review per directory + (`/tsr-ldd-review `). + ### Fixed - **A claim that something is missing needs a listing.** A rule hunter that reports @@ -14,6 +34,15 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio hunter once reported a test file as missing when it existed outside the scope. When the hunter's budget leaves no call for the listing, the claim appears in the hunter's `not reached:` line as `unverified`; the report never drops it. +- **A cluster title carries its rule ids.** The review reference shows every cluster + title as `🔗 CLUSTER: — `, the same form as the skill. Agents + followed the reference, so the rule ids were on the lines below the title, and the + report graders missed correct clusters. +- **The mutant hand check reads the error assertions.** The hand check opens the + leaf's test file, also when the file is outside the review's scope, and reads each + error assertion. An assertion that matches only a word all the leaf's errors share + (`toThrow('tenant')`) lets a removed check or a changed message survive, and it is a + violation. ## [2.0.1] - 2026-10-15