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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -2
- package/CHANGELOG.md +8 -1
- package/CONTRIBUTING.md +1 -1
- package/README.md +2 -2
- package/docs/extending.md +1 -1
- package/docs/required-peers.md +2 -2
- package/package.json +1 -1
- package/pyproject.toml +5 -1
- package/schemas/wicked-pack.schema.json +1 -1
- package/scripts/_pack_registry.py +1 -1
- package/scripts/loom/manifest.py +5 -4
- package/scripts/qe/lib/gate.mjs +9 -7
- package/scripts/qe/lib/vault-evidence.mjs +16 -18
- package/scripts/qe/runner/README.md +5 -6
- package/scripts/qe/runner/test/th17-vault-evidence.test.mjs +6 -6
- package/skills/archetype/refs/incident.md +2 -2
- package/skills/archetype/refs/migrate.md +1 -1
- package/skills/archetype/refs/modernize.md +1 -1
- package/skills/archetype/refs/review.md +1 -1
- package/skills/archetype/refs/specify.md +1 -1
- package/skills/core/refs/setup.md +2 -2
- package/skills/qe/refs/campaign-grading.md +4 -4
- package/skills/qe/refs/evidence.md +4 -4
- package/uv.lock +1 -1
|
@@ -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.
|
|
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.
|
|
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": "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
```
|
package/docs/required-peers.md
CHANGED
|
@@ -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.
|
|
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\.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
package/scripts/loom/manifest.py
CHANGED
|
@@ -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.
|
|
98
|
-
#
|
|
99
|
-
# MAJOR.MINOR floor in lockstep with
|
|
100
|
-
|
|
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``
|
package/scripts/qe/lib/gate.mjs
CHANGED
|
@@ -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
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
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
|
|
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
|
|
560
|
-
|
|
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
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
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
|
|
79
|
-
"
|
|
80
|
-
"
|
|
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
|
-
*
|
|
120
|
-
*
|
|
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 —
|
|
139
|
-
*
|
|
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 (
|
|
555
|
-
|
|
556
|
-
|
|
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`)
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* one the vault-dependent tests SKIP
|
|
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, /
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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`)
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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).
|