mindforge-cc 11.9.8 → 11.9.9

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 (60) hide show
  1. package/.agent/mindforge/health.md +7 -4
  2. package/.agent/mindforge/help.md +9 -5
  3. package/.agent/mindforge/install-skill.md +8 -6
  4. package/.agent/mindforge/marketplace.md +6 -0
  5. package/.agent/mindforge/security-scan.md +9 -4
  6. package/.agent/mindforge/skills-index.md +1 -1
  7. package/.agent/mindforge/status.md +5 -4
  8. package/.claude/commands/mindforge/health.md +7 -4
  9. package/.claude/commands/mindforge/help.md +9 -5
  10. package/.claude/commands/mindforge/install-skill.md +8 -6
  11. package/.claude/commands/mindforge/marketplace.md +6 -0
  12. package/.claude/commands/mindforge/security-scan.md +9 -4
  13. package/.claude/commands/mindforge/skills-index.md +1 -1
  14. package/.claude/commands/mindforge/status.md +5 -4
  15. package/.mindforge/config.json +1 -1
  16. package/.mindforge/dynamic-workflows/scripts/feature-planner.js +12 -0
  17. package/.mindforge/dynamic-workflows/scripts/incident-response.js +6 -0
  18. package/.mindforge/dynamic-workflows/scripts/onboard-codebase.js +9 -0
  19. package/.mindforge/dynamic-workflows/scripts/perf-optimize.js +6 -0
  20. package/.mindforge/dynamic-workflows/scripts/refactor-plan.js +3 -0
  21. package/.mindforge/dynamic-workflows/scripts/release-prep.js +9 -0
  22. package/.mindforge/dynamic-workflows/scripts/tdd-sprint.js +12 -0
  23. package/.mindforge/dynamic-workflows/scripts/verification-loop.js +6 -0
  24. package/.mindforge/org/skills/MANIFEST.md +32 -0
  25. package/.mindforge/personas/mf-executor.md +1 -1
  26. package/.mindforge/personas/mf-memory.md +1 -1
  27. package/.mindforge/personas/mf-tool.md +1 -1
  28. package/.mindforge/personas/swarm-templates.json +10 -20
  29. package/CHANGELOG.md +58 -0
  30. package/MINDFORGE-AGENTIC-SECURITY.md +189 -0
  31. package/MINDFORGE.md +2 -2
  32. package/README.md +134 -87
  33. package/RELEASENOTES.md +28 -0
  34. package/SECURITY.md +1 -1
  35. package/bin/governance/audit-verifier.js +12 -3
  36. package/bin/installer/harness-adapter-compliance.js +1 -1
  37. package/bin/installer-core.js +58 -14
  38. package/bin/mindforge-cli.js +2 -2
  39. package/bin/verify-audit.js +7 -1
  40. package/changelogs/v11.9.9.md +59 -0
  41. package/docs/References/commands.md +2 -2
  42. package/docs/References/config-reference.md +20 -35
  43. package/docs/References/sdk-api.md +10 -4
  44. package/docs/References/skills-api.md +9 -7
  45. package/docs/commands-reference.md +2 -2
  46. package/docs/faq.md +2 -2
  47. package/docs/getting-started.md +9 -3
  48. package/docs/sdk-reference.md +3 -3
  49. package/docs/security/SECURITY.md +14 -0
  50. package/docs/security/ZTAI-OVERVIEW.md +53 -0
  51. package/docs/security/penetration-test-results.md +36 -0
  52. package/docs/security/threat-model.md +148 -0
  53. package/docs/troubleshooting.md +14 -10
  54. package/docs/user-guide.md +12 -8
  55. package/docs/usp-features.md +60 -0
  56. package/package.json +4 -1
  57. package/subagents/README.md +38 -0
  58. package/.agent/skills/godmode/SKILL.md +0 -396
  59. package/.agent/skills/godmode/references/jailbreak-templates.md +0 -128
  60. package/.agent/skills/godmode/references/refusal-detection.md +0 -142
package/README.md CHANGED
@@ -1,12 +1,22 @@
1
1
  # MindForge
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/mindforge-cc.svg)](https://www.npmjs.com/package/mindforge-cc)
3
+ [![npm version](https://img.shields.io/npm/v/mindforge-cc.svg?style=for-the-badge)](https://www.npmjs.com/package/mindforge-cc)
4
+ [![CI](https://img.shields.io/github/actions/workflow/status/sairam0424/MindForge/mindforge-ci.yml?style=for-the-badge&label=CI)](https://github.com/sairam0424/MindForge/actions/workflows/mindforge-ci.yml)
5
+ [![audit chain: verified](https://img.shields.io/badge/audit%20chain-verified-brightgreen?style=for-the-badge)](#what-is-actually-enforced)
6
+
4
7
  [![npm downloads](https://img.shields.io/npm/dm/mindforge-cc.svg)](https://www.npmjs.com/package/mindforge-cc)
5
8
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
9
  [![Node >=18](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](package.json)
7
- [![CI](https://github.com/sairam0424/MindForge/actions/workflows/mindforge-ci.yml/badge.svg)](https://github.com/sairam0424/MindForge/actions/workflows/mindforge-ci.yml)
8
10
 
9
- **A governance and orchestration layer for Claude Code.**
11
+ ![Claude Code](https://img.shields.io/badge/Claude_Code-supported-blueviolet)
12
+ ![Antigravity](https://img.shields.io/badge/Antigravity-supported-blueviolet)
13
+ ![Cursor](https://img.shields.io/badge/Cursor-supported-blueviolet)
14
+ ![Copilot](https://img.shields.io/badge/Copilot-supported-blueviolet)
15
+ ![Gemini CLI](https://img.shields.io/badge/Gemini_CLI-supported-blueviolet)
16
+ ![OpenCode](https://img.shields.io/badge/OpenCode-supported-blueviolet)
17
+
18
+ **A governance and orchestration layer for Claude Code** (and Antigravity, Cursor, Copilot,
19
+ Gemini, OpenCode).
10
20
 
11
21
  Claude Code alone runs one agent in one context. MindForge adds the parts that don't fit in a
12
22
  single context window: skills that auto-load by trigger, personas you can call by name, a
@@ -15,11 +25,9 @@ tamper-evident audit chain, and cost-aware routing across providers. Install it
15
25
  `/mindforge:plan-phase` → `/mindforge:execute-phase` → `/mindforge:verify-phase` → `/mindforge:ship`
16
26
  as your actual working loop, not a slogan.
17
27
 
18
- <!-- TODO: record a ~30s terminal cast of one real /mindforge:plan-phase -> /mindforge:execute-phase
19
- run (asciinema or GIF) and embed it here. Every comparable README in this space leads with a
20
- visual in the first 15 lines; this is currently the single biggest gap. -->
28
+ 221 commands · 354 skills · 216 personas · 164 subagents · 35 workflows
21
29
 
22
- **Jump to:** [Latest release](#latest-release) · [What you get](#what-you-get) · [What is actually enforced](#what-is-actually-enforced) · [Install](#install) · [Quick start](#quick-start-new-project) · [Documentation](#documentation) · [Core workflow](#core-workflow) · [Dynamic workflows](#dynamic-workflow-library)
30
+ **Jump to:** [Latest release](#latest-release) · [What you get](#what-you-get) · [What is actually enforced](#what-is-actually-enforced) · [Install](#install) · [Verify](#verify) · [Quick start (new)](#quick-start-new-project) · [Quick start (existing)](#quick-start-existing-codebase) · [How it fits together](#how-it-fits-together) · [Documentation](#documentation) · [Core workflow](#core-workflow) · [Dynamic workflows](#dynamic-workflow-library) · [Updates](#updates-and-migrations) · [Token usage](#token-usage-profiling) · [License](#license)
23
31
 
24
32
  ---
25
33
 
@@ -28,11 +36,12 @@ as your actual working loop, not a slogan.
28
36
  | | Capability | Detail |
29
37
  |---|---|---|
30
38
  | 🧩 | **221 slash commands** | `/mindforge:plan-phase`, `/mindforge:execute-phase`, `/mindforge:ship`, and 218 more — [full reference](docs/commands-reference.md) |
31
- | 🛠️ | **355 skills** | 232 auto-triggered by keyword match (engine tier) + 123 explicit, invoked by name (extended tier) |
39
+ | 🛠️ | **354 skills** | 232 auto-triggered by keyword match (engine tier) + 122 explicit, invoked by name (extended tier) |
32
40
  | 🎭 | **216 personas** | In-session role overlays via `/mindforge:agent <name>` — same context, different behavioral spec |
33
- | 🤖 | **164 subagents** | Genuine isolated-context Claude-Code-native subagent definitions — a separate mechanism from personas, see [docs/PERSONAS.md](docs/PERSONAS.md) |
41
+ | 🤖 | **164 subagents** | Genuine isolated-context Claude-Code-native subagent definitions — a separate mechanism from personas, see [docs/PERSONAS.md](docs/PERSONAS.md); 152 adapted from [VoltAgent's `awesome-claude-code-subagents`](https://github.com/VoltAgent/awesome-claude-code-subagents) (MIT), attribution in [subagents/README.md](subagents/README.md) |
34
42
  | 🔀 | **35 dynamic workflows** | Multi-agent fan-out scripts across 5 tiers (Research, Dev, Ops, Intelligence, Beast) — [workflow atlas](docs/workflow-atlas.md) |
35
43
  | 🔒 | **Tamper-evident audit chain** | SHA-256 hash-linked `.planning/AUDIT.jsonl`; verify independently with `node bin/verify-audit.js` |
44
+ | 🔍 | **Multi-model cross-review + decision council** | Two-model adversarial PR review (`/mindforge:pr-review`) and a 4-voice consensus council (`/mindforge:council`) — `bin/review/`, `bin/engine/council-runtime.js` |
36
45
  | 💸 | **Cost-aware model routing** | Anthropic / OpenAI / Gemini / Bedrock / Ollama, routed by task difficulty tier |
37
46
  | 🧠 | **Local-first knowledge graph** | Zero-native-dependency SQLite (`sql.js` / WASM) — no native build step |
38
47
  | 📊 | **Live dashboard** | Express + SSE at `localhost:7339` |
@@ -42,10 +51,69 @@ entry, and an MCP server.
42
51
 
43
52
  ---
44
53
 
54
+ ## What is actually enforced
55
+
56
+ Read this before you rely on anything below blocking a bad command. MindForge ships a large
57
+ corpus of agent instructions — commands, skills, personas, protocols — and those are advisory: they work by
58
+ being in the model's context, and a model can decline them. The parts that would *block* an
59
+ action are hooks. Through 11.9.2 **no channel registered them.** 11.9.3 added the registration code
60
+ but it declined to run on almost every project, so in practice nothing was enforced there either.
61
+ **As of 11.9.4** both channels register and execute them **on Claude Code**, and nowhere else.
62
+
63
+ | Capability | Plugin channel | `npx` channel |
64
+ |---|---|---|
65
+ | Slash commands | Yes | Yes |
66
+ | Skills / personas / protocol docs | Yes | Yes |
67
+ | Subagents | Yes | Yes |
68
+ | Audit hash-chain (`bin/verify-audit.js`) | Yes | Yes |
69
+ | **Hooks enforced (can block a tool call)** | **Claude Code only** | **Claude Code + `--local` only** |
70
+
71
+ What that means, measured rather than asserted:
72
+
73
+ - **The `npx` channel generates the config it never used to ship.** `files[]` has 52 entries and
74
+ none of them contains `settings`, so no settings file is *published* — instead
75
+ `bin/installer/hook-registration.js` writes one at install time, merging append-only into any
76
+ file you already have. Measured on a confined install: **8 hooks registered** into
77
+ `.claude/settings.json`, of which the installer's own preflight **executed 7 and verified all 3
78
+ deny-class hooks returning exit 2** before keeping the file. A preflight failure rolls the
79
+ registration back rather than leaving a config whose commands do not run.
80
+ - **The plugin channel's dispatcher runs.** It previously crashed on every fire —
81
+ `run-with-flags.js` requires `./lib/hook-flags` and `plugins/mindforge/scripts/lib/` was not
82
+ copied in. That directory now exists, all **14 path tokens** in
83
+ `plugins/mindforge/hooks/hooks.json` resolve under the plugin root, and driving the dispatcher by
84
+ hand returns **exit 2** for `mindforge-block-no-verify` and `mindforge-config-protection`.
85
+
86
+ > [!WARNING]
87
+ > Still **not** enforced, deliberately and with a printed reason for each: any runtime other than
88
+ > Claude Code (Cursor, Copilot, Gemini/Antigravity, OpenCode), `--global` scope, a self-install
89
+ > inside a MindForge checkout, and Windows. Writing a Claude-schema config into `.cursor/` without an
90
+ > execution-verified hook contract would be decorative. Every outcome, including "not registered", is
91
+ > printed by the installer and written to `.mindforge/hook-registration.json`.
92
+
93
+ Three things gate whether a registered hook is *live*, none of them in MindForge's control: the
94
+ harness must be **restarted** (hooks are snapshotted at session start), the project must be
95
+ **trusted** in the harness, and `CLAUDE_PROJECT_DIR` must be set with `node` on the hook PATH —
96
+ if it is not, the commands exit 1 and the gate is simply absent, which is a deliberate trade
97
+ against a fail-closed tail that was measured denying benign commands on a fresh clone. See
98
+ *Hooks are installed but nothing is blocked* in `docs/troubleshooting.md`.
99
+
100
+ So: on Claude Code, treat MindForge as a policy enforcement point for the 8 registered hooks plus
101
+ a tamper-evident audit log; on every other harness, as **governance-by-convention** plus that same
102
+ audit log. Installing it also expands your repository's trust boundary by a large volume of agent
103
+ instructions — review what you install. The audit chain is verifiable today
104
+ (`node bin/verify-audit.js`).
105
+
106
+ ---
107
+
45
108
  ## Install
46
109
 
47
110
  Pick whichever matches how you work — all of these are real, live channels.
48
111
 
112
+ On a typical connection, `npx mindforge-cc@latest --claude --local` finishes in well under 10
113
+ seconds (measured: ~5.4s locally) — reproduce with `time npx mindforge-cc@latest --claude --local`
114
+ in an empty directory. Install makes zero model calls; you don't spend a token or a dollar until
115
+ you run a command that dispatches to a subagent.
116
+
49
117
  ### `npx` (recommended)
50
118
 
51
119
  Writes `.mindforge/` governance, memory, and planning into your project:
@@ -119,12 +187,13 @@ Build on MindForge programmatically:
119
187
  npm i mindforge-sdk
120
188
  ```
121
189
 
122
- **Upgrading from 11.9.x?** The installer does not overwrite an existing
123
- `.mindforge/MINDFORGE-SCHEMA.json`, so 11.9.2's armed config validator keeps the older
124
- permissive schema on a plain upgrade — run with `--force` for the stricter gate. The daily cost
125
- cap declared as `[COST_HARD_LIMIT_USD]` in `MINDFORGE.md` was **not enforced** in 11.9.2 (11.9.3
126
- arms it), and an upgrade never rewrites an existing `MINDFORGE.md` — add
127
- `[COST_HARD_LIMIT_USD] = 25.00` yourself if yours predates the key.
190
+ > [!NOTE]
191
+ > **Upgrading from 11.9.x?** The installer does not overwrite an existing
192
+ > `.mindforge/MINDFORGE-SCHEMA.json`, so 11.9.2's armed config validator keeps the older
193
+ > permissive schema on a plain upgrade — run with `--force` for the stricter gate. The daily cost
194
+ > cap declared as `[COST_HARD_LIMIT_USD]` in `MINDFORGE.md` was **not enforced** in 11.9.2 (11.9.3
195
+ > arms it), and an upgrade never rewrites an existing `MINDFORGE.md` — add
196
+ > `[COST_HARD_LIMIT_USD] = 25.00` yourself if yours predates the key.
128
197
 
129
198
  Full install matrix, plugin packs, and team-setup guidance: [docs/getting-started.md](docs/getting-started.md).
130
199
 
@@ -170,20 +239,33 @@ Full verification walkthrough: [docs/quick-verify.md](docs/quick-verify.md).
170
239
 
171
240
  ## Latest release
172
241
 
173
- **v11.9.8** (2026-09-21) — What the README claims, verified line by line. v11.9.7's README
174
- rewrite got a literal, end-to-end audit: every command it documents actually run — real
175
- `npx` installs, a real Homebrew install/uninstall cycle, a real `npm i mindforge-sdk`, live
176
- registry checks — instead of re-read for plausibility. 113 claims checked, 98 held up, 14
177
- didn't, 1 couldn't be verified either way. Two of the 14 were real bugs:
178
- `--runtime claude,cursor` crashed the installer outright, and `--minimal` claimed "no
179
- persona library" but shipped all 216 anyway. Both fixed. The other twelve were
180
- documentation catching up to what the code actually does — a removed `[--ads]` hint that
181
- was never real, the auto-detect claim, `--repair`, `--profile`, the CLI `spawn` stub, the
182
- License holder, the skill-tier split, the `bin/` line count, three Documentation-table rows
183
- that overstated their linked docs, and the `mindforge-plugin-*` namespace's empty catalog.
184
- See [RELEASENOTES.md](./RELEASENOTES.md) or [CHANGELOG.md](./CHANGELOG.md).
185
-
186
- The previous release, **v11.9.7**, fixed a version self-contradiction and a false "Enabled"
242
+ **v11.9.9** (2026-09-23) — Release-readiness audit: 5 CRITICAL + 9 HIGH findings fixed. An
243
+ 8-agent audit workflow tested every surface (commands, skills, personas, subagents,
244
+ dynamic workflows, CLI/MCP, live install/verify/health) as a release gate before pointing
245
+ real external users at the project. Every finding was independently re-verified against
246
+ live code before fixing, not trusted from the audit report alone. Five were ship-blocking:
247
+ a real LLM jailbreak toolkit (`godmode`) shipping unconditionally in the package is gone;
248
+ `help.md`/`status.md`/`health.md`/`security-scan.md` stop claiming PQAS/biometric/
249
+ lattice-crypto verification is "active by default" when the code says the opposite;
250
+ `--minimal` now actually skips the persona set instead of shipping all 218 files anyway; a
251
+ "Sovereign Integrity Check" that called a CLI flag on a script with no CLI entrypoint (and
252
+ so could never fail) is replaced with a real check; and a dead 4-line stub standing in for
253
+ "232 auto-triggered skills" is now disclosed as what it is. Nine more: corrected CLI
254
+ invocation docs, disclosed the marketplace's zero published packages, crash-guards on 8
255
+ dynamic workflows, 32 unregistered skills added to the manifest, 3 personas granting
256
+ tools that don't exist fixed, 11 dangling swarm-template references reconciled, `health`
257
+ wired to a real integrity check, and a brand-new install's audit log no longer reporting a
258
+ false "BROKEN" status. See [RELEASENOTES.md](./RELEASENOTES.md) or
259
+ [CHANGELOG.md](./CHANGELOG.md).
260
+
261
+ <details>
262
+ <summary><strong>Earlier releases</strong></summary>
263
+
264
+ **v11.9.8** fixed two real bugs found by a literal, end-to-end README audit (113 claims
265
+ checked, 98 held up): `--runtime claude,cursor` crashed the installer outright, and
266
+ `--minimal` claimed "no persona library" but shipped all 216 anyway. The other twelve
267
+ findings were documentation catching up to what the code actually does. The previous
268
+ release, **v11.9.7**, fixed a version self-contradiction and a false "Enabled"
187
269
  claim in the install banner, a dead `docs.mindforge.cc` link, and a persona-count doc
188
270
  regression (218 → back to the correct 216) introduced by v11.9.6's own honesty pass.
189
271
  **v11.9.6** was the release-readiness pass before pointing real, external users at the
@@ -200,58 +282,7 @@ change under a patch bump** still applies — the installer writes `.claude/sett
200
282
  where it previously declined, merging append-only and backing up first. See the BREAKING
201
283
  section in [CHANGELOG.md](./CHANGELOG.md).
202
284
 
203
- ---
204
-
205
- ## What is actually enforced
206
-
207
- Read this before you rely on anything below blocking a bad command. MindForge ships a large
208
- corpus of agent instructions — commands, skills, personas, protocols — and those are advisory: they work by
209
- being in the model's context, and a model can decline them. The parts that would *block* an
210
- action are hooks. Through 11.9.2 **no channel registered them.** 11.9.3 added the registration code
211
- but it declined to run on almost every project, so in practice nothing was enforced there either.
212
- **As of 11.9.4** both channels register and execute them **on Claude Code**, and nowhere else.
213
-
214
- | Capability | Plugin channel | `npx` channel |
215
- |---|---|---|
216
- | Slash commands | Yes | Yes |
217
- | Skills / personas / protocol docs | Yes | Yes |
218
- | Subagents | Yes | Yes |
219
- | Audit hash-chain (`bin/verify-audit.js`) | Yes | Yes |
220
- | **Hooks enforced (can block a tool call)** | **Claude Code only** | **Claude Code + `--local` only** |
221
-
222
- What that means, measured rather than asserted:
223
-
224
- - **The `npx` channel generates the config it never used to ship.** `files[]` has 49 entries and
225
- none of them contains `settings`, so no settings file is *published* — instead
226
- `bin/installer/hook-registration.js` writes one at install time, merging append-only into any
227
- file you already have. Measured on a confined install: **8 hooks registered** into
228
- `.claude/settings.json`, of which the installer's own preflight **executed 7 and verified all 3
229
- deny-class hooks returning exit 2** before keeping the file. A preflight failure rolls the
230
- registration back rather than leaving a config whose commands do not run.
231
- - **The plugin channel's dispatcher runs.** It previously crashed on every fire —
232
- `run-with-flags.js` requires `./lib/hook-flags` and `plugins/mindforge/scripts/lib/` was not
233
- copied in. That directory now exists, all **14 path tokens** in
234
- `plugins/mindforge/hooks/hooks.json` resolve under the plugin root, and driving the dispatcher by
235
- hand returns **exit 2** for `mindforge-block-no-verify` and `mindforge-config-protection`.
236
-
237
- Still **not** enforced, deliberately and with a printed reason for each: any runtime other than
238
- Claude Code (Cursor, Copilot, Gemini/Antigravity, OpenCode), `--global` scope, a self-install
239
- inside a MindForge checkout, and Windows. Writing a Claude-schema config into `.cursor/` without an
240
- execution-verified hook contract would be decorative. Every outcome, including "not registered", is
241
- printed by the installer and written to `.mindforge/hook-registration.json`.
242
-
243
- Three things gate whether a registered hook is *live*, none of them in MindForge's control: the
244
- harness must be **restarted** (hooks are snapshotted at session start), the project must be
245
- **trusted** in the harness, and `CLAUDE_PROJECT_DIR` must be set with `node` on the hook PATH —
246
- if it is not, the commands exit 1 and the gate is simply absent, which is a deliberate trade
247
- against a fail-closed tail that was measured denying benign commands on a fresh clone. See
248
- *Hooks are installed but nothing is blocked* in `docs/troubleshooting.md`.
249
-
250
- So: on Claude Code, treat MindForge as a policy enforcement point for the 8 registered hooks plus
251
- a tamper-evident audit log; on every other harness, as **governance-by-convention** plus that same
252
- audit log. Installing it also expands your repository's trust boundary by a large volume of agent
253
- instructions — review what you install. The audit chain is verifiable today
254
- (`node bin/verify-audit.js`).
285
+ </details>
255
286
 
256
287
  ---
257
288
 
@@ -271,14 +302,22 @@ instructions — review what you install. The audit chain is verifiable today
271
302
  |
272
303
  v
273
304
  Verification (build / typecheck / lint / test / security / diff)
274
- |
275
- v
276
- Handoff (.planning/HANDOFF.json + AUDIT.jsonl)
305
+ pass | fail
306
+ +--------------+--------------+
307
+ v v
308
+ Handoff (.planning/HANDOFF.json Temporal rollback -> sets status
309
+ + AUDIT.jsonl) "awaiting_regeneration"
277
310
  ```
278
311
 
312
+ The fail path is real but partial: `bin/hindsight-injector.js` rolls back `.planning/` state and sets
313
+ `auto-state.json.status = "awaiting_regeneration"` — verified, and hash-chained into the audit log
314
+ like everything else. What is **not** currently true: nothing in `bin/` reads that status back out
315
+ to automatically re-trigger the wave (`awaiting_regeneration` has one writer, zero readers today) —
316
+ regeneration after a rollback is a manual step, not a closed loop.
317
+
279
318
  Four layers underlie this, top to bottom: **Interface** (`.claude/`, `.agent/` — the 221 slash
280
- commands and hooks), **Engine specs** (`.mindforge/` — 232 of the 355 skills plus 216 personas and
281
- `config.json` runtime knobs; the other 123 skills are extended-tier, under `.agent/skills/`),
319
+ commands and hooks), **Engine specs** (`.mindforge/` — 232 of the 354 skills plus 216 personas and
320
+ `config.json` runtime knobs; the other 122 skills are extended-tier, under `.agent/skills/`),
282
321
  **Execution** (`bin/`, ~32K raw / ~25K stripped-of-comments LOC — the wave executor, governance,
283
322
  memory, and dashboard code that actually runs), and **Persistence** (`.planning/` — `STATE.md`,
284
323
  the audit chain, resumable `HANDOFF.json`). Edit behavior in layer 2 where possible; layer 3 is
@@ -308,7 +347,7 @@ Six categories, read in this order the first time:
308
347
  | Security | [SECURITY.md](SECURITY.md) | Reporting a vulnerability; credentials are read from env vars and never committed |
309
348
  | Security | [Threat model](docs/security/threat-model.md) | Historical only — scoped to the v1.0.0 predecessor, not re-reviewed against v11.x; see [SECURITY.md](SECURITY.md) for what's actually enforced today |
310
349
  | Contributing | [Architecture](docs/architecture/README.md) | Understanding the codebase before sending a PR |
311
- | Contributing | [Contributing guide](docs/contributing/CONTRIBUTING.md) | Sending a PR |
350
+ | Contributing | [Contributing guide](CONTRIBUTING.md) | Sending a PR |
312
351
  | Contributing | [CI quickstart](docs/ci-quickstart.md) | Understanding what CI checks before you push |
313
352
  | Contributing | [Release checklist](docs/release-checklist-guide.md) | Cutting a release |
314
353
  | Reference | [USPs and features](docs/usp-features.md) | The same "measured, not asserted" honesty pass applied to what's actually shipped — no competitor comparison |
@@ -386,6 +425,14 @@ published under it — this is the mechanism, not a catalog.
386
425
  (`--profile` doesn't exist; real flags are `--phase N`, `--session ID`, `--window short|medium|long`,
387
426
  and `--optimise`.) See `.mindforge/production/token-optimiser.md`.
388
427
 
428
+ Installing and running `/mindforge:plan-phase`/`/mindforge:execute-phase` costs real model calls
429
+ once a subagent starts working — install itself does not (`npx mindforge-cc@latest` never calls
430
+ a model). Spend is capped by `[COST_HARD_LIMIT_USD]` in `MINDFORGE.md` (default `25.00`),
431
+ enforced in code by `bin/models/cost-tracker.js`'s `preflight()` before each call goes out — not a
432
+ policy statement. The per-project token/cost *reports* from `/mindforge:tokens` and
433
+ `.mindforge/production/token-optimiser.md` are heuristic estimates (`file size / 4`), explicitly
434
+ logged with `measured: false`.
435
+
389
436
  ---
390
437
 
391
438
  ## License
package/RELEASENOTES.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # Release Notes
2
2
 
3
+ ## v11.9.9 — 2026-09-23 — Release-readiness audit: 5 CRITICAL + 9 HIGH findings fixed
4
+
5
+ ### Why this release exists
6
+
7
+ An 8-agent audit workflow tested every MindForge surface — slash commands, skills,
8
+ personas, subagents, dynamic workflows, CLI/MCP, and a live install/verify/health cycle —
9
+ as a release gate before shipping to real external users. Every finding was independently
10
+ re-verified against live code and commands before being fixed, not trusted from the audit
11
+ report alone.
12
+
13
+ ### The user-visible part
14
+
15
+ **Five CRITICAL findings, all ship-blocking:** a real, complete LLM jailbreak toolkit
16
+ (`godmode`) that was shipping unconditionally in the published package is gone; `help.md`,
17
+ `status.md`, `health.md`, and `security-scan.md` stop claiming PQAS/biometric/lattice-crypto
18
+ verification is "active by default" when the code itself says it's simulated and off;
19
+ `--minimal` now actually skips the persona set instead of shipping all 218 files anyway; a
20
+ "Sovereign Integrity Check" that called a CLI flag on a script with no CLI entrypoint (and
21
+ so could never fail) is replaced with a real check; and a dead 4-line stub standing in for
22
+ "232 auto-triggered skills" is now disclosed as what it is.
23
+
24
+ **Nine HIGH-severity findings:** corrected CLI invocation docs, disclosed the marketplace
25
+ has zero published packages today, added crash-guards to 8 dynamic workflows, registered 32
26
+ skills that existed on disk but were never in the manifest, fixed three personas granting
27
+ tools that don't exist, reconciled 11 dangling swarm-template references, wired the `health`
28
+ command to an actual integrity check, and stopped a brand-new install's audit log from
29
+ reporting a false "BROKEN" status.
30
+
3
31
  ## v11.9.8 — 2026-09-21 — What the README claims, verified line by line
4
32
 
5
33
  ### Why this release exists
package/SECURITY.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Security Policy
2
2
 
3
- > **Current version:** 11.9.8 | **npm audit:** 0 vulnerabilities across root, sdk, mcp-server
3
+ > **Current version:** 11.9.9 | **npm audit:** 0 vulnerabilities across root, sdk, mcp-server
4
4
 
5
5
  ## Supported Versions
6
6
 
@@ -1,6 +1,10 @@
1
1
  'use strict';
2
2
  /**
3
- * MindForge — Audit chain verifier (UC-04). Fail-closed: any break => valid:false.
3
+ * MindForge — Audit chain verifier (UC-04). Fail-closed: any break => valid:false. An ABSENT log
4
+ * (ENOENT) is reported separately via `missing: true` rather than folded into the generic
5
+ * `unreadable:` reason below — a project that has never written an audit entry is not evidence of
6
+ * tampering, and callers (bin/verify-audit.js) use the distinction to avoid crying "BROKEN" at a
7
+ * brand-new user who has done nothing wrong.
4
8
  *
5
9
  * Walks the JSONL audit log line-by-line and re-derives each entry's hash from its
6
10
  * content plus the prior entry's hash. The chain is valid only if EVERY link holds:
@@ -32,12 +36,17 @@ function hashEntry(entry, previousHash) {
32
36
  /**
33
37
  * Verifies the integrity of a hash-chained audit log. Fail-closed.
34
38
  * @param {string} auditPath — path to the AUDIT.jsonl file
35
- * @returns {{ valid: boolean, count: number, brokenAt?: number, reason?: string }}
39
+ * @returns {{ valid: boolean, count: number, brokenAt?: number, reason?: string, missing?: boolean }}
36
40
  */
37
41
  function verifyAuditChain(auditPath) {
38
42
  let lines;
39
43
  try { lines = fs.readFileSync(auditPath, 'utf8').split('\n').filter(Boolean); }
40
- catch (e) { return { valid: false, count: 0, brokenAt: 0, reason: `unreadable: ${e.message}` }; }
44
+ catch (e) {
45
+ if (e.code === 'ENOENT') {
46
+ return { valid: false, count: 0, missing: true, reason: 'no audit log yet — nothing has been audited' };
47
+ }
48
+ return { valid: false, count: 0, brokenAt: 0, reason: `unreadable: ${e.message}` };
49
+ }
41
50
 
42
51
  let previousHash = null;
43
52
  for (let i = 0; i < lines.length; i++) {
@@ -84,7 +84,7 @@ function freezeRecord(record) {
84
84
  */
85
85
  function sharedAssetTrees(base, { hooks = 11 } = {}) {
86
86
  return [
87
- { asset: 'skills', dir: `${base}/skills`, min_files: 282, verbatim_subset_of: '.agent/skills' },
87
+ { asset: 'skills', dir: `${base}/skills`, min_files: 279, verbatim_subset_of: '.agent/skills' },
88
88
  { asset: 'hooks', dir: `${base}/hooks`, min_files: hooks, verbatim_subset_of: '.agent/hooks' },
89
89
  { asset: 'personas', dir: `${base}/personas`, min_files: 218, verbatim_subset_of: '.mindforge/personas' },
90
90
  { asset: 'docs references', dir: `${base}/docs/references`, min_files: 20, verbatim_subset_of: 'docs/References' },
@@ -636,13 +636,16 @@ async function install(runtime, scope, options = {}) {
636
636
  const assetMappings = [
637
637
  { key: 'skillsSubdir', src: src('.agent', 'skills'), label: 'skills' },
638
638
  { key: 'hooksSubdir', src: src('.agent', 'hooks'), label: 'hooks' },
639
- { key: 'personasSubdir', src: src('.mindforge', 'personas'), label: 'personas' },
640
639
  // NB: on-disk dirs are capitalized (docs/References, docs/Templates). macOS is
641
640
  // case-insensitive so lowercase used to "work" locally, but npm/Linux is
642
641
  // case-sensitive — the lookup silently missed in production (UC: REFERENCES 0).
643
642
  { key: 'docsSubdir', src: src('docs', 'References'), label: 'references' },
644
643
  { key: 'docsSubdir', src: src('docs', 'Templates'), label: 'templates' }
645
644
  ];
645
+ // Mirrors the real copy logic in Section 2.1: personas are skipped under --minimal.
646
+ if (!minimal) {
647
+ assetMappings.push({ key: 'personasSubdir', src: src('.mindforge', 'personas'), label: 'personas' });
648
+ }
646
649
 
647
650
  assetMappings.forEach(asset => {
648
651
  const subDir = cfg[asset.key];
@@ -813,17 +816,25 @@ async function install(runtime, scope, options = {}) {
813
816
  }
814
817
  }
815
818
 
816
- // ── 2.1 Install Enterprise Assets (Skills, Hooks, Personas) ─────────────────
819
+ // ── 2.1 Install Enterprise Assets (Skills, Hooks, Personas, Docs, Memory, Plugins) ──
817
820
  if (scope === 'local' && !selfInstall) {
818
821
  const assetTypes = [
819
822
  { key: 'skillsSubdir', src: src('.agent', 'skills'), label: 'skills' },
820
823
  { key: 'hooksSubdir', src: src('.agent', 'hooks'), label: 'hooks' },
821
- { key: 'personasSubdir', src: src('.mindforge', 'personas'), label: 'personas' },
822
824
  { key: 'docsSubdir', src: src('docs', 'References'), label: 'references' },
823
825
  { key: 'docsSubdir', src: src('docs', 'Templates'), label: 'templates' },
824
826
  { key: 'memorySubdir', src: src('.mindforge', 'memory'), label: 'memory' },
825
827
  { key: 'pluginsSubdir', src: src('.mindforge', 'plugins'), label: 'plugins' }
826
828
  ];
829
+ // 'personas' is gated on !minimal, not removed: this copy into <runtime>/personas/ (e.g.
830
+ // .claude/personas/) is a real, tested, documented per-harness asset delivery contract
831
+ // (bin/installer/harness-adapter-compliance.js's ADAPTER_RECORDS asserts a >=218-file floor
832
+ // here for every harness except copilot), not dead/unused. The bug was that it ran
833
+ // unconditionally regardless of --minimal, undermining --minimal's "no persona library"
834
+ // promise (README.md, docs/getting-started.md) by shipping the full persona set anyway.
835
+ if (!minimal) {
836
+ assetTypes.push({ key: 'personasSubdir', src: src('.mindforge', 'personas'), label: 'personas' });
837
+ }
827
838
 
828
839
  assetTypes.forEach(asset => {
829
840
  const subDir = cfg[asset.key];
@@ -1082,6 +1093,13 @@ async function install(runtime, scope, options = {}) {
1082
1093
  // install-manifests/install-state pair, which are build- and CI-side and have no business in a
1083
1094
  // consumer project.
1084
1095
  'bin/installer/hook-registration.js',
1096
+ // A thin (12-line) entry point whose only require is bin/governance/audit-verifier.js, which
1097
+ // already ships unconditionally via sovereignEngines above -- so this adds zero new surface,
1098
+ // just the one file consumers need to actually run "node bin/verify-audit.js" themselves.
1099
+ // Previously gated behind --with-utils for no functional reason: CLAUDE.md documents
1100
+ // "node bin/verify-audit.js" as a top-level command, not a --with-utils-only one, and a
1101
+ // fresh default install had the doc but not the script.
1102
+ 'bin/verify-audit.js',
1085
1103
  ];
1086
1104
  coreFiles.forEach(rel => {
1087
1105
  const srcFile = src(...rel.split('/'));
@@ -1330,17 +1348,6 @@ async function run(args) {
1330
1348
  bannerVersion = require('./utils/mindforge-version').resolveMindforgeVersion(process.cwd()).version;
1331
1349
  } catch { /* a banner must never be the reason health cannot run */ }
1332
1350
 
1333
- // Print header and brand manifest
1334
- // Print header and brand manifest
1335
- Theme.printHeader(bannerVersion);
1336
- Theme.printBrandManifest();
1337
- // Check for updates only
1338
- if (isCheck) {
1339
- const { checkAndUpdate } = require('./updater/self-update');
1340
- await checkAndUpdate({ apply: false });
1341
- return;
1342
- }
1343
-
1344
1351
  const runtimes = runtime === 'all'
1345
1352
  ? Object.keys(RUNTIMES)
1346
1353
  : runtime.split(',').map((r) => r.trim()).filter(Boolean);
@@ -1353,6 +1360,43 @@ async function run(args) {
1353
1360
  process.exit(1);
1354
1361
  }
1355
1362
 
1363
+ // Print header and brand manifest
1364
+ Theme.printHeader(bannerVersion);
1365
+ Theme.printBrandManifest();
1366
+ // `health` (routed here via --check — bin/mindforge-cli.js:33-37) advertises itself as "Verify
1367
+ // project health and installation integrity". Until now it only did the first half — this
1368
+ // npm-registry lookup — and returned before touching a single file on disk. Measured: in a fresh
1369
+ // --claude --local install with bin/governance/policy-engine.js deleted by hand, `mindforge health`
1370
+ // printed only "vX.Y.Z is the latest version" and exited 0 — the missing file was invisible to the
1371
+ // one command whose job is to say so.
1372
+ //
1373
+ // verifyInstall() already exists as the real per-runtime file check (used by install() at :1144,
1374
+ // see its own comment for why it was dead code before that). Reusing it here for a project's
1375
+ // EXISTING install — rather than inventing a second checker — means both callers agree on what
1376
+ // "installed" means.
1377
+ if (isCheck) {
1378
+ const { checkAndUpdate } = require('./updater/self-update');
1379
+ await checkAndUpdate({ apply: false });
1380
+
1381
+ let anyMissing = false;
1382
+ for (const rt of runtimes) {
1383
+ const cfg = RUNTIMES[rt];
1384
+ const rtBaseDir = resolveBaseDir(rt, scope);
1385
+ const rtCmdsDir = norm(path.join(rtBaseDir, cfg.commandsSubdir));
1386
+ const verification = verifyInstall(rtBaseDir, rtCmdsDir, rt, scope);
1387
+ if (verification.ok) {
1388
+ Theme.printResolved(c.bold(`${rt} (${scope}): install verified (${verification.checked} required files present)`));
1389
+ } else {
1390
+ anyMissing = true;
1391
+ console.error(`\n ❌ ${rt} (${scope}): install verification failed — ${verification.missing.length} of ` +
1392
+ `${verification.checked} required file(s) missing:`);
1393
+ verification.missing.forEach(f => console.error(` ${f}`));
1394
+ }
1395
+ }
1396
+ if (anyMissing) process.exit(1);
1397
+ return;
1398
+ }
1399
+
1356
1400
  for (const rt of runtimes) {
1357
1401
  if (isUninstall) await uninstall(rt, scope, options);
1358
1402
  else if (isUpdate) await install(rt, scope, { ...options, isUpdate: true });
@@ -41,11 +41,11 @@ const COMMANDS = {
41
41
  },
42
42
  'pr-review': {
43
43
  script: 'bin/review/cross-review-engine.js',
44
- description: 'Run standard PR review logic'
44
+ description: 'Alias for cross-review -- runs the same 2-model adversarial review engine'
45
45
  },
46
46
  'cross-review': {
47
47
  script: 'bin/review/cross-review-engine.js',
48
- description: 'Run advanced cross-model review'
48
+ description: 'Run the 2-model adversarial cross-review engine (architect + security auditor)'
49
49
  },
50
50
  'classify': {
51
51
  script: 'bin/change-classifier.js',
@@ -3,7 +3,13 @@
3
3
  const { verifyAuditChain } = require('./governance/audit-verifier');
4
4
  const auditPath = process.argv[2] || '.planning/AUDIT.jsonl';
5
5
  const result = verifyAuditChain(auditPath);
6
- if (result.valid) {
6
+ if (result.missing) {
7
+ // Not a break: a project that has never written an audit entry has no chain to break. Measured
8
+ // before this branch existed: an absent log printed "❌ audit chain BROKEN at entry 0: unreadable:
9
+ // ENOENT..." and exited 1 — indistinguishable from real tamper detection to a brand-new user.
10
+ process.stdout.write(`ℹ️ no audit log yet at ${auditPath} — one will be created on first audited action\n`);
11
+ process.exit(0);
12
+ } else if (result.valid) {
7
13
  process.stdout.write(`✅ audit chain valid: ${result.count} entries\n`);
8
14
  process.exit(0);
9
15
  } else {
@@ -0,0 +1,59 @@
1
+ # Changelog
2
+
3
+ ## [11.9.9] — 2026-09-23 — Release-readiness audit: 5 CRITICAL + 9 HIGH findings fixed
4
+
5
+ Patch release. An 8-agent audit workflow tested every MindForge surface (slash commands,
6
+ skills, personas, subagents, dynamic workflows, CLI/MCP, live install/verify/health) as a
7
+ release gate before shipping to real external users. Every finding was independently
8
+ re-verified against live code/commands before fixing, not trusted from the audit report
9
+ alone.
10
+
11
+ ### Fixed
12
+
13
+ **CRITICAL**
14
+
15
+ - Removed the `godmode` skill entirely — a real, complete LLM jailbreak toolkit that was
16
+ shipping unconditionally in the published npm tarball, undisclosed anywhere in the docs.
17
+ - Rewrote `help.md`/`status.md`/`health.md`/`security-scan.md`: they claimed
18
+ PQAS/biometric-bypass/lattice-crypto signature verification was "active by default,"
19
+ directly contradicted by `quantum-crypto.js`'s own comments (simulated, off by default).
20
+ - Fixed `--minimal`: a second, unguarded persona-copy path in `installer-core.js` shipped
21
+ the full 218-file persona set regardless of `--minimal`. Gated on `!minimal` rather than
22
+ removed outright — the copy is a real, tested per-harness delivery contract, confirmed
23
+ against `harness-adapter-compliance.js`'s `ADAPTER_RECORDS`.
24
+ - Fixed `security-scan.md`'s "Sovereign Integrity Check," which called a CLI flag on a
25
+ module with no CLI entrypoint (always exits 0) — a CRITICAL gate that could never fail.
26
+ Replaced with the one real check (policy-engine tamper detection).
27
+ - Disclosed `bin/engine/skill-loader.js` as dead code (4 lines, zero callers). The real
28
+ trigger-matching mechanism is an LLM-followed protocol spec
29
+ (`.mindforge/engine/skills/loader.md`), not deterministic code.
30
+
31
+ **HIGH**
32
+
33
+ - `install-skill.md`: documented the literal action token (`install`/`register`/`audit`)
34
+ `bin/skill-registry.js` deliberately requires with no default.
35
+ - `marketplace.md`: disclosed that zero published packages exist today; labeled sample
36
+ output as illustrative, not reproducible.
37
+ - `status.md`: fixed a nonexistent-file reference (`AutoRunner.js` -> the real
38
+ `bin/autonomous/auto-runner.js`).
39
+ - `pr-review`/`cross-review`: was an unqualified alias with descriptions implying different
40
+ behavior — now honestly documented as the same 2-model adversarial review engine.
41
+ - 8 dynamic-workflow scripts (`feature-planner`, `tdd-sprint`, `onboard-codebase`,
42
+ `incident-response`, `release-prep`, `perf-optimize`, `refactor-plan`,
43
+ `verification-loop`): added null-guards after every dependent `agent()` call, matching
44
+ the pattern ~27 other scripts already use.
45
+ - `MANIFEST.md`: registered 32 engine-tier skills that existed on disk but were never
46
+ listed in the registration source of truth (`systematic-debugging`,
47
+ `test-driven-development`, and 30 others).
48
+ - 3 MF-series personas (`mf-tool`, `mf-memory`, `mf-executor`): replaced fictional tool
49
+ grants (`Database`, `API`, `task_boundary`, `commit_memory`,
50
+ `multi_replace_file_content`) with the real Claude Code tool vocabulary.
51
+ - `swarm-templates.json`: reconciled 11 dangling persona references (2 fixed by name
52
+ correction, 9 removed with no real equivalent); updated `docs/PERSONAS.md`'s
53
+ `data-privacy-engineer` writeup to match the real `privacy-engineer.md` persona it now
54
+ points to.
55
+ - `health` command: wired to `verifyInstall()` so it actually checks installation
56
+ integrity instead of only an npm-version lookup.
57
+ - `AUDIT.jsonl`: distinguished "no audit log yet" from "chain broken" so a brand-new
58
+ install doesn't report a false BROKEN status; shipped `verify-audit.js` by default (its
59
+ only dependencies already shipped unconditionally).
@@ -36,7 +36,7 @@ the complete, verified list.
36
36
  | `/mindforge:note` | `note <text> [list|promote N]` | Zero-friction idea capture and todo promotion | v2.0.0 |
37
37
  | `/mindforge:quick` | `quick` | Run a small, single-task plan without a full phase | |
38
38
  | `/mindforge:status` | `status` | Show current phase, plan status, and next action | |
39
- | `/mindforge:health` | `health [--repair]` | Validate installation and repair drift | |
39
+ | `/mindforge:health` | `health` | Validate installation. `--repair` is documented but not wired into the CLI backing path — it's silently ignored, byte-identical to plain `health`. | |
40
40
  | `/mindforge:review` | `review [N]` | Run a structured review pass for a phase | |
41
41
  | `/mindforge:debug` | `debug [plan-id]` | Debug a failed plan with root-cause workflow | |
42
42
  | `/mindforge:add-backlog` | `add-backlog <desc>` | Park ideas in 999.x "parking lot" | v2.0.0 |
@@ -70,7 +70,7 @@ the complete, verified list.
70
70
  | `/mindforge:metrics` | `metrics [--phase N]` | Compute quality and throughput metrics | |
71
71
  | `/mindforge:profile-team` | `profile-team` | Generate team skill and ownership profile | |
72
72
  | `/mindforge:benchmark` | `benchmark [--skill X]` | Measure skill effectiveness | |
73
- | `/mindforge:tokens` | `tokens [--profile] [--summary]` | Token usage profiling and optimisation | |
73
+ | `/mindforge:tokens` | `tokens [--phase N] [--session ID] [--window short\|medium\|long] [--optimise]` | Token usage profiling and optimisation (`--profile`/`--summary` don't exist) | |
74
74
 
75
75
  ### Integrations & distribution
76
76