You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Merge origin/main into fix/domain-critic-loads-agent-definition
Resolve CHANGELOG.md: main released code-review v3.7.1 (#194), so this
branch's entry moves to v3.7.2 above it and plugin.json bumps to match.
Without the bump the plugin-version-bump CI job fails against the new
merge base.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+20-1Lines changed: 20 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,11 +4,30 @@ All notable changes to the claude-plugins project will be documented in this fil
4
4
5
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Entries are listed newest-first; each plugin section is treated as released when merged to `main`.
6
6
7
-
### code-review v3.7.1
7
+
### code-review v3.7.2
8
8
9
9
#### Fixed
10
10
- **A project-declared domain critic now loads its own `.claude/agents/<critic-name>.md`.** Domain critics spawn as the generic `code-review:code-review-worker` and receive only their name as a quoted `CRITIC_DOMAIN` string, so a project that defines the critic's entire method in an agent file of the same name got none of it — the only context-loading line in the domain critic prompt was the unranked "Read the repository CLAUDE.md for project context", which sits after the hard `FIRST…THEN…` block. Across three real `/code-review` runs in a consuming repo (`cr-51875`, `cr-95074`, `cr-97905`), zero of twelve spawned workers obeyed that line; the one critic that did read project doctrine got there by spontaneously grepping its own domain token, and self-describing critic names (`api-architect`, `auth-security-expert`) never self-grep at all. The critic still ran and still emitted plausible findings, with nothing in the output artifact recording that its definition was never loaded. `derive-spawn-spec` now resolves `.claude/agents/<critic-name>.md` and, when the file exists, puts its path on the domain critic descriptor as `agent_definition_file`; `cmd_route` does the same for the fast path's PASS 3 under `route.domain_critic_definitions` (both keys are omitted entirely when no such file exists). The `spawn-reviewers` skill turns that path into a non-negotiable first step in the critic's prompt — read the definition before the patches file, follow it in full, and say so in the output if the read fails. A critic with no agent file, which is the common case, produces a byte-identical descriptor, routing payload, and prompt to before. Filename convention only: a definition whose frontmatter `name` differs from its filename is not resolved, and symlinks and non-regular files are refused (the pipeline reviews untrusted checkouts).
11
11
12
+
### code-review v3.7.1
13
+
14
+
#### Fixed
15
+
- Override-cache tests no longer depend on the wall-clock date. Three tests pinned an override's `asserted_at` to a fixed `2026-05-29` timestamp and asserted the override was honored — by `verify-prepare` short-circuiting into `override_hits`, and by the prepare-then-consolidate paths that route an override to `RE_ASSERTED`. Once that fixed timestamp aged past the 90-day `overrides` cache TTL, the overrides were correctly treated as expired and the three tests began failing with no accompanying code change. They now derive `asserted_at` relative to the current time, so they exercise the honored-override path regardless of when the suite runs.
16
+
17
+
#### Changed
18
+
- Test helper `_stale_cached_at()` renamed to `_iso_days_ago()` so the name matches its documented behavior (an ISO-8601 timestamp N days in the past, used for both within-TTL and past-TTL fixtures); all call sites updated, and the two override TTL boundary tests now delegate to it instead of inlining the same `datetime.now(timezone.utc) - timedelta(...)` expression.
19
+
20
+
### code v1.14.10
21
+
22
+
#### Added
23
+
- Contract test suite `test_decision_table_skill_contract.py` pinning the new decision-table skill guarantees: `Not aligned` as a terminal workflow stop, required coexisting-source interaction and precedence rows, shared-corpus production-boundary parity for executable twins, and row-ID-to-test traceability in `Required Tests`.
24
+
25
+
#### Changed
26
+
- Hardened the `decision-table` skill's alignment gate: `Final Alignment Status: Not aligned` is now a terminal workflow stop, not a report-only status. No PR creation, merge, completion signal, or success closeout may follow until the artifact is re-verified as `Aligned`; fixable repo-local findings remain unresolved work and cannot be normalized into a successful handoff. The human-facing closeout for a `Not aligned` run must state that downstream PR/merge/completion is blocked, name every unresolved blocker, and give the exact next action and owner. A matching common-miss item ("Not-aligned status treated as success") and a contract-heavy review bullet enforce the stop during review-prevention passes.
27
+
- Decision rows now carry stable row IDs, and `Required Tests` is a traceability table instead of a prose list. The `Current Code` and `Intended Change` tables gain a `Row ID` column, and each required test maps to its decision-row IDs with a positive control, a wrong-input or mixed-state negative case, the real production boundary exercised, and expected evidence. Every material row must be covered by at least one mapped test or carried into `Not aligned` with a blocker; a test listed without row IDs or without the negative case needed to distinguish the row's branch is a named review-prevention anti-pattern.
28
+
- New "Executable policy twins and parity" edge-case category: when one behavior or policy has multiple executable twins (a pure helper, SQL predicate, route, worker, producer, batch path, or recovery path), one shared scenario corpus must exercise every twin through its real production boundary and assert identical decisions. Source-string, AST-presence, and SQL-shape assertions are supplemental only and never establish parity, and a negative shape assertion that requires a policy predicate, identity term, join, or branch to be absent is flagged as pinning missing policy: if it permits divergence, the row is `Not aligned` until corrected. Two new review-prevention anti-patterns cover parity inferred from separate tests and shape assertions that pin missing policy.
29
+
- New "Coexisting sources and precedence" edge-case category: when multiple evidence, authority, history, cache, or fallback sources can coexist, singleton rows are insufficient. The table must add a bounded interaction set (pairwise plus code-identified high-risk intersections, never an unbounded Cartesian product) covering legacy or absent evidence alongside fresh valid evidence, corrupt or undated evidence alongside fresh valid evidence, irrelevant historical evidence alongside a current authoritative record, tied or conflicting current records, and source/state precedence, stating which source wins and why. Singleton-only source coverage is a named review-prevention anti-pattern.
python/config/cli.json Declarative argparse spec the helper CLI builds its subparsers from
52
+
python/config/stages.json Declarative stage table backing `prepare-run`'s `run_plan.json` and `run-prefix`
53
+
python/signal_taxonomy.json Signal taxonomy loaded by signal extraction; its bytes are hashed into the extraction cache key
54
+
python/conftest.py Shared pytest fixtures and finding factories for the co-located tests
51
55
python/test_code_review_helpers.py Unit tests for the helper CLI
52
56
python/golden_fixture_harness.py Golden fixture harness: replays canonical inputs through helper subcommands and diffs against expected envelopes (PLN-719 Phase 8)
53
57
python/test_golden_fixtures.py Pytest driver that runs every fixture under tools/python/fixtures/
54
-
python/fixtures/<name>/ Per-fixture directory (config.yaml + inputs/ + expected/); 3 full scenarios + 6 README-stubs for future coverage
58
+
python/fixtures/<name>/ Per-fixture directory (config.yaml + inputs/ + expected/); 4 full scenarios + 3 README-stubs for future coverage
55
59
python/prefix_golden_harness.py Prefix golden harness + subprocess A/B parity oracle: walks the deterministic prefix against real git fixtures — in-process for golden snapshots, and per-stage-subprocess vs `run-prefix` for byte-equal parity (PLN-1229 Phase 0/1)
56
60
python/test_prefix_golden.py Pytest driver for the prefix harness: determinism oracle + golden diff across the prefix_fixtures/ matrix
0 commit comments