mindforge-cc 11.9.4 → 11.9.6

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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "11.9.4",
2
+ "version": "11.9.6",
3
3
  "environment": "development",
4
4
  "governance": {
5
5
  "drift_threshold": 0.75,
package/CHANGELOG.md CHANGED
@@ -1,6 +1,242 @@
1
1
  # Changelog
2
2
 
3
- ## [11.9.4] — 2026-08-22 — Delivery: the gates register, the tarball matches its tag, three packages attested
3
+ ## [11.9.6] — 2026-09-20 — The docs stop overselling what the code discloses about itself
4
+
5
+ Patch release. No new features — this is the release-readiness pass before pointing real
6
+ users at the project for the first time, and it found the same pattern one more time:
7
+ code that honestly labels its own simulated/dormant parts, sitting under docs that hadn't
8
+ caught up. Every fix below was hand-verified against the live source or a real command
9
+ run, not carried over from a prior audit's prose.
10
+
11
+ ### Fixed
12
+
13
+ **Two real, reproducible bugs**
14
+
15
+ - **`/mindforge:learn` crashed on every skill that scored high enough to register.**
16
+ `bin/skills-builder/learn-cli.js` called `skill-registrar.js`'s `register()` with two
17
+ positional string arguments (`skillPath`, `'project'`); `register()` destructures a
18
+ single options object, so every call threw inside it, silently swallowed by the CLI's
19
+ generic catch. A validly-generated `SKILL.md` never reached `MANIFEST.md`, and the CLI
20
+ reported a bare `❌ Error`. Fixed the call site to pass `{ skillName, skillPath, tier,
21
+ qualityScore, sourceType, source }`, matching `register()`'s real signature.
22
+
23
+ - **`bin/browser/browser-daemon.js` printed its own bearer token to stdout** (captured
24
+ verbatim into the persistent `.planning/browser-daemon.log` by `daemon-manager.js`),
25
+ and gated only `/evaluate` — `/navigate`, `/click`, `/type`, and `/screenshot` had no
26
+ auth check at all. The idle-timeout path also called `process.exit(0)` directly,
27
+ bypassing the token-file cleanup in `shutdown()`. Fixed all three: the startup log now
28
+ prints only the token's file path, the auth check runs once before dispatch and covers
29
+ every route but `/status`, and the idle path calls the real `shutdown()`.
30
+
31
+ **A test with a blind spot for the exact bug it exists to catch**
32
+
33
+ - `tests/sdk-exports.test.js` guards against any tracked file instructing
34
+ `require('@mindforge/sdk')` — the unpublished, wrong package name (`sdk/package.json`
35
+ publishes as `mindforge-sdk`). Its scan used `git ls-files -z '*.md' '*.ts'`, which
36
+ cannot match `.js` files — so it did not, and could not, catch the live occurrence in
37
+ `examples/sdk-integration/index.js`. Fixed both: the import, and the pathspec (now also
38
+ `*.js`/`*.mjs`/`*.cjs`, with `tests/` added to the same "records, not instructions"
39
+ allowlist as `changelogs/`, since this file's own `WRONG` string literal would otherwise
40
+ self-flag).
41
+
42
+ **A dashboard that rendered success while showing nothing**
43
+
44
+ - Three more panels in `bin/dashboard/frontend/app.js` read response fields their real
45
+ backing functions in `metrics-aggregator.js` have never produced — the same bug class
46
+ already fixed once for the avg-quality tile, left unaddressed here. `refreshMemory()`
47
+ read `data.graph`/`data.count`; the real shape is `{ entries, total }`. `refreshTeam()`
48
+ called `.map()` on the whole response object; the real shape is `{ active, conflicts }`
49
+ with `email`/`last_seen`/`current_task` fields, not `user`/`action`/`timestamp`.
50
+ `drawCharts()` read `state.costs`/`state.quality`, fields `/api/metrics` never returns;
51
+ the real per-session series is `state.sessions[].cost_usd` /
52
+ `state.sessions[].quality_score`. All three failed silently behind an empty `catch`, so
53
+ the panels looked idle rather than broken. Fixed to read the real shapes.
54
+
55
+ **Two shipped documents that stated the opposite of the code**
56
+
57
+ - `SECURITY.md` claimed `AUDIT.jsonl` "auto-archives beyond 5000 lines with gzip
58
+ compression" — that rotation mechanism was removed in an earlier release specifically
59
+ because truncating the file broke the hash chain (it orphans `previous_hash` pointers to
60
+ archived entries). The log grows unbounded by design; the doc now says so.
61
+ - `docs/security/SECURITY.md` had drifted into a second, independent copy of this policy
62
+ with a `5.x.x`/`4.x.x`/`< 4.0.0` support table — years behind the real `11.x` line the
63
+ root `/SECURITY.md` (the canonical file) documents. Replaced with a pointer to the root
64
+ file so this can't re-drift.
65
+
66
+ **A stale Homebrew formula**
67
+
68
+ - `Formula/mindforge.rb` was pinned to `11.9.3` (url, sha256, and the version-assertion
69
+ test) — two releases behind, so `brew install mindforge` installed an old build with
70
+ none of 11.9.4/11.9.5's fixes. Re-pinned to the real published `11.9.5` tarball with its
71
+ actual sha256 (fetched and hashed directly, not carried over). This is the same drift
72
+ class the project has hit twice before (11.9.2 shipped with this file and `Dockerfile`
73
+ four releases behind); `Formula/mindforge.rb` will lag one release again until
74
+ `node scripts/sync-version.js --fetch-sha` runs after this version publishes — expected,
75
+ not a regression.
76
+
77
+ ### Changed — a documentation honesty pass
78
+
79
+ The following describe MindForge's own PQAS (post-quantum crypto), ZTAI (Zero-Trust
80
+ Agentic Identity), and "Pillar"-numbered subsystems as live, unconditional security
81
+ guarantees. They are not: `bin/governance/quantum-crypto.js` and
82
+ `bin/governance/ztai-manager.js` self-label these SIMULATED and gate them off the live
83
+ trust path by default (`SECURITY_TIER_3_SIMULATED = true`), and `SwarmController` /
84
+ `PersonaFactory` / `WaveExecutor` are role names in markdown specs with no backing file —
85
+ a distinction this repo's own `.claude/CLAUDE.md` already draws, just not everywhere yet.
86
+ Rewrote each to match the same "measured, not asserted" tone already used in
87
+ `docs/faq.md` and `docs/troubleshooting.md` and the root README's *What is actually
88
+ enforced* section:
89
+
90
+ `docs/usp-features.md`, `CODEBASE-MAP.md`, `docs/architecture/README.md`,
91
+ `docs/CAPABILITIES-MANIFEST.md`, `docs/governance-guide.md`,
92
+ `docs/MIND-FORGE-REFERENCE-V6.md`, `docs/INTELLIGENCE-MESH.md`, `docs/PERSONAS.md`,
93
+ `docs/security/threat-model.md`, `docs/security/penetration-test-results.md` (the latter
94
+ two now banner-marked as scoped to an earlier, materially smaller predecessor system, not
95
+ a current assessment — no new pentest content was fabricated to replace them).
96
+
97
+ **Six reference docs (`docs/registry/*.md`) were stuck at v11.3.1** (six releases behind)
98
+ with command/skill/persona/subagent counts off by 2–9x against the live filesystem, and
99
+ listed 14+ slash commands with no backing file (`/mindforge:quantum-verify`,
100
+ `/mindforge:hindsight`, `/mindforge:harvest`, `/mindforge:self-heal`,
101
+ `/mindforge:swarm-execution`, `/mindforge:identity`, and others) — each individually
102
+ re-verified against `.claude/commands/mindforge/` before being removed or reworded.
103
+ Updated all six to the real, live-verified counts (221 commands, 232+123 skills, 217
104
+ personas, 164 subagents) and pointed each at `docs/commands-reference.md` as the
105
+ canonical source, so staleness here is lower-stakes going forward.
106
+
107
+ Also corrected: `docs/plugin-installation.md` and `docs/reference(s)/commands.md` (stale
108
+ hand-typed counts), `docs/References/{decimal-phase-calculation,git-integration,
109
+ git-planning-commit}.md` (wrong CLI path — real tool is `.agent/bin/mindforge-tools.cjs`,
110
+ not `.agent/mindforge/bin/...`), `docs/References/model-profile-resolution.md` (dead
111
+ `@`-include path), and a fabricated `"Claude 4.5 Opus"` model-name literal in two docs
112
+ (no such string exists anywhere in `bin/`) replaced with the real "highest-capability
113
+ tier configured" language. Deleted two orphaned scratch files that were never real
114
+ documentation: `docs/testing-current-version.md` (a pre-release scratch file hardcoding
115
+ a personal machine path) and `docs/commands-skills/DISCOVERED_SKILLS.md` (stale output
116
+ from an unrelated external tool referencing a directory that doesn't exist in this repo).
117
+
118
+ ### Changed — discoverability
119
+
120
+ - Root `README.md`: npm-version/downloads/license/Node-version badges, an "at a glance"
121
+ capability summary with real counts, and jump links to the existing sections.
122
+ - `package.json`: `description` rewritten from marketing language ("Sovereign Agentic
123
+ Intelligence Framework... Production-Hardened... (v11)") to concrete, keyword-bearing
124
+ text; added `ai-agents`, `llm-tools`, `developer-tools`, `mcp-server` to `keywords`.
125
+
126
+ ### Verified
127
+
128
+ - `npm test`: 137 passed, 0 failed, 3 env-dependent skips (`browser.test.js`,
129
+ `browser-daemon-auth-live.test.js`, `sre-integration.test.js` — all three require a
130
+ Chromium daemon/display or git worktree support this sandbox does not have). Verified
131
+ clean through the real pre-commit hook, not just a standalone run.
132
+ - `node scripts/sync-version.js`: 27 channels synced; `Formula/mindforge.rb` correctly
133
+ deferred (tarball doesn't exist yet); `plugins/mindforge/.claude-plugin/plugin.json` and
134
+ `plugins/mindforge/mcp/dist/index.js` rebuilt.
135
+
136
+ ## [11.9.5] — 2026-08-22 — The release path can no longer strand itself, and the SDK ships
137
+
138
+ Patch release, and the shortest one in a while. It exists because 11.9.4 published two
139
+ packages and then failed on the third, and that failure took the release page and the
140
+ `stable` dist-tag with it. Both causes are fixed here, and one of them is the reason this
141
+ release is worth cutting rather than waiting: **`mindforge-sdk` publishes for the first
142
+ time in seven versions, with provenance.**
143
+
144
+ ### Fixed
145
+
146
+ **A publish that cannot finish the release it started**
147
+
148
+ - **`sdk/package.json` had no `repository` field.** npm's provenance verification compares
149
+ that field against the attestation **server-side, at PUT** — so the publish was rejected
150
+ with `422 Unprocessable Entity … "repository.url" is ""` *after* `mindforge-cc` and
151
+ `mindforge-mcp-server` had already published irreversibly. `npm publish --dry-run` does
152
+ not perform that comparison, and nothing in this repository read `repository` at all: all
153
+ six preflight gates passed on a manifest the registry was guaranteed to reject. The field
154
+ is added, matching the spelling the other two packages use.
155
+
156
+ - **`scripts/ci/verify-provenance-metadata.js` makes that failure reachable before the
157
+ point of no return.** It runs in the release **preflight** job, ahead of every publish,
158
+ and it does not carry a list of packages: it discovers them from the workflow — every
159
+ step whose `run` contains both `npm publish` and `--provenance`, resolved through its
160
+ `working-directory` — so a fourth package is covered without editing the gate.
161
+ Discovering zero targets is a hard failure rather than a pass, on the principle that a
162
+ check which examined nothing must not report success.
163
+
164
+ Verified the only way that means anything: run against a git worktree at tag `v11.9.4` —
165
+ the exact tree that the registry rejected — it exits 1 and names `sdk/package.json` and
166
+ the missing field. It would have stopped that release before anything reached npm.
167
+
168
+ - **The release steps were ordered so that an optional package could strand the release.**
169
+ The SDK publish sat *before* `Create GitHub Release` and the `stable` dist-tag move.
170
+ A failing step fails the job, so both were skipped — which is precisely the harm the
171
+ placement comment claimed to prevent. The same mode had already fired on **v11.5.1** and
172
+ **v11.8.3** from the MCP publish; v11.9.4 was its third occurrence.
173
+
174
+ Reordered to: `Publish to npm` → `Create GitHub Release` → `stable` dist-tag →
175
+ `mcp-server` → `sdk`. The rule now encoded in `tests/action-pinning.test.js`: **no step
176
+ whose failure leaves no residue may be able to skip a step that finishes an irreversible
177
+ one.** That test previously asserted the opposite and had to be inverted in the same
178
+ commit — because `Run Full Test Suite` is the release job's first step, a reorder shipped
179
+ alone would have failed the release at its own gate.
180
+
181
+ The two finishers carry guards on their own inputs rather than a bare `!cancelled()`,
182
+ which would publish a release with a 0-byte body and an unmatched `.tgz` glob when
183
+ `Build Package` fails — the `bodyBytes=0` defect already seen on v11.9.0, .1 and .2. And
184
+ deliberately not `continue-on-error`: a tolerated failure makes the run conclude
185
+ **green**, which is the blindness that let the SDK sit seven versions behind, unattested,
186
+ with nothing noticing.
187
+
188
+ **Prose surfaces that shipped stale twice running**
189
+
190
+ - `bin/utils/readiness-gate.js` scored `RELEASENOTES.md` on `fileExists` while its
191
+ changelog sibling three lines away checked that the version appeared *in* the file. That
192
+ asymmetry is why the immutable 11.9.3 tarball's README said "Latest release v11.9.2" and
193
+ the immutable 11.9.4 tarball shipped with no 11.9.4 entry at all — while `README.md`
194
+ offers that file as the human-readable route to the BREAKING notes. Both are now checked,
195
+ anchored rather than by substring (`includes('11.9.4')` is also satisfied by
196
+ `## v11.9.40`).
197
+
198
+ **Policy change, stated plainly:** every release from here needs a `RELEASENOTES.md`
199
+ entry. Six published 11.x versions do not have one, so that file has been curated rather
200
+ than exhaustive; the gate only ever looks for the version being released, so those gaps
201
+ are unaffected.
202
+
203
+ - README's `## Latest release` is deliberately gated by a **test** rather than written by
204
+ `sync-version.js`. Auto-bumping the version token onto the previous release's paragraph
205
+ produces the right number attached to the wrong description — a better-disguised
206
+ falsehood than a visibly stale one.
207
+
208
+ - `docs/sdk-reference.md` offered `npx mindforge-cc@stable` as a way to get the SDK
209
+ "as part of the framework". Measured false: the published package declares exactly
210
+ `express` and `sql.js` and ships no `sdk/` directory. Removed.
211
+
212
+ ### Added
213
+
214
+ - **`mindforge-sdk` is published, with provenance** — its first release since 11.8.0 and
215
+ its first ever attested one. This is not cosmetic. Everything fixed in the SDK across
216
+ 11.8.1–11.9.4 reached nobody, including the one that matters most:
217
+ `WebSocketEventStream` scheduled a reconnect with `setTimeout(() => this.connect(), …)`
218
+ and nothing handled the returned promise, so a failed reconnect was an unhandled
219
+ rejection — fatal under Node's default mode, **terminating the caller's process**. Every
220
+ consumer on 11.8.0 still has that. (#191)
221
+
222
+ - `npm run provenance:check` — the gate above, runnable offline.
223
+
224
+ ### Notes for operators
225
+
226
+ - 11.9.4 is complete but was finished by hand: its GitHub Release was created at the
227
+ existing tag from the registry's own tarball (verified against `dist.integrity` and both
228
+ attestation bundles' subject digests), and the `v11.9.4` tag was deliberately **not**
229
+ moved, because two published packages' provenance attests to the commit it names.
230
+ - The `stable` dist-tag lagged at 11.9.3 between the two releases. Because the dist-tag
231
+ step now runs *ahead* of both additive publishes, this release moves it forward even if a
232
+ package publish fails again.
233
+ - Still outstanding, and requiring repository settings rather than code: there is no `v*`
234
+ **tag ruleset** restricting who may create the ref that triggers publishing, and
235
+ `NPM_TOKEN` remains a long-lived repository secret with no GitHub environment in front of
236
+ it. Create the environment *first* — adding `environment:` while none exists publishes
237
+ exactly as before while looking like a gate.
238
+
239
+ ## [11.9.4] — 2026-08-22 — Delivery: the gates register, the tarball matches its tag
4
240
 
5
241
  Patch release. 11.9.3 argued that an instrument must not report success while doing
6
242
  nothing. 11.9.4 is what an adversarial audit of the **published** 11.9.3 artifact found
@@ -71,13 +307,36 @@ not from reading the repository. That distinction is the whole content of this r
71
307
  exactly this reason, and the manifest's entire content is the sync record *for that
72
308
  already-excluded file*. (#225)
73
309
 
74
- - **`mindforge-sdk` is published again, with provenance.** It sat at **11.8.0** on npm
75
- while `sync-version.js` kept `sdk/package.json` at canonical — seven releases of
76
- disagreement (11.8.1 through 11.9.3, none published) that nothing detected, because
77
- `version:check` verifies the tracked file and not what the registry serves. It was also
78
- the only one of the three packages with **no attestation**. The release workflow now
79
- publishes it with `--provenance`, after the two proven publishes and before the GitHub
80
- Release, so the newest step cannot cost the others their artifacts.
310
+ - **`mindforge-sdk` was NOT published in this release. It remains at 11.8.0.** This entry
311
+ originally claimed it shipped with provenance; that claim was false and is corrected here
312
+ rather than quietly deleted, because a release arguing for measured claims does not get to
313
+ misstate a supply-chain property.
314
+
315
+ What happened: the SDK sat at **11.8.0** on npm while `sync-version.js` kept
316
+ `sdk/package.json` at canonical — seven releases of disagreement (11.8.1 through 11.9.3,
317
+ none published) that nothing detected, because `version:check` verifies the tracked file
318
+ and not what the registry serves. It was also the only one of the three packages with **no
319
+ attestation**. A publish step was added for it, and the registry rejected it:
320
+
321
+ ```
322
+ npm error 422 Unprocessable Entity - PUT https://registry.npmjs.org/mindforge-sdk
323
+ Error verifying sigstore provenance bundle: Failed to validate repository information:
324
+ package.json: "repository.url" is "", expected to match
325
+ "https://github.com/sairam0424/MindForge" from provenance
326
+ ```
327
+
328
+ `sdk/package.json` carried no `repository` field. The other two packages both do, which is
329
+ exactly why they published and it did not. That field is validated **registry-side at PUT**,
330
+ after two irreversible publishes have already succeeded — `npm publish --dry-run` does not
331
+ check it and neither did any gate here. Both are fixed for 11.9.5: the field, and an offline
332
+ preflight gate that refuses to reach a publish without it.
333
+
334
+ The step was also badly placed. It ran **before** `Create GitHub Release` and the `stable`
335
+ dist-tag move, so its failure skipped both — which is the precise harm the placement comment
336
+ claimed to prevent. `mindforge-cc@11.9.4` and `mindforge-mcp-server@11.9.4` published
337
+ correctly with provenance attesting commit 353e8d41; the release page and the `stable` tag
338
+ were completed by hand afterwards. The finishing steps now run ahead of the additive
339
+ publishes, so no optional package can strand a release again.
81
340
 
82
341
  - **The Homebrew formula carries the real 11.9.3 digest.** Verified against an independent
83
342
  measurement rather than the tool's own output, and explicitly confirmed not to be the
package/MINDFORGE.md CHANGED
@@ -1,9 +1,9 @@
1
- # MINDFORGE.md — Parameter Registry (v11.9.4)
1
+ # MINDFORGE.md — Parameter Registry (v11.9.6)
2
2
 
3
3
  ## 1. IDENTITY & VERSIONING
4
4
 
5
5
  [NAME] = MindForge
6
- [VERSION] = 11.9.4
6
+ [VERSION] = 11.9.6
7
7
  [STABLE] = true
8
8
  [MODE] = "Platform Sovereign"
9
9
  [REQUIRED_CORE_VERSION] = 11.9.1
package/README.md CHANGED
@@ -1,19 +1,39 @@
1
1
  # MindForge
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/mindforge-cc.svg)](https://www.npmjs.com/package/mindforge-cc)
4
+ [![npm downloads](https://img.shields.io/npm/dm/mindforge-cc.svg)](https://www.npmjs.com/package/mindforge-cc)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
+ [![Node >=18](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](package.json)
7
+
3
8
  **An agentic intelligence framework for Claude Code** — orchestrates multi-agent workflows with governance, memory, and autonomous execution. Production-hardened with true parallelism, streaming SDK, and zero-trust security. Install once, get structured AI-driven development with built-in quality gates.
4
9
 
10
+ **At a glance:** 221 slash commands · 355 skills (232 auto-triggered + 123 explicit) · 218 personas · 164 installable subagents · 35 pre-built multi-agent dynamic workflows · a tamper-evident audit hash-chain · cost-aware routing across Anthropic/OpenAI/Gemini/Bedrock/Ollama · a local-first knowledge graph on zero-native-dependency SQLite (sql.js) · a live Express+SSE dashboard. Ships as an npm package, a Claude Code plugin, and an MCP server.
11
+
12
+ **Jump to:** [Latest release](#latest-release) · [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)
13
+
5
14
  ---
6
15
 
7
16
  ## Latest release
8
17
 
9
- **v11.9.3** (2026-08-21) — Honesty: gates that can fail, commands that run, a release path that is
10
- checked. Twenty-one fixes sharing one defect — an instrument reporting success while doing nothing:
11
- a self-install that printed "skipping" and overwrote 149 tracked files, 11 of 27 routed CLI verbs
12
- dying on `MODULE_NOT_FOUND` in a real install, `--fetch-sha` hashing npm's 404 body into the Homebrew
13
- formula, no version channel covering any document a user receives, and a publish path no check ever
14
- touched. **Contains behaviour changes under a patch bump** — several fixed bugs whose correct
15
- behaviour differs from what shipped. See the BREAKING section in
16
- [CHANGELOG.md](./CHANGELOG.md), or [RELEASENOTES.md](./RELEASENOTES.md) for human-readable notes.
18
+ **v11.9.6** (2026-09-20) — The docs stop overselling what the code discloses about itself.
19
+ The release-readiness pass before pointing real, external users at the project: fixed a
20
+ crash in `/mindforge:learn` (wrong argument shape into `skill-registrar.js`), a token-leak
21
+ and inconsistent auth in the browser daemon, three dashboard panels that silently rendered
22
+ nothing, a stale Homebrew formula, and a long-running pattern of docs describing
23
+ PQAS/ZTAI/"Pillar"-numbered subsystems as live security guarantees when the code that
24
+ implements them already self-labels them simulated and off-by-default. No new features.
25
+ See [RELEASENOTES.md](./RELEASENOTES.md) for the human-readable summary, or
26
+ [CHANGELOG.md](./CHANGELOG.md) for the complete, file-by-file list.
27
+
28
+ The previous release, **v11.9.5**, fixed a release pipeline that could strand itself
29
+ mid-publish and shipped `mindforge-sdk` for the first time since 11.8.0, with provenance.
30
+ **v11.9.4**, before that, is where the hook gates started actually registering: 11.9.3
31
+ shipped the code and then declined to run it on essentially every project. Measured against
32
+ the published tarballs — 11.9.3: **11 hook scripts installed, 0 registered**; 11.9.4:
33
+ **8 registered, 3 deny-class verified blocking**. That **behaviour change under a patch
34
+ bump** still applies — the installer writes `.claude/settings.json` where it previously
35
+ declined, merging append-only and backing up first. See the BREAKING section in
36
+ [CHANGELOG.md](./CHANGELOG.md).
17
37
 
18
38
  ---
19
39
 
@@ -22,8 +42,9 @@ behaviour differs from what shipped. See the BREAKING section in
22
42
  Read this before the install instructions. MindForge ships a large corpus of agent
23
43
  instructions — commands, skills, personas, protocols — and those are advisory: they work by
24
44
  being in the model's context, and a model can decline them. The parts that would *block* an
25
- action are hooks. Through 11.9.2 **no channel registered them**; as of 11.9.3 both channels
26
- register and execute them **on Claude Code**, and nowhere else.
45
+ action are hooks. Through 11.9.2 **no channel registered them.** 11.9.3 added the registration code
46
+ but it declined to run on almost every project, so in practice nothing was enforced there either.
47
+ **As of 11.9.4** both channels register and execute them **on Claude Code**, and nowhere else.
27
48
 
28
49
  | Capability | Plugin channel | `npx` channel |
29
50
  |---|---|---|
@@ -145,7 +166,7 @@ Full verification walkthrough: [docs/quick-verify.md](docs/quick-verify.md).
145
166
  - **Audit events:** [docs/References/audit-events.md](docs/References/audit-events.md)
146
167
  - **Upgrade guide:** [docs/upgrade.md](docs/upgrade.md)
147
168
  - **Workflow atlas:** [docs/workflow-atlas.md](docs/workflow-atlas.md)
148
- - **Security:** [docs/security/SECURITY.md](docs/security/SECURITY.md) (MindForge never stores credentials in files)
169
+ - **Security:** [SECURITY.md](SECURITY.md) (credentials are read from env vars and never committed to the repository)
149
170
  - **Threat model:** [docs/security/threat-model.md](docs/security/threat-model.md)
150
171
  - **Architecture:** [docs/architecture/README.md](docs/architecture/README.md)
151
172
  - **Contributing:** [docs/contributing/CONTRIBUTING.md](docs/contributing/CONTRIBUTING.md)
package/RELEASENOTES.md CHANGED
@@ -1,5 +1,172 @@
1
1
  # Release Notes
2
2
 
3
+ ## v11.9.6 — 2026-09-20 — The docs stop overselling what the code discloses about itself
4
+
5
+ ### Why this release exists
6
+
7
+ This is the readiness pass before pointing real, external users at the project for the
8
+ first time. No new features — it fixes two reproducible bugs, three dashboard panels that
9
+ silently rendered nothing, one stale security policy and one stale Homebrew formula, and a
10
+ long-running pattern where docs described PQAS/ZTAI/"Pillar"-numbered subsystems as live
11
+ security guarantees when the code that implements them (`bin/governance/quantum-crypto.js`,
12
+ `bin/governance/ztai-manager.js`) already self-labels them simulated and off-by-default.
13
+
14
+ ### The user-visible part
15
+
16
+ **`/mindforge:learn` works again.** It crashed on every skill that scored well enough to
17
+ auto-register — `skill-registrar.js`'s `register()` was called with the wrong argument
18
+ shape, so the CLI printed a bare `❌ Error` and nothing ever reached `MANIFEST.md`.
19
+
20
+ **The browser daemon no longer leaks its own auth token, and now actually checks it.**
21
+ `/navigate`, `/click`, `/type`, and `/screenshot` had zero authentication before this —
22
+ only `/evaluate` did. The startup log used to print the raw token to stdout (captured into
23
+ a plaintext, non-gitignored log file); now it only prints where the token file lives.
24
+
25
+ **Three dashboard panels (Memory, Team, and the cost/quality charts) were reading response
26
+ fields the backing API has never produced**, so they rendered as permanently empty with no
27
+ error. They now read the real shapes.
28
+
29
+ **If you use Homebrew:** `brew install mindforge` was pinned two releases behind
30
+ (`11.9.3`) and is now current. It will lag one release again after this one ships — that's
31
+ expected; the formula can't point at a tarball that doesn't exist yet.
32
+
33
+ ### The documentation part
34
+
35
+ Six reference docs (`docs/registry/*.md`) were frozen at v11.3.1 with command/skill/
36
+ persona counts off by 2–9x and 14+ slash commands listed that don't exist. `usp-features.md`,
37
+ `CODEBASE-MAP.md`, `docs/architecture/README.md`, and several other pages described
38
+ post-quantum crypto and Zero-Trust Agentic Identity as unconditional, shipped security
39
+ rather than the explicitly-simulated, opt-in-gated features they are in the actual code.
40
+ All rewritten to match the same measured tone the README's *What is actually enforced*
41
+ section and `docs/faq.md`/`docs/troubleshooting.md` already used. Two orphaned scratch
42
+ files that were never real documentation were removed.
43
+
44
+ See [CHANGELOG.md](./CHANGELOG.md) for the complete, file-by-file list.
45
+
46
+ ## v11.9.5 — 2026-08-22 — The release path can no longer strand itself, and the SDK ships
47
+
48
+ ### Why this release exists
49
+
50
+ 11.9.4 published two packages and then failed on the third, and that failure took the release
51
+ page and the `stable` dist-tag with it:
52
+
53
+ ```
54
+ success Publish to npm <- mindforge-cc@11.9.4 (irreversible)
55
+ success Publish standalone MCP server to npm <- mindforge-mcp-server@11.9.4 (irreversible)
56
+ failure Publish the SDK to npm <- 422: "repository.url" is ""
57
+ skipped Create GitHub Release
58
+ skipped Point the stable dist-tag at this release
59
+ ```
60
+
61
+ Two causes, both fixed here.
62
+
63
+ **The metadata was only ever validated by the registry.** `sdk/package.json` had no
64
+ `repository` field, and npm compares that field against the attestation **server-side at PUT**.
65
+ `npm publish --dry-run` does not check it and nothing here read `repository` at all — so all six
66
+ preflight gates passed on a manifest guaranteed to be rejected. There is now an offline gate in
67
+ *preflight*, ahead of every publish, that discovers the provenance-publishing packages from the
68
+ workflow itself. Run against a worktree at tag `v11.9.4` — the tree the registry rejected — it
69
+ exits 1 and names the file. It would have stopped that release.
70
+
71
+ **The step order let an optional package strand the release.** The SDK publish sat before the
72
+ release page and the dist-tag move, so its failure skipped both. The same mode had already fired
73
+ on v11.5.1 and v11.8.3. Reordered so the steps that *finish* a release run ahead of any additive
74
+ package publish — which means this release moves `stable` forward even if a package fails again.
75
+
76
+ ### The user-visible part
77
+
78
+ **`mindforge-sdk` publishes for the first time since 11.8.0, and for the first time with
79
+ provenance.** Everything fixed in the SDK across 11.8.1–11.9.4 had reached nobody, including
80
+ this: `WebSocketEventStream` scheduled a reconnect and nothing handled the returned promise, so
81
+ a failed reconnect was an unhandled rejection — fatal under Node's default mode, **terminating
82
+ the caller's process**. Every consumer on 11.8.0 still has that.
83
+
84
+ ### Also fixed
85
+
86
+ - `bin/utils/readiness-gate.js` scored `RELEASENOTES.md` on existence while its changelog sibling
87
+ checked the version was *in* the file. That asymmetry is why both prose surfaces shipped stale
88
+ in 11.9.3 and again in 11.9.4. Both are now checked, anchored rather than by substring.
89
+ **Policy change:** every release from here needs an entry in this file.
90
+ - `docs/sdk-reference.md` claimed `npx mindforge-cc@stable` installs the SDK "as part of the
91
+ framework". Measured false — the published package declares exactly `express` and `sql.js` and
92
+ ships no `sdk/`. Removed.
93
+
94
+ ### Note on 11.9.4
95
+
96
+ It is complete, but was finished by hand: its GitHub Release was created at the existing tag from
97
+ the registry's own tarball, verified against `dist.integrity` and both attestation bundles'
98
+ subject digests. The `v11.9.4` tag was deliberately **not** moved, because two published
99
+ packages' provenance attests to the commit it names.
100
+
101
+ ## v11.9.4 — 2026-08-22 — Delivery: the gates register, the tarball matches its tag
102
+
103
+ ### The headline
104
+
105
+ **11.9.3 shipped the hook-registration code and then declined to run it.** The installer skipped
106
+ whenever any ancestor directory contained a `.claude`. On a machine that has ever run Claude Code
107
+ that means `~/.claude`, so essentially every install copied the enforcement in and wired none of it.
108
+
109
+ Measured against the published tarballs in a confined sandbox, with `~/.claude` as the only ancestor:
110
+
111
+ ```
112
+ 11.9.3: 11 hook scripts installed, 0 registered, no settings.json written
113
+ 11.9.4: 8 registered, preflight executed 7 of 8, 3 deny-class verified blocking
114
+ ```
115
+
116
+ The reason the installer printed was wrong three separate ways:
117
+
118
+ 1. `~/.claude/settings.json` is the **user tier**, applied in addition to the project tier. Its
119
+ existence says nothing about whether a project file is read — so the condition that suppressed
120
+ the gates was satisfied by an ordinary laptop.
121
+ 2. For a real project ancestor the claim is false too: that file is not read either. Proved with a
122
+ marker hook two levels up that never fired across a dozen tool calls. Skipping did not deliver
123
+ the gates elsewhere; it delivered them nowhere.
124
+ 3. The git-boundary guard was dead code, which is why the walk reached `$HOME` at all.
125
+
126
+ It now warns and registers anyway. A registration that turns out inert costs nothing; a skip is
127
+ guaranteed inert.
128
+
129
+ ### ⚠️ Behaviour change under a patch bump
130
+
131
+ The installer now writes `.claude/settings.json` on projects where it previously declined — for most
132
+ users, **0 registered hooks becomes 8**, three of which can block a tool call. It merges append-only
133
+ into any existing file, backs the previous one up under `.mindforge/backups/`, and records exactly
134
+ what it did in `.mindforge/hook-registration.json`.
135
+
136
+ A registered hook is only *live* if the harness has been **restarted** (hooks are snapshotted at
137
+ session start), the project is **trusted** in the harness, and `CLAUDE_PROJECT_DIR` is set with
138
+ `node` on the hook PATH. See *Hooks are installed but nothing is blocked* in
139
+ `docs/troubleshooting.md`.
140
+
141
+ ### Fixes
142
+
143
+ - The installer's only failure-path pointer led nowhere: it said "see `docs/troubleshooting.md`",
144
+ where the word *hook* appeared **0** times. That section now exists.
145
+ - The published tarball was not reproducible from its own tag. `.mindforge/memory/sync-manifest.json`
146
+ — gitignored, written at runtime — was **1 of 1979** shipped files not tracked at `v11.9.3`, so
147
+ provenance attested to a tree containing a file the repository does not contain.
148
+ - The README understated the product: it still said **no channel registers hooks** and that the
149
+ plugin dispatcher crashes on every fire. Measured: 14 of 14 plugin path tokens resolve and two
150
+ deny-class hooks return exit 2. A document that under-claims a security capability is the same
151
+ defect as one that over-claims it.
152
+ - Defects an 8-agent audit found in the *published* 11.9.3: an empty release page, a shipped CI
153
+ snippet telling users to `npx` a package we do not own, and a version-source gate that missed a
154
+ live defect twice.
155
+ - The Homebrew formula carries the real 11.9.3 digest, verified against an independent measurement.
156
+
157
+ ### Known issue in this release
158
+
159
+ **`mindforge-sdk` did not publish and remains at 11.8.0.** A publish step was added for it and the
160
+ registry rejected it with 422: `sdk/package.json` carried no `repository` field, which npm's
161
+ provenance verification validates **server-side at publish time** — `npm publish --dry-run` does not
162
+ check it, and no gate here did either.
163
+
164
+ Worse, the step was placed *before* the release-page and dist-tag steps, so its failure skipped
165
+ both. `mindforge-cc@11.9.4` and `mindforge-mcp-server@11.9.4` published correctly with provenance;
166
+ the release page and the `stable` tag were completed by hand afterwards. Both causes are fixed for
167
+ the next release: the missing field, an offline preflight gate that refuses to reach a publish
168
+ without it, and a reordering so the steps that finish a release run ahead of any optional package.
169
+
3
170
  ## v11.9.3 — 2026-08-21 — Honesty: gates that can fail, commands that run, a release path that is checked
4
171
 
5
172
  ### What's New
package/SECURITY.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Security Policy
2
2
 
3
- > **Current version:** 11.9.4 | **npm audit:** 0 vulnerabilities across root, sdk, mcp-server
3
+ > **Current version:** 11.9.6 | **npm audit:** 0 vulnerabilities across root, sdk, mcp-server
4
4
 
5
5
  ## Supported Versions
6
6
 
@@ -70,7 +70,7 @@ We follow responsible disclosure practices. We will credit reporters in the rele
70
70
  hash of the previous entry. Not a Merkle tree: there is no hash tree and no inclusion proof, so
71
71
  "Merkle" was the wrong word for it. What it detects, and does not, is measured below.
72
72
  - **AuditWriter with buffered writes** — Atomic append operations prevent partial writes from corrupting the log.
73
- - **Log rotation with archival** — AUDIT.jsonl auto-archives beyond 5000 lines with gzip compression, preventing unbounded disk growth.
73
+ - **Unbounded audit log, by design** — A prior AUDIT.jsonl rotation/archival mechanism (5000-line threshold, gzip) was removed: truncating the file broke the hash chain by orphaning `previous_hash` pointers to archived entries. AUDIT.jsonl now grows without bound; chain-aware compaction is a tracked future improvement, not yet shipped.
74
74
  - **npm provenance** — Published packages include SLSA Build Level 2 attestation via `--provenance`, proving the package was built from the stated source commit in CI.
75
75
 
76
76
  ### Input Validation & Injection Prevention