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.
- package/.agent/CLAUDE.md +37 -13
- package/.agent/hooks/mindforge-block-no-verify.js +61 -13
- package/.agent/hooks/mindforge-config-protection.js +82 -3
- package/.agent/hooks/mindforge-context-monitor.js +1 -1
- package/.agent/hooks/mindforge-workflow-guard.js +2 -2
- package/.agent/hooks/run-with-flags.js +190 -20
- package/.agent/mindforge/browse.md +2 -2
- package/.agent/mindforge/checkpoint.md +1 -1
- package/.agent/mindforge/harness-audit.md +1 -1
- package/.agent/mindforge/orch-add-feature.md +1 -1
- package/.agent/mindforge/orch-build-mvp.md +1 -1
- package/.agent/mindforge/orch-change-feature.md +1 -1
- package/.agent/mindforge/orch-fix-defect.md +1 -1
- package/.agent/mindforge/orch-refine-code.md +1 -1
- package/.agent/mindforge/qa.md +2 -2
- package/.claude/CLAUDE.md +37 -13
- package/.claude/commands/mindforge/browse.md +2 -2
- package/.claude/commands/mindforge/checkpoint.md +1 -1
- package/.claude/commands/mindforge/harness-audit.md +1 -1
- package/.claude/commands/mindforge/orch-add-feature.md +1 -1
- package/.claude/commands/mindforge/orch-build-mvp.md +1 -1
- package/.claude/commands/mindforge/orch-change-feature.md +1 -1
- package/.claude/commands/mindforge/orch-fix-defect.md +1 -1
- package/.claude/commands/mindforge/orch-refine-code.md +1 -1
- package/.claude/commands/mindforge/qa.md +2 -2
- package/.mindforge/MINDFORGE-SCHEMA.json +1 -1
- package/.mindforge/config.json +3 -3
- package/.mindforge/engine/autonomous/headless-adapter.md +2 -2
- package/.mindforge/engine/temporal-protocol.md +2 -2
- package/.mindforge/governance/change-classifier.md +20 -4
- package/.mindforge/memory/sync-manifest.json +1 -1
- package/.mindforge/skills/agent-architecture-audit/SKILL.md +2 -2
- package/.mindforge/skills/orch-pipeline/SKILL.md +4 -4
- package/CHANGELOG.md +194 -0
- package/MINDFORGE.md +13 -6
- package/README.md +4 -3
- package/RELEASENOTES.md +2 -2
- package/SECURITY.md +22 -3
- package/bin/autonomous/auto-runner.js +65 -2
- package/bin/change-classifier.js +151 -16
- package/bin/dashboard/api-router.js +18 -38
- package/bin/dashboard/frontend/app.js +429 -0
- package/bin/dashboard/frontend/index.html +13 -406
- package/bin/dashboard/metrics-aggregator.js +46 -22
- package/bin/dashboard/server.js +160 -1
- package/bin/dashboard/sse-bridge.js +11 -8
- package/bin/engine/sre-manager.js +1 -1
- package/bin/engine/temporal-cli.js +56 -6
- package/bin/engine/verification-runner.js +134 -17
- package/bin/engine/verify-cli.js +25 -7
- package/bin/governance/approval-record.js +147 -0
- package/bin/governance/approve.js +12 -7
- package/bin/governance/policy-engine.js +33 -3
- package/bin/governance/policy-gate-hardened.js +36 -1
- package/bin/governance/verify-approvals.js +163 -0
- package/bin/harness-audit.js +224 -10
- package/bin/hooks/instinct-capture-hook.js +12 -4
- package/bin/install.js +63 -3
- package/bin/installer/harness-adapter-compliance.js +339 -28
- package/bin/installer/hook-registration.js +504 -0
- package/bin/installer-core.js +451 -63
- package/bin/learning/instinct-cli.js +7 -0
- package/bin/memory/vector-hub.js +196 -13
- package/bin/migrations/0.6.0-to-1.0.0.js +30 -25
- package/bin/migrations/1.0.0-to-2.0.0.js +22 -23
- package/bin/mindforge-cli.js +67 -6
- package/bin/models/cost-tracker.js +104 -6
- package/bin/models/model-client.js +6 -1
- package/bin/revops/debt-monitor.js +57 -13
- package/bin/security/trust-gate-hook.js +50 -6
- package/bin/skill-validator.js +6 -1
- package/bin/skills-builder/skill-scorer.js +46 -6
- package/bin/updater/self-update.js +6 -1
- package/bin/updater/version-comparator.js +21 -1
- package/bin/utils/mindforge-version.js +99 -0
- package/bin/utils/redact-secrets.js +106 -0
- package/bin/validate-config.js +42 -2
- package/bin/wizard/setup-wizard.js +4 -1
- package/bin/wizard/theme.js +9 -1
- package/changelogs/index.json +11 -9
- package/changelogs/v11.9.3.md +195 -0
- package/docs/References/config-reference.md +5 -2
- package/docs/References/sdk-api.md +1 -1
- package/docs/Templates/Codebase/architecture.md +1 -1
- package/docs/commands-reference.md +4 -5
- package/docs/faq.md +25 -5
- package/docs/getting-started.md +3 -3
- package/docs/sdk-reference.md +15 -7
- package/docs/troubleshooting.md +10 -6
- package/docs/user-guide.md +14 -14
- package/examples/sdk-integration/README.md +1 -1
- package/package.json +7 -3
- package/subagents/.claude-plugin/marketplace.json +1 -1
- 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
|
|
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
|
|
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
|
-
+
|
|
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 +
|
|
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) +
|
|
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`.
|
package/.agent/mindforge/qa.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: /mindforge:qa [--phase N] [--auto]
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# /mindforge:qa
|
|
6
6
|
|
|
7
7
|
## Usage
|
|
8
|
-
|
|
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.
|
|
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.
|
|
33
|
-
4. Execute parallel mesh waves
|
|
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.
|
|
39
|
-
|
|
40
|
-
|
|
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.
|
|
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.
|
|
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:
|
|
90
|
-
- `/mindforge:
|
|
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: "
|
|
2
|
+
description: "/mindforge:browse <url | action>"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# /mindforge:browse
|
|
6
6
|
|
|
7
7
|
## Usage
|
|
8
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
+
|
|
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 +
|
|
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) +
|
|
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: "
|
|
2
|
+
description: "/mindforge:qa [--phase N] [--auto]"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# /mindforge:qa
|
|
6
6
|
|
|
7
7
|
## Usage
|
|
8
|
-
|
|
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.
|
|
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,
|
package/.mindforge/config.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "11.9.
|
|
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": "
|
|
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": "
|
|
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
|
|
50
|
-
run: npx mindforge
|
|
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
|
|
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
|
-
-
|
|
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
|
-
|
|
49
|
-
change in that phase is elevated to Tier 3
|
|
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"
|
|
75
|
+
"signals_checked": ["file_path", "code_content"],
|
|
60
76
|
"signal_triggered": "code_content",
|
|
61
77
|
"pattern_matched": "jwt.sign"
|
|
62
78
|
}
|
|
@@ -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 +
|
|
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,
|
|
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
|
|
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
|
|
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 **
|
|
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
|
|
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
|