wicked-garden 12.33.0 → 12.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"name": "wicked-garden", "owner": {"name": "Mike Parcewski"}, "plugins": [{"name": "wicked-garden", "source": "./", "description": "Your coding agent already plans and swarms \u2014 Wicked Garden is the curated toolkit for what it can't: proof-not-claims gates, code links grep can't see, deterministic refactor, cross-session memory, real multi-model second opinions. Don't fight the harness; fill its gaps. The gate needs wicked-vault (a self-contained infra peer, installed directly) and re-derives through garden's built-in engine; estate/bus are opt-in layers (wicked-testing and wicked-brain are retired \u2014 QE ships in-catalog as the qe domain, memory lives in wicked-estate).", "version": "12.33.0"}], "version": "12.33.0"}
1
+ {"name": "wicked-garden", "owner": {"name": "Mike Parcewski"}, "plugins": [{"name": "wicked-garden", "source": "./", "description": "Your coding agent already plans and swarms \u2014 Wicked Garden is the curated toolkit for what it can't: proof-not-claims gates, code links grep can't see, deterministic refactor, cross-session memory, real multi-model second opinions. Don't fight the harness; fill its gaps. The gate needs wicked-vault (a self-contained infra peer, installed directly) and re-derives through garden's built-in engine; estate/bus are opt-in layers (wicked-testing and wicked-brain are retired \u2014 QE ships in-catalog as the qe domain, memory lives in wicked-estate).", "version": "12.34.0"}], "version": "12.34.0"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wicked-garden",
3
- "version": "12.33.0",
3
+ "version": "12.34.0",
4
4
  "description": "Your coding agent's harness already plans and swarms; Wicked Garden is the curated toolkit for what it can't do alone. Proof, not claims \u2014 gates re-derive 'done' through the internal loom engine (fail-closed, independently attested via wicked-vault), so a self-asserted pass can't lie its way green. Relationships grep can't see \u2014 the wicked-estate code graph + injected bus/dispatch/capability/archetype edges power blast-radius & lineage. Plus deterministic multi-file refactor (wicked-patch), cross-session memory + knowledge (the mem domain over wicked-estate), real multi-model second opinions (jam:council), portable expertise as on-demand skill-refs, and evidence-gated testing (the in-catalog qe domain). It reads the shape of your work to apply the right rigor \u2014 steering, not a pipeline \u2014 then gets out of the way. The compiler stamps a self-contained evidence gate into any repo that runs with no wicked-garden installed. Don't fight the harness; fill its gaps. The evidence gate requires wicked-vault, a self-contained infra peer wicked-garden installs directly; wicked-bus is an opt-in layer \u2014 install what you'll use, the toolkit works without the rest.",
5
5
  "wicked_vault_version": "^0.5.0",
6
6
  "wicked_ledger_version": "^0.4.0",
package/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [12.34.0] — 2026-09-11
6
+
7
+ ### Changed
8
+ - **qe `author` / `review`: run what you claim, cite what you cover, deliver through the run (wave 6 — R4-r2, F-7R2-015/016).** The wave-6 acceptance review of a governed "New test" run found the worker had shipped a Playwright suite it never executed (it failed on its first check when run independently — 0 of 12 assertions reached), sold 22 pre-existing tests as a "29-scenario suite" without a single `file:line`, described wait-gating it had not written, and opened the PR itself with `gh pr create` from its shell — while seven default-allow gates passed it. The `wicked-garden-qe` router's `author` and `review` actions now carry the contract that makes that impossible to do honestly. **author** (`skills/qe/refs/author.md` § Verified-test contract, copied into every code-producing dispatch's args — a fork worker sees only its args): detect the repo's harness first (`package.json` scripts, `vitest`/`jest`/`playwright` configs, `pyproject.toml` pytest, an existing `e2e/` rig) and name the exact command; write BEHAVIOUR tests (observable outcome, never a mock asserting on a mock; know the source change that would fail each test); RUN every produced file with the harness's real command before claiming it and record file · exact command · result in the PLAN's execution table — a test not executed is `unverified`, never `covered`, never "passes"; claim pre-existing coverage only with `path:line` and report new vs pre-existing counts separately; label fixture-bound e2e `needs-fixture` with how to start it and run it against that fixture (selectors/test ids/text verified against the source); carry `not covered` rows for every intent gap; and NEVER `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase opens the PR (standalone, the human does). The PLAN's status vocabulary is closed: `covered` · `unverified` · `needs-fixture` · `failing` · `not covered`. **review** (`skills/qe/refs/review.md` § Reviewing produced tests, dispatched to `wicked-garden-qe-test-code-quality-auditor` §9, which grades in a dedicated produced-test mode where `PASS` is reachable — every claim verified at `path:line`, every produced test executed and green, no `unverified`; P1/P2-only → `CONDITIONAL`; any P0 → `FAIL` — with a guarded source-mutation restore that never `git checkout`s over the author's uncommitted edit): open every `covered` claim at its `file:line` and reclassify unsupported ones; require an execution record for every produced file and FAIL the plan (`[unexecuted-test]`) when one is missing or a `needs-fixture` e2e was never run against its fixture; mutate-or-reason about at least two tested behaviours (apply a source mutation, confirm the test fails, restore — or name the mutation and the catching assertion when the harness cannot run); flag implementation-shaped tests; check every e2e oracle against the source on the visited route; check scope honesty; and never open, edit, merge or push the PR — the verdict goes back to the run. The same rules land in the workers the dispatches reach: `wicked-garden-qe-test-automation-engineer` ("Run what you write"), `wicked-garden-qe-e2e-orchestrator` (fixture named + started, oracles checked against the source, wait for the state you assert), `wicked-garden-qe-ui-component-test-engineer`, and — as one shared run-before-claim / cite / never-ship block pointing at the contract by skill name — the ten code-producing Tier-2 specialists (`test-data-manager`, `contract-testing-engineer`, `integration-test-engineer`, `visual-regression-engineer`, `a11y-test-engineer`, `load-performance-engineer`, `fuzz-property-engineer`, `localization-test-engineer`, `observability-test-engineer`, `data-quality-tester`), so a direct invocation on the flat Codex/Pi/OpenCode layout is bound the same way as a router dispatch. Cross-CLI wording throughout (the 12.33 portability convention — no CLI-specific delivery mechanics; "the run's deliver phase opens the PR"); `tests/test_skill_portability.py` stays at 0 violations and the router stays at the 200-line cap.
9
+
10
+ ### Fixed
11
+ - **Domain schema bundle re-vendored at `1.2.0`.** `skills/domain/vendor/VERSION` was still `1.1.0` while the live owner (wicked-core `crates/wicked-governance/schemas/`) had moved to `1.2.0` with the STEERING unification's optional fields on `conformance-rules.schema.json`, so `tests/domain/test_schema_vendor_pin.py::test_vendored_bundle_version_matches_owner_when_present` failed whenever a sibling `wicked-core` checkout was present (CI, with no sibling, skipped it). Re-vendored from wicked-core `main` @ `e421e87` per the vendor README's procedure: `domain-model.schema.json` is confirmed byte-identical to the owner copy (same git blob), only `VERSION` and the README's bundle-history prose moved; the document contract stays `domain-model@1.0.0`.
12
+ - **`pyproject.toml` `version` documented as not a release anchor.** It had sat at `1.33.0` since the plugin was 1.x; the release train (`release.yml` → `npm version` → `.github/scripts/sync-plugin-version.mjs`) bumps package.json + `.claude-plugin/{plugin,marketplace}.json` only, this Python project is never built or published, and nothing reads the field — so instead of inventing a fourth anchor it is pinned to the `0.0.0` placeholder with the convention written above it (mirrored in `uv.lock`).
13
+
5
14
  ## [12.33.0] — 2026-09-11
6
15
 
7
16
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wicked-garden",
3
- "version": "12.33.0",
3
+ "version": "12.34.0",
4
4
  "type": "module",
5
5
  "description": "Curated toolkit for what AI coding agents can't do alone: evidence-gated work, codegraph relationships, deterministic multi-file refactor, multi-model second opinions, and cross-session memory. Installs as a Claude Code plugin.",
6
6
  "keywords": [
package/pyproject.toml CHANGED
@@ -1,6 +1,11 @@
1
1
  [project]
2
2
  name = "wicked-garden"
3
- version = "1.33.0"
3
+ # NOT a release anchor. The plugin's version lives in package.json and is synced into
4
+ # .claude-plugin/{plugin,marketplace}.json by `npm version` -> .github/scripts/sync-plugin-version.mjs
5
+ # when the vX.Y.Z tag runs release.yml. This Python project is never built or published (the hatch
6
+ # target exists only so uv can manage deps), nothing reads this field, and the release train does
7
+ # not bump it — PEP 621 requires a value, so it is pinned to the placeholder 0.0.0 (mirrored in uv.lock).
8
+ version = "0.0.0"
4
9
  description = "AI-Native SDLC delivered as a single Claude Code plugin"
5
10
  requires-python = ">=3.10"
6
11
  dependencies = [
@@ -53,7 +53,8 @@ def pinned_version() -> str:
53
53
  own ``metadata.schema_version`` const (== its ``$id`` version segment).
54
54
  Deliberately NOT the vendored bundle ``VERSION`` file — that tracks the
55
55
  owner's whole 4-schema bundle and moves when ANY sibling schema changes
56
- (1.0.0→1.1.0 added conformance-rules.schema.json; this schema stayed 1.0.0)."""
56
+ (1.0.0→1.1.0 added conformance-rules.schema.json, 1.1.0→1.2.0 changed only
57
+ that sibling's steering fields; this schema stayed 1.0.0 throughout)."""
57
58
  schema = load_schema()
58
59
  return schema["properties"]["metadata"]["properties"]["schema_version"]["const"]
59
60
 
@@ -15,7 +15,7 @@ is history, not the contract.
15
15
 
16
16
  | | |
17
17
  |---|---|
18
- | Bundle version (`VERSION`) | `1.1.0` — mirrors the owner's `schemas/VERSION` |
18
+ | Bundle version (`VERSION`) | `1.2.0` — mirrors the owner's `schemas/VERSION` (re-vendored 2026-09-11 from wicked-core `main` @ `e421e87`) |
19
19
  | Schema contract version (`$id` / `metadata.schema_version`) | `1.0.0` |
20
20
  | Schema `$id` | `https://wickedagile.com/schemas/domain-model/1.0.0` |
21
21
  | Canonical source | `wicked-core/crates/wicked-governance/schemas/domain-model.schema.json` |
@@ -25,7 +25,9 @@ is history, not the contract.
25
25
 
26
26
  The **bundle** `VERSION` bumps when ANY schema in the owner's 4-file bundle
27
27
  changes (the 1.0.0→1.1.0 bump added `conformance-rules.schema.json` to the
28
- bundle — this file was untouched). The **contract version** a document carries (`metadata.schema_version`,
28
+ bundle; the 1.1.0→1.2.0 bump was the STEERING unification's optional fields on
29
+ `conformance-rules.schema.json` — this file was byte-untouched both times). The
30
+ **contract version** a document carries (`metadata.schema_version`,
29
31
  const-pinned by the schema, matching the `$id` segment) is independent — the
30
32
  schemas document that independence themselves. Documents emitted here still carry
31
33
  `schema_version: "1.0.0"`.
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
@@ -69,8 +69,7 @@ action; multi-model deliberation is `jam` council; in-run crew review is
69
69
  { test -f ".wicked-qe/config.json" || test -f ".wicked-testing/config.json"; } || echo "ERR_NO_CONFIG"
70
70
  ```
71
71
 
72
- On `ERR_NO_CONFIG`, run § setup first (it is safe to auto-run: it only
73
- scaffolds `.wicked-qe/` and registers a project record).
72
+ On `ERR_NO_CONFIG`, run § setup first (safe to auto-run: it only scaffolds `.wicked-qe/` and registers a project record).
74
73
 
75
74
  ## setup — per-project initialization
76
75
 
@@ -87,10 +86,15 @@ scaffolds `.wicked-qe/` and registers a project record).
87
86
 
88
87
  ## author — scenarios, test code, fixtures
89
88
 
90
- 1. Read `refs/author.md` — full playbook.
89
+ 1. Read `refs/author.md` — full playbook, incl. § Verified-test contract.
91
90
  2. Scenario authoring and/or framework test code via
92
91
  `wicked-garden-qe-{test-automation-engineer | acceptance-test-writer |
93
92
  test-data-manager | contract-testing-engineer}` per the playbook's table.
93
+ 3. Contract (binding for every produced test): detect the repo's harness; write
94
+ BEHAVIOUR tests against it; RUN every produced test and record command + result
95
+ in the PLAN — not executed = `unverified`, never `covered`; cite `file:line` for
96
+ any pre-existing coverage; label fixture-bound e2e `needs-fixture` with how to
97
+ start it. Never `gh pr create`/`git push` — the run's deliver phase opens the PR.
94
98
 
95
99
  ## campaign — repo recon + generated scenario ladder
96
100
 
@@ -122,10 +126,14 @@ scaffolds `.wicked-qe/` and registers a project record).
122
126
 
123
127
  ## review — independent verdicts
124
128
 
125
- 1. Read `refs/review.md` — full playbook.
129
+ 1. Read `refs/review.md` — full playbook, incl. § Reviewing produced tests.
126
130
  2. Evidence manifests → `wicked-garden-qe-acceptance-test-reviewer`;
127
131
  spec-vs-code → `wicked-garden-qe-semantic-reviewer`; suite quality →
128
132
  `wicked-garden-qe-code-analyzer` + the matching tier-2 specialist.
133
+ 3. A PLAN + produced tests (the `author` output): verify every `covered` claim at
134
+ its `file:line`, mutate-or-reason about ≥ 2 tested behaviours, and FAIL a plan
135
+ whose e2e (or any produced test) has no execution record. The reviewer never
136
+ opens or merges the PR — the verdict goes back to the run.
129
137
 
130
138
  ## insight — read-only ledger lens
131
139
 
@@ -156,21 +164,16 @@ Pipeline: `wicked-garden-qe-acceptance-test-{writer, executor, reviewer}` · `wi
156
164
 
157
165
  Planning: `wicked-garden-qe-{test-strategist, risk-assessor, testability-reviewer, requirements-quality-analyst}`.
158
166
 
159
- Review/insight: `wicked-garden-qe-{semantic-reviewer, code-analyzer,
160
- test-oracle, production-quality-engineer, release-readiness-engineer,
161
- flaky-test-hunter, coverage-archaeologist, exploratory-tester,
162
- test-code-quality-auditor, snapshot-hygiene-auditor, test-impact-analyzer,
163
- mutation-test-engineer}`.
164
-
165
- Domain specialists (all prefixed `wicked-garden-qe-`): `a11y-test-engineer` ·
166
- `security-test-engineer` · `compliance-test-engineer` ·
167
- `ai-feature-test-engineer` · `chaos-test-engineer` · `iac-test-engineer` ·
168
- `integration-test-engineer` · `localization-test-engineer` ·
169
- `observability-test-engineer` · `ui-component-test-engineer` ·
170
- `load-performance-engineer` · `visual-regression-engineer` ·
171
- `fuzz-property-engineer` · `data-quality-tester` · `e2e-orchestrator` ·
172
- `contract-testing-engineer` · `test-automation-engineer` ·
173
- `test-data-manager` · `incident-to-scenario-synthesizer`.
167
+ Review/insight: `wicked-garden-qe-{semantic-reviewer, code-analyzer, test-oracle,
168
+ production-quality-engineer, release-readiness-engineer, flaky-test-hunter, coverage-archaeologist,
169
+ exploratory-tester, test-code-quality-auditor, snapshot-hygiene-auditor, test-impact-analyzer, mutation-test-engineer}`.
170
+
171
+ Domain specialists (all prefixed `wicked-garden-qe-`): `a11y-test-engineer` · `security-test-engineer` ·
172
+ `compliance-test-engineer` · `ai-feature-test-engineer` · `chaos-test-engineer` · `iac-test-engineer` ·
173
+ `integration-test-engineer` · `localization-test-engineer` · `observability-test-engineer` ·
174
+ `ui-component-test-engineer` · `load-performance-engineer` · `visual-regression-engineer` ·
175
+ `fuzz-property-engineer` · `data-quality-tester` · `e2e-orchestrator` · `contract-testing-engineer` ·
176
+ `test-automation-engineer` · `test-data-manager` · `incident-to-scenario-synthesizer`.
174
177
 
175
178
  **Executor-vs-advisor twins** (reciprocal NOT-THIS-WHEN contracts): qe specialists RUN tools and
176
179
  write evidence + ledger verdict rows; their garden twins advise. a11y ↔ `product-a11y-expert`;
@@ -182,19 +185,16 @@ AC quality ↔ `product-requirements-analyst`; AI-feature probes ↔ `agentic-sa
182
185
  - **Evidence + config contract (shared with crew/ledger — do not rename):**
183
186
  `.wicked-qe/config.json`, `.wicked-qe/evidence/<run-id>/`,
184
187
  `.wicked-qe/wicked-qe.db`.
185
- - **wicked-ledger** (npm, pinned via `wicked_ledger_version` in plugin.json):
186
- DomainStore CRUD, fixed-SQL oracle queries, `buildManifest`. Import-style
187
- snippets need the package resolvable from the project
188
- (`npm i --no-save wicked-ledger`).
189
- - **`{WT_LIB}` helpers**: specialist playbooks reference helper modules that
190
- ship in-catalog at `scripts/qe/lib/` (ported from the
191
- retired wicked-testing package in Phase 6c) — resolve <!-- historical -->
188
+ - **wicked-ledger** (npm, pinned via `wicked_ledger_version` in plugin.json): DomainStore CRUD,
189
+ fixed-SQL oracle queries, `buildManifest`. Import-style snippets need the package resolvable
190
+ from the project (`npm i --no-save wicked-ledger`).
191
+ - **`{WT_LIB}` helpers**: specialist playbooks reference helper modules that ship in-catalog at
192
+ `scripts/qe/lib/` (ported from the retired wicked-testing package in Phase 6c) — resolve <!-- historical -->
192
193
  `WT_LIB="$(wicked-garden path scripts/qe/lib)"`.
193
194
 
194
195
  ## Integration with wicked-crew
195
196
 
196
- Engaged during **build** (author + execute), **test/review** phases
197
- (execute + accept + review), and **ship** gates (release-readiness via
198
- insight/review). Crew routes the `qe` specialist per `specialist.json`;
199
- gates read verdict rows from the ledger — the pipeline never self-declares
200
- a crew gate passed.
197
+ Engaged during **build** (author + execute), **test/review** phases (execute + accept + review),
198
+ and **ship** gates (release-readiness via insight/review). Crew routes the `qe` specialist per
199
+ `specialist.json`; gates read verdict rows from the ledger — the pipeline never self-declares a
200
+ crew gate passed, and no qe action pushes or opens a PR — the run's deliver phase delivers.
@@ -66,27 +66,113 @@ framework.
66
66
  - Framework: {jest | pytest | playwright | vitest | go test | ... | detect from project}
67
67
 
68
68
  ## Instructions
69
- 1. Detect the project's test framework if not specified (presence of
70
- `vitest.config.*`, `jest.config.*`, `pyproject.toml` with pytest, etc.).
71
- 2. For every public function / endpoint / component in scope, produce a test
72
- that exercises a happy path AND at least one negative / edge case.
69
+ 1. Detect the project's test harness if not specified (`package.json`
70
+ `scripts.test` / `test:e2e`, `vitest.config.*`, `jest.config.*`,
71
+ `playwright.config.*`, `pyproject.toml` with pytest, an existing `e2e/`
72
+ rig) and name the exact run command. Match what is there — never add a runner.
73
+ 2. For every public function / endpoint / component in scope, produce a
74
+ BEHAVIOUR test that exercises a happy path AND at least one negative /
75
+ edge case — assert on what the caller observes, not on internal structure.
73
76
  3. Use existing fixtures where present; don't hand-roll test data if the
74
77
  project has factories.
75
78
  4. Follow the project's file-layout convention (co-located vs `tests/`).
76
-
77
- Return the path(s) written and a one-line per-file summary."""
79
+ 5. RUN every file you produced with the harness's real command and record
80
+ file · exact command · result (`N passed / N failed`) in the PLAN's
81
+ execution table. A file you did not run is `unverified` — never `covered`,
82
+ never "passes". Pre-existing coverage is claimed only with `path:line`.
83
+ A test that needs a server, seed data or a build is `needs-fixture` with
84
+ how to start it — run it against that fixture before you claim it.
85
+ 6. Do NOT `git push`, `gh pr create` or merge — the run's deliver phase
86
+ opens the PR; leave the files on the working tree and report the paths.
87
+
88
+ Return the path(s) written, the execution table, the `unverified` and
89
+ `not covered` rows, and a one-line per-file summary."""
78
90
  )
79
91
  ```
80
92
 
81
93
  Specialized dispatches swap the `skill` id for the right worker (see the
82
94
  table above). For an OpenAPI spec, use `wicked-garden-qe-contract-testing-engineer`; for the
83
95
  3-role acceptance pipeline's test-plan phase, use `wicked-garden-qe-acceptance-test-writer`.
96
+ Instructions 1, 5 and 6 travel with EVERY code-producing dispatch (not the
97
+ acceptance writer — its plans are run by the executor) — a fork worker sees only
98
+ its args, so the contract below is copied into them, not assumed.
99
+
100
+ ## Verified-test contract (binding for every produced test)
101
+
102
+ Written after the wave-6 acceptance review of a governed "New test" run (R4-r2 /
103
+ F-7R2-015): the worker shipped a Playwright suite it never executed (it failed on
104
+ its first line when run independently), sold 22 pre-existing tests as a
105
+ "29-scenario suite", described waits it had not written, and opened the PR
106
+ itself. None of that is authoring. Every dispatch in this playbook carries the
107
+ rules below, and the `review` action (`refs/review.md` § Reviewing produced
108
+ tests) re-derives each one.
109
+
110
+ 1. **Detect the harness before writing a line.** Read `package.json` `scripts`
111
+ (`test`, `test:e2e`, `typecheck`), `vitest.config.*` / `jest.config.*` /
112
+ `playwright.config.*`, `pyproject.toml` `[tool.pytest.ini_options]` /
113
+ `pytest.ini` / `conftest.py`, an `e2e/` or `tests/e2e/` directory and how its
114
+ existing rigs start their fixture, `Cargo.toml`, `go.mod`. Name the harness
115
+ and the exact command in the PLAN. Match what is there; never add a runner.
116
+ 2. **Behaviour, not implementation.** Assert what a user or caller observes —
117
+ rendered DOM, response status/body, file contents, exit code, the arguments a
118
+ mocked boundary received. Not internal structure, not "the mock was called",
119
+ never a snapshot of a mock. For each test, know the change to the source that
120
+ would make it fail; a test with no such change is tautological — drop it.
121
+ 3. **Run what you write — before you claim it.** Execute every produced test
122
+ file with the harness's real command (`npx vitest run <file>`,
123
+ `python -m pytest <file>`, `npx playwright test <file>`, the rig's own
124
+ `python3 e2e/<rig>.py`). Record in the PLAN's execution table: file, exact
125
+ command, result (`N passed / N failed`, duration), commit or timestamp. A
126
+ test you did not execute is `unverified` — never `covered`, never "passes".
127
+ A failing test is fixed and re-run, or shipped as `failing` with the reason
128
+ — never described as green. "All tests pass" without the table is a claim,
129
+ not evidence.
130
+ 4. **Cite pre-existing coverage or don't claim it.** A `covered` row for a
131
+ test you did not write carries `path:line` of the `it` / `test` /
132
+ `def test_` and what it asserts. No citation → `unverified`. Report
133
+ "N new" and "M pre-existing (cited)" as separate counts — never a padded
134
+ total.
135
+ 5. **Fixture-bound e2e is labelled and started.** A browser or API test that
136
+ needs a server, seed data or a build is `needs-fixture`; the PLAN says how
137
+ to start it (build step, command, port, env) — copy the repo's own rig
138
+ convention. Run it against that fixture before claiming; verify every
139
+ selector, test id and text against the source (`grep` the `data-testid`,
140
+ read the render rule that produces the text). If the fixture cannot start
141
+ here, the row is `unverified — fixture unavailable: <reason>` and the reply
142
+ says so.
143
+ 6. **Say what you did not cover.** The PLAN carries `not covered` rows for
144
+ every part of the intent without a test — no UI control exists, out of
145
+ scope, blocked — with the reason. Silence is a false claim.
146
+ 7. **Delivery belongs to the run, not to you.** Leave the tests on the working
147
+ tree / run branch and report the paths. Never `git push`, `gh pr create`,
148
+ `gh pr merge`, or any remote-writing command — inside a wicked-crew run the
149
+ run's deliver phase opens the PR (evaluator ≠ creator: the acceptance gate
150
+ reads the evidence the deliver phase records); standalone, the human opens
151
+ it.
152
+
153
+ ### PLAN execution table (required shape)
154
+
155
+ | Row | Status | Evidence the row must carry |
156
+ |---|---|---|
157
+ | a test you wrote | `covered` | `<file>` · `<exact command>` · `<N passed / N failed>` · `<sha or time>` |
158
+ | a pre-existing test | `covered` | `<path:line>` · what it asserts |
159
+ | written, not executed | `unverified` | why (not run / `fixture unavailable: <reason>`) |
160
+ | needs a server / build / seed | `needs-fixture` | how to start it · then its execution row |
161
+ | executed and red | `failing` | the failure and why it ships red |
162
+ | an intent gap | `not covered` | why (no control exists / out of scope / blocked) |
163
+
164
+ The status vocabulary is closed. `covered` requires an execution row (new) or a
165
+ `path:line` citation (pre-existing); the reviewer FAILS a PLAN that breaks it,
166
+ and FAILS any PLAN whose e2e has no execution row.
84
167
 
85
168
  ## Tier-2 specialists this skill routes to
86
169
 
87
- For domain-specific test authoring, dispatch the matching specialist. Each
88
- returns test code and/or scenarios in its domain — do not merge their output
89
- verbatim; fold it into the authoring reply:
170
+ For domain-specific test authoring, dispatch the matching specialist with the
171
+ block above — instructions 1, 5 and 6 included. Each specialist's own SKILL.md
172
+ also carries the contract's run-before-claim / cite / never-ship block, so a
173
+ direct invocation on any CLI is bound the same way. Each returns test code
174
+ and/or scenarios in its domain — do not merge their output verbatim; fold it
175
+ into the authoring reply:
90
176
 
91
177
  | Trigger | Specialist |
92
178
  |------------------------------------------------------|---------------------------------------------|
@@ -109,9 +195,14 @@ Scenario files use the format in [refs/scenario-format.md](refs/scenario-format.
109
195
  - Test code in the project's test directory matching the project's framework,
110
196
  OR
111
197
  - Both, when authoring scenarios that have automated companions
198
+ - For test code, ALWAYS a PLAN carrying the execution table above — harness +
199
+ command, per-file results, `unverified` / `needs-fixture` / `not covered`
200
+ rows — in the run's deliverable, or where the repo already keeps test prose
201
+ (`docs/`, `.product/`); inside the test tree only if the repo already does that
112
202
 
113
203
  Emits `wicked.qe.scenario.authored` and/or `wicked.test.strategy.generated` on the
114
- bus when present.
204
+ bus when present. The authoring reply never says a test passes without its
205
+ execution row, and never opens or pushes a PR — the run's deliver phase does.
115
206
 
116
207
  ## Legacy invocations (absorbed in 0.4.0)
117
208
 
@@ -45,6 +45,7 @@ Arguments map onto the dispatch table below:
45
45
  | A run's evidence manifest | `wicked-garden-qe-acceptance-test-reviewer` |
46
46
  | Spec + implementation (post-code divergence) | `wicked-garden-qe-semantic-reviewer` |
47
47
  | Test suite path | `wicked-garden-qe-code-analyzer` + Tier-2 |
48
+ | A PLAN + the produced tests it claims (the `author` output) | `wicked-garden-qe-test-code-quality-auditor` — § Reviewing produced tests |
48
49
  | Production metrics, post-deploy | `wicked-garden-qe-production-quality-engineer` |
49
50
 
50
51
  ### Dispatch block (executable)
@@ -95,6 +96,105 @@ Reviewers work from evidence and spec, not from the executor's story.
95
96
  forked invocation, scrubbed `context.md` via `{WT_LIB}/context-md-validator.mjs`)
96
97
  to keep its verdict honest. Do not pre-narrate what it should find.
97
98
 
99
+ ## Reviewing produced tests (the `author` output: a PLAN + test files)
100
+
101
+ When the input is a PLAN with an execution table plus the test files it claims
102
+ — the `review` phase of a governed test-authoring run, or any "are these new
103
+ tests any good" — the reviewer re-derives every claim; it never takes the
104
+ author's word. Written after the wave-6 acceptance review (R4-r2 / F-7R2-015),
105
+ where seven default-allow gates passed a Playwright suite nobody had run.
106
+ Dispatch `wicked-garden-qe-test-code-quality-auditor` with the block below;
107
+ where the harness is runnable it re-runs the produced files itself.
108
+
109
+ 1. **Every `covered` claim is opened at its `file:line`.** Confirm the test
110
+ exists, that its assertion is the behaviour the row names, and that the
111
+ count of `it` / `test` / `def test_` blocks matches the PLAN's numbers (new
112
+ vs pre-existing reported separately). A `covered` row without a citation,
113
+ or whose citation does not hold, is reclassified `unverified` and is a
114
+ finding; a padded total is a finding.
115
+ 2. **Every produced file has an execution record** — file · exact command ·
116
+ result. Re-run at least the produced files when the harness is available
117
+ and compare with the record. A produced file with no record, a record with
118
+ no result, or a `needs-fixture` e2e that was never run against its fixture
119
+ → **the plan FAILS** (`[unexecuted-test]`), whatever else holds. The
120
+ "evidence-gated" label is decided here, not by the author.
121
+ 3. **Mutate or reason — at least two behaviours.** For ≥ 2 tested behaviours
122
+ either apply a deliberate source mutation (swallow the error, invert the
123
+ guard, drop the branch), re-run the test, confirm it FAILS, and restore the
124
+ source — guarded: `git status --porcelain -- <file>` must be empty before
125
+ you mutate (otherwise copy the file aside and restore from the copy — never
126
+ `git checkout`, which would also discard the author's uncommitted edit), and
127
+ `git diff --quiet -- <file>` afterwards proves the tree is byte-identical;
128
+ or — when you cannot run — write the specific mutation and the assertion
129
+ line that would catch it. A test for which no failing mutation can be named
130
+ is tautological → that row FAILS.
131
+ 4. **Behaviour vs implementation.** Flag tests that assert internal structure,
132
+ a mock asserting on a mock, a snapshot of a fixture, or that would still
133
+ pass with the implementation deleted.
134
+ 5. **e2e oracles are checked against the source.** For every selector, test id
135
+ and text an e2e waits on, confirm it is rendered on the route the test
136
+ visits under the fixture the PLAN names (read the component; `grep` the
137
+ `data-testid`). An oracle that can never match is `[scenario-defect]`.
138
+ 6. **Scope honesty.** The PLAN's `not covered` rows must name what the intent
139
+ asked for and why it is absent; an intent area with no row and no test is
140
+ a finding.
141
+ 7. **The verdict goes back to the run.** The reviewer never opens, edits or
142
+ merges the PR and never pushes — the run's deliver phase (or the human)
143
+ does; a reviewer that ships is a creator grading itself.
144
+
145
+ Verdict vocabulary (`MODE=produced-test`): **`PASS`** only when 1–7 hold with
146
+ zero findings — every `covered` claim verified at its `path:line`, every
147
+ produced test executed and green (your re-run reproduces the record), no
148
+ `unverified` or `failing` row; **`CONDITIONAL`** with the fixes listed when only
149
+ P1/P2 rows fail (implementation-shaped test, padded total, silent scope gap,
150
+ style); **`FAIL`** on any `[unexecuted-test]`, red produced test, tautological
151
+ test, unsupported-`covered` claim, or `[scenario-defect]` oracle. Cite
152
+ `file:line` for every finding. The auditor's §9 carries the same rule.
153
+
154
+ Dispatch fallback as in § Dispatch block above: without a Skill tool, open the
155
+ named skill's `SKILL.md` and carry the args out inline.
156
+
157
+ ```
158
+ Skill(
159
+ skill="wicked-garden-qe-test-code-quality-auditor",
160
+ args="""Review the produced tests named in the PLAN below against the qe
161
+ `review` playbook's "Reviewing produced tests" rules. Re-derive every claim.
162
+
163
+ ## Mode
164
+ MODE: produced-test — grade per the auditor's §9 produced-test verdict
165
+ (`PASS` reachable), not its §5 audit.
166
+
167
+ ## PLAN
168
+ {path to the PLAN carrying the execution table}
169
+
170
+ ## Produced files
171
+ {paths}
172
+
173
+ ## Instructions
174
+ 1. Open every `covered` row at its file:line; reclassify unsupported rows
175
+ `unverified`; recount new vs pre-existing tests.
176
+ 2. Confirm every produced file has an execution record (file · command ·
177
+ result). None — or a `needs-fixture` e2e never run against its fixture —
178
+ is VERDICT=FAIL `[unexecuted-test]`.
179
+ 3. Re-run the produced files when the harness is available; compare with
180
+ the record.
181
+ 4. Mutate-or-reason about at least two tested behaviours; name the failing
182
+ mutation and the assertion that catches it; restore any mutated source
183
+ (guarded: clean `git status` on the file first, `git diff --quiet` after).
184
+ 5. Check every e2e selector / test id / text against the source on the
185
+ visited route under the named fixture.
186
+ 6. Check the PLAN's `not covered` rows against the intent.
187
+ 7. Flag implementation-shaped tests: internal structure, a mock asserting on
188
+ a mock, a snapshot of a fixture, or one that would pass with the
189
+ implementation deleted.
190
+
191
+ Return `VERDICT={PASS|CONDITIONAL|FAIL} MODE=produced-test` — PASS only with
192
+ every claim verified at path:line, every produced test executed and green, no
193
+ `unverified` — and per-row findings with file:line. Do NOT push, open, edit or
194
+ merge a PR — the run's deliver phase delivers."""
195
+ )
196
+ ```
197
+
98
198
  ## Tier-2 specialists this skill routes to
99
199
 
100
200
  For domain-specific reviews, dispatch the specialist. Each returns a verdict
@@ -117,7 +217,9 @@ or a list of findings the skill folds into the review output:
117
217
  ## Verdict semantics
118
218
 
119
219
  - `PASS` — evidence + spec agree, tests exercise what was changed
120
- - `FAIL` — assertion unsatisfied, evidence contradicts, or spec-code divergence
220
+ - `FAIL` — assertion unsatisfied, evidence contradicts, spec-code divergence, or
221
+ a produced test with no execution record (`[unexecuted-test]` — an e2e nobody
222
+ ran is a FAIL, never a PASS on paper)
121
223
  - `N-A` — reviewable item doesn't apply (must be justified)
122
224
  - `SKIP` — applicable but deferred (ticket required)
123
225
  - `CONDITIONAL` — approve with listed fixes before ship
@@ -239,6 +239,22 @@ refuse a verdict — a11y is a gate.
239
239
  large text (≥18pt regular or ≥14pt bold). Flag any ratio the scenario's
240
240
  context.md tightens beyond that.
241
241
 
242
+ ## Run what you write — never ship
243
+
244
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
245
+ every test you produce, whether dispatched or invoked directly:
246
+
247
+ - Run every file you write with the project's own harness and report
248
+ file · exact command · result (`N passed / N failed`); not run =
249
+ `unverified`, never `covered`; a red test ships as `failing` with the
250
+ reason, never as green.
251
+ - A test that needs a server, seed data or a build is `needs-fixture` with
252
+ how to start it, and is run against that fixture before it is claimed.
253
+ - Claim pre-existing coverage only with `path:line` of the test; count new
254
+ tests separately from cited pre-existing ones.
255
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
256
+ opens the PR; standalone, the human does. Leave the files on the working tree.
257
+
242
258
  ## 7. Output format
243
259
 
244
260
  Print a compact summary to stdout; the full detail lives in the evidence
@@ -47,6 +47,22 @@ not E2E — specifically the agreement on request/response shape.
47
47
  - Changing error shape
48
48
  - New required request fields
49
49
 
50
+ ## Run what you write — never ship
51
+
52
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
53
+ every test you produce, whether dispatched or invoked directly:
54
+
55
+ - Run every file you write with the project's own harness and report
56
+ file · exact command · result (`N passed / N failed`); not run =
57
+ `unverified`, never `covered`; a red test ships as `failing` with the
58
+ reason, never as green.
59
+ - A test that needs a server, seed data or a build is `needs-fixture` with
60
+ how to start it, and is run against that fixture before it is claimed.
61
+ - Claim pre-existing coverage only with `path:line` of the test; count new
62
+ tests separately from cited pre-existing ones.
63
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
64
+ opens the PR; standalone, the human does. Leave the files on the working tree.
65
+
50
66
  ## Output
51
67
 
52
68
  - A contract-diff report
@@ -47,6 +47,22 @@ You verify the data itself, not just the code that touches it.
47
47
  - **SQL-based custom checks** — `EXCEPT` queries, cardinality ratios
48
48
  - **Soda** for streaming / operational data
49
49
 
50
+ ## Run what you write — never ship
51
+
52
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
53
+ every test you produce, whether dispatched or invoked directly:
54
+
55
+ - Run every file you write with the project's own harness and report
56
+ file · exact command · result (`N passed / N failed`); not run =
57
+ `unverified`, never `covered`; a red test ships as `failing` with the
58
+ reason, never as green.
59
+ - A test that needs a server, seed data or a build is `needs-fixture` with
60
+ how to start it, and is run against that fixture before it is claimed.
61
+ - Claim pre-existing coverage only with `path:line` of the test; count new
62
+ tests separately from cited pre-existing ones.
63
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
64
+ opens the PR; standalone, the human does. Leave the files on the working tree.
65
+
50
66
  ## Output
51
67
 
52
68
  Assertion suite + a freshness / drift report. On failure, show the
@@ -46,8 +46,14 @@ point to the business outcome.
46
46
  - **Console errors fail the run** — monitor the browser console throughout; any unhandled JS exception or console error is an automatic FAIL
47
47
  - **Headless by default** — run browsers headless (`headless: true`) unless a scenario explicitly requires headed mode
48
48
  - **No fixed sleeps** — never `sleep N`; always wait for an explicit condition (selector visible, network idle, application state)
49
+ - **Wait for the state you assert** — an assertion after an action is gated on the locator or state it checks, never on a comment that the framework "re-renders synchronously"
50
+ - **Fixture named and started** — the suite is `needs-fixture`: record the build step, start command, port and env (copy the repo's own rig convention) and RUN the journey against it before you claim it. Not run = `unverified`, never "passes"; when the fixture cannot start here, say so with the reason
51
+ - **Oracles checked against the source** — every selector, test id and text you wait on is confirmed rendered on the visited route under that fixture (`grep` the `data-testid`, read the title/render rule); never copy an id shape from a unit test
52
+ - **You never ship** — report file · exact command · result; never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase opens the PR
53
+ - **Contract** — the `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract is the full text; it binds whether you are dispatched or invoked directly
49
54
 
50
55
  ## Output
51
56
 
52
- E2E test files + a journey diagram (ASCII or mermaid) showing the path.
57
+ E2E test files + a journey diagram (ASCII or mermaid) showing the path, plus
58
+ the execution record per file (command, result, fixture used).
53
59
  Integrates with `wicked-garden-qe execute` for evidence capture.
@@ -54,6 +54,22 @@ Target: parsers, deserializers, crypto code, sanitizers.
54
54
  - Minimize discovered crashes before filing
55
55
  - Integrate into CI as a nightly job — not every PR
56
56
 
57
+ ## Run what you write — never ship
58
+
59
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
60
+ every test you produce, whether dispatched or invoked directly:
61
+
62
+ - Run every file you write with the project's own harness and report
63
+ file · exact command · result (`N passed / N failed`); not run =
64
+ `unverified`, never `covered`; a red test ships as `failing` with the
65
+ reason, never as green.
66
+ - A test that needs a server, seed data or a build is `needs-fixture` with
67
+ how to start it, and is run against that fixture before it is claimed.
68
+ - Claim pre-existing coverage only with `path:line` of the test; count new
69
+ tests separately from cited pre-existing ones.
70
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
71
+ opens the PR; standalone, the human does. Leave the files on the working tree.
72
+
57
73
  ## Output
58
74
 
59
75
  Property test files (checked in) + any crash-inducing inputs (filed as
@@ -42,6 +42,22 @@ test, not your problem. Your tests stand up actual dependencies.
42
42
  - Assert the observable outcome, not the internal call sequence
43
43
  - Test the error paths: dependency down, slow, returns garbage
44
44
 
45
+ ## Run what you write — never ship
46
+
47
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
48
+ every test you produce, whether dispatched or invoked directly:
49
+
50
+ - Run every file you write with the project's own harness and report
51
+ file · exact command · result (`N passed / N failed`); not run =
52
+ `unverified`, never `covered`; a red test ships as `failing` with the
53
+ reason, never as green.
54
+ - A test that needs a server, seed data or a build is `needs-fixture` with
55
+ how to start it, and is run against that fixture before it is claimed.
56
+ - Claim pre-existing coverage only with `path:line` of the test; count new
57
+ tests separately from cited pre-existing ones.
58
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
59
+ opens the PR; standalone, the human does. Leave the files on the working tree.
60
+
45
61
  ## Output
46
62
 
47
63
  Test code + a one-paragraph note on what gets spun up, teardown strategy,
@@ -52,6 +52,22 @@ refuse to run and record SKIP with reason `trust-level-insufficient`.
52
52
  (Same contract as chaos / security-DAST specialists — see
53
53
  the `wicked-garden-qe` skill's `refs/execute.md`.)
54
54
 
55
+ ## Run what you write — never ship
56
+
57
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
58
+ every test you produce, whether dispatched or invoked directly:
59
+
60
+ - Run every file you write with the project's own harness and report
61
+ file · exact command · result (`N passed / N failed`); not run =
62
+ `unverified`, never `covered`; a red test ships as `failing` with the
63
+ reason, never as green.
64
+ - A test that needs a server, seed data or a build is `needs-fixture` with
65
+ how to start it, and is run against that fixture before it is claimed.
66
+ - Claim pre-existing coverage only with `path:line` of the test; count new
67
+ tests separately from cited pre-existing ones.
68
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
69
+ opens the PR; standalone, the human does. Leave the files on the working tree.
70
+
55
71
  ## Output
56
72
 
57
73
  A report with:
@@ -45,6 +45,22 @@ hold up.
45
45
  - Input validation must accept locale-appropriate formats (thousands separators,
46
46
  decimal commas, etc.)
47
47
 
48
+ ## Run what you write — never ship
49
+
50
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
51
+ every test you produce, whether dispatched or invoked directly:
52
+
53
+ - Run every file you write with the project's own harness and report
54
+ file · exact command · result (`N passed / N failed`); not run =
55
+ `unverified`, never `covered`; a red test ships as `failing` with the
56
+ reason, never as green.
57
+ - A test that needs a server, seed data or a build is `needs-fixture` with
58
+ how to start it, and is run against that fixture before it is claimed.
59
+ - Claim pre-existing coverage only with `path:line` of the test; count new
60
+ tests separately from cited pre-existing ones.
61
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
62
+ opens the PR; standalone, the human does. Leave the files on the working tree.
63
+
48
64
  ## Output
49
65
 
50
66
  Findings per locale: missing strings, formatting violations, layout bugs.
@@ -41,6 +41,22 @@ Your tests make sure the system tells its operators what it did.
41
41
  - Catch cardinality hazards: user_id as a label, unbounded route paths
42
42
  - Verify PII is NOT in logs / traces (names, tokens, payloads)
43
43
 
44
+ ## Run what you write — never ship
45
+
46
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
47
+ every test you produce, whether dispatched or invoked directly:
48
+
49
+ - Run every file you write with the project's own harness and report
50
+ file · exact command · result (`N passed / N failed`); not run =
51
+ `unverified`, never `covered`; a red test ships as `failing` with the
52
+ reason, never as green.
53
+ - A test that needs a server, seed data or a build is `needs-fixture` with
54
+ how to start it, and is run against that fixture before it is claimed.
55
+ - Claim pre-existing coverage only with `path:line` of the test; count new
56
+ tests separately from cited pre-existing ones.
57
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
58
+ opens the PR; standalone, the human does. Leave the files on the working tree.
59
+
44
60
  ## Output
45
61
 
46
62
  Assertion suite. One paragraph per signal category with pass/fail and
@@ -50,6 +50,28 @@ Match what's there. Do not introduce a new framework unless asked.
50
50
  - Deterministic: no wall-clock, no random, no network unless explicitly needed
51
51
  - Assertion messages explain WHY, not WHAT
52
52
 
53
+ ## Run what you write — before you claim it
54
+
55
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract is the
56
+ full text; the rules below bind whether you are dispatched or invoked directly.
57
+
58
+ - Name the harness and its exact command in your reply (from `package.json`
59
+ `scripts`, `vitest.config.*` / `jest.config.*` / `playwright.config.*`,
60
+ `pyproject.toml` pytest config, an existing `e2e/` rig).
61
+ - Execute every file you produced with that command and report
62
+ file · command · result (`N passed / N failed`). A file you did not run is
63
+ `unverified` — never `covered`, never "passes". A red test ships as
64
+ `failing` with the reason, or not at all — never as green.
65
+ - Behaviour tests: assert what the caller observes (output, status, DOM, file,
66
+ the arguments a boundary received), never internal structure or a mock
67
+ asserting on a mock; for each test know the source change that would fail it.
68
+ - Pre-existing coverage is claimed only with `path:line` of the test and what
69
+ it asserts; report new and pre-existing counts separately — never padded.
70
+ - A test that needs a server, seed data or a build is `needs-fixture`, with how
71
+ to start it, and is run against that fixture before it is claimed.
72
+ - Never `git push`, `gh pr create` or `gh pr merge` — the run's deliver phase
73
+ opens the PR; standalone, the human does. Leave the files on the working tree.
74
+
53
75
  ## Infrastructure
54
76
 
55
77
  - Configure the runner config (jest.config, pytest.ini, etc.) only if missing
@@ -59,6 +81,8 @@ Match what's there. Do not introduce a new framework unless asked.
59
81
  ## Output
60
82
 
61
83
  - Test files in the project's conventional location
84
+ - The execution table: file · exact command · result for every produced file,
85
+ plus the `unverified`, `needs-fixture` and `not covered` rows
62
86
  - One paragraph in the reply summarizing what was added, what's still missing,
63
87
  and the next command to run tests
64
88
 
@@ -3,7 +3,7 @@ name: wicked-garden-qe-test-code-quality-auditor
3
3
  context: fork
4
4
  model: sonnet
5
5
  effort: medium
6
- max-turns: 10
6
+ max-turns: 15
7
7
  allowed-tools: Read, Write, Bash, Grep, Glob
8
8
  description: |
9
9
  Audits the TEST code itself — not the SUT. Detects assertion-free tests,
@@ -56,6 +56,12 @@ Relative paths in this skill are relative to the directory that contains this SK
56
56
  `P0`, `P1`, `P2`; default `P2` (include everything).
57
57
  - `top_n:` findings in the remediation list; default 30.
58
58
  - **`run_id`** — UUID of the current `runs` row; defines `EVIDENCE_DIR`.
59
+ - **`MODE`** — `audit` (default: the scenario-driven smell audit of §1–8) or
60
+ `produced-test` (§9). It is `produced-test` only when the dispatch args say
61
+ so (`MODE: produced-test` — the qe `review` playbook's "Reviewing produced
62
+ tests" block declares it) or hand you a PLAN with an execution table; when
63
+ the args are silent or name anything else, fall back to `audit`. The `PASS`
64
+ branch in §5 exists only in `produced-test` mode.
59
65
  - **`.wicked-qe/config.json`** — optional; `detected_tooling` to
60
66
  pick the right assertion-regex set per framework.
61
67
  - **`.wicked-qe/evidence/<run_id>/context.md`** — optional rules,
@@ -211,7 +217,15 @@ top-n.csv` columns: `file,line,rule,severity,snippet,fix_hint`.
211
217
  const p0 = findings.filter(f => f.severity === "P0");
212
218
  const p1 = findings.filter(f => f.severity === "P1");
213
219
  const p2 = findings.filter(f => f.severity === "P2");
214
- const verdict = p0.length > 0 ? "FAIL" : (p1.length > 0 ? "CONDITIONAL" : "CONDITIONAL");
220
+ // MODE (§1 Inputs): "produced-test" only when the dispatch args declare `MODE: produced-test`
221
+ // or hand over a PLAN with an execution table; silent or anything else → "audit".
222
+ const MODE = (ARGS_MODE === "produced-test" || PLAN_HAS_EXECUTION_TABLE) ? "produced-test" : "audit";
223
+ // Audit mode (§1–8): any P0 → FAIL, otherwise CONDITIONAL — a smell audit never certifies.
224
+ // Produced-test mode (§9): PASS is reachable — every §9 duty holds and the produced files
225
+ // carry P0 = P1 = P2 = 0; P1/P2-only → CONDITIONAL (fixes listed); any P0 → FAIL.
226
+ const verdict = p0.length > 0 ? "FAIL"
227
+ : MODE === "produced-test" ? ((p1.length + p2.length) > 0 ? "CONDITIONAL" : "PASS")
228
+ : "CONDITIONAL";
215
229
 
216
230
  store.create("verdicts", {
217
231
  run_id: RUN_ID,
@@ -254,8 +268,9 @@ narrative so the reviewer knows the coverage is partial.
254
268
 
255
269
  ## 7. Non-negotiable rules
256
270
 
257
- - **Do not mutate test code.** This is a read-only auditor. Remediation
258
- is a human action.
271
+ - **Do not mutate test code.** This is a read-only auditor toward the
272
+ tests; remediation is a human action. The one exception is §9.3's mutation
273
+ of the SOURCE under test — temporary, guarded, and restored byte-for-byte.
259
274
  - **P0 findings block the verdict.** A single assertion-free test is
260
275
  a FAIL — that test is coverage theatre.
261
276
  - **Never flag a legitimate `expect.assertions(N)` / `assert_called`
@@ -295,6 +310,72 @@ top-5 (full list in test-quality-top-n.csv):
295
310
  VERDICT={CONDITIONAL|FAIL} REVIEWER=wicked-garden-qe-test-code-quality-auditor RUN_ID={RUN_ID}
296
311
  ```
297
312
 
313
+ ## 9. Produced-test review (a PLAN + the tests it claims)
314
+
315
+ When the qe `review` action dispatches you in `produced-test` mode (`MODE:
316
+ produced-test` in the args — §1) with a PLAN that carries an execution table
317
+ (the `author` output — the review phase of a governed test-authoring run), the
318
+ detectors above run on the produced files AND these duties apply. The verdict is re-derived from the files, never copied from the
319
+ PLAN; the author's "all green" is a claim.
320
+
321
+ 1. **`covered` rows are opened at their `file:line`** — the test exists, its
322
+ assertion is the behaviour the row names, and the count of `it` / `test` /
323
+ `def test_` blocks matches the PLAN (new vs pre-existing separately). A
324
+ `covered` claim with no citation, or one that does not hold, is an
325
+ unsupported coverage claim (P0) — reclassify the row `unverified`; a padded
326
+ total is a P1 finding.
327
+ 2. **Every produced file has an execution record** — file · exact command ·
328
+ result. Re-run the produced files with that command when the harness is
329
+ available and compare. A produced file with no record, an `unverified`
330
+ produced file, or a `needs-fixture` e2e never run against its fixture →
331
+ **`[unexecuted-test]`** (P0), whatever else holds; a red produced test
332
+ (`failing`, or red on your re-run) is P0 too.
333
+ 3. **Mutate or reason about ≥ 2 tested behaviours** — apply a deliberate
334
+ mutation to the SOURCE under test (invert a guard, swallow an error, drop a
335
+ branch), re-run, confirm the test FAILS, then restore. Guard the restore:
336
+ before mutating, `git status --porcelain -- <file>` must be empty — if it
337
+ is not (the author phase touched that file and the run has not committed
338
+ it), copy the file aside and restore from the copy, never with
339
+ `git checkout`, which would also discard the author's edit; afterwards
340
+ `git diff --quiet -- <file>` (or a checksum) proves the tree is
341
+ byte-identical. §7's "do not mutate test code" stands — this touches the
342
+ SUT and is reverted. When you cannot run, name the mutation and the
343
+ assertion line that would catch it. No nameable failing mutation →
344
+ tautological (P0).
345
+ 4. **Behaviour vs implementation** — a test that asserts internal structure,
346
+ a mock asserting on a mock, a snapshot of a fixture, or that would still
347
+ pass with the implementation deleted is implementation-shaped (P1); the
348
+ detectors in §2 do not catch this — read the assertions.
349
+ 5. **e2e oracles against the source** — every selector, test id and text the
350
+ e2e waits on is rendered on the visited route under the named fixture
351
+ (`grep` the `data-testid`, read the render rule); an oracle that can never
352
+ match is `[scenario-defect]` (P0).
353
+ 6. **Scope honesty** — the PLAN's `not covered` rows name each intent area
354
+ without a test and why; a silent gap is a P1 finding.
355
+ 7. **You never ship** — no `git push`, `gh pr create`, `gh pr merge`; the
356
+ verdict returns to the run, whose deliver phase (or the human) opens the PR.
357
+
358
+ ### Produced-test verdict (`PASS` is reachable here, unlike the audit in §5)
359
+
360
+ - **`PASS`** — all of: every `covered` claim verified at its `path:line`
361
+ (duty 1); every produced file executed with its recorded command and green,
362
+ and your re-run — when the harness is available — reproduces it (duty 2); no
363
+ `unverified` and no `failing` row among the produced files; ≥ 2 behaviours
364
+ mutated-or-reasoned with a nameable failing mutation each (duty 3); e2e
365
+ oracles verified (duty 5); `not covered` rows account for the intent
366
+ (duty 6); and the §2 detectors report P0 = P1 = P2 = 0 on the produced files.
367
+ - **`CONDITIONAL`** — no P0, but any P1/P2 (implementation-shaped test, padded
368
+ total, silent scope gap, style smells): approve with the fixes listed.
369
+ - **`FAIL`** — any P0: `[unexecuted-test]`, a red produced test, an
370
+ unsupported `covered` claim, a tautological test, or an impossible oracle
371
+ `[scenario-defect]`.
372
+
373
+ Report line for this mode (the §8 line stays for the audit):
374
+
375
+ ```
376
+ VERDICT={PASS|CONDITIONAL|FAIL} MODE=produced-test REVIEWER=wicked-garden-qe-test-code-quality-auditor RUN_ID={RUN_ID}
377
+ ```
378
+
298
379
  ## Helper resolution (`{WT_LIB}`)
299
380
 
300
381
  `{WT_LIB}` is the plugin's own qe helper directory — the helper modules ship
@@ -54,6 +54,22 @@ Before any production-derived snapshot:
54
54
  - Fixtures are versioned; a schema change updates fixtures as part of
55
55
  the migration
56
56
 
57
+ ## Run what you write — never ship
58
+
59
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
60
+ every test you produce, whether dispatched or invoked directly:
61
+
62
+ - Run every file you write with the project's own harness and report
63
+ file · exact command · result (`N passed / N failed`); not run =
64
+ `unverified`, never `covered`; a red test ships as `failing` with the
65
+ reason, never as green.
66
+ - A test that needs a server, seed data or a build is `needs-fixture` with
67
+ how to start it, and is run against that fixture before it is claimed.
68
+ - Claim pre-existing coverage only with `path:line` of the test; count new
69
+ tests separately from cited pre-existing ones.
70
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
71
+ opens the PR; standalone, the human does. Leave the files on the working tree.
72
+
57
73
  ## Output
58
74
 
59
75
  Factory / fixture files + a one-paragraph note on coverage (what domain
@@ -43,8 +43,17 @@ backend — just this component with fake props and a DOM.
43
43
  - Interact via user-event (not fireEvent) where possible
44
44
  - Query by role / label — avoid test-ids unless there's no semantic anchor
45
45
  - Assert what a user would notice, not implementation details
46
+ - Run every file you write with the project's runner (`npx vitest run <file>`,
47
+ jest) and report file · command · result; not run = `unverified`, never
48
+ `covered`; a red test ships as `failing` with the reason, never as green
49
+ - Claim pre-existing coverage only with `path:line` of the test; count new
50
+ tests separately from cited pre-existing ones
51
+ - Never `git push` / `gh pr create` — the run's deliver phase opens the PR
52
+ - The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract is the
53
+ full text; it binds whether you are dispatched or invoked directly
46
54
 
47
55
  ## Output
48
56
 
49
57
  Tests in the project's conventional test location. One file per component,
50
- one test per behavior variant. Note coverage gains.
58
+ one test per behavior variant. Note coverage gains with the execution record
59
+ (file · command · result) — never a pass claim without it.
@@ -262,6 +262,22 @@ a different browser. A missing webkit run is not a chromium run.
262
262
  motion-sensitive regions, run the visual pass with both default and
263
263
  reduced-motion media queries, and keep both sets of screenshots.
264
264
 
265
+ ## Run what you write — never ship
266
+
267
+ The `wicked-garden-qe` skill's `refs/author.md` § Verified-test contract binds
268
+ every test you produce, whether dispatched or invoked directly:
269
+
270
+ - Run every file you write with the project's own harness and report
271
+ file · exact command · result (`N passed / N failed`); not run =
272
+ `unverified`, never `covered`; a red test ships as `failing` with the
273
+ reason, never as green.
274
+ - A test that needs a server, seed data or a build is `needs-fixture` with
275
+ how to start it, and is run against that fixture before it is claimed.
276
+ - Claim pre-existing coverage only with `path:line` of the test; count new
277
+ tests separately from cited pre-existing ones.
278
+ - Never `git push` / `gh pr create` / `gh pr merge` — the run's deliver phase
279
+ opens the PR; standalone, the human does. Leave the files on the working tree.
280
+
265
281
  ## 9. Output
266
282
 
267
283
  ```
package/uv.lock CHANGED
@@ -691,7 +691,7 @@ wheels = [
691
691
 
692
692
  [[package]]
693
693
  name = "wicked-garden"
694
- version = "1.33.0"
694
+ version = "0.0.0"
695
695
  source = { editable = "." }
696
696
  dependencies = [
697
697
  { name = "aiofiles" },