mindforge-cc 6.3.0 → 6.4.0
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/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
## [6.4.0] - 2026-04-08
|
|
2
|
+
|
|
3
|
+
### Added (v6.4.0: Context Entropy Guard - CEG)
|
|
4
|
+
|
|
5
|
+
- **Context Entropy Guard (CEG)**:
|
|
6
|
+
- Implemented `context-entropy-guard.js` for active noise suppression and context pruning.
|
|
7
|
+
- Added semantic compression to `HandoverManager`, automatically summarizing stagnant reasoning loops into digests.
|
|
8
|
+
- Hardened Nexus Bundles against "Reasoning Entropy" (similarity-based token bloat).
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
1
12
|
## [6.3.0] - 2026-04-08
|
|
2
13
|
|
|
3
14
|
### Added (v6.3.0: Intelligence-Drift Coupling - IDC)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MindForge v6.4.0 — Context Entropy Guard (CEG)
|
|
3
|
+
* Component: Context Entropy Guard (Pillar XI)
|
|
4
|
+
*
|
|
5
|
+
* Actively manages context density by suppressing reasoning noise
|
|
6
|
+
* and compressing repetitive semantic loops before handoff.
|
|
7
|
+
*/
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
class ContextEntropyGuard {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.SIMILARITY_SUPPRESSION_THRESHOLD = 0.85; // Suppress thoughts > 85% similar
|
|
13
|
+
this.STAGNATION_LIMIT = 3; // Max repetitive cycles before compression
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Prunes and compresses a reasoning trace to manage context entropy.
|
|
18
|
+
* @param {Array} trace - Array of reasoning trace events.
|
|
19
|
+
* @returns {Array} - Guarded reasoning trace.
|
|
20
|
+
*/
|
|
21
|
+
compress(trace) {
|
|
22
|
+
if (!trace || trace.length === 0) return [];
|
|
23
|
+
|
|
24
|
+
const result = [];
|
|
25
|
+
const history = [];
|
|
26
|
+
let loopBuffer = [];
|
|
27
|
+
|
|
28
|
+
for (const event of trace) {
|
|
29
|
+
if (event.event !== 'reasoning_trace') {
|
|
30
|
+
result.push(event);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const similarity = this._calculateMaxSimilarity(event.thought, history);
|
|
35
|
+
|
|
36
|
+
if (similarity > this.SIMILARITY_SUPPRESSION_THRESHOLD) {
|
|
37
|
+
// High similarity: Buffer for potential compression
|
|
38
|
+
loopBuffer.push(event);
|
|
39
|
+
if (loopBuffer.length >= this.STAGNATION_LIMIT) {
|
|
40
|
+
// Trigger automatic compression/digest
|
|
41
|
+
const digest = {
|
|
42
|
+
event: 'reasoning_digest',
|
|
43
|
+
summary: `Compressed reasoning loop (${loopBuffer.length} stagnant steps).`,
|
|
44
|
+
final_conclusion: event.thought,
|
|
45
|
+
timestamp: new Date().toISOString()
|
|
46
|
+
};
|
|
47
|
+
// Replace buffered noise with a single digest
|
|
48
|
+
result.push(digest);
|
|
49
|
+
loopBuffer = [];
|
|
50
|
+
}
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// If we had a short buffer that didn't reach stagnation limit, push them back
|
|
55
|
+
if (loopBuffer.length > 0) {
|
|
56
|
+
result.push(...loopBuffer);
|
|
57
|
+
loopBuffer = [];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
result.push(event);
|
|
61
|
+
history.push(event.thought);
|
|
62
|
+
if (history.length > 10) history.shift(); // Keep history window sliding
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Final flush for items remaining in buffer
|
|
66
|
+
if (loopBuffer.length > 0) {
|
|
67
|
+
result.push(...loopBuffer);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Internal Similarity Heuristic (Jaccard)
|
|
75
|
+
*/
|
|
76
|
+
_calculateMaxSimilarity(thought, history) {
|
|
77
|
+
if (history.length === 0) return 0;
|
|
78
|
+
|
|
79
|
+
const getTokens = (str) => new Set(str.toLowerCase().split(/\s+/).filter(t => t.length > 3));
|
|
80
|
+
const currentTokens = getTokens(thought);
|
|
81
|
+
|
|
82
|
+
let max = 0;
|
|
83
|
+
for (const prev of history) {
|
|
84
|
+
const prevTokens = getTokens(prev);
|
|
85
|
+
const intersection = new Set([...currentTokens].filter(x => prevTokens.has(x)));
|
|
86
|
+
const union = new Set([...currentTokens, ...prevTokens]);
|
|
87
|
+
const sim = union.size === 0 ? 0 : intersection.size / union.size;
|
|
88
|
+
if (sim > max) max = sim;
|
|
89
|
+
}
|
|
90
|
+
return max;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
module.exports = new ContextEntropyGuard();
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
const fs = require('fs');
|
|
8
8
|
const path = require('path');
|
|
9
9
|
const crypto = require('crypto');
|
|
10
|
+
const ceg = require('./context-entropy-guard');
|
|
10
11
|
|
|
11
12
|
class HandoverManager {
|
|
12
13
|
constructor(config = {}) {
|
|
@@ -34,7 +35,8 @@ class HandoverManager {
|
|
|
34
35
|
last_events: state.recentEvents,
|
|
35
36
|
memory_shards: state.memoryShards || []
|
|
36
37
|
},
|
|
37
|
-
|
|
38
|
+
// v6.4.0: Context Entropy Guard applied for active noise suppression
|
|
39
|
+
reasoning_snapshot: (Array.isArray(state.reasoningTrace)) ? ceg.compress(state.reasoningTrace) : state.reasoningTrace,
|
|
38
40
|
steering_requirements: state.blocks || []
|
|
39
41
|
};
|
|
40
42
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MindForge v6.4.0 — CEG Verification Test
|
|
3
|
+
*
|
|
4
|
+
* Simulates a "noisy" reasoning trace with repetitive thoughts
|
|
5
|
+
* and verifies that the ContextEntropyGuard (CEG) correctly
|
|
6
|
+
* suppresses noise and compresses the history.
|
|
7
|
+
*/
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
const ceg = require('./context-entropy-guard');
|
|
11
|
+
|
|
12
|
+
async function runTest() {
|
|
13
|
+
console.log('🧪 Starting CEG Verification Test...');
|
|
14
|
+
|
|
15
|
+
const trace = [
|
|
16
|
+
{ event: 'reasoning_trace', thought: 'I should analyze the target directory structure.', is_stagnant: false },
|
|
17
|
+
{ event: 'reasoning_trace', thought: 'Analyzing the directory layout now.', is_stagnant: false },
|
|
18
|
+
// Repetitive noise (to be suppressed)
|
|
19
|
+
{ event: 'reasoning_trace', thought: 'Analyzing the directory layout now.', is_stagnant: true },
|
|
20
|
+
{ event: 'reasoning_trace', thought: 'Analyzing the directory layout now.', is_stagnant: true },
|
|
21
|
+
// New thought
|
|
22
|
+
{ event: 'reasoning_trace', thought: 'Found a potential vulnerability in the config file.', is_stagnant: false },
|
|
23
|
+
// Loop (to be compressed)
|
|
24
|
+
{ event: 'reasoning_trace', thought: 'Checking config permissions.', is_stagnant: true },
|
|
25
|
+
{ event: 'reasoning_trace', thought: 'Checking config permissions.', is_stagnant: true },
|
|
26
|
+
{ event: 'reasoning_trace', thought: 'Checking config permissions.', is_stagnant: true },
|
|
27
|
+
{ event: 'reasoning_trace', thought: 'Checking config permissions.', is_stagnant: true }
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
console.log(`\nInput Trace Length: ${trace.length}`);
|
|
31
|
+
|
|
32
|
+
const compressed = ceg.compress(trace);
|
|
33
|
+
console.log(`Compressed Trace Length: ${compressed.length}`);
|
|
34
|
+
|
|
35
|
+
console.log('\n--- Final Trace Preview ---');
|
|
36
|
+
compressed.forEach((e, idx) => {
|
|
37
|
+
if (e.event === 'reasoning_digest') {
|
|
38
|
+
console.log(`[${idx}] DIGEST: ${e.summary} | Last Conclusion: ${e.final_conclusion}`);
|
|
39
|
+
} else {
|
|
40
|
+
console.log(`[${idx}] THOUGHT: ${e.thought}`);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Validations
|
|
45
|
+
const hasDigest = compressed.some(e => e.event === 'reasoning_digest');
|
|
46
|
+
const totalReduction = trace.length - compressed.length;
|
|
47
|
+
|
|
48
|
+
if (hasDigest && totalReduction >= 2) {
|
|
49
|
+
console.log('\n✅ SUCCESS: CEG successfully suppressed noise and compressed the reasoning loop.');
|
|
50
|
+
} else {
|
|
51
|
+
console.error('\n❌ FAILURE: CEG failed to compress the history significantly.');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
runTest().catch(err => {
|
|
57
|
+
console.error(err);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mindforge-cc",
|
|
3
|
-
"version": "6.
|
|
4
|
-
|
|
3
|
+
"version": "6.4.0",
|
|
5
4
|
"description": "MindForge — Sovereign Agentic Intelligence Framework. (CADIA v6.2 & PQAS Enabled)",
|
|
6
5
|
"bin": {
|
|
7
6
|
"mindforge-cc": "bin/install.js"
|
|
@@ -54,4 +53,4 @@
|
|
|
54
53
|
"dependencies": {
|
|
55
54
|
"express": "^4.19.2"
|
|
56
55
|
}
|
|
57
|
-
}
|
|
56
|
+
}
|