wicked-garden 12.44.0 → 12.45.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.44.0"}], "version": "12.44.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.45.0"}], "version": "12.45.0"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wicked-garden",
3
- "version": "12.44.0",
3
+ "version": "12.45.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,11 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [12.45.0] — 2026-10-08
6
+
7
+ ### Fixed
8
+ - **Walkthrough: `record` re-runs the storyline lint before it records (wicked-garden#1240, DES-walkthrough-proof §4.4 step 1).** The storyline may have been edited since the `walkthrough_plan` step linted it, so `scripts/demo/walkthrough.mjs record` now runs `lintStoryline` on the storyline it loaded, against the tree it staged (`git archive` of `WICKED_TREE` plus the `fixture.reuse` links, so a `fixture.start` script must be one the tree under review declares), after staging and before the fixture starts. Any finding refuses: `result.json` `{overall: "INCONCLUSIVE", cause: "storyline_refused", reason: "lint: <rule> at <where>: <detail>; ..."}` with every chapter listed INCONCLUSIVE, `progress.json` and the seal line written, exit 0 — nothing is started, filmed or captured. Without `jq` the lint cannot run a check's negative samples and fails closed (`negative_unverified`). Recorder test storylines now pass the lint through `tests/demo/fixtures/lint_complete.mjs` (a negative sample on every check, plus passing pad checks — a `#status` locator, a `probe.mjs` probe, their join, one guard — for any class a chapter lacks, checked after the chapter's own `run()`); tests that pinned a path the lint now refuses first assert the named refusal, and three new tests pin it (a tautology negative, the unpadded fixture, a `fixture.start` script not in the tree). The demo skill and `refs/walkthrough-author.md` say record re-runs the lint.
9
+
5
10
  ## [12.44.0] — 2026-10-08
6
11
 
7
12
  ### Added
@@ -994,7 +999,8 @@ through `v9.2.18`. Major themes across that span:
994
999
 
995
1000
  For each of those releases, see the corresponding tag in git history.
996
1001
 
997
- [Unreleased]: https://github.com/mikeparcewski/wicked-garden/compare/v12.44.0...HEAD
1002
+ [Unreleased]: https://github.com/mikeparcewski/wicked-garden/compare/v12.45.0...HEAD
1003
+ [12.45.0]: https://github.com/mikeparcewski/wicked-garden/compare/v12.44.0...v12.45.0
998
1004
  [12.44.0]: https://github.com/mikeparcewski/wicked-garden/compare/v12.43.0...v12.44.0
999
1005
  [12.43.0]: https://github.com/mikeparcewski/wicked-garden/compare/v12.42.0...v12.43.0
1000
1006
  [12.42.0]: https://github.com/mikeparcewski/wicked-garden/compare/v12.41.0...v12.42.0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wicked-garden",
3
- "version": "12.44.0",
3
+ "version": "12.45.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": [
@@ -9,6 +9,7 @@
9
9
  // The storyline: --storyline <path>, else $WICKED_WALKTHROUGH_AUTHOR/storyline.mjs (the walkthrough_plan step's
10
10
  // author dir, which the engine hands the record tool); with neither, record refuses (storyline_refused).
11
11
  // lint (walkthrough-lint.mjs, DES §4.5) is the walkthrough_plan step's pinned validator: exit 0 = no finding.
12
+ // record re-runs it on the storyline it loaded (DES §4.4 step 1): any finding refuses (storyline_refused).
12
13
  // Safety: WICKED_WALKTHROUGH_JAIL must be set; without it writes INCONCLUSIVE(unjailed_host) and exits 0.
13
14
  //
14
15
  // What the proof root holds is ONE contract with crew's walkthrough view and acceptance
@@ -43,7 +44,7 @@ import { tmpdir } from "node:os";
43
44
  import { makeSegmentRecorder, failedAtInVideo, stitchParts, extractFrame, SEGMENT_TRIM_START } from "./record.mjs";
44
45
  import { fixtureOrigin } from "./readonly.mjs";
45
46
  import { crewRunStamp } from "../qe/lib/crew-run.mjs";
46
- import { lintAction } from "./walkthrough-lint.mjs";
47
+ import { lintAction, lintStoryline } from "./walkthrough-lint.mjs";
47
48
 
48
49
  // ---- arg parsing ---------------------------------------------------------------
49
50
  const [action, ...rawArgs] = process.argv.slice(2);
@@ -950,6 +951,23 @@ async function main() {
950
951
  }
951
952
  }
952
953
 
954
+ // Re-run the lint (DES-walkthrough-proof §4.4 step 1): the storyline may have been edited since the
955
+ // walkthrough_plan step linted it, so a storyline the lint refuses is never started or recorded. It
956
+ // runs on the staged tree (with its fixture.reuse links), so fixture.start must name a script the tree
957
+ // under review declares.
958
+ let lint;
959
+ try { lint = lintStoryline(story, { tree: appDir }); } catch (e) {
960
+ lint = { findings: [{ rule: "storyline_unreadable", where: storyPath, detail: String(e?.message ?? e).split("\n")[0] }] };
961
+ }
962
+ if (lint.findings.length) {
963
+ const shown = lint.findings.slice(0, 5).map((f) => `${f.rule} at ${f.where}: ${f.detail}`);
964
+ const more = lint.findings.length > shown.length ? ` (+${lint.findings.length - shown.length} more)` : "";
965
+ writeResult(ROOT, { overall: "INCONCLUSIVE", cause: "storyline_refused", reason: `lint: ${shown.join("; ")}${more}`, chapters: allChapters });
966
+ writeProgress(ROOT, { overall: "INCONCLUSIVE", cause: "storyline_refused" });
967
+ finishWithSeal(ROOT, { tree: TREE, storyline_sha: storySha, contract_shas: {}, overall: "INCONCLUSIVE", cause: "storyline_refused", chapters: allChapters });
968
+ process.exit(0);
969
+ }
970
+
953
971
  // 3. Spawn fixture, poll ready
954
972
  const dataDir = path.join(ROOT, "data");
955
973
  fs.mkdirSync(dataDir, { recursive: true });
@@ -191,7 +191,8 @@ again until it exits 0. The rules, in short: `baseUrl: "fixture"`; `fixture.star
191
191
  the tree declares (no `-e`/`-c`, nothing outside the tree, no secret-shaped env name); every chapter `proves` plan
192
192
  step ids and has a `locator` check, a `probe` or `artifact` check, and a `join` of the two; the walkthrough has a
193
193
  `guard` check; every check carries `negative` samples its `jq_pred` verifier FAILS on. The record tool
194
- (`walkthrough_review`) reads the same file through `WICKED_WALKTHROUGH_AUTHOR`. Full rules and a passing
194
+ (`walkthrough_review`) reads the same file through `WICKED_WALKTHROUGH_AUTHOR` and re-runs the lint first: a
195
+ finding refuses the recording (`storyline_refused`). Full rules and a passing
195
196
  example: `refs/walkthrough-author.md`.
196
197
 
197
198
  ### Probe selectors (read-only)
@@ -13,7 +13,9 @@ review and judges every check through the vault. No model judges a check.
13
13
  `wicked-garden run scripts/demo/walkthrough.mjs lint --root <author dir>`. It denies the step until the
14
14
  lint exits 0.
15
15
  - The record step reads the same file through `WICKED_WALKTHROUGH_AUTHOR` (the author dir the engine hands
16
- it). Outside a run, pass `--storyline <path>` to `record` and `lint`.
16
+ it) and re-runs the lint before it records anything: a finding refuses the recording
17
+ (`INCONCLUSIVE`, cause `storyline_refused`, the rules in `reason`). Outside a run, pass
18
+ `--storyline <path>` to `record` and `lint`.
17
19
 
18
20
  ## Lint rules
19
21