mindforge-cc 11.9.1 → 11.9.2

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 (48) hide show
  1. package/.agent/mindforge/consult.md +1 -1
  2. package/.agent/mindforge/cost-report.md +1 -1
  3. package/.claude/commands/mindforge/consult.md +1 -1
  4. package/.claude/commands/mindforge/cost-report.md +1 -1
  5. package/.mindforge/MINDFORGE-SCHEMA.json +126 -13
  6. package/.mindforge/config.json +3 -3
  7. package/.mindforge/engine/cost-tracking/router.md +1 -1
  8. package/.mindforge/engine/cost-tracking/token-ledger.md +21 -24
  9. package/.mindforge/memory/sync-manifest.json +1 -1
  10. package/.mindforge/metrics/METRICS-SCHEMA.md +13 -4
  11. package/.mindforge/personas/cost-optimizer.md +2 -2
  12. package/.mindforge/personas/multi-model-bridge.md +1 -1
  13. package/.mindforge/skills/cost-aware-routing/SKILL.md +3 -3
  14. package/.mindforge/skills/multi-llm-consult/SKILL.md +2 -2
  15. package/CHANGELOG.md +208 -0
  16. package/MINDFORGE.md +3 -3
  17. package/README.md +50 -2
  18. package/RELEASENOTES.md +53 -0
  19. package/bin/autonomous/audit-writer.js +48 -33
  20. package/bin/dashboard/api-router.js +11 -10
  21. package/bin/dashboard/error-response.js +44 -0
  22. package/bin/dashboard/frontend/index.html +20 -3
  23. package/bin/dashboard/metrics-aggregator.js +29 -8
  24. package/bin/dashboard/revops-api.js +12 -2
  25. package/bin/dashboard/server.js +85 -5
  26. package/bin/dashboard/temporal-api.js +11 -5
  27. package/bin/engine/remediation-engine.js +12 -1
  28. package/bin/engine/temporal-hub.js +41 -9
  29. package/bin/eval/eval-harness.js +212 -1
  30. package/bin/eval/golden-set-retrieval.json +9 -0
  31. package/bin/governance/policy-engine.js +8 -0
  32. package/bin/hindsight-injector.js +8 -2
  33. package/bin/hooks/instinct-capture-hook.js +7 -1
  34. package/bin/learning/instinct-cli.js +7 -24
  35. package/bin/memory/knowledge-capture.js +23 -3
  36. package/bin/memory/knowledge-graph.js +70 -31
  37. package/bin/memory/vector-hub.js +304 -31
  38. package/bin/mindforge-cli.js +43 -11
  39. package/bin/models/cost-tracker.js +22 -23
  40. package/bin/models/model-router.js +28 -7
  41. package/bin/models/usage-record.js +71 -0
  42. package/bin/utils/file-lock.js +106 -0
  43. package/bin/utils/mindforge-params.js +124 -0
  44. package/bin/validate-config.js +34 -16
  45. package/changelogs/v11.9.2.md +209 -0
  46. package/docs/References/config-reference.md +73 -14
  47. package/docs/sdk-reference.md +1 -1
  48. package/package.json +4 -2
@@ -0,0 +1,209 @@
1
+ # Changelog
2
+
3
+ ## [11.9.2] — 2026-08-16 — Correctness: audit-chain integrity, dashboard crash policy, secret scanning
4
+
5
+ Patch release. No new features. Correctness work closing defects found by a
6
+ multi-agent audit of v11.9.1, plus the regression suites that keep them closed.
7
+ Contains a breaking change to the dashboard HTTP surface — see BREAKING below.
8
+
9
+ ### BREAKING
10
+
11
+ Shipped under a PATCH bump. The break is confined to the dashboard's own HTTP
12
+ surface, which binds to 127.0.0.1 only — but if you script against it, read this.
13
+
14
+ - **Dashboard error responses changed shape.** `detail` is removed from 5 endpoints and
15
+ raw errno strings from 10 more; `correlation_id` is added to 15; a malformed request
16
+ body now returns `application/json` instead of express's `text/html` error page.
17
+ Anything parsing `detail` must correlate on the logged `correlation_id` instead. This
18
+ was deliberate — those fields leaked absolute filesystem paths, and therefore the
19
+ operator's username and home directory, into an unauthenticated response body
20
+ (`requireAuth` exempts GET).
21
+ - **The dashboard now EXITS on an unhandled rejection or uncaught exception** where
22
+ 11.9.1 logged and continued. If you supervise the process, expect restarts where you
23
+ previously saw a logged error. Rationale in the Fixed section below: log-and-continue
24
+ held client sockets open until the client timed out, and had made `shutdown()` swallow
25
+ a throwing token unlink and keep serving the authenticated mutation API after SIGTERM.
26
+ - **`node bin/validate-config.js` and `mindforge security-scan` can now fail.** They
27
+ previously reported `MINDFORGE.md valid — 0 settings configured` and exited 0 on every
28
+ input. If you run either in CI, a genuinely invalid registry will now red-line where it
29
+ used to pass. Note this reaches **fresh installs and `--force` reinstalls only** — the
30
+ installer does not overwrite an existing `.mindforge/MINDFORGE-SCHEMA.json`, so a plain
31
+ upgrade keeps the old permissive schema.
32
+
33
+ ### Fixed
34
+
35
+ - **`security-scan` could not fail.** `bin/validate-config.js` and
36
+ `bin/models/model-router.js` each parsed `MINDFORGE.md` with a plain `KEY=value` regex, but
37
+ the registry declares its 43 parameters as bracketed `[KEY] = value`. Every schema property
38
+ resolved to `undefined` and short-circuited, so the command reported
39
+ `MINDFORGE.md valid — 0 settings configured` and exited 0 on any input. The schema also had
40
+ no `required` key at all. Both parsers now share `bin/utils/mindforge-params.js`, which also
41
+ accepts the legacy plain form (`examples/starter-project/MINDFORGE.md` ships 28 such lines),
42
+ and the schema declares real `required`/`recommended` sets.
43
+ **Behaviour change for consumers:** three CI gates go from unfailable to failable —
44
+ `.github/workflows/mindforge-ci.yml:38`, `.gitlab-ci-mindforge.yml:12`, and
45
+ `.github/workflows/control-plane.yml:100`. If one red-lines on a valid value, the schema
46
+ bound is wrong; do not "fix" it by editing `MINDFORGE.md`. Model routing is unchanged —
47
+ 30 persona x tier combinations resolve identically.
48
+ - **Trace retrieval returned nothing usable.** Queries were wrapped as a single FTS phrase, so
49
+ any query containing one absent term scored zero; and `traces_search` was keyed on `trace_id`
50
+ rather than the primary key, so each span's DELETE evicted the previous span and only the last
51
+ span per trace stayed searchable — 2,270 of 5,117 content-bearing traces, 44.4%, unsearchable.
52
+ Queries are now tokenised, OR-joined and ranked by tf-idf (`matchinfo('pcnx')`); the index is
53
+ re-keyed and rebuilt losslessly from the base table. `bin/eval/eval-harness.js` and its golden
54
+ set had zero callers and are now reachable as `npm run eval:retrieval`, with the baseline
55
+ committed: mean recall@10 0.6417, nDCG 0.5698 over 519 documents.
56
+ - **The cost ledger reported two totals for one concept.** `sum(cost_usd)` was $13.73 while
57
+ `sum(total_cost_usd)` was $0.00, and `tests/dashboard.test.js` wrote the reader's field name,
58
+ so the mismatch tested green. `bin/models/usage-record.js` is now the single definition of the
59
+ ledger path, record shape, per-entry cost and day bucket. The configured `ledger_path` pointed
60
+ at `token-ledger.jsonl`, a file that has never existed; that ghost filename had spread to 17
61
+ places across 13 files and is now absent. The dashboard cost tile no longer renders `$0.00`
62
+ on a 500 — it had no `res.ok` check, and because errors return well-formed JSON the catch
63
+ never fired, making an outage indistinguishable from zero spend.
64
+ A maintainer tool, `scripts/purge-synthetic-usage.js`, removes fixture rows: dry-run by
65
+ default, backs up first, idempotent, and aborts leaving the ledger untouched if the rewrite
66
+ fails. It is run from a repository checkout — `scripts/` is not in the published tarball, so
67
+ installed consumers do not have it.
68
+ - **Audit hash chain could fork under concurrent writers.** `bin/autonomous/audit-writer.js`
69
+ read the chain head and appended with no mutual exclusion, and cached the head in-process
70
+ indefinitely — so once a second process appended, the first kept chaining from a superseded
71
+ hash. Added `bin/utils/file-lock.js` (a fail-closed advisory lock promoted from
72
+ `bin/learning/instinct-cli.js`, deliberately NOT from `.agent/bin/lib/state.cjs`, which
73
+ writes anyway when the lock cannot be taken) held across read-head-through-fsync, and made
74
+ the cached head carry the file size that witnesses it is still the tail. 8 concurrent
75
+ appenders went from 199 broken links + 4 forks per 200 entries to 0. A lock alone was
76
+ measured insufficient — it still left 2 breaks and 1 fork, because the stale cache is a
77
+ second, independent defect.
78
+ - **Knowledge-graph edge updates were lost under concurrency.** `deprecateEdge`,
79
+ `reinforceEdge` and `applyDecay` in `bin/memory/knowledge-graph.js` each did
80
+ `readAllEdges()` -> mutate -> append with no lock, and `addEdge` appended unserialised
81
+ against them. Measured at HEAD over 4 runs of 8 processes x 20 `reinforceEdge` calls:
82
+ 93-129 of 160 increments lost, final `traversal_count` 31-67 instead of 160. All four
83
+ write paths now hold the `graph-edges.jsonl` lock across read-through-append; the same
84
+ probe then loses 0 of 160 in every run, with no lock-acquisition failures.
85
+ - `bin/governance/policy-engine.js`: `logAudit`'s un-awaited audit write now has a
86
+ `.catch()` — a lock-contention failure is reported at the decision site instead of
87
+ escaping as an unhandled rejection.
88
+ - `bin/hooks/instinct-capture-hook.js` appended to the instinct store without the lock that
89
+ `instinct-cli`'s prune/import rewrite holds, so a hook append landing in that window was
90
+ clobbered by the rename. It now takes the same lock.
91
+ - `tests/v7-sovereign-security.test.js`: `new PolicyEngine()` no longer defaults
92
+ `planningDir` to `process.cwd()`, which appended test verdicts to the operator's real
93
+ `.planning/RISK-AUDIT.jsonl`.
94
+ - Packaging: `package.json` files[] now excludes `**/*.lock` so a lockfile orphaned by a
95
+ hard kill cannot leak into the npm tarball (verified: without the negation, a
96
+ `.mindforge/memory/graph-edges.jsonl.lock` does ship).
97
+
98
+ - **Audit-chain forgery via un-awaited rollback.** `HindsightInjector.inject` called
99
+ the async `TemporalHub.rollbackTo` without `await`, so its rejection escaped the
100
+ surrounding `try/catch` while execution continued: a failed rollback still fsync'd a
101
+ hash-chained `hindsight_injected` entry and flipped `auto-state.json` to
102
+ `awaiting_regeneration` for something that never happened. The log gained a
103
+ cryptographically valid record of a non-event, and `verify-audit` reported the chain
104
+ valid — valid and wrong.
105
+ - **CLI `defaultArgs` were replaced by user arguments, not prepended.** `mindforge
106
+ health <anything>` lost `--check` and fell through to `installer-core`'s real
107
+ `install()` with `force: true`. Now prepended.
108
+ - **`_verifyMetadata` compared UTF-16 code units, not bytes**, so a 64-unit / 65-byte
109
+ `integrity` still threw `RangeError` — and the caller degraded that throw into
110
+ "proceeding without integrity check" and restored the snapshot anyway. Read and
111
+ verify are now separate stages; only a genuinely absent `SNAPSHOT-META.json` reaches
112
+ the tolerant path.
113
+ - **Dashboard `RevOpsAPI` was required but never mounted**, so `/api/revops/overview`
114
+ 404'd while the AgRevOps panels and docs described it as live. Even mounted it threw:
115
+ `getAuditEntries()` returns `{entries,total,limit,offset}` and three engines call
116
+ `.filter()` on it.
117
+ - **Dashboard leaked error internals to clients.** `err.message` reached response
118
+ bodies from 14 sites (`api-router.js` ×10, `temporal-api.js` ×3, `revops-api.js` ×1);
119
+ for fs-sourced errors that string carries absolute paths, disclosing the operator's
120
+ username and home directory. All sites now log server-side and return a generic
121
+ message plus a `correlation_id`, behind a 4-arg terminal handler that stops express
122
+ rendering `err.stack` when `NODE_ENV !== 'production'`.
123
+ - **Test runner discovery was a flat `readdirSync`**, so any suite in a subdirectory was
124
+ invisible. Now a recursive walk that prunes `tmp-*` / `node_modules` / dot
125
+ directories — directories only, never files.
126
+ - Three orphan files removed: one truncated `.planning/AUDIT.jsonl` to zero, one
127
+ overwrote `.planning/STATE.md`, one called a function absent from `bin/`. Recursion
128
+ made the `STATE.md` clobberer reachable by a single in-place rename; the other two
129
+ were unreachable by the runner at any depth. **The claim in `5177225`'s message that
130
+ all three were newly armed by recursion is correct for one of the three and
131
+ over-attributed for the other two.**
132
+ - Three relocated demos kept one-level-up requires after moving a directory deeper, so
133
+ all three exited 1; corrected to `../../bin/`.
134
+
135
+ ### Changed
136
+
137
+ - **`mindforge audit-skill`, `register-skill`, `install-skill` and `record-learning` no
138
+ longer carry `defaultArgs`.** Prepending turned them from inert into live state
139
+ writers: `audit-skill <name> <ver> <tier>` appended a hash-chained
140
+ `{event:'skill_installed', validation_passed:true}` entry for a skill that does not
141
+ exist, and `register-skill` wrote a malformed row above the table header of
142
+ `.mindforge/org/skills/MANIFEST.md`, which ships in the tarball. Bare invocations now
143
+ print usage and exit 0 without reaching those writers, as at v11.9.1.
144
+ - **`subagent` is a first-class command.** Prepending `spawn` shadowed `spawn-agent`'s
145
+ `subagent` mode, whose documented route was `mindforge spawn subagent <name>`.
146
+ - **The dashboard now exits on an unhandled rejection instead of logging and
147
+ continuing.** An escaped rejection is the only reliable signal that an async call was
148
+ left un-awaited, and express 4.22.1 does not route async handler rejections to error
149
+ middleware — log-and-continue held the client socket open until the client gave up
150
+ (2.5s, 4s and 8s clients all timed out) versus a ~15ms reset on exit. Symmetric with
151
+ `uncaughtException`, whose log-and-continue form had made `shutdown()` swallow a
152
+ throwing token unlink and keep serving the token-authenticated mutation API **after
153
+ SIGTERM**, with the bearer token still on disk and valid in memory.
154
+ - **Dashboard error responses changed shape.** `detail` is removed from 5 endpoints,
155
+ raw errno strings from 10 more, `correlation_id` is added to 15, and a malformed
156
+ request body now returns `application/json` rather than express's `text/html` error
157
+ page. Anything parsing `detail` must correlate on the logged id instead.
158
+
159
+ ### Added
160
+
161
+ - **Secret scanning enforced at three layers**: `.gitleaks.toml`, a `.husky/pre-commit`
162
+ gate that fails loudly when gitleaks is absent rather than skipping, and
163
+ `.github/workflows/secret-scan.yml` scanning full history. `scripts/ci/verify-secret-scan.sh`
164
+ self-tests the scanner — it distinguishes "scanned clean" from "scanned and found"
165
+ from "did not scan", because gitleaks exits 1 for both a finding and a failed config
166
+ load, and writes no report in the latter case.
167
+
168
+ ### Tests
169
+
170
+ - Suite totals for this release: **105 files, 103 pass, 2 environment-dependent skips**
171
+ (`browser`, `sre-integration`). Eight new suites across the release:
172
+ `temporal-integrity`, `dashboard-error-leak`, `dashboard-crash-guards`,
173
+ `dashboard-wiring`, `cli-router`, `mindforge-params`, `file-lock`, `retrieval-fts`.
174
+ - **Four suites could not report failure and now can.** `v8-persistence`,
175
+ `v8-skill-evolution` and `v8-orbital-governance` ended `finally { process.exit(0) }`, and
176
+ `v7-pillar-integration` had zero assertions with a premium-model gate that named two models
177
+ absent from the registry for several releases. `npm test` is the only quality step before
178
+ `npm publish`, and the runner gates on child exit codes, so a blind suite blinded the publish
179
+ gate. Verified by injected failure rather than inspection.
180
+ `dashboard-wiring` derives the expected router set
181
+ from `server.js`'s own requires, so adding a router without mounting it fails.
182
+ `cli-router` runs against a mirror-root sandbox under `os.tmpdir()` — required, not
183
+ tidiness: the case that proves audit forgery is prevented would otherwise forge an
184
+ entry into the real chain on every run. `revops-roi.test.js` had 0 assertions and
185
+ could not fail; it now has 6.
186
+
187
+ ### Not fixed — deferred to v12
188
+
189
+ - **No hook is registered in any consumer install.** The installer copies 9 hook
190
+ scripts into `<runtime>/hooks/`, but nothing writes `.claude/settings.json` and it is
191
+ absent from `package.json` `files[]`. Verified by installing the tarball into a
192
+ scratch project. Every gate this release hardens is inert until that lands.
193
+ - **`requireAuth` exempts GET and OPTIONS**, so every read route — including
194
+ `/api/audit`, which serves the hash-chained audit log — is credential-free to any
195
+ local process. Mutations are protected. This is a threat-model decision, not a patch.
196
+ - **`audit-skill audit <name> <ver> <tier>`** — the explicit form — still reaches a
197
+ writer that performs no existence check and hardcodes `validation_passed: true`. Only
198
+ the bare invocation is closed.
199
+ - **Snapshot integrity is not an authenticity control.** `HMAC_KEY` is a literal in
200
+ shipped source, the HMAC covers only the metadata object so file **contents** are
201
+ unsigned (editing a file inside a signed snapshot leaves the signature valid), and
202
+ deleting `SNAPSHOT-META.json` bypasses verification entirely.
203
+ - `cwd: ROOT` in the CLI, which resolves consumer state inside `node_modules`.
204
+ - `security-scan` cannot fail: its parser expects `KEY=value` while `MINDFORGE.md` uses
205
+ `[KEY] = value`, so it always reports 0 settings and exits 0.
206
+ - Version drift in six publishable manifests (`Formula/mindforge.rb`, `Dockerfile`,
207
+ `mcp-server/server.json`, `mcp-server/src/index.ts`, the plugin manifest and the
208
+ marketplace entry) is untouched here — none is gated, and the Formula pins a tarball
209
+ sha256 that cannot exist before publish.
@@ -4,24 +4,83 @@
4
4
 
5
5
  ---
6
6
 
7
+ ## 0. Syntax and required keys
8
+
9
+ **Read this first.** As of 11.9.2 `node bin/validate-config.js` and
10
+ `mindforge security-scan` can actually fail — before that they reported
11
+ `0 settings configured` and exited 0 on any input, so an invalid registry passed silently.
12
+
13
+ Two syntaxes are accepted:
14
+
15
+ ```text
16
+ [PLANNER] = claude-opus-4-7 # bracketed — CANONICAL, what the shipped MINDFORGE.md uses
17
+ PLANNER_MODEL=claude-opus-4-7 # plain — legacy, still read, used by examples/starter-project
18
+ ```
19
+
20
+ Prefer the bracketed form. A bracketed key must open the line (leading whitespace is allowed)
21
+ and be followed by `=`. Prose bullets that merely mention `[KEY]` are not parsed as settings.
22
+
23
+ **These five keys are REQUIRED.** Validation exits 1 if any is missing:
24
+
25
+ | Key | Example |
26
+ | :--- | :--- |
27
+ | `[VERSION]` | `11.9.2` — must match `^\d+\.\d+\.\d+$` |
28
+ | `[REACTIVE_MODE]` | `true` |
29
+ | `[PLANNER]` | `claude-opus-4-7` |
30
+ | `[EXECUTOR]` | `claude-sonnet-4-6` |
31
+ | `[MIN_SOUL_SCORE]` | `8` (range 0–10) |
32
+
33
+ Three more are **recommended** — absent ones produce a warning, not an error:
34
+ `[COST_WARN_USD]`, `[COST_HARD_LIMIT_USD]`, `[BLOCK_ON_SECURITY]`.
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.
38
+
39
+ ---
40
+
7
41
  ## 1. Model Configuration
8
42
 
9
43
  MindForge uses a tiered model routing system. You can specify exact models for different phases of the lifecycle.
10
44
 
11
- | Key | Description | Default |
12
- | :--- | :--- | :--- |
13
- | `PLANNER_MODEL` | Model used for task decomposition and planning. | `claude-sonnet-4-5` |
14
- | `EXECUTOR_MODEL` | Model used for code generation and implementation. | `claude-sonnet-4-5` |
15
- | `REVIEWER_MODEL` | Model used for code review and PR analysis. | `claude-opus-4-alpha` |
16
- | `VERIFIER_MODEL` | Model used for testing and UAT verification. | `claude-sonnet-4-5` |
17
- | `SECURITY_MODEL` | Model used for sensitive security scanning. | `claude-opus-4-alpha` |
18
-
19
- **Supported Values:**
20
-
21
- - `claude-opus-4-alpha` (High intelligence, slow, expensive)
22
- - `claude-sonnet-4-5` (Balanced, recommended)
23
- - `claude-haiku-4-5` (Fast, logical, best for trivial tasks)
24
- - `inherit` (Use the system-wide default)
45
+ The canonical keys are the short bracketed forms; the `*_MODEL` names are accepted aliases kept
46
+ for older configs.
47
+
48
+ | Key | Alias | Description | Shipped default |
49
+ | :--- | :--- | :--- | :--- |
50
+ | `[PLANNER]` | `PLANNER_MODEL` | Task decomposition and planning. | `claude-opus-4-7` |
51
+ | `[EXECUTOR]` | `EXECUTOR_MODEL` | Code generation and implementation. | `claude-sonnet-4-6` |
52
+ | `[REVIEWER]` | `REVIEWER_MODEL` | Code review and PR analysis. | `claude-sonnet-4-6` |
53
+ | `[VERIFIER]` | `VERIFIER_MODEL` | Testing and UAT verification. | `claude-sonnet-4-6` |
54
+ | `[SECURITY]` | `SECURITY_MODEL` | Sensitive security scanning. | `claude-opus-4-7` |
55
+ | `[DEBUG]` | — | Debugging and root-cause analysis. | `claude-opus-4-7` |
56
+
57
+ **Values are free-form strings** — the schema does not constrain them to a list, so a new model
58
+ id works without a framework upgrade. The ids shipped in `MINDFORGE.md` today are
59
+ `claude-opus-4-7`, `claude-sonnet-4-6` and `claude-haiku-4-5`; `inherit` selects the
60
+ system-wide default. Because the values are unconstrained, a typo is NOT caught by validation —
61
+ it falls through to the routing defaults.
62
+
63
+ ---
64
+
65
+ ## 1b. Numeric bounds enforced by validation
66
+
67
+ Out-of-range values now fail. These were previously documented nowhere a consumer reads.
68
+
69
+ | Key | Range | Key | Range |
70
+ | :--- | :--- | :--- | :--- |
71
+ | `MIN_SOUL_SCORE` | 0–10 | `MAX_TASKS_PER_PHASE` | 1–50 |
72
+ | `AUTO_SWARM_THRESHOLD` | 0–10 | `MIN_TEST_COVERAGE_PCT` | 0–100 |
73
+ | `DYNAMISM_LEVEL` | 1–5 | `MAX_FUNCTION_LINES` | 10–200 |
74
+ | `ADS_DEBATE_ROUNDS` | 1–10 | `MAX_CYCLOMATIC_COMPLEXITY` | 3–30 |
75
+ | `COMPACTION_THRESHOLD_PCT` | 50–90 | `MAX_FULL_SKILL_INJECTIONS` | 1–10 |
76
+ | `DASHBOARD_PORT` | 1024–65535 | `NEXUS_TRACE_RETENTION_DAYS` | 1–365 |
77
+ | `BROWSER_PORT` | 1024–65535 | `SHARD_RETAIN_DAYS` | 1–365 |
78
+ | `COST_WARN_USD` | 0–10000 | `AI_REVIEW_DAILY_LIMIT` | 0–500 |
79
+ | `COST_HARD_LIMIT_USD` | 0–10000 | `CI_MIN_COVERAGE_PCT` | 0–100 |
80
+ | `VERIFY_PASS_RATE_WARNING_THRESHOLD` | 0–1 | `DISCUSS_PHASE_REQUIRED_ABOVE_DIFFICULTY` | 1–5 |
81
+
82
+ If one of these rejects a value you consider legitimate, the bound is wrong — report it rather
83
+ than editing your registry to satisfy it.
25
84
 
26
85
  ---
27
86
 
@@ -417,6 +417,6 @@ cd sdk && npm install && npm run build
417
417
 
418
418
  ## Installation
419
419
  ```bash
420
- npm install mindforge-sdk@11.8.0
420
+ npm install mindforge-sdk@11.9.1
421
421
  # or: npx mindforge-cc@stable # installs SDK as part of the framework
422
422
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mindforge-cc",
3
- "version": "11.9.1",
3
+ "version": "11.9.2",
4
4
  "description": "MindForge \u2014 Sovereign Agentic Intelligence Framework. Sovereign Stability: Production-Hardened Agentic Intelligence (v11)",
5
5
  "bin": {
6
6
  "mindforge-cc": "bin/install.js",
@@ -53,7 +53,8 @@
53
53
  "MINDFORGE.md",
54
54
  "README.md",
55
55
  "RELEASENOTES.md",
56
- "SECURITY.md"
56
+ "SECURITY.md",
57
+ "!**/*.lock"
57
58
  ],
58
59
  "scripts": {
59
60
  "test": "node scripts/ci/validate-assets.js && node tests/run-all.js",
@@ -64,6 +65,7 @@
64
65
  "harness:compliance": "node bin/installer/harness-adapter-compliance.js --check",
65
66
  "release:ready": "node bin/utils/readiness-gate.js release",
66
67
  "validate:assets": "node scripts/ci/validate-assets.js",
68
+ "eval:retrieval": "node bin/eval/eval-harness.js --set golden-set-retrieval.json --min-recall 0.55",
67
69
  "commit": "cz",
68
70
  "prepare": "husky"
69
71
  },