mindforge-cc 11.9.3 → 11.9.5

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.
@@ -0,0 +1,178 @@
1
+ # Changelog
2
+
3
+ ## [11.9.4] — 2026-08-22 — Delivery: the gates register, the tarball matches its tag
4
+
5
+ Patch release. 11.9.3 argued that an instrument must not report success while doing
6
+ nothing. 11.9.4 is what an adversarial audit of the **published** 11.9.3 artifact found
7
+ when that standard was applied to the delivery itself: **enforcement that installed and
8
+ then declined to register, a tarball that could not be reproduced from its own tag, and a
9
+ README that understated what shipped.**
10
+
11
+ Every finding here came from measuring the published package in a confined environment —
12
+ not from reading the repository. That distinction is the whole content of this release.
13
+
14
+ ### BREAKING
15
+
16
+ - **The installer now registers hooks on projects where it previously declined.** If you
17
+ install into a project that has an ancestor directory containing a `.claude`, MindForge
18
+ now writes `.claude/settings.json` (merging append-only into any existing file) instead
19
+ of skipping. On a machine that has ever run Claude Code, `~/.claude` makes that
20
+ essentially every project — so most installs go from **0 registered hooks to 8**. Three
21
+ of them can block a tool call. If you were relying on the installer being inert here,
22
+ it no longer is; `.mindforge/hook-registration.json` records exactly what was written,
23
+ and the previous settings file is backed up under `.mindforge/backups/`. (#224)
24
+
25
+ ### Fixed
26
+
27
+ **Hook registration — the gates shipped installed but inert**
28
+
29
+ - **`register()` skipped whenever any ancestor held a `.claude` directory.** Measured
30
+ against the published 11.9.3 tarball, confined HOME, `~/.claude` as the only ancestor:
31
+ **11 hook scripts installed, 0 registered, no settings file written.** The gates that
32
+ the shipped `CLAUDE.md` calls MANDATORY were copied in and left unreachable. Same
33
+ sandbox on 11.9.4: **8 registered, installer preflight executed 7 of 8 and verified all
34
+ 3 deny-class hooks returning exit 2** before keeping the file. (#224)
35
+
36
+ The reason it printed — *"the harness will read `<ancestor>/.claude/settings.json`, not
37
+ this directory"* — was wrong three separate ways:
38
+
39
+ 1. `~/.claude/settings.json` is the **user tier**, applied in addition to the project
40
+ tier. Its existence carries no information about whether a project file is read, so
41
+ the condition that suppressed the gates was satisfied by an ordinary laptop.
42
+ 2. For a genuine project ancestor the claim is false too — that file is not read
43
+ either. Verified with a natural experiment: an ancestor two levels up carried a
44
+ `PreToolUse` Bash hook appending a marker to a log; across a dozen tool calls with
45
+ the inner directory as the project root, the log was never created. Skipping did not
46
+ deliver the gates elsewhere. It delivered them nowhere.
47
+ 3. The git-boundary guard was **dead code**. `stop` was the git toplevel while the walk
48
+ began at `dirname(projectRoot)`, so when toplevel equalled projectRoot the stop
49
+ condition could never be true and the walk ran to the filesystem root every time.
50
+ The boundary meant to keep the check local is why it reached `$HOME`.
51
+
52
+ It now warns and registers anyway: a registration that turns out inert costs nothing and
53
+ becomes live when the harness is launched there, whereas a skip is guaranteed inert. The
54
+ check additionally requires a real `settings.json` **file** — the old one accepted any
55
+ directory named `.claude`, and the one it hit in practice held only markdown. (#224)
56
+
57
+ - **The installer's only failure-path pointer led nowhere.** It told anyone whose hooks
58
+ were not registered to "see `docs/troubleshooting.md`", where the word *hook* appeared
59
+ **0** times. That file now carries the section the message names, separating "not
60
+ registered" from "registered but not live", and including a copy-paste payload that
61
+ drives a hook directly so a broken hook can be told apart from an unwired one. (#224)
62
+
63
+ **Release artifacts**
64
+
65
+ - **The published tarball could not be reproduced from its tag.**
66
+ `.mindforge/memory/sync-manifest.json` — gitignored, written at runtime by
67
+ `bin/memory/semantic-hub.js` — was **1 of 1979** shipped files not tracked at
68
+ `v11.9.3`, so provenance attested to a tree containing a file the repository does not
69
+ contain. With a `files[]` allowlist, a **directory** entry ships its contents regardless
70
+ of `.gitignore`; `files[]` already carried a negation for `pattern-library.jsonl` for
71
+ exactly this reason, and the manifest's entire content is the sync record *for that
72
+ already-excluded file*. (#225)
73
+
74
+ - **`mindforge-sdk` was NOT published in this release. It remains at 11.8.0.** This entry
75
+ originally claimed it shipped with provenance; that claim was false and is corrected here
76
+ rather than quietly deleted, because a release arguing for measured claims does not get to
77
+ misstate a supply-chain property.
78
+
79
+ What happened: the SDK sat at **11.8.0** on npm while `sync-version.js` kept
80
+ `sdk/package.json` at canonical — seven releases of disagreement (11.8.1 through 11.9.3,
81
+ none published) that nothing detected, because `version:check` verifies the tracked file
82
+ and not what the registry serves. It was also the only one of the three packages with **no
83
+ attestation**. A publish step was added for it, and the registry rejected it:
84
+
85
+ ```
86
+ npm error 422 Unprocessable Entity - PUT https://registry.npmjs.org/mindforge-sdk
87
+ Error verifying sigstore provenance bundle: Failed to validate repository information:
88
+ package.json: "repository.url" is "", expected to match
89
+ "https://github.com/sairam0424/MindForge" from provenance
90
+ ```
91
+
92
+ `sdk/package.json` carried no `repository` field. The other two packages both do, which is
93
+ exactly why they published and it did not. That field is validated **registry-side at PUT**,
94
+ after two irreversible publishes have already succeeded — `npm publish --dry-run` does not
95
+ check it and neither did any gate here. Both are fixed for 11.9.5: the field, and an offline
96
+ preflight gate that refuses to reach a publish without it.
97
+
98
+ The step was also badly placed. It ran **before** `Create GitHub Release` and the `stable`
99
+ dist-tag move, so its failure skipped both — which is the precise harm the placement comment
100
+ claimed to prevent. `mindforge-cc@11.9.4` and `mindforge-mcp-server@11.9.4` published
101
+ correctly with provenance attesting commit 353e8d41; the release page and the `stable` tag
102
+ were completed by hand afterwards. The finishing steps now run ahead of the additive
103
+ publishes, so no optional package can strand a release again.
104
+
105
+ - **The Homebrew formula carries the real 11.9.3 digest.** Verified against an independent
106
+ measurement rather than the tool's own output, and explicitly confirmed not to be the
107
+ SHA-256 of npm's 21-byte `{"error":"Not found"}` body — the constant #203 used to write
108
+ for every unpublished version. (#223)
109
+
110
+ **Honesty about what is enforced**
111
+
112
+ - **The README understated the product.** "What is actually enforced" still declared that
113
+ **no install channel registers hooks**, with a `No / No` table, and stated that the
114
+ plugin channel's dispatcher crashes on every fire. Measured: the plugin's
115
+ `scripts/lib/` exists, all **14** path tokens in `plugins/mindforge/hooks/hooks.json`
116
+ resolve under the plugin root, and driving the dispatcher by hand returns **exit 2** for
117
+ `mindforge-block-no-verify` and `mindforge-config-protection`. A document that
118
+ under-claims a security capability is the same defect as one that over-claims it —
119
+ either way it describes a system that is not the one shipped. Now stated per channel,
120
+ with the four cases that remain deliberately unenforced and the three liveness
121
+ preconditions outside MindForge's control. (#225)
122
+
123
+ **Defects the published-artifact audit found (#222)**
124
+
125
+ - The **v11.9.3 release page shipped empty**: `changelog-fetcher.js --latest` exits 0
126
+ while writing zero bytes, so the `||` fallback never fired and a 195-line changelog
127
+ reached nobody. The step now prefers the in-tree changelog and fails on an empty body.
128
+ - A **shipped CI snippet told users to `npx` a package we do not own**.
129
+ `npx mindforge …` resolves to an unrelated third-party package; in a fresh runner it is
130
+ fetched and unpacked, install scripts and all, inside a job holding `MINDFORGE_TOKEN`.
131
+ Now pinned with `--package=mindforge-cc`.
132
+ - The **version-source gate missed a live defect twice**. `mindforge health` printed
133
+ `RELEASE v0.4.2` and `Current : v11.9.3` twenty-six lines apart in a project declaring
134
+ 0.4.2, and produced `Unexpected end of JSON input` with no manifest at all — the verb
135
+ whose job is verifying installation integrity misreporting the installation. Widening
136
+ the gate surfaced two more of the same shape, one of which bound the **wrong** version
137
+ silently into approval records, which is worse than no binding because the check still
138
+ returns a verdict.
139
+ - `mindforge approve` died with ENOENT on any non-Node project. Absent values are now
140
+ recorded as `null` rather than invented.
141
+
142
+ **Test infrastructure**
143
+
144
+ - `tests/production.test.js` carried the uncommitted diff into its clone with
145
+ `git diff HEAD` (which includes staged files) but committed it with `commit -a` (which
146
+ stages only modified and deleted **tracked** files). So any commit **adding** a file
147
+ under `bin/` or `tests/` left the clone dirty and failed the gate's own cleanliness
148
+ assertion — reintroducing precisely the `--no-verify` pressure that carry exists to
149
+ avoid, for the one case it did not cover.
150
+
151
+ ### Added
152
+
153
+ New regression gates, each falsified by reinstating the exact defect and confirming RED,
154
+ with every touched file restored byte-exact afterwards:
155
+
156
+ - `tests/hook-registration-ancestor.test.js` — six properties, the first of which asserts
157
+ the ancestor detector fires at all, so the other five cannot pass by never triggering.
158
+ - `every shipped file is tracked in git` — property-based, no name list. It cannot fail on
159
+ a clean clone, which is how the real leak survived CI, so it is paired with a second
160
+ test that plants the runtime state in a throwaway clone and then packs.
161
+ - `all three published packages publish with provenance` — counts the `npm publish`
162
+ invocations rather than matching one, because a single-match regex was satisfied by
163
+ either of the two packages that already had an attestation while the SDK had none. Also
164
+ asserts the SDK step is idempotent and ordered after the proven publishes.
165
+
166
+ ### Notes for operators
167
+
168
+ - **These fixes change installer behaviour on almost every project.** After upgrading,
169
+ check `.mindforge/hook-registration.json` to see what was registered, and restart the
170
+ harness — hooks are snapshotted at session start.
171
+ - A registered hook is only *live* if the harness has been restarted, the project is
172
+ trusted in the harness, and `CLAUDE_PROJECT_DIR` is set with `node` on the hook PATH.
173
+ None of those three are in MindForge's control; the last is a deliberate trade against a
174
+ fail-closed shell tail that was measured denying benign commands on a fresh clone.
175
+ - Two gaps remain that require repository settings rather than code, and are recorded
176
+ rather than claimed fixed: there is no `v*` **tag ruleset** restricting who may create
177
+ the ref that triggers publishing, and `NPM_TOKEN` is a long-lived repository secret with
178
+ no GitHub environment in front of it.
@@ -0,0 +1,104 @@
1
+ # Changelog
2
+
3
+ ## [11.9.5] — 2026-08-22 — The release path can no longer strand itself, and the SDK ships
4
+
5
+ Patch release, and the shortest one in a while. It exists because 11.9.4 published two
6
+ packages and then failed on the third, and that failure took the release page and the
7
+ `stable` dist-tag with it. Both causes are fixed here, and one of them is the reason this
8
+ release is worth cutting rather than waiting: **`mindforge-sdk` publishes for the first
9
+ time in seven versions, with provenance.**
10
+
11
+ ### Fixed
12
+
13
+ **A publish that cannot finish the release it started**
14
+
15
+ - **`sdk/package.json` had no `repository` field.** npm's provenance verification compares
16
+ that field against the attestation **server-side, at PUT** — so the publish was rejected
17
+ with `422 Unprocessable Entity … "repository.url" is ""` *after* `mindforge-cc` and
18
+ `mindforge-mcp-server` had already published irreversibly. `npm publish --dry-run` does
19
+ not perform that comparison, and nothing in this repository read `repository` at all: all
20
+ six preflight gates passed on a manifest the registry was guaranteed to reject. The field
21
+ is added, matching the spelling the other two packages use.
22
+
23
+ - **`scripts/ci/verify-provenance-metadata.js` makes that failure reachable before the
24
+ point of no return.** It runs in the release **preflight** job, ahead of every publish,
25
+ and it does not carry a list of packages: it discovers them from the workflow — every
26
+ step whose `run` contains both `npm publish` and `--provenance`, resolved through its
27
+ `working-directory` — so a fourth package is covered without editing the gate.
28
+ Discovering zero targets is a hard failure rather than a pass, on the principle that a
29
+ check which examined nothing must not report success.
30
+
31
+ Verified the only way that means anything: run against a git worktree at tag `v11.9.4` —
32
+ the exact tree that the registry rejected — it exits 1 and names `sdk/package.json` and
33
+ the missing field. It would have stopped that release before anything reached npm.
34
+
35
+ - **The release steps were ordered so that an optional package could strand the release.**
36
+ The SDK publish sat *before* `Create GitHub Release` and the `stable` dist-tag move.
37
+ A failing step fails the job, so both were skipped — which is precisely the harm the
38
+ placement comment claimed to prevent. The same mode had already fired on **v11.5.1** and
39
+ **v11.8.3** from the MCP publish; v11.9.4 was its third occurrence.
40
+
41
+ Reordered to: `Publish to npm` → `Create GitHub Release` → `stable` dist-tag →
42
+ `mcp-server` → `sdk`. The rule now encoded in `tests/action-pinning.test.js`: **no step
43
+ whose failure leaves no residue may be able to skip a step that finishes an irreversible
44
+ one.** That test previously asserted the opposite and had to be inverted in the same
45
+ commit — because `Run Full Test Suite` is the release job's first step, a reorder shipped
46
+ alone would have failed the release at its own gate.
47
+
48
+ The two finishers carry guards on their own inputs rather than a bare `!cancelled()`,
49
+ which would publish a release with a 0-byte body and an unmatched `.tgz` glob when
50
+ `Build Package` fails — the `bodyBytes=0` defect already seen on v11.9.0, .1 and .2. And
51
+ deliberately not `continue-on-error`: a tolerated failure makes the run conclude
52
+ **green**, which is the blindness that let the SDK sit seven versions behind, unattested,
53
+ with nothing noticing.
54
+
55
+ **Prose surfaces that shipped stale twice running**
56
+
57
+ - `bin/utils/readiness-gate.js` scored `RELEASENOTES.md` on `fileExists` while its
58
+ changelog sibling three lines away checked that the version appeared *in* the file. That
59
+ asymmetry is why the immutable 11.9.3 tarball's README said "Latest release v11.9.2" and
60
+ the immutable 11.9.4 tarball shipped with no 11.9.4 entry at all — while `README.md`
61
+ offers that file as the human-readable route to the BREAKING notes. Both are now checked,
62
+ anchored rather than by substring (`includes('11.9.4')` is also satisfied by
63
+ `## v11.9.40`).
64
+
65
+ **Policy change, stated plainly:** every release from here needs a `RELEASENOTES.md`
66
+ entry. Six published 11.x versions do not have one, so that file has been curated rather
67
+ than exhaustive; the gate only ever looks for the version being released, so those gaps
68
+ are unaffected.
69
+
70
+ - README's `## Latest release` is deliberately gated by a **test** rather than written by
71
+ `sync-version.js`. Auto-bumping the version token onto the previous release's paragraph
72
+ produces the right number attached to the wrong description — a better-disguised
73
+ falsehood than a visibly stale one.
74
+
75
+ - `docs/sdk-reference.md` offered `npx mindforge-cc@stable` as a way to get the SDK
76
+ "as part of the framework". Measured false: the published package declares exactly
77
+ `express` and `sql.js` and ships no `sdk/` directory. Removed.
78
+
79
+ ### Added
80
+
81
+ - **`mindforge-sdk` is published, with provenance** — its first release since 11.8.0 and
82
+ its first ever attested one. This is not cosmetic. Everything fixed in the SDK across
83
+ 11.8.1–11.9.4 reached nobody, including the one that matters most:
84
+ `WebSocketEventStream` scheduled a reconnect with `setTimeout(() => this.connect(), …)`
85
+ and nothing handled the returned promise, so a failed reconnect was an unhandled
86
+ rejection — fatal under Node's default mode, **terminating the caller's process**. Every
87
+ consumer on 11.8.0 still has that. (#191)
88
+
89
+ - `npm run provenance:check` — the gate above, runnable offline.
90
+
91
+ ### Notes for operators
92
+
93
+ - 11.9.4 is complete but was finished by hand: its GitHub Release was created at the
94
+ existing tag from the registry's own tarball (verified against `dist.integrity` and both
95
+ attestation bundles' subject digests), and the `v11.9.4` tag was deliberately **not**
96
+ moved, because two published packages' provenance attests to the commit it names.
97
+ - The `stable` dist-tag lagged at 11.9.3 between the two releases. Because the dist-tag
98
+ step now runs *ahead* of both additive publishes, this release moves it forward even if a
99
+ package publish fails again.
100
+ - Still outstanding, and requiring repository settings rather than code: there is no `v*`
101
+ **tag ruleset** restricting who may create the ref that triggers publishing, and
102
+ `NPM_TOKEN` remains a long-lived repository secret with no GitHub environment in front of
103
+ it. Create the environment *first* — adding `environment:` while none exists publishes
104
+ exactly as before while looking like a gate.
package/docs/faq.md CHANGED
@@ -1,4 +1,4 @@
1
- # MindForge FAQ (v11.9.3)
1
+ # MindForge FAQ (v11.9.5)
2
2
 
3
3
  ## Is MindForge tied to Claude only?
4
4
  No. MindForge supports Claude Code and Antigravity. Install with `--claude`,
@@ -55,7 +55,7 @@ The `deep-research` workflow was removed before the v11.8.0 release (the superpo
55
55
  ## Version & Stability
56
56
 
57
57
  **Q: What version is current?**
58
- v11.9.3 — verify with `node bin/mindforge-cli.js --version`
58
+ v11.9.5 — verify with `node bin/mindforge-cli.js --version`
59
59
 
60
60
  **Q: Is v11.9.0 production-stable?**
61
61
  Yes. The IQ200 deep-audit (258 discrete checks across 14 dimensions) shows 258/258 passing. 0 CVEs, 0 test failures, 0 ESLint errors, 0 TypeScript errors.
@@ -80,7 +80,7 @@ Spawn dispatch is not yet implemented in v11.9.0. Use `/mindforge:auto` or `/min
80
80
  Tier-3 trust uses in-process key simulation in v11.9.0 — this is intentional and safe. `SECURITY_TIER_3_SIMULATED = true` is the documented v11.x behavior. Hardware TPM/HSM is planned for v12.x.
81
81
 
82
82
  **Q: What is the test coverage?**
83
- 133 test files: 131 pass, 0 failures, 2 env-dependent skips (`browser.test.js` needs a Chromium
83
+ 135 test files: 133 pass, 0 failures, 2 env-dependent skips (`browser.test.js` needs a Chromium
84
84
  daemon, `sre-integration.test.js` needs git worktree support and a clean tree).
85
85
 
86
86
  The enforced floor is **30% lines**, gated in CI by the `mindforge-quality` job
@@ -1,4 +1,4 @@
1
- # MindForge — Getting Started (v11.9.3)
1
+ # MindForge — Getting Started (v11.9.5)
2
2
 
3
3
  This guide gets you from zero to a working MindForge project in under five minutes.
4
4
 
@@ -54,7 +54,13 @@ Run the MindForge MCP server (`mindforge-mcp-server`) over stdio — it exposes
54
54
  claude mcp add mindforge -- npx -y mindforge-mcp-server
55
55
  ```
56
56
 
57
- This server is also published to the [MCP Registry](https://registry.modelcontextprotocol.io) as `io.github.sairam0424/mindforge` (currently `11.9.0`, marked latest).
57
+ This server is also published to the [MCP Registry](https://registry.modelcontextprotocol.io) as
58
+ `io.github.sairam0424/mindforge`. **The registry entry lags this package** — it is republished
59
+ manually, so check what it actually serves before relying on it:
60
+ `curl -s 'https://registry.modelcontextprotocol.io/v0/servers?search=io.github.sairam0424/mindforge'`.
61
+ To pin a known version instead, install `mindforge-mcp-server` from npm directly. (The previous
62
+ wording named a specific version and marked it latest; both were wrong in both directions, which
63
+ is why this now describes how to check rather than asserting a number.)
58
64
 
59
65
  ### 4. Homebrew
60
66
 
@@ -108,7 +114,7 @@ Or use slash commands: `/mindforge:wf-code-audit`
108
114
  ## Your First 5 Minutes with MindForge
109
115
 
110
116
  1. **Verify install:** `node bin/mindforge-cli.js health`
111
- 2. **Check version:** `node bin/mindforge-cli.js --version` (should print `11.9.3`)
117
+ 2. **Check version:** `node bin/mindforge-cli.js --version` (should print `11.9.5`)
112
118
  3. **List workflows:** `node bin/mindforge-cli.js workflow list`
113
119
  4. **Run first slash command:** Open Claude Code → `/mindforge:status`
114
120
  5. **Onboard your codebase:** Open Claude Code → `/mindforge:wf-onboard-codebase`
@@ -14,11 +14,11 @@ import {
14
14
  } from 'mindforge-sdk';
15
15
  ```
16
16
 
17
- Current SDK version: `11.9.3`
17
+ Current SDK version: `11.9.5`
18
18
 
19
19
  ---
20
20
 
21
- ## SDK Exports (v11.9.3)
21
+ ## SDK Exports (v11.9.5)
22
22
 
23
23
  ```javascript
24
24
  const {
@@ -28,7 +28,7 @@ const {
28
28
  commands, // Command registry
29
29
  batch, // Batch execution
30
30
  MindForgeMemory, // Memory interface
31
- VERSION // '11.9.3'
31
+ VERSION // '11.9.5'
32
32
  } = require('mindforge-sdk');
33
33
  // or: import { MindForgeClient, VERSION } from 'mindforge-sdk';
34
34
  ```
@@ -418,13 +418,19 @@ cd sdk && npm install && npm run build
418
418
  ## Installation
419
419
  ```bash
420
420
  npm install mindforge-sdk
421
- # or: npx mindforge-cc@stable # installs SDK as part of the framework
422
421
  ```
423
422
 
424
- > **`mindforge-sdk` is versioned independently of the framework.** The release workflow
425
- > (`.github/workflows/mindforge-release.yml`) publishes `mindforge-cc` and
426
- > `mindforge-mcp-server` only it has no `sdk` steps so `sdk/package.json`'s version
427
- > tracks the monorepo while the published package does not. At the time of writing the
428
- > latest published SDK is **11.8.0** (`npm view mindforge-sdk versions`), even though the
429
- > in-repo `sdk/package.json` reads 11.9.2. Install it unpinned, as above; pinning it to a
430
- > framework version yields `E404 No match found for version …`.
423
+ > **`mindforge-sdk` lags the framework, and the framework does not contain it.** Installing
424
+ > `mindforge-cc` does **not** give you the SDK: the published package declares exactly two
425
+ > dependencies, `express` and `sql.js`, and ships no `sdk/` directory. A line here previously
426
+ > offered `npx mindforge-cc@stable` as a way to get the SDK "as part of the framework"; that was
427
+ > false and has been removed.
428
+ >
429
+ > The release workflow publishes the SDK as of 11.9.5, with provenance. Its first attempt
430
+ > (v11.9.4) was rejected by the registry — `sdk/package.json` carried no `repository` field, which
431
+ > npm's provenance check validates server-side at publish time — so **versions 11.8.1 through
432
+ > 11.9.4 do not exist on npm** and never will. Check what is actually published with
433
+ > `npm view mindforge-sdk version` rather than assuming it matches the framework: the version in
434
+ > `sdk/package.json` tracks the monorepo because `scripts/sync-version.js` rewrites it, whether or
435
+ > not that version reached the registry. Install it unpinned, as above; pinning it to a framework
436
+ > version that was never published yields `E404 No match found for version …`.
@@ -1,4 +1,4 @@
1
- # MindForge Troubleshooting (v11.9.3)
1
+ # MindForge Troubleshooting (v11.9.5)
2
2
 
3
3
  This page lists common issues and fast fixes. If you get stuck, start with
4
4
  `/mindforge:health`.
@@ -208,3 +208,58 @@ All tests must be run from the MindForge project root: `cd /path/to/MindForge &&
208
208
  **Symptom:** `--version` flag reports "Unknown command" on installs older than v11.9.0.
209
209
 
210
210
  **Fix:** Upgrade: `npx mindforge-cc@latest --claude --local`
211
+
212
+ ---
213
+
214
+ ## Hooks are installed but nothing is blocked
215
+
216
+ **Symptom:** The hook scripts are present under `.claude/hooks/`, but a command that should be denied
217
+ — say `git commit --no-verify` — runs normally.
218
+
219
+ Hooks have two separate failure modes: **not registered** (no config names them) and **registered but
220
+ not live** (the config exists, the harness has not applied it). Check them in that order.
221
+
222
+ **1. Was registration attempted, and what did it decide?** The installer prints one line for every
223
+ outcome, and writes a receipt:
224
+
225
+ ```
226
+ cat .mindforge/hook-registration.json
227
+ ```
228
+
229
+ `registered: false` there carries the reason. Registration is deliberately narrow: Claude Code only,
230
+ `--local` only, non-Windows. A self-install inside a MindForge checkout also declines, because that
231
+ repo maintains its own tracked config.
232
+
233
+ **2. Restart the harness.** Claude Code snapshots hooks at session start, so a registration performed
234
+ during an open session is not live in it. This is the single most common cause.
235
+
236
+ **3. Confirm the project is trusted.** User-tier and project-tier settings are applied independently:
237
+ `~/.claude/settings.json` is the user tier and applies to every session, while
238
+ `<project>/.claude/settings.json` is the project tier and needs the project itself to be trusted.
239
+ Measured on one machine: the user-tier hooks fired on every tool call while the project-tier hooks in
240
+ the same session did not, and that project's entry in `~/.claude.json` had
241
+ `hasTrustDialogAccepted: false`. Accept the trust prompt for the directory, then use `/hooks` to
242
+ confirm the entries are listed.
243
+
244
+ **4. Drive the hook directly** to separate "the hook is broken" from "the hook is not wired". This
245
+ takes the harness out of the loop entirely — a deny-class hook must exit **2**:
246
+
247
+ ```bash
248
+ echo '{"hook_event_name":"PreToolUse","tool_name":"Bash","cwd":"'"$PWD"'","tool_input":{"command":"git commit --no-verify -m x"}}' \
249
+ | node .claude/hooks/run-with-flags.js mindforge-block-no-verify .claude/hooks/mindforge-block-no-verify.js minimal,standard,strict
250
+ echo "exit=$?"
251
+ ```
252
+
253
+ Exit 2 with a `BLOCKED:` line on stderr means the hook works and the problem is registration or
254
+ trust. Exit 0 with the payload echoed back means the dispatcher could not load the script — check
255
+ that the second path exists under `.claude/hooks/`.
256
+
257
+ **5. If you launch the harness somewhere else, install there too.** Project settings are read from the
258
+ directory the harness starts in; they are **not** inherited from a parent directory. An ancestor
259
+ project having its own `.claude/settings.json` does not make its hooks apply here, and does not stop
260
+ these from applying — the installer warns when it sees one, and still registers.
261
+
262
+ **Known residual:** if `CLAUDE_PROJECT_DIR` is unset, or `node` is not on the hook PATH, the
263
+ registered commands exit 1 and the gate is simply absent — the same position as not installing. This
264
+ is a deliberate trade: a fail-closed shell tail was measured denying benign commands on a fresh
265
+ clone.
@@ -1,8 +1,8 @@
1
- # MindForge User Guide (v11.9.3)
1
+ # MindForge User Guide (v11.9.5)
2
2
 
3
3
  This guide gets you from install to productive, with the minimum needed to run MindForge in a real project.
4
4
 
5
- > **v11.9.3 Stats:** 35 workflows · 221 slash commands · 232 engine skills · 216 personas · 0 CVEs · 258/258 IQ200 checks passing
5
+ > **v11.9.5 Stats:** 35 workflows · 221 slash commands · 232 engine skills · 216 personas · 0 CVEs · 258/258 IQ200 checks passing
6
6
 
7
7
  ## Prerequisites
8
8
 
@@ -44,7 +44,7 @@ mindforge health # Verify project integrity
44
44
  mindforge security-scan # Run security checks
45
45
  mindforge headless # Run agent in non-interactive mode
46
46
  mindforge --verbose ... # Enable verbose output for debugging
47
- mindforge --version # Print installed version (e.g. 11.9.3) and exit 0
47
+ mindforge --version # Print installed version (e.g. 11.9.5) and exit 0
48
48
  ```
49
49
 
50
50
  Use `--verbose` (or `-v`) on any command for detailed diagnostic output. Use `--version` (or `-V`) to print the installed version and exit.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mindforge-cc",
3
- "version": "11.9.3",
3
+ "version": "11.9.5",
4
4
  "description": "MindForge — Sovereign Agentic Intelligence Framework. Sovereign Stability: Production-Hardened Agentic Intelligence (v11)",
5
5
  "bin": {
6
6
  "mindforge-cc": "bin/install.js",
@@ -29,6 +29,7 @@
29
29
  ".mindforge/intelligence/",
30
30
  ".mindforge/memory/",
31
31
  "!.mindforge/memory/pattern-library.jsonl",
32
+ "!.mindforge/memory/sync-manifest.json",
32
33
  ".mindforge/metrics/",
33
34
  "!.mindforge/metrics/token-usage.jsonl",
34
35
  ".mindforge/models/",
@@ -67,6 +68,7 @@
67
68
  "harness:compliance": "node bin/installer/harness-adapter-compliance.js --check",
68
69
  "release:ready": "node bin/utils/readiness-gate.js release",
69
70
  "version:check": "node scripts/sync-version.js --check",
71
+ "provenance:check": "node scripts/ci/verify-provenance-metadata.js",
70
72
  "validate:assets": "node scripts/ci/validate-assets.js",
71
73
  "eval:retrieval": "node bin/eval/eval-harness.js --set golden-set-retrieval.json --min-recall 0.55",
72
74
  "commit": "cz",
@@ -1,6 +0,0 @@
1
- {
2
- "pattern-library.jsonl": {
3
- "lastSync": "2026-08-21T12:02:25.078Z",
4
- "localCount": 1
5
- }
6
- }