mindforge-cc 11.9.2 → 11.9.3

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 (94) 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 +2 -2
  29. package/.mindforge/engine/temporal-protocol.md +2 -2
  30. package/.mindforge/governance/change-classifier.md +20 -4
  31. package/.mindforge/memory/sync-manifest.json +1 -1
  32. package/.mindforge/skills/agent-architecture-audit/SKILL.md +2 -2
  33. package/.mindforge/skills/orch-pipeline/SKILL.md +4 -4
  34. package/CHANGELOG.md +194 -0
  35. package/MINDFORGE.md +13 -6
  36. package/README.md +4 -3
  37. package/RELEASENOTES.md +2 -2
  38. package/SECURITY.md +22 -3
  39. package/bin/autonomous/auto-runner.js +65 -2
  40. package/bin/change-classifier.js +151 -16
  41. package/bin/dashboard/api-router.js +18 -38
  42. package/bin/dashboard/frontend/app.js +429 -0
  43. package/bin/dashboard/frontend/index.html +13 -406
  44. package/bin/dashboard/metrics-aggregator.js +46 -22
  45. package/bin/dashboard/server.js +160 -1
  46. package/bin/dashboard/sse-bridge.js +11 -8
  47. package/bin/engine/sre-manager.js +1 -1
  48. package/bin/engine/temporal-cli.js +56 -6
  49. package/bin/engine/verification-runner.js +134 -17
  50. package/bin/engine/verify-cli.js +25 -7
  51. package/bin/governance/approval-record.js +147 -0
  52. package/bin/governance/approve.js +12 -7
  53. package/bin/governance/policy-engine.js +33 -3
  54. package/bin/governance/policy-gate-hardened.js +36 -1
  55. package/bin/governance/verify-approvals.js +163 -0
  56. package/bin/harness-audit.js +224 -10
  57. package/bin/hooks/instinct-capture-hook.js +12 -4
  58. package/bin/install.js +63 -3
  59. package/bin/installer/harness-adapter-compliance.js +339 -28
  60. package/bin/installer/hook-registration.js +504 -0
  61. package/bin/installer-core.js +451 -63
  62. package/bin/learning/instinct-cli.js +7 -0
  63. package/bin/memory/vector-hub.js +196 -13
  64. package/bin/migrations/0.6.0-to-1.0.0.js +30 -25
  65. package/bin/migrations/1.0.0-to-2.0.0.js +22 -23
  66. package/bin/mindforge-cli.js +67 -6
  67. package/bin/models/cost-tracker.js +104 -6
  68. package/bin/models/model-client.js +6 -1
  69. package/bin/revops/debt-monitor.js +57 -13
  70. package/bin/security/trust-gate-hook.js +50 -6
  71. package/bin/skill-validator.js +6 -1
  72. package/bin/skills-builder/skill-scorer.js +46 -6
  73. package/bin/updater/self-update.js +6 -1
  74. package/bin/updater/version-comparator.js +21 -1
  75. package/bin/utils/mindforge-version.js +99 -0
  76. package/bin/utils/redact-secrets.js +106 -0
  77. package/bin/validate-config.js +42 -2
  78. package/bin/wizard/setup-wizard.js +4 -1
  79. package/bin/wizard/theme.js +9 -1
  80. package/changelogs/index.json +11 -9
  81. package/changelogs/v11.9.3.md +195 -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 +3 -3
  88. package/docs/sdk-reference.md +15 -7
  89. package/docs/troubleshooting.md +10 -6
  90. package/docs/user-guide.md +14 -14
  91. package/examples/sdk-integration/README.md +1 -1
  92. package/package.json +7 -3
  93. package/subagents/.claude-plugin/marketplace.json +1 -1
  94. package/bin/dashboard/approval-handler.js +0 -136
@@ -34,7 +34,7 @@ with `$ARGUMENTS` as the request and `operation = add-feature`. The engine will:
34
34
  3. TDD each task via `mindforge-tdd_extended` (new failing tests → green), then
35
35
  `/mindforge:review` (+ the `quick.md` security auto-trigger / `security-reviewer`
36
36
  if a security trigger is touched).
37
- 4. Commit as conventional `feat(...)` commits, each writing a Merkle-linked
37
+ 4. Commit as conventional `feat(...)` commits, each writing a hash-chained
38
38
  AUDIT.jsonl entry. → **GATE 2** (confirm before commit).
39
39
 
40
40
  Honor both gates — do not write implementation before Gate 1, do not commit
@@ -42,7 +42,7 @@ with `$ARGUMENTS` as the doc path and `operation = build-mvp` (default floor:
42
42
  > the orch-pipeline skill.
43
43
  4. `/mindforge:review` (+ the `quick.md` security auto-trigger / `security-reviewer`
44
44
  on any security-trigger slice), then commit the scaffold and each slice as
45
- separate conventional `feat(...)` commits, each writing a Merkle-linked
45
+ separate conventional `feat(...)` commits, each writing a hash-chained
46
46
  AUDIT.jsonl entry. → **GATE 2**.
47
47
 
48
48
  If `$ARGUMENTS` is empty, ask the user for the path to the design/spec doc.
@@ -36,7 +36,7 @@ with `$ARGUMENTS` as the request and `operation = change-feature`. The engine wi
36
36
  first is what makes this a tweak, not a fix.)
37
37
  4. `/mindforge:review` (+ the `quick.md` security auto-trigger / `security-reviewer`
38
38
  on a security trigger), then commit as conventional `feat(...)` / `refactor(...)`
39
- + Merkle-linked AUDIT.jsonl entry. → **GATE 2**.
39
+ + hash-chained AUDIT.jsonl entry. → **GATE 2**.
40
40
 
41
41
  Use this only when the feature **works** but should behave differently — not for
42
42
  bugs (`/mindforge:orch-fix-defect`) or net-new capability
@@ -33,7 +33,7 @@ with `$ARGUMENTS` as the request and `operation = fix-defect`. The engine will:
33
33
  this a fix, not a tweak.)
34
34
  3. `/mindforge:review` (+ the `quick.md` security auto-trigger / `security-reviewer`
35
35
  if the defect sits in a sensitive path).
36
- 4. Commit as a conventional `fix(...)` commit + Merkle-linked AUDIT.jsonl entry.
36
+ 4. Commit as a conventional `fix(...)` commit + hash-chained AUDIT.jsonl entry.
37
37
  → **GATE 2** (confirm before commit).
38
38
 
39
39
  Use this only when behavior is **broken/wrong** — not for intentional changes
@@ -35,7 +35,7 @@ with `$ARGUMENTS` as the request and `operation = refine-code`. The engine will:
35
35
  — the existing suite proves behavior is unchanged). Dead-code/dup sweeps
36
36
  delegate to `/mindforge:de-slop`.
37
37
  4. `/mindforge:review`, then commit as `refactor(...)` (the diff must be
38
- behavior-neutral) + Merkle-linked AUDIT.jsonl entry. → **GATE 2**.
38
+ behavior-neutral) + hash-chained AUDIT.jsonl entry. → **GATE 2**.
39
39
 
40
40
  Use this only when behavior must **not** change. If behavior should change at
41
41
  all, use `/mindforge:orch-change-feature` or `/mindforge:orch-fix-defect`.
@@ -1,11 +1,11 @@
1
1
  ---
2
- description: @mindforge qa [--phase N] [--auto]
2
+ description: /mindforge:qa [--phase N] [--auto]
3
3
  ---
4
4
 
5
5
  # /mindforge:qa
6
6
 
7
7
  ## Usage
8
- `@mindforge qa [--phase N] [--auto]`
8
+ `/mindforge:qa [--phase N] [--auto]`
9
9
 
10
10
  ## Description
11
11
  Runs systematic visual QA on UI surfaces changed in the current phase.
package/.claude/CLAUDE.md CHANGED
@@ -25,25 +25,37 @@ You are a **Dynamic Multi-Agent Swarm (Agentic Mesh)**. Your mission is to execu
25
25
 
26
26
  ## 🛠️ CORE PROTOCOLS (The "How")
27
27
 
28
+ > **These are protocols you follow, not modules you call.** `SwarmController`, `PersonaFactory`
29
+ > and `WaveExecutor` are role names in the specs under `.mindforge/engine/`, not importable code —
30
+ > there is no file by any of those names. Every step below is something you do by reasoning and by
31
+ > using your own tools. Where a real executable exists, it is named with its path.
32
+
28
33
  ### 1. Swarm Dynamic Orchestration (V4)
29
34
  **IF** task complexity/impact is high **OR** cross-disciplinary logic is required:
30
- 1. Invoke `SwarmController` and activate `mindforge-swarm-execution`.
35
+ 1. Adopt the swarm-orchestration protocol described in `.mindforge/engine/`.
31
36
  2. Spawn task-specific ephemeral specialist cluster (AIEngineering, Security, etc.).
32
- 3. Inject knowledge patches via `PersonaFactory` (Context7).
33
- 4. Execute parallel mesh waves via `WaveExecutor` guided by `mindforge-parallel-mesh_extended`.
37
+ 3. Load the relevant persona brief from `.mindforge/personas/` before each specialist acts.
38
+ 4. Execute parallel mesh waves, consolidating dependent work before independent work.
34
39
  5. Consolidate mesh findings into a single `SWARM-SUMMARY`.
35
40
 
36
41
  ### 2. The Sharded Memory Loop (SRD)
37
42
  **IF** context ≥ 70% **OR** starting a new task:
38
- 1. Initialize `shard-controller.js`.
39
- 2. Rotate context per the Tri-Tier strategy (Hot/Warm/Cold).
40
- 3. Inject only sharded relevant data into the active buffer.
43
+ 1. Rotate context per the Tri-Tier strategy (Hot/Warm/Cold) yourself — this is an advisory
44
+ discipline, not an automated step.
45
+ 2. Inject only sharded relevant data into the active buffer.
46
+ 3. Re-read the current phase's plan rather than carrying stale detail forward.
41
47
 
42
48
  ### 3. The Adversarial Decision Loop (ADS)
43
49
  **BEFORE** committing any architectural change:
44
- 1. Spawn Red-Team/Blue-Team debate contexts.
45
- 2. Run `soul-engine.js` on the proposed diff.
46
- 3. **STOP** if SOUL Score < `[MIN_SOUL_SCORE]` from MINDFORGE.md.
50
+ 1. Spawn Red-Team/Blue-Team debate contexts and argue the change against itself.
51
+ 2. Score the proposal on impact, leverage, reversibility, effort, risk and cost.
52
+ 3. **STOP** if the resulting SOUL Score < `[MIN_SOUL_SCORE]` from MINDFORGE.md.
53
+
54
+ ADS is a reasoning protocol you run, not a command. Do not look for a script: measured, the two
55
+ scripts this section used to name (soul-engine.js and shard-controller.js) do not exist
56
+ anywhere in the package. The nearest real implementation, `runADSSynthesis()` in
57
+ `bin/review/ads-engine.js`, is a library with a single internal caller, exposes no CLI, and takes
58
+ `{phaseNum, goal, context, sessionId}` rather than a diff, so it cannot be invoked here either.
47
59
 
48
60
  ### 4. Standard Extended Protocols (Quality Gates)
49
61
  **MANDATORY**: For specific workflows, activate the corresponding `_extended` protocol:
@@ -78,18 +90,26 @@ Prioritize based on `[REACTIVE_MODE]` in MINDFORGE.md. These are the **Quality g
78
90
  - [ ] **AgRevOps Check**: Verify ROI trends and Security Health Score via `/api/revops`.
79
91
  - [ ] **PLAN-FIRST RULE**: Never code without a verified XML plan.
80
92
  - [ ] **Verify First**: Never task-complete without successful `<verify>` output.
81
- - [ ] **Audit Always**: Write a JSONL entry for every significant session event. All entries must be Merkle-linked.
93
+ - [ ] **Audit Always**: Write a JSONL entry for every significant session event. The result is a hash-chained append-only audit log (SHA-256 back-links): each entry sets `previous_hash` to the prior entry's `_hash`.
82
94
 
83
95
  ---
84
96
 
85
97
  ## ⚡ COMMAND SUITE
86
98
 
99
+ Every entry below has a backing command file, checked by `tests/protocol-claims.test.js`. Two that
100
+ did not (the brainstorming and history entries) are gone: neither existed in
101
+ `.claude/commands/mindforge/` or `.agent/mindforge/` (both hold exactly 221 files, so this was not
102
+ a mirror gap), and neither had a near-match to correct to. Temporal history is reachable, just not
103
+ as a slash command, so it is named as what it actually is.
104
+
87
105
  - `/mindforge:next` — Primary auto-discovery.
88
106
  - `/mindforge:auto` — Reactive engine start.
89
- - `/mindforge:brainstorming` — Creative & architectural exploration.
90
- - `/mindforge:history` — Temporal Hub access.
107
+ - `/mindforge:plan-phase` — Plan the next phase before writing code.
108
+ - `/mindforge:verify-phase` — Verify the phase against its plan.
91
109
  - `/mindforge:status` — Project health & sharding state.
92
110
  - `/mindforge:audit` — Day 4 governance access.
111
+ - `mindforge temporal <status|cleanup|inject>` — reasoning-history access (a CLI command, not a
112
+ slash command).
93
113
 
94
114
  ---
95
115
 
@@ -109,7 +129,11 @@ Adopt the Principal AI persona. Be instruction-dense, unambiguous, and architect
109
129
 
110
130
  **Source of Truth Hierarchy**:
111
131
 
112
- 1. SOUL.md (Sovereign Identity — Behavioral OS)
132
+ 1. SOUL.md (Sovereign Identity — Behavioral OS). **Not shipped in the package**, and generated
133
+ locally rather than installed: `bin/memory/identity-synthesizer.js` creates and evolves it. If
134
+ your project has no SOUL.md, this entry is vacant and authority passes to MINDFORGE.md — do not
135
+ infer its contents. The prompt-defense baseline it carries is reproduced verbatim at the top of
136
+ this file, so that part reaches you either way.
113
137
  2. MINDFORGE.md (Parameter Registry)
114
138
  3. .agent/CLAUDE.md (Protocols)
115
139
  4. `.mindforge/` (Framework Binary Logic)
@@ -1,11 +1,11 @@
1
1
  ---
2
- description: "@mindforge browse <url | action>"
2
+ description: "/mindforge:browse <url | action>"
3
3
  ---
4
4
 
5
5
  # /mindforge:browse
6
6
 
7
7
  ## Usage
8
- `@mindforge browse <url | action>`
8
+ `/mindforge:browse <url | action>`
9
9
 
10
10
  ## Description
11
11
  Controls the persistent MindForge browser daemon.
@@ -61,7 +61,7 @@ Remove old checkpoints, keeping the last 5.
61
61
 
62
62
  ## AUDIT linkage
63
63
 
64
- Each create/verify optionally writes a Merkle-linked AUDIT.jsonl entry:
64
+ Each create/verify optionally writes a hash-chained AUDIT.jsonl entry:
65
65
 
66
66
  ```json
67
67
  { "event": "checkpoint_created", "name": "core-done", "sha": "abc1234", "tests_pass_rate": 1.0, "coverage": 0.0 }
@@ -31,7 +31,7 @@ LLM layer judges *whether it matters here* and proposes the highest-leverage fix
31
31
 
32
32
  ## Step 3 — Report + AUDIT entry
33
33
 
34
- Summarize the scorecard, then write a Merkle-linked AUDIT.jsonl entry:
34
+ Summarize the scorecard, then write a hash-chained AUDIT.jsonl entry:
35
35
 
36
36
  ```json
37
37
  {
@@ -34,7 +34,7 @@ with `$ARGUMENTS` as the request and `operation = add-feature`. The engine will:
34
34
  3. TDD each task via `mindforge-tdd_extended` (new failing tests → green), then
35
35
  `/mindforge:review` (+ the `quick.md` security auto-trigger / `security-reviewer`
36
36
  if a security trigger is touched).
37
- 4. Commit as conventional `feat(...)` commits, each writing a Merkle-linked
37
+ 4. Commit as conventional `feat(...)` commits, each writing a hash-chained
38
38
  AUDIT.jsonl entry. → **GATE 2** (confirm before commit).
39
39
 
40
40
  Honor both gates — do not write implementation before Gate 1, do not commit
@@ -42,7 +42,7 @@ with `$ARGUMENTS` as the doc path and `operation = build-mvp` (default floor:
42
42
  > the orch-pipeline skill.
43
43
  4. `/mindforge:review` (+ the `quick.md` security auto-trigger / `security-reviewer`
44
44
  on any security-trigger slice), then commit the scaffold and each slice as
45
- separate conventional `feat(...)` commits, each writing a Merkle-linked
45
+ separate conventional `feat(...)` commits, each writing a hash-chained
46
46
  AUDIT.jsonl entry. → **GATE 2**.
47
47
 
48
48
  If `$ARGUMENTS` is empty, ask the user for the path to the design/spec doc.
@@ -36,7 +36,7 @@ with `$ARGUMENTS` as the request and `operation = change-feature`. The engine wi
36
36
  first is what makes this a tweak, not a fix.)
37
37
  4. `/mindforge:review` (+ the `quick.md` security auto-trigger / `security-reviewer`
38
38
  on a security trigger), then commit as conventional `feat(...)` / `refactor(...)`
39
- + Merkle-linked AUDIT.jsonl entry. → **GATE 2**.
39
+ + hash-chained AUDIT.jsonl entry. → **GATE 2**.
40
40
 
41
41
  Use this only when the feature **works** but should behave differently — not for
42
42
  bugs (`/mindforge:orch-fix-defect`) or net-new capability
@@ -33,7 +33,7 @@ with `$ARGUMENTS` as the request and `operation = fix-defect`. The engine will:
33
33
  this a fix, not a tweak.)
34
34
  3. `/mindforge:review` (+ the `quick.md` security auto-trigger / `security-reviewer`
35
35
  if the defect sits in a sensitive path).
36
- 4. Commit as a conventional `fix(...)` commit + Merkle-linked AUDIT.jsonl entry.
36
+ 4. Commit as a conventional `fix(...)` commit + hash-chained AUDIT.jsonl entry.
37
37
  → **GATE 2** (confirm before commit).
38
38
 
39
39
  Use this only when behavior is **broken/wrong** — not for intentional changes
@@ -35,7 +35,7 @@ with `$ARGUMENTS` as the request and `operation = refine-code`. The engine will:
35
35
  — the existing suite proves behavior is unchanged). Dead-code/dup sweeps
36
36
  delegate to `/mindforge:de-slop`.
37
37
  4. `/mindforge:review`, then commit as `refactor(...)` (the diff must be
38
- behavior-neutral) + Merkle-linked AUDIT.jsonl entry. → **GATE 2**.
38
+ behavior-neutral) + hash-chained AUDIT.jsonl entry. → **GATE 2**.
39
39
 
40
40
  Use this only when behavior must **not** change. If behavior should change at
41
41
  all, use `/mindforge:orch-change-feature` or `/mindforge:orch-fix-defect`.
@@ -1,11 +1,11 @@
1
1
  ---
2
- description: "@mindforge qa [--phase N] [--auto]"
2
+ description: "/mindforge:qa [--phase N] [--auto]"
3
3
  ---
4
4
 
5
5
  # /mindforge:qa
6
6
 
7
7
  ## Usage
8
- `@mindforge qa [--phase N] [--auto]`
8
+ `/mindforge:qa [--phase N] [--auto]`
9
9
 
10
10
  ## Description
11
11
  Runs systematic visual QA on UI surfaces changed in the current phase.
@@ -85,7 +85,7 @@
85
85
  },
86
86
  "COST_HARD_LIMIT_USD": {
87
87
  "type": "number", "minimum": 0, "maximum": 10000,
88
- "description": "Daily hard cost limit in USD. DECLARED BUT NOT ENFORCED as of 11.9.2: bin/models/cost-tracker.js reads MODEL_COST_HARD_LIMIT_USD, which this registry does not declare, so preflight() returns early and no cap is applied. Do not treat this as a spend control. Tracked as COST-02."
88
+ "description": "Daily hard cost limit in USD. ENFORCED as of 11.9.3 (COST-02): bin/models/cost-tracker.js preflight() throws COST_LIMIT_REACHED once today's ledger spend plus the call estimate reaches this value, and bin/models/model-client.js re-throws it. 0 disables the cap, and so does omitting the key (it is `recommended`, not `required`) an upgrade never rewrites an existing MINDFORGE.md. A present-but-unparseable value throws COST_LIMIT_MISCONFIGURED rather than silently running uncapped."
89
89
  },
90
90
  "ADS_DEBATE_ROUNDS": {
91
91
  "type": "number", "minimum": 1, "maximum": 10,
@@ -1,11 +1,11 @@
1
1
  {
2
- "version": "11.9.2",
2
+ "version": "11.9.3",
3
3
  "environment": "development",
4
4
  "governance": {
5
5
  "drift_threshold": 0.75,
6
6
  "critical_drift_threshold": 0.5,
7
7
  "res_threshold": 0.8,
8
- "active_did": "did:mindforge:766e07ac-8f56-4840-be61-316b90bbed35"
8
+ "active_did": ""
9
9
  },
10
10
  "revops": {
11
11
  "market_registry": {
@@ -71,7 +71,7 @@
71
71
  },
72
72
  "mesh": {
73
73
  "_node_id_note": "Set node_id to a unique value per node in multi-node deployments. auto = hostname-derived.",
74
- "node_id": "beta-node",
74
+ "node_id": "auto",
75
75
  "peers": []
76
76
  },
77
77
  "ase": {
@@ -46,8 +46,8 @@ Typical GitHub Action setup:
46
46
  ```yaml
47
47
  steps:
48
48
  - uses: actions/checkout@v4
49
- - name: Run MindForge Auto
50
- run: npx mindforge auto --phase 3 --headless
49
+ - name: Run MindForge headless
50
+ run: npx mindforge headless --phase 3
51
51
  env:
52
52
  MINDFORGE_TOKEN: ${{ secrets.MINDFORGE_TOKEN }}
53
53
  AUTO_PUSH_ON_WAVE_COMPLETE: true
@@ -10,7 +10,7 @@ Temporal Vision enables high-fidelity "Time-Travel Debugging" by snapshotting th
10
10
  - `task_completed`
11
11
  - `hindsight_injected`
12
12
  2. **Persistence**: Snapshots are stored in `.planning/history/[audit_id]/`.
13
- 3. **Retention**: The system retains snapshots for the current milestone. Completed milestones should be archived or purged using `/mindforge:temporal --cleanup`.
13
+ 3. **Retention**: The system retains snapshots for the current milestone. Completed milestones should be archived or purged using `mindforge temporal cleanup`.
14
14
 
15
15
  ## Hindsight Injection Protocol
16
16
  Hindsight Injection is a powerful tool and must be used according to these safety rules:
@@ -37,4 +37,4 @@ Hindsight Injection is a powerful tool and must be used according to these safet
37
37
  ## Common Operations
38
38
  - `GET /api/temporal/history`: View the timeline.
39
39
  - `POST /api/temporal/inject`: Perform hindsight repair.
40
- - `/mindforge:temporal --status`: Check history size and snapshot count.
40
+ - `mindforge temporal status`: Check history size and snapshot count.
@@ -44,9 +44,25 @@ Scan the actual diff content, not only filenames, for patterns such as:
44
44
  This protects against security-critical code being added to innocuous filenames
45
45
  like `src/utils/helper.ts`.
46
46
 
47
- ### Signal C — AUDIT history patterns
48
- If the current phase has a recent HIGH or CRITICAL `security_finding`, the next
49
- change in that phase is elevated to Tier 3 automatically.
47
+ ### Signal C — AUDIT history patterns (SPECIFIED, NOT IMPLEMENTED)
48
+ Intended behaviour: if the current phase has a recent HIGH or CRITICAL
49
+ `security_finding`, the next change in that phase is elevated to Tier 3
50
+ automatically.
51
+
52
+ **This signal does not exist in `bin/change-classifier.js`.** It is recorded here
53
+ as a design intent, not as a live protection, because it would read from
54
+ `.planning/AUDIT.jsonl` — which is gitignored (`.gitignore:81`), untracked, and
55
+ absent from `package.json` `files[]`. That file therefore does not exist in the
56
+ fresh clone the classifier actually runs in
57
+ (`.github/workflows/control-plane.yml`). Implementing it against a source that is
58
+ structurally unavailable at the point of enforcement would produce a signal that
59
+ silently never fires — the same defect class as the Signal B gap above, where 13
60
+ of the 19 documented patterns were specified and absent.
61
+
62
+ The `security_finding` event itself is real and carries `severity`: see
63
+ `bin/dashboard/metrics-aggregator.js:160` and `bin/revops/debt-monitor.js:23`,
64
+ both of which read it from a local audit log. Enabling Signal C needs a decision
65
+ about how phase history reaches CI, not merely classifier code.
50
66
 
51
67
  ## Classification audit entry
52
68
  Record why the tier was selected:
@@ -56,7 +72,7 @@ Record why the tier was selected:
56
72
  "event": "change_classified",
57
73
  "tier": 3,
58
74
  "classification_reason": "code pattern: jwt.sign found in src/utils/helper.ts",
59
- "signals_checked": ["file_path", "code_content", "audit_history"],
75
+ "signals_checked": ["file_path", "code_content"],
60
76
  "signal_triggered": "code_content",
61
77
  "pattern_matched": "jwt.sign"
62
78
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "pattern-library.jsonl": {
3
- "lastSync": "2026-08-16T19:50:41.118Z",
3
+ "lastSync": "2026-08-21T12:02:25.078Z",
4
4
  "localCount": 1
5
5
  }
6
6
  }
@@ -79,7 +79,7 @@ audit has a real target, not an abstraction.
79
79
  | 9 | Answer shaping | SWARM-SUMMARY consolidation | Format corruption in the final response |
80
80
  | 10 | Platform rendering | Dashboard (localhost:7339) / CLI / API transport | Transport-layer mutation of a valid answer |
81
81
  | 11 | Hidden repair loops | soul-engine ADS rewrite + Temporal hindsight regeneration | Silent fallback/retry running a second LLM pass |
82
- | 12 | Persistence | auto-state.json + Merkle audit log | Expired state or cached artifacts reused as live evidence |
82
+ | 12 | Persistence | auto-state.json + hash-chained audit log | Expired state or cached artifacts reused as live evidence |
83
83
 
84
84
  ### Common Failure Patterns
85
85
 
@@ -148,7 +148,7 @@ Define what you're auditing:
148
148
  Gather evidence from the codebase:
149
149
  - **Source code** — swarm loop, hooks_route tool router, shard admission, prompt
150
150
  assembly across the source-of-truth hierarchy
151
- - **Logs** — NexusTracer session traces, Merkle-linked AUDIT entries, tool-call
151
+ - **Logs** — NexusTracer session traces, hash-chained AUDIT entries, tool-call
152
152
  records
153
153
  - **Config** — MINDFORGE.md parameters, tool schemas, PersonaFactory patches,
154
154
  provider settings
@@ -128,7 +128,7 @@ Each phase delegates — it does not do the work inline.
128
128
  and `security-auditor` / `penetration-tester` whenever the diff touches a
129
129
  security trigger.
130
130
  - **6. Commit** — conventional commits (`feat:` / `fix:` / `refactor:` / …), one
131
- per logical chunk, **+ a Merkle-linked AUDIT.jsonl entry per commit**. → **GATE 2.**
131
+ per logical chunk, **+ a hash-chained AUDIT.jsonl entry per commit**. → **GATE 2.**
132
132
 
133
133
  ---
134
134
 
@@ -166,7 +166,7 @@ This family is **gated, not autonomous**:
166
166
  work, the manual security overhead is completed here before approval.
167
167
  2. **GATE 2 — before Commit.** Present the diff summary and proposed conventional
168
168
  commit messages; do not commit until the user confirms. Each confirmed commit
169
- writes a Merkle-linked AUDIT.jsonl entry (below).
169
+ writes a hash-chained AUDIT.jsonl entry (below).
170
170
 
171
171
  Everything between the gates flows without stopping.
172
172
 
@@ -227,7 +227,7 @@ On user confirmation at Gate 2, for **each** logical commit:
227
227
 
228
228
  1. Commit with a **conventional** message scoped to one logical change:
229
229
  `feat(<scope>): …` / `fix(<scope>): …` / `refactor(<scope>): …` / etc.
230
- 2. Append a **Merkle-linked** AUDIT.jsonl entry to `.planning/AUDIT.jsonl`. Each
230
+ 2. Append a **hash-chained** AUDIT.jsonl entry to `.planning/AUDIT.jsonl`. Each
231
231
  entry sets `previous_hash` to the prior entry's `_hash` and computes its own
232
232
  `_hash` (per `.mindforge/audit/AUDIT-SCHEMA.md`):
233
233
 
@@ -263,7 +263,7 @@ On user confirmation at Gate 2, for **each** logical commit:
263
263
  security trigger was touched; `/mindforge:security-scan` passed PRE-COMMIT
264
264
  with no unaddressed Medium+ findings.
265
265
  - [ ] Commits are conventional and scoped to one logical change.
266
- - [ ] Each commit wrote a Merkle-linked AUDIT.jsonl entry (`previous_hash`/`_hash`).
266
+ - [ ] Each commit wrote a hash-chained AUDIT.jsonl entry (`previous_hash`/`_hash`).
267
267
  - [ ] New / changed behavior has tests; coverage ≥ 80%.
268
268
 
269
269
  ---
package/CHANGELOG.md CHANGED
@@ -1,5 +1,199 @@
1
1
  # Changelog
2
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
+ ### BREAKING
16
+
17
+ Each of these is a bug fix whose correct behaviour differs from the shipped behaviour.
18
+
19
+ - **Routed CLI commands now act on YOUR project, not MindForge's own checkout.**
20
+ `bin/mindforge-cli.js` passed `cwd: ROOT` to every routed command, so `mindforge
21
+ classify` diffed MindForge's repository instead of yours, and `mindforge health`
22
+ inspected MindForge's `node_modules`. Measured across all 27 routed commands: 7
23
+ changed behaviour, all in the correct direction, none regressed. If you parsed output
24
+ that happened to describe MindForge itself, it now describes your project. (#201)
25
+
26
+ - **`npx mindforge-cc install` — and any other positional argument — now exits 1.**
27
+ The installer takes flags only and silently ignored stray words, so
28
+ `npx mindforge-cc install` appeared to work while installing nothing configured.
29
+ It now refuses with the correct form. `--runtime`'s value token is still accepted.
30
+ Use `npx mindforge-cc --claude --local`. (#202)
31
+
32
+ - **`mindforge verify` now SKIPS unavailable stages instead of failing them.** A project
33
+ with no ESLint config, no test script or no `bin/verify-audit.js` was reported as
34
+ FAILING those stages rather than as not having them. If your CI relied on a non-zero
35
+ exit in those cases, it will now pass. A run in which every stage skipped prints a
36
+ "NOTHING WAS VERIFIED" banner rather than a clean bill of health. (#204)
37
+
38
+ - **`scripts/sync-version.js` now exits non-zero when the plugin build artifacts are
39
+ stale.** A bump used to report `✅ every derivable channel is at <version>` and exit 0
40
+ while leaving `npm test` red. If you script this, handle the new exit code — it means
41
+ "run the build chain it just printed". (#211)
42
+
43
+ - **A self-install no longer writes over your tracked files.** Running the installer
44
+ inside a MindForge checkout printed that it was skipping and then overwrote 149
45
+ tracked files, including `CLAUDE.md`, `.claude/**`, `.agent/**` and `.mindforge/**`.
46
+ The skip is now honoured for local scope. (#200)
47
+
48
+ - **Releases must be tagged on a commit reachable from `main`.** The release workflow
49
+ now refuses a tag that is not an ancestor of `origin/main`. The documented flow is
50
+ develop → release → main; tagging elsewhere previously published, with provenance
51
+ attesting to that tree. (#216)
52
+
53
+ ### Fixed
54
+
55
+ **Installer**
56
+
57
+ - A self-install claimed to skip and then overwrote 149 tracked files. The gate is now
58
+ scope-aware (`isSelfInstall() && scope === 'local'`). (#200)
59
+ - Every `--global` install reported failure on a correct run: `verifyInstall` demanded
60
+ six `bin/**` paths regardless of scope, so a global install ended
61
+ `❌ 6 of 12 required file(s) missing` and exit 1, with a `--force` retry that could
62
+ not help. A global install writes 389 files to `$HOME/.claude` and, deliberately,
63
+ zero to `bin/`. (#210)
64
+ - 11 of 27 routed CLI verbs died on `MODULE_NOT_FOUND` in a real install: the router
65
+ shipped but 6 of the scripts it dispatches to did not. `coreFiles` grew from 2 entries
66
+ to 8. (#210)
67
+ - Two leaks: `/tmp` staging files left behind on abandoned runs, and developer runtime
68
+ state (`celestial.db`, `.browser-daemon-token`) copied into consumer projects.
69
+ `SENSITIVE_EXCLUDE` now covers both. (#210)
70
+ - The forge commands overwrote three `mindforge` commands of the same name. (#197)
71
+ - The documented default install did not deliver the CLI it documents. (#196)
72
+
73
+ **Versioning and release**
74
+
75
+ - `sync-version.js --fetch-sha` hashed npm's 404 error body. For an unpublished version
76
+ the registry answers `{"error":"Not found"}` and `curl -sL` exits 0, so the digest
77
+ written into the Homebrew formula was the SHA-256 of that error text — the same
78
+ constant for every unpublished version — and `--check` then passed. Now `curl -fsSL`
79
+ plus a gzip magic-byte check, and it refuses rather than writing a digest no artifact
80
+ can match. (#203)
81
+ - The Homebrew formula may now LAG canonical but never LEAD it. Requiring equality
82
+ before publishing required something impossible: the digest is the hash of a tarball
83
+ that does not exist yet, and `npm test` blocked the publish that would have made it
84
+ satisfiable. (#208)
85
+ - Semver comparison is numeric per component. Lexicographically, `11.10.0` reads as
86
+ *behind* `11.9.2` — wrong on exactly the first release past a `.9` minor. (#208)
87
+ - Three version channels had no writer at all, so `npm test` failed on every bump and
88
+ the documented remedy could not fix it: `mcp-server/server.json` (both keys, matched
89
+ by identifier), `AGENTS.md`, and `sdk/README.md`'s second shape. (#207, #211)
90
+ - **No channel covered a document a user receives.** `SECURITY.md` — the security policy
91
+ at the root of the published package — said "Current version: 11.9.0", and
92
+ getting-started, faq, troubleshooting, user-guide and sdk-reference all titled
93
+ themselves v11.9.0: three releases stale, while every npm manifest was correct.
94
+ `--check` was green throughout, because a channel that does not exist cannot drift.
95
+ Structural markers now track canonical; narrative measurements deliberately do not.
96
+ (#211)
97
+ - A bump is not finished when `sync-version.js` exits. Two tracked artifacts are gated
98
+ against `package.json` and only a build can write them —
99
+ `plugins/mindforge/.claude-plugin/plugin.json` and
100
+ `plugins/mindforge/mcp/dist/index.js`. They are now reported under
101
+ `🔨 REQUIRE A BUILD` with the exact three-command chain, which nothing had documented.
102
+ (#211)
103
+ - `sync-version.js` reported "a channel is AHEAD of canonical" whenever its exit code
104
+ was non-zero for any reason, so the `--fetch-sha` refusal for an unpublished tarball
105
+ claimed the formula LEADS canonical in the same run that printed "DEFERRED until after
106
+ publish (behind, not ahead)". (#211)
107
+ - `changelogs/index.json`, which `bin/updater/changelog-fetcher.js` reads as the
108
+ authoritative version list, was missing 11.9.2. (#218)
109
+
110
+ **Publishing**
111
+
112
+ - **The tag push that publishes was exempt from every gate.** Publishing is triggered by
113
+ exactly one event — a `v*` tag push — and the repository's only ruleset targets
114
+ branches, so its six required checks applied to nothing on the path that ships. GitHub
115
+ cannot attach required status checks to a tag. A `preflight` job now gates it. (#216)
116
+ - The `stable` npm dist-tag was moved by hand, or not at all — it sat four releases
117
+ behind `latest` (11.8.3 against 11.9.2), so `npm i mindforge-cc@stable` delivered a
118
+ build with none of the 11.9.x fixes. The release workflow now moves it as its final
119
+ step: forward-only, prereleases skipped, and verified against npm's uncached dist-tags
120
+ endpoint rather than the CDN-cached packument. (#216)
121
+
122
+ **Dashboard**
123
+
124
+ - `--status` and `--stop` were documented in nine places and implemented in none; both
125
+ printed nothing and exited 0. Now implemented, before `express` is required, so they
126
+ work without the dependency installed. (#206)
127
+ - `--stop` identified the target by the SHAPE of its command line, which matched any
128
+ `node <anything>/dashboard/server.js` — verified against
129
+ `node /var/www/unrelated_app/dashboard/server.js`. It now resolves the script's
130
+ realpath and compares it to its own. (#206)
131
+ - `--status` printed a port it could not know: the PID file records only the pid, so it
132
+ reported whatever port that invocation happened to receive. Measured, `--status` on a
133
+ server started with `--port 7466` printed "port 7339". (#206)
134
+
135
+ **Memory**
136
+
137
+ - Every abandoned exit left a full copy of the database on disk — 1.8 GB of orphaned
138
+ `.tmp` files. (#199)
139
+ - The SDK's WebSocket client took the caller's process down on a failed reconnect. (#191)
140
+
141
+ **Verification**
142
+
143
+ - `mindforge verify`'s lint stage used `--max-warnings=0`, which made it impossible to
144
+ pass in the repository it ships from: `npx eslint .` reports 199 problems / 0 errors /
145
+ 199 warnings, so `verify` reported a lint FAILURE on a tree that is green by the
146
+ project's own contract. Aligned with the project's definition; errors still fail. (#204)
147
+ - `temporal cleanup` printed "🧹 Cleaning up old temporal snapshots..." and
148
+ "✅ Cleanup complete." with no cleanup between them. Now wired to
149
+ `TemporalHub.gc({maxSnapshots: 50, maxAgeDays: 30})` with `--dry-run` and honest
150
+ counts, including zero. (#209)
151
+
152
+ **Documentation that named things that do not exist**
153
+
154
+ - The protocol files instructed the agent to run `soul-engine.js` and
155
+ `shard-controller.js`, neither of which exists anywhere in the package. Those steps
156
+ are reasoning protocols and now say so. (#205)
157
+ - Fifteen phantom `/mindforge:` slash commands in shipped docs. A reader following
158
+ `docs/user-guide.md` typed `/mindforge:personas --list` and got nothing. They were not
159
+ typos: `.agent/workflows/` holds 130 tracked files using those exact names — an old
160
+ target layout, committed and orphaned, shipping zero files. (#209)
161
+ - Four documented CLI invocations could not be run, each verified by running it:
162
+ `npx mindforge-cc@latest install` (exit 1), `mindforge-cli.js dashboard` (exit 1),
163
+ `npx mindforge auto` in a shipped engine doc (`auto` is a slash command, never a CLI
164
+ verb), and `@mindforge <verb>`, a syntax that exists nowhere. (#213)
165
+ - `workflow` is the most-documented CLI verb in the project and works, but appeared in
166
+ neither `--help` nor the "Available commands" list, so a user who mistyped it was told
167
+ it does not exist. (#213)
168
+ - Root `CLAUDE.md` named `bin/hooks/mindforge-context-monitor.js`; the file is under
169
+ `.agent/hooks/`. (#214)
170
+
171
+ ### Added
172
+
173
+ - **`preflight` job on the release workflow.** Asserts the tagged commit is an ancestor
174
+ of `origin/main`, then runs the six gates a tag push never saw, with the publish job
175
+ behind `needs:`. (#216)
176
+ - **Automatic `stable` dist-tag movement**, forward-only and verified. (#216)
177
+ - **`node bin/dashboard/server.js --status` / `--stop`.** Not CLI verbs —
178
+ `mindforge-cli.js dashboard` does not route. (#206)
179
+ - **`mindforge temporal cleanup --dry-run`.** (#209)
180
+ - New regression gates, each falsified by mutation before being trusted:
181
+ `tests/protocol-claims.test.js` (no exemption list, deliberately — a name-keyed
182
+ allowlist was shown to excuse the exact defect it was written for), the shipped-doc
183
+ phantom-command gate, the CLI-verb gate, the authority-doc `.js` gate, the
184
+ version-channel round trips, and assertions that the release preflight itself cannot
185
+ be silently removed.
186
+
187
+ ### Notes for operators
188
+
189
+ - `npm run version:check` is the offline drift check. A bump is finished only when
190
+ `sync-version.js` exits 0 — if it prints `🔨 REQUIRE A BUILD`, run the three commands
191
+ it names and commit both regenerated files.
192
+ - Releases are now gated on being tagged from `main`. One residual, inherent to
193
+ tag-triggered workflows: a tag push resolves the workflow from the TAGGED ref, so a
194
+ tag placed on a commit predating this release runs that commit's workflow and is
195
+ ungated.
196
+
3
197
  ## [11.9.2] — 2026-08-16 — Correctness: audit-chain integrity, dashboard crash policy, secret scanning
4
198
 
5
199
  Patch release. No new features. Correctness work closing defects found by a