cool-workflow 0.2.1 → 0.2.2

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.
Files changed (93) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/apps/architecture-review/app.json +1 -1
  4. package/apps/architecture-review-fast/app.json +1 -1
  5. package/apps/end-to-end-golden-path/app.json +1 -1
  6. package/apps/pr-review-fix-ci/app.json +1 -1
  7. package/apps/release-cut/app.json +1 -1
  8. package/apps/research-synthesis/app.json +1 -1
  9. package/dist/cli/dispatch.js +18 -86
  10. package/dist/cli/parseargv.js +5 -2
  11. package/dist/core/capability-data.js +270 -0
  12. package/dist/core/capability-table.js +16 -3504
  13. package/dist/core/format/help.js +28 -5
  14. package/dist/core/multi-agent/collaboration.js +3 -2
  15. package/dist/core/multi-agent/coordinator.js +4 -3
  16. package/dist/core/pipeline/commit-gate.js +2 -1
  17. package/dist/core/state/state-explosion/digest.js +3 -2
  18. package/dist/core/state/state-explosion/graph.js +9 -8
  19. package/dist/core/state/state-explosion/helpers.js +2 -1
  20. package/dist/core/trust/ledger.js +2 -1
  21. package/dist/core/types/execution-backend.js +18 -0
  22. package/dist/core/types/observability.js +7 -0
  23. package/dist/core/util/collate.js +23 -0
  24. package/dist/core/version.js +1 -1
  25. package/dist/shell/audit-cli.js +46 -2
  26. package/dist/shell/commit-summary.js +2 -1
  27. package/dist/shell/drive.js +26 -10
  28. package/dist/shell/evidence-reasoning.js +4 -3
  29. package/dist/shell/execution-backend/registry.js +2 -1
  30. package/dist/shell/execution-backend/types.js +0 -9
  31. package/dist/shell/fs-atomic.js +14 -1
  32. package/dist/shell/multi-agent-operator-ux.js +4 -3
  33. package/dist/shell/observability.js +12 -11
  34. package/dist/shell/onramp.js +17 -1
  35. package/dist/shell/operator-ux-text.js +2 -1
  36. package/dist/shell/operator-ux.js +7 -6
  37. package/dist/shell/pipeline-cli.js +82 -72
  38. package/dist/shell/reclamation-io.js +2 -1
  39. package/dist/shell/report.js +2 -1
  40. package/dist/shell/run-store.js +17 -0
  41. package/dist/shell/state-explosion-cli.js +2 -1
  42. package/dist/shell/topology-io.js +2 -1
  43. package/dist/shell/trust-audit.js +41 -2
  44. package/dist/shell/worker-cli.js +9 -1
  45. package/dist/shell/worker-isolation.js +34 -9
  46. package/dist/shell/workflow-app-loader.js +3 -2
  47. package/dist/wiring/capability-table/basics.js +66 -0
  48. package/dist/wiring/capability-table/exec-backend.js +162 -0
  49. package/dist/wiring/capability-table/index.js +42 -0
  50. package/dist/wiring/capability-table/multi-agent.js +623 -0
  51. package/dist/wiring/capability-table/parity.js +466 -0
  52. package/dist/wiring/capability-table/pipeline.js +280 -0
  53. package/dist/wiring/capability-table/registry-core.js +189 -0
  54. package/dist/wiring/capability-table/reporting.js +394 -0
  55. package/dist/wiring/capability-table/scheduling-registry.js +558 -0
  56. package/dist/wiring/capability-table/state.js +173 -0
  57. package/dist/wiring/capability-table/trust-ledger.js +134 -0
  58. package/dist/wiring/capability-table/workflow-apps.js +366 -0
  59. package/docs/agent-delegation-drive.7.md +2 -0
  60. package/docs/cli-mcp-parity.7.md +7 -2
  61. package/docs/contract-migration-tooling.7.md +2 -0
  62. package/docs/control-plane-scheduling.7.md +2 -0
  63. package/docs/durable-state-and-locking.7.md +22 -0
  64. package/docs/evidence-adoption-reasoning-chain.7.md +2 -0
  65. package/docs/execution-backends.7.md +2 -0
  66. package/docs/index.md +1 -0
  67. package/docs/multi-agent-cli-mcp-surface.7.md +2 -0
  68. package/docs/multi-agent-eval-replay-harness.7.md +2 -0
  69. package/docs/multi-agent-operator-ux.7.md +2 -0
  70. package/docs/node-snapshot-diff-replay.7.md +2 -0
  71. package/docs/observability-cost-accounting.7.md +2 -0
  72. package/docs/project-index.md +25 -5
  73. package/docs/real-execution-backends.7.md +2 -0
  74. package/docs/release-and-migration.7.md +2 -0
  75. package/docs/release-tooling.7.md +2 -0
  76. package/docs/run-registry-control-plane.7.md +2 -0
  77. package/docs/run-retention-reclamation.7.md +2 -0
  78. package/docs/security-trust-hardening.7.md +30 -0
  79. package/docs/state-explosion-management.7.md +2 -0
  80. package/docs/team-collaboration.7.md +2 -0
  81. package/docs/trust-audit-anchor.7.md +69 -0
  82. package/docs/web-desktop-workbench.7.md +2 -0
  83. package/manifest/plugin.manifest.json +1 -1
  84. package/package.json +3 -1
  85. package/scripts/bump-version.js +24 -2
  86. package/scripts/canonical-apps.js +4 -4
  87. package/scripts/dogfood-release.js +1 -1
  88. package/scripts/golden-path.js +4 -4
  89. package/scripts/purity-baseline.json +68 -0
  90. package/scripts/purity-gate.js +239 -0
  91. package/scripts/release-check.js +8 -1
  92. package/scripts/version-sync-check.js +33 -12
  93. package/workflows/README.md +19 -0
@@ -0,0 +1,366 @@
1
+ "use strict";
2
+ // wiring/capability-table/workflow-apps.ts — MILESTONE 12 (workflow-apps:
3
+ // app.*, info, man) CLI bindings, plus the `next` capability (a milestone
4
+ // 3/6 placeholder folded in alongside app.* per the file's own history).
5
+ // Split out of core/capability-table.ts, byte-for-byte (extracted with
6
+ // sed, not retyped).
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const registry_core_1 = require("./registry-core");
9
+ const io_1 = require("../../cli/io");
10
+ const state_cli_1 = require("../../shell/state-cli");
11
+ const app_run_cli_1 = require("../../shell/app-run-cli");
12
+ // MILESTONE 12 (workflow-apps). Handler BODIES live in
13
+ // shell/workflow-app-loader.ts (impure — they scan apps/*/app.json +
14
+ // workflows/*.workflow.js on disk and `require()` each entrypoint); this
15
+ // table only wires argv/tool-args shape -> handler call, per SPEC/
16
+ // workflow-apps.md's "Exact outputs". `app.validate` is ALWAYS JSON
17
+ // (jsonMode "default") even without --json, and its handler sets
18
+ // exitCode 1 on `valid:false` — both the "not found" id case and a
19
+ // structurally-broken manifest case fail this same way.
20
+ const workflow_app_loader_1 = require("../../shell/workflow-app-loader");
21
+ const help_1 = require("../../core/format/help");
22
+ const man_cli_1 = require("../../shell/man-cli");
23
+ (0, registry_core_1.attachCliBinding)("app.list", {
24
+ path: ["app", "list"],
25
+ jsonMode: "default",
26
+ handler: () => ({ json: (0, workflow_app_loader_1.listWorkflowApps)() }),
27
+ });
28
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("app.list").mcp.handler = () => (0, workflow_app_loader_1.listWorkflowApps)();
29
+ (0, registry_core_1.attachCliBinding)("app.show", {
30
+ path: ["app", "show"],
31
+ jsonMode: "default",
32
+ handler: (args) => ({ json: (0, workflow_app_loader_1.showWorkflowApp)((0, io_1.required)(args.positionals[0], "workflow app id")) }),
33
+ });
34
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("app.show").mcp.handler = (args) => (0, workflow_app_loader_1.showWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.appId), "workflow app id"));
35
+ (0, registry_core_1.attachCliBinding)("app.validate", {
36
+ path: ["app", "validate"],
37
+ jsonMode: "default",
38
+ handler: (args) => {
39
+ const result = (0, workflow_app_loader_1.validateWorkflowAppTarget)((0, io_1.required)(args.positionals[0], "workflow app path or id"));
40
+ return { json: result, exitCode: result.valid ? undefined : 1 };
41
+ },
42
+ });
43
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("app.validate").mcp.handler = (args) => (0, workflow_app_loader_1.validateWorkflowAppTarget)((0, io_1.required)((0, io_1.optionalArg)(args.target ?? args.appId), "workflow app path or id"));
44
+ (0, registry_core_1.attachCliBinding)("app.init", {
45
+ path: ["app", "init"],
46
+ jsonMode: "default",
47
+ handler: (args) => ({ json: (0, workflow_app_loader_1.initWorkflowApp)((0, io_1.required)(args.positionals[0], "app id"), args.options) }),
48
+ });
49
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("app.init").mcp.handler = (args) => (0, workflow_app_loader_1.initWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.appId), "app id"), args);
50
+ // `cw init <id>` — the standalone scaffold verb. v2 folds `init` into
51
+ // `app.init` (the old build's legacy `.workflow.js` scaffold is gone), so
52
+ // both surfaces route through initWorkflowApp, same as `cw app init`. The
53
+ // `init` help token is folded away (declaredCliHelpTokens) — it stays in
54
+ // the frozen "More commands" index line only, matching the parity smoke's
55
+ // HELP_INDEX_ONLY_TOKENS treatment. `workflowId` is the old init arg name.
56
+ (0, registry_core_1.attachCliBinding)("init", {
57
+ path: ["init"],
58
+ jsonMode: "default",
59
+ handler: (args) => ({ json: (0, workflow_app_loader_1.initWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.positionals[0]), "workflow id"), args.options) }),
60
+ });
61
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("init").mcp.handler = (args) => (0, workflow_app_loader_1.initWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.workflowId ?? args.appId), "workflow id"), args);
62
+ (0, registry_core_1.attachCliBinding)("app.package", {
63
+ path: ["app", "package"],
64
+ jsonMode: "default",
65
+ handler: (args) => ({ json: (0, workflow_app_loader_1.packageWorkflowApp)((0, io_1.required)(args.positionals[0], "app id"), args.options) }),
66
+ });
67
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("app.package").mcp.handler = (args) => (0, workflow_app_loader_1.packageWorkflowApp)((0, io_1.required)((0, io_1.optionalArg)(args.appId), "app id"), args);
68
+ // `cw app run <app-id>` — plan+drive+report an app in one call. 2-token
69
+ // cli.path found before the ["app"] usage catch-all; `appRunCli` reads the
70
+ // app id from `appId`, so the first positional after "run" is forwarded as
71
+ // appId (old build: appRun(runner, { ...options, appId: <positional> })).
72
+ (0, registry_core_1.attachCliBinding)("app.run", {
73
+ path: ["app", "run"],
74
+ jsonMode: "default",
75
+ handler: (args) => ({ json: (0, app_run_cli_1.appRunCli)({ ...args.options, appId: (0, io_1.required)(args.positionals[0], "app id") }) }),
76
+ });
77
+ // A 1-token `["app"]` row that exists ONLY to own the fixed usage string
78
+ // for an unrecognized `app` subcommand (`app run` is not yet CLI-wired at
79
+ // this milestone — cw_app_run stays MCP-only — so a bogus or `run`
80
+ // subcommand both fall through to this same usage throw, matching
81
+ // SPEC/cli-surface.md's "Usage strings" table byte-for-byte). Per
82
+ // dispatchTable's reversed-candidate-order contract (cli/dispatch.ts),
83
+ // this 1-token row is only ever reached when no 2-token `app.*` row
84
+ // above matched. `hiddenFromHelp` keeps it off `cw help app`'s own line
85
+ // (see CliBinding.hiddenFromHelp's doc comment).
86
+ (0, registry_core_1.addCliOnlyCapability)("app.usage", "cw app list|show|validate|init|package|run [app-id|path] — the workflow-app framework.", {
87
+ path: ["app"],
88
+ jsonMode: "default",
89
+ hiddenFromHelp: true,
90
+ handler: () => {
91
+ throw new Error("Usage: cw.js app list|show|validate|init|package|run [app-id|path]");
92
+ },
93
+ }, "app.usage exists only to own the fixed usage-error text for an unrecognized app subcommand; every real app.* action is its own capability row above.");
94
+ // ---------------------------------------------------------------------
95
+ // 1-token usage-fallback rows: one per multi-verb family, each existing
96
+ // ONLY to own the fixed usage string for an unrecognized subcommand,
97
+ // same pattern and reasoning as app.usage above (SPEC/cli-surface.md's
98
+ // "Usage strings" table, byte-for-byte). Per dispatchTable's reversed-
99
+ // candidate-order contract (cli/dispatch.ts), each 1-token row here is
100
+ // only ever reached when no 2-token real row for that family matched.
101
+ // `hiddenFromHelp` keeps each off its own `cw help <verb>` line.
102
+ // ---------------------------------------------------------------------
103
+ (0, registry_core_1.addCliOnlyCapability)("sandbox.usage", "cw.js sandbox list|show|validate|choose|resolve [profile-id|profile-file]", {
104
+ path: ["sandbox"],
105
+ jsonMode: "default",
106
+ hiddenFromHelp: true,
107
+ handler: () => {
108
+ throw new Error("Usage: cw.js sandbox list|show|validate|choose|resolve [profile-id|profile-file]");
109
+ },
110
+ }, "sandbox.usage exists only to own the fixed usage-error text for an unrecognized sandbox subcommand; every real sandbox.* action is its own capability row above.");
111
+ (0, registry_core_1.addCliOnlyCapability)("state.usage", "cw.js state check <run-id> [--state PATH] [--write]", {
112
+ path: ["state"],
113
+ jsonMode: "default",
114
+ hiddenFromHelp: true,
115
+ handler: () => {
116
+ throw new Error("Usage: cw.js state check <run-id> [--state PATH] [--write]");
117
+ },
118
+ }, "state.usage exists only to own the fixed usage-error text for an unrecognized state subcommand; every real state.* action is its own capability row above.");
119
+ (0, registry_core_1.addCliOnlyCapability)("audit.usage", "cw.js audit summary|worker|provenance|multi-agent|policy|role|blackboard|judge|attest|decision <run-id> [worker-id|role-id]", {
120
+ path: ["audit"],
121
+ jsonMode: "default",
122
+ hiddenFromHelp: true,
123
+ handler: () => {
124
+ throw new Error("Usage: cw.js audit summary|worker|provenance|multi-agent|policy|role|blackboard|judge|attest|decision <run-id> [worker-id|role-id]");
125
+ },
126
+ }, "audit.usage exists only to own the fixed usage-error text for an unrecognized audit subcommand; every real audit.* action is its own capability row above.");
127
+ (0, registry_core_1.addCliOnlyCapability)("blackboard.usage", "cw.js blackboard summary|summarize|graph|resolve <run-id> | topic create <run-id> | message post|list <run-id> | context put <run-id> | artifact add|list <run-id> | snapshot <run-id>", {
128
+ path: ["blackboard"],
129
+ jsonMode: "default",
130
+ hiddenFromHelp: true,
131
+ handler: () => {
132
+ throw new Error("Usage: cw.js blackboard summary|summarize|graph|resolve <run-id> | topic create <run-id> | message post|list <run-id> | context put <run-id> | artifact add|list <run-id> | snapshot <run-id>");
133
+ },
134
+ }, "blackboard.usage exists only to own the fixed usage-error text for an unrecognized blackboard subcommand; every real blackboard.* action is its own capability row above.");
135
+ (0, registry_core_1.addCliOnlyCapability)("candidate.usage", "cw.js candidate list|show|register|score|rank|select|reject|summary <run-id> [candidate-id]", {
136
+ path: ["candidate"],
137
+ jsonMode: "default",
138
+ hiddenFromHelp: true,
139
+ handler: () => {
140
+ throw new Error("Usage: cw.js candidate list|show|register|score|rank|select|reject|summary <run-id> [candidate-id]");
141
+ },
142
+ }, "candidate.usage exists only to own the fixed usage-error text for an unrecognized candidate subcommand; every real candidate.* action is its own capability row above.");
143
+ (0, registry_core_1.addCliOnlyCapability)("comment.usage", "cw.js comment add <kind> <run-id> <target-id> --body <text> | comment list <run-id> [--json]", {
144
+ path: ["comment"],
145
+ jsonMode: "default",
146
+ hiddenFromHelp: true,
147
+ handler: () => {
148
+ throw new Error("Usage: cw.js comment add <kind> <run-id> <target-id> --body <text> | comment list <run-id> [--json]");
149
+ },
150
+ }, "comment.usage exists only to own the fixed usage-error text for an unrecognized comment subcommand; every real comment.* action is its own capability row above.");
151
+ (0, registry_core_1.addCliOnlyCapability)("eval.usage", "cw.js eval snapshot <run-id> --id <snapshot-id> | replay <snapshot-id-or-path> | compare <baseline-id-or-path> <replay-id-or-path> | score <replay-id-or-path> | gate <suite-id-or-path> | report <replay-id-or-path>", {
152
+ path: ["eval"],
153
+ jsonMode: "default",
154
+ hiddenFromHelp: true,
155
+ handler: () => {
156
+ throw new Error("Usage: cw.js eval snapshot <run-id> --id <snapshot-id> | replay <snapshot-id-or-path> | compare <baseline-id-or-path> <replay-id-or-path> | score <replay-id-or-path> | gate <suite-id-or-path> | report <replay-id-or-path>");
157
+ },
158
+ }, "eval.usage exists only to own the fixed usage-error text for an unrecognized eval subcommand; every real eval.* action is its own capability row above.");
159
+ (0, registry_core_1.addCliOnlyCapability)("telemetry.usage", "cw.js telemetry verify <run-id> [--pubkey <pem-or-path>] [--json]", {
160
+ path: ["telemetry"],
161
+ jsonMode: "default",
162
+ hiddenFromHelp: true,
163
+ handler: () => {
164
+ throw new Error("Usage: cw.js telemetry verify <run-id> [--pubkey <pem-or-path>] [--json]");
165
+ },
166
+ }, "telemetry.usage exists only to own the fixed usage-error text for an unrecognized telemetry subcommand; every real telemetry.* action is its own capability row above.");
167
+ (0, registry_core_1.addCliOnlyCapability)("demo.usage", "cw.js demo tamper|bundle [--json]", {
168
+ path: ["demo"],
169
+ jsonMode: "default",
170
+ hiddenFromHelp: true,
171
+ handler: () => {
172
+ throw new Error("Usage: cw.js demo tamper|bundle [--json]");
173
+ },
174
+ }, "demo.usage exists only to own the fixed usage-error text for an unrecognized demo subcommand; every real demo.* action is its own capability row above.");
175
+ (0, registry_core_1.addCliOnlyCapability)("multi-agent.usage", "cw.js multi-agent run|status|step|blackboard|score|select|summary|summarize|graph|dependencies|failures|evidence|reasoning|show|role|group|membership|fanout|fanin <run-id> [id]", {
176
+ path: ["multi-agent"],
177
+ jsonMode: "default",
178
+ hiddenFromHelp: true,
179
+ handler: () => {
180
+ throw new Error("Usage: cw.js multi-agent run|status|step|blackboard|score|select|summary|summarize|graph|dependencies|failures|evidence|reasoning|show|role|group|membership|fanout|fanin <run-id> [id]");
181
+ },
182
+ }, "multi-agent.usage exists only to own the fixed usage-error text for an unrecognized multi-agent subcommand; every real multi-agent.* action is its own capability row above.");
183
+ (0, registry_core_1.addCliOnlyCapability)("node.usage", "cw.js node list|show|graph|snapshot|diff|replay|verify <run-id> [node-id|snapshot-id|replay-id]", {
184
+ path: ["node"],
185
+ jsonMode: "default",
186
+ hiddenFromHelp: true,
187
+ handler: () => {
188
+ throw new Error("Usage: cw.js node list|show|graph|snapshot|diff|replay|verify <run-id> [node-id|snapshot-id|replay-id]");
189
+ },
190
+ }, "node.usage exists only to own the fixed usage-error text for an unrecognized node subcommand; every real node.* action is its own capability row above.");
191
+ (0, registry_core_1.addCliOnlyCapability)("backend.usage", "cw.js backend list|show|probe [backend-id] | cw.js backend agent config [show|set] [--agent-command ... --agent-endpoint ... --agent-model ...]", {
192
+ path: ["backend"],
193
+ jsonMode: "default",
194
+ hiddenFromHelp: true,
195
+ handler: () => {
196
+ throw new Error("Usage: cw.js backend list|show|probe [backend-id] | cw.js backend agent config [show|set] [--agent-command ... --agent-endpoint ... --agent-model ...]");
197
+ },
198
+ }, "backend.usage exists only to own the fixed usage-error text for an unrecognized backend subcommand; every real backend.* action is its own capability row above.");
199
+ (0, registry_core_1.addCliOnlyCapability)("contract.usage", "cw.js contract show <run-id> [contract-id]", {
200
+ path: ["contract"],
201
+ jsonMode: "default",
202
+ hiddenFromHelp: true,
203
+ handler: () => {
204
+ throw new Error("Usage: cw.js contract show <run-id> [contract-id]");
205
+ },
206
+ }, "contract.usage exists only to own the fixed usage-error text for an unrecognized contract subcommand; every real contract.* action is its own capability row above.");
207
+ (0, registry_core_1.addCliOnlyCapability)("migration.usage", "cw.js migration list|check|prove [target] [--contract run-state|workflow-app]", {
208
+ path: ["migration"],
209
+ jsonMode: "default",
210
+ hiddenFromHelp: true,
211
+ handler: () => {
212
+ throw new Error("Usage: cw.js migration list|check|prove [target] [--contract run-state|workflow-app]");
213
+ },
214
+ }, "migration.usage exists only to own the fixed usage-error text for an unrecognized migration subcommand; every real migration.* action is its own capability row above.");
215
+ (0, registry_core_1.addCliOnlyCapability)("feedback.usage", "cw.js feedback list|show|summary|collect|task|resolve <run-id> [feedback-id]", {
216
+ path: ["feedback"],
217
+ jsonMode: "default",
218
+ hiddenFromHelp: true,
219
+ handler: () => {
220
+ throw new Error("Usage: cw.js feedback list|show|summary|collect|task|resolve <run-id> [feedback-id]");
221
+ },
222
+ }, "feedback.usage exists only to own the fixed usage-error text for an unrecognized feedback subcommand; every real feedback.* action is its own capability row above.");
223
+ (0, registry_core_1.addCliOnlyCapability)("metrics.usage", "cw.js metrics show <run-id> | metrics summary [--scope repo|home] [--pricing <path>|default] [--limit N] [--json]", {
224
+ path: ["metrics"],
225
+ jsonMode: "default",
226
+ hiddenFromHelp: true,
227
+ handler: () => {
228
+ throw new Error("Usage: cw.js metrics show <run-id> | metrics summary [--scope repo|home] [--pricing <path>|default] [--limit N] [--json]");
229
+ },
230
+ }, "metrics.usage exists only to own the fixed usage-error text for an unrecognized metrics subcommand; every real metrics.* action is its own capability row above.");
231
+ (0, registry_core_1.addCliOnlyCapability)("operator.usage", "cw.js operator status|report <run-id> [--json]", {
232
+ path: ["operator"],
233
+ jsonMode: "default",
234
+ hiddenFromHelp: true,
235
+ handler: () => {
236
+ throw new Error("Usage: cw.js operator status|report <run-id> [--json]");
237
+ },
238
+ }, "operator.usage exists only to own the fixed usage-error text for an unrecognized operator subcommand; every real operator.* action is its own capability row above.");
239
+ (0, registry_core_1.addCliOnlyCapability)("topology.usage", "cw.js topology list|show <topology-id>|show <run-id> <topology-run-id>|validate <topology-id>|apply <run-id> <topology-id>|summary <run-id>|graph <run-id>", {
240
+ path: ["topology"],
241
+ jsonMode: "default",
242
+ hiddenFromHelp: true,
243
+ handler: () => {
244
+ throw new Error("Usage: cw.js topology list|show <topology-id>|show <run-id> <topology-run-id>|validate <topology-id>|apply <run-id> <topology-id>|summary <run-id>|graph <run-id>");
245
+ },
246
+ }, "topology.usage exists only to own the fixed usage-error text for an unrecognized topology subcommand; every real topology.* action is its own capability row above.");
247
+ (0, registry_core_1.addCliOnlyCapability)("summary.usage", "cw.js summary refresh|show <run-id> [--json]", {
248
+ path: ["summary"],
249
+ jsonMode: "default",
250
+ hiddenFromHelp: true,
251
+ handler: () => {
252
+ throw new Error("Usage: cw.js summary refresh|show <run-id> [--json]");
253
+ },
254
+ }, "summary.usage exists only to own the fixed usage-error text for an unrecognized summary subcommand; every real summary.* action is its own capability row above.");
255
+ (0, registry_core_1.addCliOnlyCapability)("workbench.usage", "cw.js workbench serve [--port N] [--once] [--require-token] | view <run-id> [--json]", {
256
+ path: ["workbench"],
257
+ jsonMode: "default",
258
+ hiddenFromHelp: true,
259
+ handler: () => {
260
+ throw new Error("Usage: cw.js workbench serve [--port N] [--once] [--require-token] | view <run-id> [--json]");
261
+ },
262
+ }, "workbench.usage exists only to own the fixed usage-error text for an unrecognized workbench subcommand; every real workbench.* action is its own capability row above.");
263
+ (0, registry_core_1.addCliOnlyCapability)("worker.usage", "cw.js worker list|summary|show|manifest|output|fail|validate <run-id> [worker-id] [result-file]", {
264
+ path: ["worker"],
265
+ jsonMode: "default",
266
+ hiddenFromHelp: true,
267
+ handler: () => {
268
+ throw new Error("Usage: cw.js worker list|summary|show|manifest|output|fail|validate <run-id> [worker-id] [result-file]");
269
+ },
270
+ }, "worker.usage exists only to own the fixed usage-error text for an unrecognized worker subcommand; every real worker.* action is its own capability row above.");
271
+ (0, registry_core_1.addCliOnlyCapability)("review.usage", "cw.js review status <run-id> [--json] | review policy <run-id> --required-approvals N --authorized-roles a,b --applies-to commit,selection", {
272
+ path: ["review"],
273
+ jsonMode: "default",
274
+ hiddenFromHelp: true,
275
+ handler: () => {
276
+ throw new Error("Usage: cw.js review status <run-id> [--json] | review policy <run-id> --required-approvals N --authorized-roles a,b --applies-to commit,selection");
277
+ },
278
+ }, "review.usage exists only to own the fixed usage-error text for an unrecognized review subcommand; every real review.* action is its own capability row above.");
279
+ (0, registry_core_1.addCliOnlyCapability)("coordinator.usage", "cw.js coordinator summary <run-id> | coordinator decision <run-id> --kind <kind> --outcome <outcome> --reason TEXT", {
280
+ path: ["coordinator"],
281
+ jsonMode: "default",
282
+ hiddenFromHelp: true,
283
+ handler: () => {
284
+ throw new Error("Usage: cw.js coordinator summary <run-id> | coordinator decision <run-id> --kind <kind> --outcome <outcome> --reason TEXT");
285
+ },
286
+ }, "coordinator.usage exists only to own the fixed usage-error text for an unrecognized coordinator subcommand; every real coordinator.* action is its own capability row above.");
287
+ // ---- man (CLI-only; raw manual-page bytes to stdout, no MCP peer) -----
288
+ //
289
+ // Writes the resolved doc file's raw bytes directly to stdout and
290
+ // returns an empty result — the generic renderCliResult (cli/dispatch.ts)
291
+ // always appends "\n" to `result.text` when it is missing one, which
292
+ // would violate "no added trailing newline" for any manual page that
293
+ // does not already end in one. A handler performing its own stdout write
294
+ // and returning `{}` is the established escape hatch (see
295
+ // workbench.serve's handler above for the same pattern/reasoning).
296
+ (0, registry_core_1.addCliOnlyCapability)("man", "cw man <topic> — read a manual page from docs/ (raw bytes, no added newline).", {
297
+ path: ["man"],
298
+ jsonMode: "human",
299
+ // core/format/help.ts's COMMAND_HELP_ROWS.man already owns the
300
+ // human-facing "cw man" help line (byte-ported from the old build's
301
+ // orchestrator.ts help table); hiddenFromHelp avoids a duplicate row.
302
+ hiddenFromHelp: true,
303
+ handler: (args) => {
304
+ const topic = args.positionals[0];
305
+ if (!topic) {
306
+ throw new Error("Missing topic.\n Tip: cw man release-tooling for the release tooling manual.");
307
+ }
308
+ process.stdout.write((0, man_cli_1.readManPage)(topic));
309
+ return {};
310
+ },
311
+ }, "man is a CLI-only raw-file reader over docs/; the old build never gave it an MCP peer.");
312
+ // ---- info (CLI-only; mirrors app.show with a human card by default) ----
313
+ (0, registry_core_1.addCliOnlyCapability)("info", "Show a workflow app's contract as a human card (or JSON with --json).", {
314
+ path: ["info"],
315
+ jsonMode: "flag",
316
+ handler: (args) => {
317
+ const appId = (0, io_1.required)(args.positionals[0], "workflow app id");
318
+ const data = (0, workflow_app_loader_1.showWorkflowApp)(appId);
319
+ return { json: data, text: `${(0, help_1.formatInfo)(appId, data)}\n` };
320
+ },
321
+ }, "info is a CLI-only convenience card over app.show; the old build never gave it an MCP peer.");
322
+ // ---- PARITY WIRING -------------------------------------------------------
323
+ //
324
+ // `next` had a raw `case "next"` arm in cli/dispatch.ts (a milestone 3/6
325
+ // PLACEHOLDER that always throws "not implemented in this milestone") but
326
+ // no row in this table's cli binding, so it had no cli-mcp-parity-smoke /
327
+ // cli-jsonmode-parity-smoke coverage. This row makes `next` a real,
328
+ // dual-bound capability (matching the old build's `cli: { path: ["next"],
329
+ // jsonMode: "default" }`) with the SAME placeholder body as the dispatch.ts
330
+ // arm — no new capability logic, just giving the existing placeholder a
331
+ // home in the one data table. dispatchTable() in cli/dispatch.ts tries this
332
+ // row before the switch statement is reached, so the old `case "next"` arm
333
+ // is now dead code for the CLI path (left in place, like the other
334
+ // superseded arms in that file, each with its own "dispatchTable() above
335
+ // always matches first" note).
336
+ (0, registry_core_1.attachCliBinding)("next", {
337
+ path: ["next"],
338
+ jsonMode: "default",
339
+ handler: (args) => ({ json: (0, state_cli_1.nextCli)((0, io_1.required)((0, io_1.optionalArg)(args.positionals[0]), "run id"), args.options) }),
340
+ });
341
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("next").mcp.handler = (args) => (0, state_cli_1.nextCli)((0, io_1.required)((0, io_1.optionalArg)(args.runId), "run id"), args);
342
+ // `ledger.propose`/`.review`/`.verify`/`.apply`/`.list` are documented
343
+ // payload-probe opt-outs in the old build (each mints a fresh timestamped/
344
+ // digested entry, or reads args that arrive by --file/stdin on the CLI vs
345
+ // a plain `entry` argument over MCP, or reads an on-disk ledger directory
346
+ // the generic probe does not populate) — same reasoning applies here
347
+ // unchanged, since both surfaces still route through the same
348
+ // buildLedgerProposal/buildLedgerReview/verifyLedgerEntry/
349
+ // applyLedgerProposal/listLedgerEntries core. Ported so these rows do not
350
+ // sit unclassified in the payload-identity probe.
351
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.propose").payloadIdentical = false;
352
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.propose").reason =
353
+ "Mints a fresh entry each call: createdAt is the wall-clock instant and the id/digest are derived from it, so the output is inherently non-deterministic and a byte-identity probe does not apply. Both surfaces call the same buildLedgerProposal core; round-trip + fail-closed behavior is covered by ledger-verify-smoke.";
354
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.review").payloadIdentical = false;
355
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.review").reason =
356
+ "Mints a fresh timestamped/digested verdict each call — non-deterministic output, same reasoning as ledger.propose. Both surfaces call the same buildLedgerReview core.";
357
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.verify").payloadIdentical = false;
358
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.verify").reason =
359
+ "The entry arrives by --file/stdin on the CLI and as an `entry` argument over MCP; there is no shared arg-bag the byte-identity probe can feed both. Both surfaces call the same verifyLedgerEntry core; ledger-verify-smoke proves the fail-closed contract.";
360
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.apply").payloadIdentical = false;
361
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.apply").reason =
362
+ "The entry arrives by --file/stdin on the CLI and as an `entry` argument over MCP; there is no shared arg-bag the byte-identity probe can feed both. Both surfaces call the same applyLedgerProposal core (a fail-closed wrapper over verifyLedgerEntry); ledger-apply-smoke proves the diff only escapes a verified proposal.";
363
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.list").payloadIdentical = false;
364
+ registry_core_1.REGISTRY_BY_CAPABILITY.get("ledger.list").reason =
365
+ "Output depends on the on-disk contents of the named ledger directory/directories, which the generic payload probe does not populate. Both surfaces call the same listLedgerEntries/unionLedgerEntries core; ledger-verify-smoke covers the fail-closed inbox and the multi-mirror union.";
366
+ // ---------------------------------------------------------------------------
@@ -417,3 +417,5 @@ The one-command `cw -q` headline now routes the question and defaults the repo t
417
417
  0.2.0
418
418
 
419
419
  0.2.1
420
+
421
+ 0.2.2
@@ -82,7 +82,7 @@ relationship. `identical` means `cw <cmd> --json` is equal to the `cw_<tool>`
82
82
  payload; `projected` means a declared divergence with a reason; `cli-only` marks
83
83
  a surface-specific capability with a recorded reason. The matrix is
84
84
  <!-- gen:parity:count -->
85
- machine-complete by design: 237 capabilities, 196 MCP tools.
85
+ machine-complete by design: 239 capabilities, 197 MCP tools.
86
86
  <!-- /gen:parity:count -->
87
87
 
88
88
  <!-- gen:parity:table -->
@@ -284,7 +284,9 @@ machine-complete by design: 237 capabilities, 196 MCP tools.
284
284
  | `orphans.gc` | `cw orphans gc` | `cw_orphans_gc` | `orphans.gc` | both | projected |
285
285
  | `telemetry.verify` | `cw telemetry verify` | `cw_telemetry_verify` | `telemetry.verify` | both | identical |
286
286
  | `history` | `cw history` | `cw_history` | `history` | both | identical |
287
+ | `audit.head` | `cw audit head` | `cw_audit_head` | `audit.head` | both | identical |
287
288
  | `version` | `cw version` | `—` | `version` | cli-only | cli-only |
289
+ | `search` | `cw search` | `—` | `search` | cli-only | cli-only |
288
290
  | `doctor` | `cw doctor` | `—` | `doctor` | cli-only | cli-only |
289
291
  | `fix` | `cw fix` | `—` | `fix` | cli-only | cli-only |
290
292
  | `quickstart` | `cw quickstart` | `—` | `quickstart` | cli-only | cli-only |
@@ -339,9 +341,10 @@ A capability may be on one surface only, but never without word of it — it mus
339
341
  carry a recorded reason in the registry.
340
342
 
341
343
  <!-- gen:parity:cliOnly -->
342
- 41 capabilities are CLI-only:
344
+ 42 capabilities are CLI-only:
343
345
 
344
346
  - `version` — version is a local, no-run-state print; the old build never gave it an MCP peer.
347
+ - `search` — CLI-only discovery helper over the same real app data cw list shows; no MCP client needs a free-text search tool alongside cw_list's structured output.
345
348
  - `doctor` — Environment diagnostics are inherently local to the CLI host — Node version, $PATH, $CW_HOME/cwd writability. An MCP client diagnosing the server process's environment is not meaningful; agents already receive the same readiness facts in their typed results (e.g. status: blocked, agentConfigured). Inspired by `brew doctor`.
346
349
  - `fix` — Environment fix commands are local diagnostics, same reasoning as doctor.
347
350
  - `quickstart` — quickstart composes plan/runDrive/report; SPEC/mcp.md's declared cli-only list names it explicitly (no MCP peer). `audit-run` is a CLI-only alias of the same wrapper.
@@ -628,3 +631,5 @@ CLI golden-path fixes: `cw -q "…"` routes the question (was read as an app id
628
631
  0.2.0
629
632
 
630
633
  0.2.1
634
+
635
+ 0.2.2
@@ -177,3 +177,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
177
177
  0.2.0
178
178
 
179
179
  0.2.1
180
+
181
+ 0.2.2
@@ -161,3 +161,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
161
161
  0.2.0
162
162
 
163
163
  0.2.1
164
+
165
+ 0.2.2
@@ -45,6 +45,26 @@ not just within one: a newly-added queue task can no longer go missing under a
45
45
  concurrent drain, and two reclaimers can no longer lose a tombstone
46
46
  (freed-without-proof).
47
47
 
48
+ ### The whole-cycle run-state lock (unreleased)
49
+
50
+ `saveCheckpoint` locks only the WRITE of `state.json`. A verb that does
51
+ load → change → save on its own left a window where two processes both
52
+ load the same state and the later save silently drops the earlier change
53
+ — the same lost-update class the v0.2.1 fix closed for `queue.json`
54
+ and `triggers.json`. Two additions close it for the run state itself:
55
+
56
+ - **`withRunStateLock(runId, cwd, fn)`** (run-store) holds the
57
+ `state.json` lock over the whole load → change → save cycle. `fn` gets
58
+ the run loaded UNDER the lock. `cw dispatch` and `cw result` go
59
+ through it, so two `cw result` calls for two tasks of the same run can
60
+ no longer lose a completion. Keep `fn` short: a critical section past
61
+ the 30 s steal window can be stolen.
62
+ - **`withFileLock` is now re-entrant inside one process**: a nested call
63
+ on the same target runs its `fn` under the already-held lock instead
64
+ of waiting on its own lockfile until the tries run out. Save paths
65
+ inside `fn` (`saveCheckpoint`, worker-failure persists) keep their own
66
+ lock calls unchanged. Cross-process behavior is untouched.
67
+
48
68
  ## Reclamation durability (the write-ahead seam, v0.1.40)
49
69
 
50
70
  The v0.1.39 reclamation transaction proved the *tombstone* crash-safe, but the
@@ -160,3 +180,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
160
180
  0.2.0
161
181
 
162
182
  0.2.1
183
+
184
+ 0.2.2
@@ -321,3 +321,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
321
321
  0.2.0
322
322
 
323
323
  0.2.1
324
+
325
+ 0.2.2
@@ -351,3 +351,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
351
351
  0.2.0
352
352
 
353
353
  0.2.1
354
+
355
+ 0.2.2
package/docs/index.md CHANGED
@@ -49,6 +49,7 @@ advanced pages only when you need those parts.
49
49
  - [Durable State & Locking](durable-state-and-locking.7.md) - atomic writes, fsync durability, and portable file locks.
50
50
  - [Source Context Profiles](source-context-profiles.7.md) - opt-in JSONL source exports for context slimming.
51
51
  - [Security / Trust Hardening](security-trust-hardening.7.md) - audit records, provenance, sandbox attestations, and acceptance rationale.
52
+ - [Trust Audit Anchor](trust-audit-anchor.7.md) - head anchor that makes a cut-off audit-log tail visible.
52
53
  - [State Explosion Management](state-explosion-management.7.md) - summaries, compact graph views, blackboard digests, and stale-aware compaction.
53
54
  - [Evidence Adoption Reasoning Chain](evidence-adoption-reasoning-chain.7.md) - why evidence was adopted or rejected.
54
55
 
@@ -327,3 +327,5 @@ The host-facing surface tracks the CLI golden-path fixes (`cw -q` routing + repo
327
327
  0.2.0
328
328
 
329
329
  0.2.1
330
+
331
+ 0.2.2
@@ -353,3 +353,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
353
353
  0.2.0
354
354
 
355
355
  0.2.1
356
+
357
+ 0.2.2
@@ -365,3 +365,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
365
365
  0.2.0
366
366
 
367
367
  0.2.1
368
+
369
+ 0.2.2
@@ -186,3 +186,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
186
186
  0.2.0
187
187
 
188
188
  0.2.1
189
+
190
+ 0.2.2
@@ -246,3 +246,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
246
246
  0.2.0
247
247
 
248
248
  0.2.1
249
+
250
+ 0.2.2
@@ -1,15 +1,15 @@
1
1
  # Cool Workflow Project Index
2
2
 
3
- Generated from the current repository code on 2026-07-07 by `npm run sync:project-index`.
3
+ Generated from the current repository code on 2026-07-08 by `npm run sync:project-index`.
4
4
 
5
5
  ## Snapshot
6
6
 
7
7
  - Package: `cool-workflow`
8
- - Version: `0.2.1`
9
- - Source modules: `129`
8
+ - Version: `0.2.2`
9
+ - Source modules: `145`
10
10
  - Workflow apps: `8`
11
- - Docs: `61`
12
- - Smoke tests: `178`
11
+ - Docs: `62`
12
+ - Smoke tests: `181`
13
13
  - Repository: https://github.com/coo1white/cool-workflow
14
14
 
15
15
  ## Architecture
@@ -82,6 +82,7 @@ multi-agent host -> topology -> blackboard/coordinator
82
82
  - [cli/entry.ts](../src/cli/entry.ts)
83
83
  - [cli/io.ts](../src/cli/io.ts)
84
84
  - [cli/parseargv.ts](../src/cli/parseargv.ts)
85
+ - [core/capability-data.ts](../src/core/capability-data.ts)
85
86
  - [core/capability-table.ts](../src/core/capability-table.ts)
86
87
  - [core/format/help.ts](../src/core/format/help.ts)
87
88
  - [core/format/state-explosion-text.ts](../src/core/format/state-explosion-text.ts)
@@ -113,6 +114,9 @@ multi-agent host -> topology -> blackboard/coordinator
113
114
  - [core/trust/telemetry-ledger.ts](../src/core/trust/telemetry-ledger.ts)
114
115
  - [core/types.ts](../src/core/types.ts)
115
116
  - [core/types/boundary.ts](../src/core/types/boundary.ts)
117
+ - [core/types/execution-backend.ts](../src/core/types/execution-backend.ts)
118
+ - [core/types/observability.ts](../src/core/types/observability.ts)
119
+ - [core/util/collate.ts](../src/core/util/collate.ts)
116
120
  - [mcp/dispatch.ts](../src/mcp/dispatch.ts)
117
121
  - [mcp/server.ts](../src/mcp/server.ts)
118
122
  - [shell/agent-config.ts](../src/shell/agent-config.ts)
@@ -181,6 +185,18 @@ multi-agent host -> topology -> blackboard/coordinator
181
185
  - [shell/workbench-text.ts](../src/shell/workbench-text.ts)
182
186
  - [shell/workbench.ts](../src/shell/workbench.ts)
183
187
  - [shell/worker-cli.ts](../src/shell/worker-cli.ts)
188
+ - [wiring/capability-table/basics.ts](../src/wiring/capability-table/basics.ts)
189
+ - [wiring/capability-table/exec-backend.ts](../src/wiring/capability-table/exec-backend.ts)
190
+ - [wiring/capability-table/index.ts](../src/wiring/capability-table/index.ts)
191
+ - [wiring/capability-table/multi-agent.ts](../src/wiring/capability-table/multi-agent.ts)
192
+ - [wiring/capability-table/parity.ts](../src/wiring/capability-table/parity.ts)
193
+ - [wiring/capability-table/pipeline.ts](../src/wiring/capability-table/pipeline.ts)
194
+ - [wiring/capability-table/registry-core.ts](../src/wiring/capability-table/registry-core.ts)
195
+ - [wiring/capability-table/reporting.ts](../src/wiring/capability-table/reporting.ts)
196
+ - [wiring/capability-table/scheduling-registry.ts](../src/wiring/capability-table/scheduling-registry.ts)
197
+ - [wiring/capability-table/state.ts](../src/wiring/capability-table/state.ts)
198
+ - [wiring/capability-table/trust-ledger.ts](../src/wiring/capability-table/trust-ledger.ts)
199
+ - [wiring/capability-table/workflow-apps.ts](../src/wiring/capability-table/workflow-apps.ts)
184
200
 
185
201
  ## Workflow Apps
186
202
 
@@ -251,6 +267,7 @@ multi-agent host -> topology -> blackboard/coordinator
251
267
  - [State Explosion Management](state-explosion-management.7.md)
252
268
  - [STATE-NODE(7)](state-node.7.md)
253
269
  - [Team Collaboration](team-collaboration.7.md)
270
+ - [Trust Audit Anchor](trust-audit-anchor.7.md)
254
271
  - [Trust Model & Limitations](trust-model.md)
255
272
  - [Unix-Inspired Workflow Principles](unix-principles.md)
256
273
  - [Vendor Manifest Loadability](vendor-manifest-loadability.7.md)
@@ -313,6 +330,7 @@ Smoke tests mirror the public contracts. The high-signal suites are:
313
330
  - [deferred-checkpoint-batching-smoke.js](../test/deferred-checkpoint-batching-smoke.js)
314
331
  - [demo-bundle-smoke.js](../test/demo-bundle-smoke.js)
315
332
  - [det-ids-b-smoke.js](../test/det-ids-b-smoke.js)
333
+ - [dispatch-legacy-burndown-smoke.js](../test/dispatch-legacy-burndown-smoke.js)
316
334
  - [doctor-smoke.js](../test/doctor-smoke.js)
317
335
  - [dogfood-architecture-review-smoke.js](../test/dogfood-architecture-review-smoke.js)
318
336
  - [dogfood-release-smoke.js](../test/dogfood-release-smoke.js)
@@ -409,6 +427,7 @@ Smoke tests mirror the public contracts. The high-signal suites are:
409
427
  - [run-restore-failclosed-smoke.js](../test/run-restore-failclosed-smoke.js)
410
428
  - [run-resume-drive-smoke.js](../test/run-resume-drive-smoke.js)
411
429
  - [run-retention-reclamation-smoke.js](../test/run-retention-reclamation-smoke.js)
430
+ - [run-state-lock-concurrency-smoke.js](../test/run-state-lock-concurrency-smoke.js)
412
431
  - [sample-determinism-smoke.js](../test/sample-determinism-smoke.js)
413
432
  - [sandbox-env-batch-hardening-smoke.js](../test/sandbox-env-batch-hardening-smoke.js)
414
433
  - [sandbox-profile-smoke.js](../test/sandbox-profile-smoke.js)
@@ -432,6 +451,7 @@ Smoke tests mirror the public contracts. The high-signal suites are:
432
451
  - [telemetry-metrics-coverage-smoke.js](../test/telemetry-metrics-coverage-smoke.js)
433
452
  - [telemetry-verify-signatures-smoke.js](../test/telemetry-verify-signatures-smoke.js)
434
453
  - [token-budget-enforcement-smoke.js](../test/token-budget-enforcement-smoke.js)
454
+ - [trust-audit-anchor-smoke.js](../test/trust-audit-anchor-smoke.js)
435
455
  - [vendor-manifest-load-smoke.js](../test/vendor-manifest-load-smoke.js)
436
456
  - [vendor-preflight-smoke.js](../test/vendor-preflight-smoke.js)
437
457
  - [verifier-gated-commit-smoke.js](../test/verifier-gated-commit-smoke.js)
@@ -193,3 +193,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
193
193
  0.2.0
194
194
 
195
195
  0.2.1
196
+
197
+ 0.2.2
@@ -333,3 +333,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
333
333
  0.2.0
334
334
 
335
335
  0.2.1
336
+
337
+ 0.2.2
@@ -296,3 +296,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
296
296
  0.2.0
297
297
 
298
298
  0.2.1
299
+
300
+ 0.2.2
@@ -476,3 +476,5 @@ _No behavioral change in v0.1.89 (CLI-surface golden-path + help-output fixes on
476
476
  0.2.0
477
477
 
478
478
  0.2.1
479
+
480
+ 0.2.2