@mneme-ai/core 2.97.0 → 2.98.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,180 @@
1
+ /**
2
+ * v2.98.0 — HYDRA · PROVENANCE CHAIN (the deepest cut).
3
+ *
4
+ * Memory with a cryptographic, replayable, byte-exact history. Each time a
5
+ * codebook evolves (the corpus changed, new phrases earned a slot), HYDRA
6
+ * records a SIGNED DELTA — not the whole codebook, just what changed —
7
+ * chained to the previous one. The chain is:
8
+ *
9
+ * - LOSSLESS-REPLAYABLE: fold deltas 0..i and you get back the EXACT
10
+ * codebook that existed at step i (canonical-hash identical) — not an
11
+ * approximation, a byte-for-byte reconstruction.
12
+ * - OFFLINE-VERIFIABLE: every delta carries a NOTARY (Ed25519) receipt
13
+ * over its result hash; a third party verifies the whole history with
14
+ * the public key alone — no Mneme, no network.
15
+ * - TAMPER-EVIDENT: edit any delta and both its signature AND the
16
+ * prev→result hash links break; the breakage is localized.
17
+ *
18
+ * This fuses two organs already at Mneme's root — NOTARY (signing) and
19
+ * HYDRA (codebooks) — into one. It is NOT a new compression trick; it is
20
+ * the *provenance* of the gem. Diffing is by PHRASE (the stable identity;
21
+ * symbols are positional and re-index on every change), so apply()
22
+ * deterministically rebuilds → replay is exact.
23
+ *
24
+ * STABILITY (the 108-error rule): every function is total. A malformed
25
+ * codebook, a broken delta, a corrupt receipt → a structured `ok:false`
26
+ * verdict, never a throw. Memory provenance must never crash the host.
27
+ */
28
+ import { sha256Hex } from "./engine.js";
29
+ import { buildCodebook } from "./analytic.js";
30
+ import { canonicalizeCodebook } from "./attest.js";
31
+ import { issueReceipt, verifyReceipt } from "../notary/receipt.js";
32
+ function entriesByPhrase(cb) {
33
+ const m = new Map();
34
+ if (cb && Array.isArray(cb.entries))
35
+ for (const e of cb.entries)
36
+ if (e && typeof e.phrase === "string")
37
+ m.set(e.phrase, e);
38
+ return m;
39
+ }
40
+ /**
41
+ * Compute the delta `before → after` (by phrase). Pure; never throws.
42
+ * Signs the delta over its result hash so the chain is attributable.
43
+ */
44
+ export function diffCodebooks(repoRoot, before, after, seq, prev, at) {
45
+ const beforeMap = before ? entriesByPhrase(before) : new Map();
46
+ const afterMap = entriesByPhrase(after);
47
+ const added = [];
48
+ const removed = [];
49
+ for (const [phrase, e] of afterMap)
50
+ if (!beforeMap.has(phrase))
51
+ added.push({ phrase, hits: e.hits, gain: e.gain });
52
+ for (const phrase of beforeMap.keys())
53
+ if (!afterMap.has(phrase))
54
+ removed.push(phrase);
55
+ // Deterministic ordering.
56
+ added.sort((a, b) => (a.phrase < b.phrase ? -1 : 1));
57
+ removed.sort();
58
+ const baseHash = before ? sha256Hex(canonicalizeCodebook(before)) : sha256Hex("∅");
59
+ const resultHash = sha256Hex(canonicalizeCodebook(after));
60
+ const receipt = issueReceipt(repoRoot, {
61
+ kind: "memory-capsule",
62
+ subject: `hydra-chain:${seq}:${resultHash.slice(0, 16)}`,
63
+ payload: { resultHash, seq, prev, baseHash },
64
+ includePayload: true,
65
+ issuedAt: at,
66
+ });
67
+ return { v: 1, seq, prev, baseHash, resultHash, added, removed, open: after.open, close: after.close, corpusHash: after.corpusHash, receipt };
68
+ }
69
+ /**
70
+ * Apply a delta to a before-codebook → the after-codebook, rebuilt
71
+ * deterministically (re-sorted, re-indexed). Returns ok:false (never
72
+ * throws) if the rebuild does not hash to the delta's resultHash.
73
+ */
74
+ export function applyDelta(before, delta) {
75
+ try {
76
+ if (!delta || delta.v !== 1 || !Array.isArray(delta.added) || !Array.isArray(delta.removed)) {
77
+ return { ok: false, codebook: null, reason: "malformed delta" };
78
+ }
79
+ const map = before ? entriesByPhrase(before) : new Map();
80
+ for (const p of delta.removed)
81
+ map.delete(p);
82
+ for (const a of delta.added)
83
+ map.set(a.phrase, { sym: "", phrase: a.phrase, hits: a.hits, gain: a.gain });
84
+ const phrases = [...map.values()].map((e) => ({ phrase: e.phrase, hits: e.hits, gain: e.gain }));
85
+ // Reconstruct the corpus-bound codebook deterministically. corpusHash is
86
+ // carried so the rebuilt codebook is bit-identical to the original.
87
+ const rebuilt = buildCodebook(delta.open, delta.close, phrases, "");
88
+ rebuilt.corpusHash = delta.corpusHash;
89
+ const h = sha256Hex(canonicalizeCodebook(rebuilt));
90
+ if (h !== delta.resultHash)
91
+ return { ok: false, codebook: null, reason: `replay hash mismatch (got ${h.slice(0, 12)}, want ${delta.resultHash.slice(0, 12)})` };
92
+ return { ok: true, codebook: rebuilt, reason: "applied" };
93
+ }
94
+ catch (e) {
95
+ return { ok: false, codebook: null, reason: `threw: ${e.message}` };
96
+ }
97
+ }
98
+ /** Append a codebook to a chain by diffing against the last one. Total. */
99
+ export function appendToChain(repoRoot, chain, next, at) {
100
+ const safe = Array.isArray(chain) ? chain : [];
101
+ const last = safe.length > 0 ? safe[safe.length - 1] : null;
102
+ const before = last ? replayChain(safe, safe.length - 1).codebook : null;
103
+ const delta = diffCodebooks(repoRoot, before, next, safe.length, last ? last.resultHash : null, at);
104
+ return { chain: [...safe, delta], delta };
105
+ }
106
+ /**
107
+ * Replay deltas 0..index (inclusive) → the codebook at that step. Pure;
108
+ * never throws. ok:false the moment any delta fails to apply.
109
+ */
110
+ export function replayChain(chain, index) {
111
+ if (!Array.isArray(chain))
112
+ return { ok: false, codebook: null, reason: "not a chain" };
113
+ const end = Math.min(index, chain.length - 1);
114
+ let cb = null;
115
+ for (let i = 0; i <= end; i++) {
116
+ const r = applyDelta(cb, chain[i]);
117
+ if (!r.ok)
118
+ return { ok: false, codebook: null, reason: `delta ${i}: ${r.reason}` };
119
+ cb = r.codebook;
120
+ }
121
+ return { ok: true, codebook: cb, reason: "replayed" };
122
+ }
123
+ /**
124
+ * Verify the whole chain OFFLINE: each delta's Ed25519 receipt is valid and
125
+ * binds its (resultHash, seq, prev); prev→result links are intact; and each
126
+ * delta replays to its own resultHash. Tamper anywhere → localized break.
127
+ * Total; never throws.
128
+ */
129
+ export function verifyChain(chain) {
130
+ if (!Array.isArray(chain))
131
+ return { ok: false, length: 0, brokenAt: -1, reason: "not a chain" };
132
+ let prevResult = null;
133
+ let cb = null;
134
+ for (let i = 0; i < chain.length; i++) {
135
+ const d = chain[i];
136
+ if (!d || d.seq !== i || d.prev !== prevResult)
137
+ return { ok: false, length: chain.length, brokenAt: i, reason: `broken link at ${i}` };
138
+ const v = verifyReceipt(d.receipt);
139
+ if (!v.valid)
140
+ return { ok: false, length: chain.length, brokenAt: i, reason: `bad signature at ${i}: ${v.reason}` };
141
+ const payload = d.receipt.payload;
142
+ if (!payload || payload.resultHash !== d.resultHash || payload.seq !== d.seq || payload.prev !== d.prev) {
143
+ return { ok: false, length: chain.length, brokenAt: i, reason: `receipt does not bind delta ${i} (tampered)` };
144
+ }
145
+ const r = applyDelta(cb, d);
146
+ if (!r.ok)
147
+ return { ok: false, length: chain.length, brokenAt: i, reason: `replay broke at ${i}: ${r.reason}` };
148
+ cb = r.codebook;
149
+ prevResult = d.resultHash;
150
+ }
151
+ return { ok: true, length: chain.length, brokenAt: -1, reason: "chain intact + every delta signed + replays exact" };
152
+ }
153
+ /** The provenance gauntlet — every property as a boolean that can't lie. */
154
+ export function chainGauntlet(chain) {
155
+ try {
156
+ const v = verifyChain(chain);
157
+ let replayExact = true;
158
+ for (let i = 0; i < chain.length; i++) {
159
+ const r = replayChain(chain, i);
160
+ if (!r.ok || !r.codebook || sha256Hex(canonicalizeCodebook(r.codebook)) !== chain[i].resultHash) {
161
+ replayExact = false;
162
+ break;
163
+ }
164
+ }
165
+ let tamperCaught = true;
166
+ if (chain.length > 0) {
167
+ const mid = Math.floor(chain.length / 2);
168
+ const clone = JSON.parse(JSON.stringify(chain));
169
+ // Tamper the result hash of one delta — must be caught.
170
+ clone[mid].resultHash = sha256Hex(clone[mid].resultHash + "X");
171
+ tamperCaught = verifyChain(clone).ok === false;
172
+ }
173
+ const perfect = v.ok && replayExact && tamperCaught;
174
+ return { verified: v.ok, replayExact, tamperCaught, length: chain.length, score: perfect ? 100 : 0 };
175
+ }
176
+ catch {
177
+ return { verified: false, replayExact: false, tamperCaught: false, length: Array.isArray(chain) ? chain.length : 0, score: 0 };
178
+ }
179
+ }
180
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/hydra/chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chain.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.test.d.ts","sourceRoot":"","sources":["../../src/hydra/chain.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { forgeCodebook, sha256Hex } from "./index.js";
3
+ import { canonicalizeCodebook } from "./attest.js";
4
+ import { appendToChain, replayChain, verifyChain, chainGauntlet, applyDelta } from "./chain.js";
5
+ // Three evolving corpora → three codebooks → a 3-link chain.
6
+ const C1 = "alpha module is here. alpha module works.".repeat(5);
7
+ const C2 = C1 + "\nbeta helper arrives. beta helper is new.".repeat(5);
8
+ const C3 = C2 + "\ngamma engine lands. gamma engine is fast.".repeat(5);
9
+ function buildChain() {
10
+ const cb1 = forgeCodebook(C1, { minHits: 2 }).codebook;
11
+ const cb2 = forgeCodebook(C2, { minHits: 2 }).codebook;
12
+ const cb3 = forgeCodebook(C3, { minHits: 2 }).codebook;
13
+ let chain = [];
14
+ chain = appendToChain(process.cwd(), chain, cb1, 1700000000000).chain;
15
+ chain = appendToChain(process.cwd(), chain, cb2, 1700000000001).chain;
16
+ chain = appendToChain(process.cwd(), chain, cb3, 1700000000002).chain;
17
+ return chain;
18
+ }
19
+ describe("v2.98 HYDRA PROVENANCE CHAIN", () => {
20
+ it("replays to EVERY index byte-exact (canonical hash matches)", () => {
21
+ const cb1 = forgeCodebook(C1, { minHits: 2 }).codebook;
22
+ const cb3 = forgeCodebook(C3, { minHits: 2 }).codebook;
23
+ const chain = buildChain();
24
+ const r0 = replayChain(chain, 0);
25
+ const r2 = replayChain(chain, 2);
26
+ expect(r0.ok).toBe(true);
27
+ expect(sha256Hex(canonicalizeCodebook(r0.codebook))).toBe(sha256Hex(canonicalizeCodebook(cb1)));
28
+ expect(sha256Hex(canonicalizeCodebook(r2.codebook))).toBe(sha256Hex(canonicalizeCodebook(cb3)));
29
+ });
30
+ it("verifies OFFLINE — sigs + links + replay intact", () => {
31
+ const chain = buildChain();
32
+ const v = verifyChain(chain);
33
+ expect(v.ok).toBe(true);
34
+ expect(v.brokenAt).toBe(-1);
35
+ expect(v.length).toBe(3);
36
+ });
37
+ it("catches tampering with a localized break", () => {
38
+ const chain = buildChain();
39
+ const clone = JSON.parse(JSON.stringify(chain));
40
+ clone[1].resultHash = sha256Hex("forged");
41
+ const v = verifyChain(clone);
42
+ expect(v.ok).toBe(false);
43
+ expect(v.brokenAt).toBe(1);
44
+ });
45
+ it("catches a forged added-phrase (replay hash diverges)", () => {
46
+ const chain = buildChain();
47
+ const clone = JSON.parse(JSON.stringify(chain));
48
+ clone[2].added.push({ phrase: "INJECTED EVIL", hits: 9, gain: 9 });
49
+ expect(verifyChain(clone).ok).toBe(false);
50
+ });
51
+ it("chain gauntlet scores 100 (verified ∧ replayExact ∧ tamperCaught)", () => {
52
+ const g = chainGauntlet(buildChain());
53
+ expect(g.verified).toBe(true);
54
+ expect(g.replayExact).toBe(true);
55
+ expect(g.tamperCaught).toBe(true);
56
+ expect(g.score).toBe(100);
57
+ });
58
+ it("STABILITY — total functions never throw on garbage", () => {
59
+ expect(() => verifyChain(null)).not.toThrow();
60
+ expect(verifyChain(null).ok).toBe(false);
61
+ expect(applyDelta(null, { v: 99 }).ok).toBe(false);
62
+ expect(replayChain([{ bad: true }], 0).ok).toBe(false);
63
+ expect(chainGauntlet(undefined).score).toBe(0);
64
+ });
65
+ });
66
+ //# sourceMappingURL=chain.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.test.js","sourceRoot":"","sources":["../../src/hydra/chain.test.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ export * from "./mine.js";
22
22
  export * from "./analytic.js";
23
23
  export * from "./attest.js";
24
24
  export * from "./guard.js";
25
+ export * from "./chain.js";
25
26
  import type { Codebook } from "./engine.js";
26
27
  import { type ForgeOpts, type ForgeResult, type Gauntlet } from "./analytic.js";
27
28
  import { type EnergyCert } from "./attest.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hydra/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAE3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAA2B,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAsD,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,yBAAyB,CAAC;IAChC,CAAC,EAAE,CAAC,CAAC;IACL,QAAQ,EAAE,QAAQ,CAAC;IACnB,gDAAgD;IAChD,OAAO,EAAE,aAAa,CAAC;IACvB,qEAAqE;IACrE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,gBAAgB,CAavF;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,aAAa,EAAE,CAMxD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,gBAAgB,CAQ/G"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hydra/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAE3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAA2B,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAsD,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,yBAAyB,CAAC;IAChC,CAAC,EAAE,CAAC,CAAC;IACL,QAAQ,EAAE,QAAQ,CAAC;IACnB,gDAAgD;IAChD,OAAO,EAAE,aAAa,CAAC;IACvB,qEAAqE;IACrE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,gBAAgB,CAavF;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,aAAa,EAAE,CAMxD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,gBAAgB,CAQ/G"}
@@ -22,6 +22,7 @@ export * from "./mine.js";
22
22
  export * from "./analytic.js";
23
23
  export * from "./attest.js";
24
24
  export * from "./guard.js";
25
+ export * from "./chain.js";
25
26
  import { sha256Hex } from "./engine.js";
26
27
  import { forgeCodebook, gauntlet } from "./analytic.js";
27
28
  import { signCodebook, mintEnergyCert, canonicalizeCodebook } from "./attest.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hydra/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAmD,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAmB,MAAM,aAAa,CAAC;AAsBlG,MAAM,UAAU,gBAAgB,CAAC,EAAY,EAAE,OAAsB;IACnE,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,CAAC,EAAE,CAAC;QACJ,QAAQ,EAAE,EAAE;QACZ,OAAO;QACP,OAAO,EAAE;YACP,IAAI,EAAE,4HAA4H;YAClI,UAAU,EAAE,EAAE,CAAC,IAAI;YACnB,WAAW,EAAE,EAAE,CAAC,KAAK;SACtB;QACD,YAAY,EAAE,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;KAClD,CAAC;AACJ,CAAC;AAaD,MAAM,UAAU,UAAU,CAAC,EAAY;IACrC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,KAAK,EAAE,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;QACrF,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC,CAAC,CAAC;AACN,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,MAAc,EAAE,EAAU,EAAE,OAAkB,EAAE;IAC3F,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hydra/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAmD,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAmB,MAAM,aAAa,CAAC;AAsBlG,MAAM,UAAU,gBAAgB,CAAC,EAAY,EAAE,OAAsB;IACnE,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,CAAC,EAAE,CAAC;QACJ,QAAQ,EAAE,EAAE;QACZ,OAAO;QACP,OAAO,EAAE;YACP,IAAI,EAAE,4HAA4H;YAClI,UAAU,EAAE,EAAE,CAAC,IAAI;YACnB,WAAW,EAAE,EAAE,CAAC,KAAK;SACtB;QACD,YAAY,EAAE,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;KAClD,CAAC;AACJ,CAAC;AAaD,MAAM,UAAU,UAAU,CAAC,EAAY;IACrC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,KAAK,EAAE,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;QACrF,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC,CAAC,CAAC;AACN,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,MAAc,EAAE,EAAU,EAAE,OAAkB,EAAE;IAC3F,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACnE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/truth_gate/probes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6wFnE,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,KAAK,CAAU,CAAC;AAEvD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEvD;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAQlF"}
1
+ {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/truth_gate/probes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAoyFnE,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,KAAK,CAAU,CAAC;AAEvD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEvD;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAQlF"}
@@ -342,6 +342,39 @@ const probes = [
342
342
  }
343
343
  },
344
344
  },
345
+ {
346
+ id: "probe.hydra.provenance_chain",
347
+ kind: "boolean",
348
+ description: "HYDRA PROVENANCE CHAIN (v2.98.0 — the deepest fusion: NOTARY × HYDRA): memory with a cryptographic, replayable, byte-exact history. Each codebook evolution is recorded as a SIGNED delta chained to the previous; the chain replays to EVERY step byte-exact (canonical-hash identical, not approximate), verifies OFFLINE with the public key alone (Ed25519 sigs + prev→result links), and is tamper-evident (edit any delta → localized break). This probe builds a 3-link chain over evolving corpora and asserts the chain gauntlet = 100 (verified ∧ replayExact ∧ tamperCaught) + stability (total functions never throw on garbage).",
349
+ run: async (ctx) => {
350
+ const t0 = Date.now();
351
+ void ctx;
352
+ try {
353
+ const H = await import("../hydra/index.js");
354
+ const c1 = "alpha module is here. alpha module works.".repeat(5);
355
+ const c2 = c1 + "\nbeta helper arrives. beta helper is new.".repeat(5);
356
+ const c3 = c2 + "\ngamma engine lands. gamma engine is fast.".repeat(5);
357
+ let chain = [];
358
+ for (const [i, c] of [c1, c2, c3].entries()) {
359
+ chain = H.appendToChain(process.cwd(), chain, H.forgeCodebook(c, { minHits: 2 }).codebook, 1700000000000 + i).chain;
360
+ }
361
+ const g = H.chainGauntlet(chain);
362
+ let stable = true;
363
+ try {
364
+ H.verifyChain(null);
365
+ H.chainGauntlet(undefined);
366
+ }
367
+ catch {
368
+ stable = false;
369
+ }
370
+ const ok = g.score === 100 && g.verified && g.replayExact && g.tamperCaught && g.length === 3 && stable;
371
+ return { value: ok ? 1 : 0, evidence: `score=${g.score} verified=${g.verified} replayExact=${g.replayExact} tamperCaught=${g.tamperCaught} len=${g.length} stable=${stable}`, dtMs: Date.now() - t0 };
372
+ }
373
+ catch (e) {
374
+ return { value: 0, evidence: `threw: ${e.message}`, dtMs: Date.now() - t0 };
375
+ }
376
+ },
377
+ },
345
378
  {
346
379
  id: "probe.hydra.guarded_time_to_trust",
347
380
  kind: "boolean",