@timmeck/brain-core 2.36.105 → 2.36.106

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.
@@ -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,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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timmeck/brain-core",
3
- "version": "2.36.105",
3
+ "version": "2.36.106",
4
4
  "description": "Shared core infrastructure for the Brain ecosystem — IPC, MCP, CLI, DB connection, and utilities",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",