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,44 @@
1
+ /**
2
+ * INTERACTION — the variable-coupling map. The rarest thing a sequential optimizer can tell you: not just
3
+ * "what's the best setting", but "which of your knobs INTERACT — where the best value of one depends on
4
+ * another, so you cannot tune them independently."
5
+ *
6
+ * In real process design this is the difference between a recipe you can hand off ("set temp=X, pH=Y") and
7
+ * one you can't ("the best temp depends on the pH"). Classical Design-of-Experiments studies interactions —
8
+ * but black-box / sequential optimizers (the ones tuning ML models and assays today) just return a point and
9
+ * never surface the coupling. INTERACTION fits a quadratic-with-cross-terms response model to the
10
+ * measurements you already collected and reads off, for every pair of variables, how strong their
11
+ * interaction is relative to their individual effects — a coupling map of your process.
12
+ *
13
+ * Honest by construction (DIAKRISIS): it is a second-order (quadratic) fit — it recovers pairwise
14
+ * interactions exactly when the response is well-approximated by one (the gauntlet proves it recovers an
15
+ * injected interaction coefficient), and it abstains when there are too few measurements to fit the model.
16
+ * It reports correlation-of-effects, not a causal proof.
17
+ */
18
+ import { type Space } from "./space.js";
19
+ import { type Observation, type Goal } from "./engine.js";
20
+ export interface InteractionPair {
21
+ a: string;
22
+ b: string;
23
+ strength: number;
24
+ importancePct: number;
25
+ coupled: boolean;
26
+ }
27
+ export interface InteractionReport {
28
+ n: number;
29
+ pairs: InteractionPair[];
30
+ strongest: InteractionPair | null;
31
+ hasInteraction: boolean;
32
+ note: string;
33
+ }
34
+ /** Fit a quadratic-with-interactions model and report the coupling strength of every variable pair. */
35
+ export declare function analyzeInteractions(obs: ReadonlyArray<Observation>, space: Space, _goal?: Goal): InteractionReport;
36
+ export declare function interactionGauntlet(): {
37
+ score: 0 | 100;
38
+ checks: Array<{
39
+ name: string;
40
+ pass: boolean;
41
+ detail: string;
42
+ }>;
43
+ };
44
+ //# sourceMappingURL=interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAmB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,eAAe;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AACpH,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AA+BD,uGAAuG;AACvG,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAE,IAAiB,GAAG,iBAAiB,CAsC9H;AAKD,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,CA6CxH"}
@@ -0,0 +1,167 @@
1
+ function norm(space, e) {
2
+ return space.dims.map((d) => { const lo = d.min ?? 0, hi = d.max ?? 1; const span = hi - lo || 1; return Math.max(0, Math.min(1, ((+e[d.name] || 0) - lo) / span)); });
3
+ }
4
+ /** Solve A x = b (n×n) by Gaussian elimination with partial pivoting. Returns x (zeros for singular rows). */
5
+ function solve(A, b) {
6
+ const n = b.length;
7
+ const M = A.map((r, i) => r.concat([b[i]]));
8
+ for (let col = 0; col < n; col++) {
9
+ let piv = col;
10
+ for (let r = col + 1; r < n; r++)
11
+ if (Math.abs(M[r][col]) > Math.abs(M[piv][col]))
12
+ piv = r;
13
+ const t = M[col];
14
+ M[col] = M[piv];
15
+ M[piv] = t;
16
+ const d = M[col][col];
17
+ if (Math.abs(d) < 1e-12)
18
+ continue;
19
+ for (let r = 0; r < n; r++) {
20
+ if (r === col)
21
+ continue;
22
+ const f = M[r][col] / d;
23
+ if (f === 0)
24
+ continue;
25
+ for (let c = col; c <= n; c++)
26
+ M[r][c] -= f * M[col][c];
27
+ }
28
+ }
29
+ const x = new Array(n).fill(0);
30
+ for (let i = 0; i < n; i++) {
31
+ const d = M[i][i];
32
+ x[i] = Math.abs(d) > 1e-12 ? M[i][n] / d : 0;
33
+ }
34
+ return x;
35
+ }
36
+ /** Build the feature vector [1, x_k, x_k², x_i·x_j] for a normalised point, plus the index map of pairs. */
37
+ function features(x) {
38
+ const D = x.length;
39
+ const f = [1];
40
+ for (let k = 0; k < D; k++)
41
+ f.push(x[k]); // main effects
42
+ for (let k = 0; k < D; k++)
43
+ f.push(x[k] * x[k]); // curvature
44
+ const pairs = [];
45
+ for (let i = 0; i < D; i++)
46
+ for (let j = i + 1; j < D; j++) {
47
+ f.push(x[i] * x[j]);
48
+ pairs.push([i, j]);
49
+ }
50
+ return { f, pairs };
51
+ }
52
+ /** Fit a quadratic-with-interactions model and report the coupling strength of every variable pair. */
53
+ export function analyzeInteractions(obs, space, _goal = "maximize") {
54
+ const dims = space?.dims ?? [];
55
+ const D = dims.length;
56
+ const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
57
+ const n = hist.length;
58
+ const nPairs = (D * (D - 1)) / 2;
59
+ const nFeat = 1 + 2 * D + nPairs;
60
+ if (D < 2 || n < nFeat + 3) {
61
+ return { n, pairs: [], strongest: null, hasInteraction: false, note: `need ≈${nFeat + 3} measurements to fit the interaction model (have ${n})` };
62
+ }
63
+ const X = hist.map((o) => features(norm(space, o.experiment)));
64
+ const y = hist.map((o) => o.value);
65
+ const pairIdx = X[0].pairs;
66
+ // normal equations XtX b = Xty, with a tiny ridge for stability
67
+ const XtX = Array.from({ length: nFeat }, () => new Array(nFeat).fill(0));
68
+ const Xty = new Array(nFeat).fill(0);
69
+ for (let r = 0; r < n; r++) {
70
+ const f = X[r].f;
71
+ for (let a = 0; a < nFeat; a++) {
72
+ Xty[a] += f[a] * y[r];
73
+ for (let b = 0; b < nFeat; b++)
74
+ XtX[a][b] += f[a] * f[b];
75
+ }
76
+ }
77
+ for (let a = 0; a < nFeat; a++)
78
+ XtX[a][a] += 1e-6;
79
+ const coef = solve(XtX, Xty);
80
+ // main-effect scale (mains + curvature) — to decide if a coupling RIVALS the individual effects
81
+ let mainScale = 0;
82
+ for (let k = 1; k <= 2 * D; k++)
83
+ mainScale += Math.abs(coef[k]);
84
+ mainScale = mainScale / (2 * D);
85
+ const vRange = Math.max(1e-12, Math.max(...y) - Math.min(...y));
86
+ const interStart = 1 + 2 * D;
87
+ const raw = pairIdx.map(([i, j], p) => ({ i, j, d: Math.abs(coef[interStart + p]) }));
88
+ const sumInter = raw.reduce((a, b) => a + b.d, 0) || 1;
89
+ const pairs = raw.map((r) => ({
90
+ a: dims[r.i].name, b: dims[r.j].name,
91
+ strength: +(r.d / vRange).toFixed(3), // interaction size as a fraction of the score's spread
92
+ importancePct: +(100 * r.d / sumInter).toFixed(1),
93
+ coupled: r.d > 0.5 * mainScale && r.d / vRange > 0.08, // real coupling: rivals the main effects + non-trivial
94
+ })).sort((a, b) => b.strength - a.strength);
95
+ const strongest = pairs[0] ?? null;
96
+ const hasInteraction = !!strongest && strongest.coupled;
97
+ const note = hasInteraction
98
+ ? `${strongest.a} × ${strongest.b} interact (strength ${strongest.strength}) — tune them together, not independently`
99
+ : "no strong coupling — your variables can be tuned fairly independently";
100
+ return { n, pairs, strongest, hasInteraction, note };
101
+ }
102
+ // ── gauntlet ──────────────────────────────────────────────────────────────────
103
+ import { lcg } from "./space.js";
104
+ export function interactionGauntlet() {
105
+ const space2 = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
106
+ const rnd = lcg(13);
107
+ const sample = (f, sp, m = 60) => {
108
+ const o = [];
109
+ const D = sp.dims.length;
110
+ for (let i = 0; i < m; i++) {
111
+ const c = {};
112
+ const xs = [];
113
+ for (let k = 0; k < D; k++) {
114
+ const v = rnd();
115
+ xs.push(v);
116
+ c[sp.dims[k].name] = v;
117
+ }
118
+ o.push({ experiment: c, value: f(xs[0], xs[1], xs[2]) });
119
+ }
120
+ return o;
121
+ };
122
+ // strong interaction: value = 2x + 3y + 5·xy → the xy coupling should be detected
123
+ const withInter = analyzeInteractions(sample((x, y) => 2 * x + 3 * y + 5 * x * y, space2), space2);
124
+ const detects = withInter.hasInteraction && withInter.strongest?.a === "x" && withInter.strongest?.b === "y";
125
+ // NO interaction: value = 2x + 3y → coupling should be ~0 (not flagged)
126
+ const noInter = analyzeInteractions(sample((x, y) => 2 * x + 3 * y, space2), space2);
127
+ const cleanLow = !noInter.hasInteraction && (noInter.strongest ? noInter.strongest.strength < 0.5 : true);
128
+ // RECOVERS-COEFFICIENT (falsifiable): with value = a + b·xy the fitted interaction ≈ the true coefficient.
129
+ // strength = |d_xy| / mainScale; here mains are ~0 so we check the raw recovered coefficient instead.
130
+ const recObs = sample((x, y) => 10 + 4 * x * y, space2, 80);
131
+ const recRep = analyzeInteractions(recObs, space2);
132
+ // value = 10 + 4·xy: the interaction term IS the whole signal, so strength (|d|/range) should be ≈ 1.0
133
+ const recovers = recRep.hasInteraction && recRep.strongest.strength > 0.7 && recRep.strongest.strength < 1.4;
134
+ // 3 variables: interaction only between x and z → that exact pair is the strongest
135
+ const space3 = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }, { name: "z", type: "real", min: 0, max: 1 }] };
136
+ const rnd3 = lcg(21);
137
+ const o3 = [];
138
+ for (let i = 0; i < 90; i++) {
139
+ const x = rnd3(), y = rnd3(), z = rnd3();
140
+ o3.push({ experiment: { x, y, z }, value: x + y + z + 6 * x * z });
141
+ }
142
+ const r3 = analyzeInteractions(o3, space3);
143
+ const picksRightPair = r3.hasInteraction && ((r3.strongest.a === "x" && r3.strongest.b === "z") || (r3.strongest.a === "z" && r3.strongest.b === "x"));
144
+ const detObs = sample((x, y) => 2 * x + 3 * y + 5 * x * y, space2);
145
+ const det = JSON.stringify(analyzeInteractions(detObs, space2)) === JSON.stringify(analyzeInteractions(detObs, space2));
146
+ const thin = analyzeInteractions([{ experiment: { x: 0.1, y: 0.2 }, value: 1 }], space2);
147
+ const abstains = thin.pairs.length === 0 && thin.hasInteraction === false;
148
+ const total = (() => { try {
149
+ analyzeInteractions(null, space2);
150
+ analyzeInteractions([], space2);
151
+ return true;
152
+ }
153
+ catch {
154
+ return false;
155
+ } })();
156
+ const checks = [
157
+ { name: "DETECTS-INTERACTION", pass: detects, detail: `value=2x+3y+5xy → flags x×y coupled (strength ${withInter.strongest?.strength})` },
158
+ { name: "NO-FALSE-INTERACTION", pass: cleanLow, detail: `value=2x+3y → no coupling flagged (strength ${noInter.strongest?.strength ?? 0})` },
159
+ { name: "RECOVERS-COEFFICIENT", pass: recovers, detail: `a dominant injected interaction is surfaced as the strongest term (${recRep.strongest?.strength})` },
160
+ { name: "PICKS-RIGHT-PAIR-3D", pass: picksRightPair, detail: `among x,y,z with only x·z coupled, it picks x×z (got ${r3.strongest?.a}×${r3.strongest?.b})` },
161
+ { name: "DETERMINISTIC", pass: det, detail: "same data → same map" },
162
+ { name: "ABSTAINS-WHEN-THIN", pass: abstains, detail: "too few measurements → no claim" },
163
+ { name: "TOTAL", pass: total, detail: "null / empty never throws" },
164
+ ];
165
+ return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
166
+ }
167
+ //# sourceMappingURL=interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.js","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * INTERACTIVE / HUMAN-IN-THE-LOOP — "you measure, Melete guides".
3
+ *
4
+ * The web-native way to use Melete on a REAL process with no code and no formula: Melete proposes the next
5
+ * experiment, you go run it (brew the cup, run the assay, benchmark the kernel), type the score back, and
6
+ * Melete proposes the next — converging to the best in as few real experiments as possible.
7
+ *
8
+ * `proposeNext` is the stateless core: given the search space + the history of (experiment, score) so far,
9
+ * it returns the single most useful experiment to try next. Early on it spreads out to cover the space;
10
+ * once there's enough evidence it switches to the Gaussian-Process forecaster (with an occasional
11
+ * evolutionary step). Deterministic given the seed + history, so a guided run is reproducible + signable.
12
+ */
13
+ import { type Space, type Experiment } from "./space.js";
14
+ import { type Goal, type Observation } from "./engine.js";
15
+ /** Propose the next experiment to run, given the history of observations so far. */
16
+ export declare function proposeNext(space: Space, obs: ReadonlyArray<Observation>, goal?: Goal, seed?: number): Experiment;
17
+ export declare function interactiveGauntlet(): {
18
+ score: 0 | 100;
19
+ checks: Array<{
20
+ name: string;
21
+ pass: boolean;
22
+ detail: string;
23
+ }>;
24
+ };
25
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAO,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1D,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,IAAI,GAAE,IAAiB,EAAE,IAAI,SAAI,GAAG,UAAU,CAQxH;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,CA0BxH"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * INTERACTIVE / HUMAN-IN-THE-LOOP — "you measure, Melete guides".
3
+ *
4
+ * The web-native way to use Melete on a REAL process with no code and no formula: Melete proposes the next
5
+ * experiment, you go run it (brew the cup, run the assay, benchmark the kernel), type the score back, and
6
+ * Melete proposes the next — converging to the best in as few real experiments as possible.
7
+ *
8
+ * `proposeNext` is the stateless core: given the search space + the history of (experiment, score) so far,
9
+ * it returns the single most useful experiment to try next. Early on it spreads out to cover the space;
10
+ * once there's enough evidence it switches to the Gaussian-Process forecaster (with an occasional
11
+ * evolutionary step). Deterministic given the seed + history, so a guided run is reproducible + signable.
12
+ */
13
+ import { lcg } from "./space.js";
14
+ import { armGP, armCMAES, armMaximin } from "./arms.js";
15
+ /** Propose the next experiment to run, given the history of observations so far. */
16
+ export function proposeNext(space, obs, goal = "maximize", seed = 1) {
17
+ const history = (obs ?? []).filter((o) => o && o.experiment);
18
+ const t = history.length;
19
+ const rnd = lcg(((seed >>> 0) || 1) + t * 97 + 1);
20
+ const ctx = { space, obs: history, t, budget: t + 2, rnd, goal };
21
+ const warmup = Math.max(4, (space?.dims?.length ?? 1) + 1);
22
+ if (t < warmup)
23
+ return armMaximin().propose(ctx); // spread out first → cover the space
24
+ return (t % 3 === 0) ? armCMAES().propose(ctx) : armGP().propose(ctx);
25
+ }
26
+ // ── gauntlet ──────────────────────────────────────────────────────────────────
27
+ export function interactiveGauntlet() {
28
+ const space = { dims: [{ name: "x", type: "real", min: 0, max: 10 }, { name: "y", type: "real", min: 0, max: 10 }] };
29
+ const truth = (e) => Math.exp(-(((e.x ?? 0) - 7) ** 2 + ((e.y ?? 0) - 3) ** 2) / 2); // hidden optimum ≈1 at (7,3)
30
+ // simulate a human-in-the-loop run: propose → "measure" (truth) → record → repeat
31
+ const obs = [];
32
+ let best = -Infinity;
33
+ for (let i = 0; i < 60; i++) {
34
+ const e = proposeNext(space, obs, "maximize", 7);
35
+ const v = truth(e);
36
+ obs.push({ experiment: e, value: v });
37
+ if (v > best)
38
+ best = v;
39
+ }
40
+ const converges = best > 0.9;
41
+ // first proposal with no history is valid + in-bounds
42
+ const first = proposeNext(space, [], "maximize", 1);
43
+ const firstOK = typeof first.x === "number" && first.x >= 0 && first.x <= 10 && typeof first.y === "number";
44
+ // deterministic for the same seed + history
45
+ const h = [{ experiment: { x: 5, y: 5 }, value: truth({ x: 5, y: 5 }) }, { experiment: { x: 6, y: 4 }, value: truth({ x: 6, y: 4 }) }];
46
+ const det = JSON.stringify(proposeNext(space, h, "maximize", 3)) === JSON.stringify(proposeNext(space, h, "maximize", 3));
47
+ // minimize works too
48
+ const obsMin = [];
49
+ let bestMin = Infinity;
50
+ for (let i = 0; i < 60; i++) {
51
+ const e = proposeNext(space, obsMin, "minimize", 7);
52
+ const v = -truth(e);
53
+ obsMin.push({ experiment: e, value: v });
54
+ if (v < bestMin)
55
+ bestMin = v;
56
+ }
57
+ const minimizes = bestMin < -0.9;
58
+ const total = (() => { try {
59
+ proposeNext(null, null);
60
+ proposeNext(space, []);
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ } })();
66
+ const checks = [
67
+ { name: "GUIDES-TO-OPTIMUM", pass: converges, detail: `a guided propose→score→repeat loop reaches >0.9 of the optimum (best=${best.toFixed(3)})` },
68
+ { name: "FIRST-PROPOSAL", pass: firstOK, detail: "the first experiment (no history) is valid + in-bounds" },
69
+ { name: "DETERMINISTIC", pass: det, detail: "same seed + history → same next proposal (reproducible)" },
70
+ { name: "MINIMIZE", pass: minimizes, detail: "works for a minimize goal too" },
71
+ { name: "TOTAL", pass: total, detail: "null/empty never throws" },
72
+ ];
73
+ return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
74
+ }
75
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * INVERSE DESIGN — the question every optimizer refuses to answer. An optimizer finds the BEST. But real
3
+ * specs are rarely "best" — they're "hit THIS value": a drug dissolving at exactly 80% in 30 min, an alloy
4
+ * at precisely 600 MPa, a sensor reading dead-on 4.00 V, a model calibrated to a target false-positive rate.
5
+ * "Maximize" is the wrong question; the right one is "give me every recipe that lands on my target — and
6
+ * tell me how much freedom I have around each."
7
+ *
8
+ * INVERSE DESIGN inverts the map. Given your measurements and a target value, it finds the settings whose
9
+ * outcome matches the target, returns SEVERAL distinct recipes (not just one — so you can pick the cheapest
10
+ * or most convenient), measures how much wiggle-room each has, and proposes a fresh setting to probe the
11
+ * target precisely. If the target lies outside what your data can produce, it says so and hands back the
12
+ * closest you can actually reach — the same honest ceiling ACHIEVABILITY draws.
13
+ *
14
+ * Honest by construction (DIAKRISIS): the recipes it returns ARE your real measurements nearest the target
15
+ * (their value is observed, not predicted — so the match is real), plus one interpolated probe to run next.
16
+ * It abstains on thin data and never invents a recipe outside the evidence.
17
+ */
18
+ import { type Space, type Experiment } from "./space.js";
19
+ import { type Observation } from "./engine.js";
20
+ export interface InverseSolution {
21
+ experiment: Experiment;
22
+ value: number;
23
+ distanceToTarget: number;
24
+ }
25
+ export interface InverseReport {
26
+ target: number;
27
+ feasible: boolean;
28
+ solutions: InverseSolution[];
29
+ recipeFreedom: "many" | "few" | "one" | "none";
30
+ proposedProbe: Experiment | null;
31
+ closest: InverseSolution | null;
32
+ note: string;
33
+ }
34
+ /** Find the settings whose measured outcome matches `target` — the inverse of optimization. */
35
+ export declare function inverseDesign(obs: ReadonlyArray<Observation>, space: Space, target: number): InverseReport;
36
+ export declare function inverseGauntlet(): {
37
+ score: 0 | 100;
38
+ checks: Array<{
39
+ name: string;
40
+ pass: boolean;
41
+ detail: string;
42
+ }>;
43
+ };
44
+ //# sourceMappingURL=inverse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inverse.d.ts","sourceRoot":"","sources":["../src/inverse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,eAAe;IAAG,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE;AACpG,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC/C,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAoD1G;AAKD,wBAAgB,eAAe,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,CA+CpH"}
@@ -0,0 +1,141 @@
1
+ const HB = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37];
2
+ const hal = (k, b) => { let f = 1, r = 0, i = k + 1; while (i > 0) {
3
+ f /= b;
4
+ r += f * (i % b);
5
+ i = Math.floor(i / b);
6
+ } return r; };
7
+ const dist = (a, c) => { let s = 0; for (let i = 0; i < a.length; i++)
8
+ s += (a[i] - c[i]) ** 2; return Math.sqrt(s); };
9
+ /** Find the settings whose measured outcome matches `target` — the inverse of optimization. */
10
+ export function inverseDesign(obs, space, target) {
11
+ const dims = space?.dims ?? [];
12
+ const D = dims.length;
13
+ const hist = (obs ?? []).filter((o) => o && o.experiment && Number.isFinite(o.value));
14
+ const n = hist.length;
15
+ if (D === 0 || n < 5 || !Number.isFinite(target)) {
16
+ return { target, feasible: false, solutions: [], recipeFreedom: "none", proposedProbe: null, closest: null, note: `need ≈5+ measurements to invert (have ${n})` };
17
+ }
18
+ const lo = (i) => dims[i].min ?? 0, hi = (i) => dims[i].max ?? 1;
19
+ 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)); });
20
+ const toE = (v) => { const e = {}; dims.forEach((d, i) => { let x = lo(i) + v[i] * (hi(i) - lo(i)); if (d.type === "int")
21
+ x = Math.round(x); e[d.name] = x; }); return e; };
22
+ const vals = hist.map((o) => o.value);
23
+ const vmin = Math.min(...vals), vmax = Math.max(...vals);
24
+ const vRange = Math.max(1e-9, vmax - vmin);
25
+ const feasible = target >= vmin - 1e-9 && target <= vmax + 1e-9;
26
+ const tol = 0.05 * vRange;
27
+ const npts = hist.map((o) => toN(o.experiment));
28
+ // rank measurements by closeness to the target, then greedily keep spatially-DISTINCT recipes
29
+ const ranked = hist.map((o, i) => ({ o, np: npts[i], d: Math.abs(o.value - target) })).sort((a, b) => a.d - b.d);
30
+ const picked = [];
31
+ for (const r of ranked) {
32
+ if (picked.length >= 4)
33
+ break;
34
+ if (picked.every((p) => dist(p.np, r.np) > 0.18))
35
+ picked.push(r);
36
+ }
37
+ const solutions = picked.map((p) => ({ experiment: p.o.experiment, value: p.o.value, distanceToTarget: +p.d.toFixed(4) }));
38
+ // recipe freedom: how many DISTINCT settings land within tolerance of the target
39
+ const within = ranked.filter((r) => r.d <= tol);
40
+ let distinct = 0;
41
+ const seen = [];
42
+ for (const r of within) {
43
+ if (seen.every((s) => dist(s, r.np) > 0.18)) {
44
+ seen.push(r.np);
45
+ distinct++;
46
+ }
47
+ }
48
+ const recipeFreedom = !feasible ? "none" : distinct >= 3 ? "many" : distinct === 2 ? "few" : "one";
49
+ // proposed probe: interpolate (inverse-distance weighting) a fresh setting predicted to hit the target
50
+ let proposedProbe = null;
51
+ if (feasible) {
52
+ let best = null, bestErr = Infinity;
53
+ for (let k = 0; k < 1500; k++) {
54
+ const c = [];
55
+ for (let d = 0; d < D; d++)
56
+ c.push(hal(k * 5 + 1, HB[d % HB.length]));
57
+ let sw = 0, swv = 0;
58
+ for (let i = 0; i < npts.length; i++) {
59
+ const w = 1 / (dist(c, npts[i]) ** 2 + 1e-6);
60
+ sw += w;
61
+ swv += w * vals[i];
62
+ }
63
+ const pred = swv / sw;
64
+ const err = Math.abs(pred - target);
65
+ if (err < bestErr) {
66
+ bestErr = err;
67
+ best = c;
68
+ }
69
+ }
70
+ proposedProbe = best ? toE(best) : null;
71
+ }
72
+ const closest = solutions[0] ?? null;
73
+ const fmt = (x) => (Math.abs(x) < 1 ? +x.toFixed(3) : +x.toFixed(2));
74
+ const note = feasible
75
+ ? `${distinct >= 3 ? "many" : distinct === 2 ? "a couple of" : "essentially one"} recipe${distinct === 1 ? "" : "s"} hit target ${fmt(target)} — nearest measured ${closest ? fmt(closest.value) : "?"}; run the proposed probe to land on it precisely`
76
+ : `target ${fmt(target)} is outside what your data can produce (${fmt(vmin)}–${fmt(vmax)}) — closest reachable is ${closest ? fmt(closest.value) : "?"}; add a new lever or relax the target`;
77
+ return { target, feasible, solutions, recipeFreedom, proposedProbe, closest, note };
78
+ }
79
+ // ── gauntlet ──────────────────────────────────────────────────────────────────
80
+ import { lcg } from "./space.js";
81
+ export function inverseGauntlet() {
82
+ const space = { dims: [{ name: "x", type: "real", min: 0, max: 1 }, { name: "y", type: "real", min: 0, max: 1 }] };
83
+ // a smooth response spanning 0..1; ask for an exact mid-target and check the returned recipe TRULY hits it
84
+ const f = (x, y) => 0.5 * (x + y); // ranges 0..1, many (x,y) give the same value
85
+ const rnd = lcg(23);
86
+ const obs = [];
87
+ for (let i = 0; i < 120; i++) {
88
+ const x = rnd(), y = rnd();
89
+ obs.push({ experiment: { x, y }, value: f(x, y) });
90
+ }
91
+ const r = inverseDesign(obs, space, 0.5);
92
+ // HITS-TARGET: the top recipe's TRUE value is within tolerance of 0.5 (it's a real measurement, not a guess)
93
+ const top = r.solutions[0];
94
+ const hits = !!top && Math.abs(f(top.experiment.x, top.experiment.y) - 0.5) < 0.05;
95
+ // PROBE-LANDS: the proposed fresh setting, evaluated on the TRUE function, also lands near 0.5
96
+ const probeLands = !!r.proposedProbe && Math.abs(f(r.proposedProbe.x, r.proposedProbe.y) - 0.5) < 0.08;
97
+ // MULTIPLE-RECIPES: x+y=1 is a whole line → the distinct recipes should differ in x (varied settings, same outcome)
98
+ const xs = r.solutions.map((s) => s.experiment.x);
99
+ const spread = xs.length >= 2 ? Math.max(...xs) - Math.min(...xs) : 0;
100
+ const manyRecipes = r.recipeFreedom === "many" && spread > 0.25;
101
+ // INFEASIBLE: target above everything the data produces → flagged; closest == the MAX measured value (the real ceiling)
102
+ const dataMax = Math.max(...obs.map((o) => o.value));
103
+ const rInf = inverseDesign(obs, space, 5.0);
104
+ const infeasibleOk = !rInf.feasible && rInf.proposedProbe === null && !!rInf.closest && Math.abs(rInf.closest.value - dataMax) < 1e-9;
105
+ // UNIQUE-RECIPE: a single-peak function → target near the peak has essentially one recipe
106
+ const g = (x, y) => Math.exp(-(((x - 0.5) ** 2) + ((y - 0.5) ** 2)) / 0.02); // sharp peak 1.0
107
+ const rnd2 = lcg(9);
108
+ const obs2 = [];
109
+ for (let i = 0; i < 140; i++) {
110
+ const x = rnd2(), y = rnd2();
111
+ obs2.push({ experiment: { x, y }, value: g(x, y) });
112
+ }
113
+ for (let i = 0; i < 10; i++) {
114
+ const x = 0.5 + (rnd2() - 0.5) * 0.05, y = 0.5 + (rnd2() - 0.5) * 0.05;
115
+ obs2.push({ experiment: { x, y }, value: g(x, y) });
116
+ }
117
+ const rUniq = inverseDesign(obs2, space, 0.97);
118
+ const uniqueOk = rUniq.feasible && (rUniq.recipeFreedom === "one" || rUniq.recipeFreedom === "few");
119
+ const det = JSON.stringify(inverseDesign(obs, space, 0.5)) === JSON.stringify(inverseDesign(obs, space, 0.5));
120
+ const abstains = inverseDesign(obs.slice(0, 3), space, 0.5).note.indexOf("need") >= 0;
121
+ const total = (() => { try {
122
+ inverseDesign(null, space, 1);
123
+ inverseDesign([], space, NaN);
124
+ return true;
125
+ }
126
+ catch {
127
+ return false;
128
+ } })();
129
+ const checks = [
130
+ { name: "HITS-TARGET", pass: hits, detail: top ? `top recipe's TRUE value ${f(top.experiment.x, top.experiment.y).toFixed(3)} ≈ target 0.5` : "no solution" },
131
+ { name: "PROBE-LANDS", pass: probeLands, detail: r.proposedProbe ? `interpolated probe lands at ${f(r.proposedProbe.x, r.proposedProbe.y).toFixed(3)}` : "no probe" },
132
+ { name: "MULTIPLE-RECIPES", pass: manyRecipes, detail: `level-set x+y=1 → ${r.solutions.length} distinct recipes, x spread ${spread.toFixed(2)} (${r.recipeFreedom})` },
133
+ { name: "INFEASIBLE-FLAGGED", pass: infeasibleOk, detail: `target 5.0 → infeasible, closest ${rInf.closest ? rInf.closest.value.toFixed(3) : "?"} == data max ${dataMax.toFixed(3)} (the real ceiling)` },
134
+ { name: "UNIQUE-RECIPE", pass: uniqueOk, detail: `sharp peak, target 0.97 → freedom "${rUniq.recipeFreedom}"` },
135
+ { name: "DETERMINISTIC", pass: det, detail: "same data+target → same recipes" },
136
+ { name: "ABSTAINS-WHEN-THIN", pass: abstains, detail: "too few measurements → no inversion" },
137
+ { name: "TOTAL", pass: total, detail: "null / empty / NaN never throws" },
138
+ ];
139
+ return { score: checks.every((c) => c.pass) ? 100 : 0, checks };
140
+ }
141
+ //# sourceMappingURL=inverse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inverse.js","sourceRoot":"","sources":["../src/inverse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * IP SHIELD — turn a discovery into a patent-grade evidence file. In pharma and materials, the value lives
3
+ * in PATENTS, and the fight is always "did you copy someone?" / "was this just a lucky fluke?" Melete already
4
+ * signs a verdict and can replay it; IP SHIELD packages that into an Automated IP Audit Trail: a single,
5
+ * timestamped, immutable, offline-verifiable document that proves a result was reached SYSTEMATICALLY — by a
6
+ * documented engine, with every step recorded and re-derivable, attributable to a named entity, at a fixed
7
+ * time. It's the difference between "trust us, we invented this" and "here is cryptographic, reproducible
8
+ * evidence of exactly how and when we discovered it."
9
+ *
10
+ * Honest by construction (DIAKRISIS): the trail is EVIDENCE for patent priority / prior-art defense /
11
+ * regulatory audit — systematic process, reproducibility, attribution, timestamp, tamper-evidence. It is
12
+ * NOT a legal determination of patentability or novelty (only a patent office / attorney decides that), and
13
+ * we say so in the document itself. It binds the result by hash; it does not expose the secret formula.
14
+ */
15
+ import { type KeyObject } from "node:crypto";
16
+ import { type Space } from "./space.js";
17
+ import { type Observation, type Goal } from "./engine.js";
18
+ export interface IpAuditTrail {
19
+ standard: "melete-ip-audit-trail/v1";
20
+ entity: string;
21
+ claim: string;
22
+ discoveryMethod: string;
23
+ result: {
24
+ recipe: Record<string, number>;
25
+ value: number;
26
+ };
27
+ process: {
28
+ experiments: number;
29
+ verdictHash: string;
30
+ replayVerdictHash: string;
31
+ };
32
+ immutableHash: string;
33
+ disclaimer: string;
34
+ signature: string;
35
+ publicKeyPem: string;
36
+ algo: "ed25519+sha256";
37
+ issuedAtMs: number;
38
+ }
39
+ /** Build a signed, immutable IP audit trail for a discovery run. */
40
+ export declare function buildIpAuditTrail(obs: ReadonlyArray<Observation>, space: Space, goal?: Goal, opts?: {
41
+ entity: string;
42
+ claim: string;
43
+ keys?: {
44
+ privateKey: KeyObject;
45
+ publicKey: KeyObject;
46
+ };
47
+ issuedAtMs?: number;
48
+ }): IpAuditTrail;
49
+ /** Re-verify an IP audit trail OFFLINE: signature + immutable-hash integrity. */
50
+ export declare function verifyIpAuditTrail(doc: IpAuditTrail): {
51
+ ok: boolean;
52
+ reason: string;
53
+ };
54
+ export declare function ipShieldGauntlet(): {
55
+ score: 0 | 100;
56
+ checks: Array<{
57
+ name: string;
58
+ pass: boolean;
59
+ detail: string;
60
+ }>;
61
+ };
62
+ //# sourceMappingURL=ipshield.d.ts.map