@timmeck/brain-core 2.36.105 → 2.36.107
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/dist/index.d.ts +10 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/research/research-orchestrator.d.ts +5 -1
- package/dist/research/research-orchestrator.js +83 -1
- package/dist/research/research-orchestrator.js.map +1 -1
- package/dist/self-model/creative-test-paths.d.ts +42 -0
- package/dist/self-model/creative-test-paths.js +132 -0
- package/dist/self-model/creative-test-paths.js.map +1 -0
- package/dist/self-model/generator-improver.d.ts +51 -0
- package/dist/self-model/generator-improver.js +149 -0
- package/dist/self-model/generator-improver.js.map +1 -0
- package/dist/self-model/hypothesis-operationalizer.d.ts +64 -0
- package/dist/self-model/hypothesis-operationalizer.js +266 -0
- package/dist/self-model/hypothesis-operationalizer.js.map +1 -0
- package/dist/self-model/stage3-run-log.d.ts +52 -0
- package/dist/self-model/stage3-run-log.js +88 -0
- package/dist/self-model/stage3-run-log.js.map +1 -0
- package/dist/self-model/strategy-evolver.d.ts +36 -0
- package/dist/self-model/strategy-evolver.js +175 -0
- package/dist/self-model/strategy-evolver.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
const log = getLogger();
|
|
3
|
+
// ── Migration ────────────────────────────────────────
|
|
4
|
+
export function runOperationalizerMigration(db) {
|
|
5
|
+
// Add operationalization columns to hypotheses (if missing)
|
|
6
|
+
const cols = db.prepare("PRAGMA table_info(hypotheses)").all();
|
|
7
|
+
const colNames = new Set(cols.map(c => c.name));
|
|
8
|
+
if (!colNames.has('raw_statement')) {
|
|
9
|
+
try {
|
|
10
|
+
db.exec('ALTER TABLE hypotheses ADD COLUMN raw_statement TEXT');
|
|
11
|
+
}
|
|
12
|
+
catch { /* exists */ }
|
|
13
|
+
}
|
|
14
|
+
if (!colNames.has('testability_score')) {
|
|
15
|
+
try {
|
|
16
|
+
db.exec('ALTER TABLE hypotheses ADD COLUMN testability_score REAL');
|
|
17
|
+
}
|
|
18
|
+
catch { /* exists */ }
|
|
19
|
+
}
|
|
20
|
+
if (!colNames.has('operationalization_status')) {
|
|
21
|
+
try {
|
|
22
|
+
db.exec('ALTER TABLE hypotheses ADD COLUMN operationalization_status TEXT DEFAULT \'not_yet\'');
|
|
23
|
+
}
|
|
24
|
+
catch { /* exists */ }
|
|
25
|
+
}
|
|
26
|
+
// Entity registry
|
|
27
|
+
db.exec(`
|
|
28
|
+
CREATE TABLE IF NOT EXISTS entity_registry (
|
|
29
|
+
entity_key TEXT PRIMARY KEY,
|
|
30
|
+
aliases_json TEXT NOT NULL DEFAULT '[]',
|
|
31
|
+
source_type TEXT,
|
|
32
|
+
testable INTEGER NOT NULL DEFAULT 1,
|
|
33
|
+
domains_json TEXT NOT NULL DEFAULT '[]'
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE TABLE IF NOT EXISTS generator_diagnostics (
|
|
37
|
+
generator_id TEXT PRIMARY KEY,
|
|
38
|
+
total_generated INTEGER NOT NULL DEFAULT 0,
|
|
39
|
+
total_operationalized INTEGER NOT NULL DEFAULT 0,
|
|
40
|
+
total_not_yet INTEGER NOT NULL DEFAULT 0,
|
|
41
|
+
total_discarded INTEGER NOT NULL DEFAULT 0,
|
|
42
|
+
total_testable INTEGER NOT NULL DEFAULT 0,
|
|
43
|
+
total_validated INTEGER NOT NULL DEFAULT 0,
|
|
44
|
+
confirmed INTEGER NOT NULL DEFAULT 0,
|
|
45
|
+
rejected INTEGER NOT NULL DEFAULT 0,
|
|
46
|
+
testability_rate REAL NOT NULL DEFAULT 0,
|
|
47
|
+
operationalization_rate REAL NOT NULL DEFAULT 0,
|
|
48
|
+
validation_rate REAL NOT NULL DEFAULT 0,
|
|
49
|
+
category TEXT DEFAULT 'unknown',
|
|
50
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
51
|
+
);
|
|
52
|
+
`);
|
|
53
|
+
}
|
|
54
|
+
// ── Supported Relations ──────────────────────────────
|
|
55
|
+
const RELATION_PATTERNS = [
|
|
56
|
+
{ pattern: /co-?occur|tend to occur together|events.*together/i, type: 'co_occurs' },
|
|
57
|
+
{ pattern: /correlat|associated with|linked to|connected/i, type: 'correlates' },
|
|
58
|
+
{ pattern: /^IF |when.*then|leads to|causes|predicts|implies/i, type: 'if_then' },
|
|
59
|
+
];
|
|
60
|
+
// ── Engine ───────────────────────────────────────────
|
|
61
|
+
export class HypothesisOperationalizer {
|
|
62
|
+
db;
|
|
63
|
+
knownEntities;
|
|
64
|
+
constructor(db) {
|
|
65
|
+
this.db = db;
|
|
66
|
+
runOperationalizerMigration(db);
|
|
67
|
+
this.knownEntities = this.loadKnownEntities();
|
|
68
|
+
}
|
|
69
|
+
/** Load all observation types + entity registry as known testable entities. */
|
|
70
|
+
loadKnownEntities() {
|
|
71
|
+
const set = new Set();
|
|
72
|
+
try {
|
|
73
|
+
const obsTypes = this.db.prepare('SELECT DISTINCT type FROM observations').all();
|
|
74
|
+
for (const t of obsTypes)
|
|
75
|
+
set.add(t.type);
|
|
76
|
+
}
|
|
77
|
+
catch { /* observations may not exist */ }
|
|
78
|
+
try {
|
|
79
|
+
const entities = this.db.prepare('SELECT entity_key FROM entity_registry WHERE testable = 1').all();
|
|
80
|
+
for (const e of entities)
|
|
81
|
+
set.add(e.entity_key);
|
|
82
|
+
}
|
|
83
|
+
catch { /* */ }
|
|
84
|
+
return set;
|
|
85
|
+
}
|
|
86
|
+
/** Seed entity registry from current observation types. */
|
|
87
|
+
seedEntityRegistry() {
|
|
88
|
+
let added = 0;
|
|
89
|
+
try {
|
|
90
|
+
const types = this.db.prepare('SELECT DISTINCT type FROM observations').all();
|
|
91
|
+
const insert = this.db.prepare('INSERT OR IGNORE INTO entity_registry (entity_key, source_type, testable) VALUES (?, ?, 1)');
|
|
92
|
+
for (const t of types) {
|
|
93
|
+
const result = insert.run(t.type, 'observation');
|
|
94
|
+
if (result.changes > 0)
|
|
95
|
+
added++;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch { /* */ }
|
|
99
|
+
this.knownEntities = this.loadKnownEntities();
|
|
100
|
+
return added;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Operationalize a single hypothesis.
|
|
104
|
+
* Extracts entities from variables, detects relation type, assigns temporal spec.
|
|
105
|
+
*/
|
|
106
|
+
operationalize(hypothesisId) {
|
|
107
|
+
const hyp = this.db.prepare('SELECT id, statement, variables, condition, source FROM hypotheses WHERE id = ?')
|
|
108
|
+
.get(hypothesisId);
|
|
109
|
+
if (!hyp) {
|
|
110
|
+
return { hypothesisId, rawStatement: '', operationalStatement: null, entityA: null, entityB: null, relationType: null, windowMinutes: 0, testabilityScore: 0, status: 'discarded' };
|
|
111
|
+
}
|
|
112
|
+
const rawStatement = hyp.statement;
|
|
113
|
+
// 1. Entity grounding — extract from variables
|
|
114
|
+
let vars = [];
|
|
115
|
+
try {
|
|
116
|
+
vars = JSON.parse(hyp.variables);
|
|
117
|
+
}
|
|
118
|
+
catch { /* */ }
|
|
119
|
+
const groundedEntities = vars.filter(v => this.knownEntities.has(v));
|
|
120
|
+
const entityA = groundedEntities[0] ?? null;
|
|
121
|
+
const entityB = groundedEntities[1] ?? null;
|
|
122
|
+
// 2. Relation extraction
|
|
123
|
+
let relationType = null;
|
|
124
|
+
for (const rp of RELATION_PATTERNS) {
|
|
125
|
+
if (rp.pattern.test(rawStatement)) {
|
|
126
|
+
relationType = rp.type;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Default for creative hypotheses with 2 entities
|
|
131
|
+
if (!relationType && entityA && entityB)
|
|
132
|
+
relationType = 'co_occurs';
|
|
133
|
+
// 3. Temporal normalization
|
|
134
|
+
let windowMinutes = 10; // default
|
|
135
|
+
const hourMatch = rawStatement.match(/(\d{1,2}):00\s*UTC/);
|
|
136
|
+
if (hourMatch)
|
|
137
|
+
windowMinutes = 60; // hour-specific → wider window
|
|
138
|
+
if (relationType === 'correlates')
|
|
139
|
+
windowMinutes = 60;
|
|
140
|
+
if (relationType === 'if_then')
|
|
141
|
+
windowMinutes = 30;
|
|
142
|
+
// 4. Testability scoring
|
|
143
|
+
const entityScore = entityA && entityB ? 1.0 : entityA ? 0.4 : 0;
|
|
144
|
+
const relationScore = relationType ? 0.8 : 0.2;
|
|
145
|
+
const temporalScore = windowMinutes > 0 ? 0.9 : 0.3;
|
|
146
|
+
const measurabilityScore = groundedEntities.length >= 2 ? 1.0 : groundedEntities.length === 1 ? 0.5 : 0.1;
|
|
147
|
+
const testabilityScore = Math.round(entityScore * relationScore * temporalScore * measurabilityScore * 100) / 100;
|
|
148
|
+
// 5. Status decision
|
|
149
|
+
let status;
|
|
150
|
+
if (testabilityScore >= 0.6) {
|
|
151
|
+
status = 'operationalized';
|
|
152
|
+
}
|
|
153
|
+
else if (testabilityScore >= 0.2) {
|
|
154
|
+
status = 'not_yet_operationalized';
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
status = 'discarded';
|
|
158
|
+
}
|
|
159
|
+
// 6. Build operational statement
|
|
160
|
+
let operationalStatement = null;
|
|
161
|
+
if (status === 'operationalized' && entityA && entityB && relationType) {
|
|
162
|
+
operationalStatement = `${entityA} ${relationType === 'co_occurs' ? 'co-occurs with' : relationType === 'correlates' ? 'correlates with' : 'implies'} ${entityB} within ${windowMinutes}min window`;
|
|
163
|
+
}
|
|
164
|
+
// 7. Update hypothesis record
|
|
165
|
+
try {
|
|
166
|
+
this.db.prepare(`
|
|
167
|
+
UPDATE hypotheses SET raw_statement = ?, testability_score = ?, operationalization_status = ?
|
|
168
|
+
WHERE id = ?
|
|
169
|
+
`).run(rawStatement, testabilityScore, status, hypothesisId);
|
|
170
|
+
}
|
|
171
|
+
catch { /* columns may not exist yet */ }
|
|
172
|
+
return { hypothesisId, rawStatement, operationalStatement, entityA, entityB, relationType, windowMinutes, testabilityScore, status };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Operationalize all unprocessed creative/reasoning hypotheses.
|
|
176
|
+
*/
|
|
177
|
+
operationalizeAll() {
|
|
178
|
+
const unprocessed = this.db.prepare(`
|
|
179
|
+
SELECT id FROM hypotheses
|
|
180
|
+
WHERE source LIKE 'creative%' OR source = 'reasoning_engine'
|
|
181
|
+
ORDER BY created_at DESC LIMIT 200
|
|
182
|
+
`).all();
|
|
183
|
+
let operationalized = 0;
|
|
184
|
+
let discarded = 0;
|
|
185
|
+
let notYet = 0;
|
|
186
|
+
for (const h of unprocessed) {
|
|
187
|
+
const result = this.operationalize(h.id);
|
|
188
|
+
if (result.status === 'operationalized')
|
|
189
|
+
operationalized++;
|
|
190
|
+
else if (result.status === 'discarded')
|
|
191
|
+
discarded++;
|
|
192
|
+
else
|
|
193
|
+
notYet++;
|
|
194
|
+
}
|
|
195
|
+
return { processed: unprocessed.length, operationalized, discarded, notYet };
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Rebuild generator diagnostics from hypothesis data.
|
|
199
|
+
*/
|
|
200
|
+
rebuildDiagnostics() {
|
|
201
|
+
this.db.prepare('DELETE FROM generator_diagnostics').run();
|
|
202
|
+
const generators = this.db.prepare(`
|
|
203
|
+
SELECT source as generator_id,
|
|
204
|
+
count(*) as total_generated,
|
|
205
|
+
sum(case when operationalization_status = 'operationalized' then 1 else 0 end) as total_operationalized,
|
|
206
|
+
sum(case when operationalization_status = 'not_yet_operationalized' or operationalization_status = 'not_yet' then 1 else 0 end) as total_not_yet,
|
|
207
|
+
sum(case when operationalization_status = 'discarded' then 1 else 0 end) as total_discarded,
|
|
208
|
+
sum(case when evidence_for + evidence_against > 0 then 1 else 0 end) as total_testable,
|
|
209
|
+
sum(case when status IN ('confirmed','rejected') then 1 else 0 end) as total_validated,
|
|
210
|
+
sum(case when status = 'confirmed' then 1 else 0 end) as confirmed,
|
|
211
|
+
sum(case when status = 'rejected' then 1 else 0 end) as rejected
|
|
212
|
+
FROM hypotheses
|
|
213
|
+
GROUP BY source
|
|
214
|
+
`).all();
|
|
215
|
+
const results = [];
|
|
216
|
+
const insert = this.db.prepare(`
|
|
217
|
+
INSERT INTO generator_diagnostics (generator_id, total_generated, total_operationalized, total_not_yet, total_discarded,
|
|
218
|
+
total_testable, total_validated, confirmed, rejected, testability_rate, operationalization_rate, validation_rate, category)
|
|
219
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
220
|
+
`);
|
|
221
|
+
for (const g of generators) {
|
|
222
|
+
const total = g.total_generated || 1;
|
|
223
|
+
const testable = g.total_testable || 0;
|
|
224
|
+
const opd = g.total_operationalized || 0;
|
|
225
|
+
const confirmed = g.confirmed || 0;
|
|
226
|
+
const testabilityRate = Math.round((testable / total) * 1000) / 1000;
|
|
227
|
+
const operationalizationRate = Math.round((opd / total) * 1000) / 1000;
|
|
228
|
+
const validationRate = testable > 0 ? Math.round((confirmed / testable) * 1000) / 1000 : 0;
|
|
229
|
+
// Categorize
|
|
230
|
+
let category = 'unknown';
|
|
231
|
+
if (testabilityRate > 0.5 && validationRate > 0.3)
|
|
232
|
+
category = 'strong_performer';
|
|
233
|
+
else if (testabilityRate < 0.05)
|
|
234
|
+
category = 'testability_limited';
|
|
235
|
+
else if (testabilityRate > 0.3 && validationRate < 0.1)
|
|
236
|
+
category = 'poor_validator';
|
|
237
|
+
else if (testabilityRate < 0.2 && total > 50)
|
|
238
|
+
category = 'exploratory_but_unintegrated';
|
|
239
|
+
else if (total < 30)
|
|
240
|
+
category = 'insufficient_data';
|
|
241
|
+
const diag = {
|
|
242
|
+
generator_id: g.generator_id,
|
|
243
|
+
total_generated: g.total_generated,
|
|
244
|
+
total_operationalized: opd,
|
|
245
|
+
total_testable: testable,
|
|
246
|
+
total_validated: g.total_validated || 0,
|
|
247
|
+
confirmed,
|
|
248
|
+
rejected: g.rejected || 0,
|
|
249
|
+
testability_rate: testabilityRate,
|
|
250
|
+
operationalization_rate: operationalizationRate,
|
|
251
|
+
validation_rate: validationRate,
|
|
252
|
+
category,
|
|
253
|
+
};
|
|
254
|
+
insert.run(diag.generator_id, diag.total_generated, diag.total_operationalized, g.total_not_yet || 0, g.total_discarded || 0, diag.total_testable, diag.total_validated, diag.confirmed, diag.rejected, diag.testability_rate, diag.operationalization_rate, diag.validation_rate, diag.category);
|
|
255
|
+
results.push(diag);
|
|
256
|
+
}
|
|
257
|
+
log.info(`[operationalizer] Rebuilt diagnostics for ${results.length} generators`);
|
|
258
|
+
return results;
|
|
259
|
+
}
|
|
260
|
+
/** Get generator diagnostics report. */
|
|
261
|
+
getDiagnostics() {
|
|
262
|
+
return this.db.prepare('SELECT * FROM generator_diagnostics ORDER BY total_generated DESC')
|
|
263
|
+
.all();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=hypothesis-operationalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hypothesis-operationalizer.js","sourceRoot":"","sources":["../../src/self-model/hypothesis-operationalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage-3 Run Log — Observability for Self-Model execution stages.
|
|
3
|
+
*
|
|
4
|
+
* Every Stage-3 sub-step (operationalize, diagnose, improve, evolve)
|
|
5
|
+
* gets individually tracked with timing, success/failure, and error details.
|
|
6
|
+
*
|
|
7
|
+
* P0 fix: no more swallowed errors in catch blocks.
|
|
8
|
+
*/
|
|
9
|
+
import type Database from 'better-sqlite3';
|
|
10
|
+
export declare function runStage3RunLogMigration(db: Database.Database): void;
|
|
11
|
+
export type Stage3StageName = 'operationalize' | 'diagnose' | 'improve' | 'evolve';
|
|
12
|
+
export interface Stage3RunEntry {
|
|
13
|
+
cycle: number;
|
|
14
|
+
stage: Stage3StageName;
|
|
15
|
+
status: 'success' | 'failure' | 'skipped';
|
|
16
|
+
duration_ms: number;
|
|
17
|
+
result?: Record<string, unknown>;
|
|
18
|
+
error_message?: string;
|
|
19
|
+
error_stack?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface Stage3Summary {
|
|
22
|
+
total_runs: number;
|
|
23
|
+
successes: number;
|
|
24
|
+
failures: number;
|
|
25
|
+
by_stage: Record<string, {
|
|
26
|
+
runs: number;
|
|
27
|
+
failures: number;
|
|
28
|
+
avg_duration_ms: number;
|
|
29
|
+
}>;
|
|
30
|
+
recent_failures: Array<{
|
|
31
|
+
cycle: number;
|
|
32
|
+
stage: string;
|
|
33
|
+
error_message: string;
|
|
34
|
+
created_at: string;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
export declare class Stage3RunLog {
|
|
38
|
+
private db;
|
|
39
|
+
constructor(db: Database.Database);
|
|
40
|
+
/** Record a stage execution result. */
|
|
41
|
+
record(entry: Stage3RunEntry): void;
|
|
42
|
+
/**
|
|
43
|
+
* Run a stage with full instrumentation.
|
|
44
|
+
* Returns the result or undefined on failure. Never throws.
|
|
45
|
+
*/
|
|
46
|
+
runStage<T>(cycle: number, stage: Stage3StageName, fn: () => T, log: {
|
|
47
|
+
warn: (msg: string) => void;
|
|
48
|
+
info: (msg: string) => void;
|
|
49
|
+
}): T | undefined;
|
|
50
|
+
/** Get summary of all Stage-3 runs. */
|
|
51
|
+
getSummary(): Stage3Summary;
|
|
52
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// ── Migration ────────────────────────────────────────
|
|
2
|
+
export function runStage3RunLogMigration(db) {
|
|
3
|
+
db.exec(`
|
|
4
|
+
CREATE TABLE IF NOT EXISTS stage3_run_log (
|
|
5
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
6
|
+
cycle INTEGER NOT NULL,
|
|
7
|
+
stage TEXT NOT NULL,
|
|
8
|
+
status TEXT NOT NULL,
|
|
9
|
+
duration_ms INTEGER NOT NULL,
|
|
10
|
+
result_json TEXT,
|
|
11
|
+
error_message TEXT,
|
|
12
|
+
error_stack TEXT,
|
|
13
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
14
|
+
);
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_s3rl_cycle ON stage3_run_log(cycle);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS idx_s3rl_stage ON stage3_run_log(stage);
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_s3rl_status ON stage3_run_log(status);
|
|
18
|
+
`);
|
|
19
|
+
}
|
|
20
|
+
// ── Engine ───────────────────────────────────────────
|
|
21
|
+
export class Stage3RunLog {
|
|
22
|
+
db;
|
|
23
|
+
constructor(db) {
|
|
24
|
+
this.db = db;
|
|
25
|
+
runStage3RunLogMigration(db);
|
|
26
|
+
}
|
|
27
|
+
/** Record a stage execution result. */
|
|
28
|
+
record(entry) {
|
|
29
|
+
this.db.prepare(`
|
|
30
|
+
INSERT INTO stage3_run_log (cycle, stage, status, duration_ms, result_json, error_message, error_stack)
|
|
31
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
32
|
+
`).run(entry.cycle, entry.stage, entry.status, entry.duration_ms, entry.result ? JSON.stringify(entry.result) : null, entry.error_message ?? null, entry.error_stack ?? null);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Run a stage with full instrumentation.
|
|
36
|
+
* Returns the result or undefined on failure. Never throws.
|
|
37
|
+
*/
|
|
38
|
+
runStage(cycle, stage, fn, log) {
|
|
39
|
+
const start = Date.now();
|
|
40
|
+
try {
|
|
41
|
+
const result = fn();
|
|
42
|
+
const duration = Date.now() - start;
|
|
43
|
+
this.record({
|
|
44
|
+
cycle, stage, status: 'success', duration_ms: duration,
|
|
45
|
+
result: typeof result === 'object' && result !== null ? result : { value: result },
|
|
46
|
+
});
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const duration = Date.now() - start;
|
|
51
|
+
const error = err;
|
|
52
|
+
const message = error.message || String(err);
|
|
53
|
+
const stack = error.stack?.substring(0, 500) || '';
|
|
54
|
+
// Log at WARN level — never silently swallow
|
|
55
|
+
log.warn(`[stage3] ${stage} FAILED in cycle ${cycle} (${duration}ms): ${message}`);
|
|
56
|
+
this.record({
|
|
57
|
+
cycle, stage, status: 'failure', duration_ms: duration,
|
|
58
|
+
error_message: message, error_stack: stack,
|
|
59
|
+
});
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Get summary of all Stage-3 runs. */
|
|
64
|
+
getSummary() {
|
|
65
|
+
const total = this.db.prepare('SELECT count(*) as c FROM stage3_run_log').get().c;
|
|
66
|
+
const successes = this.db.prepare("SELECT count(*) as c FROM stage3_run_log WHERE status = 'success'").get().c;
|
|
67
|
+
const failures = total - successes;
|
|
68
|
+
const byStageRows = this.db.prepare(`
|
|
69
|
+
SELECT stage,
|
|
70
|
+
count(*) as runs,
|
|
71
|
+
sum(case when status = 'failure' then 1 else 0 end) as failures,
|
|
72
|
+
avg(duration_ms) as avg_duration_ms
|
|
73
|
+
FROM stage3_run_log
|
|
74
|
+
GROUP BY stage
|
|
75
|
+
`).all();
|
|
76
|
+
const by_stage = {};
|
|
77
|
+
for (const row of byStageRows) {
|
|
78
|
+
by_stage[row.stage] = { runs: row.runs, failures: row.failures, avg_duration_ms: Math.round(row.avg_duration_ms) };
|
|
79
|
+
}
|
|
80
|
+
const recent_failures = this.db.prepare(`
|
|
81
|
+
SELECT cycle, stage, error_message, created_at
|
|
82
|
+
FROM stage3_run_log WHERE status = 'failure'
|
|
83
|
+
ORDER BY created_at DESC LIMIT 10
|
|
84
|
+
`).all();
|
|
85
|
+
return { total_runs: total, successes, failures, by_stage, recent_failures };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=stage3-run-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage3-run-log.js","sourceRoot":"","sources":["../../src/self-model/stage3-run-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy Evolution Loop v1
|
|
3
|
+
*
|
|
4
|
+
* Manages strategy lifecycle: active → stale → archived → superseded.
|
|
5
|
+
* Ensures Brain keeps effective strategies and discards museums.
|
|
6
|
+
*
|
|
7
|
+
* Session 142 — Strategy Evolution
|
|
8
|
+
*/
|
|
9
|
+
import type Database from 'better-sqlite3';
|
|
10
|
+
export declare function runStrategyEvolverMigration(db: Database.Database): void;
|
|
11
|
+
export interface StrategyEvolutionEvent {
|
|
12
|
+
strategyId: string;
|
|
13
|
+
eventType: 'promoted' | 'marked_stale' | 'archived' | 'superseded';
|
|
14
|
+
reason: string;
|
|
15
|
+
metrics: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface StrategyEvolutionReport {
|
|
18
|
+
total: number;
|
|
19
|
+
active: number;
|
|
20
|
+
stale: number;
|
|
21
|
+
archived: number;
|
|
22
|
+
effectiveRatio: number;
|
|
23
|
+
events: StrategyEvolutionEvent[];
|
|
24
|
+
}
|
|
25
|
+
export declare class StrategyEvolver {
|
|
26
|
+
private db;
|
|
27
|
+
constructor(db: Database.Database);
|
|
28
|
+
/**
|
|
29
|
+
* Run the evolution cycle — promote, stale-mark, archive, compute fitness.
|
|
30
|
+
*/
|
|
31
|
+
evolve(): StrategyEvolutionEvent[];
|
|
32
|
+
private setStatus;
|
|
33
|
+
private logEvent;
|
|
34
|
+
/** Get evolution report. */
|
|
35
|
+
getReport(): StrategyEvolutionReport;
|
|
36
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
const log = getLogger();
|
|
3
|
+
// ── Migration ────────────────────────────────────────
|
|
4
|
+
export function runStrategyEvolverMigration(db) {
|
|
5
|
+
db.exec(`
|
|
6
|
+
CREATE TABLE IF NOT EXISTS strategy_evolution_log (
|
|
7
|
+
id TEXT PRIMARY KEY,
|
|
8
|
+
strategy_id TEXT NOT NULL,
|
|
9
|
+
event_type TEXT NOT NULL,
|
|
10
|
+
reason TEXT NOT NULL,
|
|
11
|
+
metrics_json TEXT,
|
|
12
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
13
|
+
);
|
|
14
|
+
CREATE INDEX IF NOT EXISTS idx_sel_strategy ON strategy_evolution_log(strategy_id);
|
|
15
|
+
`);
|
|
16
|
+
// Add status + fitness columns if missing
|
|
17
|
+
const cols = db.prepare("PRAGMA table_info(knowledge_strategies)").all();
|
|
18
|
+
const colNames = new Set(cols.map(c => c.name));
|
|
19
|
+
if (!colNames.has('status')) {
|
|
20
|
+
try {
|
|
21
|
+
db.exec("ALTER TABLE knowledge_strategies ADD COLUMN status TEXT DEFAULT 'active'");
|
|
22
|
+
}
|
|
23
|
+
catch { /* */ }
|
|
24
|
+
}
|
|
25
|
+
if (!colNames.has('fitness')) {
|
|
26
|
+
try {
|
|
27
|
+
db.exec('ALTER TABLE knowledge_strategies ADD COLUMN fitness REAL DEFAULT 0.5');
|
|
28
|
+
}
|
|
29
|
+
catch { /* */ }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// ── Engine ───────────────────────────────────────────
|
|
33
|
+
export class StrategyEvolver {
|
|
34
|
+
db;
|
|
35
|
+
constructor(db) {
|
|
36
|
+
this.db = db;
|
|
37
|
+
runStrategyEvolverMigration(db);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run the evolution cycle — promote, stale-mark, archive, compute fitness.
|
|
41
|
+
*/
|
|
42
|
+
evolve() {
|
|
43
|
+
const events = [];
|
|
44
|
+
const strategies = this.db.prepare(`
|
|
45
|
+
SELECT id, domain, description,
|
|
46
|
+
coalesce(use_count, 0) as use_count,
|
|
47
|
+
coalesce(success_count, 0) as success_count,
|
|
48
|
+
coalesce(failure_count, 0) as failure_count,
|
|
49
|
+
coalesce(effectiveness, 0.5) as effectiveness,
|
|
50
|
+
last_used_at, created_at,
|
|
51
|
+
coalesce(status, 'active') as status
|
|
52
|
+
FROM knowledge_strategies
|
|
53
|
+
`).all();
|
|
54
|
+
for (const s of strategies) {
|
|
55
|
+
const id = s.id;
|
|
56
|
+
const useCount = s.use_count;
|
|
57
|
+
const successCount = s.success_count;
|
|
58
|
+
const failureCount = s.failure_count;
|
|
59
|
+
const status = s.status;
|
|
60
|
+
const createdAt = s.created_at;
|
|
61
|
+
const lastUsedAt = s.last_used_at;
|
|
62
|
+
const totalOutcomes = successCount + failureCount;
|
|
63
|
+
const successRate = totalOutcomes > 0 ? successCount / totalOutcomes : 0;
|
|
64
|
+
const ageDays = createdAt ? (Date.now() - new Date(createdAt).getTime()) / 86400000 : 0;
|
|
65
|
+
// Compute fitness
|
|
66
|
+
const recentBonus = lastUsedAt && (Date.now() - new Date(lastUsedAt).getTime()) < 86400000 ? 0.2 : 0;
|
|
67
|
+
const fitness = Math.round((successRate * 0.5) +
|
|
68
|
+
(Math.log(useCount + 1) / 10 * 0.2) +
|
|
69
|
+
(recentBonus) -
|
|
70
|
+
(failureCount > successCount * 2 ? 0.1 : 0)
|
|
71
|
+
* 100) / 100;
|
|
72
|
+
// Update fitness
|
|
73
|
+
try {
|
|
74
|
+
this.db.prepare('UPDATE knowledge_strategies SET fitness = ? WHERE id = ?').run(fitness, id);
|
|
75
|
+
}
|
|
76
|
+
catch { /* */ }
|
|
77
|
+
// Rule A: Museum detection — unused for 7+ days
|
|
78
|
+
if (useCount === 0 && ageDays > 7 && status === 'active') {
|
|
79
|
+
this.setStatus(id, 'stale');
|
|
80
|
+
const event = {
|
|
81
|
+
strategyId: id, eventType: 'marked_stale',
|
|
82
|
+
reason: `Unused for ${Math.round(ageDays)} days (0 executions)`,
|
|
83
|
+
metrics: { use_count: useCount, age_days: Math.round(ageDays) },
|
|
84
|
+
};
|
|
85
|
+
this.logEvent(event);
|
|
86
|
+
events.push(event);
|
|
87
|
+
}
|
|
88
|
+
// Rule B: Bad strategy → stale
|
|
89
|
+
if (useCount > 10 && successRate < 0.2 && status === 'active') {
|
|
90
|
+
this.setStatus(id, 'stale');
|
|
91
|
+
const event = {
|
|
92
|
+
strategyId: id, eventType: 'marked_stale',
|
|
93
|
+
reason: `Low success rate: ${(successRate * 100).toFixed(1)}% over ${useCount} uses`,
|
|
94
|
+
metrics: { success_rate: successRate, use_count: useCount },
|
|
95
|
+
};
|
|
96
|
+
this.logEvent(event);
|
|
97
|
+
events.push(event);
|
|
98
|
+
}
|
|
99
|
+
// Rule C: Good strategy → promote (boost effectiveness)
|
|
100
|
+
if (useCount > 10 && successRate > 0.6 && status === 'active') {
|
|
101
|
+
try {
|
|
102
|
+
this.db.prepare('UPDATE knowledge_strategies SET effectiveness = MIN(1.0, effectiveness + 0.05) WHERE id = ?').run(id);
|
|
103
|
+
}
|
|
104
|
+
catch { /* */ }
|
|
105
|
+
const event = {
|
|
106
|
+
strategyId: id, eventType: 'promoted',
|
|
107
|
+
reason: `Strong performer: ${(successRate * 100).toFixed(1)}% success over ${useCount} uses`,
|
|
108
|
+
metrics: { success_rate: successRate, use_count: useCount, fitness },
|
|
109
|
+
};
|
|
110
|
+
this.logEvent(event);
|
|
111
|
+
events.push(event);
|
|
112
|
+
}
|
|
113
|
+
// Rule D: Stale for 14+ days → archive
|
|
114
|
+
if (status === 'stale' && ageDays > 14) {
|
|
115
|
+
this.setStatus(id, 'archived');
|
|
116
|
+
const event = {
|
|
117
|
+
strategyId: id, eventType: 'archived',
|
|
118
|
+
reason: `Stale for ${Math.round(ageDays - 7)} days, never recovered`,
|
|
119
|
+
metrics: { age_days: Math.round(ageDays), use_count: useCount },
|
|
120
|
+
};
|
|
121
|
+
this.logEvent(event);
|
|
122
|
+
events.push(event);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (events.length > 0) {
|
|
126
|
+
log.info(`[evolver] ${events.length} strategy evolution events`);
|
|
127
|
+
}
|
|
128
|
+
return events;
|
|
129
|
+
}
|
|
130
|
+
setStatus(strategyId, status) {
|
|
131
|
+
try {
|
|
132
|
+
this.db.prepare('UPDATE knowledge_strategies SET status = ? WHERE id = ?').run(status, strategyId);
|
|
133
|
+
}
|
|
134
|
+
catch { /* */ }
|
|
135
|
+
}
|
|
136
|
+
logEvent(event) {
|
|
137
|
+
const id = `evo-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
|
|
138
|
+
try {
|
|
139
|
+
this.db.prepare(`
|
|
140
|
+
INSERT INTO strategy_evolution_log (id, strategy_id, event_type, reason, metrics_json)
|
|
141
|
+
VALUES (?, ?, ?, ?, ?)
|
|
142
|
+
`).run(id, event.strategyId, event.eventType, event.reason, JSON.stringify(event.metrics));
|
|
143
|
+
}
|
|
144
|
+
catch { /* */ }
|
|
145
|
+
}
|
|
146
|
+
/** Get evolution report. */
|
|
147
|
+
getReport() {
|
|
148
|
+
const total = this.db.prepare('SELECT count(*) as c FROM knowledge_strategies').get().c;
|
|
149
|
+
let active = 0;
|
|
150
|
+
let stale = 0;
|
|
151
|
+
let archived = 0;
|
|
152
|
+
try {
|
|
153
|
+
active = this.db.prepare("SELECT count(*) as c FROM knowledge_strategies WHERE coalesce(status,'active') = 'active'").get().c;
|
|
154
|
+
stale = this.db.prepare("SELECT count(*) as c FROM knowledge_strategies WHERE status = 'stale'").get().c;
|
|
155
|
+
archived = this.db.prepare("SELECT count(*) as c FROM knowledge_strategies WHERE status = 'archived'").get().c;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
active = total;
|
|
159
|
+
}
|
|
160
|
+
const used = this.db.prepare('SELECT count(*) as c FROM knowledge_strategies WHERE coalesce(use_count,0) > 0').get().c;
|
|
161
|
+
const effectiveRatio = total > 0 ? Math.round((used / total) * 1000) / 10 : 0;
|
|
162
|
+
const events = this.db.prepare('SELECT strategy_id as strategyId, event_type as eventType, reason, metrics_json FROM strategy_evolution_log ORDER BY created_at DESC LIMIT 20')
|
|
163
|
+
.all();
|
|
164
|
+
return {
|
|
165
|
+
total, active, stale, archived, effectiveRatio,
|
|
166
|
+
events: events.map(e => ({
|
|
167
|
+
strategyId: e.strategyId,
|
|
168
|
+
eventType: e.eventType,
|
|
169
|
+
reason: e.reason,
|
|
170
|
+
metrics: JSON.parse(e.metrics_json || '{}'),
|
|
171
|
+
})),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=strategy-evolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-evolver.js","sourceRoot":"","sources":["../../src/self-model/strategy-evolver.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED