mindforge-cc 11.9.8 → 12.0.0

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 (67) hide show
  1. package/.agent/mindforge/agent.md +1 -1
  2. package/.agent/mindforge/health.md +7 -4
  3. package/.agent/mindforge/help.md +9 -5
  4. package/.agent/mindforge/install-skill.md +8 -6
  5. package/.agent/mindforge/marketplace.md +6 -0
  6. package/.agent/mindforge/security-scan.md +9 -4
  7. package/.agent/mindforge/skills-index.md +1 -1
  8. package/.agent/mindforge/status.md +5 -4
  9. package/.claude/commands/mindforge/agent.md +1 -1
  10. package/.claude/commands/mindforge/health.md +7 -4
  11. package/.claude/commands/mindforge/help.md +9 -5
  12. package/.claude/commands/mindforge/install-skill.md +8 -6
  13. package/.claude/commands/mindforge/marketplace.md +6 -0
  14. package/.claude/commands/mindforge/security-scan.md +9 -4
  15. package/.claude/commands/mindforge/skills-index.md +1 -1
  16. package/.claude/commands/mindforge/status.md +5 -4
  17. package/.mindforge/config.json +1 -1
  18. package/.mindforge/dynamic-workflows/scripts/feature-planner.js +12 -0
  19. package/.mindforge/dynamic-workflows/scripts/incident-response.js +6 -0
  20. package/.mindforge/dynamic-workflows/scripts/onboard-codebase.js +9 -0
  21. package/.mindforge/dynamic-workflows/scripts/perf-optimize.js +6 -0
  22. package/.mindforge/dynamic-workflows/scripts/refactor-plan.js +3 -0
  23. package/.mindforge/dynamic-workflows/scripts/release-prep.js +9 -0
  24. package/.mindforge/dynamic-workflows/scripts/tdd-sprint.js +12 -0
  25. package/.mindforge/dynamic-workflows/scripts/verification-loop.js +9 -0
  26. package/.mindforge/org/skills/MANIFEST.md +32 -0
  27. package/.mindforge/personas/mf-executor.md +1 -1
  28. package/.mindforge/personas/mf-memory.md +1 -1
  29. package/.mindforge/personas/mf-tool.md +1 -1
  30. package/.mindforge/personas/swarm-templates.json +10 -20
  31. package/CHANGELOG.md +146 -0
  32. package/MINDFORGE-AGENTIC-SECURITY.md +189 -0
  33. package/MINDFORGE.md +2 -2
  34. package/README.md +136 -85
  35. package/RELEASENOTES.md +64 -0
  36. package/SECURITY.md +1 -1
  37. package/bin/governance/audit-verifier.js +12 -3
  38. package/bin/governance/config-manager.js +4 -1
  39. package/bin/installer/harness-adapter-compliance.js +1 -1
  40. package/bin/installer-core.js +74 -21
  41. package/bin/mindforge-cli.js +2 -2
  42. package/bin/security/trust-boundaries.js +12 -0
  43. package/bin/utils/readiness-gate.js +1 -1
  44. package/bin/verify-audit.js +7 -1
  45. package/bin/wizard/theme.js +3 -4
  46. package/changelogs/v11.9.9.md +59 -0
  47. package/changelogs/v12.0.0.md +89 -0
  48. package/docs/References/commands.md +2 -2
  49. package/docs/References/config-reference.md +20 -35
  50. package/docs/References/sdk-api.md +10 -4
  51. package/docs/References/skills-api.md +9 -7
  52. package/docs/commands-reference.md +2 -2
  53. package/docs/faq.md +2 -2
  54. package/docs/getting-started.md +9 -3
  55. package/docs/sdk-reference.md +3 -3
  56. package/docs/security/SECURITY.md +14 -0
  57. package/docs/security/ZTAI-OVERVIEW.md +53 -0
  58. package/docs/security/penetration-test-results.md +36 -0
  59. package/docs/security/threat-model.md +148 -0
  60. package/docs/troubleshooting.md +14 -10
  61. package/docs/user-guide.md +12 -8
  62. package/docs/usp-features.md +60 -0
  63. package/package.json +5 -1
  64. package/subagents/README.md +38 -0
  65. package/.agent/skills/godmode/SKILL.md +0 -396
  66. package/.agent/skills/godmode/references/jailbreak-templates.md +0 -128
  67. 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 53 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,37 @@ 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.
242
+ **v12.0.0** (2026-09-24) — First release aimed at real external users. The major-version
243
+ bump marks that shift, not a breaking change — there isn't one; every item here is a fix.
244
+ A second, independent 8-agent audit checked whether v11.9.9 actually cleared that bar
245
+ (security/STRIDE, staff-engineer code review, deps+license, a live production dry-run
246
+ across all 6 supported runtimes, docs accuracy, re-verification of the prior release's
247
+ deferred backlog, test-coverage gaps, and a full trace of the release pipeline) and found
248
+ 1 CRITICAL + 4 HIGH issues still standing in the way. The CRITICAL: `--global` installs
249
+ printed a fabricated banner claiming 216 personas/122 skills were "active" while writing
250
+ none of them — now prints an honest description of what a global install actually writes.
251
+ The four HIGH: an unhedged "active" claim for a confirmed no-op feature plus unearned
252
+ "Autonomous Enterprise/Sovereign" marketing language in the install banner, both reworded;
253
+ a dynamic-workflow script's own null-guard commit missed one crash-causing edge case, now
254
+ covered; and two real test-coverage gaps (nothing guarded the removed `godmode` skill or
255
+ the `--minimal` persona fix against regressing) are closed. Eight more, lower severity: a
256
+ security dropper-chain pattern gap, a latent prototype-pollution path, a CodeQL-flagged
257
+ regex-escape bug, a non-LTS Node base image that slipped in via Dependabot, a docs table
258
+ citing 16 nonexistent personas, a release-pipeline step that's failed cosmetically on the
259
+ last 4 releases, a cross-runtime hook-registration parity gap, and CI/doc hygiene fixes.
184
260
  See [RELEASENOTES.md](./RELEASENOTES.md) or [CHANGELOG.md](./CHANGELOG.md).
185
261
 
186
- The previous release, **v11.9.7**, fixed a version self-contradiction and a false "Enabled"
262
+ <details>
263
+ <summary><strong>Earlier releases</strong></summary>
264
+
265
+ **v11.9.9** ran the first release-readiness audit as a gate before pointing real external
266
+ users at the project for the first time — 5 CRITICAL findings (including a shipped LLM
267
+ jailbreak skill and a `--minimal` flag that shipped the full persona set anyway) and 9 HIGH
268
+ findings, all fixed. **v11.9.8** fixed two real bugs found by a literal, end-to-end README
269
+ audit (113 claims checked, 98 held up): `--runtime claude,cursor` crashed the installer
270
+ outright, and `--minimal` claimed "no persona library" but shipped all 216 anyway. The
271
+ other twelve findings were documentation catching up to what the code actually does. The
272
+ release before that, **v11.9.7**, fixed a version self-contradiction and a false "Enabled"
187
273
  claim in the install banner, a dead `docs.mindforge.cc` link, and a persona-count doc
188
274
  regression (218 → back to the correct 216) introduced by v11.9.6's own honesty pass.
189
275
  **v11.9.6** was the release-readiness pass before pointing real, external users at the
@@ -200,58 +286,7 @@ change under a patch bump** still applies — the installer writes `.claude/sett
200
286
  where it previously declined, merging append-only and backing up first. See the BREAKING
201
287
  section in [CHANGELOG.md](./CHANGELOG.md).
202
288
 
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`).
289
+ </details>
255
290
 
256
291
  ---
257
292
 
@@ -271,14 +306,22 @@ instructions — review what you install. The audit chain is verifiable today
271
306
  |
272
307
  v
273
308
  Verification (build / typecheck / lint / test / security / diff)
274
- |
275
- v
276
- Handoff (.planning/HANDOFF.json + AUDIT.jsonl)
309
+ pass | fail
310
+ +--------------+--------------+
311
+ v v
312
+ Handoff (.planning/HANDOFF.json Temporal rollback -> sets status
313
+ + AUDIT.jsonl) "awaiting_regeneration"
277
314
  ```
278
315
 
316
+ The fail path is real but partial: `bin/hindsight-injector.js` rolls back `.planning/` state and sets
317
+ `auto-state.json.status = "awaiting_regeneration"` — verified, and hash-chained into the audit log
318
+ like everything else. What is **not** currently true: nothing in `bin/` reads that status back out
319
+ to automatically re-trigger the wave (`awaiting_regeneration` has one writer, zero readers today) —
320
+ regeneration after a rollback is a manual step, not a closed loop.
321
+
279
322
  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/`),
323
+ commands and hooks), **Engine specs** (`.mindforge/` — 232 of the 354 skills plus 216 personas and
324
+ `config.json` runtime knobs; the other 122 skills are extended-tier, under `.agent/skills/`),
282
325
  **Execution** (`bin/`, ~32K raw / ~25K stripped-of-comments LOC — the wave executor, governance,
283
326
  memory, and dashboard code that actually runs), and **Persistence** (`.planning/` — `STATE.md`,
284
327
  the audit chain, resumable `HANDOFF.json`). Edit behavior in layer 2 where possible; layer 3 is
@@ -308,7 +351,7 @@ Six categories, read in this order the first time:
308
351
  | Security | [SECURITY.md](SECURITY.md) | Reporting a vulnerability; credentials are read from env vars and never committed |
309
352
  | 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
353
  | Contributing | [Architecture](docs/architecture/README.md) | Understanding the codebase before sending a PR |
311
- | Contributing | [Contributing guide](docs/contributing/CONTRIBUTING.md) | Sending a PR |
354
+ | Contributing | [Contributing guide](CONTRIBUTING.md) | Sending a PR |
312
355
  | Contributing | [CI quickstart](docs/ci-quickstart.md) | Understanding what CI checks before you push |
313
356
  | Contributing | [Release checklist](docs/release-checklist-guide.md) | Cutting a release |
314
357
  | 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 +429,14 @@ published under it — this is the mechanism, not a catalog.
386
429
  (`--profile` doesn't exist; real flags are `--phase N`, `--session ID`, `--window short|medium|long`,
387
430
  and `--optimise`.) See `.mindforge/production/token-optimiser.md`.
388
431
 
432
+ Installing and running `/mindforge:plan-phase`/`/mindforge:execute-phase` costs real model calls
433
+ once a subagent starts working — install itself does not (`npx mindforge-cc@latest` never calls
434
+ a model). Spend is capped by `[COST_HARD_LIMIT_USD]` in `MINDFORGE.md` (default `25.00`),
435
+ enforced in code by `bin/models/cost-tracker.js`'s `preflight()` before each call goes out — not a
436
+ policy statement. The per-project token/cost *reports* from `/mindforge:tokens` and
437
+ `.mindforge/production/token-optimiser.md` are heuristic estimates (`file size / 4`), explicitly
438
+ logged with `measured: false`.
439
+
389
440
  ---
390
441
 
391
442
  ## License
package/RELEASENOTES.md CHANGED
@@ -1,5 +1,69 @@
1
1
  # Release Notes
2
2
 
3
+ ## v12.0.0 — 2026-09-24 — First release aimed at real external users
4
+
5
+ ### Why this release exists
6
+
7
+ This is the first MindForge release deliberately cut for real external users, not just
8
+ internal iteration — the major-version bump marks that shift, not a breaking change (there
9
+ isn't one; every item below is a fix). Ahead of it, a second independent 8-agent audit
10
+ checked whether v11.9.9 actually cleared that bar: security/STRIDE review, a fresh
11
+ staff-engineer code review, a dependency and license audit, a live production dry-run
12
+ across all 6 supported runtimes, a docs-accuracy pass, re-verification of the prior
13
+ release's deferred backlog, a test-coverage-gap sweep, and a full trace of the release
14
+ pipeline itself. It found 1 CRITICAL and 4 HIGH issue still standing in the way, plus 8
15
+ MEDIUM/LOW issues worth closing before this exact cutover — all adversarially re-verified
16
+ (10/10 confirmed, 0 refuted) before being fixed.
17
+
18
+ ### The user-visible part
19
+
20
+ **The one CRITICAL:** `--global` installs printed a fabricated success banner claiming 216
21
+ personas and 122 skills were "active," when a global install writes none of them by
22
+ design — now prints an honest description of what it actually writes.
23
+
24
+ **Four HIGH fixes:** the install banner also claimed a "Proactive Semantic Intent
25
+ Harvesting" feature was "active" when it's a confirmed no-op, and carried marketing
26
+ language ("Autonomous Enterprise Agentic Ecosystem," "Sovereign Intelligence") this project
27
+ doesn't otherwise stand behind — both reworded to match the honesty bar the rest of the
28
+ docs already hold to. A dynamic-workflow script could still crash on an edge case its own
29
+ null-guard commit missed. Two real test-coverage gaps (nothing guarded the removed
30
+ `godmode` skill or the `--minimal` persona fix against regressing) are closed.
31
+
32
+ **Eight more, lower severity:** a security dropper-chain pattern gap, a latent
33
+ prototype-pollution path, a CodeQL-flagged incomplete regex escape, a non-LTS Node base
34
+ image that slipped in via an unconstrained Dependabot config, a docs table citing 16
35
+ personas that don't exist, a release-pipeline step that's failed cosmetically on the last 4
36
+ releases, a cross-runtime hook-registration parity gap, and a handful of GitHub Actions and
37
+ documentation hygiene fixes. Full list in [CHANGELOG.md](./CHANGELOG.md).
38
+
39
+ ## v11.9.9 — 2026-09-23 — Release-readiness audit: 5 CRITICAL + 9 HIGH findings fixed
40
+
41
+ ### Why this release exists
42
+
43
+ An 8-agent audit workflow tested every MindForge surface — slash commands, skills,
44
+ personas, subagents, dynamic workflows, CLI/MCP, and a live install/verify/health cycle —
45
+ as a release gate before shipping to real external users. Every finding was independently
46
+ re-verified against live code and commands before being fixed, not trusted from the audit
47
+ report alone.
48
+
49
+ ### The user-visible part
50
+
51
+ **Five CRITICAL findings, all ship-blocking:** a real, complete LLM jailbreak toolkit
52
+ (`godmode`) that was shipping unconditionally in the published package is gone; `help.md`,
53
+ `status.md`, `health.md`, and `security-scan.md` stop claiming PQAS/biometric/lattice-crypto
54
+ verification is "active by default" when the code itself says it's simulated and off;
55
+ `--minimal` now actually skips the persona set instead of shipping all 218 files anyway; a
56
+ "Sovereign Integrity Check" that called a CLI flag on a script with no CLI entrypoint (and
57
+ so could never fail) is replaced with a real check; and a dead 4-line stub standing in for
58
+ "232 auto-triggered skills" is now disclosed as what it is.
59
+
60
+ **Nine HIGH-severity findings:** corrected CLI invocation docs, disclosed the marketplace
61
+ has zero published packages today, added crash-guards to 8 dynamic workflows, registered 32
62
+ skills that existed on disk but were never in the manifest, fixed three personas granting
63
+ tools that don't exist, reconciled 11 dangling swarm-template references, wired the `health`
64
+ command to an actual integrity check, and stopped a brand-new install's audit log from
65
+ reporting a false "BROKEN" status.
66
+
3
67
  ## v11.9.8 — 2026-09-21 — What the README claims, verified line by line
4
68
 
5
69
  ### 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:** 12.0.0 | **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++) {
@@ -54,10 +54,13 @@ class ConfigManager {
54
54
 
55
55
  for (let i = 0; i < keys.length - 1; i++) {
56
56
  const k = keys[i];
57
+ if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;
57
58
  if (!target[k]) target[k] = {};
58
59
  target = target[k];
59
60
  }
60
- target[keys[keys.length - 1]] = value;
61
+ const lastKey = keys[keys.length - 1];
62
+ if (lastKey === '__proto__' || lastKey === 'constructor' || lastKey === 'prototype') return value;
63
+ target[lastKey] = value;
61
64
 
62
65
  this._save();
63
66
  return value;
@@ -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('/'));
@@ -1105,7 +1123,8 @@ async function install(runtime, scope, options = {}) {
1105
1123
  Theme.printStatus(c.dim(' - Post-Quantum Agentic Security (PQAS): available in simulated/experimental '
1106
1124
  + 'mode (inactive by default — set experimental.pqc_demo=true to enable the simulated demo)'), 'info');
1107
1125
  }
1108
- Theme.printStatus(c.dim(' - Proactive Semantic Intent Harvesting active'), 'info');
1126
+ Theme.printStatus(c.dim(' - Proactive Semantic Intent Harvesting: available in simulated/experimental '
1127
+ + 'mode (the underlying scan/claim logic is not yet wired to run automatically)'), 'info');
1109
1128
 
1110
1129
  // bin/ utilities (remaining non-engine scripts)
1111
1130
  if (withUtils) {
@@ -1330,17 +1349,6 @@ async function run(args) {
1330
1349
  bannerVersion = require('./utils/mindforge-version').resolveMindforgeVersion(process.cwd()).version;
1331
1350
  } catch { /* a banner must never be the reason health cannot run */ }
1332
1351
 
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
1352
  const runtimes = runtime === 'all'
1345
1353
  ? Object.keys(RUNTIMES)
1346
1354
  : runtime.split(',').map((r) => r.trim()).filter(Boolean);
@@ -1353,6 +1361,43 @@ async function run(args) {
1353
1361
  process.exit(1);
1354
1362
  }
1355
1363
 
1364
+ // Print header and brand manifest
1365
+ Theme.printHeader(bannerVersion);
1366
+ Theme.printBrandManifest();
1367
+ // `health` (routed here via --check — bin/mindforge-cli.js:33-37) advertises itself as "Verify
1368
+ // project health and installation integrity". Until now it only did the first half — this
1369
+ // npm-registry lookup — and returned before touching a single file on disk. Measured: in a fresh
1370
+ // --claude --local install with bin/governance/policy-engine.js deleted by hand, `mindforge health`
1371
+ // printed only "vX.Y.Z is the latest version" and exited 0 — the missing file was invisible to the
1372
+ // one command whose job is to say so.
1373
+ //
1374
+ // verifyInstall() already exists as the real per-runtime file check (used by install() at :1144,
1375
+ // see its own comment for why it was dead code before that). Reusing it here for a project's
1376
+ // EXISTING install — rather than inventing a second checker — means both callers agree on what
1377
+ // "installed" means.
1378
+ if (isCheck) {
1379
+ const { checkAndUpdate } = require('./updater/self-update');
1380
+ await checkAndUpdate({ apply: false });
1381
+
1382
+ let anyMissing = false;
1383
+ for (const rt of runtimes) {
1384
+ const cfg = RUNTIMES[rt];
1385
+ const rtBaseDir = resolveBaseDir(rt, scope);
1386
+ const rtCmdsDir = norm(path.join(rtBaseDir, cfg.commandsSubdir));
1387
+ const verification = verifyInstall(rtBaseDir, rtCmdsDir, rt, scope);
1388
+ if (verification.ok) {
1389
+ Theme.printResolved(c.bold(`${rt} (${scope}): install verified (${verification.checked} required files present)`));
1390
+ } else {
1391
+ anyMissing = true;
1392
+ console.error(`\n ❌ ${rt} (${scope}): install verification failed — ${verification.missing.length} of ` +
1393
+ `${verification.checked} required file(s) missing:`);
1394
+ verification.missing.forEach(f => console.error(` ${f}`));
1395
+ }
1396
+ }
1397
+ if (anyMissing) process.exit(1);
1398
+ return;
1399
+ }
1400
+
1356
1401
  for (const rt of runtimes) {
1357
1402
  if (isUninstall) await uninstall(rt, scope, options);
1358
1403
  else if (isUpdate) await install(rt, scope, { ...options, isUpdate: true });
@@ -1360,17 +1405,25 @@ async function run(args) {
1360
1405
  }
1361
1406
 
1362
1407
  if (!isUninstall) {
1363
- // collectManifestStats() counts the SOURCE tree, not what was written. For a normal install those
1364
- // coincide, so the panel is accidentally accurate. For a self-install nothing is copied, and the
1365
- // panel announced "ACTIONS 221 — Total autonomous commands deployed" and
1366
- // "Skill Packs (123 verified)" for a run that deployed and verified nothing: a summary of the
1367
- // repository presenting itself as an installation report. Gating it is the honest minimum. Making
1408
+ // collectManifestStats() counts the SOURCE tree, not what was written. For a normal LOCAL install
1409
+ // those coincide, so the panel is accidentally accurate. For a self-install nothing is copied, and
1410
+ // for a GLOBAL install Section 2.1 (skills/hooks/personas/docs/memory/plugins) and Section 3
1411
+ // (.mindforge/ engine, .planning/, bin/) never ran — both are gated `scope === 'local'` above — so
1412
+ // the panel announced "Personas (216 active)" / "Skill Packs (122 verified)" / a full PAYLOAD
1413
+ // MANIFEST for a run that deployed and verified none of them: a summary of the repository
1414
+ // presenting itself as an installation report. Gating on scope too is the honest minimum. Making
1368
1415
  // the panel report MEASURED counts on every path is a larger change and is deliberately not
1369
1416
  // attempted here — it would need the install to return what it wrote.
1370
- if (isSelfInstall()) {
1417
+ if (isSelfInstall() && scope === 'local') {
1371
1418
  Theme.printResolved(c.bold('Self-install complete — no framework files were written'));
1372
1419
  Theme.printStatus(c.dim('This repository IS the framework: its committed .claude/ and .agent/ '
1373
1420
  + 'trees are the source, so there was nothing to deploy.'), 'info');
1421
+ } else if (scope !== 'local') {
1422
+ Theme.printResolved(c.bold('Global install complete'));
1423
+ Theme.printStatus(c.dim('A --global install writes only the entry file, slash commands, and '
1424
+ + 'native subagents into your home directory. Skills, personas, hooks, and the .mindforge/ '
1425
+ + 'framework engine are NOT part of a global install by design — run a --local install in a '
1426
+ + 'project directory to get those.'), 'info');
1374
1427
  } else {
1375
1428
  const stats = collectManifestStats();
1376
1429
  Theme.printSuccessV2(runtime, scope, stats);
@@ -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',