wicked-garden 12.37.0 → 12.37.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/components.json +2 -2
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.wicked/checks.json +4 -0
- package/CHANGELOG.md +52 -1
- package/docs/cross-cli-skill-format.md +92 -0
- package/hooks/hooks.json +1 -1
- package/hooks/scripts/bootstrap.py +3 -1
- package/hooks/scripts/subagent_lifecycle.py +4 -4
- package/package.json +1 -1
- package/scripts/_agents.py +29 -18
- package/scripts/_estate_client.py +19 -19
- package/scripts/_skill_meta.py +208 -0
- package/scripts/_validate_registry.py +22 -11
- package/scripts/crew/specialist_resolver.py +28 -13
- package/scripts/pack/check.py +18 -10
- package/scripts/platform/observability/health_probe.py +5 -4
- package/scripts/smaht/adapters/delegation_adapter.py +1 -1
- package/scripts/smaht/adapters/tools_adapter.py +1 -1
- package/skills/agentic/SKILL.md +11 -6
- package/skills/agentic/agentic-patterns/SKILL.md +4 -3
- package/skills/agentic/context-engineering/SKILL.md +4 -3
- package/skills/agentic/frameworks/SKILL.md +4 -3
- package/skills/agentic/refs/design.md +3 -3
- package/skills/agentic/review-methodology/SKILL.md +5 -4
- package/skills/agentic/review-methodology/refs/deliverable-templates.md +2 -2
- package/skills/agentic/review-methodology/refs/issue-taxonomy-quality-testing.md +2 -2
- package/skills/agentic/trust-and-safety/SKILL.md +4 -3
- package/skills/agentic-architect/SKILL.md +10 -18
- package/skills/agentic-performance-analyst/SKILL.md +10 -590
- package/skills/agentic-performance-analyst/refs/output-format.md +203 -0
- package/skills/agentic-performance-analyst/refs/process.md +390 -0
- package/skills/agentic-safety-reviewer/SKILL.md +9 -549
- package/skills/agentic-safety-reviewer/refs/output-format.md +248 -0
- package/skills/agentic-safety-reviewer/refs/process.md +302 -0
- package/skills/archetype/SKILL.md +2 -5
- package/skills/archetype/refs/build.md +4 -4
- package/skills/archetype/refs/decide.md +4 -4
- package/skills/archetype/refs/incident.md +7 -7
- package/skills/archetype/refs/migrate.md +4 -4
- package/skills/archetype/refs/modernize.md +7 -7
- package/skills/archetype/refs/review.md +15 -13
- package/skills/archetype/refs/ship.md +3 -3
- package/skills/archetype/refs/specify.md +3 -3
- package/skills/classify/SKILL.md +5 -7
- package/skills/core/SKILL.md +10 -9
- package/skills/core/refs/install.md +7 -6
- package/skills/core/refs/report-issue.md +2 -6
- package/skills/core/refs/reset.md +2 -2
- package/skills/core/refs/setup.md +21 -27
- package/skills/core/refs/templates.md +4 -4
- package/skills/data/SKILL.md +14 -17
- package/skills/data/refs/data-examples.md +1 -12
- package/skills/data/refs/ml.md +2 -2
- package/skills/data-engineer/SKILL.md +10 -26
- package/skills/deliberate/SKILL.md +4 -3
- package/skills/deliberate/refs/run-workflow.md +8 -17
- package/skills/domain/SKILL.md +14 -10
- package/skills/domain/vendor/README.md +1 -1
- package/skills/domain-coverage/SKILL.md +2 -9
- package/skills/domain-extractor/SKILL.md +3 -10
- package/skills/domain-modeler/SKILL.md +3 -10
- package/skills/draft/SKILL.md +16 -18
- package/skills/engineering/SKILL.md +22 -21
- package/skills/engineering/architecture/SKILL.md +11 -19
- package/skills/engineering/architecture/refs/architecture-template-deployment.md +3 -4
- package/skills/engineering/backend/SKILL.md +4 -3
- package/skills/engineering/debugging/SKILL.md +5 -10
- package/skills/engineering/docs/SKILL.md +5 -3
- package/skills/engineering/frontend/SKILL.md +4 -6
- package/skills/engineering/integration/SKILL.md +4 -3
- package/skills/engineering/integration/refs/versioning-breaking-changes.md +0 -1
- package/skills/engineering/integration/refs/versioning-migration-strategies.md +1 -1
- package/skills/engineering/large-scale-migration/SKILL.md +2 -0
- package/skills/engineering/patch/SKILL.md +4 -2
- package/skills/engineering/refs/debug.md +6 -6
- package/skills/engineering/refs/docs.md +4 -4
- package/skills/engineering/refs/plan.md +1 -1
- package/skills/engineering/refs/review.md +2 -2
- package/skills/engineering/system-design/SKILL.md +4 -3
- package/skills/engineering/system-design/refs/component-template-maintenance.md +2 -3
- package/skills/engineering/system-design/refs/interface-template-lifecycle.md +0 -1
- package/skills/engineering/unit-test-quality/SKILL.md +4 -4
- package/skills/engineering-api-documentarian/SKILL.md +6 -16
- package/skills/engineering-conformance-reviewer/SKILL.md +4 -5
- package/skills/engineering-migration-engineer/SKILL.md +7 -17
- package/skills/engineering-solution-architect/SKILL.md +5 -15
- package/skills/governed-worker/SKILL.md +4 -3
- package/skills/ground/SKILL.md +9 -18
- package/skills/mem/SKILL.md +19 -13
- package/skills/mem/refs/scopes.md +3 -2
- package/skills/platform/SKILL.md +9 -6
- package/skills/platform/audit/SKILL.md +7 -15
- package/skills/platform/compliance/SKILL.md +7 -16
- package/skills/platform/errors/SKILL.md +7 -5
- package/skills/platform/errors/refs/patterns.md +1 -1
- package/skills/platform/gate-benchmark-rebaseline/SKILL.md +4 -2
- package/skills/platform/gh-cli/SKILL.md +5 -3
- package/skills/platform/github-actions/SKILL.md +4 -6
- package/skills/platform/gitlab-ci/SKILL.md +4 -3
- package/skills/platform/glab-cli/SKILL.md +5 -3
- package/skills/platform/health/SKILL.md +6 -5
- package/skills/platform/health/refs/health.md +1 -1
- package/skills/platform/health/refs/sources.md +3 -6
- package/skills/platform/observability/SKILL.md +4 -2
- package/skills/platform/peer-health/SKILL.md +5 -3
- package/skills/platform/prereq-doctor/SKILL.md +6 -9
- package/skills/platform-compliance-officer/SKILL.md +10 -25
- package/skills/platform-privacy-expert/SKILL.md +10 -25
- package/skills/platform-security-engineer/SKILL.md +11 -27
- package/skills/product/SKILL.md +16 -27
- package/skills/product/acceptance-criteria/SKILL.md +4 -2
- package/skills/product/accessibility/SKILL.md +11 -17
- package/skills/product/analyze/SKILL.md +6 -7
- package/skills/product/imagery/SKILL.md +4 -2
- package/skills/product/imagery/alter/SKILL.md +4 -2
- package/skills/product/imagery/create/SKILL.md +4 -2
- package/skills/product/imagery/review/SKILL.md +4 -3
- package/skills/product/listen/SKILL.md +6 -8
- package/skills/product/mockup/SKILL.md +4 -3
- package/skills/product/refs/screenshot.md +5 -7
- package/skills/product/requirements-analysis/SKILL.md +6 -12
- package/skills/product/requirements-analysis/refs/requirements-example-export-integration.md +3 -21
- package/skills/product/requirements-graph/SKILL.md +4 -2
- package/skills/product/requirements-migrate/SKILL.md +4 -2
- package/skills/product/requirements-navigate/SKILL.md +4 -2
- package/skills/product/screenshot/SKILL.md +13 -21
- package/skills/product/strategy/SKILL.md +7 -17
- package/skills/product/synthesize/SKILL.md +4 -2
- package/skills/product/ux-review/SKILL.md +6 -4
- package/skills/product/visual-direction/SKILL.md +4 -2
- package/skills/product/visual-review/SKILL.md +5 -4
- package/skills/product-a11y-expert/SKILL.md +10 -24
- package/skills/product-requirements-analyst/SKILL.md +10 -23
- package/skills/product-ui-reviewer/SKILL.md +15 -27
- package/skills/product-ux-designer/SKILL.md +10 -23
- package/skills/product-value-strategist/SKILL.md +6 -16
- package/skills/prove/SKILL.md +8 -7
- package/skills/repo-learn/SKILL.md +66 -54
- package/skills/repo-learn/refs/capture-proposals.md +19 -22
- package/skills/runtime-exec/SKILL.md +5 -7
- package/skills/search/SKILL.md +62 -69
- package/skills/search/refs/answer.md +3 -2
- package/skills/search/refs/hotspots.md +17 -28
- package/skills/search/refs/service-map.md +4 -3
- package/skills/swarm/SKILL.md +23 -13
- package/skills/swarm/refs/fan-out.md +9 -3
- package/skills/swarm/refs/independent-verification.md +16 -10
- package/skills/swarm/refs/receipts-and-evidence.md +4 -4
- package/skills/swarm/refs/recon-synthesis.md +3 -3
- package/skills/workflow/SKILL.md +5 -6
- package/skills/workflow/refs/integration.md +26 -44
- package/skills/worktrees/SKILL.md +6 -8
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"domains": ["agentic", "crew", "data", "engineering", "jam", "mem", "persona", "platform", "product", "qe", "search", "smaht"],
|
|
4
4
|
"summary": {
|
|
5
5
|
"skills": 144,
|
|
6
|
-
"fork_skills":
|
|
6
|
+
"fork_skills": 73,
|
|
7
7
|
"hooks": 13,
|
|
8
8
|
"specialists": 7
|
|
9
9
|
},
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
"workflow": ["workflow"],
|
|
104
104
|
"worktrees": ["worktrees"]
|
|
105
105
|
},
|
|
106
|
-
"fork_skills": ["wicked-garden-agentic-architect", "wicked-garden-agentic-performance-analyst", "wicked-garden-agentic-safety-reviewer", "wicked-garden-archetype", "wicked-garden-classify", "wicked-garden-data-engineer", "wicked-garden-domain-coverage", "wicked-garden-domain-extractor", "wicked-garden-domain-modeler", "wicked-garden-engineering-api-documentarian", "wicked-garden-engineering-conformance-reviewer", "wicked-garden-engineering-
|
|
106
|
+
"fork_skills": ["wicked-garden-agentic-architect", "wicked-garden-agentic-performance-analyst", "wicked-garden-agentic-safety-reviewer", "wicked-garden-archetype", "wicked-garden-classify", "wicked-garden-data-engineer", "wicked-garden-domain-coverage", "wicked-garden-domain-extractor", "wicked-garden-domain-modeler", "wicked-garden-engineering-api-documentarian", "wicked-garden-engineering-conformance-reviewer", "wicked-garden-engineering-migration-engineer", "wicked-garden-engineering-solution-architect", "wicked-garden-ground", "wicked-garden-integration-discovery", "wicked-garden-jam-brainstorm-facilitator", "wicked-garden-jam-council", "wicked-garden-mem-capture", "wicked-garden-mem-ingest", "wicked-garden-persona-agent", "wicked-garden-platform-compliance-officer", "wicked-garden-platform-privacy-expert", "wicked-garden-platform-security-engineer", "wicked-garden-product-a11y-expert", "wicked-garden-product-requirements-analyst", "wicked-garden-product-ui-reviewer", "wicked-garden-product-ux-designer", "wicked-garden-product-value-strategist", "wicked-garden-qe-a11y-test-engineer", "wicked-garden-qe-acceptance-test-executor", "wicked-garden-qe-acceptance-test-reviewer", "wicked-garden-qe-acceptance-test-writer", "wicked-garden-qe-ai-feature-test-engineer", "wicked-garden-qe-chaos-test-engineer", "wicked-garden-qe-code-analyzer", "wicked-garden-qe-compliance-test-engineer", "wicked-garden-qe-contract-testing-engineer", "wicked-garden-qe-coverage-archaeologist", "wicked-garden-qe-data-quality-tester", "wicked-garden-qe-e2e-orchestrator", "wicked-garden-qe-exploratory-tester", "wicked-garden-qe-flaky-test-hunter", "wicked-garden-qe-fuzz-property-engineer", "wicked-garden-qe-iac-test-engineer", "wicked-garden-qe-incident-to-scenario-synthesizer", "wicked-garden-qe-integration-test-engineer", "wicked-garden-qe-load-performance-engineer", "wicked-garden-qe-localization-test-engineer", "wicked-garden-qe-mutation-test-engineer", "wicked-garden-qe-observability-test-engineer", "wicked-garden-qe-production-quality-engineer", "wicked-garden-qe-release-readiness-engineer", "wicked-garden-qe-requirements-quality-analyst", "wicked-garden-qe-risk-assessor", "wicked-garden-qe-scenario-executor", "wicked-garden-qe-security-test-engineer", "wicked-garden-qe-semantic-reviewer", "wicked-garden-qe-snapshot-hygiene-auditor", "wicked-garden-qe-test-automation-engineer", "wicked-garden-qe-test-code-quality-auditor", "wicked-garden-qe-test-data-manager", "wicked-garden-qe-test-designer", "wicked-garden-qe-test-impact-analyzer", "wicked-garden-qe-test-oracle", "wicked-garden-qe-test-strategist", "wicked-garden-qe-testability-reviewer", "wicked-garden-qe-ui-component-test-engineer", "wicked-garden-qe-visual-regression-engineer", "wicked-garden-smaht", "wicked-garden-swarm", "wicked-garden-wickedizer", "wicked-garden-workflow", "wicked-garden-worktrees"],
|
|
107
107
|
"hooks": ["SessionStart", "UserPromptSubmit", "PreToolUse", "PostToolUse", "PostToolUseFailure", "TaskCompleted", "SubagentStart", "SubagentStop", "PermissionRequest", "Notification", "PreCompact", "Stop", "SessionEnd"],
|
|
108
108
|
"specialists": [
|
|
109
109
|
{
|
|
@@ -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.37.
|
|
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.37.1"}], "version": "12.37.1"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wicked-garden",
|
|
3
|
-
"version": "12.37.
|
|
3
|
+
"version": "12.37.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), 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,56 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [12.37.1] — 2026-09-14
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- **`search` and `mem` have ONE way to the estate on every seat and in every session kind — the
|
|
9
|
+
two-ladder structure and the "human session" branch that routed symbol lookup to an estate MCP
|
|
10
|
+
tool are DELETED (FIX-IT-ALL L4-⑨b; D1 / D2; F-RC1-045 class in text, wave-1 P6 NO-GO recon Q1 /
|
|
11
|
+
Q4 #2).** After #1146 the `search` skill still said "resolve … with the estate `SearchEntity`
|
|
12
|
+
tool", listed "the estate MCP tools when connected" as rung 1 of a *human session* ladder, gated
|
|
13
|
+
the shim command behind "in a governed run" (a chat is not one), and its description — shown in
|
|
14
|
+
the skill listing before load — sent symbol lookup to "the wicked-estate MCP's SearchEntity";
|
|
15
|
+
`mem` gated `--readonly` the same way and called the engine "MCP tools". Now: every graph read
|
|
16
|
+
and every store read is the read-only shim — `wicked-garden run scripts/_estate_client.py --readonly call '{"tool":"<X>","arguments":{…}}'`, store
|
|
17
|
+
pinned by `WICKED_ESTATE_DB` / `WICKED_HOME` / `WICKED_MEMORY_DB` — on every seat (claude, codex,
|
|
18
|
+
pi, copilot, opencode) and in every session kind (a governed run's unit, a chat turn, a human
|
|
19
|
+
session); `SearchEntity` / `BlastRadius` / `Lineage` / `RankHotspots` / `rules.recall` are named
|
|
20
|
+
as tools reached through it, never as things to "connect"; the `wicked-estate` CLI is not a rung
|
|
21
|
+
(write verbs never from a seat, read verbs not how a seat grounds); a seat names the path that
|
|
22
|
+
answered (`shim` / `ungrounded`). `SearchEntity` `name` (exact / substring symbol) vs `query`
|
|
23
|
+
(full-text over the knowledge stores; 0 hits for a code symbol) is documented (F-W1-006).
|
|
24
|
+
`hotspots` / `service-map` / `answer` / `mem/refs/scopes.md` say the same one way. The `search`
|
|
25
|
+
description fits the 1024-character bound (its `description-too-long` baseline entry is gone —
|
|
26
|
+
0 stale, nothing added). No word "MCP" survives in `skills/search/**` or `skills/mem/**`.
|
|
27
|
+
- **repo-learn = wicked-crew's three `capture-learnings` units; the deliverable-file fallback is
|
|
28
|
+
DELETED; one grounding rung (FIX-IT-ALL L4-⑨; D-20 / R13, R12 text; F-RC1-048 C2, F-RC1-049).**
|
|
29
|
+
`skills/repo-learn/SKILL.md` described FOUR phases while crew's def dispatches THREE units
|
|
30
|
+
(`churn` / `hotspots` / `capture` — `Phase n/3`), so a unit could not tell which row was its
|
|
31
|
+
work; the skill now names the three units (hotspots + read = unit 2), says "do only that row's
|
|
32
|
+
work; proposals are submitted ONLY in the capture unit", and describes the estate SHIM as the
|
|
33
|
+
one grounding transport (wicked-core ≥ 0.7.26 registers no estate MCP on any seat). The
|
|
34
|
+
"deliverable file the run names" fallback is gone from `SKILL.md` and
|
|
35
|
+
`refs/capture-proposals.md` — nothing in wicked-crew ever consumed it, so it promised a record
|
|
36
|
+
that never existed: on a failed `propose` the fenced `json` block in the unit's OUTPUT is the
|
|
37
|
+
only record, and counts read `derived N / submitted M / failed K`. The governed ladder in
|
|
38
|
+
`repo-learn` and `search` collapses to ONE rung — shim in `--readonly`; if it answers
|
|
39
|
+
`ok: false` or the fence denies the call, write `estate: not available (<reason>)` and continue
|
|
40
|
+
UNGROUNDED (never a grep approximation as the graph answer, never a retry of a denied call);
|
|
41
|
+
the read-only CLI stays fence-allowed but is no longer a documented rung. `mem/SKILL.md` and
|
|
42
|
+
the `_estate_client.py` docstrings now say the `WICKED_RUN_*` markers are stamped on the
|
|
43
|
+
worker's own environment by both carriers (the primary governed-mode cue) — code unchanged.
|
|
44
|
+
|
|
45
|
+
- **Wave-2 catalog batch B3 (DES-L6 B5): `swarm` (+ `refs/fan-out`, `recon-synthesis`, `independent-verification`, `receipts-and-evidence`), `worktrees`, `workflow` (+ `refs/integration`) are cross-CLI (fixall L6-B3; D-21 — BC-37 / BC-39; the swarm verifier speaks the D-9 verdict grammar).** Three frontmatters carry the closed key set with `metadata.role: worker` plus `phases` / `archetypes` (`status: stable` and `context: fork` dropped); the three fork-isolation sentences are gone. **Verdict grammar in the swarm verifier wave:** `PARTIAL` is no longer a verdict — `independent-verification.md` renders `PASS / FAIL` and an incomplete or overstated change is FAIL with the gap named; the receipt template's `verdict:` field is `PASS | FAIL`; "never inflate a FAIL-with-a-gap to PASS"; the GAP / PARTIAL / ALREADY-COVERED marks for recon-finding COVERAGE are a different vocabulary and stay. `recon-synthesis.md`'s checkpoint no longer names `AskUserQuestion` (a harness without a native question prompt asks in plain text and waits). `worktrees` describes worktree-isolated agents generically and locates worktrees through `git worktree list` plus `<project state dir>/worktrees/crew-*` — the Claude-specific `.claude/worktrees/agent-*` path and a home-directory example path are gone from the body. `workflow/refs/integration.md`: the `TaskCreate(` / `TaskUpdate(` pseudo-calls become the field list every harness's task list can carry, with one **Hand-off (harness-specific)** paragraph for the Claude Code task-list tools; the three `Skill(skill="wicked-garden-mem", …)` calls are Hand-off paragraphs (store decision, recall, store episode). `tests/cross_cli_baseline.json` shrinks by exactly this batch (11 pairs across 5 files → 305; 0 stale; nothing added); `components.json` unchanged (the three stay workers). **Folded from the B2 review (review-garden-1147):** N1 — the fork-isolation sentence B1 removed from its workers is now gone from `classify`, `ground` and `runtime-exec` too, `classify` no longer says "You are `context: fork`" or cites `allowed-tools`, and `prove` says "never as a hand-off"; N2 — the setup / install / reset question-mode text says the detector keys on the Claude harness's dangerous-mode flag only and every other seat reads PLAIN_TEXT regardless (the detector itself, `scripts/setup/detect_state.py`, is a later L6 item — no tooling change in a text batch); N3 — on wicked-crew ≤ 0.7.35 the translated ROUTERS (`core`, `deliberate`, `prove`, `draft`, `domain`) publish `kind: module` too, not only the workers (fork-first then `user-invocable`; cosmetic — the studio badge; 0 functional consumers) until crew's role-first `skillKindOf` (0.7.36); N4 — `docs/cross-cli-skill-format.md` documents the `Hand-off (harness-specific)` variant; N5 — the `runtime-exec → core/refs/runtime.md` fold is owned by L6's fold/retire batch (wave-2 B10 = DES B12, with mem-capture / mem-ingest / smaht / integration-discovery); N6 — `governed-worker` E1 says an in-tree tee is refused (R7). **Fan-out is role-keyed and runs on every seat (review-garden-1148 H2):** the swarm's implementer and verifier waves are Hand-offs to `wicked-garden-governed-worker` (Creator / Evaluator) or the named verifier skill, one per unit — in parallel where the harness runs parallel sub-agents, **serially otherwise as the sanctioned degradation** (`serial_reason` recorded; each unit's output in its own scratch file); the structural rule that survives every harness is verifier ≠ implementer, and "fork skill" / the model hint are gone. `workflow/refs/integration.md`'s cut `TaskUpdate(` fence is repaired (H1: fences even again; every heading after it renders as a heading) and the remaining task-tool residue (`TaskList()` / `TaskGet(`, the PreToolUse sentences, the persistence path) lives inside the harness-specific Hand-off (M1); the setup PLAIN_TEXT bullet keeps its STOP-and-wait sentence and install's PLAIN_TEXT label says it is the normal mode on every non-Claude seat (N1). BM-style check for the wave-2 P2b/BM re-run: a non-claude seat receives `wicked-garden-swarm` / `wicked-garden-worktrees` / `wicked-garden-workflow` in `skillsSnapshotHanded` with 0 `seatConstraint`, and a swarm verifier unit on that seat ends its receipt with `PASS` or `FAIL` only.
|
|
46
|
+
- **Wave-2 catalog batch B4 (DES-L6 B6): `archetype` + its 8 playbook refs (`build`, `decide`, `incident`, `migrate`, `modernize`, `review`, `ship`, `specify`) are cross-CLI (fixall L6-B4; D-21 — BC-37 / BC-39).** The v11 work-shape playbook dispatcher keeps every archetype's phase shape, produces, HITL discipline and cost band byte-for-byte — only the dispatch prose changes. `archetype/SKILL.md` carries the closed key set with `metadata.role: worker` (what `skill_role()` inferred at HEAD — `components.json`, crew's `skillKindOf` and the AgentProfile registry classify it the same as before); `context: fork`, `user-invocable`, `allowed-tools` and the fork-isolation sentence are gone. The eight refs' gate paragraphs no longer name `wicked-loom` as a "required peer": the gate re-derives **through the garden's in-process gate engine** (`scripts/qe/vault_gate.py` → `scripts/loom/`, which shells `wicked-vault cross-check`), and **wicked-vault is the one required peer** (installed by the `wicked-garden-core` skill's `setup` action); the fail-closed semantics (`gate: "unavailable"`, `satisfied: false`, `--no-require`) are unchanged. `review.md`'s specialist dispatch (`Skill(skill="…")` + the fork sentence) is a **Hand-off** naming the worker skills, and the stale `wicked-garden:jam:council` colon name is the real `wicked-garden-jam-council` skill. `tests/cross_cli_baseline.json` shrinks by exactly this batch (12 pairs across 9 files → 293 after B3's 11; 0 stale; nothing added); `components.json` unchanged. BM-style check for the wave-2 P2b/BM re-run: a non-claude seat receives `wicked-garden-archetype` in `skillsSnapshotHanded` with 0 `seatConstraint`, and an archetype `review` unit on that seat hands off to a worker skill by name (no `Skill(` in its output) while its gate still fails closed without the vault.
|
|
47
|
+
- **Wave-2 catalog batch B5 (DES-L6 B7): the `engineering` domain — the router, `engineering-api-documentarian` / `engineering-conformance-reviewer` / `engineering-migration-engineer` / `engineering-solution-architect`, ten nested knowledge modules and three refs — is cross-CLI; the F-RC1-013 architecture half is closed (fixall L6-B5; D-21 — BC-37 / BC-39).** The router carries the closed key set with `metadata.role: router` (phases `design,build,review`; description ≤ 1024 with the same triggers); the four workers `role: worker` (Claude hints, fork sentences and the pre-v12.25 `Task(subagent_type=…)` compat tails dropped — a worker is reached by name through a Hand-off); the nested modules `role: module` (`portability` / `status` / the `# TODO … Claude Code supports 'paths'` comments dropped) — `engineering/debugging`, the one nested skill that carried `context: fork` and is referenced by name nowhere, is a module too (`.claude-plugin/components.json` regenerated, `fork_skills` 74 → 73). The router's "Fork workers" table is "Workers" with a Hand-off paragraph; the debug step names the `superpowers` plugin's `systematic-debugging` skill where the seat has it and gives the inline loop otherwise; `architecture`'s `TaskCreate(` block is the task-field description pointing at `wicked-garden-workflow`'s `refs/integration.md`; `wicked-garden:platform:security-engineer` → the skill name; "wicked-loom / wicked-vault availability" → "the gate engine / wicked-vault". **F-RC1-013 (architecture half):** `architecture/refs/architecture-template-deployment.md`'s three `../` template links are `<path to …>` placeholders crew's publisher no longer resolves. **Six pre-existing fence breaks repaired** (each made everything after it render as code): a doubled closer (`versioning-breaking-changes`), an unclosed trailing block (`versioning-migration-strategies`), a stray EOF closer (`interface-template-lifecycle`), a stray closer + a 3-backtick wrapper holding 3-backtick blocks → 4-backtick wrapper (`component-template-maintenance`, `refs/docs.md` README template), and `core/SKILL.md`'s wrapped prose line that began with "```json fence for paste)" — a fence opener to any CommonMark renderer (B2's file, folded forward). **Folded from the B4 review (review-garden-1149):** the eight gate paragraphs read "The gate engine ships inside wicked-garden; wicked-vault (the evidence backend) is the one required peer" (N1); the seven plugin colon-form names in `decide` / `build` / `incident` / `migrate` / `modernize` are skill names — the platform ones the `wicked-garden-platform-health` module and the `wicked-garden-platform` skill's `traces` / `incident` actions (N2 — 24 distinct colon names remain catalog-wide; a B18 token or a docs-pass sanction is owed); `review.md` lists the Evaluator section of the `wicked-garden-governed-worker` **floor**, not a "worker skill" (N3); B4's bullet total corrected to 293 after B3. Deferred, owner named: the DES's `conformance-reviewer → ref` fold (with `runtime-exec → core/refs/runtime.md`) lands in L6's fold/retire batch (wave-2 B10 = DES B12); `scripts/platform/guard_pipeline.py:1217` names the skill by name and is unchanged. `tests/cross_cli_baseline.json` shrinks by exactly this batch (28 pairs across 16 files → 265; 0 stale; nothing added). BM-style check for the wave-2 P2b/BM re-run: a non-claude seat receives the router and the four workers in `skillsSnapshotHanded` with 0 `seatConstraint`; an `arch` unit on that seat hands off to `wicked-garden-engineering-solution-architect` by name, and a publish over this garden reports 0 `unresolved-ref` warnings for the architecture template (F-RC1-013 closed on both halves).
|
|
48
|
+
- **Wave-2 catalog batch B6 (DES-L6 B8): the `platform` domain — the router, `platform-security-engineer` / `platform-compliance-officer` / `platform-privacy-expert`, and twelve nested modules — is cross-CLI (fixall L6-B6; D-21 — BC-37 / BC-39).** The router carries the closed key set with `metadata.role: router` (phases `build,review,operate`), its "Fork workers" section is "Workers" with a Hand-off paragraph naming the three worker skills; the workers `role: worker` (Claude hints, fork sentences and the pre-v12.25 `Task(subagent_type=…)` compat tails dropped — reached by name through a Hand-off), and each worker's `TaskUpdate(` findings block is "append the analysis to the current task's description — the harness's task list where it has one (`wicked-garden-workflow`'s `refs/integration.md`), else your working notes" with the description template kept verbatim; the nested modules `role: module` (`peer-health` keeps `bootstrap`; `portability` and the `# TODO … Claude Code supports 'paths'` comments dropped) — `audit` / `compliance` / `prereq-doctor` lose the dispatch fallback sentence, their `TaskUpdate(` one-liners read as task-description appends, their `Skill(skill="wicked-garden-mem", …)` recalls and `prereq-doctor`'s self-dispatch are Hand-off paragraphs, `errors` names the `wicked-garden-engineering-debugging` module instead of a `skills/engineering/debugging/` path (review-garden-1150 N4), and `peer-health` says "no external loom process". `tests/cross_cli_baseline.json` shrinks by exactly this batch (32 pairs across 16 files → 233; 0 stale; nothing added); `components.json` unchanged. BM-style check for the wave-2 P2b/BM re-run: a non-claude seat receives the router and the three workers in `skillsSnapshotHanded` with 0 `seatConstraint`, and a platform `security` unit on that seat hands off to `wicked-garden-platform-security-engineer` by name, recording findings as task text or working notes.
|
|
49
|
+
- **Wave-2 catalog batch B7 (DES-L6 B9): the `product` domain — the router, `product-a11y-expert` / `product-requirements-analyst` / `product-ui-reviewer` / `product-ux-designer` / `product-value-strategist`, nineteen nested modules and two refs — is cross-CLI (fixall L6-B7; D-21 — BC-37 / BC-39).** The router carries the closed key set with `metadata.role: router` (phases `clarify,design,test,review`); its `strategy --focus all` and `ux-review --focus all` steps replace the `Skill(skill="wicked-garden-product-…")` blocks with Hand-off paragraphs naming the worker skills (the ux-review Hand-off carries all three asks, run concurrently where the harness can), `align` persists status in the harness's task list where it has one (`wicked-garden-workflow`'s `refs/integration.md`), else working notes, the `screenshot` action opens the image with the harness's file reader, and "Knowledge modules and fork workers" is "Knowledge modules and workers"; the five workers `role: worker` (Claude hints, fork sentences and the pre-v12.25 `Task(subagent_type="wicked-garden:product:…")` compat tails dropped — reached by name through a Hand-off; `wicked-garden:search` ids read "the `wicked-garden-search` skill"), and each worker's `TaskCreate(` / `TaskUpdate(` findings block is "track / append in the harness's task list where it has one, else your working notes" with the subject and description template kept verbatim in a ```markdown fence; the nested modules `role: module` (phases `clarify,design,review`; `portability` dropped) — `listen` / `requirements-analysis` / `strategy` and the `requirements-example-export-integration` ref lose the dispatch fallback sentence and their `Skill(skill="wicked-garden-mem", …)` store/recall calls are Hand-off paragraphs, their `TaskCreate(` / `TaskUpdate(` blocks read as task-list entries, `screenshot` / `refs/screenshot.md` / `accessibility` / `ux-review` / `product-ui-reviewer` say "the harness's file reader" and "the seat's multimodal vision" instead of the Read tool and Claude's vision, and `accessibility` / `ux-review` / `visual-review` name the `wicked-garden-search` skill. Kept on purpose: `resolve_path.py wicked-garden:product` (a script argument — the store id, not a skill reference), the `{local_root}/wicked-garden:product/voice/…` path segments, and the description trigger phrases (`former /wicked-garden:product:{action} invocation`) — the B18 colon-form token rules on those. `tests/cross_cli_baseline.json` shrinks by exactly this batch (57 pairs across 27 files → 176; 0 stale; nothing added); `components.json` unchanged (no fork skill leaves the set). BM-style check for the wave-2 P2b/BM re-run: a non-claude seat receives the router and the five workers in `skillsSnapshotHanded` with 0 `seatConstraint`, and a product `ux-review --focus all` unit on that seat hands off to `wicked-garden-product-ux-designer`, `wicked-garden-product-ui-reviewer` and `wicked-garden-product-a11y-expert` by name, recording findings as task text or working notes. Review fold (review-garden-1153): the five `Read(file_path=…)` and one `Glob(pattern=…)` pseudo-call fences in `screenshot`, `refs/screenshot.md` and `analyze` read as harness-neutral instructions, the ux-review fan-out reads like the swarm's ("in parallel where your harness runs parallel sub-agents, serially otherwise — record `serial_reason`"), and the portability lint gains an eighth cross-CLI token, `claude-tool-call` (`Read(` / `Write(` / `Edit(` / `MultiEdit(` / `Bash(` / `Glob(` / `Grep(` / `WebFetch(` / `WebSearch(` / `NotebookEdit(` with an argument shape) — the class was lint-blind for two batches; its baseline is empty, every hit was in this batch.
|
|
50
|
+
- **Wave-2 catalog batch B8 (DES-L6 B10): the `data` and `agentic` domains — two routers, `agentic-architect` / `agentic-performance-analyst` / `agentic-safety-reviewer` / `data-engineer`, five agentic knowledge modules and seven refs — are cross-CLI (fixall L6-B8; D-21 — BC-37 / BC-39).** The routers carry the closed key set with `metadata.role: router` (`agentic` phases `design,review`; `data` phases `clarify,design,build`, its description trimmed under 1024 chars and its `# TODO … Claude Code supports 'paths'` hint dropped): `agentic`'s "Heavyweight full review" hands off to the three worker skills — in parallel where the harness runs parallel sub-agents, serially otherwise with `serial_reason` recorded — through a Hand-off paragraph, and `data`'s inline-vs-delegated paragraph hands off to `wicked-garden-data-engineer` the same way (its H1 is "Data Domain", no colon id). The four workers are `role: worker` (Claude hint keys incl. `tool-capabilities` — it resolves into `allowed-tools` — fork sentences and `data-engineer`'s pre-v12.25 `Task(subagent_type=…)` compat tail dropped; `wicked-garden:search` ids read "the `wicked-garden-search` skill"; each `TaskUpdate(` findings block is "append the findings to the current task's description — the harness's task list where it has one, else your working notes" with the template kept verbatim in a ```markdown fence; `agentic-architect`'s ADK checklist says "review how each agent is instantiated" instead of naming `Agent(model=...)`). The two oversized workers shed `skill-too-large`: `agentic-performance-analyst` (721 lines) and `agentic-safety-reviewer` (685 lines) keep their focus, integration, anti-pattern and quick-reference sections and point at new `refs/process.md` (the step-by-step process, incl. the per-strategy optimization template) and `refs/output-format.md` (the report template, now a 4-backtick wrapper because it holds ```-blocks) — 141 / 145 lines after. The five agentic modules are `role: module` (`portability` dropped). Refs: `data/refs/data-examples.md`'s `TaskCreate(` block is a task-list entry; the three pre-existing early-closing template wrappers (`agentic/refs/design.md`, `agentic/review-methodology/refs/issue-taxonomy-quality-testing.md`, `data/refs/ml.md`) are 4-backtick wrappers and leave `FENCE_PAIRING_BASELINE` (7 left). The `claude-dispatch` regex learns that an assignment, constructor or lambda context (`x = Agent(`, `new Agent({`, `lambda: Agent(`, `t = Task(`) is framework code in a sample, not a dispatch — the agentic domain's six CrewAI / AutoGen / ADK sample refs were the only files it mis-flagged (four table rows pin it; a bare `Agent(prompt=…)` still trips). Kept on purpose: the `TaskCreate/TaskUpdate with metadata={…}` prose bullets (no call shape, as in B5–B7), the description trigger phrases, and `agentic/refs/design.md`'s `agentic:review` / `agentic:audit` action shorthands → the B18 colon-form token. `tests/cross_cli_baseline.json` shrinks by exactly this batch (36 pairs across 18 files → 140; 0 stale; nothing added); `components.json` unchanged. BM-style check for the wave-2 P2b/BM re-run: a non-claude seat receives both routers and the four workers in `skillsSnapshotHanded` with 0 `seatConstraint`, and an agentic `review` heavyweight unit on that seat hands off to `wicked-garden-agentic-architect`, `wicked-garden-agentic-safety-reviewer` and `wicked-garden-agentic-performance-analyst` by name, recording findings as task text or working notes. Revision (review-garden-1154): the dispatch-regex lookbehinds apply to the framework-ambiguous `Task(` / `Agent(` only — `Skill(`, `TaskCreate(`, `TaskUpdate(`, `TodoWrite(` trip in every context (BC-38 holds; four adversarial rows pin it); `agentic-architect`'s and `review-methodology/refs/deliverable-templates.md`'s ```markdown wrappers held tagged blocks and swallowed real sections — 4-backtick wrappers now, and the repo pairing walk flags that signature (a bare fence holding both a heading and a tagged fence; two pre-existing files baselined shrink-only); the `tool-capabilities` frontmatter reader in `scripts/_agents.py` and its vacuous test are deleted (0 declarers) — the resolver / registry / bootstrap step 3b / `wg-check` §4b retire in a dedicated follow-up.
|
|
51
|
+
- **Wave-2 catalog batch B2 (DES-L6 B4): the core group — `core` (+ `refs/install`, `report-issue`, `reset`, `setup`, `templates`), `classify`, `deliberate` (+ `refs/run-workflow`), `ground`, `prove`, `runtime-exec` — is cross-CLI (fixall L6-B2; D-21 — BC-37 / BC-39).** Six frontmatters carry the closed key set with `metadata.role` (`router` for `core` / `deliberate` / `prove` with `phases` / `archetypes`; `worker` for `classify` / `ground`; `module` for `runtime-exec`, which is `user-invocable: false` and never dispatched by name — the DES's fold into `core/refs/runtime.md` is a follow-up, not this batch) — `context: fork`, `user-invocable`, `allowed-tools`, `portability`, `phase_relevance`, `archetype_relevance` are gone. Every `Skill(skill="wicked-garden-mem", …)` dispatch (report-issue recall, run-workflow recall + store, setup ingest + three onboarding stores, ground's per-term recall) is now a **Hand-off** paragraph naming the skill and its action; the deliberate `Task(subagent_type="Explore")` block hands its prompt to "your harness's exploration agent" or runs inline; ground's `Agent(Explore)` mentions read the same way; the bus query is a Hand-off to the wicked-bus `query` skill when the bus plugin is present. The setup / install / reset wizards no longer name `AskUserQuestion`: INTERACTIVE mode is "your harness's native question prompt where it has one", PLAIN_TEXT (numbered list, STOP and wait) is the cross-CLI default — the same two modes, same answer verification. `Claude Code` prose is generic ("the host CLI's plugin copy / plugin root", "manual report from the coding-agent session", the four `templates.md` attributions); the one inherently Claude-specific step (setup 6.5, the `.claude/CLAUDE.md` hint block) is a **Hand-off (harness-specific)** paragraph that other seats skip. `wicked-loom` references in `install.md`, `setup.md` and `prove` read "the loom engine / loom package" (the text retires the reference ahead of the CI peer). `.claude-plugin/components.json` regenerated (`fork_skills` 75 → 74: `runtime-exec` is a module). `tests/cross_cli_baseline.json` shrinks by exactly this batch (30 pairs across the 12 files → 316; 0 stale; nothing added). **Also folded from the B1 review (review-garden-1145):** `domain`'s Hand-off drops "(a fresh context)" — the Skill tool no longer isolates once `context: fork` is gone (BC-37); `draft`'s description carries its exact triggers again ("print-ready A4 / Letter", "make it two pages", the 3:1 large-text clause) at ≤ 1024 chars; and, disclosed: on wicked-crew ≤ 0.7.35 the translated workers' snapshot `kind` reads `module` (the studio badge) until crew's role-first `skillKindOf` (PR-L6-3, 0.7.36) — no engine or crew logic reads `kind`. **L4-granted one-liner (review-garden-1146 N4):** `governed-worker` E1 names the notes root as the tee target (`| tee <notes root>/<name>.log`, never into the checkout). BM-style check for the wave-2 P2b/BM re-run: a non-claude seat receives these six skills in `skillsSnapshotHanded` with 0 `seatConstraint`, and a `core` setup on such a seat runs its wizards in PLAIN_TEXT mode end to end.
|
|
52
|
+
- **Wave-2 catalog batch B1 (DES-L6 B3): `draft`, `domain`, `domain-extractor`, `domain-modeler`, `domain-coverage` are cross-CLI (fixall L6-B1; D-21 — BC-37 / BC-39; F-RC1-013 half).** The first translated batch after B0: the five frontmatters carry only the closed key set with `metadata.role` (`router` for `draft` / `domain` with `phases` / `archetypes` replacing the legacy `phase_relevance` / `archetype_relevance`; `worker` for the three domain workers) — `context: fork`, `subagent_type`, `model`, `effort`, `max-turns`, `color`, `allowed-tools`, `user-invocable` are gone (no other CLI, nor wicked-crew / wicked-core, read them); the `domain` router's `Task(subagent_type=…)` dispatch is now the one cross-CLI **Hand-off** paragraph naming the three worker skills; the three workers lose the Claude fork-isolation sentence (the Hand-off keeps their output separate on every seat); the `draft` / `domain` descriptions fit the 1024-character bound (same triggers, tighter wording). `skills/domain/vendor/README.md` names the sibling `wicked-core` checkout without the `../wicked-core/…` path token crew's publisher reported as an `unresolved-ref` warning (F-RC1-013, the domain half; the architecture half rides B7). `tests/cross_cli_baseline.json` shrinks by exactly this batch (9 pairs across the 5 files → 346; 0 stale); no baseline entry added. Classification unchanged: the three workers stay workers (`components.json` in sync), the two routers stay routers. BM-style check for the wave-2 P2b/BM re-run: a non-claude seat (pi / opencode / codex) receives these five skills in `skillsSnapshotHanded` with 0 `seatConstraint`, and a `domain` run hands off to the workers by name.
|
|
53
|
+
- **Worker identity is role-keyed, not fork-keyed: `metadata.role ∈ {worker, router, module, floor}` read by ONE helper, and the lint judges the Claude shape itself (FIX-IT-ALL L6 B0 / PR-L6-2; garden #1132, F-079, the G2 audit's D1–D4, D6–D8, D10).** Twenty-five loaders, registries, resolvers, CI gates, hooks and tests each re-derived "is this a dispatchable worker?" by line-scanning for Claude Code's `context: fork`; drop that key from a skill and it silently vanished from `AgentLoader`, the specialist resolver, `components.json`, the registry validator and `pack check`, while the portability lint REQUIRED the Claude-first shapes (a "when your harness cannot fork" sentence on every fork worker, a dispatch-fallback sentence beside every `Skill(`, a plain-text fallback beside every `AskUserQuestion`, and ≥ 3 fork skills carrying a `subagent_type`). New `scripts/_skill_meta.py` is the one reader: `skill_role(frontmatter)` returns the declared `metadata.role` (an unknown value is `module`, never a silent worker) and, during the transition, infers the legacy keys in wicked-crew's exact `skillKindOf` order (`context: fork` → worker, `user-invocable: true` → router, else module); `parse_frontmatter`/`read_frontmatter` handle the nested `metadata:` mapping; `claude_only_keys` names every top-level key outside the closed cross-CLI set `{name, description, license, compatibility, metadata, mandates}`; `metadata_value` reads `metadata.phases`/`archetypes` with the legacy `phase_relevance`/`archetype_relevance` fallback (the relevance lint accepts either spelling). Every consumer calls it: `_agents.py` (`load_fork_skills` keeps its name, loads role `worker` only), `_validate_registry.py` (registers workers only — never `wicked-garden-governed-worker`), `crew/specialist_resolver.py` (garden and pack walks), `ci/validate.py` (worker frontmatter check; the router/module line cap is role-aware and moves 200 → 500, the same bound as the new `skill-too-large` token; `worker` and `floor` exempt), `ci/sync_components.py` (`fork_skills` keeps its key name), `ci/find_orphan_agents.py`, `pack/check.py` (**PK015** "a router must not be a worker", **PK016** "a `{vendor}-{domain}-{role}`-named skill must declare `metadata.role: worker`" — a role-less worker-shaped skill now FAILS LOUD with the fix named, never a silent drop; **PK020** exempts `worker` + `floor`), `wg/check_conflation.py`, `wg/check_pattern_a_gate.py`, the hooks' docstrings, and the tests (`test_skill_naming`, `test_help_skill_tree` — help entries are exactly the `router` role — `test_skill_dispatch_refs_resolve` — a `Task(` ref resolves to a `worker`; the `>= 3 fork skills` assertion is gone — and the pack suites). `wicked-garden-governed-worker` declares `metadata.role: floor` (kept as a role: handed to every governed unit, never dispatchable, never an AgentProfile, cap-exempt like a worker). **Lint** (`tests/test_skill_portability.py`, `tests/portability_rules.garden.json`): the three fallback tokens `fork-no-fallback` / `dispatch-no-fallback` / `ask-no-fallback` and their sentences are DELETED (the codemod no longer inserts them); seven cross-CLI tokens are added — `claude-frontmatter-key`, `claude-dispatch` (`Task(` / `Skill(` / `Agent(` / `TaskCreate(` / `TaskUpdate(` / `TodoWrite(` / `subagent_type` / `AskUserQuestion`), `claude-only-prose` (tool nouns, `.claude/` paths, "Claude Code" outside a Hand-off paragraph), `handoff-missing`, `retired-product-ref` (wicked-testing / wicked-brain / wicked-signals / wicked-loom without `<!-- historical -->`), `description-too-long` (> 1024 chars), `skill-too-large` (> 500 lines / 24 KiB) — seeded from HEAD into the new `tests/cross_cli_baseline.json` per (token, file): a listed pair is tolerated, an unlisted hit fails, a listed pair that no longer trips is STALE and fails, so each 12.37.x batch shrinks the file in the same change and the strict release (12.38.0) deletes it. `verdict-spelling` and its legacy-footer list are untouched. **Docs**: `docs/cross-cli-skill-format.md` (the closed key set, the role table, the Hand-off paragraph — the one cross-CLI dispatch shape — and the tooling). No skill BODY changes; `components.json` unchanged (75 workers). Rides garden 12.37.x after 12.37.0; the 12.37.x governed batches (B3–B17) depend on it; the strict lint (B18) lands after wicked-core-ts 0.7.26 (L4 ⑨). **Review (review-L6-B):** the baseline test asserts the file's SHAPE only (`generated_from` sha, every token present, every listed file exists) — never a size floor, because the file is shrink-only and a floor would turn CI red on a batch that did exactly what the design asks; `cross_cli.dispatch_regex` requires an argument shape after the paren (a quote, a keyword argument, a brace, `...`/`…`, or the line end of a multi-line call), so the prose plurals `Task(s)` / `Agent(s)` never trip `claude-dispatch`; stale `context: fork` prose in the pack fixture, `check_conflation` / `check_pattern_a_gate` docstrings and the smaht / health-probe comments now reads role-keyed; `docs/cross-cli-skill-format.md` says the skill TEXT retires the `wicked-loom` reference ahead of the peer itself (still the prove gate's CI peer).
|
|
54
|
+
|
|
5
55
|
## [12.37.0] — 2026-09-14
|
|
6
56
|
|
|
7
57
|
### Changed
|
|
@@ -858,5 +908,6 @@ through `v9.2.18`. Major themes across that span:
|
|
|
858
908
|
|
|
859
909
|
For each of those releases, see the corresponding tag in git history.
|
|
860
910
|
|
|
861
|
-
[Unreleased]: https://github.com/mikeparcewski/wicked-garden/compare/v12.37.
|
|
911
|
+
[Unreleased]: https://github.com/mikeparcewski/wicked-garden/compare/v12.37.1...HEAD
|
|
912
|
+
[12.37.1]: https://github.com/mikeparcewski/wicked-garden/compare/v12.37.0...v12.37.1
|
|
862
913
|
[12.37.0]: https://github.com/mikeparcewski/wicked-garden/compare/v12.36.0...v12.37.0
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Cross-CLI skill format
|
|
2
|
+
|
|
3
|
+
wicked-garden is installed into Claude Code, Codex, OpenCode, Pi and Antigravity by third
|
|
4
|
+
parties and snapshotted by wicked-crew for every seat. Only Claude Code reads Claude Code's
|
|
5
|
+
plugin frontmatter — so a skill's identity, dispatch shape and prose must not depend on it.
|
|
6
|
+
This page is the format; `scripts/_skill_meta.py` is its one reader; the lint
|
|
7
|
+
(`tests/test_skill_portability.py`) enforces it; `tests/cross_cli_baseline.json` lists what
|
|
8
|
+
still has to be translated (12.37.x batches; the strict release deletes the baseline).
|
|
9
|
+
|
|
10
|
+
## Frontmatter: the closed key set
|
|
11
|
+
|
|
12
|
+
```yaml
|
|
13
|
+
---
|
|
14
|
+
name: wicked-garden-<dir segments joined by '-'>
|
|
15
|
+
description: "One paragraph. What it does, when to use it. ≤ 1024 characters."
|
|
16
|
+
license: MIT # optional
|
|
17
|
+
compatibility: any # optional
|
|
18
|
+
mandates: # optional — skills this one requires the seat to hold
|
|
19
|
+
- wicked-garden-core
|
|
20
|
+
metadata: # string → string; the ONLY nesting
|
|
21
|
+
role: worker # worker | router | module | floor (required)
|
|
22
|
+
phases: "build,review" # or "*" — replaces the legacy phase_relevance
|
|
23
|
+
archetypes: "build,modernize" # or "*" — replaces the legacy archetype_relevance
|
|
24
|
+
---
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Exactly these top-level keys: `name`, `description`, `license`, `compatibility`, `metadata`,
|
|
28
|
+
`mandates`. Everything else — `context`, `subagent_type`, `allowed-tools`, `model`, `effort`,
|
|
29
|
+
`max-turns`, `color`, `user-invocable`, `disable-model-invocation`, `tool-capabilities`,
|
|
30
|
+
`phase_relevance`, `archetype_relevance`, `portability`, `status` — is a Claude Code plugin hint
|
|
31
|
+
no other CLI (and neither wicked-crew nor wicked-core) reads; the lint token
|
|
32
|
+
`claude-frontmatter-key` flags it. `metadata` values are strings (`"a,b"` lists, `"*"` for all).
|
|
33
|
+
|
|
34
|
+
## `metadata.role` — the closed role set
|
|
35
|
+
|
|
36
|
+
| role | meaning | who reads it |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `worker` | a dispatchable specialist (`skills/<domain>-<role>/`); the only role loaders register as an AgentProfile / crew phase worker | `_agents.py`, `_validate_registry.py`, `crew/specialist_resolver.py`, `ci/sync_components.py`, `ci/find_orphan_agents.py`, `pack/check.py` PK015/PK016, hooks |
|
|
39
|
+
| `router` | an operator-facing entry point (`skills/<domain>/SKILL.md`), listed in help | `tests/test_help_skill_tree.py`, `pack/check.py` PK015 |
|
|
40
|
+
| `module` | NOT an entry point: a nested reference module a router/worker pulls in, or a retired redirect stub — the same meaning wicked-crew's `skillKindOf` gives `module` | everyone else, by exclusion |
|
|
41
|
+
| `floor` | a discipline handed whole to every governed unit (`wicked-garden-governed-worker`); never dispatchable, never an AgentProfile, exempt from the router line cap like a worker | `ci/validate.py` cap, `pack/check.py` PK020 |
|
|
42
|
+
|
|
43
|
+
**Transition inference** (`skill_role()`, mirrors wicked-crew's fallback order): a declared
|
|
44
|
+
`metadata.role` always wins (an unknown value reads `module` — never a silent worker); with none
|
|
45
|
+
declared, `context: fork` → `worker`, `user-invocable: true` → `router`, else `module`. Pack
|
|
46
|
+
authors: a `{vendor}-{domain}-{role}`-named skill with no `metadata.role: worker` **fails**
|
|
47
|
+
`pack check` (PK016) — a worker is never dropped silently.
|
|
48
|
+
|
|
49
|
+
## Dispatch: the Hand-off paragraph
|
|
50
|
+
|
|
51
|
+
No `Task(`, `Skill(`, `Agent(`, `TaskCreate(`/`TaskUpdate(`/`TodoWrite(`, `subagent_type` or
|
|
52
|
+
`AskUserQuestion` in a skill body (`claude-dispatch`; for the framework-ambiguous `Task(` / `Agent(` only, an assignment, constructor
|
|
53
|
+
or lambda context — `x = Agent(`, `new Agent({`, `lambda: Agent(` — is framework code in a sample, not a
|
|
54
|
+
dispatch; `Skill(`, `TaskCreate(`, `TaskUpdate(`, `TodoWrite(` trip in every context), and no Claude tool call either — `Read(`,
|
|
55
|
+
`Write(`, `Edit(`, `MultiEdit(`, `Bash(`, `Glob(`, `Grep(`, `WebFetch(`, `WebSearch(`, `NotebookEdit(`
|
|
56
|
+
with an argument shape after the paren (`claude-tool-call`): say what to do with your harness's file
|
|
57
|
+
reader / shell / file search instead. The one cross-CLI dispatch shape is a paragraph that starts with
|
|
58
|
+
`Hand-off` and names the skill:
|
|
59
|
+
|
|
60
|
+
> **Hand-off** — open the `wicked-garden-qe` skill and run its `review` action with the PLAN path
|
|
61
|
+
> as the argument; on Claude Code this is the Skill tool, on any other seat open the named skill
|
|
62
|
+
> from your catalog and carry it out inline, then continue here.
|
|
63
|
+
|
|
64
|
+
Inside that paragraph Claude-specific words are allowed; anywhere else a tool noun (`the Read
|
|
65
|
+
tool`), a `.claude/` path or the words `Claude Code` is `claude-only-prose`. A file that dispatches
|
|
66
|
+
without a Hand-off paragraph is `handoff-missing`. A line ending in `<!-- historical -->` is never a
|
|
67
|
+
finding (it documents a retired shape).
|
|
68
|
+
|
|
69
|
+
**The `Hand-off (harness-specific)` variant.** A step that exists on ONE harness only (the setup
|
|
70
|
+
wizard's `.claude/CLAUDE.md` hint block; the task-list tools' field mapping) is written as a paragraph
|
|
71
|
+
starting `**Hand-off (harness-specific)**` that names the harness, says what it does there and says
|
|
72
|
+
what every other seat does instead (usually: skip it). It hands the step to the harness, not to a
|
|
73
|
+
skill; the same exemption applies inside it. Use it sparingly — a step every seat can do is written
|
|
74
|
+
generically instead.
|
|
75
|
+
|
|
76
|
+
## Products and size
|
|
77
|
+
|
|
78
|
+
`wicked-testing`, `wicked-brain`, `wicked-signals` are retired and `wicked-loom` is being replaced — the skill TEXT retires the `wicked-loom` reference ahead of the peer itself (`wicked-loom` stays the prove gate's CI peer in `test.yml` / `tests/qe/test_prove.py` until the prove/loom-cutover seam removes it; DES-L6 B6 / review F3) —
|
|
79
|
+
by the in-process gate — name their successors (the `qe` domain, wicked-estate through the `mem` /
|
|
80
|
+
`search` skills, the built-in gate) or mark the line `<!-- historical -->` (`retired-product-ref`).
|
|
81
|
+
A SKILL.md stays under 500 lines and 24 KiB (`skill-too-large`; `scripts/ci/validate.py` applies
|
|
82
|
+
the same bound to routers and modules); detail goes in `refs/`. Skill-relative paths, the
|
|
83
|
+
`## Runtime` block and the launcher rules from 12.33 are unchanged.
|
|
84
|
+
|
|
85
|
+
## Tooling
|
|
86
|
+
|
|
87
|
+
- `python3 tests/test_skill_portability.py` — the report (0 violations, 0 stale baseline entries).
|
|
88
|
+
- `python3 tests/test_skill_portability.py --write-baseline` — regenerate the baseline **at B0
|
|
89
|
+
only**; afterwards the file only shrinks (a batch deletes the entries it translated; a stale entry
|
|
90
|
+
fails CI; B18 deletes the file).
|
|
91
|
+
- `python3 scripts/ci/validate.py && python3 scripts/_validate_registry.py` — the release gate,
|
|
92
|
+
role-aware.
|
package/hooks/hooks.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
"_TODO_341_http_hooks": "Issue #341: HTTP hook type (type: 'http') is not supported. When supported, add HTTP hooks for external service integration: POST crew phase transitions to a webhook URL, send gate results to a quality dashboard, notify Slack/Teams on crew project completion. Currently all hooks are type: 'command' (subprocess).",
|
|
17
17
|
|
|
18
|
-
"_TODO_344_isolation_worktree": "Issue #344: Skill frontmatter field 'isolation: worktree' is not supported. When supported, add isolation: worktree to the
|
|
18
|
+
"_TODO_344_isolation_worktree": "Issue #344: Skill frontmatter field 'isolation: worktree' is not supported. When supported, add isolation: worktree to the worker skills (metadata.role: worker) that modify files so they operate in separate git worktrees. This would prevent destructive operations (branch switching, file modifications) in one worker from affecting others running in parallel. (The crew-implementer / crew-researcher / crew-reviewer trio this note used to name was retired 2026-09 into the cross-CLI wicked-garden-governed-worker skill, which carries no fork frontmatter.)",
|
|
19
19
|
|
|
20
20
|
"_TODO_345_once_flag": "Issue #345: The 'once' flag is not documented as a supported hook property. When supported, add \"once\": true to the SessionStart bootstrap hook so it only fires on the first session start, not on reconnects. Currently bootstrap.py handles this by checking session state for staleness.",
|
|
21
21
|
|
|
@@ -292,7 +292,9 @@ def _suggest_auth_fix(probe_result):
|
|
|
292
292
|
|
|
293
293
|
|
|
294
294
|
def _load_agents():
|
|
295
|
-
"""Load dynamic workers (
|
|
295
|
+
"""Load dynamic workers (skills whose role is ``worker`` — ``metadata.role: worker``,
|
|
296
|
+
legacy ``context: fork`` inferred by ``_skill_meta.skill_role``). Returns
|
|
297
|
+
(agent_count, agents_dict)."""
|
|
296
298
|
try:
|
|
297
299
|
from _agents import AgentLoader
|
|
298
300
|
loader = AgentLoader()
|
|
@@ -176,9 +176,9 @@ def _parse_specialist_from_agent_type(agent_type: str, specialist_domains: set):
|
|
|
176
176
|
the legacy ``subagent_type`` frontmatter). The domain must be a
|
|
177
177
|
known specialist domain (``specialist_domains`` from
|
|
178
178
|
``specialist.json``) for the engagement tracker to accept it.
|
|
179
|
-
*
|
|
179
|
+
* Worker-skill name: ``wicked-garden-{domain}-{role}`` — resolved by
|
|
180
180
|
:mod:`crew.specialist_resolver`, which walks ``skills/**/SKILL.md``
|
|
181
|
-
|
|
181
|
+
frontmatter and keeps role ``worker`` (``_skill_meta.skill_role``).
|
|
182
182
|
* Bare role: ``requirements-analyst`` — resolved the same way. This
|
|
183
183
|
is the path the facilitator emits by default.
|
|
184
184
|
|
|
@@ -203,8 +203,8 @@ def _parse_specialist_from_agent_type(agent_type: str, specialist_domains: set):
|
|
|
203
203
|
|
|
204
204
|
return domain, agent_name
|
|
205
205
|
|
|
206
|
-
#
|
|
207
|
-
# skills/**/SKILL.md (
|
|
206
|
+
# Worker-skill-name or bare-role path (Issue #573): resolve via
|
|
207
|
+
# skills/**/SKILL.md frontmatter (role worker). Fail-closed to the
|
|
208
208
|
# old behavior on any resolver error — engagement tracking is
|
|
209
209
|
# best-effort and the hook must never block the agent.
|
|
210
210
|
try:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wicked-garden",
|
|
3
|
-
"version": "12.37.
|
|
3
|
+
"version": "12.37.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/scripts/_agents.py
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
_agents.py — Dynamic
|
|
3
|
+
_agents.py — Dynamic worker-skill loader.
|
|
4
4
|
|
|
5
5
|
The plugin is skills-only: the former agents/{domain}/*.md worker definitions
|
|
6
|
-
now live as standalone skills at skills/<domain>-<role>/SKILL.md
|
|
7
|
-
``
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
now live as standalone skills at skills/<domain>-<role>/SKILL.md whose role is
|
|
7
|
+
``worker`` (``metadata.role: worker``; the legacy ``context: fork`` is inferred
|
|
8
|
+
by ``scripts/_skill_meta.skill_role`` during the cross-CLI transition). This
|
|
9
|
+
loader scans skills/**/SKILL.md and loads every WORKER skill as an AgentProfile
|
|
10
|
+
(name/domain/system_prompt/capabilities), preserving the profile shape
|
|
11
|
+
downstream consumers expect. Routers, modules and the ``floor`` skill
|
|
12
|
+
(``wicked-garden-governed-worker``) are never AgentProfiles.
|
|
10
13
|
|
|
11
14
|
Usage:
|
|
12
15
|
from _agents import AgentLoader
|
|
@@ -22,6 +25,13 @@ from dataclasses import dataclass, field
|
|
|
22
25
|
from pathlib import Path
|
|
23
26
|
from typing import Any
|
|
24
27
|
|
|
28
|
+
# scripts/ is not always on sys.path (hooks import by path; CI runs from a subdir).
|
|
29
|
+
try:
|
|
30
|
+
from _skill_meta import skill_role
|
|
31
|
+
except ImportError: # pragma: no cover - path setup only
|
|
32
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
33
|
+
from _skill_meta import skill_role
|
|
34
|
+
|
|
25
35
|
# ---------------------------------------------------------------------------
|
|
26
36
|
# AgentProfile dataclass
|
|
27
37
|
# ---------------------------------------------------------------------------
|
|
@@ -80,13 +90,16 @@ class AgentLoader:
|
|
|
80
90
|
# ------------------------------------------------------------------
|
|
81
91
|
|
|
82
92
|
def load_fork_skills(self, skills_dir: Path) -> dict[str, AgentProfile]:
|
|
83
|
-
"""Scan skills_dir recursively for SKILL.md files
|
|
84
|
-
``
|
|
93
|
+
"""Scan skills_dir recursively for SKILL.md files whose role is
|
|
94
|
+
``worker`` (``metadata.role: worker``, or the legacy ``context: fork``
|
|
95
|
+
inferred by ``_skill_meta.skill_role``) and load each as an
|
|
96
|
+
AgentProfile. Routers, modules and the ``floor`` skill are skipped —
|
|
97
|
+
only a worker is dispatchable. The method keeps its historical name.
|
|
85
98
|
|
|
86
99
|
Each SKILL.md must have YAML frontmatter with at least a `name`
|
|
87
100
|
field. Additional recognized frontmatter keys: domain, description,
|
|
88
101
|
capabilities (list), traits (list), model, color, effort, max-turns,
|
|
89
|
-
allowed-tools
|
|
102
|
+
allowed-tools.
|
|
90
103
|
|
|
91
104
|
The body of the SKILL.md (after frontmatter) becomes system_prompt.
|
|
92
105
|
|
|
@@ -170,14 +183,16 @@ _FRONTMATTER_END = "---"
|
|
|
170
183
|
|
|
171
184
|
|
|
172
185
|
def _parse_agent_md(path: Path, fork_only: bool = False) -> AgentProfile | None:
|
|
173
|
-
"""Parse a worker SKILL.md (
|
|
186
|
+
"""Parse a worker SKILL.md (role ``worker``) into an AgentProfile.
|
|
174
187
|
|
|
175
188
|
Format:
|
|
176
189
|
---
|
|
177
190
|
name: wicked-garden-engineering-solution-architect
|
|
178
191
|
description: |
|
|
179
192
|
Optional description
|
|
180
|
-
|
|
193
|
+
metadata:
|
|
194
|
+
role: worker # required when fork_only=True (legacy
|
|
195
|
+
# ``context: fork`` is inferred)
|
|
181
196
|
domain: engineering # optional
|
|
182
197
|
capabilities: # optional list
|
|
183
198
|
- code-review
|
|
@@ -193,7 +208,7 @@ def _parse_agent_md(path: Path, fork_only: bool = False) -> AgentProfile | None:
|
|
|
193
208
|
|
|
194
209
|
Returns:
|
|
195
210
|
AgentProfile, or None if the file lacks a valid name field or
|
|
196
|
-
(when fork_only)
|
|
211
|
+
(when fork_only) its role is not ``worker``.
|
|
197
212
|
"""
|
|
198
213
|
try:
|
|
199
214
|
raw = path.read_text(encoding="utf-8")
|
|
@@ -203,7 +218,7 @@ def _parse_agent_md(path: Path, fork_only: bool = False) -> AgentProfile | None:
|
|
|
203
218
|
frontmatter, body = _split_frontmatter(raw)
|
|
204
219
|
if frontmatter is None:
|
|
205
220
|
if fork_only:
|
|
206
|
-
# A worker
|
|
221
|
+
# A worker declares its role in frontmatter (metadata.role: worker)
|
|
207
222
|
return None
|
|
208
223
|
# No frontmatter — use filename as name, whole file as system_prompt
|
|
209
224
|
name = path.stem
|
|
@@ -216,7 +231,8 @@ def _parse_agent_md(path: Path, fork_only: bool = False) -> AgentProfile | None:
|
|
|
216
231
|
)
|
|
217
232
|
|
|
218
233
|
parsed = _parse_simple_yaml(frontmatter)
|
|
219
|
-
|
|
234
|
+
# ONE reader of role: metadata.role first, legacy context: fork inferred.
|
|
235
|
+
if fork_only and skill_role(frontmatter) != "worker":
|
|
220
236
|
return None
|
|
221
237
|
name = parsed.get("name") or (path.parent.name if path.name == "SKILL.md" else path.stem)
|
|
222
238
|
if not name:
|
|
@@ -231,11 +247,6 @@ def _parse_agent_md(path: Path, fork_only: bool = False) -> AgentProfile | None:
|
|
|
231
247
|
extra_meta["source"] = "disk"
|
|
232
248
|
extra_meta["file"] = str(path)
|
|
233
249
|
|
|
234
|
-
# Extract tool-capabilities for capability-based dynamic tool routing
|
|
235
|
-
tool_caps = _to_list(parsed.get("tool-capabilities"))
|
|
236
|
-
if tool_caps:
|
|
237
|
-
extra_meta["tool_capabilities"] = tool_caps
|
|
238
|
-
|
|
239
250
|
# Parse allowed-tools into a list for the resolver
|
|
240
251
|
allowed_tools_list = _to_list(parsed.get("allowed-tools"))
|
|
241
252
|
if allowed_tools_list:
|
|
@@ -43,15 +43,15 @@ never through the raw write CLI. In that mode every spawn is
|
|
|
43
43
|
* ``--readonly`` is spelled literally — the MCP detects read-only by the exact
|
|
44
44
|
token and refuses every write tool except the safe ``proposal.submit``.
|
|
45
45
|
Read-only is on when a governed-unit marker is present (`GOVERNED_MARKERS`:
|
|
46
|
-
`WICKED_RUN_ID
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
`
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
46
|
+
`WICKED_RUN_ID` — stamped on the worker's OWN environment by BOTH carriers
|
|
47
|
+
since wicked-core 0.7.26 (R12, `stamp_run_markers`), the PRIMARY cue — or
|
|
48
|
+
the fence env the wrapped carrier sets on the worker, `WICKED_GATE_SCOPE` /
|
|
49
|
+
`WICKED_WRITE_ROOTS`), when the caller passed ``--governed`` / ``--readonly``
|
|
50
|
+
on the backend argv (`parse_cli_flags` / `set_governed` / `set_readonly`), or
|
|
51
|
+
when ``WICKED_GOVERNED`` / ``WICKED_ESTATE_READONLY`` is truthy (wicked-core
|
|
52
|
+
sets ``WICKED_ESTATE_READONLY=1`` on every worker child since 0.7.26, D-7).
|
|
53
|
+
The skill text's handed-context definition (a phase directive / the
|
|
54
|
+
governed-worker skill) CONFIRMS what the markers say.
|
|
55
55
|
* The store must be PINNED: ``--db <path>`` on the backend argv, or
|
|
56
56
|
``WICKED_ESTATE_DB`` / ``WICKED_HOME`` / ``WICKED_MEMORY_DB`` in the worker
|
|
57
57
|
environment. In a governed run an unpinned store is REFUSED (no spawn,
|
|
@@ -167,16 +167,16 @@ def resolve_db() -> Optional[str]:
|
|
|
167
167
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
168
168
|
|
|
169
169
|
# Governed-unit markers — any of these non-empty in the environment means "you are a
|
|
170
|
-
# unit of a wicked-crew run". `WICKED_RUN_ID`
|
|
171
|
-
#
|
|
172
|
-
#
|
|
173
|
-
#
|
|
174
|
-
#
|
|
175
|
-
#
|
|
176
|
-
#
|
|
177
|
-
#
|
|
178
|
-
#
|
|
179
|
-
#
|
|
170
|
+
# unit of a wicked-crew run". `WICKED_RUN_ID` (with `WICKED_RUN_UNIT` / `WICKED_RUN_AGENT`)
|
|
171
|
+
# is stamped on the worker's OWN Command env by BOTH carriers since wicked-core 0.7.26
|
|
172
|
+
# (`execute_wrapped::stamp_run_markers`, DES-L4 PR-③ / R12) and inherited by this shim and
|
|
173
|
+
# the `wicked-estate-mcp` it spawns (which stamps `proposal.submit` provenance from it) —
|
|
174
|
+
# the PRIMARY marker (it closes garden #1134 HIGH-1: before 0.7.26 only the estate MCP
|
|
175
|
+
# server's launch env carried it). The fence env the WRAPPED carrier also sets on the
|
|
176
|
+
# worker Command stays a second marker (`WICKED_WRITE_ROOTS` / `WICKED_GATE_SCOPE`); the
|
|
177
|
+
# ACP carrier sets the run markers and `WICKED_ESTATE_DB` / `WICKED_ESTATE_READONLY` on
|
|
178
|
+
# its child too. `--governed` / WICKED_GOVERNED=1 let a seat (or a launcher) say so
|
|
179
|
+
# explicitly, and the skill text's handed-context definition confirms it.
|
|
180
180
|
GOVERNED_RUN_ENV = "WICKED_RUN_ID"
|
|
181
181
|
GOVERNED_MARKERS = (GOVERNED_RUN_ENV, "WICKED_GATE_SCOPE", "WICKED_WRITE_ROOTS")
|
|
182
182
|
GOVERNED_ENV = "WICKED_GOVERNED" # explicit override (any truthy value)
|