mindforge-cc 11.9.2 → 11.9.4

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 (95) hide show
  1. package/.agent/CLAUDE.md +37 -13
  2. package/.agent/hooks/mindforge-block-no-verify.js +61 -13
  3. package/.agent/hooks/mindforge-config-protection.js +82 -3
  4. package/.agent/hooks/mindforge-context-monitor.js +1 -1
  5. package/.agent/hooks/mindforge-workflow-guard.js +2 -2
  6. package/.agent/hooks/run-with-flags.js +190 -20
  7. package/.agent/mindforge/browse.md +2 -2
  8. package/.agent/mindforge/checkpoint.md +1 -1
  9. package/.agent/mindforge/harness-audit.md +1 -1
  10. package/.agent/mindforge/orch-add-feature.md +1 -1
  11. package/.agent/mindforge/orch-build-mvp.md +1 -1
  12. package/.agent/mindforge/orch-change-feature.md +1 -1
  13. package/.agent/mindforge/orch-fix-defect.md +1 -1
  14. package/.agent/mindforge/orch-refine-code.md +1 -1
  15. package/.agent/mindforge/qa.md +2 -2
  16. package/.claude/CLAUDE.md +37 -13
  17. package/.claude/commands/mindforge/browse.md +2 -2
  18. package/.claude/commands/mindforge/checkpoint.md +1 -1
  19. package/.claude/commands/mindforge/harness-audit.md +1 -1
  20. package/.claude/commands/mindforge/orch-add-feature.md +1 -1
  21. package/.claude/commands/mindforge/orch-build-mvp.md +1 -1
  22. package/.claude/commands/mindforge/orch-change-feature.md +1 -1
  23. package/.claude/commands/mindforge/orch-fix-defect.md +1 -1
  24. package/.claude/commands/mindforge/orch-refine-code.md +1 -1
  25. package/.claude/commands/mindforge/qa.md +2 -2
  26. package/.mindforge/MINDFORGE-SCHEMA.json +1 -1
  27. package/.mindforge/config.json +3 -3
  28. package/.mindforge/engine/autonomous/headless-adapter.md +9 -2
  29. package/.mindforge/engine/temporal-protocol.md +2 -2
  30. package/.mindforge/governance/change-classifier.md +20 -4
  31. package/.mindforge/skills/agent-architecture-audit/SKILL.md +2 -2
  32. package/.mindforge/skills/orch-pipeline/SKILL.md +4 -4
  33. package/CHANGELOG.md +357 -0
  34. package/MINDFORGE.md +13 -6
  35. package/README.md +49 -30
  36. package/RELEASENOTES.md +65 -2
  37. package/SECURITY.md +22 -3
  38. package/bin/autonomous/auto-runner.js +65 -2
  39. package/bin/change-classifier.js +151 -16
  40. package/bin/dashboard/api-router.js +18 -38
  41. package/bin/dashboard/frontend/app.js +429 -0
  42. package/bin/dashboard/frontend/index.html +13 -406
  43. package/bin/dashboard/metrics-aggregator.js +52 -23
  44. package/bin/dashboard/server.js +160 -1
  45. package/bin/dashboard/sse-bridge.js +11 -8
  46. package/bin/engine/sre-manager.js +1 -1
  47. package/bin/engine/temporal-cli.js +56 -6
  48. package/bin/engine/verification-runner.js +134 -17
  49. package/bin/engine/verify-cli.js +25 -7
  50. package/bin/governance/approval-record.js +147 -0
  51. package/bin/governance/approve.js +24 -8
  52. package/bin/governance/policy-engine.js +33 -3
  53. package/bin/governance/policy-gate-hardened.js +36 -1
  54. package/bin/governance/verify-approvals.js +175 -0
  55. package/bin/harness-audit.js +224 -10
  56. package/bin/hooks/instinct-capture-hook.js +12 -4
  57. package/bin/install.js +63 -3
  58. package/bin/installer/harness-adapter-compliance.js +339 -28
  59. package/bin/installer/hook-registration.js +547 -0
  60. package/bin/installer-core.js +481 -65
  61. package/bin/learning/instinct-cli.js +7 -0
  62. package/bin/memory/vector-hub.js +196 -13
  63. package/bin/migrations/0.6.0-to-1.0.0.js +30 -25
  64. package/bin/migrations/1.0.0-to-2.0.0.js +22 -23
  65. package/bin/mindforge-cli.js +67 -6
  66. package/bin/models/cost-tracker.js +104 -6
  67. package/bin/models/model-client.js +6 -1
  68. package/bin/revops/debt-monitor.js +57 -13
  69. package/bin/security/trust-gate-hook.js +50 -6
  70. package/bin/skill-validator.js +6 -1
  71. package/bin/skills-builder/skill-scorer.js +46 -6
  72. package/bin/updater/self-update.js +6 -1
  73. package/bin/updater/version-comparator.js +21 -1
  74. package/bin/utils/mindforge-version.js +99 -0
  75. package/bin/utils/redact-secrets.js +106 -0
  76. package/bin/validate-config.js +42 -2
  77. package/bin/wizard/setup-wizard.js +4 -1
  78. package/bin/wizard/theme.js +9 -1
  79. package/changelogs/index.json +11 -9
  80. package/changelogs/v11.9.3.md +204 -0
  81. package/changelogs/v11.9.4.md +155 -0
  82. package/docs/References/config-reference.md +5 -2
  83. package/docs/References/sdk-api.md +1 -1
  84. package/docs/Templates/Codebase/architecture.md +1 -1
  85. package/docs/commands-reference.md +4 -5
  86. package/docs/faq.md +25 -5
  87. package/docs/getting-started.md +10 -4
  88. package/docs/sdk-reference.md +15 -7
  89. package/docs/troubleshooting.md +65 -6
  90. package/docs/user-guide.md +14 -14
  91. package/examples/sdk-integration/README.md +1 -1
  92. package/package.json +8 -3
  93. package/subagents/.claude-plugin/marketplace.json +1 -1
  94. package/.mindforge/memory/sync-manifest.json +0 -6
  95. package/bin/dashboard/approval-handler.js +0 -136
@@ -8,15 +8,55 @@
8
8
  'use strict';
9
9
 
10
10
  const fs = require('fs');
11
+ const path = require('path');
11
12
 
12
13
  // The one bracket-aware MINDFORGE.md reader (see bin/utils/mindforge-params.js).
13
14
  const { readParams } = require('./utils/mindforge-params');
14
15
 
16
+ // The config belongs to the CALLER, so it stays relative to cwd.
15
17
  const CONFIG_PATH = process.argv[2] || 'MINDFORGE.md';
16
- const SCHEMA_PATH = '.mindforge/MINDFORGE-SCHEMA.json';
18
+
19
+ /**
20
+ * The schema belongs to the FRAMEWORK, so it is resolved from __dirname first.
21
+ *
22
+ * This was the bare relative `'.mindforge/MINDFORGE-SCHEMA.json'`, which only ever resolved
23
+ * because bin/mindforge-cli.js pinned the child's cwd to MindForge's own install directory. That
24
+ * pin is what made `security-scan` validate the vendor's MINDFORGE.md and report
25
+ * `✅ valid — 43 settings configured` over any caller's config. Removing the pin without anchoring
26
+ * the schema here would have swapped one broken outcome for another: every consumer with a real
27
+ * MINDFORGE.md would hit the `not found` branch below and exit 0 having validated NOTHING. Measured
28
+ * that exact regression on a fixture — `ℹ️ MINDFORGE-SCHEMA.json not found — skipping schema
29
+ * validation`, rc=0 — which is why the two changes ship together.
30
+ *
31
+ * Every check in this file is schema-driven (required, recommended, type, minimum, maximum, enum,
32
+ * pattern, nonOverridable). There is no schema-free validation path, so a missing schema is not a
33
+ * degraded check, it is no check.
34
+ *
35
+ * Package-relative first, cwd-relative second, because the two supported install shapes put the
36
+ * schema in different places:
37
+ * - `npx mindforge-cc` — runs from node_modules/mindforge-cc/, where .mindforge/ ships. Fixed.
38
+ * - a copied bin/ tree — the installer copies bin/ but creates no .mindforge/, verified on a
39
+ * clean `--claude --local` install. There the schema is genuinely absent and the honest skip
40
+ * below is the correct outcome; the cwd fallback still finds one if the project has its own.
41
+ */
42
+ function resolveSchemaPath() {
43
+ const candidates = [
44
+ path.join(__dirname, '..', '.mindforge', 'MINDFORGE-SCHEMA.json'),
45
+ path.join(process.cwd(), '.mindforge', 'MINDFORGE-SCHEMA.json'),
46
+ ];
47
+ return candidates.find((p) => fs.existsSync(p)) || candidates[0];
48
+ }
49
+
50
+ const SCHEMA_PATH = resolveSchemaPath();
17
51
 
18
52
  if (!fs.existsSync(CONFIG_PATH)) {
19
- console.log('ℹ️ MINDFORGE.md not found using all defaults. Create one to customise.');
53
+ // Name the path actually looked for, and where. This said "MINDFORGE.md not found" verbatim even
54
+ // when argv[2] supplied a different file, so `validate-config.js custom-config.md` reported a
55
+ // missing MINDFORGE.md — a message about a file the caller never mentioned. It cost real time
56
+ // during this change: a test failure was diagnosed as "a defaultArgs positional shadowed argv[2]"
57
+ // when the truth was simply that the named file was not in the working directory.
58
+ console.log(`ℹ️ ${CONFIG_PATH} not found in ${process.cwd()} — using all defaults. `
59
+ + 'Create one to customise.');
20
60
  process.exit(0);
21
61
  }
22
62
 
@@ -6,7 +6,10 @@ const readline = require('readline');
6
6
  const detector = require('./environment-detector');
7
7
  const generator = require('./config-generator');
8
8
 
9
- const VERSION = require('../../package.json').version;
9
+ // Resolved by package NAME, not by relative path: in an install `../../package.json` is the
10
+ // consumer's manifest, so the wizard displayed the host app's version as MindForge's.
11
+ const { resolveMindforgeVersion } = require('../utils/mindforge-version');
12
+ const VERSION = resolveMindforgeVersion({ fromDir: __dirname }).version;
10
13
  const ARGS = process.argv.slice(2);
11
14
  const IS_INTERACTIVE =
12
15
  !ARGS.some((a) => ['--claude', '--antigravity', '--all', '--help'].includes(a)) &&
@@ -106,7 +106,15 @@ const Theme = {
106
106
  console.log(` ${this.colors.dim('│')} ${this.colors.bold('Environment')}: ${this.colors.cyan(runtime)} (${this.colors.dim(scope)}) ${this.colors.dim('│')}`);
107
107
  console.log(` ${this.colors.dim('│')} ${this.colors.dim('│')}`);
108
108
  console.log(` ${this.colors.dim('│')} ${this.colors.bold('Next steps:')} ${this.colors.dim('│')}`);
109
- console.log(` ${this.colors.dim('│')} ${this.colors.bold('mindforge-cc init')} ${this.colors.dim('— Initialize your first workspace')} ${this.colors.dim('│')}`);
109
+ // Was `mindforge-cc init`, which does not exist. mindforge-cc takes flags only and silently
110
+ // ignored the positional, so obeying this line re-ran the installer against whatever directory
111
+ // the user was standing in: measured 1,836 files written into an empty temp dir, exit 0, and
112
+ // this same panel printed again — so it loops. `/mindforge:init-project` is the real command and
113
+ // the install has just placed it in the harness, so the instruction now names something the
114
+ // user actually has. bin/install.js rejects stray positionals too: a wrong instruction and a
115
+ // silent acceptance of it are two separate defects, and fixing either alone leaves a trap.
116
+ // Padding keeps the visible width at 65 so the box border still lines up.
117
+ console.log(` ${this.colors.dim('│')} ${this.colors.bold('/mindforge:init-project')} ${this.colors.dim('— Initialize your workspace')} ${this.colors.dim('│')}`);
110
118
  console.log(` ${this.colors.dim('│')} ${this.colors.bold('/mindforge:help')} ${this.colors.dim('— Explore the command suite')} ${this.colors.dim('│')}`);
111
119
  console.log(` ${this.colors.dim('│')} ${this.colors.dim('│')}`);
112
120
  console.log(` ${this.colors.dim('├' + '─'.repeat(boxWidth) + '╯')}\n`);
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "versions": [
3
+ "11.9.3",
4
+ "11.9.2",
3
5
  "11.9.1",
4
6
  "11.9.0",
5
7
  "11.8.3",
@@ -47,8 +49,8 @@
47
49
  "6.5.0",
48
50
  "6.4.0",
49
51
  "6.3.0",
50
- "6.2.0",
51
52
  "6.2.0-alpha",
53
+ "6.2.0",
52
54
  "6.1.0-alpha",
53
55
  "6.0.0-alpha",
54
56
  "5.9.0",
@@ -60,8 +62,8 @@
60
62
  "5.3.0",
61
63
  "5.2.0",
62
64
  "5.1.0",
63
- "5.0.0-alpha.2",
64
65
  "5.0.0-alpha.1",
66
+ "5.0.0-alpha.2",
65
67
  "4.3.0",
66
68
  "4.1.0",
67
69
  "4.0.0",
@@ -76,17 +78,17 @@
76
78
  "2.1.2",
77
79
  "2.1.1",
78
80
  "2.1.0",
79
- "2.0.0",
80
- "2.0.0-alpha.12",
81
- "2.0.0-alpha.11",
82
- "2.0.0-alpha.10",
83
81
  "2.0.0-alpha.9",
84
82
  "2.0.0-alpha.8",
85
- "2.0.0-alpha.7",
86
- "2.0.0-alpha.4",
87
- "2.0.0-alpha.3",
83
+ "2.0.0",
84
+ "2.0.0-alpha.10",
88
85
  "2.0.0-alpha.2",
89
86
  "2.0.0-alpha.1",
87
+ "2.0.0-alpha.11",
88
+ "2.0.0-alpha.7",
89
+ "2.0.0-alpha.12",
90
+ "2.0.0-alpha.3",
91
+ "2.0.0-alpha.4",
90
92
  "1.0.5",
91
93
  "1.0.4",
92
94
  "1.0.3",
@@ -0,0 +1,204 @@
1
+ # Changelog
2
+
3
+ ## [11.9.3] — 2026-08-21 — Honesty: gates that can fail, commands that run, a release path that is checked
4
+
5
+ Patch release. No new features. Twenty-one fixes, and they all turned out to be the
6
+ same defect: **an instrument reported success while doing nothing.** Gates that could
7
+ not fail, tests satisfied by a comment, docs describing capabilities with no code
8
+ behind them, commands printing success while performing no action, and a publish path
9
+ that no check ever touched.
10
+
11
+ Contains behaviour changes under a patch bump — several of the things being fixed were
12
+ bugs that a consumer could have been relying on. Read BREAKING before upgrading if you
13
+ script against the CLI or the installer.
14
+
15
+ > **Corrected after release.** Three measured numbers in this entry were wrong and are fixed above:
16
+ > the count of places `--status`/`--stop` were documented (removed rather than re-guessed — it reads 4,
17
+ > 9 or 15 depending on how you count, which is the argument against stating it); the eslint total, which
18
+ > was 199 on the author's machine and **190** on a clean clone, because 9 problems came from an
19
+ > untracked local directory; and "four releases behind", which is **three** (11.8.3 → 11.9.0 → 11.9.1 →
20
+ > 11.9.2). Found by an adversarial audit of this changelog against the published artifact. A release
21
+ > arguing that measured numbers should be reproducible has to hold its own notes to that standard.
22
+
23
+ ### BREAKING
24
+
25
+ Each of these is a bug fix whose correct behaviour differs from the shipped behaviour.
26
+
27
+ - **Routed CLI commands now act on YOUR project, not MindForge's own checkout.**
28
+ `bin/mindforge-cli.js` passed `cwd: ROOT` to every routed command, so `mindforge
29
+ classify` diffed MindForge's repository instead of yours, and `mindforge health`
30
+ inspected MindForge's `node_modules`. Measured across all 27 routed commands: 7
31
+ changed behaviour, all in the correct direction, none regressed. If you parsed output
32
+ that happened to describe MindForge itself, it now describes your project. (#201)
33
+
34
+ - **`npx mindforge-cc install` — and any other positional argument — now exits 1.**
35
+ The installer takes flags only and silently ignored stray words, so
36
+ `npx mindforge-cc install` appeared to work while installing nothing configured.
37
+ It now refuses with the correct form. `--runtime`'s value token is still accepted.
38
+ Use `npx mindforge-cc --claude --local`. (#202)
39
+
40
+ - **`mindforge verify` now SKIPS unavailable stages instead of failing them.** A project
41
+ with no ESLint config, no test script or no `bin/verify-audit.js` was reported as
42
+ FAILING those stages rather than as not having them. If your CI relied on a non-zero
43
+ exit in those cases, it will now pass. A run in which every stage skipped prints a
44
+ "NOTHING WAS VERIFIED" banner rather than a clean bill of health. (#204)
45
+
46
+ - **`scripts/sync-version.js` now exits non-zero when the plugin build artifacts are
47
+ stale.** A bump used to report `✅ every derivable channel is at <version>` and exit 0
48
+ while leaving `npm test` red. If you script this, handle the new exit code — it means
49
+ "run the build chain it just printed". (#211)
50
+
51
+ - **A self-install no longer writes over your tracked files.** Running the installer
52
+ inside a MindForge checkout printed that it was skipping and then overwrote 149
53
+ tracked files, including `CLAUDE.md`, `.claude/**`, `.agent/**` and `.mindforge/**`.
54
+ The skip is now honoured for local scope. (#200)
55
+
56
+ - **Releases must be tagged on a commit reachable from `main`.** The release workflow
57
+ now refuses a tag that is not an ancestor of `origin/main`. The documented flow is
58
+ develop → release → main; tagging elsewhere previously published, with provenance
59
+ attesting to that tree. (#216)
60
+
61
+ ### Fixed
62
+
63
+ **Installer**
64
+
65
+ - A self-install claimed to skip and then overwrote 149 tracked files. The gate is now
66
+ scope-aware (`isSelfInstall() && scope === 'local'`). (#200)
67
+ - Every `--global` install reported failure on a correct run: `verifyInstall` demanded
68
+ six `bin/**` paths regardless of scope, so a global install ended
69
+ `❌ 6 of 12 required file(s) missing` and exit 1, with a `--force` retry that could
70
+ not help. A global install writes 389 files to `$HOME/.claude` and, deliberately,
71
+ zero to `bin/`. (#210)
72
+ - 11 of 27 routed CLI verbs died on `MODULE_NOT_FOUND` in a real install: the router
73
+ shipped but 6 of the scripts it dispatches to did not. `coreFiles` grew from 2 entries
74
+ to 8. (#210)
75
+ - Two leaks: `/tmp` staging files left behind on abandoned runs, and developer runtime
76
+ state (`celestial.db`, `.browser-daemon-token`) copied into consumer projects.
77
+ `SENSITIVE_EXCLUDE` now covers both. (#210)
78
+ - The forge commands overwrote three `mindforge` commands of the same name. (#197)
79
+ - The documented default install did not deliver the CLI it documents. (#196)
80
+
81
+ **Versioning and release**
82
+
83
+ - `sync-version.js --fetch-sha` hashed npm's 404 error body. For an unpublished version
84
+ the registry answers `{"error":"Not found"}` and `curl -sL` exits 0, so the digest
85
+ written into the Homebrew formula was the SHA-256 of that error text — the same
86
+ constant for every unpublished version — and `--check` then passed. Now `curl -fsSL`
87
+ plus a gzip magic-byte check, and it refuses rather than writing a digest no artifact
88
+ can match. (#203)
89
+ - The Homebrew formula may now LAG canonical but never LEAD it. Requiring equality
90
+ before publishing required something impossible: the digest is the hash of a tarball
91
+ that does not exist yet, and `npm test` blocked the publish that would have made it
92
+ satisfiable. (#208)
93
+ - Semver comparison is numeric per component. Lexicographically, `11.10.0` reads as
94
+ *behind* `11.9.2` — wrong on exactly the first release past a `.9` minor. (#208)
95
+ - Three version channels had no writer at all, so `npm test` failed on every bump and
96
+ the documented remedy could not fix it: `mcp-server/server.json` (both keys, matched
97
+ by identifier), `AGENTS.md`, and `sdk/README.md`'s second shape. (#207, #211)
98
+ - **No channel covered a document a user receives.** `SECURITY.md` — the security policy
99
+ at the root of the published package — said "Current version: 11.9.0", and
100
+ getting-started, faq, troubleshooting, user-guide and sdk-reference all titled
101
+ themselves v11.9.0: three releases stale, while every npm manifest was correct.
102
+ `--check` was green throughout, because a channel that does not exist cannot drift.
103
+ Structural markers now track canonical; narrative measurements deliberately do not.
104
+ (#211)
105
+ - A bump is not finished when `sync-version.js` exits. Two tracked artifacts are gated
106
+ against `package.json` and only a build can write them —
107
+ `plugins/mindforge/.claude-plugin/plugin.json` and
108
+ `plugins/mindforge/mcp/dist/index.js`. They are now reported under
109
+ `🔨 REQUIRE A BUILD` with the exact three-command chain, which nothing had documented.
110
+ (#211)
111
+ - `sync-version.js` reported "a channel is AHEAD of canonical" whenever its exit code
112
+ was non-zero for any reason, so the `--fetch-sha` refusal for an unpublished tarball
113
+ claimed the formula LEADS canonical in the same run that printed "DEFERRED until after
114
+ publish (behind, not ahead)". (#211)
115
+ - `changelogs/index.json`, which `bin/updater/changelog-fetcher.js` reads as the
116
+ authoritative version list, was missing 11.9.2. (#218)
117
+
118
+ **Publishing**
119
+
120
+ - **The tag push that publishes was exempt from every gate.** Publishing is triggered by
121
+ exactly one event — a `v*` tag push — and the repository's only ruleset targets
122
+ branches, so its six required checks applied to nothing on the path that ships. GitHub
123
+ cannot attach required status checks to a tag. A `preflight` job now gates it. (#216)
124
+ - The `stable` npm dist-tag was moved by hand, or not at all — it sat three releases
125
+ behind `latest` (11.8.3 against 11.9.2, via 11.9.0 and 11.9.1), so `npm i mindforge-cc@stable` delivered a
126
+ build with none of the 11.9.x fixes. The release workflow now moves it as its final
127
+ step: forward-only, prereleases skipped, and verified against npm's uncached dist-tags
128
+ endpoint rather than the CDN-cached packument. (#216)
129
+
130
+ **Dashboard**
131
+
132
+ - `--status` and `--stop` were documented across the harness roots and the docs and implemented
133
+ nowhere; both
134
+ printed nothing and exited 0. Now implemented, before `express` is required, so they
135
+ work without the dependency installed. (#206)
136
+ - `--stop` identified the target by the SHAPE of its command line, which matched any
137
+ `node <anything>/dashboard/server.js` — verified against
138
+ `node /var/www/unrelated_app/dashboard/server.js`. It now resolves the script's
139
+ realpath and compares it to its own. (#206)
140
+ - `--status` printed a port it could not know: the PID file records only the pid, so it
141
+ reported whatever port that invocation happened to receive. Measured, `--status` on a
142
+ server started with `--port 7466` printed "port 7339". (#206)
143
+
144
+ **Memory**
145
+
146
+ - Every abandoned exit left a full copy of the database on disk — 1.8 GB of orphaned
147
+ `.tmp` files. (#199)
148
+ - The SDK's WebSocket client took the caller's process down on a failed reconnect. (#191)
149
+
150
+ **Verification**
151
+
152
+ - `mindforge verify`'s lint stage used `--max-warnings=0`, which made it impossible to
153
+ pass in the repository it ships from: on a clean clone `npx eslint .` reports 190 problems /
154
+ 0 errors / 190 warnings, so `verify` reported a lint FAILURE on a tree that is green by the
155
+ project's own contract. Aligned with the project's definition; errors still fail. (#204)
156
+ - `temporal cleanup` printed "🧹 Cleaning up old temporal snapshots..." and
157
+ "✅ Cleanup complete." with no cleanup between them. Now wired to
158
+ `TemporalHub.gc({maxSnapshots: 50, maxAgeDays: 30})` with `--dry-run` and honest
159
+ counts, including zero. (#209)
160
+
161
+ **Documentation that named things that do not exist**
162
+
163
+ - The protocol files instructed the agent to run `soul-engine.js` and
164
+ `shard-controller.js`, neither of which exists anywhere in the package. Those steps
165
+ are reasoning protocols and now say so. (#205)
166
+ - Fifteen phantom `/mindforge:` slash commands in shipped docs. A reader following
167
+ `docs/user-guide.md` typed `/mindforge:personas --list` and got nothing. They were not
168
+ typos: `.agent/workflows/` holds 130 tracked files using those exact names — an old
169
+ target layout, committed and orphaned, shipping zero files. (#209)
170
+ - Four documented CLI invocations could not be run, each verified by running it:
171
+ `npx mindforge-cc@latest install` (exit 1), `mindforge-cli.js dashboard` (exit 1),
172
+ `npx mindforge auto` in a shipped engine doc (`auto` is a slash command, never a CLI
173
+ verb), and `@mindforge <verb>`, a syntax that exists nowhere. (#213)
174
+ - `workflow` is the most-documented CLI verb in the project and works, but appeared in
175
+ neither `--help` nor the "Available commands" list, so a user who mistyped it was told
176
+ it does not exist. (#213)
177
+ - Root `CLAUDE.md` named `bin/hooks/mindforge-context-monitor.js`; the file is under
178
+ `.agent/hooks/`. (#214)
179
+
180
+ ### Added
181
+
182
+ - **`preflight` job on the release workflow.** Asserts the tagged commit is an ancestor
183
+ of `origin/main`, then runs the six gates a tag push never saw, with the publish job
184
+ behind `needs:`. (#216)
185
+ - **Automatic `stable` dist-tag movement**, forward-only and verified. (#216)
186
+ - **`node bin/dashboard/server.js --status` / `--stop`.** Not CLI verbs —
187
+ `mindforge-cli.js dashboard` does not route. (#206)
188
+ - **`mindforge temporal cleanup --dry-run`.** (#209)
189
+ - New regression gates, each falsified by mutation before being trusted:
190
+ `tests/protocol-claims.test.js` (no exemption list, deliberately — a name-keyed
191
+ allowlist was shown to excuse the exact defect it was written for), the shipped-doc
192
+ phantom-command gate, the CLI-verb gate, the authority-doc `.js` gate, the
193
+ version-channel round trips, and assertions that the release preflight itself cannot
194
+ be silently removed.
195
+
196
+ ### Notes for operators
197
+
198
+ - `npm run version:check` is the offline drift check. A bump is finished only when
199
+ `sync-version.js` exits 0 — if it prints `🔨 REQUIRE A BUILD`, run the three commands
200
+ it names and commit both regenerated files.
201
+ - Releases are now gated on being tagged from `main`. One residual, inherent to
202
+ tag-triggered workflows: a tag push resolves the workflow from the TAGGED ref, so a
203
+ tag placed on a commit predating this release runs that commit's workflow and is
204
+ ungated.
@@ -0,0 +1,155 @@
1
+ # Changelog
2
+
3
+ ## [11.9.4] — 2026-08-22 — Delivery: the gates register, the tarball matches its tag, three packages attested
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` 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.
81
+
82
+ - **The Homebrew formula carries the real 11.9.3 digest.** Verified against an independent
83
+ measurement rather than the tool's own output, and explicitly confirmed not to be the
84
+ SHA-256 of npm's 21-byte `{"error":"Not found"}` body — the constant #203 used to write
85
+ for every unpublished version. (#223)
86
+
87
+ **Honesty about what is enforced**
88
+
89
+ - **The README understated the product.** "What is actually enforced" still declared that
90
+ **no install channel registers hooks**, with a `No / No` table, and stated that the
91
+ plugin channel's dispatcher crashes on every fire. Measured: the plugin's
92
+ `scripts/lib/` exists, all **14** path tokens in `plugins/mindforge/hooks/hooks.json`
93
+ resolve under the plugin root, and driving the dispatcher by hand returns **exit 2** for
94
+ `mindforge-block-no-verify` and `mindforge-config-protection`. A document that
95
+ under-claims a security capability is the same defect as one that over-claims it —
96
+ either way it describes a system that is not the one shipped. Now stated per channel,
97
+ with the four cases that remain deliberately unenforced and the three liveness
98
+ preconditions outside MindForge's control. (#225)
99
+
100
+ **Defects the published-artifact audit found (#222)**
101
+
102
+ - The **v11.9.3 release page shipped empty**: `changelog-fetcher.js --latest` exits 0
103
+ while writing zero bytes, so the `||` fallback never fired and a 195-line changelog
104
+ reached nobody. The step now prefers the in-tree changelog and fails on an empty body.
105
+ - A **shipped CI snippet told users to `npx` a package we do not own**.
106
+ `npx mindforge …` resolves to an unrelated third-party package; in a fresh runner it is
107
+ fetched and unpacked, install scripts and all, inside a job holding `MINDFORGE_TOKEN`.
108
+ Now pinned with `--package=mindforge-cc`.
109
+ - The **version-source gate missed a live defect twice**. `mindforge health` printed
110
+ `RELEASE v0.4.2` and `Current : v11.9.3` twenty-six lines apart in a project declaring
111
+ 0.4.2, and produced `Unexpected end of JSON input` with no manifest at all — the verb
112
+ whose job is verifying installation integrity misreporting the installation. Widening
113
+ the gate surfaced two more of the same shape, one of which bound the **wrong** version
114
+ silently into approval records, which is worse than no binding because the check still
115
+ returns a verdict.
116
+ - `mindforge approve` died with ENOENT on any non-Node project. Absent values are now
117
+ recorded as `null` rather than invented.
118
+
119
+ **Test infrastructure**
120
+
121
+ - `tests/production.test.js` carried the uncommitted diff into its clone with
122
+ `git diff HEAD` (which includes staged files) but committed it with `commit -a` (which
123
+ stages only modified and deleted **tracked** files). So any commit **adding** a file
124
+ under `bin/` or `tests/` left the clone dirty and failed the gate's own cleanliness
125
+ assertion — reintroducing precisely the `--no-verify` pressure that carry exists to
126
+ avoid, for the one case it did not cover.
127
+
128
+ ### Added
129
+
130
+ New regression gates, each falsified by reinstating the exact defect and confirming RED,
131
+ with every touched file restored byte-exact afterwards:
132
+
133
+ - `tests/hook-registration-ancestor.test.js` — six properties, the first of which asserts
134
+ the ancestor detector fires at all, so the other five cannot pass by never triggering.
135
+ - `every shipped file is tracked in git` — property-based, no name list. It cannot fail on
136
+ a clean clone, which is how the real leak survived CI, so it is paired with a second
137
+ test that plants the runtime state in a throwaway clone and then packs.
138
+ - `all three published packages publish with provenance` — counts the `npm publish`
139
+ invocations rather than matching one, because a single-match regex was satisfied by
140
+ either of the two packages that already had an attestation while the SDK had none. Also
141
+ asserts the SDK step is idempotent and ordered after the proven publishes.
142
+
143
+ ### Notes for operators
144
+
145
+ - **These fixes change installer behaviour on almost every project.** After upgrading,
146
+ check `.mindforge/hook-registration.json` to see what was registered, and restart the
147
+ harness — hooks are snapshotted at session start.
148
+ - A registered hook is only *live* if the harness has been restarted, the project is
149
+ trusted in the harness, and `CLAUDE_PROJECT_DIR` is set with `node` on the hook PATH.
150
+ None of those three are in MindForge's control; the last is a deliberate trade against a
151
+ fail-closed shell tail that was measured denying benign commands on a fresh clone.
152
+ - Two gaps remain that require repository settings rather than code, and are recorded
153
+ rather than claimed fixed: there is no `v*` **tag ruleset** restricting who may create
154
+ the ref that triggers publishing, and `NPM_TOKEN` is a long-lived repository secret with
155
+ no GitHub environment in front of it.
@@ -33,8 +33,11 @@ and be followed by `=`. Prose bullets that merely mention `[KEY]` are not parsed
33
33
  Three more are **recommended** — absent ones produce a warning, not an error:
34
34
  `[COST_WARN_USD]`, `[COST_HARD_LIMIT_USD]`, `[BLOCK_ON_SECURITY]`.
35
35
 
36
- > `[COST_HARD_LIMIT_USD]` is **declared but not enforced** as of 11.9.2. Do not rely on it as a
37
- > spend control; see the CHANGELOG.
36
+ > `[COST_HARD_LIMIT_USD]` is **enforced from 11.9.3** (it was declared but inert in 11.9.2).
37
+ > `preflight()` refuses the model call once today's ledger spend plus the call estimate reaches
38
+ > the limit. Because the key is *recommended* rather than *required*, an absent key — or an
39
+ > explicit `0` — leaves the cap off; a present-but-unparseable value is a hard error
40
+ > (`COST_LIMIT_MISCONFIGURED`), not a silent bypass.
38
41
 
39
42
  ---
40
43
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Package
4
4
 
5
- `@mindforge/sdk`
5
+ `mindforge-sdk`
6
6
 
7
7
  ## Exports
8
8
 
@@ -146,7 +146,7 @@ Template for `.mindforge/codebase/ARCHITECTURE.md` - captures conceptual code or
146
146
 
147
147
  **CLI Command Execution:**
148
148
 
149
- 1. User runs: `mindforge new-project`
149
+ 1. User runs: `mytool new-project`
150
150
  2. Commander parses args and flags
151
151
  3. Command handler invoked (`src/commands/new-project.ts`)
152
152
  4. Handler calls service methods (`src/services/project.ts` → `create()`)
@@ -131,13 +131,12 @@ High-fidelity behaviors ported from the Superpowers library and hardened for pro
131
131
 
132
132
  | Command | Description |
133
133
  | :--- | :--- |
134
- | `/mindforge:brainstorming` | Deep exploratory protocol for intent clarification and architectural ideation. |
135
- | `/mindforge:swarm-execution` | Wave-based implemention for independent, non-conflicting tasks. |
136
- | `/mindforge:parallel-mesh` | Orchestrates a mesh of agent waves with automated dependency compaction. |
134
+ | *(protocol, not a command)* | Wave-based implementation for independent tasks see `.mindforge/engine/swarm-controller.md`. |
135
+ | *(protocol, not a command)* | Mesh of agent waves with dependency compaction — see `.mindforge/engine/wave-executor.md`. |
137
136
  | `/mindforge:workspace` | Manages isolated development environments via git worktrees with smart safety checks. |
138
- | `/mindforge:tdd` | Strict Test-Driven Development (Red-Green-Refactor) with automated test generation. |
137
+ | `/mindforge:skill-tdd` | Strict Test-Driven Development (Red-Green-Refactor) with automated test generation. |
139
138
  | `/mindforge:debug` | Systematic debugging using persistent state tracking and Root Cause Analysis. |
140
- | `/mindforge:verify-work` | Multi-level truth verification protocol (substance, existence, wiring). |
139
+ | `/mindforge:verify-phase` | Multi-level truth verification protocol (substance, existence, wiring). |
141
140
  | `/mindforge:retrospective` | Facilitates structured team retrospectives with objective telemetry and metrics. |
142
141
 
143
142
  ---
package/docs/faq.md CHANGED
@@ -1,4 +1,4 @@
1
- # MindForge FAQ (v11.9.0)
1
+ # MindForge FAQ (v11.9.4)
2
2
 
3
3
  ## Is MindForge tied to Claude only?
4
4
  No. MindForge supports Claude Code and Antigravity. Install with `--claude`,
@@ -55,13 +55,21 @@ 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.0 — verify with `node bin/mindforge-cli.js --version`
58
+ v11.9.4 — 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.
62
62
 
63
- **Q: What npm dist-tags point to v11.9.0?**
64
- Both `latest` and `stable`: `npx mindforge-cc@stable` or `npx mindforge-cc@latest`
63
+ **Q: Which npm dist-tag should I install?**
64
+ `latest` is every published release, including patches. `stable` tracks the newest
65
+ non-prerelease and is moved by the release workflow as its final step — forward only, so it
66
+ never regresses to an older version. Prerelease builds keep their own `rc` and `alpha` tags and
67
+ never become `stable`. Use `npx mindforge-cc@latest` unless you specifically want to lag a
68
+ release behind. Check what each points at right now with `npm dist-tag ls mindforge-cc`.
69
+
70
+ > This answer deliberately names no version. It previously claimed `latest` and `stable` both
71
+ > pointed at v11.9.0; measured, they were 11.9.2 and 11.8.3 — neither. A documented invariant
72
+ > survives releases, a documented value does not.
65
73
 
66
74
  ## Known Limitations
67
75
 
@@ -72,4 +80,16 @@ Spawn dispatch is not yet implemented in v11.9.0. Use `/mindforge:auto` or `/min
72
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.
73
81
 
74
82
  **Q: What is the test coverage?**
75
- 95/97 tests passing (0 failures, 2 permanently env-skipped). Line coverage ~66% — gaps are in `bin/source-loader.js` and `scripts/ci/validate-assets.js`. Target is 80% for v11.9.0.
83
+ 134 test files: 132 pass, 0 failures, 2 env-dependent skips (`browser.test.js` needs a Chromium
84
+ daemon, `sre-integration.test.js` needs git worktree support and a clean tree).
85
+
86
+ The enforced floor is **30% lines**, gated in CI by the `mindforge-quality` job
87
+ (`npx c8 --check-coverage --lines 30 --exclude 'plugins/**' --exclude 'mcp-server/dist/**'`).
88
+ The measured figure is printed by that job and deliberately not restated here. The previous
89
+ answer to this question was wrong in three ways at once — a test count from a much smaller
90
+ suite, a stale coverage figure, and two named coverage gaps that were no longer the gaps — and
91
+ it stayed wrong because none of it was checked by anything. `tests/doc-count-claims.test.js`
92
+ now pins every count this file does state.
93
+
94
+ Both `--exclude` flags are load-bearing: without them c8 measured the generated `plugins/` tree
95
+ and `mcp-server/dist/` esbuild output, which understated real coverage substantially.
@@ -1,4 +1,4 @@
1
- # MindForge — Getting Started (v11.9.0)
1
+ # MindForge — Getting Started (v11.9.4)
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.0`)
117
+ 2. **Check version:** `node bin/mindforge-cli.js --version` (should print `11.9.4`)
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`
@@ -140,4 +146,4 @@ MindForge operates on a high-velocity 4-pillar lifecycle:
140
146
 
141
147
  - Explore the [User Guide](user-guide.md) for advanced features.
142
148
  - Switch to a specialized [Persona](PERSONAS.md) for target tasks.
143
- - Join the community: `/mindforge:join-discord`.
149
+ - Join the community: https://github.com/sairam0424/MindForge/issues.