wicked-garden 12.55.0 → 12.55.1

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, multi-model second opinions (fallback seats labelled). 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.55.0"}], "version": "12.55.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, multi-model second opinions (fallback seats labelled). 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.55.1"}], "version": "12.55.1"}
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "wicked-garden",
3
- "version": "12.55.0",
3
+ "version": "12.55.1",
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), multi-model second opinions (fallback seats labelled) (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
- "wicked_vault_version": "^0.5.0",
5
+ "wicked_vault_version": ">=0.8.0",
6
6
  "wicked_ledger_version": "^0.6.0",
7
7
  "wicked_bus_version": "^2.0.0",
8
8
  "author": {
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [12.55.1] — 2026-10-15
6
+
7
+ ### Fixed
8
+ - **Bump the `wicked-vault` peer floor to `>= 0.8.0` and drop stale "unreleased manifest-2.1 twin" notes (garden#1309).** `.claude-plugin/plugin.json` now declares `"wicked_vault_version": ">=0.8.0"` (replacing `"^0.5.0"`, whose `0.x` caret excluded every later minor), in lockstep with `scripts/loom/manifest.py` (`version_pin="0.8"`) and every `<!-- vault-floor -->` doc/skill restatement. `VAULT_RELEASE_REQUIREMENT` in `scripts/qe/lib/vault-evidence.mjs` and the QE docs/help strings now point to `npm i -g wicked-vault@latest` (the manifest-2.1 twin shipped in 0.7.0; 0.8.0 is the current floor).
9
+ - **The plugin's Python range stops below 3.15 until its dependencies ship 3.15 wheels.** `pydantic-core` (via `pydantic`) has no CPython 3.15 wheel. A 3.15 default interpreter (the macOS GitHub runners and Homebrew `python@3.15`) made `uv sync` build it from source with Rust, which fails without a toolchain. That blocked wicked-crew's first skills publish (its release smoke S02 on macOS, and any 3.15-only host without Rust). `requires-python` is now `>=3.10,<3.15` (uv.lock relocked at the same lock revision), so uv picks or downloads a 3.14. Lift the bound once pydantic-core publishes cp315 wheels.
10
+
5
11
  ## [12.55.0] — 2026-10-14
6
12
 
7
13
  ### Added
@@ -1129,7 +1135,8 @@ through `v9.2.18`. Major themes across that span:
1129
1135
 
1130
1136
  For each of those releases, see the corresponding tag in git history.
1131
1137
 
1132
- [Unreleased]: https://github.com/mikeparcewski/wicked-garden/compare/v12.55.0...HEAD
1138
+ [Unreleased]: https://github.com/mikeparcewski/wicked-garden/compare/v12.55.1...HEAD
1139
+ [12.55.1]: https://github.com/mikeparcewski/wicked-garden/compare/v12.55.0...v12.55.1
1133
1140
  [12.55.0]: https://github.com/mikeparcewski/wicked-garden/compare/v12.54.0...v12.55.0
1134
1141
  [12.54.0]: https://github.com/mikeparcewski/wicked-garden/compare/v12.53.3...v12.54.0
1135
1142
  [12.53.3]: https://github.com/mikeparcewski/wicked-garden/compare/v12.53.2...v12.53.3
package/CONTRIBUTING.md CHANGED
@@ -29,7 +29,7 @@ uv run pytest tests/ -x
29
29
 
30
30
  **For offline CI and dev environments without the wicked-vault peer only.**
31
31
 
32
- wicked-vault (npm, ≥ 0.5.0 <!-- vault-floor -->, install `npm i -g wicked-vault`)
32
+ wicked-vault (npm, ≥ 0.8.0 <!-- vault-floor -->, install `npm i -g wicked-vault`)
33
33
  is the one required peer (the loom engine is built into the garden; bus is an
34
34
  opt-in layer). The garden's produces-gates re-derive
35
35
  evidence through the built-in loom engine — `scripts/qe/vault_gate.py` runs
package/README.md CHANGED
@@ -86,7 +86,7 @@ Then, in a Claude Code session:
86
86
  **One required peer, the rest opt-in.** The evidence gate is the floor we won't fake, so it needs one external peer — setup blocks without it:
87
87
 
88
88
  ```bash
89
- npm i -g wicked-vault # wicked-vault (≥ 0.5.0), the honest-evidence backend the gate re-derives against
89
+ npm i -g wicked-vault # wicked-vault (≥ 0.8.0), the honest-evidence backend the gate re-derives against
90
90
  ```
91
91
 
92
92
  > The gate/resolve engine (formerly the separate `wicked-loom` package) is now **absorbed in-package** as of v12.27.0 (`scripts/loom/`) — nothing extra to install. The gate re-hashes recorded evidence and re-runs its verifier through that engine; a false "tests pass" is **rejected**, a missing backend **fails closed**.
@@ -170,7 +170,7 @@ Full author guide: [`docs/extending.md`](docs/extending.md).
170
170
 
171
171
  ## Requirements
172
172
 
173
- A coding-agent harness ([Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) ≥ 1.0 for the plugin surface; the peers + compiled gate are harness-agnostic) · Python 3.9+ (stdlib-only hooks) · Node + `npx` · the gate's one required peer (`wicked-vault` ≥ 0.5.0) plus opt-in layers (`wicked-estate` · `wicked-bus`).
173
+ A coding-agent harness ([Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) ≥ 1.0 for the plugin surface; the peers + compiled gate are harness-agnostic) · Python 3.9+ (stdlib-only hooks) · Node + `npx` · the gate's one required peer (`wicked-vault` ≥ 0.8.0) plus opt-in layers (`wicked-estate` · `wicked-bus`).
174
174
 
175
175
  ## License
176
176
 
package/docs/extending.md CHANGED
@@ -51,7 +51,7 @@ A complete working example (used as garden's own e2e fixture):
51
51
  ]
52
52
  }
53
53
  ],
54
- "peers": { "wicked-garden": ">=12.0.0", "wicked-vault": ">=0.5.0" },
54
+ "peers": { "wicked-garden": ">=12.0.0", "wicked-vault": ">=0.8.0" },
55
55
  "provenance": { "source": "https://github.com/acme/acme-seo-pack", "publisher": "acme" }
56
56
  }
57
57
  ```
@@ -18,7 +18,7 @@ works.
18
18
 
19
19
  | Peer | What it does | Install |
20
20
  |------|--------------|---------|
21
- | **wicked-vault** | The honest-evidence backend the gate re-derives against: record → re-hash + re-run the verifier → cross-check. Never trusts a cached status. | `npm i -g wicked-vault` — puts the `wicked-vault` binary on PATH (optionally run `wicked-vault-install` afterwards to copy the vault skills into your AI CLIs). Declared floor: **≥ 0.5.0** <!-- vault-floor --> (on 0.4.x or older, upgrade with `npm i -g wicked-vault@latest` — the peer registry's health probe, `loom doctor` / the peer-health command, reports a below-floor vault as `drift` and fails its check). Resolved at runtime via `WICKED_VAULT_BIN` → config → `PATH` → `node_modules` → `npx wicked-vault`. |
21
+ | **wicked-vault** | The honest-evidence backend the gate re-derives against: record → re-hash + re-run the verifier → cross-check. Never trusts a cached status. | `npm i -g wicked-vault` — puts the `wicked-vault` binary on PATH (optionally run `wicked-vault-install` afterwards to copy the vault skills into your AI CLIs). Declared floor: **≥ 0.8.0** <!-- vault-floor --> (below 0.8.0, upgrade with `npm i -g wicked-vault@latest` — the peer registry's health probe, `loom doctor` / the peer-health command, reports a below-floor vault as `drift` and fails its check). Resolved at runtime via `WICKED_VAULT_BIN` → config → `PATH` → `node_modules` → `npx wicked-vault`. |
22
22
 
23
23
  The core skill's `setup` action (`/wicked-garden-core setup`) **blocks** without
24
24
  it — a toolkit whose headline is "done is re-derived, not asserted" cannot ship
@@ -35,7 +35,7 @@ single source of truth; every doc restatement of the number is tagged with a
35
35
  `<!-- vault-floor -->` marker (README's bash-comment restatement can't carry an
36
36
  HTML comment, so grep the number too). **To bump the floor:** change
37
37
  `manifest.py` + `plugin.json`, then
38
- `grep -rn "vault-floor\|0\.5\.0" README.md CONTRIBUTING.md docs/ skills/` and
38
+ `grep -rn "vault-floor\|0\.8\.0" README.md CONTRIBUTING.md docs/ skills/` and
39
39
  update every tagged restatement in the same commit.
40
40
 
41
41
  ## The built-in gate engine (loom) — nothing to install
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wicked-garden",
3
- "version": "12.55.0",
3
+ "version": "12.55.1",
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
@@ -7,7 +7,11 @@ name = "wicked-garden"
7
7
  # not bump it — PEP 621 requires a value, so it is pinned to the placeholder 0.0.0 (mirrored in uv.lock).
8
8
  version = "0.0.0"
9
9
  description = "AI-Native SDLC delivered as a single Claude Code plugin"
10
- requires-python = ">=3.10"
10
+ # <3.15 (garden 12.55.1): pydantic-core (via pydantic) ships no CPython 3.15 wheel yet, so a 3.15
11
+ # default interpreter (macOS runners and Homebrew since 2026-10) made `uv sync` build it from source
12
+ # with Rust — which fails without a toolchain, blocking crew's first skills publish. With the bound,
13
+ # uv picks (or downloads) a 3.14. Lift it once pydantic-core publishes cp315 wheels.
14
+ requires-python = ">=3.10,<3.15"
11
15
  dependencies = [
12
16
  "rapidfuzz>=3.0",
13
17
  "aiofiles>=23.0",
@@ -107,7 +107,7 @@
107
107
  },
108
108
  "peers": {
109
109
  "type": "object",
110
- "description": "Peer version floors (extension-contract gap 6), e.g. {\"wicked-garden\": \">=12.29.0\", \"wicked-vault\": \">=0.5.0\"}. Checked FAIL-OPEN: violations are surfaced at SessionStart and by `pack floors`, never blocked on.",
110
+ "description": "Peer version floors (extension-contract gap 6), e.g. {\"wicked-garden\": \">=12.29.0\", \"wicked-vault\": \">=0.8.0\"}. Checked FAIL-OPEN: violations are surfaced at SessionStart and by `pack floors`, never blocked on.",
111
111
  "additionalProperties": { "type": "string", "pattern": "^(>=|\\^)\\s*\\d+\\.\\d+\\.\\d+$" }
112
112
  },
113
113
  "provenance": {
@@ -28,7 +28,7 @@ skills tree. There is NO signing — the hashes detect post-registration drift,
28
28
  they do not prove authorship. See docs/extending.md "Trust model".
29
29
 
30
30
  Peer floors (gap 6, fail-open): a pack may declare ``peers`` —
31
- ``{"wicked-garden": ">=12.29.0", "wicked-vault": ">=0.5.0"}``.
31
+ ``{"wicked-garden": ">=12.29.0", "wicked-vault": ">=0.8.0"}``.
32
32
  ``check_peer_floors()`` compares floors against what is actually installed
33
33
  and returns violations as data. It NEVER raises and never blocks: an
34
34
  unprobeable peer reports status "unknown", not a violation.
@@ -94,10 +94,11 @@ PEERS: dict = {
94
94
  name="vault",
95
95
  npm_package="wicked-vault",
96
96
  env_var="WICKED_VAULT_BIN",
97
- # 0.5 floor (Phase 6c): vault >= 0.5.0 stamps bus events with the qe
98
- # domain (0.4 floor was the hard-gate attest baseline). Keep this
99
- # MAJOR.MINOR floor in lockstep with plugin.json's ``wicked_vault_version``.
100
- version_pin="0.5",
97
+ # 0.8 floor: the manifest-2.1 twin the QE evidence flow needs shipped
98
+ # in 0.7.0, and 0.8.0 enforces contract pins and re-validates
99
+ # attestations. Keep this MAJOR.MINOR floor in lockstep with
100
+ # plugin.json's ``wicked_vault_version``.
101
+ version_pin="0.8",
101
102
  # wicked-vault is a DIRECT infra peer, published from its own repo
102
103
  # (mikeparcewski/wicked-vault): self-contained, zero runtime deps. Install
103
104
  # it directly. ``npm i -g wicked-vault``
@@ -73,10 +73,10 @@
73
73
  * - A bundle that failed manifest validation (downgraded above) is NOT
74
74
  * vaulted — the downgraded INCONCLUSIVE verdict records with
75
75
  * `vault: {skipped}` instead (never freeze a nonconforming bundle).
76
- * - Release dependency: needs the wicked-vault manifest-2.1 twin —
77
- * UNRELEASED (npm 0.6.0 predates it). Until the next wicked-vault
78
- * release, `WICKED_QE_VAULT_PKG` must point at a local checkout of
79
- * wicked-vault main; a pre-2.1 vault is refused fail-closed.
76
+ * - Release dependency: needs wicked-vault >= 0.8.0 (the manifest-2.1 twin
77
+ * shipped in 0.7.0; garden's floor is 0.8.0). An older vault is refused
78
+ * fail-closed — upgrade with `npm i -g wicked-vault@latest` (or set
79
+ * `WICKED_QE_VAULT_PKG` to point at a specific 0.8.0+ install).
80
80
  */
81
81
 
82
82
  import { existsSync, readdirSync, readFileSync } from "node:fs";
@@ -339,7 +339,8 @@ export async function runGate({ projectId, runId, verdict, verdictSummary, ratio
339
339
  // 2c. TH-17: resolve wicked-vault up front when vault integrity was asked
340
340
  // for — fail fast (exit 3) on an unresolvable or pre-2.1 vault, BEFORE
341
341
  // anything is written anywhere. The refusal message carries the release
342
- // dependency (the manifest-2.1 twin is unreleased; npm 0.6.0 predates it).
342
+ // dependency (the manifest-2.1 twin shipped in 0.7.0; floor is 0.8.0 —
343
+ // upgrade with `npm i -g wicked-vault@latest`).
343
344
  const wantsVault = Boolean(vaultRecord || vaultEntry);
344
345
  let vaultModule = null;
345
346
  if (wantsVault) {
@@ -556,8 +557,9 @@ Optional:
556
557
  (content-addressed) and attest the verdict as the reviewer's
557
558
  opinion; the verdicts row carries vault_payload_sha. REFUSES
558
559
  unredacted bundles (TH-19 ordering) — exit 3, nothing recorded.
559
- Needs the wicked-vault manifest-2.1 twin (unreleased; set
560
- WICKED_QE_VAULT_PKG to a wicked-vault main checkout until then)
560
+ Needs wicked-vault >= 0.8.0 (the manifest-2.1 twin shipped in
561
+ 0.7.0; upgrade with \`npm i -g wicked-vault@latest\`, or set
562
+ WICKED_QE_VAULT_PKG to a specific 0.8.0+ install)
561
563
  --vault-entry <id> TH-17: link an already-vaulted bundle instead of recording;
562
564
  re-derived fail-closed before the verdict is recorded
563
565
  --vault-actor <id> Recording (worker) identity for --vault-record (default: qe-runner)
@@ -44,12 +44,10 @@
44
44
  *
45
45
  * RELEASE DEPENDENCY (documented, enforced by `resolveVaultModule`):
46
46
  * this flow needs the wicked-vault manifest-2.1 twin (`validateManifest` +
47
- * `CLAIM_LEVELS` exports — on wicked-vault main, UNRELEASED as of
48
- * 2026-08-30; npm wicked-vault 0.6.0 predates it and its vendored schema
49
- * rejects every 2.1 bundle). Until the next wicked-vault release, point
50
- * `WICKED_QE_VAULT_PKG` at a local checkout of wicked-vault main (or
51
- * `npm link` it); a pre-2.1 vault is refused fail-closed, never silently
52
- * degraded.
47
+ * `CLAIM_LEVELS` exports, shipped in wicked-vault 0.7.0; garden's floor is
48
+ * 0.8.0). An older vault is refused fail-closed, never silently degraded —
49
+ * upgrade with `npm i -g wicked-vault@latest` (or set `WICKED_QE_VAULT_PKG`
50
+ * to point at a specific wicked-vault 0.8.0+ install).
53
51
  *
54
52
  * CLI (from the target repo's root):
55
53
  * node vault-evidence.mjs record --evidence-dir <dir> [--repo-root <dir>]
@@ -75,10 +73,9 @@ import { scanForSecrets, compileExtraPatterns } from "../runner/src/redact.mjs";
75
73
 
76
74
  /** The one-line release dependency, stamped on every pre-2.1 refusal. */
77
75
  export const VAULT_RELEASE_REQUIREMENT =
78
- "wicked-vault with the manifest-2.1 twin (validateManifest + CLAIM_LEVELS) is required — " +
79
- "on wicked-vault main but UNRELEASED (npm 0.6.0 predates it and rejects 2.1 bundles). " +
80
- "Until the next wicked-vault release: set WICKED_QE_VAULT_PKG to a local checkout of " +
81
- "wicked-vault main, or `npm link wicked-vault` from one.";
76
+ "wicked-vault >= 0.8.0 is required (the manifest-2.1 twin, validateManifest + CLAIM_LEVELS, " +
77
+ "shipped in 0.7.0) — upgrade with `npm i -g wicked-vault@latest`, or set WICKED_QE_VAULT_PKG " +
78
+ "to a wicked-vault 0.8.0+ install.";
82
79
 
83
80
  /** Typed refusal so callers (gate.mjs, tests) can tell WHY the write was refused. */
84
81
  export class VaultEvidenceError extends Error {
@@ -116,9 +113,9 @@ function esmEntryForPackage(resolvedFile) {
116
113
 
117
114
  /**
118
115
  * Capability gate: is this module a wicked-vault WITH the manifest-2.1 twin?
119
- * npm 0.6.0 has record/attest/verify but NOT validateManifest/CLAIM_LEVELS —
120
- * that is the unreleased seam this flow depends on (see
121
- * VAULT_RELEASE_REQUIREMENT). Exported for tests.
116
+ * The twin (`validateManifest` + `CLAIM_LEVELS`) shipped in wicked-vault 0.7.0
117
+ * and garden's floor is 0.8.0; an older vault without those exports is refused
118
+ * fail-closed (see VAULT_RELEASE_REQUIREMENT). Exported for tests.
122
119
  */
123
120
  export function checkVaultCapability(mod) {
124
121
  if (!mod || typeof mod !== "object") return { ok: false, reason: "not a module" };
@@ -135,8 +132,8 @@ export function checkVaultCapability(mod) {
135
132
 
136
133
  /**
137
134
  * Resolve the wicked-vault module, fail-closed on capability:
138
- * 1. `WICKED_QE_VAULT_PKG` env — path to a wicked-vault package dir (or its
139
- * entry file). The documented bridge until the next vault release.
135
+ * 1. `WICKED_QE_VAULT_PKG` env — optional pointer to a specific wicked-vault
136
+ * package dir (or its entry file).
140
137
  * 2. bare `import("wicked-vault")` (global / hoisted install).
141
138
  * 3. the target repo's node_modules (cwd-anchored resolution).
142
139
  * A resolved-but-pre-2.1 vault is a refusal, not a fallback.
@@ -551,9 +548,10 @@ Subcommands:
551
548
  Re-derive the bundle months later: vault hashes + every artifact
552
549
  re-hashed on disk. Exit 1 on ANY divergence.
553
550
 
554
- wicked-vault resolution: WICKED_QE_VAULT_PKG (local checkout — required until
555
- the next wicked-vault release ships the manifest-2.1 twin) → global install →
556
- the repo's node_modules. A pre-2.1 vault is refused fail-closed.
551
+ wicked-vault resolution: WICKED_QE_VAULT_PKG (optional pointer to a specific
552
+ wicked-vault 0.8.0+ install) → global install → the repo's node_modules. An
553
+ older vault without the manifest-2.1 twin (shipped in 0.7.0; floor 0.8.0) is
554
+ refused fail-closed — upgrade with \`npm i -g wicked-vault@latest\`.
557
555
 
558
556
  Exit codes: 0 ok · 1 rederive divergence · 3 refusal / usage / system error.
559
557
  `;
@@ -218,12 +218,11 @@ the reviewer's grade appended as an opinion attestation — see
218
218
  --vault-record`. The vault payload is `manifest.json` (content-addressed; it
219
219
  binds every artifact's sha256), so a campaign PASS re-derives months later.
220
220
  **Release dependency:** the flow needs the wicked-vault manifest-2.1 twin
221
- (`validateManifest` + `CLAIM_LEVELS`) — on wicked-vault main, **unreleased**
222
- (npm 0.6.0 predates it and its vendored schema rejects 2.1 bundles). Until
223
- the next wicked-vault release, set `WICKED_QE_VAULT_PKG` to a local checkout
224
- of wicked-vault main (or `npm link` one); a pre-2.1 vault is refused
225
- fail-closed. The `th17-vault-evidence` tests skip with that exact message
226
- when no 2.1 vault is resolvable.
221
+ (`validateManifest` + `CLAIM_LEVELS`), which shipped in wicked-vault 0.7.0;
222
+ garden's floor is 0.8.0. An older vault is refused fail-closed — upgrade with
223
+ `npm i -g wicked-vault@latest` (or set `WICKED_QE_VAULT_PKG` to point at a
224
+ specific wicked-vault 0.8.0+ install). The `th17-vault-evidence` tests skip
225
+ with that message when no 2.1-capable vault is resolvable.
227
226
 
228
227
  ## Tests
229
228
 
@@ -15,11 +15,11 @@
15
15
  * refusal happens in code, not in docs.
16
16
  *
17
17
  * Release dependency (documented in vault-evidence.mjs): these tests need
18
- * the wicked-vault manifest-2.1 twin, which is on wicked-vault main but
19
- * UNRELEASED (npm 0.6.0 predates it). Until the next wicked-vault release,
20
- * set WICKED_QE_VAULT_PKG to a local checkout of wicked-vault main; without
21
- * one the vault-dependent tests SKIP with that exact message (the pure
22
- * mapping/capability tests still run).
18
+ * the wicked-vault manifest-2.1 twin (shipped in wicked-vault 0.7.0;
19
+ * garden's floor is 0.8.0). An older vault is refused fail-closed — upgrade
20
+ * with `npm i -g wicked-vault@latest` (or set WICKED_QE_VAULT_PKG to point
21
+ * at a specific 0.8.0+ install); without one the vault-dependent tests SKIP
22
+ * with that message (the pure mapping/capability tests still run).
23
23
  */
24
24
 
25
25
  import test from "node:test";
@@ -149,7 +149,7 @@ test("checkVaultCapability: a pre-2.1 vault is refused WITH the release requirem
149
149
  const r = checkVaultCapability(pre21);
150
150
  assert.equal(r.ok, false);
151
151
  assert.equal(r.pre21, true);
152
- assert.match(r.reason, /UNRELEASED/);
152
+ assert.match(r.reason, /0\.8\.0/);
153
153
  assert.match(r.reason, /WICKED_QE_VAULT_PKG/);
154
154
  // and a non-vault module is a different refusal (not "release the vault")
155
155
  const notVault = checkVaultCapability({ record: fn });
@@ -76,7 +76,7 @@ confirming the bleeding stopped. Don't skip to followup before resolve.
76
76
  2. **Confirm the bleeding stopped.** Watch the same dashboards that
77
77
  surfaced the incident. Don't declare mitigated based on logs alone.
78
78
  3. Record the mitigation as re-derivable evidence (vault present;
79
- **wicked-vault ≥ 0.5.0** <!-- vault-floor -->):
79
+ **wicked-vault ≥ 0.8.0** <!-- vault-floor -->):
80
80
  `wicked-vault record --scope <scope> --phase incident --claim mitigation
81
81
  --kind mitigation-check --source "<the symptom-check command>"
82
82
  --criteria "symptom check passes post-mitigation"
@@ -106,7 +106,7 @@ confirming the bleeding stopped. Don't skip to followup before resolve.
106
106
  2. Use `wicked-garden-qe-incident-to-scenario-synthesizer` to convert the
107
107
  incident into a regression scenario that would catch the same break.
108
108
  3. Track action items in github. Don't bury them in a Slack thread.
109
- 4. Record the docs evidence (vault present; **wicked-vault ≥ 0.5.0** <!-- vault-floor -->):
109
+ 4. Record the docs evidence (vault present; **wicked-vault ≥ 0.8.0** <!-- vault-floor -->):
110
110
  `wicked-vault record --scope <scope> --phase incident --claim rca
111
111
  --kind doc --artifact docs/postmortems/INC-{N}.md
112
112
  --criteria "required RCA sections present"
@@ -83,7 +83,7 @@ them mid-cutover. Absent? Discover it the usual way — and consider
83
83
  the old shape.
84
84
  3. Land + deploy expand. Don't combine with backfill.
85
85
  4. Record the **shape-change** as re-derivable evidence (vault present;
86
- **wicked-vault ≥ 0.5.0** <!-- vault-floor -->):
86
+ **wicked-vault ≥ 0.8.0** <!-- vault-floor -->):
87
87
  `wicked-vault record --scope <scope> --phase migrate --claim shape-change
88
88
  --kind schema-state --source "<migration-applied verification>"
89
89
  --criteria "<the post-condition>" --verifier exit_code_eq:0
@@ -141,7 +141,7 @@ core's fail-closed build. See `skills/domain/SKILL.md`.
141
141
  2. Harden the result with `code-modernization:modernize-harden` (security/CVEs,
142
142
  error handling) before it carries traffic.
143
143
  3. Record the parity proof as re-derivable evidence (vault present; **wicked-vault
144
- ≥ 0.5.0** <!-- vault-floor -->):
144
+ ≥ 0.8.0** <!-- vault-floor -->):
145
145
  `wicked-vault record --scope <scope> --phase modernize --claim parity-proof
146
146
  --kind differential --source "<the differential harness command>"
147
147
  --criteria "old(input) == new(input) on seeded data" --verifier exit_code_eq:0
@@ -121,7 +121,7 @@ in three domains").
121
121
  4. Append to the audit log with `wicked-garden run scripts/qe/verdict_audit.py append`
122
122
  so the verdict is replayable.
123
123
  Then record both produces as re-derivable evidence (vault present;
124
- **wicked-vault ≥ 0.5.0** <!-- vault-floor -->):
124
+ **wicked-vault ≥ 0.8.0** <!-- vault-floor -->):
125
125
  `wicked-vault record --scope <scope> --phase review --claim verdict
126
126
  --kind verdict --source "<verdict.json>" --criteria "<the bar>"
127
127
  --verifier exit_code_eq:0 --actor "${WICKED_VAULT_ACTOR:-garden-prove}"
@@ -62,7 +62,7 @@ proceed past validate without explicit user agreement on the AC set.
62
62
  4. Keep ACs minimal — 3–7 is the sweet spot. More than 10 means you're
63
63
  treating ACs as design.
64
64
  5. Record the AC artifact as re-derivable evidence (vault present;
65
- **wicked-vault ≥ 0.5.0** <!-- vault-floor -->):
65
+ **wicked-vault ≥ 0.8.0** <!-- vault-floor -->):
66
66
  `wicked-vault record --scope <scope> --phase specify
67
67
  --claim smart-acceptance-criteria --kind spec-doc
68
68
  --artifact <path/to/requirements.md>
@@ -97,7 +97,7 @@ npx wicked-vault --version 2>/dev/null || echo "MISSING"
97
97
  ```
98
98
 
99
99
  - `MISSING` → blocking. wicked-vault is the evidence backend every archetype gate re-derives against — without it, "done" can only be self-asserted. Show "wicked-vault is not installed. wicked-garden requires it as a direct infra peer (sibling to wicked-bus)." **INTERACTIVE mode**: native prompt header "wicked-vault Required", options "Install now (Required)" = "Run: npm i -g wicked-vault" / "Exit setup" = "Cancel — I'll install manually and re-run". **PLAIN_TEXT mode**: present numbered options and STOP. If install: run `npm i -g wicked-vault` (puts the `wicked-vault` binary on PATH) and confirm the CLI resolves with `npx wicked-vault --version`. On failure, show stderr and exit with manual instructions (`npm i -g wicked-vault`). If exit: "Run `npm i -g wicked-vault` then restart by invoking the wicked-garden-core skill's `setup` action."
100
- - Version string → compare it against the declared peer floor **≥ 0.5.0** <!-- vault-floor --> (single source: `scripts/loom/manifest.py` `version_pin`, lockstep with plugin.json `wicked_vault_version`). **Below the floor** (e.g. `0.4.5`) → tell the user to upgrade: "wicked-vault {version} is below the floor 0.5.0 — peer health checks (`loom doctor` / peer-health) report it as drift and fail. Upgrade: `npm i -g wicked-vault@latest`." At or above (e.g. `0.6.0`) → show "wicked-vault {version} — ready." Then verify the garden can resolve it for gating: `wicked-garden run scripts/qe/vault_gate.py resolve` should report `resolvable: true`. If `installed: false` (resolving only via npx), suggest `npm i -g wicked-vault` for faster gate latency — recommended, not a hard block.
100
+ - Version string → compare it against the declared peer floor **≥ 0.8.0** <!-- vault-floor --> (single source: `scripts/loom/manifest.py` `version_pin`, lockstep with plugin.json `wicked_vault_version`). **Below the floor** (e.g. `0.7.0`) → tell the user to upgrade: "wicked-vault {version} is below the floor 0.8.0 — peer health checks (`loom doctor` / peer-health) report it as drift and fail. Upgrade: `npm i -g wicked-vault@latest`." At or above (e.g. `0.8.0`) → show "wicked-vault {version} — ready." Then verify the garden can resolve it for gating: `wicked-garden run scripts/qe/vault_gate.py resolve` should report `resolvable: true`. If `installed: false` (resolving only via npx), suggest `npm i -g wicked-vault` for faster gate latency — recommended, not a hard block.
101
101
 
102
102
  ### 2.7 Verify wicked-bus (Recommended — audit-trail layer)
103
103
 
@@ -304,7 +304,7 @@ wicked-garden is ready!
304
304
  Storage: Local (DomainStore)
305
305
  wicked-estate: {"ready (binary present)" or "MISSING — memory/context layer degraded"}
306
306
  wicked-bus: {"ready (skills installed)" or "MISSING — install required"}
307
- wicked-vault: {version e.g. "0.6.0 — ready" or "MISSING — install required" or "{version} — below the 0.5.0 floor, upgrade required"}
307
+ wicked-vault: {version e.g. "0.8.0 — ready" or "MISSING — install required" or "{version} — below the 0.8.0 floor, upgrade required"}
308
308
  loom engine: {"ready (internal — scripts/loom/)" or "MISSING — garden installation problem"}
309
309
  Onboarding: {Full | Quick scout | Skipped}
310
310
  Directories: {paths onboarded}
@@ -216,10 +216,10 @@ wicked-garden run scripts/qe/lib/gate.mjs \
216
216
  ```
217
217
 
218
218
  - **Release dependency:** needs the wicked-vault **manifest-2.1 twin**
219
- (`validateManifest` + `CLAIM_LEVELS`) — merged on wicked-vault main,
220
- **unreleased** (npm 0.6.0 predates it). Until the next wicked-vault
221
- release, set `WICKED_QE_VAULT_PKG` to a local checkout of wicked-vault
222
- main; a pre-2.1 vault is refused fail-closed, never silently degraded.
219
+ (`validateManifest` + `CLAIM_LEVELS`), which shipped in wicked-vault 0.7.0;
220
+ garden's floor is **0.8.0**. An older vault is refused fail-closed, never
221
+ silently degraded — upgrade with `npm i -g wicked-vault@latest` (or set
222
+ `WICKED_QE_VAULT_PKG` to point at a specific 0.8.0+ install).
223
223
 
224
224
  ## Wiring context
225
225
 
@@ -279,7 +279,7 @@ Rules, all fail-closed:
279
279
  3. **Grades are opinions, not re-derivable facts**: `attest` appends, never
280
280
  edits; the vault refuses a self-grade (evaluator = recording actor) and
281
281
  a grade over a tampered artifact.
282
- 4. **Release dependency**: needs the wicked-vault manifest-2.1 twin —
283
- on wicked-vault main, **unreleased** (npm 0.6.0 predates it). Until the
284
- next wicked-vault release, set `WICKED_QE_VAULT_PKG` to a local checkout
285
- of wicked-vault main; a pre-2.1 vault is refused with that message.
282
+ 4. **Release dependency**: needs the wicked-vault manifest-2.1 twin
283
+ (shipped in wicked-vault 0.7.0; garden's floor is **0.8.0**). An older
284
+ vault is refused fail-closed — upgrade with `npm i -g wicked-vault@latest`
285
+ (or set `WICKED_QE_VAULT_PKG` to point at a specific 0.8.0+ install).
package/uv.lock CHANGED
@@ -1,6 +1,6 @@
1
1
  version = 1
2
2
  revision = 3
3
- requires-python = ">=3.10"
3
+ requires-python = ">=3.10, <3.15"
4
4
 
5
5
  [[package]]
6
6
  name = "aiofiles"