@mneme-ai/core 2.100.0 → 2.102.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.
- package/dist/agent_manifest.js +1 -1
- package/dist/agent_manifest.js.map +1 -1
- package/dist/hydra/dormancy.d.ts +86 -0
- package/dist/hydra/dormancy.d.ts.map +1 -0
- package/dist/hydra/dormancy.js +130 -0
- package/dist/hydra/dormancy.js.map +1 -0
- package/dist/hydra/dormancy.test.d.ts +2 -0
- package/dist/hydra/dormancy.test.d.ts.map +1 -0
- package/dist/hydra/dormancy.test.js +66 -0
- package/dist/hydra/dormancy.test.js.map +1 -0
- package/dist/hydra/index.d.ts +1 -0
- package/dist/hydra/index.d.ts.map +1 -1
- package/dist/hydra/index.js +1 -0
- package/dist/hydra/index.js.map +1 -1
- package/dist/truth_gate/probes.d.ts.map +1 -1
- package/dist/truth_gate/probes.js +68 -0
- package/dist/truth_gate/probes.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.102.0 — HYDRA · EPIGENETIC DORMANCY ("sleep state" + JIT revival).
|
|
3
|
+
*
|
|
4
|
+
* The image's "Epigenetic Sleep State" + "JIT Context Revival
|
|
5
|
+
* (Demethylation)", made real and measurable. Borrowed from biology only
|
|
6
|
+
* as a NAME: deep-sea extremophiles silence genes under pressure without
|
|
7
|
+
* editing their DNA, and re-express them when the environment pokes.
|
|
8
|
+
*
|
|
9
|
+
* Here, codebook entries the atrophy clock has proven COLD are METHYLATED —
|
|
10
|
+
* moved out of the active working set into a cold, signed dormant store, so
|
|
11
|
+
* the active footprint shrinks (the enterprise-scale win: most knowledge
|
|
12
|
+
* sleeps, the working set stays small). On demand they DEMETHYLATE —
|
|
13
|
+
* revive BYTE-EXACT, and a full revive reconstructs the original codebook
|
|
14
|
+
* with an identical canonical hash. The whole split is Ed25519-signed, so a
|
|
15
|
+
* third party verifies offline that nothing was lost or forged across the
|
|
16
|
+
* sleep/wake cycle.
|
|
17
|
+
*
|
|
18
|
+
* This is NOT fortune-telling and NOT lossy: it is deterministic tiered
|
|
19
|
+
* memory with a cryptographic lossless-revival proof. Three booleans that
|
|
20
|
+
* cannot lie: revive-exact ∧ shrinks ∧ signed-binds. Every function is
|
|
21
|
+
* total (108-error rule) — garbage in → safest result, never a throw.
|
|
22
|
+
*/
|
|
23
|
+
import { sha256Hex } from "./engine.js";
|
|
24
|
+
import { buildCodebook } from "./analytic.js";
|
|
25
|
+
import { canonicalizeCodebook } from "./attest.js";
|
|
26
|
+
import { issueReceipt, verifyReceipt } from "../notary/receipt.js";
|
|
27
|
+
function bytesOf(entries) {
|
|
28
|
+
let n = 0;
|
|
29
|
+
for (const e of entries)
|
|
30
|
+
n += Buffer.byteLength(e.phrase, "utf8") + 8;
|
|
31
|
+
return n;
|
|
32
|
+
}
|
|
33
|
+
function phrasesOf(cb) {
|
|
34
|
+
return (cb?.entries ?? []).filter((e) => e && typeof e.phrase === "string").map((e) => ({ phrase: e.phrase, hits: e.hits, gain: e.gain }));
|
|
35
|
+
}
|
|
36
|
+
/** Rebuild a codebook from a phrase set, bound to the original corpus hash. */
|
|
37
|
+
function rebuild(open, close, phrases, corpusHash) {
|
|
38
|
+
const cb = buildCodebook(open, close, phrases, "");
|
|
39
|
+
cb.corpusHash = corpusHash;
|
|
40
|
+
return cb;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* METHYLATE — split a codebook into a hot ACTIVE set and a cold DORMANT
|
|
44
|
+
* store, based on which symbols a trust map marks stale/quarantined.
|
|
45
|
+
* Signed. Total; never throws.
|
|
46
|
+
*/
|
|
47
|
+
export function methylate(repoRoot, cb, trustMap, at) {
|
|
48
|
+
// 108-error rule: a malformed codebook normalizes to an empty one rather
|
|
49
|
+
// than throwing — memory tiering must never crash the host.
|
|
50
|
+
const safeCb = (cb && Array.isArray(cb.entries))
|
|
51
|
+
? cb
|
|
52
|
+
: { v: 1, open: "", close: "", corpusHash: "", entries: [] };
|
|
53
|
+
const open = safeCb.open ?? "", close = safeCb.close ?? "", corpusHash = safeCb.corpusHash ?? "";
|
|
54
|
+
const active = [], dormant = [];
|
|
55
|
+
for (const e of safeCb.entries) {
|
|
56
|
+
if (!e || typeof e.phrase !== "string")
|
|
57
|
+
continue;
|
|
58
|
+
const lvl = trustMap && trustMap[e.sym];
|
|
59
|
+
if (lvl === "stale" || lvl === "quarantined")
|
|
60
|
+
dormant.push({ phrase: e.phrase, hits: e.hits, gain: e.gain });
|
|
61
|
+
else
|
|
62
|
+
active.push({ phrase: e.phrase, hits: e.hits, gain: e.gain });
|
|
63
|
+
}
|
|
64
|
+
const originalHash = sha256Hex(canonicalizeCodebook(safeCb));
|
|
65
|
+
const activeHash = sha256Hex(canonicalizeCodebook(rebuild(open, close, active, corpusHash)));
|
|
66
|
+
const dormantHash = sha256Hex(JSON.stringify(dormant.map((d) => d.phrase).sort()));
|
|
67
|
+
const receipt = issueReceipt(repoRoot, {
|
|
68
|
+
kind: "memory-capsule",
|
|
69
|
+
subject: `hydra-dormancy:${originalHash.slice(0, 16)}`,
|
|
70
|
+
payload: { originalHash, activeHash, dormantHash, dormantCount: dormant.length },
|
|
71
|
+
includePayload: true,
|
|
72
|
+
issuedAt: at,
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
v: 1, open, close, corpusHash, originalHash, active, dormant,
|
|
76
|
+
activeBytes: bytesOf(active), dormantBytes: bytesOf(dormant), fullBytes: bytesOf([...active, ...dormant]),
|
|
77
|
+
receipt,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* DEMETHYLATE — revive dormant entries. With no `phrases` arg, revive ALL
|
|
82
|
+
* (a full wake → byte-exact reconstruction of the original codebook). With
|
|
83
|
+
* a phrase list, revive only those (partial wake). Total; never throws.
|
|
84
|
+
*/
|
|
85
|
+
export function demethylate(m, phrases) {
|
|
86
|
+
try {
|
|
87
|
+
if (!m || m.v !== 1 || !Array.isArray(m.active) || !Array.isArray(m.dormant))
|
|
88
|
+
return { ok: false, codebook: null, exact: false, reason: "malformed methylation" };
|
|
89
|
+
const wake = phrases === undefined ? m.dormant : m.dormant.filter((d) => phrases.includes(d.phrase));
|
|
90
|
+
const merged = [...m.active, ...wake];
|
|
91
|
+
const cb = rebuild(m.open, m.close, merged, m.corpusHash);
|
|
92
|
+
const isFull = phrases === undefined || wake.length === m.dormant.length;
|
|
93
|
+
const exact = isFull && sha256Hex(canonicalizeCodebook(cb)) === m.originalHash;
|
|
94
|
+
return { ok: true, codebook: cb, exact, reason: isFull ? (exact ? "full revive — byte-exact" : "full revive but hash diverged") : `partial revive (${wake.length}/${m.dormant.length})` };
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
return { ok: false, codebook: null, exact: false, reason: `threw: ${e.message}` };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Prove the sleep/wake invariants. Total. */
|
|
101
|
+
export function dormancyGauntlet(repoRoot, cb, trustMap, at) {
|
|
102
|
+
try {
|
|
103
|
+
// Nothing to prove on a malformed codebook → score 0 (not a vacuous pass).
|
|
104
|
+
if (!cb || !Array.isArray(cb.entries))
|
|
105
|
+
return { reviveExact: false, shrinks: false, signedBinds: false, deterministic: false, stable: true, activeBytes: 0, fullBytes: 0, dormantCount: 0, score: 0 };
|
|
106
|
+
const m = methylate(repoRoot, cb, trustMap, at);
|
|
107
|
+
const rev = demethylate(m);
|
|
108
|
+
const reviveExact = rev.exact;
|
|
109
|
+
const shrinks = m.dormant.length === 0 ? true : m.activeBytes < m.fullBytes;
|
|
110
|
+
const sig = verifyReceipt(m.receipt);
|
|
111
|
+
const payload = m.receipt.payload;
|
|
112
|
+
const signedBinds = sig.valid && payload?.originalHash === m.originalHash && payload?.dormantCount === m.dormant.length;
|
|
113
|
+
const m2 = methylate(repoRoot, cb, trustMap, at);
|
|
114
|
+
const deterministic = m.originalHash === m2.originalHash && m.activeBytes === m2.activeBytes && m.dormant.length === m2.dormant.length;
|
|
115
|
+
let stable = true;
|
|
116
|
+
try {
|
|
117
|
+
demethylate(null);
|
|
118
|
+
methylate(repoRoot, null, {}, at);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
stable = false;
|
|
122
|
+
}
|
|
123
|
+
const perfect = reviveExact && shrinks && signedBinds && deterministic && stable;
|
|
124
|
+
return { reviveExact, shrinks, signedBinds, deterministic, stable, activeBytes: m.activeBytes, fullBytes: m.fullBytes, dormantCount: m.dormant.length, score: perfect ? 100 : 0 };
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return { reviveExact: false, shrinks: false, signedBinds: false, deterministic: false, stable: false, activeBytes: 0, fullBytes: 0, dormantCount: 0, score: 0 };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=dormancy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dormancy.js","sourceRoot":"","sources":["../../src/hydra/dormancy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dormancy.test.d.ts","sourceRoot":"","sources":["../../src/hydra/dormancy.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 { methylate, demethylate, dormancyGauntlet } from "./dormancy.js";
|
|
5
|
+
const CORPUS = "alpha beta gamma delta epsilon. alpha beta gamma delta epsilon. zeta eta theta iota kappa. zeta eta theta iota kappa. ".repeat(8);
|
|
6
|
+
function setup() {
|
|
7
|
+
const cb = forgeCodebook(CORPUS, { minHits: 2 }).codebook;
|
|
8
|
+
// mark half the entries stale (cold).
|
|
9
|
+
const trustMap = {};
|
|
10
|
+
cb.entries.forEach((e, i) => { if (i % 2 === 0)
|
|
11
|
+
trustMap[e.sym] = "stale"; });
|
|
12
|
+
return { cb, trustMap };
|
|
13
|
+
}
|
|
14
|
+
describe("v2.102 HYDRA EPIGENETIC DORMANCY — sleep state + JIT revival", () => {
|
|
15
|
+
it("methylate shrinks the active set; full demethylate is BYTE-EXACT", () => {
|
|
16
|
+
const { cb, trustMap } = setup();
|
|
17
|
+
const m = methylate(process.cwd(), cb, trustMap, 1700000000000);
|
|
18
|
+
expect(m.dormant.length).toBeGreaterThan(0);
|
|
19
|
+
expect(m.activeBytes).toBeLessThan(m.fullBytes); // working set shrank
|
|
20
|
+
const rev = demethylate(m); // full wake
|
|
21
|
+
expect(rev.exact).toBe(true);
|
|
22
|
+
expect(sha256Hex(canonicalizeCodebook(rev.codebook))).toBe(m.originalHash);
|
|
23
|
+
});
|
|
24
|
+
it("partial demethylate revives only the requested dormant entries", () => {
|
|
25
|
+
const { cb, trustMap } = setup();
|
|
26
|
+
const m = methylate(process.cwd(), cb, trustMap, 1700000000000);
|
|
27
|
+
const one = m.dormant[0].phrase;
|
|
28
|
+
const rev = demethylate(m, [one]);
|
|
29
|
+
expect(rev.ok).toBe(true);
|
|
30
|
+
expect(rev.exact).toBe(false); // not a full revive
|
|
31
|
+
expect(rev.codebook.entries.some((e) => e.phrase === one)).toBe(true);
|
|
32
|
+
// a still-dormant phrase is NOT in the partial revive
|
|
33
|
+
const stillAsleep = m.dormant[1]?.phrase;
|
|
34
|
+
if (stillAsleep)
|
|
35
|
+
expect(rev.codebook.entries.some((e) => e.phrase === stillAsleep)).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
it("the split is Ed25519-signed and binds the original/dormant counts", () => {
|
|
38
|
+
const { cb, trustMap } = setup();
|
|
39
|
+
const g = dormancyGauntlet(process.cwd(), cb, trustMap, 1700000000000);
|
|
40
|
+
expect(g.signedBinds).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
it("dormancy gauntlet scores 100 (reviveExact ∧ shrinks ∧ signedBinds ∧ deterministic)", () => {
|
|
43
|
+
const { cb, trustMap } = setup();
|
|
44
|
+
const g = dormancyGauntlet(process.cwd(), cb, trustMap, 1700000000000);
|
|
45
|
+
expect(g.reviveExact).toBe(true);
|
|
46
|
+
expect(g.shrinks).toBe(true);
|
|
47
|
+
expect(g.signedBinds).toBe(true);
|
|
48
|
+
expect(g.deterministic).toBe(true);
|
|
49
|
+
expect(g.stable).toBe(true);
|
|
50
|
+
expect(g.score).toBe(100);
|
|
51
|
+
});
|
|
52
|
+
it("nothing dormant ⇒ active == full, still byte-exact (no over-claim)", () => {
|
|
53
|
+
const { cb } = setup();
|
|
54
|
+
const m = methylate(process.cwd(), cb, {}, 1700000000000); // nothing stale
|
|
55
|
+
expect(m.dormant.length).toBe(0);
|
|
56
|
+
expect(m.activeBytes).toBe(m.fullBytes);
|
|
57
|
+
expect(demethylate(m).exact).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
it("STABILITY — total on garbage", () => {
|
|
60
|
+
expect(() => methylate(process.cwd(), null, {}, 0)).not.toThrow();
|
|
61
|
+
expect(demethylate(null).ok).toBe(false);
|
|
62
|
+
expect(demethylate({ v: 99 }).ok).toBe(false);
|
|
63
|
+
expect(dormancyGauntlet(process.cwd(), null, {}, 0).score).toBe(0);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=dormancy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dormancy.test.js","sourceRoot":"","sources":["../../src/hydra/dormancy.test.ts"],"names":[],"mappings":"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"}
|
package/dist/hydra/index.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export * from "./attest.js";
|
|
|
24
24
|
export * from "./guard.js";
|
|
25
25
|
export * from "./chain.js";
|
|
26
26
|
export * from "./chain_guard.js";
|
|
27
|
+
export * from "./dormancy.js";
|
|
27
28
|
import type { Codebook } from "./engine.js";
|
|
28
29
|
import { type ForgeOpts, type ForgeResult, type Gauntlet } from "./analytic.js";
|
|
29
30
|
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;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;
|
|
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;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAE9B,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"}
|
package/dist/hydra/index.js
CHANGED
|
@@ -24,6 +24,7 @@ export * from "./attest.js";
|
|
|
24
24
|
export * from "./guard.js";
|
|
25
25
|
export * from "./chain.js";
|
|
26
26
|
export * from "./chain_guard.js";
|
|
27
|
+
export * from "./dormancy.js";
|
|
27
28
|
import { sha256Hex } from "./engine.js";
|
|
28
29
|
import { forgeCodebook, gauntlet } from "./analytic.js";
|
|
29
30
|
import { signCodebook, mintEnergyCert, canonicalizeCodebook } from "./attest.js";
|
package/dist/hydra/index.js.map
CHANGED
|
@@ -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;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,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;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAG9B,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;
|
|
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;AA+2FnE,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,74 @@ const probes = [
|
|
|
342
342
|
}
|
|
343
343
|
},
|
|
344
344
|
},
|
|
345
|
+
{
|
|
346
|
+
id: "probe.hydra.mcp_self_attesting",
|
|
347
|
+
kind: "boolean",
|
|
348
|
+
description: "HYDRA MCP surface (v2.101.0 — the last flow): any AI agent calls the whole HYDRA stack straight through MCP, and every result is SELF-ATTESTING — wrapped with a NOTARY (Ed25519) receipt over the SHA-256 of its own data, so the calling model verifies OFFLINE that the tool didn't lie or get tampered between server and model. This probe calls `mneme.hydra.forge` through the REAL MCP JSON-RPC server, then independently verifies the returned `_proof`: the Ed25519 signature must be valid AND sha256(canonical(data minus _proof)) must equal the signed dataHash — output you can check, not output you must believe.",
|
|
349
|
+
run: async (ctx) => {
|
|
350
|
+
const t0 = Date.now();
|
|
351
|
+
try {
|
|
352
|
+
const canon = (v) => {
|
|
353
|
+
if (v === null || typeof v !== "object")
|
|
354
|
+
return JSON.stringify(v) ?? "null";
|
|
355
|
+
if (Array.isArray(v))
|
|
356
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
357
|
+
const k = Object.keys(v).sort();
|
|
358
|
+
return "{" + k.map((x) => JSON.stringify(x) + ":" + canon(v[x])).join(",") + "}";
|
|
359
|
+
};
|
|
360
|
+
const { createHash } = await import("node:crypto");
|
|
361
|
+
const sha = (s) => createHash("sha256").update(s, "utf8").digest("hex");
|
|
362
|
+
const text = "alpha beta alpha beta gamma delta. alpha beta alpha beta gamma delta. ".repeat(8);
|
|
363
|
+
const raw = await spawnMcpCall(ctx.cwd, "mneme.hydra.forge", { text }, 30000);
|
|
364
|
+
let parsed;
|
|
365
|
+
try {
|
|
366
|
+
parsed = JSON.parse(raw);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
parsed = {};
|
|
370
|
+
}
|
|
371
|
+
const data = parsed.data ?? parsed;
|
|
372
|
+
const proof = data._proof;
|
|
373
|
+
const score = (data.gauntlet)?.score;
|
|
374
|
+
if (!proof || !proof.receipt)
|
|
375
|
+
return { value: 0, evidence: `no _proof in MCP result (score=${score})`, dtMs: Date.now() - t0 };
|
|
376
|
+
const core = await import("../notary/receipt.js");
|
|
377
|
+
const sig = core.verifyReceipt(proof.receipt);
|
|
378
|
+
const bare = { ...data };
|
|
379
|
+
delete bare._proof;
|
|
380
|
+
const hashOk = sha(canon(bare)) === proof.dataHash;
|
|
381
|
+
const ok = score === 100 && sig.valid && hashOk;
|
|
382
|
+
return { value: ok ? 1 : 0, evidence: `score=${score} sigValid=${sig.valid} dataHashMatches=${hashOk}`, dtMs: Date.now() - t0 };
|
|
383
|
+
}
|
|
384
|
+
catch (e) {
|
|
385
|
+
return { value: 0, evidence: `threw: ${e.message}`, dtMs: Date.now() - t0 };
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
id: "probe.hydra.epigenetic_dormancy",
|
|
391
|
+
kind: "boolean",
|
|
392
|
+
description: "HYDRA EPIGENETIC DORMANCY (v2.102.0 — the image's 'Epigenetic Sleep State' + 'JIT Revival/Demethylation', made real): cold codebook entries are METHYLATED (moved out of the active working set into a cold signed store, so the active footprint shrinks — the enterprise-scale win) and DEMETHYLATE byte-exact on demand (a full revive reconstructs the original codebook with an identical canonical hash). Deterministic tiered memory with a cryptographic lossless-revival proof — NOT lossy, NOT fortune-telling. Three booleans that can't lie: revive-exact ∧ shrinks ∧ signed-binds (Ed25519). This probe sleeps half a forged codebook and asserts the dormancy gauntlet = 100 + stability.",
|
|
393
|
+
run: async (ctx) => {
|
|
394
|
+
const t0 = Date.now();
|
|
395
|
+
void ctx;
|
|
396
|
+
try {
|
|
397
|
+
const H = await import("../hydra/index.js");
|
|
398
|
+
const corpus = "alpha beta gamma delta epsilon. alpha beta gamma delta epsilon. zeta eta theta iota kappa. zeta eta theta iota kappa. ".repeat(8);
|
|
399
|
+
const cb = H.forgeCodebook(corpus, { minHits: 2 }).codebook;
|
|
400
|
+
const trustMap = {};
|
|
401
|
+
cb.entries.forEach((e, i) => { if (i % 2 === 0)
|
|
402
|
+
trustMap[e.sym] = "stale"; });
|
|
403
|
+
const g = H.dormancyGauntlet(process.cwd(), cb, trustMap, 1700000000000);
|
|
404
|
+
const stableOnGarbage = H.dormancyGauntlet(process.cwd(), null, {}, 0).score === 0;
|
|
405
|
+
const ok = g.score === 100 && g.reviveExact && g.shrinks && g.signedBinds && g.deterministic && stableOnGarbage;
|
|
406
|
+
return { value: ok ? 1 : 0, evidence: `score=${g.score} reviveExact=${g.reviveExact} shrinks=${g.shrinks} signedBinds=${g.signedBinds} dormant=${g.dormantCount} active=${g.activeBytes}/${g.fullBytes}B stableOnGarbage=${stableOnGarbage}`, dtMs: Date.now() - t0 };
|
|
407
|
+
}
|
|
408
|
+
catch (e) {
|
|
409
|
+
return { value: 0, evidence: `threw: ${e.message}`, dtMs: Date.now() - t0 };
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
},
|
|
345
413
|
{
|
|
346
414
|
id: "probe.hydra.temporal_guarded_replay",
|
|
347
415
|
kind: "boolean",
|