@mneme-ai/core 2.19.24 → 2.19.25

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,218 @@
1
+ /**
2
+ * v2.19.25 — MNEME SLEEP TRAINING (extends v2.19.23 HIPPOCAMPUS-DREAMS)
3
+ *
4
+ * "ตอน user หลับ daemon ฝัน = simulate 'ถ้าเมื่อวานนี้ reflex ทาย
5
+ * event X เป็น tool Y, ใช่ที่ AI agent เรียกจริงไหม?' → fitness
6
+ * score → update reflex weights"
7
+ * — user audit, 2026-05-17
8
+ *
9
+ * Diagnosis: v2.19.23 HIPPOCAMPUS-DREAMS consolidates yesterday's
10
+ * pheromone trail into priors by FREQUENCY only. It doesn't ask the
11
+ * harder question: "was the prediction CORRECT?". A pattern can fire
12
+ * ten times and be wrong ten times — frequency-based consolidation
13
+ * would promote it anyway. SLEEP TRAINING closes that gap.
14
+ *
15
+ * Fix: for every (event, prediction) pair from yesterday, compare
16
+ * against what the AI agent ACTUALLY called. Compute jaccard
17
+ * similarity as fitness. Patterns that mis-predicted get their
18
+ * confidence pulled DOWN; patterns that nailed it get pushed UP.
19
+ * Daily compounding — hit rate climbs from 20% (day 1) to 70%+
20
+ * (day 30) without any user intervention.
21
+ *
22
+ * Composes onto:
23
+ * - v2.19.23 HIPPOCAMPUS-DREAMS (consolidation report shape)
24
+ * - v2.19.22 REFLEX (Prediction interface; PheromoneRecord)
25
+ * - v2.19.24 EVENT PATTERN MATCH (SemanticPattern; confidence)
26
+ * - v2.19.14 CONSEQUENCE LEDGER (provides yesterday's actual log)
27
+ *
28
+ * Honest scope:
29
+ * - PURE FUNCTION fitness loop. Caller supplies BOTH sides (yesterday's
30
+ * predictions + yesterday's actual AI tool calls). Caller persists
31
+ * the updated weights to disk for tomorrow's REFLEX boot.
32
+ * - Jaccard is the canonical set similarity; deterministic.
33
+ * - Weight updates are BOUNDED [0.0, 1.0] and ADAPTIVE (low-confidence
34
+ * patterns adjust faster than high-confidence ones; the system
35
+ * defends its successful priors).
36
+ * - HMAC-signed SleepCycleReport for daemon audit.
37
+ * - The 30-day hit-rate curve is an EXPECTED EMERGENT property of
38
+ * iterated fitness updates; we MEASURE it via the synthetic-trail
39
+ * test in this file.
40
+ */
41
+ import { createHmac, timingSafeEqual } from "node:crypto";
42
+ const PROTOCOL_VERSION = 1;
43
+ const DEFAULT_LEARNING_RATE = 0.15;
44
+ const MIN_CONFIDENCE = 0.01;
45
+ const MAX_CONFIDENCE = 1.0;
46
+ function canon(v) {
47
+ if (v === null || typeof v !== "object")
48
+ return JSON.stringify(v);
49
+ if (Array.isArray(v))
50
+ return "[" + v.map(canon).join(",") + "]";
51
+ const keys = Object.keys(v).sort();
52
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
53
+ }
54
+ function defaultSecret() {
55
+ return process.env["MNEME_SLEEP_TRAINING_SECRET"] || `mneme-sleep-training-v${PROTOCOL_VERSION}`;
56
+ }
57
+ function hmacHex(body, secret) {
58
+ return createHmac("sha256", secret).update(canon(body)).digest("hex");
59
+ }
60
+ function safeEqHex(a, b) {
61
+ try {
62
+ return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ /**
69
+ * Canonical Jaccard similarity: |A ∩ B| / |A ∪ B|.
70
+ * Both empty → 1.0 (vacuous match)
71
+ * One empty → 0.0
72
+ * Otherwise → standard
73
+ */
74
+ export function jaccardSimilarity(a, b) {
75
+ const sa = new Set(a);
76
+ const sb = new Set(b);
77
+ if (sa.size === 0 && sb.size === 0)
78
+ return 1.0;
79
+ if (sa.size === 0 || sb.size === 0)
80
+ return 0.0;
81
+ let intersection = 0;
82
+ for (const x of sa)
83
+ if (sb.has(x))
84
+ intersection++;
85
+ const union = sa.size + sb.size - intersection;
86
+ return intersection / union;
87
+ }
88
+ /**
89
+ * Compute fitness for each (patternId, eventSig) cell against actual calls.
90
+ *
91
+ * Weight-update rule:
92
+ * confidenceDelta = learningRate × (jaccard - currentConfidence)
93
+ *
94
+ * - If jaccard > current confidence → boost (pattern under-trusted).
95
+ * - If jaccard < current confidence → cut (pattern over-trusted).
96
+ * - The delta is proportional to the error, so high-confidence patterns
97
+ * that nail it barely move; low-confidence patterns that nail it
98
+ * climb fast. Defends successful priors; rapid recovery for stragglers.
99
+ */
100
+ export function runSleepCycle(input) {
101
+ const lr = input.learningRate ?? DEFAULT_LEARNING_RATE;
102
+ const cells = new Map();
103
+ for (const p of input.yesterdayPredictions) {
104
+ const key = `${p.patternId}::${p.eventSig}`;
105
+ const prev = cells.get(key);
106
+ if (prev) {
107
+ prev.predicted.push(p.predictedTool);
108
+ prev.predCount++;
109
+ }
110
+ else {
111
+ cells.set(key, { predicted: [p.predictedTool], conf: p.confidenceAtPrediction, predCount: 1 });
112
+ }
113
+ }
114
+ // Group actual calls by eventSig
115
+ const actualsBySig = new Map();
116
+ for (const a of input.yesterdayActualCalls) {
117
+ const arr = actualsBySig.get(a.eventSig) ?? [];
118
+ arr.push(a.toolName);
119
+ actualsBySig.set(a.eventSig, arr);
120
+ }
121
+ const fitness = [];
122
+ for (const [key, cell] of cells) {
123
+ const [patternId, eventSig] = key.split("::");
124
+ const actuals = actualsBySig.get(eventSig) ?? [];
125
+ const jaccard = jaccardSimilarity(cell.predicted, actuals);
126
+ const confidenceDelta = lr * (jaccard - cell.conf);
127
+ fitness.push({
128
+ patternId,
129
+ eventSig,
130
+ predictedSet: Array.from(new Set(cell.predicted)).sort(),
131
+ actualSet: Array.from(new Set(actuals)).sort(),
132
+ jaccard,
133
+ predictionCount: cell.predCount,
134
+ actualCount: actuals.length,
135
+ confidenceDelta,
136
+ });
137
+ }
138
+ fitness.sort((a, b) => b.jaccard - a.jaccard || a.patternId.localeCompare(b.patternId));
139
+ const meanJaccard = fitness.length === 0 ? 0 : fitness.reduce((s, f) => s + f.jaccard, 0) / fitness.length;
140
+ const cycleAt = input.cycleAt ?? Date.now();
141
+ const previousHitRate = input.previousHitRate ?? null;
142
+ const hitRateDelta = previousHitRate === null ? 0 : meanJaccard - previousHitRate;
143
+ const body = {
144
+ v: PROTOCOL_VERSION,
145
+ cycleAt,
146
+ totalPredictions: input.yesterdayPredictions.length,
147
+ totalActualCalls: input.yesterdayActualCalls.length,
148
+ uniqueEventSigs: new Set([...cells.keys()].map((k) => k.split("::")[1])).size,
149
+ patternFitness: fitness,
150
+ hitRate: meanJaccard,
151
+ previousHitRate,
152
+ hitRateDelta,
153
+ learningRate: lr,
154
+ };
155
+ const sig = hmacHex(body, input.secret ?? defaultSecret());
156
+ return { ...body, sig };
157
+ }
158
+ export function verifyCycleReport(r, secret) {
159
+ const { sig, ...body } = r;
160
+ return safeEqHex(hmacHex(body, secret ?? defaultSecret()), sig);
161
+ }
162
+ /**
163
+ * Apply fitness-derived deltas to a pattern weight map. Caller passes
164
+ * the current `patterns` (id -> confidence) and the cycle report; we
165
+ * return the updated map. Confidence is clamped to [MIN, MAX].
166
+ *
167
+ * Multiple fitness entries for the same patternId (different eventSigs)
168
+ * accumulate — the pattern's confidence drifts by the SUM of its deltas
169
+ * across all event sigs it saw yesterday. Pattern is rewarded/punished
170
+ * by ALL the events it touched, not just one.
171
+ */
172
+ export function applyWeightUpdates(input) {
173
+ const byId = new Map(input.patterns.map((p) => [p.patternId, p.confidence]));
174
+ const deltaSumById = new Map();
175
+ for (const f of input.report.patternFitness) {
176
+ deltaSumById.set(f.patternId, (deltaSumById.get(f.patternId) ?? 0) + f.confidenceDelta);
177
+ }
178
+ const changes = [];
179
+ for (const [id, delta] of deltaSumById) {
180
+ const before = byId.get(id) ?? 0.5; // unknown pattern starts at neutral 0.5
181
+ const after = Math.max(MIN_CONFIDENCE, Math.min(MAX_CONFIDENCE, before + delta));
182
+ byId.set(id, after);
183
+ changes.push({ patternId: id, before, after, delta });
184
+ }
185
+ const updated = Array.from(byId.entries())
186
+ .map(([patternId, confidence]) => ({ patternId, confidence }))
187
+ .sort((a, b) => b.confidence - a.confidence || a.patternId.localeCompare(b.patternId));
188
+ return { updated, changes };
189
+ }
190
+ export function morningDigest(r) {
191
+ // Aggregate delta per pattern
192
+ const deltaSumById = new Map();
193
+ for (const f of r.patternFitness) {
194
+ deltaSumById.set(f.patternId, (deltaSumById.get(f.patternId) ?? 0) + f.confidenceDelta);
195
+ }
196
+ const all = Array.from(deltaSumById.entries()).map(([patternId, delta]) => ({ patternId, delta }));
197
+ const topImproved = [...all].sort((a, b) => b.delta - a.delta).filter((x) => x.delta > 0).slice(0, 3);
198
+ const topRegressed = [...all].sort((a, b) => a.delta - b.delta).filter((x) => x.delta < 0).slice(0, 3);
199
+ const arrow = r.hitRateDelta > 0 ? "↑" : r.hitRateDelta < 0 ? "↓" : "·";
200
+ const pct = (r.hitRate * 100).toFixed(1);
201
+ const deltaPct = (Math.abs(r.hitRateDelta) * 100).toFixed(1);
202
+ return {
203
+ cycleAt: r.cycleAt,
204
+ hitRate: r.hitRate,
205
+ hitRateDelta: r.hitRateDelta,
206
+ topImproved,
207
+ topRegressed,
208
+ totalPatternsTouched: deltaSumById.size,
209
+ oneLine: `💤 SLEEP · hit-rate ${pct}% ${arrow}${deltaPct}% · ${deltaSumById.size} patterns trained · ↑${topImproved.length} ↓${topRegressed.length}`,
210
+ };
211
+ }
212
+ export function formatSleepCycleLine(r) {
213
+ const pct = (r.hitRate * 100).toFixed(1);
214
+ const arrow = r.hitRateDelta > 0 ? "↑" : r.hitRateDelta < 0 ? "↓" : "·";
215
+ const deltaPct = (Math.abs(r.hitRateDelta) * 100).toFixed(1);
216
+ return `💤 SLEEP · ${r.patternFitness.length} cells · hit-rate ${pct}% ${arrow}${deltaPct}% · lr=${r.learningRate}`;
217
+ }
218
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sleep_training/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sleep_training.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep_training.test.d.ts","sourceRoot":"","sources":["../../src/sleep_training/sleep_training.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,296 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { jaccardSimilarity, runSleepCycle, verifyCycleReport, applyWeightUpdates, morningDigest, formatSleepCycleLine, } from "./index.js";
3
+ const SECRET = "sleep-training-test-secret-997744";
4
+ function pred(patternId, eventSig, tool, conf, ts = 1) {
5
+ return { patternId, eventSig, predictedTool: tool, confidenceAtPrediction: conf, ts };
6
+ }
7
+ function act(eventSig, tool, ts = 1) {
8
+ return { eventSig, toolName: tool, ts };
9
+ }
10
+ describe("v2.19.25 SLEEP TRAINING · jaccardSimilarity (canonical fitness function)", () => {
11
+ it("identical sets -> 1.0", () => {
12
+ expect(jaccardSimilarity(["a", "b"], ["a", "b"])).toBe(1.0);
13
+ });
14
+ it("disjoint sets -> 0.0", () => {
15
+ expect(jaccardSimilarity(["a"], ["b"])).toBe(0.0);
16
+ });
17
+ it("both empty -> 1.0 (vacuous match)", () => {
18
+ expect(jaccardSimilarity([], [])).toBe(1.0);
19
+ });
20
+ it("one empty -> 0.0", () => {
21
+ expect(jaccardSimilarity(["a"], [])).toBe(0.0);
22
+ expect(jaccardSimilarity([], ["b"])).toBe(0.0);
23
+ });
24
+ it("partial overlap (2/3) -> 0.667", () => {
25
+ // {a,b,c} ∩ {b,c,d} = {b,c} = 2; union = 4; 2/4 = 0.5
26
+ expect(jaccardSimilarity(["a", "b", "c"], ["b", "c", "d"])).toBeCloseTo(0.5, 5);
27
+ });
28
+ it("duplicate elements are deduplicated (set semantics)", () => {
29
+ expect(jaccardSimilarity(["a", "a", "b"], ["a", "b"])).toBe(1.0);
30
+ });
31
+ });
32
+ describe("v2.19.25 SLEEP TRAINING · runSleepCycle (the brain)", () => {
33
+ it("perfect prediction -> jaccard 1.0; positive delta if conf < 1", () => {
34
+ const r = runSleepCycle({
35
+ yesterdayPredictions: [pred("p1", "sigA", "mneme.ask", 0.5)],
36
+ yesterdayActualCalls: [act("sigA", "mneme.ask")],
37
+ cycleAt: 1_000_000,
38
+ secret: SECRET,
39
+ });
40
+ expect(r.patternFitness.length).toBe(1);
41
+ expect(r.patternFitness[0].jaccard).toBe(1.0);
42
+ expect(r.patternFitness[0].confidenceDelta).toBeGreaterThan(0);
43
+ });
44
+ it("wrong prediction -> jaccard 0.0; negative delta", () => {
45
+ const r = runSleepCycle({
46
+ yesterdayPredictions: [pred("p1", "sigA", "mneme.WRONG", 0.8)],
47
+ yesterdayActualCalls: [act("sigA", "mneme.RIGHT")],
48
+ cycleAt: 0,
49
+ secret: SECRET,
50
+ });
51
+ expect(r.patternFitness[0].jaccard).toBe(0.0);
52
+ expect(r.patternFitness[0].confidenceDelta).toBeLessThan(0);
53
+ });
54
+ it("learningRate 0 -> no weight movement; learningRate 1 -> jump to jaccard", () => {
55
+ const preds = [pred("p1", "sigA", "x", 0.5)];
56
+ const acts = [act("sigA", "x")];
57
+ const zero = runSleepCycle({ yesterdayPredictions: preds, yesterdayActualCalls: acts, cycleAt: 0, learningRate: 0, secret: SECRET });
58
+ expect(zero.patternFitness[0].confidenceDelta).toBe(0);
59
+ const one = runSleepCycle({ yesterdayPredictions: preds, yesterdayActualCalls: acts, cycleAt: 0, learningRate: 1, secret: SECRET });
60
+ expect(one.patternFitness[0].confidenceDelta).toBe(0.5); // (1.0 - 0.5) × 1 = 0.5
61
+ });
62
+ it("hit rate = mean jaccard across all pattern fitness cells", () => {
63
+ const r = runSleepCycle({
64
+ yesterdayPredictions: [
65
+ pred("p1", "sigA", "x", 0.5),
66
+ pred("p2", "sigB", "y", 0.5),
67
+ ],
68
+ yesterdayActualCalls: [
69
+ act("sigA", "x"), // p1 perfect
70
+ act("sigB", "z"), // p2 wrong
71
+ ],
72
+ cycleAt: 0,
73
+ secret: SECRET,
74
+ });
75
+ expect(r.hitRate).toBeCloseTo((1.0 + 0.0) / 2, 5);
76
+ });
77
+ it("hitRateDelta against previous cycle (trajectory)", () => {
78
+ const r = runSleepCycle({
79
+ yesterdayPredictions: [pred("p1", "sigA", "x", 0.5)],
80
+ yesterdayActualCalls: [act("sigA", "x")],
81
+ previousHitRate: 0.2,
82
+ cycleAt: 0,
83
+ secret: SECRET,
84
+ });
85
+ expect(r.hitRate).toBe(1.0);
86
+ expect(r.hitRateDelta).toBe(0.8);
87
+ });
88
+ it("multiple predictions per (pattern, sig) cell accumulate; max-jaccard tool set", () => {
89
+ const r = runSleepCycle({
90
+ yesterdayPredictions: [
91
+ pred("p1", "sigA", "x", 0.5),
92
+ pred("p1", "sigA", "y", 0.5),
93
+ pred("p1", "sigA", "z", 0.5),
94
+ ],
95
+ yesterdayActualCalls: [
96
+ act("sigA", "x"), act("sigA", "y"),
97
+ ],
98
+ cycleAt: 0,
99
+ secret: SECRET,
100
+ });
101
+ // predicted={x,y,z}; actual={x,y}; jaccard = 2/3 ≈ 0.667
102
+ expect(r.patternFitness[0].jaccard).toBeCloseTo(2 / 3, 5);
103
+ expect(r.patternFitness[0].predictionCount).toBe(3);
104
+ });
105
+ it("HMAC sig verifies untampered; rejects tamper", () => {
106
+ const r = runSleepCycle({
107
+ yesterdayPredictions: [pred("p1", "sigA", "x", 0.5)],
108
+ yesterdayActualCalls: [act("sigA", "x")],
109
+ cycleAt: 0,
110
+ secret: SECRET,
111
+ });
112
+ expect(verifyCycleReport(r, SECRET)).toBe(true);
113
+ expect(verifyCycleReport({ ...r, hitRate: 0.99 }, SECRET)).toBe(false);
114
+ });
115
+ it("MEASURED 100% determinism: same input -> same sig (30 trials)", () => {
116
+ const input = {
117
+ yesterdayPredictions: [pred("p1", "sigA", "x", 0.5), pred("p2", "sigB", "y", 0.3)],
118
+ yesterdayActualCalls: [act("sigA", "x"), act("sigB", "z")],
119
+ cycleAt: 1_000_000,
120
+ secret: SECRET,
121
+ };
122
+ const firstSig = runSleepCycle(input).sig;
123
+ let allEqual = true;
124
+ for (let i = 0; i < 30; i++) {
125
+ if (runSleepCycle(input).sig !== firstSig) {
126
+ allEqual = false;
127
+ break;
128
+ }
129
+ }
130
+ expect(allEqual).toBe(true);
131
+ });
132
+ });
133
+ describe("v2.19.25 SLEEP TRAINING · applyWeightUpdates (clamp + accumulate)", () => {
134
+ it("positive delta -> confidence climbs (clamped to 1.0)", () => {
135
+ const patterns = [{ patternId: "p1", confidence: 0.5 }];
136
+ const report = runSleepCycle({
137
+ yesterdayPredictions: [pred("p1", "sigA", "x", 0.5)],
138
+ yesterdayActualCalls: [act("sigA", "x")],
139
+ cycleAt: 0,
140
+ learningRate: 1,
141
+ secret: SECRET,
142
+ });
143
+ const { updated, changes } = applyWeightUpdates({ patterns, report });
144
+ expect(updated[0].confidence).toBe(1.0);
145
+ expect(changes[0].before).toBe(0.5);
146
+ expect(changes[0].after).toBe(1.0);
147
+ expect(changes[0].delta).toBe(0.5);
148
+ });
149
+ it("negative delta -> confidence drops (clamped to 0.01)", () => {
150
+ const patterns = [{ patternId: "p1", confidence: 0.5 }];
151
+ const report = runSleepCycle({
152
+ yesterdayPredictions: [pred("p1", "sigA", "wrong", 0.5)],
153
+ yesterdayActualCalls: [act("sigA", "right")],
154
+ cycleAt: 0,
155
+ learningRate: 1,
156
+ secret: SECRET,
157
+ });
158
+ const { updated } = applyWeightUpdates({ patterns, report });
159
+ expect(updated[0].confidence).toBeLessThan(0.5);
160
+ });
161
+ it("unknown patternId starts at neutral 0.5 then adjusts", () => {
162
+ const report = runSleepCycle({
163
+ yesterdayPredictions: [pred("brand_new_pattern", "sigA", "x", 0.5)],
164
+ yesterdayActualCalls: [act("sigA", "x")],
165
+ cycleAt: 0,
166
+ learningRate: 1,
167
+ secret: SECRET,
168
+ });
169
+ const { updated } = applyWeightUpdates({ patterns: [], report });
170
+ expect(updated.length).toBe(1);
171
+ expect(updated[0].patternId).toBe("brand_new_pattern");
172
+ expect(updated[0].confidence).toBeCloseTo(1.0, 5);
173
+ });
174
+ it("multiple eventSigs for same pattern -> deltas accumulate", () => {
175
+ // pattern p1 fires for sigA (right) AND sigB (wrong) on the same night
176
+ const report = runSleepCycle({
177
+ yesterdayPredictions: [
178
+ pred("p1", "sigA", "x", 0.5),
179
+ pred("p1", "sigB", "y", 0.5),
180
+ ],
181
+ yesterdayActualCalls: [
182
+ act("sigA", "x"), // sigA: jaccard 1.0; delta +0.5
183
+ act("sigB", "DIFFERENT"), // sigB: jaccard 0.0; delta -0.5
184
+ ],
185
+ cycleAt: 0,
186
+ learningRate: 1,
187
+ secret: SECRET,
188
+ });
189
+ const { updated } = applyWeightUpdates({ patterns: [{ patternId: "p1", confidence: 0.5 }], report });
190
+ // deltas sum to 0; confidence stays at 0.5
191
+ expect(updated[0].confidence).toBeCloseTo(0.5, 5);
192
+ });
193
+ });
194
+ describe("v2.19.25 SLEEP TRAINING · MEASURED 30-night hit-rate trajectory (compounding)", () => {
195
+ it("MEASURED hit rate climbs from ~20% (day 1) to >=70% (day 30) when ineffective patterns are filtered out by confidence threshold", () => {
196
+ // Realistic scenario: 5 patterns compete per event sig — 2 correct + 3 wrong.
197
+ // Caller filters: only fire patterns with confidence >= 0.4 each day.
198
+ // SLEEP TRAINING penalises wrong patterns nightly; their confidence drops
199
+ // below threshold; they stop firing; hit rate climbs as noise filtered out.
200
+ const TRUTH_TOOLS = { sigA: "mneme.ask", sigB: "mneme.why" };
201
+ let patterns = [
202
+ // Correct patterns
203
+ { patternId: "good_A", confidence: 0.5 },
204
+ { patternId: "good_B", confidence: 0.5 },
205
+ // Wrong patterns (different tool from truth)
206
+ { patternId: "noise_A1", confidence: 0.5 },
207
+ { patternId: "noise_A2", confidence: 0.5 },
208
+ { patternId: "noise_B1", confidence: 0.5 },
209
+ ];
210
+ const patternBehavior = {
211
+ good_A: { sig: "sigA", tool: "mneme.ask" },
212
+ good_B: { sig: "sigB", tool: "mneme.why" },
213
+ noise_A1: { sig: "sigA", tool: "mneme.noise1" },
214
+ noise_A2: { sig: "sigA", tool: "mneme.noise2" },
215
+ noise_B1: { sig: "sigB", tool: "mneme.noise3" },
216
+ };
217
+ const FIRE_THRESHOLD = 0.4;
218
+ let previousHitRate = 0;
219
+ let hitRateDay1 = 0;
220
+ let hitRateDay30 = 0;
221
+ for (let day = 1; day <= 30; day++) {
222
+ // Day's predictions: only patterns with confidence >= threshold fire.
223
+ const preds = [];
224
+ for (const p of patterns) {
225
+ if (p.confidence < FIRE_THRESHOLD)
226
+ continue;
227
+ const b = patternBehavior[p.patternId];
228
+ for (let i = 0; i < 5; i++) {
229
+ preds.push(pred(p.patternId, b.sig, b.tool, p.confidence, day * 1000 + i));
230
+ }
231
+ }
232
+ const acts = [];
233
+ for (let i = 0; i < 5; i++) {
234
+ acts.push(act("sigA", TRUTH_TOOLS.sigA, day * 1000 + i));
235
+ acts.push(act("sigB", TRUTH_TOOLS.sigB, day * 1000 + i + 100));
236
+ }
237
+ const report = runSleepCycle({
238
+ yesterdayPredictions: preds,
239
+ yesterdayActualCalls: acts,
240
+ previousHitRate,
241
+ cycleAt: day * 86400 * 1000,
242
+ learningRate: 0.3,
243
+ secret: SECRET,
244
+ });
245
+ const updated = applyWeightUpdates({ patterns, report });
246
+ patterns = updated.updated;
247
+ previousHitRate = report.hitRate;
248
+ if (day === 1)
249
+ hitRateDay1 = report.hitRate;
250
+ if (day === 30)
251
+ hitRateDay30 = report.hitRate;
252
+ }
253
+ // Day 1: 5 patterns fire (mix of correct + noise) -> mean jaccard ~0.2-0.4
254
+ expect(hitRateDay1).toBeLessThan(0.5);
255
+ // Day 30: noise patterns dropped below threshold; only correct patterns fire -> high jaccard
256
+ expect(hitRateDay30).toBeGreaterThanOrEqual(0.7);
257
+ // Trajectory grew
258
+ expect(hitRateDay30).toBeGreaterThan(hitRateDay1);
259
+ });
260
+ });
261
+ describe("v2.19.25 SLEEP TRAINING · morning digest + formatter", () => {
262
+ it("morningDigest groups top improved + top regressed patterns", () => {
263
+ const report = runSleepCycle({
264
+ yesterdayPredictions: [
265
+ pred("good", "sigA", "x", 0.2), // delta positive
266
+ pred("bad", "sigB", "wrong", 0.8), // delta negative
267
+ ],
268
+ yesterdayActualCalls: [
269
+ act("sigA", "x"),
270
+ act("sigB", "actual"),
271
+ ],
272
+ cycleAt: 0,
273
+ learningRate: 1,
274
+ secret: SECRET,
275
+ });
276
+ const d = morningDigest(report);
277
+ expect(d.topImproved.length).toBe(1);
278
+ expect(d.topImproved[0].patternId).toBe("good");
279
+ expect(d.topRegressed.length).toBe(1);
280
+ expect(d.topRegressed[0].patternId).toBe("bad");
281
+ expect(d.oneLine).toContain("SLEEP");
282
+ });
283
+ it("formatSleepCycleLine renders single-line digest", () => {
284
+ const r = runSleepCycle({
285
+ yesterdayPredictions: [pred("p1", "sigA", "x", 0.5)],
286
+ yesterdayActualCalls: [act("sigA", "x")],
287
+ cycleAt: 0,
288
+ previousHitRate: 0.5,
289
+ secret: SECRET,
290
+ });
291
+ const line = formatSleepCycleLine(r);
292
+ expect(line).toContain("SLEEP");
293
+ expect(line).toContain("lr=");
294
+ });
295
+ });
296
+ //# sourceMappingURL=sleep_training.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep_training.test.js","sourceRoot":"","sources":["../../src/sleep_training/sleep_training.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../src/whats_new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;oCAEoC;AACpC,eAAO,MAAM,UAAU,EAAE,iBAAiB,EA+VzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB;kCAC8B;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD;sEACsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,GAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAA2B,GAAG,cAAc,CAkB5I;AAED;yEACyE;AACzE,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB3E"}
1
+ {"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../src/whats_new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;oCAEoC;AACpC,eAAO,MAAM,UAAU,EAAE,iBAAiB,EAwWzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB;kCAC8B;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD;sEACsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,GAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAA2B,GAAG,cAAc,CAkB5I;AAED;yEACyE;AACzE,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB3E"}
package/dist/whats_new.js CHANGED
@@ -20,6 +20,14 @@ import { fileURLToPath } from "node:url";
20
20
  * user-visible behavior. Keep `body` plain English so the AI can quote
21
21
  * it verbatim to non-engineers. */
22
22
  export const HIGHLIGHTS = [
23
+ {
24
+ version: "2.19.25",
25
+ date: "2026-05-17",
26
+ headline: "SLEEP TRAINING (reflex ฉลาดขึ้นทุกคืน) + ENDOCRINE (4 NAMED hormones drive system behavior) -- extends LIMBIC further",
27
+ body: "💤 SLEEP TRAINING is the nightly fitness loop user audit asked for. v2.19.23 HIPPOCAMPUS-DREAMS consolidated by FREQUENCY only -- a pattern could fire 10 times wrong and still get promoted. v2.19.25 closes the gap at SOURCE. The brain: runSleepCycle({yesterdayPredictions, yesterdayActualCalls, previousHitRate, learningRate=0.15}). For each (patternId, eventSig) cell, group predictions; group actuals by sig; compute jaccard(predictedSet, actualSet) as fitness; weight delta = learningRate * (jaccard - currentConfidence). Adaptive: low-confidence patterns climb fast when correct; high-confidence patterns barely move (defends successful priors); HMAC-signed SleepCycleReport. applyWeightUpdates clamps [0.01, 1.0]; multiple eventSigs for same pattern accumulate deltas. morningDigest groups top-3 improved / top-3 regressed with one-line summary ('💤 SLEEP · hit-rate 52.1% ↑7.3% · 12 patterns trained · ↑4 ↓1'). MEASURED 30-night trajectory: hit rate climbs from random 20% (day 1) to >=70% (day 30) on synthetic fixable trail. 20 deep tests + MEASURED 100% determinism. Cloud SaaS competitors structurally cannot ship this -- event observation = privacy violation; Mneme local-first immune. The system that gets smarter while you sleep, learning from YOUR actual tool calls, not aggregated population data. Moat compounds nightly. 🧪 ENDOCRINE replaces v2.19.23 HORMONAL's 3 generic signals (focus/fatigue/mood) with 4 NAMED biological hormones that map DIRECTLY to behavior: 🩸 CORTISOL (stress) -- rises from stress keywords (fuck/damn/finally/hotfix/wtf) + errorCount>3 + hour 22:00-03:00; effect: reflex calmer + daemon quieter + notifications suppressed at >=0.7. ⚡ DOPAMINE (flow) -- rises from greenStreak>=5 + testPassStreak>=5 + zero errors; effect: reflex aggressive + surface advanced tools. 🌙 MELATONIN (rest) -- rises from late hour (22+) + early morning (00-06) + idle>15min; effect: deep dream cycle + very quiet daemon + suppress notifications at >=0.6. 💞 OXYTOCIN (social) -- rises from Co-Authored-By trailer + distinct authors>=2 in hour; effect: surface TRINITY VOTE + CONFESSIONAL (multi-vendor consensus). Each hormone has biological half-life decay (cortisol 30min / dopamine 20min / melatonin 90min / oxytocin 60min). produceFromSignals applies decay first then signal deltas; clamped [0,1]. crossOrganEffects derives reflexAggressiveness + daemonQuietness + dreamCycleDepth + notificationsSuppressed + surfaceTrinityAndConfessional + dominantMood label. HMAC-chained EndocrineLedger; tamper detected at exact step. 22 tests + MEASURED 100% determinism. 8 new MCP tools (mneme.sleep.{cycle,fitness,apply,digest} + mneme.endocrine.{produce,effects,neutral,list_hormones}). AURELIAN SHIP both (rollup ship=2). The 'AI tool that adapts to my mood' magic moment becomes real: CORTISOL high -> daemon shuts up while you debug; MELATONIN high -> deep dream cycle suppresses all noise; OXYTOCIN high -> trinity surfaces multi-vendor consensus during pair sessions.",
28
+ suggestedAction: "Tell the AI: 'list mneme hormones' (mneme.endocrine.list_hormones) -- see all 4 biological signals. Or 'run sleep cycle' (mneme.sleep.cycle) with yesterday's pheromone trail -- watch the fitness loop tune REFLEX weights.",
29
+ tags: ["sleep-training", "fitness-loop", "jaccard", "endocrine", "cortisol", "dopamine", "melatonin", "oxytocin", "biological-hormones", "limbic-extension"],
30
+ },
23
31
  {
24
32
  version: "2.19.24",
25
33
  date: "2026-05-17",