@timmeck/brain-core 2.36.57 → 2.36.58

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 (135) hide show
  1. package/README.md +6 -0
  2. package/command-center.html +133 -2
  3. package/dist/action/__tests__/content-handler.test.d.ts +1 -0
  4. package/dist/action/__tests__/content-handler.test.js +100 -0
  5. package/dist/action/__tests__/content-handler.test.js.map +1 -0
  6. package/dist/action/__tests__/trade-handler.test.d.ts +1 -0
  7. package/dist/action/__tests__/trade-handler.test.js +165 -0
  8. package/dist/action/__tests__/trade-handler.test.js.map +1 -0
  9. package/dist/action/action-bridge.d.ts +2 -2
  10. package/dist/action/action-bridge.js +1 -0
  11. package/dist/action/action-bridge.js.map +1 -1
  12. package/dist/action/handlers/content-handler.d.ts +23 -0
  13. package/dist/action/handlers/content-handler.js +30 -0
  14. package/dist/action/handlers/content-handler.js.map +1 -0
  15. package/dist/action/handlers/index.d.ts +4 -0
  16. package/dist/action/handlers/index.js +3 -0
  17. package/dist/action/handlers/index.js.map +1 -0
  18. package/dist/action/handlers/trade-handler.d.ts +43 -0
  19. package/dist/action/handlers/trade-handler.js +43 -0
  20. package/dist/action/handlers/trade-handler.js.map +1 -0
  21. package/dist/action/index.d.ts +2 -0
  22. package/dist/action/index.js +1 -0
  23. package/dist/action/index.js.map +1 -1
  24. package/dist/agent-training/__tests__/agent-trainer.test.d.ts +1 -0
  25. package/dist/agent-training/__tests__/agent-trainer.test.js +158 -0
  26. package/dist/agent-training/__tests__/agent-trainer.test.js.map +1 -0
  27. package/dist/agent-training/__tests__/sub-agent-factory.test.d.ts +1 -0
  28. package/dist/agent-training/__tests__/sub-agent-factory.test.js +100 -0
  29. package/dist/agent-training/__tests__/sub-agent-factory.test.js.map +1 -0
  30. package/dist/agent-training/__tests__/sub-agent.test.d.ts +1 -0
  31. package/dist/agent-training/__tests__/sub-agent.test.js +102 -0
  32. package/dist/agent-training/__tests__/sub-agent.test.js.map +1 -0
  33. package/dist/agent-training/index.d.ts +4 -0
  34. package/dist/agent-training/index.js +2 -0
  35. package/dist/agent-training/index.js.map +1 -1
  36. package/dist/agent-training/sub-agent-factory.d.ts +36 -0
  37. package/dist/agent-training/sub-agent-factory.js +128 -0
  38. package/dist/agent-training/sub-agent-factory.js.map +1 -0
  39. package/dist/agent-training/sub-agent.d.ts +57 -0
  40. package/dist/agent-training/sub-agent.js +135 -0
  41. package/dist/agent-training/sub-agent.js.map +1 -0
  42. package/dist/chat/__tests__/chat-engine.test.d.ts +1 -0
  43. package/dist/chat/__tests__/chat-engine.test.js +128 -0
  44. package/dist/chat/__tests__/chat-engine.test.js.map +1 -0
  45. package/dist/chat/chat-engine.d.ts +55 -0
  46. package/dist/chat/chat-engine.js +186 -0
  47. package/dist/chat/chat-engine.js.map +1 -0
  48. package/dist/chat/index.d.ts +2 -0
  49. package/dist/chat/index.js +2 -0
  50. package/dist/chat/index.js.map +1 -0
  51. package/dist/content/__tests__/auto-publisher.test.d.ts +1 -0
  52. package/dist/content/__tests__/auto-publisher.test.js +125 -0
  53. package/dist/content/__tests__/auto-publisher.test.js.map +1 -0
  54. package/dist/content/auto-publisher.d.ts +51 -0
  55. package/dist/content/auto-publisher.js +147 -0
  56. package/dist/content/auto-publisher.js.map +1 -0
  57. package/dist/content/content-forge.d.ts +2 -0
  58. package/dist/content/content-forge.js +19 -0
  59. package/dist/content/content-forge.js.map +1 -1
  60. package/dist/content/index.d.ts +2 -0
  61. package/dist/content/index.js +1 -0
  62. package/dist/content/index.js.map +1 -1
  63. package/dist/creative/__tests__/creative-engine.test.d.ts +1 -0
  64. package/dist/creative/__tests__/creative-engine.test.js +151 -0
  65. package/dist/creative/__tests__/creative-engine.test.js.map +1 -0
  66. package/dist/cross-brain/__tests__/signal-router.test.d.ts +1 -0
  67. package/dist/cross-brain/__tests__/signal-router.test.js +159 -0
  68. package/dist/cross-brain/__tests__/signal-router.test.js.map +1 -0
  69. package/dist/cross-brain/signal-router.d.ts +57 -0
  70. package/dist/cross-brain/signal-router.js +148 -0
  71. package/dist/cross-brain/signal-router.js.map +1 -0
  72. package/dist/dashboard/__tests__/command-center-server.test.js +31 -0
  73. package/dist/dashboard/__tests__/command-center-server.test.js.map +1 -1
  74. package/dist/dashboard/command-center-server.d.ts +11 -0
  75. package/dist/dashboard/command-center-server.js +72 -0
  76. package/dist/dashboard/command-center-server.js.map +1 -1
  77. package/dist/dream/__tests__/dream-engine.test.d.ts +1 -0
  78. package/dist/dream/__tests__/dream-engine.test.js +184 -0
  79. package/dist/dream/__tests__/dream-engine.test.js.map +1 -0
  80. package/dist/feedback/__tests__/feedback-router.test.d.ts +1 -0
  81. package/dist/feedback/__tests__/feedback-router.test.js +173 -0
  82. package/dist/feedback/__tests__/feedback-router.test.js.map +1 -0
  83. package/dist/feedback/feedback-router.d.ts +53 -0
  84. package/dist/feedback/feedback-router.js +193 -0
  85. package/dist/feedback/feedback-router.js.map +1 -0
  86. package/dist/feedback/index.d.ts +2 -0
  87. package/dist/feedback/index.js +1 -0
  88. package/dist/feedback/index.js.map +1 -1
  89. package/dist/goals/__tests__/goal-engine.test.d.ts +1 -0
  90. package/dist/goals/__tests__/goal-engine.test.js +203 -0
  91. package/dist/goals/__tests__/goal-engine.test.js.map +1 -0
  92. package/dist/guardrails/__tests__/guardrail-engine.test.d.ts +1 -0
  93. package/dist/guardrails/__tests__/guardrail-engine.test.js +343 -0
  94. package/dist/guardrails/__tests__/guardrail-engine.test.js.map +1 -0
  95. package/dist/index.d.ts +14 -6
  96. package/dist/index.js +8 -3
  97. package/dist/index.js.map +1 -1
  98. package/dist/metacognition/__tests__/auto-experiment-engine.test.d.ts +1 -0
  99. package/dist/metacognition/__tests__/auto-experiment-engine.test.js +218 -0
  100. package/dist/metacognition/__tests__/auto-experiment-engine.test.js.map +1 -0
  101. package/dist/metacognition/__tests__/evolution-engine.test.d.ts +1 -0
  102. package/dist/metacognition/__tests__/evolution-engine.test.js +473 -0
  103. package/dist/metacognition/__tests__/evolution-engine.test.js.map +1 -0
  104. package/dist/metacognition/__tests__/parameter-registry.test.d.ts +1 -0
  105. package/dist/metacognition/__tests__/parameter-registry.test.js +223 -0
  106. package/dist/metacognition/__tests__/parameter-registry.test.js.map +1 -0
  107. package/dist/prediction/__tests__/prediction-engine.test.d.ts +1 -0
  108. package/dist/prediction/__tests__/prediction-engine.test.js +244 -0
  109. package/dist/prediction/__tests__/prediction-engine.test.js.map +1 -0
  110. package/dist/research/research-orchestrator.js +2 -1
  111. package/dist/research/research-orchestrator.js.map +1 -1
  112. package/dist/sandbox/__tests__/code-sandbox.test.d.ts +1 -0
  113. package/dist/sandbox/__tests__/code-sandbox.test.js +182 -0
  114. package/dist/sandbox/__tests__/code-sandbox.test.js.map +1 -0
  115. package/dist/scanner/__tests__/signal-scanner.test.d.ts +1 -0
  116. package/dist/scanner/__tests__/signal-scanner.test.js +142 -0
  117. package/dist/scanner/__tests__/signal-scanner.test.js.map +1 -0
  118. package/dist/self-modification/__tests__/self-modification-engine.test.d.ts +1 -0
  119. package/dist/self-modification/__tests__/self-modification-engine.test.js +255 -0
  120. package/dist/self-modification/__tests__/self-modification-engine.test.js.map +1 -0
  121. package/dist/strategy/__tests__/strategy-forge.test.js +69 -0
  122. package/dist/strategy/__tests__/strategy-forge.test.js.map +1 -1
  123. package/dist/strategy/__tests__/strategy-mutator.test.d.ts +1 -0
  124. package/dist/strategy/__tests__/strategy-mutator.test.js +141 -0
  125. package/dist/strategy/__tests__/strategy-mutator.test.js.map +1 -0
  126. package/dist/strategy/index.d.ts +2 -0
  127. package/dist/strategy/index.js +1 -0
  128. package/dist/strategy/index.js.map +1 -1
  129. package/dist/strategy/strategy-forge.d.ts +4 -1
  130. package/dist/strategy/strategy-forge.js +34 -2
  131. package/dist/strategy/strategy-forge.js.map +1 -1
  132. package/dist/strategy/strategy-mutator.d.ts +42 -0
  133. package/dist/strategy/strategy-mutator.js +140 -0
  134. package/dist/strategy/strategy-mutator.js.map +1 -0
  135. package/package.json +1 -1
@@ -0,0 +1,203 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import Database from 'better-sqlite3';
3
+ vi.mock('../../utils/logger.js', () => ({
4
+ getLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }),
5
+ }));
6
+ import { GoalEngine, runGoalEngineMigration } from '../goal-engine.js';
7
+ describe('GoalEngine', () => {
8
+ let db;
9
+ beforeEach(() => { db = new Database(':memory:'); });
10
+ afterEach(() => { db.close(); });
11
+ // ── 1. Creation ────────────────────────────────────────
12
+ it('constructs without error and runs migration', () => {
13
+ const engine = new GoalEngine(db, { brainName: 'test' });
14
+ expect(engine).toBeDefined();
15
+ // Tables should exist
16
+ const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name IN ('goals', 'goal_progress') ORDER BY name").all();
17
+ expect(tables.map(t => t.name)).toEqual(['goal_progress', 'goals']);
18
+ });
19
+ // ── 2. createGoal ─────────────────────────────────────
20
+ it('creates a goal and returns it with an id', () => {
21
+ const engine = new GoalEngine(db, { brainName: 'test' });
22
+ const goal = engine.createGoal('Hit 80% accuracy', 'accuracy', 0.8, 50, {
23
+ description: 'Improve prediction accuracy',
24
+ type: 'quality',
25
+ baselineValue: 0.4,
26
+ currentCycle: 10,
27
+ priority: 0.9,
28
+ direction: 'higher_is_better',
29
+ });
30
+ expect(goal.id).toBeGreaterThan(0);
31
+ expect(goal.title).toBe('Hit 80% accuracy');
32
+ expect(goal.metricName).toBe('accuracy');
33
+ expect(goal.targetValue).toBe(0.8);
34
+ expect(goal.baselineValue).toBe(0.4);
35
+ expect(goal.currentValue).toBe(0.4);
36
+ expect(goal.deadlineCycles).toBe(50);
37
+ expect(goal.startedCycle).toBe(10);
38
+ expect(goal.status).toBe('active');
39
+ expect(goal.priority).toBe(0.9);
40
+ expect(goal.direction).toBe('higher_is_better');
41
+ expect(goal.description).toBe('Improve prediction accuracy');
42
+ expect(goal.type).toBe('quality');
43
+ });
44
+ it('throws when max active goals reached', () => {
45
+ const engine = new GoalEngine(db, { brainName: 'test', maxActiveGoals: 2 });
46
+ engine.createGoal('G1', 'm1', 10, 50);
47
+ engine.createGoal('G2', 'm2', 20, 50);
48
+ expect(() => engine.createGoal('G3', 'm3', 30, 50)).toThrow(/Max active goals/);
49
+ });
50
+ // ── 3. listGoals ──────────────────────────────────────
51
+ it('lists goals with optional status filter', () => {
52
+ const engine = new GoalEngine(db, { brainName: 'test' });
53
+ engine.createGoal('A', 'x', 10, 50);
54
+ engine.createGoal('B', 'y', 20, 50);
55
+ const all = engine.listGoals();
56
+ expect(all).toHaveLength(2);
57
+ const active = engine.listGoals('active');
58
+ expect(active).toHaveLength(2);
59
+ // Pause one and filter
60
+ engine.pauseGoal(all[0].id);
61
+ expect(engine.listGoals('active')).toHaveLength(1);
62
+ expect(engine.listGoals('paused')).toHaveLength(1);
63
+ });
64
+ // ── 4. getGoal ────────────────────────────────────────
65
+ it('gets a goal by id or returns null', () => {
66
+ const engine = new GoalEngine(db, { brainName: 'test' });
67
+ const created = engine.createGoal('Find me', 'metric', 100, 30);
68
+ const found = engine.getGoal(created.id);
69
+ expect(found).not.toBeNull();
70
+ expect(found.title).toBe('Find me');
71
+ const missing = engine.getGoal(9999);
72
+ expect(missing).toBeNull();
73
+ });
74
+ // ── 5. recordProgress ─────────────────────────────────
75
+ it('records progress for active goals matching metric names', () => {
76
+ const engine = new GoalEngine(db, { brainName: 'test' });
77
+ engine.createGoal('Accuracy goal', 'accuracy', 0.9, 50, { baselineValue: 0.5 });
78
+ engine.createGoal('Speed goal', 'speed', 100, 50);
79
+ const updated = engine.recordProgress(1, { accuracy: 0.6, speed: 20, unknown: 42 });
80
+ expect(updated).toBe(2);
81
+ // Verify values were stored
82
+ const acc = engine.listGoals('active').find(g => g.metricName === 'accuracy');
83
+ expect(acc.currentValue).toBe(0.6);
84
+ const spd = engine.listGoals('active').find(g => g.metricName === 'speed');
85
+ expect(spd.currentValue).toBe(20);
86
+ });
87
+ // ── 6. checkGoals — achieved ──────────────────────────
88
+ it('marks goal as achieved when target is met (higher_is_better)', () => {
89
+ const engine = new GoalEngine(db, { brainName: 'test' });
90
+ const goal = engine.createGoal('Hit 10', 'score', 10, 50);
91
+ engine.recordProgress(1, { score: 10 });
92
+ const result = engine.checkGoals(1);
93
+ expect(result.achieved).toHaveLength(1);
94
+ expect(result.achieved[0].title).toBe('Hit 10');
95
+ expect(result.achieved[0].status).toBe('achieved');
96
+ expect(result.achieved[0].achievedAt).not.toBeNull();
97
+ expect(result.failed).toHaveLength(0);
98
+ // Verify persisted
99
+ const fetched = engine.getGoal(goal.id);
100
+ expect(fetched.status).toBe('achieved');
101
+ });
102
+ it('marks goal as achieved when target is met (lower_is_better)', () => {
103
+ const engine = new GoalEngine(db, { brainName: 'test' });
104
+ engine.createGoal('Reduce errors', 'errorRate', 5, 50, {
105
+ baselineValue: 20,
106
+ direction: 'lower_is_better',
107
+ });
108
+ engine.recordProgress(1, { errorRate: 4 });
109
+ const result = engine.checkGoals(1);
110
+ expect(result.achieved).toHaveLength(1);
111
+ expect(result.achieved[0].metricName).toBe('errorRate');
112
+ expect(result.failed).toHaveLength(0);
113
+ });
114
+ // ── 7. checkGoals — failed ────────────────────────────
115
+ it('marks goal as failed when deadline passes without achievement', () => {
116
+ const engine = new GoalEngine(db, { brainName: 'test' });
117
+ engine.createGoal('Unreachable', 'metric', 100, 10, { currentCycle: 0, baselineValue: 0 });
118
+ // Record some progress but not enough
119
+ engine.recordProgress(5, { metric: 30 });
120
+ const result = engine.checkGoals(10); // deadline reached (elapsed = 10 - 0 = 10 >= 10)
121
+ expect(result.failed).toHaveLength(1);
122
+ expect(result.failed[0].title).toBe('Unreachable');
123
+ expect(result.failed[0].status).toBe('failed');
124
+ expect(result.achieved).toHaveLength(0);
125
+ });
126
+ // ── 8. pauseGoal / resumeGoal ─────────────────────────
127
+ it('pauses and resumes goals', () => {
128
+ const engine = new GoalEngine(db, { brainName: 'test' });
129
+ const goal = engine.createGoal('Pausable', 'metric', 50, 30);
130
+ expect(engine.pauseGoal(goal.id)).toBe(true);
131
+ expect(engine.getGoal(goal.id).status).toBe('paused');
132
+ // Pausing again fails (not active)
133
+ expect(engine.pauseGoal(goal.id)).toBe(false);
134
+ // Resume works
135
+ expect(engine.resumeGoal(goal.id, 5)).toBe(true);
136
+ expect(engine.getGoal(goal.id).status).toBe('active');
137
+ // Resuming again fails (not paused)
138
+ expect(engine.resumeGoal(goal.id, 5)).toBe(false);
139
+ // Pause/resume on non-existent goal
140
+ expect(engine.pauseGoal(9999)).toBe(false);
141
+ expect(engine.resumeGoal(9999, 0)).toBe(false);
142
+ });
143
+ // ── 9. getProgress ────────────────────────────────────
144
+ it('returns progress report with percent and trend', () => {
145
+ const engine = new GoalEngine(db, { brainName: 'test' });
146
+ const goal = engine.createGoal('Track me', 'metric', 100, 50, { baselineValue: 0 });
147
+ // Record improving data points
148
+ engine.recordProgress(1, { metric: 20 });
149
+ engine.recordProgress(2, { metric: 40 });
150
+ engine.recordProgress(3, { metric: 60 });
151
+ const report = engine.getProgress(goal.id);
152
+ expect(report).not.toBeNull();
153
+ expect(report.goal.title).toBe('Track me');
154
+ expect(report.progressPercent).toBe(60); // 60/100 * 100
155
+ expect(report.trend).toBe('improving');
156
+ expect(report.dataPoints).toBe(3);
157
+ // Non-existent goal returns null
158
+ expect(engine.getProgress(9999)).toBeNull();
159
+ });
160
+ it('detects declining trend for higher_is_better', () => {
161
+ const engine = new GoalEngine(db, { brainName: 'test' });
162
+ const goal = engine.createGoal('Declining', 'metric', 100, 50, { baselineValue: 50 });
163
+ engine.recordProgress(1, { metric: 45 });
164
+ engine.recordProgress(2, { metric: 40 });
165
+ engine.recordProgress(3, { metric: 35 });
166
+ const report = engine.getProgress(goal.id);
167
+ expect(report.trend).toBe('declining');
168
+ // Progress should be 0 because currentValue (35) < baselineValue (50) — negative clamped by formula
169
+ expect(report.progressPercent).toBeLessThanOrEqual(0);
170
+ });
171
+ // ── 10. getStatus ─────────────────────────────────────
172
+ it('returns engine status with counts and recent achievements', () => {
173
+ const engine = new GoalEngine(db, { brainName: 'test' });
174
+ engine.createGoal('Active1', 'a', 10, 50);
175
+ engine.createGoal('Active2', 'b', 10, 50);
176
+ engine.createGoal('ToAchieve', 'c', 5, 50);
177
+ // Achieve one
178
+ engine.recordProgress(1, { c: 5 });
179
+ engine.checkGoals(1);
180
+ // Pause one
181
+ engine.pauseGoal(engine.listGoals('active')[0].id);
182
+ const status = engine.getStatus();
183
+ expect(status.totalGoals).toBe(3);
184
+ expect(status.activeGoals).toBe(1);
185
+ expect(status.achievedGoals).toBe(1);
186
+ expect(status.pausedGoals).toBe(1);
187
+ expect(status.failedGoals).toBe(0);
188
+ expect(status.recentAchievements).toHaveLength(1);
189
+ expect(status.recentAchievements[0].title).toBe('ToAchieve');
190
+ expect(status.topActive).toHaveLength(1);
191
+ expect(status.uptime).toBeGreaterThanOrEqual(0);
192
+ });
193
+ // ── 11. runGoalEngineMigration is idempotent ──────────
194
+ it('migration is idempotent — can run twice without error', () => {
195
+ runGoalEngineMigration(db);
196
+ runGoalEngineMigration(db);
197
+ // Should still work after double-migration
198
+ const engine = new GoalEngine(db, { brainName: 'test' });
199
+ const goal = engine.createGoal('After re-migrate', 'x', 10, 20);
200
+ expect(goal.id).toBeGreaterThan(0);
201
+ });
202
+ });
203
+ //# sourceMappingURL=goal-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-engine.test.js","sourceRoot":"","sources":["../../../src/goals/__tests__/goal-engine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,343 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import Database from 'better-sqlite3';
3
+ import { GuardrailEngine, runGuardrailMigration, } from '../guardrail-engine.js';
4
+ vi.mock('../../utils/logger.js', () => ({
5
+ getLogger: () => ({
6
+ info: vi.fn(),
7
+ warn: vi.fn(),
8
+ error: vi.fn(),
9
+ debug: vi.fn(),
10
+ }),
11
+ }));
12
+ describe('GuardrailEngine', () => {
13
+ let db;
14
+ let engine;
15
+ beforeEach(() => {
16
+ db = new Database(':memory:');
17
+ runGuardrailMigration(db);
18
+ engine = new GuardrailEngine(db, { brainName: 'test-brain' });
19
+ });
20
+ afterEach(() => {
21
+ db.close();
22
+ });
23
+ // ── 1. Creation & Defaults ──────────────────────────────
24
+ it('creates engine with default config values', () => {
25
+ const status = engine.getStatus();
26
+ expect(status.circuitBreakerTripped).toBe(false);
27
+ expect(status.circuitBreakerReason).toBeNull();
28
+ expect(status.totalRollbacks).toBe(0);
29
+ expect(status.protectedPaths.length).toBeGreaterThan(0);
30
+ expect(typeof status.healthScore).toBe('number');
31
+ });
32
+ it('creates engine with custom config overrides', () => {
33
+ const custom = {
34
+ brainName: 'custom',
35
+ minFitnessDelta: 0.05,
36
+ declineThreshold: 5,
37
+ maxWarnings: 10,
38
+ };
39
+ const customEngine = new GuardrailEngine(db, custom);
40
+ // Custom minFitnessDelta: improvement of 0.03 should be rejected (< 0.05)
41
+ expect(customEngine.checkFitnessDelta(0.5, 0.53)).toBe(false);
42
+ // But 0.06 improvement passes
43
+ expect(customEngine.checkFitnessDelta(0.5, 0.56)).toBe(true);
44
+ });
45
+ // ── 2. validateParameterChange ──────────────────────────
46
+ describe('validateParameterChange', () => {
47
+ it('allows change when no registry is set (no bounds check)', () => {
48
+ const result = engine.validateParameterChange('some:param', 0.3, 0.5);
49
+ expect(result.allowed).toBe(true);
50
+ expect(result.reason).toBe('OK');
51
+ });
52
+ it('returns allowed=true with reason "No change" for identical values', () => {
53
+ const result = engine.validateParameterChange('some:param', 0.5, 0.5);
54
+ expect(result.allowed).toBe(true);
55
+ expect(result.reason).toBe('No change');
56
+ });
57
+ it('blocks all changes when circuit breaker is tripped', () => {
58
+ engine.tripCircuitBreaker('overheated');
59
+ const result = engine.validateParameterChange('some:param', 0.3, 0.5);
60
+ expect(result.allowed).toBe(false);
61
+ expect(result.reason).toContain('Circuit breaker tripped');
62
+ expect(result.reason).toContain('overheated');
63
+ });
64
+ it('rejects out-of-bounds values when registry is set', () => {
65
+ const mockRegistry = {
66
+ list: () => [
67
+ { engine: 'dream', name: 'interval', value: 300000, min: 60000, max: 600000, description: 'test' },
68
+ ],
69
+ set: vi.fn(),
70
+ };
71
+ engine.setParameterRegistry(mockRegistry);
72
+ const result = engine.validateParameterChange('dream:interval', 300000, 700000);
73
+ expect(result.allowed).toBe(false);
74
+ expect(result.reason).toContain('out of bounds');
75
+ });
76
+ it('rejects jumps larger than 50% of parameter range', () => {
77
+ const mockRegistry = {
78
+ list: () => [
79
+ { engine: 'prediction', name: 'alpha', value: 0.3, min: 0.1, max: 0.9, description: 'test' },
80
+ ],
81
+ set: vi.fn(),
82
+ };
83
+ engine.setParameterRegistry(mockRegistry);
84
+ // Range = 0.8, jump = 0.5 which is 62.5% of range => reject
85
+ const result = engine.validateParameterChange('prediction:alpha', 0.1, 0.6);
86
+ expect(result.allowed).toBe(false);
87
+ expect(result.reason).toContain('too large');
88
+ });
89
+ });
90
+ // ── 3. checkFitnessDelta ────────────────────────────────
91
+ describe('checkFitnessDelta', () => {
92
+ it('returns true when improvement meets default threshold (0.01)', () => {
93
+ expect(engine.checkFitnessDelta(0.50, 0.52)).toBe(true);
94
+ });
95
+ it('returns false when improvement is below default threshold', () => {
96
+ expect(engine.checkFitnessDelta(0.50, 0.505)).toBe(false);
97
+ });
98
+ it('returns false for fitness decline', () => {
99
+ expect(engine.checkFitnessDelta(0.60, 0.40)).toBe(false);
100
+ });
101
+ it('respects custom minDelta override', () => {
102
+ // With minDelta=0.1, a 0.05 improvement should fail
103
+ expect(engine.checkFitnessDelta(0.50, 0.55, 0.1)).toBe(false);
104
+ // But 0.15 improvement passes
105
+ expect(engine.checkFitnessDelta(0.50, 0.65, 0.1)).toBe(true);
106
+ });
107
+ });
108
+ // ── 4. isProtectedPath ─────────────────────────────────
109
+ describe('isProtectedPath', () => {
110
+ it('detects IPC paths as protected', () => {
111
+ expect(engine.isProtectedPath('src/ipc/server.ts')).toBe(true);
112
+ });
113
+ it('detects guardrails paths as protected', () => {
114
+ expect(engine.isProtectedPath('src/guardrails/guardrail-engine.ts')).toBe(true);
115
+ });
116
+ it('detects db paths as protected', () => {
117
+ expect(engine.isProtectedPath('src/db/connection.ts')).toBe(true);
118
+ });
119
+ it('detects migration paths as protected', () => {
120
+ expect(engine.isProtectedPath('migrations/001_init.sql')).toBe(true);
121
+ });
122
+ it('normalizes backslashes and still detects protection', () => {
123
+ expect(engine.isProtectedPath('src\\ipc\\client.ts')).toBe(true);
124
+ });
125
+ it('allows unprotected paths', () => {
126
+ expect(engine.isProtectedPath('src/dream/dream-engine.ts')).toBe(false);
127
+ expect(engine.isProtectedPath('src/goals/goal-engine.ts')).toBe(false);
128
+ });
129
+ });
130
+ // ── 5. recordParameterChange ───────────────────────────
131
+ describe('recordParameterChange', () => {
132
+ it('persists a parameter change in the database', () => {
133
+ engine.recordParameterChange('dream:interval', 300000, 350000, 0.5, 0.55, 1, 'evolution');
134
+ const row = db.prepare('SELECT * FROM parameter_changelog').get();
135
+ expect(row).toBeDefined();
136
+ expect(row.param).toBe('dream:interval');
137
+ expect(row.old_value).toBe(300000);
138
+ expect(row.new_value).toBe(350000);
139
+ expect(row.fitness_before).toBe(0.5);
140
+ expect(row.fitness_after).toBe(0.55);
141
+ expect(row.generation).toBe(1);
142
+ expect(row.source).toBe('evolution');
143
+ });
144
+ it('stores null for optional fitness/generation when not provided', () => {
145
+ engine.recordParameterChange('dream:interval', 300000, 350000);
146
+ const row = db.prepare('SELECT * FROM parameter_changelog').get();
147
+ expect(row.fitness_before).toBeNull();
148
+ expect(row.fitness_after).toBeNull();
149
+ expect(row.generation).toBeNull();
150
+ expect(row.source).toBe('evolution');
151
+ });
152
+ });
153
+ // ── 6. rollbackParameters ─────────────────────────────
154
+ describe('rollbackParameters', () => {
155
+ it('returns empty result when no changes exist', () => {
156
+ const result = engine.rollbackParameters(1);
157
+ expect(result.rolledBack).toBe(0);
158
+ expect(result.parameters).toHaveLength(0);
159
+ });
160
+ it('rolls back changes and restores old values via registry', () => {
161
+ const mockRegistry = {
162
+ list: () => [],
163
+ set: vi.fn(),
164
+ };
165
+ engine.setParameterRegistry(mockRegistry);
166
+ engine.recordParameterChange('prediction:alpha', 0.3, 0.5, 0.5, 0.55, 1);
167
+ engine.recordParameterChange('dream:interval', 300000, 400000, 0.55, 0.6, 2);
168
+ const result = engine.rollbackParameters(2);
169
+ expect(result.rolledBack).toBe(2);
170
+ expect(result.parameters).toHaveLength(2);
171
+ // Most recent first (DESC order)
172
+ expect(result.parameters[0]).toEqual({
173
+ param: 'dream:interval',
174
+ from: 400000,
175
+ to: 300000,
176
+ });
177
+ expect(result.parameters[1]).toEqual({
178
+ param: 'prediction:alpha',
179
+ from: 0.5,
180
+ to: 0.3,
181
+ });
182
+ expect(mockRegistry.set).toHaveBeenCalledTimes(2);
183
+ });
184
+ it('does not rollback without a registry', () => {
185
+ engine.recordParameterChange('prediction:alpha', 0.3, 0.5);
186
+ const result = engine.rollbackParameters(1);
187
+ // No registry => can't set values => rolledBack stays 0
188
+ expect(result.rolledBack).toBe(0);
189
+ });
190
+ });
191
+ // ── 7. Circuit Breaker ────────────────────────────────
192
+ describe('circuit breaker', () => {
193
+ it('starts un-tripped', () => {
194
+ expect(engine.isCircuitBreakerTripped()).toBe(false);
195
+ });
196
+ it('trips and records reason', () => {
197
+ engine.tripCircuitBreaker('fitness collapsed');
198
+ expect(engine.isCircuitBreakerTripped()).toBe(true);
199
+ const status = engine.getStatus();
200
+ expect(status.circuitBreakerReason).toBe('fitness collapsed');
201
+ });
202
+ it('resets after tripping', () => {
203
+ engine.tripCircuitBreaker('test');
204
+ engine.resetCircuitBreaker();
205
+ expect(engine.isCircuitBreakerTripped()).toBe(false);
206
+ const status = engine.getStatus();
207
+ expect(status.circuitBreakerReason).toBeNull();
208
+ });
209
+ it('logs trips and resets to circuit_breaker_log table', () => {
210
+ engine.tripCircuitBreaker('reason-1');
211
+ engine.resetCircuitBreaker();
212
+ const rows = db.prepare('SELECT * FROM circuit_breaker_log ORDER BY id').all();
213
+ expect(rows).toHaveLength(2);
214
+ expect(rows[0].tripped).toBe(1);
215
+ expect(rows[0].reason).toBe('reason-1');
216
+ expect(rows[1].tripped).toBe(0);
217
+ expect(rows[1].reason).toBe('Manual reset');
218
+ });
219
+ });
220
+ // ── 8. getStatus ──────────────────────────────────────
221
+ describe('getStatus', () => {
222
+ it('returns a complete status object', () => {
223
+ const status = engine.getStatus();
224
+ expect(status).toHaveProperty('circuitBreakerTripped');
225
+ expect(status).toHaveProperty('circuitBreakerReason');
226
+ expect(status).toHaveProperty('totalRollbacks');
227
+ expect(status).toHaveProperty('recentChanges');
228
+ expect(status).toHaveProperty('healthScore');
229
+ expect(status).toHaveProperty('protectedPaths');
230
+ expect(Array.isArray(status.protectedPaths)).toBe(true);
231
+ });
232
+ it('counts totalRollbacks from guardrail-rollback source', () => {
233
+ // Record a normal change and a rollback-sourced change
234
+ engine.recordParameterChange('a:b', 1, 2, undefined, undefined, undefined, 'evolution');
235
+ engine.recordParameterChange('a:b', 2, 1, undefined, undefined, undefined, 'guardrail-rollback');
236
+ engine.recordParameterChange('c:d', 5, 3, undefined, undefined, undefined, 'guardrail-rollback');
237
+ const status = engine.getStatus();
238
+ expect(status.totalRollbacks).toBe(2);
239
+ });
240
+ });
241
+ // ── 9. checkHealth ────────────────────────────────────
242
+ describe('checkHealth', () => {
243
+ it('returns healthy report when no issues exist', () => {
244
+ const report = engine.checkHealth();
245
+ expect(report.score).toBe(1);
246
+ expect(report.warnings).toHaveLength(0);
247
+ expect(report.circuitBreakerTripped).toBe(false);
248
+ expect(report.recommendation).toBe('All systems nominal');
249
+ });
250
+ it('detects fitness decline and produces high severity warning', () => {
251
+ // Insert 3+ entries where last fitness < first * 0.8
252
+ engine.recordParameterChange('a:b', 1, 2, undefined, 1.0, 1);
253
+ engine.recordParameterChange('a:b', 2, 3, undefined, 0.9, 2);
254
+ engine.recordParameterChange('a:b', 3, 4, undefined, 0.7, 3); // 0.7 < 1.0 * 0.8
255
+ const report = engine.checkHealth();
256
+ const fitnessWarning = report.warnings.find(w => w.category === 'fitness');
257
+ expect(fitnessWarning).toBeDefined();
258
+ expect(fitnessWarning.severity).toBe('high');
259
+ });
260
+ it('trips circuit breaker when maxWarnings is reached', () => {
261
+ // Use a low maxWarnings config to make tripping easier
262
+ const sensitiveEngine = new GuardrailEngine(db, {
263
+ brainName: 'test',
264
+ maxWarnings: 1,
265
+ });
266
+ // Insert fitness decline data to generate a warning
267
+ engine.recordParameterChange('a:b', 1, 2, undefined, 1.0, 1);
268
+ engine.recordParameterChange('a:b', 2, 3, undefined, 0.8, 2);
269
+ engine.recordParameterChange('a:b', 3, 4, undefined, 0.5, 3); // big drop
270
+ const report = sensitiveEngine.checkHealth();
271
+ // With maxWarnings=1, a single warning trips the breaker
272
+ if (report.warnings.length >= 1) {
273
+ expect(report.circuitBreakerTripped).toBe(true);
274
+ expect(report.recommendation).toBe('Critical issues — autonomous operations paused');
275
+ }
276
+ });
277
+ });
278
+ // ── 10. checkAutoRollback ─────────────────────────────
279
+ describe('checkAutoRollback', () => {
280
+ it('returns null when insufficient data', () => {
281
+ expect(engine.checkAutoRollback()).toBeNull();
282
+ });
283
+ it('returns null when fitness is not declining', () => {
284
+ // Insert improving fitness (declineThreshold default = 3, need 4 entries)
285
+ engine.recordParameterChange('a:b', 1, 2, 0.4, 0.5, 1);
286
+ engine.recordParameterChange('a:b', 2, 3, 0.5, 0.6, 2);
287
+ engine.recordParameterChange('a:b', 3, 4, 0.6, 0.7, 3);
288
+ engine.recordParameterChange('a:b', 4, 5, 0.7, 0.8, 4);
289
+ expect(engine.checkAutoRollback()).toBeNull();
290
+ });
291
+ it('triggers rollback when fitness declines for consecutive generations', () => {
292
+ const mockRegistry = {
293
+ list: () => [],
294
+ set: vi.fn(),
295
+ };
296
+ engine.setParameterRegistry(mockRegistry);
297
+ // Declining fitness across 4 entries (declineThreshold=3 needs 4)
298
+ engine.recordParameterChange('a:b', 0.3, 0.35, 0.6, 0.55, 1);
299
+ engine.recordParameterChange('a:b', 0.35, 0.4, 0.55, 0.50, 2);
300
+ engine.recordParameterChange('a:b', 0.4, 0.45, 0.50, 0.45, 3);
301
+ engine.recordParameterChange('a:b', 0.45, 0.5, 0.45, 0.40, 4);
302
+ const result = engine.checkAutoRollback();
303
+ expect(result).not.toBeNull();
304
+ expect(result.rolledBack).toBeGreaterThan(0);
305
+ });
306
+ });
307
+ // ── 11. getProtectedPaths ─────────────────────────────
308
+ describe('getProtectedPaths', () => {
309
+ it('returns a copy of the protected paths list', () => {
310
+ const paths = engine.getProtectedPaths();
311
+ expect(paths).toContain('src/ipc/');
312
+ expect(paths).toContain('src/guardrails/');
313
+ expect(paths).toContain('src/db/');
314
+ expect(paths).toContain('migrations/');
315
+ // Ensure it is a copy, not the original array
316
+ const paths2 = engine.getProtectedPaths();
317
+ expect(paths).not.toBe(paths2);
318
+ expect(paths).toEqual(paths2);
319
+ });
320
+ });
321
+ // ── 12. runGuardrailMigration ─────────────────────────
322
+ describe('runGuardrailMigration', () => {
323
+ it('creates the required tables and indexes', () => {
324
+ const freshDb = new Database(':memory:');
325
+ runGuardrailMigration(freshDb);
326
+ // Verify parameter_changelog table exists
327
+ const tables = freshDb.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name IN ('parameter_changelog', 'circuit_breaker_log') ORDER BY name").all();
328
+ expect(tables).toHaveLength(2);
329
+ expect(tables.map(t => t.name)).toEqual(['circuit_breaker_log', 'parameter_changelog']);
330
+ // Verify indexes exist
331
+ const indexes = freshDb.prepare("SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_param_changelog%' ORDER BY name").all();
332
+ expect(indexes).toHaveLength(2);
333
+ freshDb.close();
334
+ });
335
+ it('is idempotent (can run twice without error)', () => {
336
+ const freshDb = new Database(':memory:');
337
+ runGuardrailMigration(freshDb);
338
+ expect(() => runGuardrailMigration(freshDb)).not.toThrow();
339
+ freshDb.close();
340
+ });
341
+ });
342
+ });
343
+ //# sourceMappingURL=guardrail-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrail-engine.test.js","sourceRoot":"","sources":["../../../src/guardrails/__tests__/guardrail-engine.test.ts"],"names":[],"mappings":"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"}