@mneme-ai/core 2.9.4 → 2.11.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.
Files changed (37) hide show
  1. package/dist/cosmic/cosmic.test.d.ts +2 -0
  2. package/dist/cosmic/cosmic.test.d.ts.map +1 -0
  3. package/dist/cosmic/cosmic.test.js +123 -0
  4. package/dist/cosmic/cosmic.test.js.map +1 -0
  5. package/dist/cosmic/index.d.ts +87 -0
  6. package/dist/cosmic/index.d.ts.map +1 -0
  7. package/dist/cosmic/index.js +128 -0
  8. package/dist/cosmic/index.js.map +1 -0
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +13 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/nexus_lock/index.d.ts +13 -0
  14. package/dist/nexus_lock/index.d.ts.map +1 -0
  15. package/dist/nexus_lock/index.js +13 -0
  16. package/dist/nexus_lock/index.js.map +1 -0
  17. package/dist/nexus_lock/nexus_lock.test.d.ts +2 -0
  18. package/dist/nexus_lock/nexus_lock.test.d.ts.map +1 -0
  19. package/dist/nexus_lock/nexus_lock.test.js +241 -0
  20. package/dist/nexus_lock/nexus_lock.test.js.map +1 -0
  21. package/dist/nexus_lock/obedience_ledger.d.ts +62 -0
  22. package/dist/nexus_lock/obedience_ledger.d.ts.map +1 -0
  23. package/dist/nexus_lock/obedience_ledger.js +114 -0
  24. package/dist/nexus_lock/obedience_ledger.js.map +1 -0
  25. package/dist/nexus_lock/selftest.d.ts +35 -0
  26. package/dist/nexus_lock/selftest.d.ts.map +1 -0
  27. package/dist/nexus_lock/selftest.js +204 -0
  28. package/dist/nexus_lock/selftest.js.map +1 -0
  29. package/dist/nexus_lock/soul_prompt_v2.d.ts +118 -0
  30. package/dist/nexus_lock/soul_prompt_v2.d.ts.map +1 -0
  31. package/dist/nexus_lock/soul_prompt_v2.js +245 -0
  32. package/dist/nexus_lock/soul_prompt_v2.js.map +1 -0
  33. package/dist/nexus_lock/stargate.d.ts +42 -0
  34. package/dist/nexus_lock/stargate.d.ts.map +1 -0
  35. package/dist/nexus_lock/stargate.js +53 -0
  36. package/dist/nexus_lock/stargate.js.map +1 -0
  37. package/package.json +1 -1
@@ -0,0 +1,241 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { buildSoulPromptV2, verifySoulPromptV2, parseHomunculusReturn, freshnessLabel } from "./soul_prompt_v2.js";
3
+ import { publishToStargate } from "./stargate.js";
4
+ import { ObedienceLedger, trialFromReturn } from "./obedience_ledger.js";
5
+ import { runSelfTests, renderSelfTestReport, buildUserTestProtocol } from "./selftest.js";
6
+ describe("v2.10 NEXUS-LOCK · soul prompt v2", () => {
7
+ const baseInput = {
8
+ receivingVendor: "gemini",
9
+ originatingVendor: "claude-opus-4-7",
10
+ currentMnemeVersion: "2.10.0",
11
+ npmLatestVersion: "2.10.0",
12
+ recentCommits: [{ sha: "abc12345abcd", subject: "feat: NEXUS-LOCK v2" }],
13
+ secret: "test-secret-fixed",
14
+ };
15
+ it("contains VERSION-LOCKED block at the top, before any other content", () => {
16
+ const p = buildSoulPromptV2(baseInput);
17
+ const lockedIdx = p.text.indexOf("⚡ VERSION-LOCKED MNEME CONTEXT");
18
+ const contractIdx = p.text.indexOf("🔒 NEXUS-LOCK CONTRACT");
19
+ expect(lockedIdx).toBeGreaterThan(0);
20
+ expect(contractIdx).toBeGreaterThan(lockedIdx);
21
+ });
22
+ it("BURY THE LEDE: directive that LIVE STATE supersedes all other version mentions", () => {
23
+ const p = buildSoulPromptV2(baseInput);
24
+ expect(p.text).toContain("authoritative source of state");
25
+ expect(p.text).toContain("SUPERSEDED");
26
+ });
27
+ it("4-rule contract is present", () => {
28
+ const p = buildSoulPromptV2(baseInput);
29
+ expect(p.text).toContain("STATUS EMOJI FIRST");
30
+ expect(p.text).toContain("VERSION CLAIMS ARE GATED");
31
+ expect(p.text).toContain("HOMUNCULUS RETURN FOOTER");
32
+ expect(p.text).toContain("NO IMPROVISATION ON STATE");
33
+ });
34
+ it("HMAC signature is deterministic for same input + secret", () => {
35
+ const a = buildSoulPromptV2(baseInput);
36
+ const b = buildSoulPromptV2(baseInput);
37
+ expect(a.sig).toBe(b.sig);
38
+ });
39
+ it("HMAC signature changes when version changes (catches tampering)", () => {
40
+ const a = buildSoulPromptV2(baseInput);
41
+ const b = buildSoulPromptV2({ ...baseInput, currentMnemeVersion: "9.9.9" });
42
+ expect(a.sig).not.toBe(b.sig);
43
+ });
44
+ it("verifier accepts a clean prompt", () => {
45
+ const p = buildSoulPromptV2(baseInput);
46
+ const v = verifySoulPromptV2(p.text);
47
+ expect(v.ok).toBe(true);
48
+ expect(v.reasons).toEqual([]);
49
+ });
50
+ it("verifier rejects a prompt with no HMAC field", () => {
51
+ const p = buildSoulPromptV2(baseInput);
52
+ const tampered = p.text.replace(/HMAC-SHA256:\*\*\s*`[0-9a-f]+`/, "HMAC-SHA256:** `<gone>`");
53
+ const v = verifySoulPromptV2(tampered);
54
+ expect(v.ok).toBe(false);
55
+ expect(v.reasons).toContain("missing HMAC signature");
56
+ });
57
+ it("vendor name embedded in HOMUNCULUS template", () => {
58
+ const p = buildSoulPromptV2({ ...baseInput, receivingVendor: "chatgpt" });
59
+ expect(p.text).toContain("vendor: chatgpt");
60
+ });
61
+ it("Stargate URL embedded when supplied", () => {
62
+ const p = buildSoulPromptV2({ ...baseInput, stargateUrl: "https://dpaste.com/XYZ.txt" });
63
+ expect(p.text).toContain("https://dpaste.com/XYZ.txt");
64
+ });
65
+ it("Stargate URL absent when null", () => {
66
+ const p = buildSoulPromptV2({ ...baseInput, stargateUrl: null });
67
+ expect(p.text).not.toContain("Stargate (optional");
68
+ });
69
+ it("recentTurns rendered with timestamps", () => {
70
+ const p = buildSoulPromptV2({
71
+ ...baseInput,
72
+ recentTurns: [
73
+ { ts: "2026-05-15T08:00:00.000Z", role: "user", text: "hello" },
74
+ { ts: "2026-05-15T08:00:05.000Z", role: "assistant", text: "hi" },
75
+ ],
76
+ });
77
+ expect(p.text).toContain("[2026-05-15T08:00:00.000Z]");
78
+ expect(p.text).toContain("RECENT TURNS (historical");
79
+ });
80
+ });
81
+ describe("v2.10 NEXUS-LOCK · HomunculusReturn parser", () => {
82
+ it("parses a well-formed reply", () => {
83
+ const reply = `🟢 Version 2.10.0 per LIVE STATE.\n\n# HOMUNCULUS RETURN\nvendor: gemini\nseen_version: 2.10.0\nfreshness: fresh\nturn: 1\ncompliance: emoji-ok|version-quoted\n`;
84
+ const r = parseHomunculusReturn(reply);
85
+ expect(r).not.toBeNull();
86
+ expect(r.vendor).toBe("gemini");
87
+ expect(r.seenVersion).toBe("2.10.0");
88
+ expect(r.freshness).toBe("fresh");
89
+ expect(r.turn).toBe(1);
90
+ expect(r.emojiFirst).toBe(true);
91
+ });
92
+ it("returns null when footer is missing", () => {
93
+ expect(parseHomunculusReturn("just some plain text")).toBeNull();
94
+ });
95
+ it("detects missing emoji-first", () => {
96
+ const reply = `Plain prose with no emoji at start.\n\n# HOMUNCULUS RETURN\nvendor: gemini\nseen_version: 2.10.0\nfreshness: fresh\nturn: 1\ncompliance: ok\n`;
97
+ const r = parseHomunculusReturn(reply);
98
+ expect(r).not.toBeNull();
99
+ expect(r.emojiFirst).toBe(false);
100
+ });
101
+ it("normalizes unknown freshness to 'unknown'", () => {
102
+ const reply = `🟢 hello\n\n# HOMUNCULUS RETURN\nvendor: x\nseen_version: 1.0\nfreshness: weird\nturn: 1\ncompliance: ok\n`;
103
+ const r = parseHomunculusReturn(reply);
104
+ expect(r.freshness).toBe("unknown");
105
+ });
106
+ it("returns null when required fields missing", () => {
107
+ const reply = `🟢 hello\n\n# HOMUNCULUS RETURN\nvendor: gemini\nturn: 1\n`;
108
+ expect(parseHomunculusReturn(reply)).toBeNull();
109
+ });
110
+ it("handles fenced code-block format from real AI replies", () => {
111
+ const reply = `🟢 Mneme is at 2.10.0\n\n\`\`\`\n# HOMUNCULUS RETURN\nvendor: claude\nseen_version: 2.10.0\nfreshness: fresh\nturn: 2\ncompliance: ok\n\`\`\`\n`;
112
+ const r = parseHomunculusReturn(reply);
113
+ expect(r).not.toBeNull();
114
+ expect(r.vendor).toBe("claude");
115
+ expect(r.turn).toBe(2);
116
+ });
117
+ });
118
+ describe("v2.10 NEXUS-LOCK · freshness math", () => {
119
+ it("just-generated → fresh", () => {
120
+ expect(freshnessLabel(new Date().toISOString())).toBe("fresh");
121
+ });
122
+ it("7 hours old → aging", () => {
123
+ expect(freshnessLabel(new Date(Date.now() - 7 * 3_600_000).toISOString())).toBe("aging");
124
+ });
125
+ it("25 hours old → stale (default 24h threshold)", () => {
126
+ expect(freshnessLabel(new Date(Date.now() - 25 * 3_600_000).toISOString())).toBe("stale");
127
+ });
128
+ it("custom staleAfterHours respected", () => {
129
+ // 5h old: tighter threshold → stale; loose threshold → still fresh (5h < 6h aging boundary)
130
+ const fiveH = new Date(Date.now() - 5 * 3_600_000).toISOString();
131
+ expect(freshnessLabel(fiveH, Date.now(), 1)).toBe("stale");
132
+ expect(freshnessLabel(fiveH, Date.now(), 100)).toBe("fresh");
133
+ // 8h old + custom large stale: aging (past 6h aging boundary, not yet stale)
134
+ const eightH = new Date(Date.now() - 8 * 3_600_000).toISOString();
135
+ expect(freshnessLabel(eightH, Date.now(), 100)).toBe("aging");
136
+ });
137
+ });
138
+ describe("v2.10 NEXUS-LOCK · STARGATE publisher", () => {
139
+ it("returns null on fetch failure", async () => {
140
+ const r = await publishToStargate({
141
+ state: { mnemeVersion: "2.10.0", npmLatest: null, recentCommits: [], generatedAt: new Date().toISOString(), originator: "claude" },
142
+ fetchOverride: async () => { throw new Error("network down"); },
143
+ });
144
+ expect(r).toBeNull();
145
+ });
146
+ it("returns null on non-OK response", async () => {
147
+ const r = await publishToStargate({
148
+ state: { mnemeVersion: "2.10.0", npmLatest: null, recentCommits: [], generatedAt: new Date().toISOString(), originator: "claude" },
149
+ fetchOverride: async () => new Response("err", { status: 503 }),
150
+ });
151
+ expect(r).toBeNull();
152
+ });
153
+ it("returns paste URL on success and converts to .txt raw form", async () => {
154
+ const fakeFetch = async () => new Response("https://dpaste.com/ABC123", { status: 200 });
155
+ const r = await publishToStargate({
156
+ state: { mnemeVersion: "2.10.0", npmLatest: null, recentCommits: [], generatedAt: new Date().toISOString(), originator: "claude" },
157
+ fetchOverride: fakeFetch,
158
+ });
159
+ expect(r).not.toBeNull();
160
+ expect(r.url).toBe("https://dpaste.com/ABC123.txt");
161
+ expect(r.expiresAt).toBeGreaterThan(Date.now());
162
+ });
163
+ it("rejects malformed response body (not a URL)", async () => {
164
+ const fakeFetch = async () => new Response("not-a-url", { status: 200 });
165
+ const r = await publishToStargate({
166
+ state: { mnemeVersion: "2.10.0", npmLatest: null, recentCommits: [], generatedAt: new Date().toISOString(), originator: "claude" },
167
+ fetchOverride: fakeFetch,
168
+ });
169
+ expect(r).toBeNull();
170
+ });
171
+ });
172
+ describe("v2.10 NEXUS-LOCK · ObedienceLedger", () => {
173
+ it("records trials + computes Wilson LB", () => {
174
+ const led = new ObedienceLedger();
175
+ for (let i = 0; i < 5; i++) {
176
+ led.record({ vendor: "gemini", emojiOk: true, versionQuoted: true, refusedWhenStale: false, staleProbe: false, ts: i });
177
+ }
178
+ const sc = led.scorecard();
179
+ expect(sc.length).toBe(1);
180
+ expect(sc[0].vendor).toBe("gemini");
181
+ expect(sc[0].trials).toBe(5);
182
+ expect(sc[0].emojiOk).toBe(5);
183
+ expect(sc[0].versionQuoted).toBe(5);
184
+ expect(sc[0].wilson).toBeGreaterThan(0.5);
185
+ });
186
+ it("ranks vendors by Wilson LB into tiers", () => {
187
+ const led = new ObedienceLedger();
188
+ // claude: 10/10 perfect
189
+ for (let i = 0; i < 10; i++)
190
+ led.record({ vendor: "claude", emojiOk: true, versionQuoted: true, refusedWhenStale: false, staleProbe: false, ts: i });
191
+ // gpt: 5/10 mixed
192
+ for (let i = 0; i < 5; i++)
193
+ led.record({ vendor: "gpt", emojiOk: true, versionQuoted: true, refusedWhenStale: false, staleProbe: false, ts: i });
194
+ for (let i = 5; i < 10; i++)
195
+ led.record({ vendor: "gpt", emojiOk: false, versionQuoted: false, refusedWhenStale: false, staleProbe: false, ts: i });
196
+ const r = led.rank();
197
+ expect(r[0].vendor).toBe("claude");
198
+ expect(r[0].tier).toBe("A");
199
+ expect(r[1].vendor).toBe("gpt");
200
+ expect(["B", "C", "F"]).toContain(r[1].tier);
201
+ });
202
+ it("trialFromReturn marks refusal-on-stale as correct behavior", () => {
203
+ const ret = { vendor: "gemini", seenVersion: "?", freshness: "stale", turn: 1, compliance: "ok", emojiFirst: true };
204
+ const t = trialFromReturn(ret, "2.10.0", true);
205
+ expect(t.refusedWhenStale).toBe(true);
206
+ });
207
+ it("trialFromReturn flags wrong-version-quoted on fresh probe", () => {
208
+ const ret = { vendor: "gemini", seenVersion: "1.95", freshness: "fresh", turn: 1, compliance: "ok", emojiFirst: true };
209
+ const t = trialFromReturn(ret, "2.10.0", false);
210
+ expect(t.versionQuoted).toBe(false);
211
+ });
212
+ it("serialize / parse round-trips", () => {
213
+ const led = new ObedienceLedger();
214
+ led.record({ vendor: "x", emojiOk: true, versionQuoted: true, refusedWhenStale: false, staleProbe: false, ts: 1 });
215
+ const text = led.serialize();
216
+ const led2 = ObedienceLedger.parse(text);
217
+ expect(led2.scorecard()[0].vendor).toBe("x");
218
+ });
219
+ });
220
+ describe("v2.10 NEXUS-LOCK · self-test harness", () => {
221
+ it("runSelfTests returns all-pass on a healthy module", () => {
222
+ const results = runSelfTests();
223
+ const failures = results.filter((r) => !r.ok);
224
+ expect(failures.length).toBe(0);
225
+ expect(results.length).toBeGreaterThan(10);
226
+ });
227
+ it("renderSelfTestReport produces a readable Markdown summary", () => {
228
+ const results = runSelfTests();
229
+ const md = renderSelfTestReport(results);
230
+ expect(md).toContain("NEXUS-LOCK self-test report");
231
+ expect(md).toMatch(/\d+ \/ \d+ pass/);
232
+ });
233
+ it("buildUserTestProtocol produces TEST A/B/C/D blocks", () => {
234
+ const proto = buildUserTestProtocol();
235
+ expect(proto).toContain("TEST A — fresh soul");
236
+ expect(proto).toContain("TEST B — stale soul");
237
+ expect(proto).toContain("TEST C — fetch-capable AI");
238
+ expect(proto).toContain("TEST D — cross-vendor consistency");
239
+ });
240
+ });
241
+ //# sourceMappingURL=nexus_lock.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexus_lock.test.js","sourceRoot":"","sources":["../../src/nexus_lock/nexus_lock.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * v2.10.0 -- VENDOR OBEDIENCE LEDGER.
3
+ *
4
+ * Each pasted-back AI reply (HOMUNCULUS RETURN parsed) updates a
5
+ * per-vendor scorecard. Over time we learn which AIs actually obey
6
+ * the NEXUS-LOCK contract:
7
+ *
8
+ * - did the reply start with the status emoji?
9
+ * - did it quote the version verbatim from LIVE STATE?
10
+ * - did it refuse when stale (vs lie)?
11
+ *
12
+ * Wilson lower bound at 95% so a single lucky reply doesn't
13
+ * over-trust a vendor. Scorecard becomes the empirical answer to
14
+ * "which AI actually understands Mneme protocol?"
15
+ *
16
+ * Pure in-memory; persistence is the caller's responsibility (e.g.,
17
+ * the daemon writes .mneme/nexus-lock/obedience.jsonl).
18
+ */
19
+ import type { HomunculusReturn } from "./soul_prompt_v2.js";
20
+ export interface ObedienceRow {
21
+ vendor: string;
22
+ trials: number;
23
+ emojiOk: number;
24
+ versionQuoted: number;
25
+ refusedWhenStale: number;
26
+ /** Wilson LB of overall obedience (all 3 dimensions weighted equally). */
27
+ wilson: number;
28
+ /** Unweighted obedience rate. */
29
+ rate: number;
30
+ }
31
+ export interface LedgerTrial {
32
+ vendor: string;
33
+ emojiOk: boolean;
34
+ versionQuoted: boolean;
35
+ refusedWhenStale: boolean;
36
+ /** True if the trial was on a stale soul prompt (so refusal is the
37
+ * correct behaviour). */
38
+ staleProbe: boolean;
39
+ ts: number;
40
+ }
41
+ export declare class ObedienceLedger {
42
+ private readonly trials;
43
+ constructor(initial?: LedgerTrial[]);
44
+ /** Record a trial inferred from a HomunculusReturn + a known
45
+ * freshness label of the soul prompt that was sent. */
46
+ record(t: LedgerTrial): void;
47
+ /** Per-vendor scorecard. */
48
+ scorecard(): ObedienceRow[];
49
+ /** Rank vendors by Wilson LB; useful for "which vendor should I clone to?" */
50
+ rank(): Array<{
51
+ vendor: string;
52
+ wilson: number;
53
+ tier: "A" | "B" | "C" | "F";
54
+ }>;
55
+ serialize(): string;
56
+ static parse(text: string): ObedienceLedger;
57
+ }
58
+ /** Convert a HomunculusReturn + the soul prompt's expected version
59
+ * into a ledger trial. The caller knows whether the soul was stale
60
+ * at the moment of posting. */
61
+ export declare function trialFromReturn(ret: HomunculusReturn, expectedVersion: string, staleProbe: boolean, now?: number): LedgerTrial;
62
+ //# sourceMappingURL=obedience_ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obedience_ledger.d.ts","sourceRoot":"","sources":["../../src/nexus_lock/obedience_ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAWD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B;8BAC0B;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAEhC,OAAO,GAAE,WAAW,EAAO;IAIvC;4DACwD;IACxD,MAAM,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAI5B,4BAA4B;IAC5B,SAAS,IAAI,YAAY,EAAE;IAkC3B,8EAA8E;IAC9E,IAAI,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;KAAE,CAAC;IAQ9E,SAAS,IAAI,MAAM;IAInB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;CAS5C;AAED;;gCAEgC;AAChC,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,OAAO,EACnB,GAAG,GAAE,MAAmB,GACvB,WAAW,CAYb"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * v2.10.0 -- VENDOR OBEDIENCE LEDGER.
3
+ *
4
+ * Each pasted-back AI reply (HOMUNCULUS RETURN parsed) updates a
5
+ * per-vendor scorecard. Over time we learn which AIs actually obey
6
+ * the NEXUS-LOCK contract:
7
+ *
8
+ * - did the reply start with the status emoji?
9
+ * - did it quote the version verbatim from LIVE STATE?
10
+ * - did it refuse when stale (vs lie)?
11
+ *
12
+ * Wilson lower bound at 95% so a single lucky reply doesn't
13
+ * over-trust a vendor. Scorecard becomes the empirical answer to
14
+ * "which AI actually understands Mneme protocol?"
15
+ *
16
+ * Pure in-memory; persistence is the caller's responsibility (e.g.,
17
+ * the daemon writes .mneme/nexus-lock/obedience.jsonl).
18
+ */
19
+ function wilsonLower(succ, total, z = 1.96) {
20
+ if (total === 0)
21
+ return 0;
22
+ const p = succ / total;
23
+ const denom = 1 + (z * z) / total;
24
+ const center = p + (z * z) / (2 * total);
25
+ const margin = z * Math.sqrt((p * (1 - p) + (z * z) / (4 * total)) / total);
26
+ return Math.max(0, Math.min(1, (center - margin) / denom));
27
+ }
28
+ export class ObedienceLedger {
29
+ trials = [];
30
+ constructor(initial = []) {
31
+ this.trials = initial.slice();
32
+ }
33
+ /** Record a trial inferred from a HomunculusReturn + a known
34
+ * freshness label of the soul prompt that was sent. */
35
+ record(t) {
36
+ this.trials.push(t);
37
+ }
38
+ /** Per-vendor scorecard. */
39
+ scorecard() {
40
+ const byVendor = new Map();
41
+ for (const t of this.trials) {
42
+ const e = byVendor.get(t.vendor) ?? { vendor: t.vendor, trials: 0, emoji: 0, quoted: 0, refused: 0, stale: 0 };
43
+ e.trials++;
44
+ if (t.emojiOk)
45
+ e.emoji++;
46
+ if (t.versionQuoted)
47
+ e.quoted++;
48
+ if (t.staleProbe) {
49
+ e.stale++;
50
+ if (t.refusedWhenStale)
51
+ e.refused++;
52
+ }
53
+ byVendor.set(t.vendor, e);
54
+ }
55
+ const rows = [];
56
+ for (const e of byVendor.values()) {
57
+ // Composite obedience: emoji + quoted + (refusedWhenStale|noStaleProbed)
58
+ // Counted out of 3 dimensions per trial.
59
+ const obeyed = e.emoji + e.quoted + (e.stale > 0 ? e.refused : e.trials);
60
+ const possible = e.trials * 3;
61
+ const rate = possible > 0 ? obeyed / possible : 0;
62
+ const wilson = wilsonLower(obeyed, possible);
63
+ rows.push({
64
+ vendor: e.vendor,
65
+ trials: e.trials,
66
+ emojiOk: e.emoji,
67
+ versionQuoted: e.quoted,
68
+ refusedWhenStale: e.refused,
69
+ wilson,
70
+ rate,
71
+ });
72
+ }
73
+ return rows.sort((a, b) => b.wilson - a.wilson);
74
+ }
75
+ /** Rank vendors by Wilson LB; useful for "which vendor should I clone to?" */
76
+ rank() {
77
+ return this.scorecard().map((r) => ({
78
+ vendor: r.vendor,
79
+ wilson: r.wilson,
80
+ tier: r.wilson >= 0.85 ? "A" : r.wilson >= 0.65 ? "B" : r.wilson >= 0.45 ? "C" : "F",
81
+ }));
82
+ }
83
+ serialize() {
84
+ return JSON.stringify(this.trials);
85
+ }
86
+ static parse(text) {
87
+ try {
88
+ const arr = JSON.parse(text);
89
+ if (!Array.isArray(arr))
90
+ return new ObedienceLedger();
91
+ return new ObedienceLedger(arr);
92
+ }
93
+ catch {
94
+ return new ObedienceLedger();
95
+ }
96
+ }
97
+ }
98
+ /** Convert a HomunculusReturn + the soul prompt's expected version
99
+ * into a ledger trial. The caller knows whether the soul was stale
100
+ * at the moment of posting. */
101
+ export function trialFromReturn(ret, expectedVersion, staleProbe, now = Date.now()) {
102
+ const versionQuoted = ret.seenVersion === expectedVersion;
103
+ // Refusal is correct if stale + AI declared "stale"/"refused".
104
+ const refusedWhenStale = staleProbe && (ret.freshness === "stale" || ret.freshness === "refused");
105
+ return {
106
+ vendor: ret.vendor,
107
+ emojiOk: ret.emojiFirst,
108
+ versionQuoted,
109
+ refusedWhenStale,
110
+ staleProbe,
111
+ ts: now,
112
+ };
113
+ }
114
+ //# sourceMappingURL=obedience_ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obedience_ledger.js","sourceRoot":"","sources":["../../src/nexus_lock/obedience_ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * v2.10.0 -- NEXUS-LOCK self-test harness.
3
+ *
4
+ * "Verify deterministically that every prompt we generate has all
5
+ * 5 required mechanisms; A/B-compare against the v1 baseline."
6
+ *
7
+ * What we CAN test from inside the codebase (deterministic, 100%):
8
+ * - Soul prompt v2 structure: every required block present?
9
+ * - HMAC signature intact?
10
+ * - HOMUNCULUS RETURN parser round-trips?
11
+ * - Stargate URL embedding?
12
+ * - Stale-detection math correct?
13
+ *
14
+ * What we CANNOT test from inside (requires real AI calls):
15
+ * - "Does Gemini Free actually obey the contract?"
16
+ * - "Does ChatGPT browse fetch the Stargate URL?"
17
+ *
18
+ * For those we EMIT a test protocol the user runs on their phone.
19
+ * Results land in the ObedienceLedger and become the empirical answer.
20
+ */
21
+ export interface SelfTestResult {
22
+ test: string;
23
+ ok: boolean;
24
+ detail?: string;
25
+ }
26
+ /** Run the deterministic structure tests. Returns a list of pass/fail
27
+ * rows the caller can render. */
28
+ export declare function runSelfTests(): SelfTestResult[];
29
+ /** A renderable Markdown report of the test run. */
30
+ export declare function renderSelfTestReport(results: SelfTestResult[]): string;
31
+ /** Human-readable test PROTOCOL the USER runs on real AI tools.
32
+ * The results plug back into the ObedienceLedger via the parsed
33
+ * HOMUNCULUS RETURN footer. */
34
+ export declare function buildUserTestProtocol(): string;
35
+ //# sourceMappingURL=selftest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selftest.d.ts","sourceRoot":"","sources":["../../src/nexus_lock/selftest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;kCACkC;AAClC,wBAAgB,YAAY,IAAI,cAAc,EAAE,CAkI/C;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAYtE;AAED;;gCAEgC;AAChC,wBAAgB,qBAAqB,IAAI,MAAM,CA0C9C"}