@seanhogg/builderforce-memory-engine 2026.10.2 → 2026.10.3
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/evermind/adapt.d.ts +7 -0
- package/dist/evermind/adapt.d.ts.map +1 -1
- package/dist/evermind/adapt.js +1 -1
- package/dist/evermind/adapt.js.map +1 -1
- package/dist/experience/index.d.ts +2 -2
- package/dist/experience/index.d.ts.map +1 -1
- package/dist/experience/index.js.map +1 -1
- package/dist/experience/store.d.ts +19 -1
- package/dist/experience/store.d.ts.map +1 -1
- package/dist/experience/store.js +14 -2
- package/dist/experience/store.js.map +1 -1
- package/dist/experience/types.d.ts +18 -0
- package/dist/experience/types.d.ts.map +1 -1
- package/dist/experience/types.js.map +1 -1
- package/dist/kernels/weight_update.d.ts.map +1 -1
- package/dist/kernels/weight_update.js +12 -0
- package/dist/kernels/weight_update.js.map +1 -1
- package/dist/ml/classical/ewma.d.ts +5 -4
- package/dist/ml/classical/ewma.d.ts.map +1 -1
- package/dist/ml/classical/ewma.js +2 -2
- package/dist/ml/classical/ewma.js.map +1 -1
- package/dist/ml/classical/index.d.ts +2 -2
- package/dist/ml/classical/index.d.ts.map +1 -1
- package/dist/ml/classical/index.js +1 -1
- package/dist/ml/classical/index.js.map +1 -1
- package/dist/ml/classical/knn.d.ts +11 -4
- package/dist/ml/classical/knn.d.ts.map +1 -1
- package/dist/ml/classical/knn.js +26 -6
- package/dist/ml/classical/knn.js.map +1 -1
- package/dist/ml/classical/robust_z.d.ts +9 -3
- package/dist/ml/classical/robust_z.d.ts.map +1 -1
- package/dist/ml/classical/robust_z.js +5 -1
- package/dist/ml/classical/robust_z.js.map +1 -1
- package/dist/ml/head_trainer.d.ts +13 -1
- package/dist/ml/head_trainer.d.ts.map +1 -1
- package/dist/ml/head_trainer.js +47 -10
- package/dist/ml/head_trainer.js.map +1 -1
- package/dist/ml/tasks/experience.d.ts +61 -16
- package/dist/ml/tasks/experience.d.ts.map +1 -1
- package/dist/ml/tasks/experience.js +119 -24
- package/dist/ml/tasks/experience.js.map +1 -1
- package/dist/ml/tasks/run_anomaly.d.ts +26 -9
- package/dist/ml/tasks/run_anomaly.d.ts.map +1 -1
- package/dist/ml/tasks/run_anomaly.js +39 -10
- package/dist/ml/tasks/run_anomaly.js.map +1 -1
- package/dist/ml/train.d.ts +6 -0
- package/dist/ml/train.d.ts.map +1 -1
- package/dist/ml/train.js +19 -11
- package/dist/ml/train.js.map +1 -1
- package/dist/optim/adamw.d.ts +11 -5
- package/dist/optim/adamw.d.ts.map +1 -1
- package/dist/optim/adamw.js +19 -4
- package/dist/optim/adamw.js.map +1 -1
- package/package.json +1 -1
- package/src/evermind/adapt.ts +8 -2
- package/src/experience/index.ts +2 -1
- package/src/experience/store.ts +35 -3
- package/src/experience/types.ts +19 -0
- package/src/kernels/weight_update.ts +12 -0
- package/src/ml/classical/ewma.ts +5 -5
- package/src/ml/classical/index.ts +2 -2
- package/src/ml/classical/knn.ts +25 -6
- package/src/ml/classical/robust_z.ts +15 -5
- package/src/ml/head_trainer.ts +47 -8
- package/src/ml/tasks/experience.ts +148 -28
- package/src/ml/tasks/run_anomaly.ts +41 -10
- package/src/ml/train.ts +31 -12
- package/src/optim/adamw.ts +21 -5
|
@@ -26,15 +26,32 @@ export declare const RUN_ANOMALY_METRICS: readonly ["cost", "duration", "toolFai
|
|
|
26
26
|
/** Fixed log scales (a $10 run, a one-hour run, 50 failures map to 1). */
|
|
27
27
|
export declare function runAnomalyFeatures(m: RunMetrics): number[];
|
|
28
28
|
/**
|
|
29
|
-
* The
|
|
30
|
-
* A history
|
|
31
|
-
*
|
|
32
|
-
* every run with any failure was flagged. At 0.1, one or two failures after a clean
|
|
33
|
-
* history stay normal (z ≈ 1.8 / 2.8) and three or more flag (z ≥ 3.5); on cost, 0.1
|
|
34
|
-
* is ~0.7 nats, so a constant-cost history flags a ~10× jump. (0.05 was too tight: it
|
|
35
|
-
* still flagged a single failure.)
|
|
29
|
+
* The multiplicative jump in cost or duration that flags against a constant history.
|
|
30
|
+
* A constant history has MAD = mean-AD = 0 and EWMA σ = 0, so the floor below IS the
|
|
31
|
+
* scale both detectors divide by.
|
|
36
32
|
*/
|
|
37
|
-
export declare const
|
|
33
|
+
export declare const RUN_ANOMALY_FLAG_RATIO = 3;
|
|
34
|
+
/**
|
|
35
|
+
* The smallest per-metric scale (σ) both detectors use, in the fixed log units above —
|
|
36
|
+
* ONE PER METRIC, because each metric is divided by a different reference: a feature
|
|
37
|
+
* unit is log1p(ref) nats, i.e. log1p(1000) ≈ 6.909 nats for cost but log1p(3.6e6) ≈
|
|
38
|
+
* 15.096 nats for duration. One scalar floor (it was 0.1) therefore meant ~0.69 nats
|
|
39
|
+
* (2×) on cost but ~1.51 nats (4.5×) on duration, and a 10 s → 15 min run (4.5 nats,
|
|
40
|
+
* z ≈ 3.0) slipped under EWMA's 3.
|
|
41
|
+
*
|
|
42
|
+
* Derivation, cost and duration: for values well above 1, a k× jump moves log1p by
|
|
43
|
+
* ≈ ln k nats = ln k / log1p(ref) feature units. The composite flags at the smaller of
|
|
44
|
+
* the two thresholds (EWMA 3; robust z is 3.5), so the floor that flags a 3× jump is
|
|
45
|
+
* floor = ln 3 / (3 · log1p(ref))
|
|
46
|
+
* cost: 1.0986 / (3 · 6.9088) ≈ 0.0530 (robust z alone flags from ≈ 3.6×)
|
|
47
|
+
* duration: 1.0986 / (3 · 15.0964) ≈ 0.0243 (robust z alone flags from ≈ 3.6×)
|
|
48
|
+
* A 1.5× wobble (0.405 nats) scores z ≈ 1.1 on either — normal.
|
|
49
|
+
*
|
|
50
|
+
* Tool failures keep the absolute 0.1: from a clean history one or two failures
|
|
51
|
+
* (log1p(1|2)/log1p(50) ≈ 0.18 | 0.28) stay normal (z ≈ 1.8 / 2.8) and three or more
|
|
52
|
+
* (≈ 0.35) flag. (0.05 was too tight: it flagged a single failure.)
|
|
53
|
+
*/
|
|
54
|
+
export declare const RUN_ANOMALY_MIN_SCALE: readonly number[];
|
|
38
55
|
/** The composite detector with `run.anomaly`'s metric names on its explanation. */
|
|
39
56
|
export declare class RunAnomalyDetector extends AnomalyCompositeModel {
|
|
40
57
|
/** Which metrics are out of range, per detector (z / threshold, ≥ 1 = out of range). */
|
|
@@ -44,7 +61,7 @@ export declare class RunAnomalyDetector extends AnomalyCompositeModel {
|
|
|
44
61
|
trend: number;
|
|
45
62
|
}[];
|
|
46
63
|
}
|
|
47
|
-
/** Fit both detectors on a chronological history of runs (as feature vectors), floored at {@link RUN_ANOMALY_MIN_SCALE}. */
|
|
64
|
+
/** Fit both detectors on a chronological history of runs (as feature vectors), floored per metric at {@link RUN_ANOMALY_MIN_SCALE}. */
|
|
48
65
|
export declare function fitRunAnomaly(samples: readonly MlSample[], opts?: AnomalyCompositeOptions): RunAnomalyDetector;
|
|
49
66
|
export declare const RUN_ANOMALY_TASK: MlTask<RunMetrics, RunAnomaly>;
|
|
50
67
|
/** Duration and tool-failure count of an experience run, with the host's cost. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run_anomaly.d.ts","sourceRoot":"","sources":["../../../src/ml/tasks/run_anomaly.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAIxG,OAAO,KAAK,EAAgB,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAElE,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,mBAAmB,+CAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"run_anomaly.d.ts","sourceRoot":"","sources":["../../../src/ml/tasks/run_anomaly.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAIxG,OAAO,KAAK,EAAgB,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAElE,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,mBAAmB,+CAAgD,CAAC;AAOjF,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAM1D;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAIlD,CAAC;AAEF,mFAAmF;AACnF,qBAAa,kBAAmB,SAAQ,qBAAqB;IAC3D,wFAAwF;IACxF,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG;QAAE,MAAM,EAAE,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;CAIrH;AAED,uIAAuI;AACvI,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,IAAI,GAAE,uBAA4B,GAAG,kBAAkB,CAKlH;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAS3D,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,SAAI,GAAG,UAAU,CAMtE"}
|
|
@@ -3,20 +3,49 @@ import { fitEwma } from "../classical/ewma.js";
|
|
|
3
3
|
import { fitRobustZ } from "../classical/robust_z.js";
|
|
4
4
|
import { logScale } from "../features.js";
|
|
5
5
|
export const RUN_ANOMALY_METRICS = ["cost", "duration", "toolFailures"];
|
|
6
|
+
/** The fixed log references: cost in cents ($10), duration in ms (one hour), tool failures (50). */
|
|
7
|
+
const COST_REF_CENTS = 1000;
|
|
8
|
+
const DURATION_REF_MS = 3_600_000;
|
|
9
|
+
const FAILURES_REF = 50;
|
|
6
10
|
/** Fixed log scales (a $10 run, a one-hour run, 50 failures map to 1). */
|
|
7
11
|
export function runAnomalyFeatures(m) {
|
|
8
|
-
return [
|
|
12
|
+
return [
|
|
13
|
+
logScale(m.costUsd * 100, COST_REF_CENTS),
|
|
14
|
+
logScale(m.durationMs, DURATION_REF_MS),
|
|
15
|
+
logScale(m.toolFailures, FAILURES_REF),
|
|
16
|
+
];
|
|
9
17
|
}
|
|
10
18
|
/**
|
|
11
|
-
* The
|
|
12
|
-
* A history
|
|
13
|
-
*
|
|
14
|
-
* every run with any failure was flagged. At 0.1, one or two failures after a clean
|
|
15
|
-
* history stay normal (z ≈ 1.8 / 2.8) and three or more flag (z ≥ 3.5); on cost, 0.1
|
|
16
|
-
* is ~0.7 nats, so a constant-cost history flags a ~10× jump. (0.05 was too tight: it
|
|
17
|
-
* still flagged a single failure.)
|
|
19
|
+
* The multiplicative jump in cost or duration that flags against a constant history.
|
|
20
|
+
* A constant history has MAD = mean-AD = 0 and EWMA σ = 0, so the floor below IS the
|
|
21
|
+
* scale both detectors divide by.
|
|
18
22
|
*/
|
|
19
|
-
export const
|
|
23
|
+
export const RUN_ANOMALY_FLAG_RATIO = 3;
|
|
24
|
+
/**
|
|
25
|
+
* The smallest per-metric scale (σ) both detectors use, in the fixed log units above —
|
|
26
|
+
* ONE PER METRIC, because each metric is divided by a different reference: a feature
|
|
27
|
+
* unit is log1p(ref) nats, i.e. log1p(1000) ≈ 6.909 nats for cost but log1p(3.6e6) ≈
|
|
28
|
+
* 15.096 nats for duration. One scalar floor (it was 0.1) therefore meant ~0.69 nats
|
|
29
|
+
* (2×) on cost but ~1.51 nats (4.5×) on duration, and a 10 s → 15 min run (4.5 nats,
|
|
30
|
+
* z ≈ 3.0) slipped under EWMA's 3.
|
|
31
|
+
*
|
|
32
|
+
* Derivation, cost and duration: for values well above 1, a k× jump moves log1p by
|
|
33
|
+
* ≈ ln k nats = ln k / log1p(ref) feature units. The composite flags at the smaller of
|
|
34
|
+
* the two thresholds (EWMA 3; robust z is 3.5), so the floor that flags a 3× jump is
|
|
35
|
+
* floor = ln 3 / (3 · log1p(ref))
|
|
36
|
+
* cost: 1.0986 / (3 · 6.9088) ≈ 0.0530 (robust z alone flags from ≈ 3.6×)
|
|
37
|
+
* duration: 1.0986 / (3 · 15.0964) ≈ 0.0243 (robust z alone flags from ≈ 3.6×)
|
|
38
|
+
* A 1.5× wobble (0.405 nats) scores z ≈ 1.1 on either — normal.
|
|
39
|
+
*
|
|
40
|
+
* Tool failures keep the absolute 0.1: from a clean history one or two failures
|
|
41
|
+
* (log1p(1|2)/log1p(50) ≈ 0.18 | 0.28) stay normal (z ≈ 1.8 / 2.8) and three or more
|
|
42
|
+
* (≈ 0.35) flag. (0.05 was too tight: it flagged a single failure.)
|
|
43
|
+
*/
|
|
44
|
+
export const RUN_ANOMALY_MIN_SCALE = [
|
|
45
|
+
Math.log(RUN_ANOMALY_FLAG_RATIO) / (3 * Math.log1p(COST_REF_CENTS)),
|
|
46
|
+
Math.log(RUN_ANOMALY_FLAG_RATIO) / (3 * Math.log1p(DURATION_REF_MS)),
|
|
47
|
+
0.1,
|
|
48
|
+
];
|
|
20
49
|
/** The composite detector with `run.anomaly`'s metric names on its explanation. */
|
|
21
50
|
export class RunAnomalyDetector extends AnomalyCompositeModel {
|
|
22
51
|
/** Which metrics are out of range, per detector (z / threshold, ≥ 1 = out of range). */
|
|
@@ -25,7 +54,7 @@ export class RunAnomalyDetector extends AnomalyCompositeModel {
|
|
|
25
54
|
return RUN_ANOMALY_METRICS.map((metric, i) => ({ metric, ...per[i] }));
|
|
26
55
|
}
|
|
27
56
|
}
|
|
28
|
-
/** Fit both detectors on a chronological history of runs (as feature vectors), floored at {@link RUN_ANOMALY_MIN_SCALE}. */
|
|
57
|
+
/** Fit both detectors on a chronological history of runs (as feature vectors), floored per metric at {@link RUN_ANOMALY_MIN_SCALE}. */
|
|
29
58
|
export function fitRunAnomaly(samples, opts = {}) {
|
|
30
59
|
return new RunAnomalyDetector(fitRobustZ(samples, { ...opts.robustZ, minScale: opts.robustZ?.minScale ?? RUN_ANOMALY_MIN_SCALE }), fitEwma(samples, { ...opts.ewma, minScale: opts.ewma?.minScale ?? RUN_ANOMALY_MIN_SCALE }));
|
|
31
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run_anomaly.js","sourceRoot":"","sources":["../../../src/ml/tasks/run_anomaly.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,qBAAqB,EAAgC,MAAM,mCAAmC,CAAC;AACxG,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgB1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAU,CAAC;AAEjF,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,CAAa;IAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"run_anomaly.js","sourceRoot":"","sources":["../../../src/ml/tasks/run_anomaly.ts"],"names":[],"mappings":"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"}
|
package/dist/ml/train.d.ts
CHANGED
|
@@ -48,6 +48,12 @@ export interface MlTrainResult {
|
|
|
48
48
|
/** Size of the held-out tail, and the model's loss on it (null when none was held out). */
|
|
49
49
|
holdout: number;
|
|
50
50
|
holdoutLoss: number | null;
|
|
51
|
+
/**
|
|
52
|
+
* Head engines: parameter elements the final fit skipped for a non-finite gradient
|
|
53
|
+
* ({@link HeadTrainer.skippedNonFinite}) — above 0, the fit diverged somewhere. 0
|
|
54
|
+
* for classical engines and task-owned fits.
|
|
55
|
+
*/
|
|
56
|
+
skippedNonFinite: number;
|
|
51
57
|
}
|
|
52
58
|
export { mlEvalLoss } from "./eval_loss.js";
|
|
53
59
|
/**
|
package/dist/ml/train.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/ml/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAa,KAAK,WAAW,EAAE,KAAK,WAAW,EAAiB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEvG,2CAA2C;AAC3C,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC;IACT,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACvE,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mEAAmE;IACnE,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,WAAW,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/ml/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAa,KAAK,WAAW,EAAE,KAAK,WAAW,EAAiB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEvG,2CAA2C;AAC3C,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC;IACT,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACvE,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mEAAmE;IACnE,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,WAAW,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkC5C;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,EACpB,QAAQ,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,EACtC,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAoC/B"}
|
package/dist/ml/train.js
CHANGED
|
@@ -26,9 +26,9 @@ function defaultEngine(task) {
|
|
|
26
26
|
}
|
|
27
27
|
async function fitEngine(task, ref, samples, opts) {
|
|
28
28
|
if (task.train?.fit)
|
|
29
|
-
return task.train.fit(samples, ref);
|
|
29
|
+
return { predictor: await task.train.fit(samples, ref), skippedNonFinite: 0 };
|
|
30
30
|
if (ref.engine === "classical")
|
|
31
|
-
return fitClassical(ref.algorithm, samples, opts.classical);
|
|
31
|
+
return { predictor: fitClassical(ref.algorithm, samples, opts.classical), skippedNonFinite: 0 };
|
|
32
32
|
if (ref.engine === "head") {
|
|
33
33
|
const objective = task.kind === "classify" ? "softmax" : task.kind === "regress" ? "mse" : null;
|
|
34
34
|
if (!objective)
|
|
@@ -40,8 +40,9 @@ async function fitEngine(task, ref, samples, opts) {
|
|
|
40
40
|
objective,
|
|
41
41
|
...(opts.head?.seed != null ? { seed: opts.head.seed } : {}),
|
|
42
42
|
});
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const trainer = new HeadTrainer(head, opts.device ?? null, `trainMlTask(${task.id})`);
|
|
44
|
+
await trainer.train(samples, opts.head?.train);
|
|
45
|
+
return { predictor: head, skippedNonFinite: trainer.skippedNonFinite };
|
|
45
46
|
}
|
|
46
47
|
throw new Error(`trainMlTask(${task.id}): engine '${engineKey(ref)}' is not trained here`);
|
|
47
48
|
}
|
|
@@ -70,15 +71,22 @@ export async function trainMlTask(task, examples, opts = {}) {
|
|
|
70
71
|
if (nHold >= 1 && samples.length - nHold >= 1) {
|
|
71
72
|
const train = samples.slice(0, samples.length - nHold);
|
|
72
73
|
const hold = samples.slice(samples.length - nHold);
|
|
73
|
-
const
|
|
74
|
-
holdoutLoss = mlEvalLoss(task.kind, predictor, hold);
|
|
74
|
+
const fit = await fitEngine(task, ref, train, opts);
|
|
75
|
+
holdoutLoss = mlEvalLoss(task.kind, fit.predictor, hold);
|
|
75
76
|
if (opts.refitOnAll === false) {
|
|
76
|
-
opts.models?.set(task.id, engineKey(ref), predictor);
|
|
77
|
-
return { predictor, engine: ref, samples: train.length, holdout: nHold, holdoutLoss };
|
|
77
|
+
opts.models?.set(task.id, engineKey(ref), fit.predictor);
|
|
78
|
+
return { predictor: fit.predictor, engine: ref, samples: train.length, holdout: nHold, holdoutLoss, skippedNonFinite: fit.skippedNonFinite };
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
|
-
const
|
|
81
|
-
opts.models?.set(task.id, engineKey(ref), predictor);
|
|
82
|
-
return {
|
|
81
|
+
const fit = await fitEngine(task, ref, samples, opts);
|
|
82
|
+
opts.models?.set(task.id, engineKey(ref), fit.predictor);
|
|
83
|
+
return {
|
|
84
|
+
predictor: fit.predictor,
|
|
85
|
+
engine: ref,
|
|
86
|
+
samples: samples.length,
|
|
87
|
+
holdout: nHold >= 1 ? nHold : 0,
|
|
88
|
+
holdoutLoss,
|
|
89
|
+
skippedNonFinite: fit.skippedNonFinite,
|
|
90
|
+
};
|
|
83
91
|
}
|
|
84
92
|
//# sourceMappingURL=train.js.map
|
package/dist/ml/train.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"train.js","sourceRoot":"","sources":["../../src/ml/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAAyB,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAqB,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAkE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"train.js","sourceRoot":"","sources":["../../src/ml/train.ts"],"names":[],"mappings":"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"}
|
package/dist/optim/adamw.d.ts
CHANGED
|
@@ -72,18 +72,24 @@ export interface AdamWKernelStep {
|
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
74
|
* One AdamW step over a single parameter tensor — the exact CPU mirror of the
|
|
75
|
-
* `adamw_update` entry point in `WEIGHT_UPDATE_WGSL`, including its
|
|
75
|
+
* `adamw_update` entry point in `WEIGHT_UPDATE_WGSL`, including its safety
|
|
76
76
|
* properties:
|
|
77
77
|
*
|
|
78
|
-
* • the **
|
|
79
|
-
*
|
|
78
|
+
* • the **non-finite gradient skip** — an element whose gradient is NaN/±Inf
|
|
79
|
+
* (or whose new moments would overflow f32) is skipped ENTIRELY: m, v and the
|
|
80
|
+
* weight keep their values (no decay either). Writing the moment first and
|
|
81
|
+
* dropping only the step stored NaN in m/v, and every later step of that
|
|
82
|
+
* element was then NaN too — silently dropped, so the weight froze forever;
|
|
83
|
+
* • the **NaN/Inf step guard** — a non-finite step from finite moments is
|
|
84
|
+
* dropped rather than written into a weight;
|
|
80
85
|
* • the **trust region** — `maxDelta` bounds how far a single step can move a
|
|
81
86
|
* weight, which is what keeps repeated write-through adapts reversible.
|
|
82
87
|
*
|
|
83
88
|
* Decoupled weight decay (`θ * (1 - lr·wd)`), matching the kernel — deliberately
|
|
84
89
|
* NOT the coupled form {@link AdamW} uses for the MoE/EvermindLM trainers.
|
|
85
90
|
*
|
|
86
|
-
* `param`, `m` and `v` are updated in place.
|
|
91
|
+
* `param`, `m` and `v` are updated in place. Returns how many elements were skipped
|
|
92
|
+
* for a non-finite gradient (0 on a healthy step).
|
|
87
93
|
*/
|
|
88
|
-
export declare function adamwUpdateInPlace(param: Float32Array, grad: Float32Array, m: Float32Array, v: Float32Array, hp: AdamWKernelStep):
|
|
94
|
+
export declare function adamwUpdateInPlace(param: Float32Array, grad: Float32Array, m: Float32Array, v: Float32Array, hp: AdamWKernelStep): number;
|
|
89
95
|
//# sourceMappingURL=adamw.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adamw.d.ts","sourceRoot":"","sources":["../../src/optim/adamw.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,IAAI,UAAU,EAAE,CAAC;IAC3B,SAAS,IAAI,UAAU,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,qBAAa,KAAK;IASd,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAC,CAAC,CAA+B;IACjD,OAAO,CAAC,CAAC,CAAK;IACd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;gBAGtB,MAAM,EAAE,WAAW,EACpC,OAAO,GAAE,YAAiB;IA0B5B,kEAAkE;IAClE,OAAO,CAAC,KAAK;IAIb,wFAAwF;IACxF,IAAI,IAAI,IAAI;IAwBZ,qFAAqF;IACrF,UAAU,IAAI,MAAM;CAMrB;AAID,8DAA8D;AAC9D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"adamw.d.ts","sourceRoot":"","sources":["../../src/optim/adamw.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,IAAI,UAAU,EAAE,CAAC;IAC3B,SAAS,IAAI,UAAU,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,qBAAa,KAAK;IASd,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAC,CAAC,CAA+B;IACjD,OAAO,CAAC,CAAC,CAAK;IACd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;gBAGtB,MAAM,EAAE,WAAW,EACpC,OAAO,GAAE,YAAiB;IA0B5B,kEAAkE;IAClE,OAAO,CAAC,KAAK;IAIb,wFAAwF;IACxF,IAAI,IAAI,IAAI;IAwBZ,qFAAqF;IACrF,UAAU,IAAI,MAAM;CAMrB;AAID,8DAA8D;AAC9D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,YAAY,EAClB,CAAC,EAAE,YAAY,EACf,CAAC,EAAE,YAAY,EACf,EAAE,EAAE,eAAe,GAClB,MAAM,CAyBR"}
|
package/dist/optim/adamw.js
CHANGED
|
@@ -80,30 +80,44 @@ export class AdamW {
|
|
|
80
80
|
return n;
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
+
/** Largest finite f32 — a moment above it would be stored as ±Inf. */
|
|
84
|
+
const F32_MAX = 3.4028234663852886e38;
|
|
83
85
|
/**
|
|
84
86
|
* One AdamW step over a single parameter tensor — the exact CPU mirror of the
|
|
85
|
-
* `adamw_update` entry point in `WEIGHT_UPDATE_WGSL`, including its
|
|
87
|
+
* `adamw_update` entry point in `WEIGHT_UPDATE_WGSL`, including its safety
|
|
86
88
|
* properties:
|
|
87
89
|
*
|
|
88
|
-
* • the **
|
|
89
|
-
*
|
|
90
|
+
* • the **non-finite gradient skip** — an element whose gradient is NaN/±Inf
|
|
91
|
+
* (or whose new moments would overflow f32) is skipped ENTIRELY: m, v and the
|
|
92
|
+
* weight keep their values (no decay either). Writing the moment first and
|
|
93
|
+
* dropping only the step stored NaN in m/v, and every later step of that
|
|
94
|
+
* element was then NaN too — silently dropped, so the weight froze forever;
|
|
95
|
+
* • the **NaN/Inf step guard** — a non-finite step from finite moments is
|
|
96
|
+
* dropped rather than written into a weight;
|
|
90
97
|
* • the **trust region** — `maxDelta` bounds how far a single step can move a
|
|
91
98
|
* weight, which is what keeps repeated write-through adapts reversible.
|
|
92
99
|
*
|
|
93
100
|
* Decoupled weight decay (`θ * (1 - lr·wd)`), matching the kernel — deliberately
|
|
94
101
|
* NOT the coupled form {@link AdamW} uses for the MoE/EvermindLM trainers.
|
|
95
102
|
*
|
|
96
|
-
* `param`, `m` and `v` are updated in place.
|
|
103
|
+
* `param`, `m` and `v` are updated in place. Returns how many elements were skipped
|
|
104
|
+
* for a non-finite gradient (0 on a healthy step).
|
|
97
105
|
*/
|
|
98
106
|
export function adamwUpdateInPlace(param, grad, m, v, hp) {
|
|
99
107
|
const { lr, beta1, beta2, eps, weightDecay, beta1_t, beta2_t, maxDelta } = hp;
|
|
100
108
|
const gradScale = hp.gradScale ?? 1;
|
|
101
109
|
const bc1 = 1 - beta1_t;
|
|
102
110
|
const bc2 = 1 - beta2_t;
|
|
111
|
+
let skipped = 0;
|
|
103
112
|
for (let i = 0; i < param.length; i++) {
|
|
104
113
|
const g = grad[i] * gradScale;
|
|
105
114
|
const mNew = beta1 * m[i] + (1 - beta1) * g;
|
|
106
115
|
const vNew = beta2 * v[i] + (1 - beta2) * g * g;
|
|
116
|
+
// NaN fails every comparison, so this also catches a NaN gradient.
|
|
117
|
+
if (!(Math.abs(mNew) <= F32_MAX && vNew <= F32_MAX)) {
|
|
118
|
+
skipped++;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
107
121
|
m[i] = mNew;
|
|
108
122
|
v[i] = vNew;
|
|
109
123
|
let step = (lr * (mNew / bc1)) / (Math.sqrt(vNew / bc2) + eps);
|
|
@@ -113,5 +127,6 @@ export function adamwUpdateInPlace(param, grad, m, v, hp) {
|
|
|
113
127
|
step = Math.min(maxDelta, Math.max(-maxDelta, step));
|
|
114
128
|
param[i] = param[i] * (1 - lr * weightDecay) - step;
|
|
115
129
|
}
|
|
130
|
+
return skipped;
|
|
116
131
|
}
|
|
117
132
|
//# sourceMappingURL=adamw.js.map
|
package/dist/optim/adamw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adamw.js","sourceRoot":"","sources":["../../src/optim/adamw.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"adamw.js","sourceRoot":"","sources":["../../src/optim/adamw.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seanhogg/builderforce-memory-engine",
|
|
3
|
-
"version": "2026.10.
|
|
3
|
+
"version": "2026.10.3",
|
|
4
4
|
"description": "BuilderForce Agent Memory — engine layer. TypeScript/WGSL Mamba SSM kernels, model blocks, autograd, training, and BPE tokenizer (zero runtime deps, WebGPU-native).",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
package/src/evermind/adapt.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* produced from the same text. That recipe lives here and nowhere else.
|
|
9
9
|
*/
|
|
10
10
|
import type { EvermindModelPackage } from "./package.js";
|
|
11
|
-
import { EvermindLMTrainer } from "../lm/evermind_lm.js";
|
|
11
|
+
import { EvermindLMTrainer, type EvermindLM } from "../lm/evermind_lm.js";
|
|
12
12
|
import { applyCheckpointDiff, diffCheckpoints } from "../utils/delta.js";
|
|
13
13
|
import { tokenWindows } from "../bench/adaptation.js";
|
|
14
14
|
|
|
@@ -36,6 +36,12 @@ export interface AdaptOptions {
|
|
|
36
36
|
maxChars?: number;
|
|
37
37
|
windowTokens?: number;
|
|
38
38
|
epochs?: number;
|
|
39
|
+
/**
|
|
40
|
+
* An LM the caller ALREADY loaded from exactly this `pkg` (`pkg.loadLM()`) and has
|
|
41
|
+
* not trained — e.g. the one it embedded with for curation — to adapt instead of
|
|
42
|
+
* loading a second copy. It is trained in place, so it is spent afterwards.
|
|
43
|
+
*/
|
|
44
|
+
lm?: EvermindLM;
|
|
39
45
|
}
|
|
40
46
|
|
|
41
47
|
/**
|
|
@@ -54,7 +60,7 @@ export function adaptAndDiff(
|
|
|
54
60
|
const windowTokens = opts.windowTokens ?? EVERMIND_ADAPT_WINDOW_TOKENS;
|
|
55
61
|
const seqs = tokenWindows(tokenizer.encode(text.slice(0, maxChars)), windowTokens);
|
|
56
62
|
if (seqs.length === 0) return null;
|
|
57
|
-
const lm = pkg.loadLM();
|
|
63
|
+
const lm = opts.lm ?? pkg.loadLM();
|
|
58
64
|
const history = new EvermindLMTrainer(lm, { epochs: opts.epochs ?? 1 }).fit(seqs);
|
|
59
65
|
const loss = history.length > 0 ? history[history.length - 1]! : 0;
|
|
60
66
|
return { diff: diffCheckpoints(pkg.checkpoint, lm.exportWeights()), loss, sequences: seqs.length };
|
package/src/experience/index.ts
CHANGED
|
@@ -21,6 +21,7 @@ export type {
|
|
|
21
21
|
RunStepLog,
|
|
22
22
|
Run,
|
|
23
23
|
Adaptation,
|
|
24
|
+
CuratedOut,
|
|
24
25
|
} from './types.js';
|
|
25
26
|
export { newExperienceId } from './types.js';
|
|
26
27
|
export { isIrreversibleLabel, elementLabel, needsApproval } from './approval.js';
|
|
@@ -32,4 +33,4 @@ export type { ExperienceDocument } from './corpus.js';
|
|
|
32
33
|
export { experienceOverview } from './overview.js';
|
|
33
34
|
export type { ExperienceOverview, ExperienceRegion, ExperienceEvent, ExperienceDay, OverviewOptions } from './overview.js';
|
|
34
35
|
export { EXPERIENCE_SCHEMA, MAX_RUNS, MAX_ADAPTATIONS, emptySnapshot, parseSnapshot, InMemoryExperienceStore } from './store.js';
|
|
35
|
-
export type { ExperienceSnapshot, ExperienceStore } from './store.js';
|
|
36
|
+
export type { ExperienceSnapshot, ExperienceStore, CurationRecord } from './store.js';
|
package/src/experience/store.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* is the reference implementation, and `ExperienceSnapshot` is the one serialized shape,
|
|
8
8
|
* so a store on one runtime can be read by another.
|
|
9
9
|
*/
|
|
10
|
-
import type { Adaptation, Episode, EpisodeSummary, Run, RunStepLog, Skill } from './types.js';
|
|
10
|
+
import type { Adaptation, CuratedOut, Episode, EpisodeSummary, Run, RunStepLog, Skill } from './types.js';
|
|
11
11
|
|
|
12
12
|
export const EXPERIENCE_SCHEMA = 'evermind.experience/1';
|
|
13
13
|
/** Runs kept, newest first — the audit trail is recent history, not an archive. */
|
|
@@ -29,6 +29,18 @@ export interface ExperienceSnapshot {
|
|
|
29
29
|
learned: Record<string, number>;
|
|
30
30
|
/** Every adaptation's measurements, newest first (capped at {@link MAX_ADAPTATIONS}). */
|
|
31
31
|
adaptations: Adaptation[];
|
|
32
|
+
/**
|
|
33
|
+
* Procedures curation left out, by id, until they are learned, forgotten or judged
|
|
34
|
+
* again — so a later curation skips them instead of re-embedding each one.
|
|
35
|
+
*/
|
|
36
|
+
curated: Record<string, CuratedOut>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** What one curation call decided: the procedures it left out, and the ones it kept. */
|
|
40
|
+
export interface CurationRecord {
|
|
41
|
+
dropped: Record<string, CuratedOut>;
|
|
42
|
+
/** Ids curation kept this time — any earlier verdict on them is cleared. */
|
|
43
|
+
kept: string[];
|
|
32
44
|
}
|
|
33
45
|
|
|
34
46
|
export interface ExperienceStore {
|
|
@@ -56,13 +68,20 @@ export interface ExperienceStore {
|
|
|
56
68
|
*/
|
|
57
69
|
recordAdaptation(adaptation: Adaptation): Promise<void>;
|
|
58
70
|
|
|
71
|
+
/**
|
|
72
|
+
* Record one curation's verdicts: each dropped procedure is stored as `curated_out`
|
|
73
|
+
* (replacing an earlier verdict), each kept one loses any earlier verdict. Learning
|
|
74
|
+
* or forgetting a procedure also clears its verdict.
|
|
75
|
+
*/
|
|
76
|
+
recordCuration(curation: CurationRecord): Promise<void>;
|
|
77
|
+
|
|
59
78
|
snapshot(): Promise<ExperienceSnapshot>;
|
|
60
79
|
/** Delete every episode, skill and run. */
|
|
61
80
|
clear(): Promise<void>;
|
|
62
81
|
}
|
|
63
82
|
|
|
64
83
|
export function emptySnapshot(): ExperienceSnapshot {
|
|
65
|
-
return { schema: EXPERIENCE_SCHEMA, episodes: [], skills: [], runs: [], learned: {}, adaptations: [] };
|
|
84
|
+
return { schema: EXPERIENCE_SCHEMA, episodes: [], skills: [], runs: [], learned: {}, adaptations: [], curated: {} };
|
|
66
85
|
}
|
|
67
86
|
|
|
68
87
|
/** Parse a snapshot, tolerating a missing or foreign file as empty. */
|
|
@@ -77,6 +96,8 @@ export function parseSnapshot(raw: unknown): ExperienceSnapshot {
|
|
|
77
96
|
learned: s.learned && typeof s.learned === 'object' && !Array.isArray(s.learned) ? s.learned : {},
|
|
78
97
|
// Optional within schema 1: snapshots written before the history existed have none.
|
|
79
98
|
adaptations: Array.isArray(s.adaptations) ? s.adaptations : [],
|
|
99
|
+
// Optional within schema 1 too: written from 2026.10.3.
|
|
100
|
+
curated: s.curated && typeof s.curated === 'object' && !Array.isArray(s.curated) ? s.curated : {},
|
|
80
101
|
};
|
|
81
102
|
}
|
|
82
103
|
|
|
@@ -130,6 +151,7 @@ export class InMemoryExperienceStore implements ExperienceStore {
|
|
|
130
151
|
async deleteEpisode(id: string): Promise<boolean> {
|
|
131
152
|
const ok = InMemoryExperienceStore.remove(this.data.episodes, id);
|
|
132
153
|
delete this.data.learned[id];
|
|
154
|
+
delete this.data.curated[id];
|
|
133
155
|
if (ok) await this.changed();
|
|
134
156
|
return ok;
|
|
135
157
|
}
|
|
@@ -147,6 +169,7 @@ export class InMemoryExperienceStore implements ExperienceStore {
|
|
|
147
169
|
async deleteSkill(id: string): Promise<boolean> {
|
|
148
170
|
const ok = InMemoryExperienceStore.remove(this.data.skills, id);
|
|
149
171
|
delete this.data.learned[id];
|
|
172
|
+
delete this.data.curated[id];
|
|
150
173
|
if (ok) await this.changed();
|
|
151
174
|
return ok;
|
|
152
175
|
}
|
|
@@ -172,12 +195,21 @@ export class InMemoryExperienceStore implements ExperienceStore {
|
|
|
172
195
|
}
|
|
173
196
|
|
|
174
197
|
async recordAdaptation(adaptation: Adaptation): Promise<void> {
|
|
175
|
-
for (const id of adaptation.learned)
|
|
198
|
+
for (const id of adaptation.learned) {
|
|
199
|
+
this.data.learned[id] = adaptation.index;
|
|
200
|
+
delete this.data.curated[id];
|
|
201
|
+
}
|
|
176
202
|
this.data.adaptations.unshift(adaptation);
|
|
177
203
|
this.data.adaptations.length = Math.min(this.data.adaptations.length, MAX_ADAPTATIONS);
|
|
178
204
|
await this.changed();
|
|
179
205
|
}
|
|
180
206
|
|
|
207
|
+
async recordCuration(curation: CurationRecord): Promise<void> {
|
|
208
|
+
for (const id of curation.kept) delete this.data.curated[id];
|
|
209
|
+
Object.assign(this.data.curated, curation.dropped);
|
|
210
|
+
await this.changed();
|
|
211
|
+
}
|
|
212
|
+
|
|
181
213
|
async snapshot(): Promise<ExperienceSnapshot> {
|
|
182
214
|
return structuredClone(this.data);
|
|
183
215
|
}
|
package/src/experience/types.ts
CHANGED
|
@@ -154,6 +154,25 @@ export interface Adaptation {
|
|
|
154
154
|
at: number;
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
+
/**
|
|
158
|
+
* A procedure curation left out of an adaptation, kept so a later curation does not
|
|
159
|
+
* re-embed and re-judge it while the verdict still stands: a `duplicate` stands while
|
|
160
|
+
* the procedure it repeats (`of`) is learned by the loaded model; a `low-quality` one
|
|
161
|
+
* while its finished-run count is still `runs` (new runs are new evidence). An
|
|
162
|
+
* `excluded` one is recorded but always reconsidered — exclusion is the caller's call.
|
|
163
|
+
*/
|
|
164
|
+
export interface CuratedOut {
|
|
165
|
+
status: 'curated_out';
|
|
166
|
+
reason: 'duplicate' | 'low-quality' | 'excluded';
|
|
167
|
+
/** `duplicate`: the id of the procedure it repeats. */
|
|
168
|
+
of?: string;
|
|
169
|
+
/** Similarity (duplicate) or P(high) (low-quality). */
|
|
170
|
+
score?: number;
|
|
171
|
+
/** Finished runs of the procedure when it was judged. */
|
|
172
|
+
runs: number;
|
|
173
|
+
at: number;
|
|
174
|
+
}
|
|
175
|
+
|
|
157
176
|
/** A short random id — unique enough for one person's store. */
|
|
158
177
|
export function newExperienceId(): string {
|
|
159
178
|
const bytes = new Uint8Array(8);
|
|
@@ -35,6 +35,12 @@ struct AdamParams {
|
|
|
35
35
|
// v (N,) – second moment
|
|
36
36
|
@group(0) @binding(4) var<storage, read_write> v_state : array<f32>;
|
|
37
37
|
|
|
38
|
+
// NaN or ±Inf, read from the IEEE-754 exponent bits (all ones) — immune to a
|
|
39
|
+
// compiler that assumes finite floats and folds "x != x" away.
|
|
40
|
+
fn non_finite(x : f32) -> bool {
|
|
41
|
+
return (bitcast<u32>(x) & 0x7f800000u) == 0x7f800000u;
|
|
42
|
+
}
|
|
43
|
+
|
|
38
44
|
// Dispatch: (ceil(N / 256), 1, 1)
|
|
39
45
|
@compute @workgroup_size(256, 1, 1)
|
|
40
46
|
fn adamw_update(
|
|
@@ -49,6 +55,12 @@ fn adamw_update(
|
|
|
49
55
|
// Moment updates
|
|
50
56
|
let m_new = adam.beta1 * m_state[i] + (1.0 - adam.beta1) * g;
|
|
51
57
|
let v_new = adam.beta2 * v_state[i] + (1.0 - adam.beta2) * g * g;
|
|
58
|
+
|
|
59
|
+
// Non-finite gradient (or moments that overflowed): skip this element ENTIRELY —
|
|
60
|
+
// m, v and the weight keep their values. Storing a NaN moment and dropping only
|
|
61
|
+
// the step froze the weight forever (every later step read the NaN back).
|
|
62
|
+
// Mirrors adamwUpdateInPlace (optim/adamw.ts), which counts the skips.
|
|
63
|
+
if (non_finite(g) || non_finite(m_new) || non_finite(v_new)) { return; }
|
|
52
64
|
m_state[i] = m_new;
|
|
53
65
|
v_state[i] = v_new;
|
|
54
66
|
|
package/src/ml/classical/ewma.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import type { MlPrediction, MlPredictor, MlSample } from "../types.js";
|
|
12
12
|
import { featureDim } from "./math.js";
|
|
13
|
-
import { anomalyConfidence } from "./robust_z.js";
|
|
13
|
+
import { anomalyConfidence, minScaleAt, type MinScale } from "./robust_z.js";
|
|
14
14
|
|
|
15
15
|
export interface EwmaOptions {
|
|
16
16
|
/** Smoothing factor in (0, 1]. Default 0.3. */
|
|
@@ -19,8 +19,8 @@ export interface EwmaOptions {
|
|
|
19
19
|
threshold?: number;
|
|
20
20
|
/** Smallest σ per feature, as a fraction of |μ| (plus 1e-9). Default 0.01. */
|
|
21
21
|
minScaleFraction?: number;
|
|
22
|
-
/** Smallest σ
|
|
23
|
-
minScale?:
|
|
22
|
+
/** Smallest σ in absolute feature units, one or per feature. Default 0 (see `RobustZOptions.minScale`). */
|
|
23
|
+
minScale?: MinScale;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
export class EwmaModel implements MlPredictor {
|
|
@@ -30,14 +30,14 @@ export class EwmaModel implements MlPredictor {
|
|
|
30
30
|
readonly alpha: number,
|
|
31
31
|
readonly threshold: number,
|
|
32
32
|
readonly minScaleFraction: number,
|
|
33
|
-
readonly minScale:
|
|
33
|
+
readonly minScale: MinScale = 0,
|
|
34
34
|
) {
|
|
35
35
|
if (!(alpha > 0 && alpha <= 1)) throw new Error(`EwmaModel: alpha must be in (0, 1] (got ${alpha})`);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
zScores(x: ArrayLike<number>): number[] {
|
|
39
39
|
return Array.from(this.mean, (m, i) => {
|
|
40
|
-
const sd = Math.max(Math.sqrt(this.variance[i]!), this.minScaleFraction * Math.abs(m) + 1e-9, this.minScale);
|
|
40
|
+
const sd = Math.max(Math.sqrt(this.variance[i]!), this.minScaleFraction * Math.abs(m) + 1e-9, minScaleAt(this.minScale, i));
|
|
41
41
|
return Math.abs((x[i] ?? 0) - m) / sd;
|
|
42
42
|
});
|
|
43
43
|
}
|
|
@@ -24,8 +24,8 @@ export { LinearModel, fitLinear, solveLinearSystem } from "./linear.js";
|
|
|
24
24
|
export type { LinearOptions } from "./linear.js";
|
|
25
25
|
export { KMeansModel, fitKMeans } from "./kmeans.js";
|
|
26
26
|
export type { KMeansOptions } from "./kmeans.js";
|
|
27
|
-
export { RobustZModel, fitRobustZ, anomalyConfidence } from "./robust_z.js";
|
|
28
|
-
export type { RobustZOptions } from "./robust_z.js";
|
|
27
|
+
export { RobustZModel, fitRobustZ, anomalyConfidence, minScaleAt } from "./robust_z.js";
|
|
28
|
+
export type { RobustZOptions, MinScale } from "./robust_z.js";
|
|
29
29
|
export { EwmaModel, fitEwma } from "./ewma.js";
|
|
30
30
|
export type { EwmaOptions } from "./ewma.js";
|
|
31
31
|
export { AnomalyCompositeModel, fitAnomalyComposite } from "./anomaly_composite.js";
|