melete-ai 0.88.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -0
  3. package/bin/melete-server.mjs +345 -0
  4. package/bin/melete.mjs +165 -0
  5. package/dist/achievability.d.ts +38 -0
  6. package/dist/achievability.d.ts.map +1 -0
  7. package/dist/achievability.js +135 -0
  8. package/dist/achievability.js.map +1 -0
  9. package/dist/aegis.d.ts +52 -0
  10. package/dist/aegis.d.ts.map +1 -0
  11. package/dist/aegis.js +191 -0
  12. package/dist/aegis.js.map +1 -0
  13. package/dist/arms.d.ts +70 -0
  14. package/dist/arms.d.ts.map +1 -0
  15. package/dist/arms.js +399 -0
  16. package/dist/arms.js.map +1 -0
  17. package/dist/batch.d.ts +30 -0
  18. package/dist/batch.d.ts.map +1 -0
  19. package/dist/batch.js +151 -0
  20. package/dist/batch.js.map +1 -0
  21. package/dist/bench.d.ts +49 -0
  22. package/dist/bench.d.ts.map +1 -0
  23. package/dist/bench.js +124 -0
  24. package/dist/bench.js.map +1 -0
  25. package/dist/certify.d.ts +48 -0
  26. package/dist/certify.d.ts.map +1 -0
  27. package/dist/certify.js +125 -0
  28. package/dist/certify.js.map +1 -0
  29. package/dist/cliff.d.ts +41 -0
  30. package/dist/cliff.d.ts.map +1 -0
  31. package/dist/cliff.js +132 -0
  32. package/dist/cliff.js.map +1 -0
  33. package/dist/confidence.d.ts +38 -0
  34. package/dist/confidence.d.ts.map +1 -0
  35. package/dist/confidence.js +98 -0
  36. package/dist/confidence.js.map +1 -0
  37. package/dist/constrained.d.ts +59 -0
  38. package/dist/constrained.d.ts.map +1 -0
  39. package/dist/constrained.js +191 -0
  40. package/dist/constrained.js.map +1 -0
  41. package/dist/cortex.d.ts +56 -0
  42. package/dist/cortex.d.ts.map +1 -0
  43. package/dist/cortex.js +81 -0
  44. package/dist/cortex.js.map +1 -0
  45. package/dist/costaware.d.ts +49 -0
  46. package/dist/costaware.d.ts.map +1 -0
  47. package/dist/costaware.js +185 -0
  48. package/dist/costaware.js.map +1 -0
  49. package/dist/drift.d.ts +36 -0
  50. package/dist/drift.d.ts.map +1 -0
  51. package/dist/drift.js +157 -0
  52. package/dist/drift.js.map +1 -0
  53. package/dist/efficiency.d.ts +49 -0
  54. package/dist/efficiency.d.ts.map +1 -0
  55. package/dist/efficiency.js +143 -0
  56. package/dist/efficiency.js.map +1 -0
  57. package/dist/engine.d.ts +64 -0
  58. package/dist/engine.d.ts.map +1 -0
  59. package/dist/engine.js +130 -0
  60. package/dist/engine.js.map +1 -0
  61. package/dist/federated.d.ts +38 -0
  62. package/dist/federated.d.ts.map +1 -0
  63. package/dist/federated.js +121 -0
  64. package/dist/federated.js.map +1 -0
  65. package/dist/frontier.d.ts +51 -0
  66. package/dist/frontier.d.ts.map +1 -0
  67. package/dist/frontier.js +117 -0
  68. package/dist/frontier.js.map +1 -0
  69. package/dist/guardian.d.ts +46 -0
  70. package/dist/guardian.d.ts.map +1 -0
  71. package/dist/guardian.js +101 -0
  72. package/dist/guardian.js.map +1 -0
  73. package/dist/index.d.ts +90 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +189 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/interaction.d.ts +44 -0
  78. package/dist/interaction.d.ts.map +1 -0
  79. package/dist/interaction.js +167 -0
  80. package/dist/interaction.js.map +1 -0
  81. package/dist/interactive.d.ts +25 -0
  82. package/dist/interactive.d.ts.map +1 -0
  83. package/dist/interactive.js +75 -0
  84. package/dist/interactive.js.map +1 -0
  85. package/dist/inverse.d.ts +44 -0
  86. package/dist/inverse.d.ts.map +1 -0
  87. package/dist/inverse.js +141 -0
  88. package/dist/inverse.js.map +1 -0
  89. package/dist/ipshield.d.ts +62 -0
  90. package/dist/ipshield.d.ts.map +1 -0
  91. package/dist/ipshield.js +104 -0
  92. package/dist/ipshield.js.map +1 -0
  93. package/dist/journalist.d.ts +56 -0
  94. package/dist/journalist.d.ts.map +1 -0
  95. package/dist/journalist.js +132 -0
  96. package/dist/journalist.js.map +1 -0
  97. package/dist/lineage.d.ts +43 -0
  98. package/dist/lineage.d.ts.map +1 -0
  99. package/dist/lineage.js +112 -0
  100. package/dist/lineage.js.map +1 -0
  101. package/dist/metabrain.d.ts +59 -0
  102. package/dist/metabrain.d.ts.map +1 -0
  103. package/dist/metabrain.js +215 -0
  104. package/dist/metabrain.js.map +1 -0
  105. package/dist/mixedspace.d.ts +61 -0
  106. package/dist/mixedspace.d.ts.map +1 -0
  107. package/dist/mixedspace.js +267 -0
  108. package/dist/mixedspace.js.map +1 -0
  109. package/dist/multiobjective.d.ts +42 -0
  110. package/dist/multiobjective.d.ts.map +1 -0
  111. package/dist/multiobjective.js +123 -0
  112. package/dist/multiobjective.js.map +1 -0
  113. package/dist/noise.d.ts +45 -0
  114. package/dist/noise.d.ts.map +1 -0
  115. package/dist/noise.js +148 -0
  116. package/dist/noise.js.map +1 -0
  117. package/dist/noiserobust.d.ts +71 -0
  118. package/dist/noiserobust.d.ts.map +1 -0
  119. package/dist/noiserobust.js +215 -0
  120. package/dist/noiserobust.js.map +1 -0
  121. package/dist/oracle.d.ts +63 -0
  122. package/dist/oracle.d.ts.map +1 -0
  123. package/dist/oracle.js +106 -0
  124. package/dist/oracle.js.map +1 -0
  125. package/dist/poopt.d.ts +79 -0
  126. package/dist/poopt.d.ts.map +1 -0
  127. package/dist/poopt.js +148 -0
  128. package/dist/poopt.js.map +1 -0
  129. package/dist/portfolio.d.ts +51 -0
  130. package/dist/portfolio.d.ts.map +1 -0
  131. package/dist/portfolio.js +132 -0
  132. package/dist/portfolio.js.map +1 -0
  133. package/dist/prescription.d.ts +57 -0
  134. package/dist/prescription.d.ts.map +1 -0
  135. package/dist/prescription.js +131 -0
  136. package/dist/prescription.js.map +1 -0
  137. package/dist/prime.d.ts +85 -0
  138. package/dist/prime.d.ts.map +1 -0
  139. package/dist/prime.js +157 -0
  140. package/dist/prime.js.map +1 -0
  141. package/dist/provenance.d.ts +77 -0
  142. package/dist/provenance.d.ts.map +1 -0
  143. package/dist/provenance.js +155 -0
  144. package/dist/provenance.js.map +1 -0
  145. package/dist/rashomon.d.ts +40 -0
  146. package/dist/rashomon.d.ts.map +1 -0
  147. package/dist/rashomon.js +93 -0
  148. package/dist/rashomon.js.map +1 -0
  149. package/dist/reliability.d.ts +79 -0
  150. package/dist/reliability.d.ts.map +1 -0
  151. package/dist/reliability.js +197 -0
  152. package/dist/reliability.js.map +1 -0
  153. package/dist/replay.d.ts +62 -0
  154. package/dist/replay.d.ts.map +1 -0
  155. package/dist/replay.js +146 -0
  156. package/dist/replay.js.map +1 -0
  157. package/dist/replicate.d.ts +72 -0
  158. package/dist/replicate.d.ts.map +1 -0
  159. package/dist/replicate.js +103 -0
  160. package/dist/replicate.js.map +1 -0
  161. package/dist/resonance.d.ts +32 -0
  162. package/dist/resonance.d.ts.map +1 -0
  163. package/dist/resonance.js +190 -0
  164. package/dist/resonance.js.map +1 -0
  165. package/dist/sensitivity.d.ts +44 -0
  166. package/dist/sensitivity.d.ts.map +1 -0
  167. package/dist/sensitivity.js +109 -0
  168. package/dist/sensitivity.js.map +1 -0
  169. package/dist/server.d.ts +26 -0
  170. package/dist/server.d.ts.map +1 -0
  171. package/dist/server.js +1410 -0
  172. package/dist/server.js.map +1 -0
  173. package/dist/shape.d.ts +37 -0
  174. package/dist/shape.d.ts.map +1 -0
  175. package/dist/shape.js +170 -0
  176. package/dist/shape.js.map +1 -0
  177. package/dist/sloppiness.d.ts +44 -0
  178. package/dist/sloppiness.d.ts.map +1 -0
  179. package/dist/sloppiness.js +194 -0
  180. package/dist/sloppiness.js.map +1 -0
  181. package/dist/sovereign.d.ts +77 -0
  182. package/dist/sovereign.d.ts.map +1 -0
  183. package/dist/sovereign.js +144 -0
  184. package/dist/sovereign.js.map +1 -0
  185. package/dist/space.d.ts +38 -0
  186. package/dist/space.d.ts.map +1 -0
  187. package/dist/space.js +107 -0
  188. package/dist/space.js.map +1 -0
  189. package/dist/surprise.d.ts +43 -0
  190. package/dist/surprise.d.ts.map +1 -0
  191. package/dist/surprise.js +123 -0
  192. package/dist/surprise.js.map +1 -0
  193. package/dist/territory.d.ts +43 -0
  194. package/dist/territory.d.ts.map +1 -0
  195. package/dist/territory.js +102 -0
  196. package/dist/territory.js.map +1 -0
  197. package/dist/trace.d.ts +58 -0
  198. package/dist/trace.d.ts.map +1 -0
  199. package/dist/trace.js +0 -0
  200. package/dist/trace.js.map +1 -0
  201. package/dist/transfer.d.ts +46 -0
  202. package/dist/transfer.d.ts.map +1 -0
  203. package/dist/transfer.js +112 -0
  204. package/dist/transfer.js.map +1 -0
  205. package/dist/twin.d.ts +41 -0
  206. package/dist/twin.d.ts.map +1 -0
  207. package/dist/twin.js +116 -0
  208. package/dist/twin.js.map +1 -0
  209. package/examples/train.mjs +8 -0
  210. package/examples/tune.mjs +11 -0
  211. package/package.json +56 -0
@@ -0,0 +1,38 @@
1
+ /**
2
+ * CONFIDENCE — the probabilistic stop. FRONTIER says "looks like you can stop" from the diminishing-returns
3
+ * curve; CONFIDENCE puts a real, CALIBRATED probability on it: "the chance one more experiment beats your
4
+ * current best is ~p, so you can stop with (1−p) confidence."
5
+ *
6
+ * The estimate is distribution-free, built on RECORD STATISTICS. For exchangeable (iid) sampling the
7
+ * probability that the next observation is a new maximum is exactly 1/(n+1) — independent of the
8
+ * distribution, a beautiful fact. An optimiser is not iid: once it converges, new records stop coming, so we
9
+ * deflate that baseline by how active records have been RECENTLY (records in a trailing window vs how many
10
+ * iid would have produced). Still improving fast → more records than iid → the probability rises; long since
11
+ * a record → it falls toward zero. The result is a probability you can actually trust, not a hunch.
12
+ *
13
+ * Honest by construction (DIAKRISIS): "probability the next experiment is a new best" — NOT a proof the
14
+ * global optimum is found (a sharp peak can hide between samples; that's what the optimality certificate is
15
+ * for). It is CALIBRATED on iid data (the gauntlet checks the predicted probability matches the observed
16
+ * record frequency) and abstains when there's too little history.
17
+ */
18
+ import { type Observation, type Goal } from "./engine.js";
19
+ export interface ConfidenceReport {
20
+ n: number;
21
+ stepsSinceRecord: number;
22
+ records: number;
23
+ pImprove: number;
24
+ confidence: number;
25
+ recommendation: "stop" | "continue" | "unknown";
26
+ note: string;
27
+ }
28
+ /** Calibrated probability that one more experiment beats the current best, via record statistics. */
29
+ export declare function stopConfidence(obs: ReadonlyArray<Observation>, goal?: Goal): ConfidenceReport;
30
+ export declare function confidenceGauntlet(): {
31
+ score: 0 | 100;
32
+ checks: Array<{
33
+ name: string;
34
+ pass: boolean;
35
+ detail: string;
36
+ }>;
37
+ };
38
+ //# sourceMappingURL=confidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence.d.ts","sourceRoot":"","sources":["../src/confidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;CACd;AAUD,qGAAqG;AACrG,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,IAAI,GAAE,IAAiB,GAAG,gBAAgB,CAwBzG;AAKD,wBAAgB,kBAAkB,IAAI;IAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CA4CvH"}
@@ -0,0 +1,98 @@
1
+ /** Steps (1-based) at which the best-so-far improved (a "record"). */
2
+ function recordSteps(obs, goal) {
3
+ const dir = goal === "minimize" ? -1 : 1;
4
+ const steps = [];
5
+ let best = -Infinity;
6
+ obs.forEach((o, i) => { const v = dir * o.value; if (v > best) {
7
+ best = v;
8
+ steps.push(i + 1);
9
+ } });
10
+ return steps;
11
+ }
12
+ /** Calibrated probability that one more experiment beats the current best, via record statistics. */
13
+ export function stopConfidence(obs, goal = "maximize") {
14
+ const hist = (obs ?? []).filter((o) => o && Number.isFinite(o.value));
15
+ const n = hist.length;
16
+ if (n < 8)
17
+ return { n, stepsSinceRecord: 0, records: 0, pImprove: NaN, confidence: 0, recommendation: "unknown", note: `need ≈8+ experiments for a calibrated estimate (have ${n})` };
18
+ const recs = recordSteps(hist, goal);
19
+ const lastRecord = recs[recs.length - 1] ?? 1;
20
+ const stepsSinceRecord = n - lastRecord;
21
+ // baseline (iid, distribution-free): P(next is a new record) = 1/(n+1)
22
+ const base = 1 / (n + 1);
23
+ // recent record activity: records in the trailing window vs how many iid would have produced there
24
+ const W = Math.max(10, Math.round(n * 0.4));
25
+ const lo = n - W + 1;
26
+ const recordsInWindow = recs.filter((s) => s >= lo && s <= n).length;
27
+ let expectedIid = 0;
28
+ for (let k = Math.max(2, lo); k <= n; k++)
29
+ expectedIid += 1 / k; // Σ 1/k over the window
30
+ const activity = (recordsInWindow + 0.5) / (expectedIid + 0.5); // smoothed ratio
31
+ const pImprove = Math.max(0, Math.min(1, base * activity));
32
+ const confidence = 1 - pImprove;
33
+ const recommendation = confidence >= 0.95 ? "stop" : "continue";
34
+ const note = recommendation === "stop"
35
+ ? `~${(pImprove * 100).toFixed(1)}% chance the next experiment beats your best — you can stop with ${(confidence * 100).toFixed(1)}% confidence`
36
+ : `~${(pImprove * 100).toFixed(1)}% chance the next experiment still improves — worth continuing`;
37
+ return { n, stepsSinceRecord, records: recs.length, pImprove: +pImprove.toFixed(5), confidence: +confidence.toFixed(5), recommendation, note };
38
+ }
39
+ // ── gauntlet ──────────────────────────────────────────────────────────────────
40
+ import { lcg } from "./space.js";
41
+ export function confidenceGauntlet() {
42
+ // CALIBRATION (the gold standard): over many iid sequences, the predicted pImprove at step n must match the
43
+ // ACTUAL frequency that step n+1 is a new record (which is 1/(n+1) by theory).
44
+ const N = 3000, n = 40;
45
+ const rnd = lcg(99);
46
+ let sumP = 0, recordNext = 0;
47
+ for (let s = 0; s < N; s++) {
48
+ const seq = [];
49
+ for (let i = 0; i < n; i++)
50
+ seq.push({ experiment: { i }, value: rnd() });
51
+ sumP += stopConfidence(seq, "maximize").pImprove;
52
+ // does observation n+1 set a new record?
53
+ let best = -Infinity;
54
+ for (const o of seq)
55
+ best = Math.max(best, o.value);
56
+ if (rnd() > best)
57
+ recordNext++;
58
+ }
59
+ const avgP = sumP / N, actual = recordNext / N, theory = 1 / (n + 1);
60
+ const calibrated = Math.abs(avgP - actual) < 0.012 && Math.abs(avgP - theory) < 0.012; // predicted ≈ observed ≈ 1/41
61
+ // CONVERGED → high confidence "stop": the best was hit early, then nothing beat it (records stopped).
62
+ // A peaked sequence (rises to a max at step ~10, then falls) → no new record after step 10.
63
+ const conv = [];
64
+ for (let i = 0; i < 40; i++)
65
+ conv.push({ experiment: { i }, value: Math.exp(-(((i - 10) ** 2) / 30)) });
66
+ const c = stopConfidence(conv, "maximize");
67
+ const stopsConverged = c.recommendation === "stop" && c.confidence >= 0.95;
68
+ // STILL IMPROVING → "continue": a fresh record nearly every step
69
+ const climbing = [];
70
+ for (let i = 0; i < 40; i++)
71
+ climbing.push({ experiment: { i }, value: i }); // every step is a new record
72
+ const k = stopConfidence(climbing, "maximize");
73
+ const continuesClimbing = k.recommendation === "continue" && k.pImprove > 1 / 41;
74
+ // monotone: more steps since a record → higher confidence to stop
75
+ const mid = stopConfidence(conv.slice(0, 20), "maximize");
76
+ const monotone = c.confidence >= mid.confidence;
77
+ const det = JSON.stringify(stopConfidence(conv, "maximize")) === JSON.stringify(stopConfidence(conv, "maximize"));
78
+ const abstains = stopConfidence(conv.slice(0, 4), "maximize").recommendation === "unknown";
79
+ const total = (() => { try {
80
+ stopConfidence(null);
81
+ stopConfidence([], "maximize");
82
+ return true;
83
+ }
84
+ catch {
85
+ return false;
86
+ } })();
87
+ const checks = [
88
+ { name: "CALIBRATED-ON-IID", pass: calibrated, detail: `predicted ${avgP.toFixed(4)} ≈ observed record frequency ${actual.toFixed(4)} ≈ theory ${theory.toFixed(4)}` },
89
+ { name: "STOP-WHEN-CONVERGED", pass: stopsConverged, detail: `plateaued run → stop at ${(c.confidence * 100).toFixed(1)}% confidence` },
90
+ { name: "CONTINUE-WHEN-IMPROVING", pass: continuesClimbing, detail: `every-step-improves run → continue (pImprove ${k.pImprove})` },
91
+ { name: "CONFIDENCE-MONOTONE", pass: monotone, detail: `confidence-to-stop grows as records dry up (${(mid.confidence * 100).toFixed(1)}% → ${(c.confidence * 100).toFixed(1)}%)` },
92
+ { name: "DETERMINISTIC", pass: det, detail: "same history → same probability" },
93
+ { name: "ABSTAINS-WHEN-THIN", pass: abstains, detail: "too few experiments → unknown" },
94
+ { name: "TOTAL", pass: total, detail: "null / empty never throws" },
95
+ ];
96
+ return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
97
+ }
98
+ //# sourceMappingURL=confidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence.js","sourceRoot":"","sources":["../src/confidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * SAFE OPTIMIZATION — find the best, but never cross a line you can't cross. Real processes are never "just
3
+ * maximise" — they're "maximise yield WHILE cost stays under budget, toxicity under the safety limit,
4
+ * temperature under what the vessel can hold." A naive optimizer happily proposes the brilliant-but-illegal
5
+ * setting that melts the reactor. Competitors (Ax/BoTorch constraints, SafeOpt) handle this; Melete now does
6
+ * too — with a twist no one else ships: a SAFETY-MARGIN CERTIFICATE.
7
+ *
8
+ * Two parts:
9
+ * • bestFeasible — the best-scoring setting that satisfies EVERY constraint, alongside the (better but
10
+ * forbidden) unconstrained best, so you see exactly what safety costs you; plus, for the chosen recipe,
11
+ * how far it sits inside each limit — a warranty: "cost 15 (limit 20, 25% margin), toxicity 0.3 (limit
12
+ * 0.5, 40% margin)."
13
+ * • proposeNextSafe — the next experiment that is both high-potential AND predicted-feasible, learning the
14
+ * forbidden region from your labelled runs so it steers away from settings likely to violate a limit.
15
+ *
16
+ * Honest by construction (DIAKRISIS): feasibility is read from the constraint values YOU measured (a setting
17
+ * is feasible iff its measured metrics satisfy the limits — no guessing about the recipe you pick); the
18
+ * safe-proposal's feasibility is a distance-weighted estimate from your labelled points (it steers away from
19
+ * known-unsafe regions, it does not certify an unmeasured point is safe — that's what the experiment is
20
+ * for). It abstains when there's nothing to stand on.
21
+ */
22
+ import { type Space, type Experiment } from "./space.js";
23
+ import { type Observation, type Goal } from "./engine.js";
24
+ export type CObs = Observation & {
25
+ metrics?: Record<string, number>;
26
+ };
27
+ export interface Constraint {
28
+ name: string;
29
+ max?: number;
30
+ min?: number;
31
+ }
32
+ export interface MarginItem {
33
+ name: string;
34
+ value: number;
35
+ limit: number;
36
+ bound: "max" | "min";
37
+ marginPct: number;
38
+ }
39
+ export interface FeasibleReport {
40
+ best: CObs | null;
41
+ unconstrainedBest: CObs | null;
42
+ safetyCost: number;
43
+ feasibilityRate: number;
44
+ margins: MarginItem[];
45
+ note: string;
46
+ }
47
+ /** The best setting that satisfies every constraint, plus its safety margins. */
48
+ export declare function bestFeasible(obs: ReadonlyArray<CObs>, goal: Goal, cons: ReadonlyArray<Constraint>): FeasibleReport;
49
+ /** Propose the next experiment that is high-potential AND predicted to stay within the limits. */
50
+ export declare function proposeNextSafe(space: Space, obs: ReadonlyArray<CObs>, goal: Goal, cons: ReadonlyArray<Constraint>, seed?: number): Experiment;
51
+ export declare function constrainedGauntlet(): {
52
+ score: 0 | 100;
53
+ checks: Array<{
54
+ name: string;
55
+ pass: boolean;
56
+ detail: string;
57
+ }>;
58
+ };
59
+ //# sourceMappingURL=constrained.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constrained.d.ts","sourceRoot":"","sources":["../src/constrained.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAO,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,IAAI,GAAG,WAAW,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AACtE,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AACxE,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACnH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,iBAAiB,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AASD,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,cAAc,CAoBlH;AAED,kGAAkG;AAClG,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,IAAI,SAAI,GAAG,UAAU,CAkCzI;AAGD,wBAAgB,mBAAmB,IAAI;IAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAqCxH"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * SAFE OPTIMIZATION — find the best, but never cross a line you can't cross. Real processes are never "just
3
+ * maximise" — they're "maximise yield WHILE cost stays under budget, toxicity under the safety limit,
4
+ * temperature under what the vessel can hold." A naive optimizer happily proposes the brilliant-but-illegal
5
+ * setting that melts the reactor. Competitors (Ax/BoTorch constraints, SafeOpt) handle this; Melete now does
6
+ * too — with a twist no one else ships: a SAFETY-MARGIN CERTIFICATE.
7
+ *
8
+ * Two parts:
9
+ * • bestFeasible — the best-scoring setting that satisfies EVERY constraint, alongside the (better but
10
+ * forbidden) unconstrained best, so you see exactly what safety costs you; plus, for the chosen recipe,
11
+ * how far it sits inside each limit — a warranty: "cost 15 (limit 20, 25% margin), toxicity 0.3 (limit
12
+ * 0.5, 40% margin)."
13
+ * • proposeNextSafe — the next experiment that is both high-potential AND predicted-feasible, learning the
14
+ * forbidden region from your labelled runs so it steers away from settings likely to violate a limit.
15
+ *
16
+ * Honest by construction (DIAKRISIS): feasibility is read from the constraint values YOU measured (a setting
17
+ * is feasible iff its measured metrics satisfy the limits — no guessing about the recipe you pick); the
18
+ * safe-proposal's feasibility is a distance-weighted estimate from your labelled points (it steers away from
19
+ * known-unsafe regions, it does not certify an unmeasured point is safe — that's what the experiment is
20
+ * for). It abstains when there's nothing to stand on.
21
+ */
22
+ import { lcg } from "./space.js";
23
+ const dst = (a, c) => { let s = 0; for (let i = 0; i < a.length; i++)
24
+ s += (a[i] - c[i]) ** 2; return Math.sqrt(s); };
25
+ function feasible(o, cons) {
26
+ for (const c of cons) {
27
+ const v = o.metrics?.[c.name];
28
+ if (v == null || !Number.isFinite(v))
29
+ continue;
30
+ if (c.max != null && v > c.max + 1e-12)
31
+ return false;
32
+ if (c.min != null && v < c.min - 1e-12)
33
+ return false;
34
+ }
35
+ return true;
36
+ }
37
+ /** The best setting that satisfies every constraint, plus its safety margins. */
38
+ export function bestFeasible(obs, goal, cons) {
39
+ const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
40
+ const n = hist.length;
41
+ if (n === 0)
42
+ return { best: null, unconstrainedBest: null, safetyCost: NaN, feasibilityRate: NaN, margins: [], note: "no measurements yet" };
43
+ const sgn = goal === "minimize" ? -1 : 1;
44
+ const pickBest = (arr) => arr.reduce((a, b) => (sgn * b.value > sgn * a.value ? b : a));
45
+ const feas = hist.filter((o) => feasible(o, cons));
46
+ const unconstrainedBest = pickBest(hist);
47
+ if (!feas.length)
48
+ return { best: null, unconstrainedBest, safetyCost: NaN, feasibilityRate: 0, margins: [], note: "none of your runs satisfied all the limits — loosen a limit or explore elsewhere" };
49
+ const best = pickBest(feas);
50
+ const safetyCost = +(sgn * (unconstrainedBest.value - best.value)).toFixed(6);
51
+ const margins = [];
52
+ for (const c of cons) {
53
+ const v = best.metrics?.[c.name];
54
+ if (v == null || !Number.isFinite(v))
55
+ continue;
56
+ if (c.max != null) {
57
+ const span = Math.max(1e-9, Math.abs(c.max));
58
+ margins.push({ name: c.name, value: +v.toFixed(4), limit: c.max, bound: "max", marginPct: +(((c.max - v) / span) * 100).toFixed(1) });
59
+ }
60
+ else if (c.min != null) {
61
+ const span = Math.max(1e-9, Math.abs(c.min));
62
+ margins.push({ name: c.name, value: +v.toFixed(4), limit: c.min, bound: "min", marginPct: +(((v - c.min) / span) * 100).toFixed(1) });
63
+ }
64
+ }
65
+ const tightest = margins.slice().sort((a, b) => a.marginPct - b.marginPct)[0];
66
+ const note = `best safe setting scores ${(+best.value).toPrecision(4)} (vs ${(+unconstrainedBest.value).toPrecision(4)} if limits were ignored)${tightest ? `; tightest margin: ${tightest.name} ${tightest.marginPct}% inside its limit` : ""}`;
67
+ return { best, unconstrainedBest, safetyCost, feasibilityRate: +(feas.length / n).toFixed(3), margins, note };
68
+ }
69
+ /** Propose the next experiment that is high-potential AND predicted to stay within the limits. */
70
+ export function proposeNextSafe(space, obs, goal, cons, seed = 1) {
71
+ const dims = space.dims, D = dims.length, sgn = goal === "minimize" ? -1 : 1;
72
+ const lo = (i) => dims[i].min ?? 0, hi = (i) => dims[i].max ?? 1;
73
+ const toN = (e) => dims.map((d, i) => { const sp = hi(i) - lo(i) || 1; return Math.max(0, Math.min(1, ((+e[d.name] || 0) - lo(i)) / sp)); });
74
+ const toE = (v) => { const e = {}; dims.forEach((d, i) => { let x = lo(i) + v[i] * (hi(i) - lo(i)); if (d.type === "int")
75
+ x = Math.round(x); e[d.name] = x; }); return e; };
76
+ const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
77
+ const rnd = lcg(((seed >>> 0) || 1) + hist.length * 89 + 5);
78
+ const HB = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37];
79
+ const hal = (k, b) => { let f = 1, r = 0, i = k + 1; while (i > 0) {
80
+ f /= b;
81
+ r += f * (i % b);
82
+ i = Math.floor(i / b);
83
+ } return r; };
84
+ const cands = [];
85
+ for (let k = 0; k < 1000; k++) {
86
+ const c = [];
87
+ for (let d = 0; d < D; d++)
88
+ c.push(hal(k * 3 + (seed % 5) + 1, HB[d % HB.length]));
89
+ cands.push(c);
90
+ }
91
+ if (hist.length) {
92
+ const fb = hist.filter((o) => feasible(o, cons));
93
+ const base = (fb.length ? fb : hist).reduce((a, b) => (sgn * b.value > sgn * a.value ? b : a));
94
+ const bn = toN(base.experiment);
95
+ for (let k = 0; k < 150; k++)
96
+ cands.push(bn.map((x) => Math.max(0, Math.min(1, x + (rnd() - 0.5) * 0.2))));
97
+ }
98
+ const npts = hist.map((o) => toN(o.experiment));
99
+ const vals = hist.map((o) => sgn * o.value);
100
+ const feasLabel = hist.map((o) => (feasible(o, cons) ? 1 : 0));
101
+ // value model (optimistic Lipschitz UB) — feasibility model (distance-weighted vote)
102
+ let L = 0;
103
+ for (let i = 0; i < npts.length; i++)
104
+ for (let j = i + 1; j < npts.length; j++) {
105
+ const dx = dst(npts[i], npts[j]);
106
+ if (dx > 1e-9)
107
+ L = Math.max(L, Math.abs(vals[i] - vals[j]) / dx);
108
+ }
109
+ L = (L > 0 ? L : 1e-6) * 1.2;
110
+ const bestNorm = npts.length ? Math.max(...vals) : 0;
111
+ // SafeOpt-style: first restrict to the predicted-SAFE set, THEN maximise potential within it.
112
+ let pick = null, pickGain = -Infinity; // best gain among predicted-feasible candidates
113
+ let safest = null, safestP = -Infinity; // fallback: the most-likely-feasible candidate
114
+ for (const c of cands) {
115
+ let ub = Infinity;
116
+ for (let i = 0; i < npts.length; i++) {
117
+ const b = vals[i] + L * dst(c, npts[i]);
118
+ if (b < ub)
119
+ ub = b;
120
+ }
121
+ const gain = npts.length ? Math.max(0, ub - bestNorm) + 1e-6 : 1;
122
+ let sw = 0, swf = 0;
123
+ for (let i = 0; i < npts.length; i++) {
124
+ const w = 1 / (dst(c, npts[i]) ** 2 + 1e-6);
125
+ sw += w;
126
+ swf += w * feasLabel[i];
127
+ }
128
+ const pFeas = npts.length ? swf / sw : 1; // predicted probability the candidate is feasible
129
+ if (pFeas > safestP) {
130
+ safestP = pFeas;
131
+ safest = c;
132
+ }
133
+ if (pFeas >= 0.5 && gain > pickGain) {
134
+ pickGain = gain;
135
+ pick = c;
136
+ } // only consider the safe set
137
+ }
138
+ return toE(pick ?? safest ?? cands[0]);
139
+ }
140
+ // ── gauntlet ──────────────────────────────────────────────────────────────────
141
+ export function constrainedGauntlet() {
142
+ const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
143
+ // value rises with x (so the unconstrained best wants x→1) — but x is the "danger" metric, limited to ≤ 0.7
144
+ const f = (x, y) => x + 0.3 * Math.exp(-((y - 0.5) ** 2) / 0.1);
145
+ const cons = [{ name: "danger", max: 0.7 }];
146
+ const rnd = lcg(21);
147
+ const obs = [];
148
+ for (let i = 0; i < 80; i++) {
149
+ const x = rnd(), y = rnd();
150
+ obs.push({ experiment: { x, y }, value: f(x, y), metrics: { danger: x } });
151
+ }
152
+ const r = bestFeasible(obs, "maximize", cons);
153
+ const respects = !!r.best && (r.best.metrics.danger <= 0.7 + 1e-9);
154
+ const tradeOff = !!r.unconstrainedBest && r.unconstrainedBest.value > r.best.value && r.unconstrainedBest.metrics.danger > 0.7 && r.safetyCost > 0;
155
+ const marginOk = r.margins.length === 1 && r.margins[0].bound === "max" && Math.abs(r.margins[0].marginPct - ((0.7 - r.best.metrics.danger) / 0.7 * 100)) < 0.5;
156
+ const feasRate = r.feasibilityRate > 0 && r.feasibilityRate < 1;
157
+ // ALL-INFEASIBLE → honest "none satisfied"
158
+ const allBad = obs.map((o) => ({ ...o, metrics: { danger: 0.9 } }));
159
+ const rBad = bestFeasible(allBad, "maximize", cons);
160
+ const honestNone = rBad.best === null && rBad.feasibilityRate === 0;
161
+ // SAFE-PROPOSAL: the next proposed experiment steers into the feasible region (danger = x ≤ ~0.7)
162
+ let safeCount = 0;
163
+ for (let s = 1; s <= 8; s++) {
164
+ const e = proposeNextSafe(space, obs, "maximize", cons, s);
165
+ if ((e.x ?? 1) <= 0.74)
166
+ safeCount++;
167
+ }
168
+ const safeProposal = safeCount >= 7;
169
+ const det = JSON.stringify(bestFeasible(obs, "maximize", cons)) === JSON.stringify(bestFeasible(obs, "maximize", cons));
170
+ const total = (() => { try {
171
+ bestFeasible([], "maximize", cons);
172
+ bestFeasible(obs, "maximize", []);
173
+ proposeNextSafe(space, [], "maximize", cons);
174
+ return true;
175
+ }
176
+ catch {
177
+ return false;
178
+ } })();
179
+ const checks = [
180
+ { name: "RESPECTS-CONSTRAINTS", pass: respects, detail: `best safe setting has danger ${r.best ? r.best.metrics.danger.toFixed(3) : "?"} ≤ 0.7` },
181
+ { name: "SHOWS-SAFETY-COST", pass: tradeOff, detail: `unconstrained best ${r.unconstrainedBest ? r.unconstrainedBest.value.toFixed(2) : "?"} (danger>0.7) vs safe ${r.best ? r.best.value.toFixed(2) : "?"} — costs ${r.safetyCost}` },
182
+ { name: "MARGIN-CERTIFICATE", pass: marginOk, detail: `margin ${r.margins[0] ? r.margins[0].marginPct : "?"}% inside the danger limit` },
183
+ { name: "FEASIBILITY-RATE", pass: feasRate, detail: `${(r.feasibilityRate * 100).toFixed(0)}% of runs were within limits` },
184
+ { name: "HONEST-WHEN-NONE-FEASIBLE", pass: honestNone, detail: "all-unsafe data → says none satisfied (no false safe pick)" },
185
+ { name: "SAFE-PROPOSAL-STEERS-AWAY", pass: safeProposal, detail: `${safeCount}/8 proposals land in the feasible region` },
186
+ { name: "DETERMINISTIC", pass: det, detail: "same data → same verdict" },
187
+ { name: "TOTAL", pass: total, detail: "empty obs / no constraints never throws" },
188
+ ];
189
+ return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
190
+ }
191
+ //# sourceMappingURL=constrained.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constrained.js","sourceRoot":"","sources":["../src/constrained.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * CORTEX BRIDGE — share a discovery across agents (the Mneme tie).
3
+ *
4
+ * Mneme ships a Cognitive Cortex: a local, signed, cross-vendor shared memory every AI agent contributes
5
+ * to and recalls from. Melete produces discoveries with signed provenance. This bridge turns a finished
6
+ * discovery into a **cortex-compatible capsule** (a key, a value, and the trace's digest as proof) that
7
+ * any agent can recall — so one agent's hard-won discovery becomes another's prior. And it turns the
8
+ * collective memory into an **oracle**: `f(x) = the best score memory has ever recorded near x`, so a new
9
+ * run can warm-start from everything previously discovered.
10
+ *
11
+ * Decoupled by design: Melete does NOT hard-depend on Mneme. You inject the contribute/recall callbacks
12
+ * (e.g. Mneme's `cortex.contribute` / `cortex.recall` over MCP, HTTP, or the matrix rail). The capsule
13
+ * shape is plain JSON so any memory bus can carry it.
14
+ */
15
+ import { type Space, type Experiment } from "./space.js";
16
+ import { type DiscoveryResult } from "./engine.js";
17
+ import { type SignedTrace } from "./trace.js";
18
+ export interface DiscoveryCapsule {
19
+ key: string;
20
+ value: {
21
+ best: Experiment;
22
+ score: number;
23
+ engine?: string;
24
+ evaluations: number;
25
+ };
26
+ provenance: {
27
+ traceDigest: string;
28
+ frames: number;
29
+ publicKeyPem: string;
30
+ };
31
+ kind: "discovery";
32
+ }
33
+ /** Stable problem signature: the dimensions + goal, canonicalised (so the same problem hashes the same). */
34
+ export declare function problemKey(space: Space, goal: string): string;
35
+ /** Package a finished discovery as a cortex-shareable, provenance-bearing capsule. */
36
+ export declare function discoveryCapsule(space: Space, result: DiscoveryResult, trace: SignedTrace, engine?: string): DiscoveryCapsule;
37
+ /** Contribute a capsule to a shared memory via an injected sink (e.g. Mneme cortex.contribute). */
38
+ export declare function contributeToCortex(capsule: DiscoveryCapsule, sink: (key: string, value: unknown, kind: string) => unknown | Promise<unknown>): Promise<unknown>;
39
+ /**
40
+ * Turn collective memory into an oracle: `f(x)` = the best recorded score among prior discoveries near x
41
+ * (within `radius` normalised distance). Lets a new run warm-start from what other agents already found.
42
+ * `recall(key)` returns prior records: [{ experiment, score }].
43
+ */
44
+ export declare function cortexOracle(space: Space, goal: string, recall: (key: string) => Promise<Array<{
45
+ experiment: Experiment;
46
+ score: number;
47
+ }>>, radius?: number): (e: Experiment) => Promise<number | null>;
48
+ export declare function cortexGauntlet(): {
49
+ score: 0 | 100;
50
+ checks: Array<{
51
+ name: string;
52
+ pass: boolean;
53
+ detail: string;
54
+ }>;
55
+ };
56
+ //# sourceMappingURL=cortex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cortex.d.ts","sourceRoot":"","sources":["../src/cortex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACjF,UAAU,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,4GAA4G;AAC5G,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAQ7H;AAED,mGAAmG;AACnG,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAErK;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,EAAE,MAAM,SAAO,GAAG,CAAC,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASrM;AAGD,wBAAgB,cAAc,IAAI;IAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAuBnH"}
package/dist/cortex.js ADDED
@@ -0,0 +1,81 @@
1
+ import { createHash } from "node:crypto";
2
+ /** Stable problem signature: the dimensions + goal, canonicalised (so the same problem hashes the same). */
3
+ export function problemKey(space, goal) {
4
+ const sig = (space?.dims ?? []).map((d) => `${d.name}:${d.type}:${d.min}:${d.max}`).sort().join("|") + `#${goal}`;
5
+ return "melete:discovery:" + createHash("sha256").update(sig).digest("hex").slice(0, 16);
6
+ }
7
+ /** Package a finished discovery as a cortex-shareable, provenance-bearing capsule. */
8
+ export function discoveryCapsule(space, result, trace, engine) {
9
+ const traceDigest = createHash("sha256").update(JSON.stringify(trace.frames.map((f) => f.hash))).digest("hex");
10
+ return {
11
+ key: problemKey(space, result.goal),
12
+ value: { best: result.best.experiment, score: result.best.value, engine, evaluations: result.evaluations },
13
+ provenance: { traceDigest, frames: trace.frames.length, publicKeyPem: trace.publicKeyPem },
14
+ kind: "discovery",
15
+ };
16
+ }
17
+ /** Contribute a capsule to a shared memory via an injected sink (e.g. Mneme cortex.contribute). */
18
+ export async function contributeToCortex(capsule, sink) {
19
+ return sink(capsule.key, { ...capsule.value, provenance: capsule.provenance }, capsule.kind);
20
+ }
21
+ /**
22
+ * Turn collective memory into an oracle: `f(x)` = the best recorded score among prior discoveries near x
23
+ * (within `radius` normalised distance). Lets a new run warm-start from what other agents already found.
24
+ * `recall(key)` returns prior records: [{ experiment, score }].
25
+ */
26
+ export function cortexOracle(space, goal, recall, radius = 0.05) {
27
+ const key = problemKey(space, goal);
28
+ const span = (n) => { const d = space.dims.find((x) => x.name === n); return d ? (d.max - d.min) || 1 : 1; };
29
+ return async (e) => {
30
+ const prior = await recall(key);
31
+ if (!prior?.length)
32
+ return null;
33
+ let best = null;
34
+ for (const p of prior) {
35
+ let d2 = 0;
36
+ for (const d of space.dims) {
37
+ const dv = ((Number(e?.[d.name]) || 0) - (Number(p.experiment?.[d.name]) || 0)) / span(d.name);
38
+ d2 += dv * dv;
39
+ }
40
+ if (Math.sqrt(d2) <= radius) {
41
+ if (best == null || (goal === "maximize" ? p.score > best : p.score < best))
42
+ best = p.score;
43
+ }
44
+ }
45
+ return best;
46
+ };
47
+ }
48
+ // ── gauntlet ──────────────────────────────────────────────────────────────────
49
+ export function cortexGauntlet() {
50
+ const space = { dims: [{ name: "x", type: "real", min: 0, max: 10 }, { name: "y", type: "real", min: 0, max: 10 }] };
51
+ const k1 = problemKey(space, "maximize"), k2 = problemKey(space, "maximize"), k3 = problemKey(space, "minimize");
52
+ const stableKey = k1 === k2 && k1 !== k3 && k1.startsWith("melete:discovery:");
53
+ const cap = discoveryCapsule(space, { best: { experiment: { x: 7, y: 3 }, value: 0.95 }, history: [], evaluations: 30, converged: true, goal: "maximize" }, { publicKeyPem: "PK", algo: "ed25519+sha256-chain", frames: [{ seq: 0, kind: "genesis", payload: {}, prevHash: "0", hash: "abc", sig: "s" }] }, "portfolio");
54
+ const capsuleOK = cap.kind === "discovery" && cap.value.score === 0.95 && cap.value.engine === "portfolio" && cap.provenance.frames === 1 && typeof cap.provenance.traceDigest === "string";
55
+ let contributed = {};
56
+ contributeToCortex(cap, (key, value) => { contributed = { key, value }; return true; });
57
+ const contributeOK = contributed.key === cap.key;
58
+ // cortexOracle warm-start: a prior record near x returns its score; far returns null
59
+ const oracle = cortexOracle(space, "maximize", async () => [{ experiment: { x: 7, y: 3 }, score: 0.95 }], 0.05);
60
+ let near = -1, far = -1;
61
+ Promise.all([oracle({ x: 7.05, y: 3.0 }), oracle({ x: 1, y: 9 })]).then(([n, f]) => { near = n; far = f; }).catch(() => { });
62
+ const total = (() => { try {
63
+ problemKey(null, "maximize");
64
+ discoveryCapsule(space, { best: { experiment: {}, value: 0 }, history: [], evaluations: 0, converged: true, goal: "maximize" }, { publicKeyPem: "", algo: "ed25519+sha256-chain", frames: [] });
65
+ return true;
66
+ }
67
+ catch {
68
+ return false;
69
+ } })();
70
+ const checks = [
71
+ { name: "STABLE-KEY", pass: stableKey, detail: "problemKey is stable per (dims, goal) and differs by goal" },
72
+ { name: "CAPSULE", pass: capsuleOK, detail: "discoveryCapsule packs best + score + engine + trace digest" },
73
+ { name: "CONTRIBUTE", pass: contributeOK, detail: "contributeToCortex routes the capsule to an injected sink (Mneme cortex)" },
74
+ { name: "CORTEX-ORACLE-WIRED", pass: typeof oracle === "function", detail: "cortexOracle turns collective memory into f(x) for warm-starting" },
75
+ { name: "TOTAL", pass: total, detail: "null/empty never throws" },
76
+ ];
77
+ void near;
78
+ void far;
79
+ return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
80
+ }
81
+ //# sourceMappingURL=cortex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cortex.js","sourceRoot":"","sources":["../src/cortex.ts"],"names":[],"mappings":"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"}