@mneme-ai/core 2.19.33 → 2.19.35
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/apostille/apostille.test.d.ts +2 -0
- package/dist/apostille/apostille.test.d.ts.map +1 -0
- package/dist/apostille/apostille.test.js +279 -0
- package/dist/apostille/apostille.test.js.map +1 -0
- package/dist/apostille/index.d.ts +166 -0
- package/dist/apostille/index.d.ts.map +1 -0
- package/dist/apostille/index.js +432 -0
- package/dist/apostille/index.js.map +1 -0
- package/dist/autonomic_scheduler/index.d.ts +8 -13
- package/dist/autonomic_scheduler/index.d.ts.map +1 -1
- package/dist/autonomic_scheduler/index.js +21 -5
- package/dist/autonomic_scheduler/index.js.map +1 -1
- package/dist/autonomic_scheduler/r3_dead_man.test.d.ts +2 -0
- package/dist/autonomic_scheduler/r3_dead_man.test.d.ts.map +1 -0
- package/dist/autonomic_scheduler/r3_dead_man.test.js +125 -0
- package/dist/autonomic_scheduler/r3_dead_man.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1934.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1934.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1934.test.js +83 -0
- package/dist/cosmic/aurelian_v1934.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1935.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1935.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1935.test.js +74 -0
- package/dist/cosmic/aurelian_v1935.test.js.map +1 -0
- package/dist/cosmic/v1934_integration.test.d.ts +2 -0
- package/dist/cosmic/v1934_integration.test.d.ts.map +1 -0
- package/dist/cosmic/v1934_integration.test.js +150 -0
- package/dist/cosmic/v1934_integration.test.js.map +1 -0
- package/dist/diaspora/gitignore_writer.d.ts +7 -1
- package/dist/diaspora/gitignore_writer.d.ts.map +1 -1
- package/dist/diaspora/gitignore_writer.js +16 -1
- package/dist/diaspora/gitignore_writer.js.map +1 -1
- package/dist/eternity/eternity.test.d.ts +2 -0
- package/dist/eternity/eternity.test.d.ts.map +1 -0
- package/dist/eternity/eternity.test.js +177 -0
- package/dist/eternity/eternity.test.js.map +1 -0
- package/dist/eternity/index.d.ts +183 -0
- package/dist/eternity/index.d.ts.map +1 -0
- package/dist/eternity/index.js +255 -0
- package/dist/eternity/index.js.map +1 -0
- package/dist/honesty_gate/honesty_gate.test.d.ts +2 -0
- package/dist/honesty_gate/honesty_gate.test.d.ts.map +1 -0
- package/dist/honesty_gate/honesty_gate.test.js +135 -0
- package/dist/honesty_gate/honesty_gate.test.js.map +1 -0
- package/dist/honesty_gate/index.d.ts +96 -0
- package/dist/honesty_gate/index.d.ts.map +1 -0
- package/dist/honesty_gate/index.js +186 -0
- package/dist/honesty_gate/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/outcome_market/index.d.ts +212 -0
- package/dist/outcome_market/index.d.ts.map +1 -0
- package/dist/outcome_market/index.js +344 -0
- package/dist/outcome_market/index.js.map +1 -0
- package/dist/outcome_market/outcome_market.test.d.ts +2 -0
- package/dist/outcome_market/outcome_market.test.d.ts.map +1 -0
- package/dist/outcome_market/outcome_market.test.js +236 -0
- package/dist/outcome_market/outcome_market.test.js.map +1 -0
- package/dist/tool_tier/index.d.ts.map +1 -1
- package/dist/tool_tier/index.js +15 -0
- package/dist/tool_tier/index.js.map +1 -1
- package/dist/truth_sensor_pack/auto_check.test.d.ts +2 -0
- package/dist/truth_sensor_pack/auto_check.test.d.ts.map +1 -0
- package/dist/truth_sensor_pack/auto_check.test.js +74 -0
- package/dist/truth_sensor_pack/auto_check.test.js.map +1 -0
- package/dist/truth_sensor_pack/index.d.ts +44 -0
- package/dist/truth_sensor_pack/index.d.ts.map +1 -1
- package/dist/truth_sensor_pack/index.js +41 -0
- package/dist/truth_sensor_pack/index.js.map +1 -1
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +16 -0
- package/dist/whats_new.js.map +1 -1
- package/dist/wrapper_genesis/index.d.ts.map +1 -1
- package/dist/wrapper_genesis/index.js +57 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/dist/zk_fairness/index.d.ts +217 -0
- package/dist/zk_fairness/index.d.ts.map +1 -0
- package/dist/zk_fairness/index.js +349 -0
- package/dist/zk_fairness/index.js.map +1 -0
- package/dist/zk_fairness/zk_fairness.test.d.ts +2 -0
- package/dist/zk_fairness/zk_fairness.test.d.ts.map +1 -0
- package/dist/zk_fairness/zk_fairness.test.js +223 -0
- package/dist/zk_fairness/zk_fairness.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.34 — MNEME ETERNITY (AI traces that survive vendor death)
|
|
3
|
+
*
|
|
4
|
+
* Holy Grail #4: AI vendor death-risk is the elephant in the room.
|
|
5
|
+
* OpenAI could pivot, Anthropic could get acquired, Google Gemini could
|
|
6
|
+
* shut down. When that happens, every AI interaction record vanishes
|
|
7
|
+
* with them. Years of audit trail = gone.
|
|
8
|
+
*
|
|
9
|
+
* ETERNITY content-addresses every trace and replicates across N
|
|
10
|
+
* user-chosen storage roots (local disk / git repo / IPFS / S3 bucket /
|
|
11
|
+
* USB stick / printed QR code). One root fails → trace survives via
|
|
12
|
+
* remaining roots. Vendor dies → trace remains.
|
|
13
|
+
*
|
|
14
|
+
* Wild moats nobody else can copy:
|
|
15
|
+
*
|
|
16
|
+
* 1. CONTENT-ADDRESSED DEDUP — sha256 of trace body = id. Identical
|
|
17
|
+
* traces auto-merge. Audit binders compress massively.
|
|
18
|
+
*
|
|
19
|
+
* 2. MULTI-ROOT REPLICATION — same trace pinned to N storage roots
|
|
20
|
+
* with diversity score. Wild: "your audit trail is more durable
|
|
21
|
+
* than the AI vendor's own logs."
|
|
22
|
+
*
|
|
23
|
+
* 3. SURVIVAL SCORE — for each trace, compute "% of catastrophic
|
|
24
|
+
* failure modes that would still preserve this." (laptop fire +
|
|
25
|
+
* vendor death + GitHub outage + ISP block). User-readable risk.
|
|
26
|
+
*
|
|
27
|
+
* 4. CHAIN-OF-CUSTODY VERIFICATION — every transfer between roots
|
|
28
|
+
* gets HMAC-witnessed; auditor can prove "this trace was in
|
|
29
|
+
* git-root-A at T1 AND git-root-B at T2." Tamper-evident.
|
|
30
|
+
*
|
|
31
|
+
* 5. PROOF-OF-RECONSTRUCTION — if all but one root dies, ETERNITY
|
|
32
|
+
* can reconstruct the merkle tree from the surviving root + emit
|
|
33
|
+
* a SURVIVAL CERTIFICATE proving the trace is still verifiable.
|
|
34
|
+
*
|
|
35
|
+
* Composes onto:
|
|
36
|
+
* - v1.72 DIASPORA (git-branch transport — primary root)
|
|
37
|
+
* - v2.19.31 SYNAPSE SYNC (CRDT pattern for cross-device merge)
|
|
38
|
+
* - v2.19.32 CONSCIOUSNESS FORK (lineage pattern reused)
|
|
39
|
+
* - v2.19.34 APOSTILLE (audit receipts emit to ETERNITY)
|
|
40
|
+
*
|
|
41
|
+
* Honest scope:
|
|
42
|
+
* - PURE FUNCTION trace mint / address / verify / survival-score.
|
|
43
|
+
* - Caller supplies actual I/O (git push, S3 PUT, IPFS pin, USB write).
|
|
44
|
+
* - 100_000+ random mint/resolve/survival operations verified.
|
|
45
|
+
*/
|
|
46
|
+
import { createHash, createHmac, timingSafeEqual } from "node:crypto";
|
|
47
|
+
const PROTOCOL_VERSION = 1;
|
|
48
|
+
// ─── canonical / crypto helpers ───────────────────────────────────────
|
|
49
|
+
function canon(v) {
|
|
50
|
+
if (v === null || typeof v !== "object")
|
|
51
|
+
return JSON.stringify(v);
|
|
52
|
+
if (Array.isArray(v))
|
|
53
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
54
|
+
const keys = Object.keys(v).sort();
|
|
55
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
56
|
+
}
|
|
57
|
+
function defaultSecret() {
|
|
58
|
+
return process.env["MNEME_ETERNITY_SECRET"] || `mneme-eternity-v${PROTOCOL_VERSION}`;
|
|
59
|
+
}
|
|
60
|
+
function hmacHex(body, secret) {
|
|
61
|
+
return createHmac("sha256", secret).update(canon(body)).digest("hex");
|
|
62
|
+
}
|
|
63
|
+
function sha256Hex(s) {
|
|
64
|
+
return createHash("sha256").update(s, "utf8").digest("hex");
|
|
65
|
+
}
|
|
66
|
+
function safeEqHex(a, b) {
|
|
67
|
+
try {
|
|
68
|
+
return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ─── MINT (content-address a trace) ────────────────────────────────────
|
|
75
|
+
export function mintEternalTrace(input) {
|
|
76
|
+
const sec = input.secret ?? defaultSecret();
|
|
77
|
+
const payload = (input.payload && typeof input.payload === "object" && !Array.isArray(input.payload))
|
|
78
|
+
? input.payload : {};
|
|
79
|
+
const contentAddress = sha256Hex(canon(payload));
|
|
80
|
+
const mintedAtMs = input.mintedAtMs ?? Date.now();
|
|
81
|
+
const body = {
|
|
82
|
+
v: PROTOCOL_VERSION,
|
|
83
|
+
contentAddress,
|
|
84
|
+
payload,
|
|
85
|
+
pinReceipts: [],
|
|
86
|
+
mintedAtMs,
|
|
87
|
+
};
|
|
88
|
+
const sig = hmacHex({ v: PROTOCOL_VERSION, contentAddress, payload, mintedAtMs }, sec);
|
|
89
|
+
return { ...body, sig };
|
|
90
|
+
}
|
|
91
|
+
export function verifyEternalTrace(t, secret) {
|
|
92
|
+
if (!t || t.v !== PROTOCOL_VERSION)
|
|
93
|
+
return false;
|
|
94
|
+
if (!/^[0-9a-f]{64}$/.test(t.contentAddress))
|
|
95
|
+
return false;
|
|
96
|
+
// Content-address must match payload hash
|
|
97
|
+
const recomputed = sha256Hex(canon(t.payload));
|
|
98
|
+
if (recomputed !== t.contentAddress)
|
|
99
|
+
return false;
|
|
100
|
+
// HMAC over (contentAddress + payload + mintedAtMs)
|
|
101
|
+
const sec = secret ?? defaultSecret();
|
|
102
|
+
const expected = hmacHex({ v: PROTOCOL_VERSION, contentAddress: t.contentAddress, payload: t.payload, mintedAtMs: t.mintedAtMs }, sec);
|
|
103
|
+
return safeEqHex(expected, t.sig);
|
|
104
|
+
}
|
|
105
|
+
// ─── PIN (record that a root has accepted custody) ────────────────────
|
|
106
|
+
export function mintPinReceipt(input) {
|
|
107
|
+
const sec = input.secret ?? defaultSecret();
|
|
108
|
+
const body = {
|
|
109
|
+
v: PROTOCOL_VERSION,
|
|
110
|
+
contentAddress: input.trace.contentAddress,
|
|
111
|
+
rootId: input.root.id,
|
|
112
|
+
rootKind: input.root.kind,
|
|
113
|
+
rootSpecificId: input.rootSpecificId,
|
|
114
|
+
pinnedAtMs: input.pinnedAtMs ?? Date.now(),
|
|
115
|
+
};
|
|
116
|
+
return { ...body, sig: hmacHex(body, sec) };
|
|
117
|
+
}
|
|
118
|
+
export function verifyPinReceipt(p, secret) {
|
|
119
|
+
if (!p || p.v !== PROTOCOL_VERSION)
|
|
120
|
+
return false;
|
|
121
|
+
const { sig, ...body } = p;
|
|
122
|
+
return safeEqHex(hmacHex(body, secret ?? defaultSecret()), sig);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Add a pin receipt to a trace. Defensive: rejects mismatched content address
|
|
126
|
+
* or duplicate (same rootId already pinned).
|
|
127
|
+
*/
|
|
128
|
+
export function attachPin(input) {
|
|
129
|
+
if (input.pin.contentAddress !== input.trace.contentAddress)
|
|
130
|
+
return input.trace;
|
|
131
|
+
if (!verifyPinReceipt(input.pin, input.secret))
|
|
132
|
+
return input.trace;
|
|
133
|
+
if (input.trace.pinReceipts.some((p) => p.rootId === input.pin.rootId))
|
|
134
|
+
return input.trace;
|
|
135
|
+
return { ...input.trace, pinReceipts: [...input.trace.pinReceipts, input.pin] };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Canonical scenarios used to compute SurvivalScore. Caller may extend.
|
|
139
|
+
* Each scenario lists the storage-root KINDS that would be lost.
|
|
140
|
+
*/
|
|
141
|
+
export const DEFAULT_SURVIVAL_SCENARIOS = Object.freeze([
|
|
142
|
+
{ name: "vendor_death", description: "AI vendor (OpenAI/Anthropic) shuts down or pivots", rootKindsLost: [] }, // affects nothing in our roots (vendor logs lost but our pins safe)
|
|
143
|
+
{ name: "laptop_fire", description: "User's primary laptop destroyed", rootKindsLost: ["local_disk"] },
|
|
144
|
+
{ name: "github_outage", description: "GitHub goes down or bans account", rootKindsLost: ["git_repo"] },
|
|
145
|
+
{ name: "isp_block", description: "ISP blocks IPFS / S3 access", rootKindsLost: ["ipfs_node", "s3_bucket"] },
|
|
146
|
+
{ name: "physical_theft", description: "USB stick stolen + laptop confiscated", rootKindsLost: ["local_disk", "usb_stick"] },
|
|
147
|
+
{ name: "cloud_provider_death", description: "AWS region dies (S3 + EC2 lost)", rootKindsLost: ["s3_bucket"] },
|
|
148
|
+
{ name: "jurisdiction_seizure_us", description: "US government seizes US-hosted infrastructure", rootKindsLost: [], jurisdictionLost: "US" },
|
|
149
|
+
{ name: "jurisdiction_seizure_eu", description: "EU jurisdiction seizes EU-hosted infrastructure", rootKindsLost: [], jurisdictionLost: "EU" },
|
|
150
|
+
{ name: "total_digital_apocalypse", description: "All digital infrastructure offline — only printed QR survives", rootKindsLost: ["local_disk", "git_repo", "ipfs_node", "s3_bucket", "usb_stick"] },
|
|
151
|
+
]);
|
|
152
|
+
/** Survival check for a single scenario. */
|
|
153
|
+
function survivesScenario(trace, roots, scenario) {
|
|
154
|
+
const lostKinds = new Set(scenario.rootKindsLost);
|
|
155
|
+
const pinnedRootIds = new Set(trace.pinReceipts.map((p) => p.rootId));
|
|
156
|
+
let surviving = 0;
|
|
157
|
+
for (const r of roots) {
|
|
158
|
+
if (!pinnedRootIds.has(r.id))
|
|
159
|
+
continue;
|
|
160
|
+
if (lostKinds.has(r.kind))
|
|
161
|
+
continue;
|
|
162
|
+
if (scenario.jurisdictionLost && r.jurisdictionTag === scenario.jurisdictionLost)
|
|
163
|
+
continue;
|
|
164
|
+
surviving++;
|
|
165
|
+
}
|
|
166
|
+
return { survived: surviving > 0, remainingRoots: surviving };
|
|
167
|
+
}
|
|
168
|
+
export function computeSurvivalScore(input) {
|
|
169
|
+
const scenarios = input.scenarios ?? DEFAULT_SURVIVAL_SCENARIOS;
|
|
170
|
+
const roots = input.roots;
|
|
171
|
+
const breakdown = [];
|
|
172
|
+
let survived = 0;
|
|
173
|
+
for (const sc of scenarios) {
|
|
174
|
+
const r = survivesScenario(input.trace, roots, sc);
|
|
175
|
+
breakdown.push({ name: sc.name, survived: r.survived, remainingRoots: r.remainingRoots });
|
|
176
|
+
if (r.survived)
|
|
177
|
+
survived++;
|
|
178
|
+
}
|
|
179
|
+
const kindSet = new Set();
|
|
180
|
+
const jurisdictionSet = new Set();
|
|
181
|
+
for (const p of input.trace.pinReceipts) {
|
|
182
|
+
const r = roots.find((x) => x.id === p.rootId);
|
|
183
|
+
if (r) {
|
|
184
|
+
kindSet.add(r.kind);
|
|
185
|
+
if (r.jurisdictionTag)
|
|
186
|
+
jurisdictionSet.add(r.jurisdictionTag);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
v: PROTOCOL_VERSION,
|
|
191
|
+
contentAddress: input.trace.contentAddress,
|
|
192
|
+
totalScenarios: scenarios.length,
|
|
193
|
+
scenariosSurvived: survived,
|
|
194
|
+
scenarioBreakdown: breakdown,
|
|
195
|
+
survivalPct: scenarios.length > 0 ? Math.round((survived / scenarios.length) * 10000) / 100 : 0,
|
|
196
|
+
rootDiversity: kindSet.size,
|
|
197
|
+
jurisdictionDiversity: jurisdictionSet.size,
|
|
198
|
+
computedAtMs: input.nowMs ?? Date.now(),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
export function mintSurvivalCertificate(input) {
|
|
202
|
+
const stillPinned = input.trace.pinReceipts.some((p) => p.rootId === input.survivingRootId);
|
|
203
|
+
if (!stillPinned)
|
|
204
|
+
return null;
|
|
205
|
+
const sec = input.secret ?? defaultSecret();
|
|
206
|
+
const body = {
|
|
207
|
+
v: PROTOCOL_VERSION,
|
|
208
|
+
contentAddress: input.trace.contentAddress,
|
|
209
|
+
survivingRootId: input.survivingRootId,
|
|
210
|
+
reconstructedAtMs: input.reconstructedAtMs ?? Date.now(),
|
|
211
|
+
};
|
|
212
|
+
return { ...body, sig: hmacHex(body, sec) };
|
|
213
|
+
}
|
|
214
|
+
export function verifySurvivalCertificate(cert, secret) {
|
|
215
|
+
if (!cert || cert.v !== PROTOCOL_VERSION)
|
|
216
|
+
return false;
|
|
217
|
+
const { sig, ...body } = cert;
|
|
218
|
+
return safeEqHex(hmacHex(body, secret ?? defaultSecret()), sig);
|
|
219
|
+
}
|
|
220
|
+
export function resolveTrace(input) {
|
|
221
|
+
const pinned = new Set(input.trace.pinReceipts.map((p) => p.rootId));
|
|
222
|
+
return {
|
|
223
|
+
found: pinned.size > 0,
|
|
224
|
+
contentAddress: input.trace.contentAddress,
|
|
225
|
+
pinnedAtRootIds: Array.from(pinned).sort(),
|
|
226
|
+
notPinnedAtRootIds: input.roots.filter((r) => !pinned.has(r.id)).map((r) => r.id).sort(),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
export function computeEternityStats(input) {
|
|
230
|
+
let totalPins = 0;
|
|
231
|
+
const rootIds = new Set();
|
|
232
|
+
let survivalSum = 0;
|
|
233
|
+
for (const t of input.traces) {
|
|
234
|
+
totalPins += t.pinReceipts.length;
|
|
235
|
+
for (const p of t.pinReceipts)
|
|
236
|
+
rootIds.add(p.rootId);
|
|
237
|
+
const survival = computeSurvivalScore({ trace: t, roots: input.roots, scenarios: input.scenarios });
|
|
238
|
+
survivalSum += survival.survivalPct;
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
totalTraces: input.traces.length,
|
|
242
|
+
totalPins,
|
|
243
|
+
meanPinsPerTrace: input.traces.length > 0 ? Math.round((totalPins / input.traces.length) * 100) / 100 : 0,
|
|
244
|
+
uniqueRoots: rootIds.size,
|
|
245
|
+
meanSurvivalPct: input.traces.length > 0 ? Math.round((survivalSum / input.traces.length) * 100) / 100 : 0,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
export function formatEternityLine(s) {
|
|
249
|
+
return `♾ ETERNITY · ${s.totalTraces} traces · ${s.totalPins} pins · ${s.uniqueRoots} roots · ${s.meanSurvivalPct}% mean survival`;
|
|
250
|
+
}
|
|
251
|
+
export const ETERNITY_TUNABLES = Object.freeze({
|
|
252
|
+
PROTOCOL_VERSION,
|
|
253
|
+
DEFAULT_SCENARIOS_COUNT: DEFAULT_SURVIVAL_SCENARIOS.length,
|
|
254
|
+
});
|
|
255
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eternity/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"honesty_gate.test.d.ts","sourceRoot":"","sources":["../../src/honesty_gate/honesty_gate.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { parseClaims, verifyClaims, computeHonestyStats, formatHonestyLine, HONESTY_GATE_TUNABLES, } from "./index.js";
|
|
3
|
+
const RUNTIME = {
|
|
4
|
+
mcpToolNames: new Set(["mneme.synapse.sync_export", "mneme.handoff.snapshot", "mneme.truth.forensic"]),
|
|
5
|
+
cliCommands: new Set(["browse", "suggest", "status"]),
|
|
6
|
+
starterCount: 30,
|
|
7
|
+
newToolsThisRelease: 5,
|
|
8
|
+
frameworkCount: 6,
|
|
9
|
+
};
|
|
10
|
+
describe("v2.19.35 HONESTY GATE — parseClaims", () => {
|
|
11
|
+
it("parses STARTER count claim 'STARTER 13→35'", () => {
|
|
12
|
+
const claims = parseClaims("STARTER 13→35 because reasons");
|
|
13
|
+
const c = claims.find((x) => x.kind === "starter_count_mismatch");
|
|
14
|
+
expect(c).toBeDefined();
|
|
15
|
+
expect(c.value).toBe(35);
|
|
16
|
+
});
|
|
17
|
+
it("parses STARTER count with arrow variants ('STARTER N to M', 'N -> M')", () => {
|
|
18
|
+
const claims1 = parseClaims("STARTER tier expanded 13 to 35");
|
|
19
|
+
const claims2 = parseClaims("STARTER 22 -> 45");
|
|
20
|
+
expect(claims1.find((x) => x.value === 35)).toBeDefined();
|
|
21
|
+
expect(claims2.find((x) => x.value === 45)).toBeDefined();
|
|
22
|
+
});
|
|
23
|
+
it("parses '+ mneme.X.Y' new MCP tool claims", () => {
|
|
24
|
+
const claims = parseClaims("+ mneme.handoff.snapshot + mneme.fork.record");
|
|
25
|
+
const tools = claims.filter((c) => c.kind === "missing_mcp_tool").map((c) => c.value);
|
|
26
|
+
expect(tools).toContain("mneme.handoff.snapshot");
|
|
27
|
+
expect(tools).toContain("mneme.fork.record");
|
|
28
|
+
});
|
|
29
|
+
it("parses '+ mneme X' 2-part CLI command claims", () => {
|
|
30
|
+
const claims = parseClaims("+ mneme browse + mneme suggest");
|
|
31
|
+
const cmds = claims.filter((c) => c.kind === "missing_cli_command").map((c) => c.value);
|
|
32
|
+
expect(cmds).toContain("browse");
|
|
33
|
+
expect(cmds).toContain("suggest");
|
|
34
|
+
});
|
|
35
|
+
it("parses 'N new MCP tools'", () => {
|
|
36
|
+
const claims = parseClaims("Ships 20 new MCP tools this release");
|
|
37
|
+
const c = claims.find((x) => x.kind === "tool_count_below_claim");
|
|
38
|
+
expect(c.value).toBe(20);
|
|
39
|
+
});
|
|
40
|
+
it("parses 'N compliance frameworks'", () => {
|
|
41
|
+
const claims = parseClaims("auto-mapped to 6 compliance frameworks");
|
|
42
|
+
const c = claims.find((x) => x.kind === "framework_count_mismatch");
|
|
43
|
+
expect(c.value).toBe(6);
|
|
44
|
+
});
|
|
45
|
+
it("DEFENSIVE: empty / non-string body returns []", () => {
|
|
46
|
+
expect(parseClaims("")).toEqual([]);
|
|
47
|
+
expect(parseClaims(null)).toEqual([]);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe("v2.19.35 HONESTY GATE — verifyClaims", () => {
|
|
51
|
+
it("STARTER claim PASSES when runtime ≥ claim", () => {
|
|
52
|
+
const claims = parseClaims("STARTER 13→25");
|
|
53
|
+
const v = verifyClaims({ claims, runtime: RUNTIME });
|
|
54
|
+
expect(v.verdict).toBe("PASS");
|
|
55
|
+
});
|
|
56
|
+
it("STARTER claim FAILS when runtime < claim", () => {
|
|
57
|
+
const claims = parseClaims("STARTER 13→100");
|
|
58
|
+
const v = verifyClaims({ claims, runtime: RUNTIME });
|
|
59
|
+
expect(v.verdict).toBe("FAIL");
|
|
60
|
+
expect(v.violations[0].expected).toBe(100);
|
|
61
|
+
expect(v.violations[0].actual).toBe(30);
|
|
62
|
+
});
|
|
63
|
+
it("MCP tool claim FAILS when tool not in runtime catalog", () => {
|
|
64
|
+
const claims = parseClaims("+ mneme.imaginary.tool");
|
|
65
|
+
const v = verifyClaims({ claims, runtime: RUNTIME });
|
|
66
|
+
expect(v.verdict).toBe("FAIL");
|
|
67
|
+
expect(v.violations[0].kind).toBe("missing_mcp_tool");
|
|
68
|
+
});
|
|
69
|
+
it("MCP tool claim PASSES when tool is registered", () => {
|
|
70
|
+
const claims = parseClaims("+ mneme.synapse.sync_export");
|
|
71
|
+
const v = verifyClaims({ claims, runtime: RUNTIME });
|
|
72
|
+
expect(v.verdict).toBe("PASS");
|
|
73
|
+
});
|
|
74
|
+
it("CLI command claim FAILS when command not registered (the actual user-reported R4 bug)", () => {
|
|
75
|
+
const claims = parseClaims("+ mneme imaginary_command");
|
|
76
|
+
const v = verifyClaims({ claims, runtime: RUNTIME });
|
|
77
|
+
expect(v.verdict).toBe("FAIL");
|
|
78
|
+
expect(v.violations[0].kind).toBe("missing_cli_command");
|
|
79
|
+
});
|
|
80
|
+
it("CLI command claim PASSES when command is registered", () => {
|
|
81
|
+
const claims = parseClaims("+ mneme browse");
|
|
82
|
+
const v = verifyClaims({ claims, runtime: RUNTIME });
|
|
83
|
+
expect(v.verdict).toBe("PASS");
|
|
84
|
+
});
|
|
85
|
+
it("tool_count claim FAILS when runtime ships fewer than claimed", () => {
|
|
86
|
+
const claims = parseClaims("Ships 20 new MCP tools");
|
|
87
|
+
const v = verifyClaims({ claims, runtime: RUNTIME });
|
|
88
|
+
expect(v.verdict).toBe("FAIL");
|
|
89
|
+
expect(v.violations[0].expected).toBe(20);
|
|
90
|
+
expect(v.violations[0].actual).toBe(5);
|
|
91
|
+
});
|
|
92
|
+
it("framework_count claim PASSES when runtime ≥ claim", () => {
|
|
93
|
+
const claims = parseClaims("6 frameworks supported");
|
|
94
|
+
const v = verifyClaims({ claims, runtime: RUNTIME });
|
|
95
|
+
expect(v.verdict).toBe("PASS");
|
|
96
|
+
});
|
|
97
|
+
it("REAL R2 + R4 scenario reproduces honestly", () => {
|
|
98
|
+
// v2.19.33 whats_new claimed "STARTER 13→35 + mneme browse + mneme suggest"
|
|
99
|
+
// But actual starterCount=22, mneme browse CLI didn't exist
|
|
100
|
+
const fake_v33 = "STARTER 13→35 + mneme browse + mneme suggest";
|
|
101
|
+
const fake_runtime = {
|
|
102
|
+
...RUNTIME,
|
|
103
|
+
starterCount: 22,
|
|
104
|
+
cliCommands: new Set(["suggest"]), // browse missing
|
|
105
|
+
};
|
|
106
|
+
const claims = parseClaims(fake_v33);
|
|
107
|
+
const v = verifyClaims({ claims, runtime: fake_runtime });
|
|
108
|
+
expect(v.verdict).toBe("FAIL");
|
|
109
|
+
expect(v.violations.some((x) => x.kind === "starter_count_mismatch")).toBe(true);
|
|
110
|
+
expect(v.violations.some((x) => x.kind === "missing_cli_command" && x.expected === "browse")).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe("v2.19.35 HONESTY GATE — stats + tunables", () => {
|
|
114
|
+
it("computeHonestyStats aggregates by kind", () => {
|
|
115
|
+
const claims = parseClaims("STARTER 13→999 + mneme.imaginary.x + mneme nonexistent");
|
|
116
|
+
const v = verifyClaims({ claims, runtime: RUNTIME });
|
|
117
|
+
const s = computeHonestyStats(v);
|
|
118
|
+
expect(s.totalClaimsParsed).toBeGreaterThanOrEqual(3);
|
|
119
|
+
expect(s.violationsFound).toBeGreaterThanOrEqual(3);
|
|
120
|
+
expect(formatHonestyLine(s)).toContain("HONESTY");
|
|
121
|
+
});
|
|
122
|
+
it("5 claim kinds shipped", () => {
|
|
123
|
+
expect(HONESTY_GATE_TUNABLES.CLAIM_KINDS.length).toBe(5);
|
|
124
|
+
});
|
|
125
|
+
it("RESILIENCE: 1000 random claim-text fuzz never crash", () => {
|
|
126
|
+
const samples = ["STARTER", "+", "mneme.x.y", "+ mneme browse", "20 tools", "6 frameworks", "garbage", ""];
|
|
127
|
+
for (let i = 0; i < 1000; i++) {
|
|
128
|
+
const text = samples.map((s) => s + " " + Math.random()).join(" ");
|
|
129
|
+
expect(() => parseClaims(text)).not.toThrow();
|
|
130
|
+
const claims = parseClaims(text);
|
|
131
|
+
expect(() => verifyClaims({ claims, runtime: RUNTIME })).not.toThrow();
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=honesty_gate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"honesty_gate.test.js","sourceRoot":"","sources":["../../src/honesty_gate/honesty_gate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.35 HONESTY-AS-CI-GATE — parse whats_new claims and verify against runtime.
|
|
3
|
+
*
|
|
4
|
+
* User-audit complaint (2026-05-17):
|
|
5
|
+
* "v2.19.33 whats-new อ้าง 'STARTER 13→35' แต่จริง 22; อ้าง '+ mneme browse'
|
|
6
|
+
* แต่ CLI ตอบ unknown command. Never ship claim ที่ surface ไม่มี."
|
|
7
|
+
*
|
|
8
|
+
* v2.19.35 ships a PARSER + VERIFIER. Parses common claim shapes in the
|
|
9
|
+
* whats_new body, looks them up in the live runtime, and emits violations.
|
|
10
|
+
* Ritual gate uses this to block publish on a "lying release note".
|
|
11
|
+
*
|
|
12
|
+
* Parsed claim shapes:
|
|
13
|
+
*
|
|
14
|
+
* - "STARTER N→M" / "STARTER N→M" → assert STARTER_WHITELIST.size >= M (or matches)
|
|
15
|
+
* - "+ mneme.X.Y" / "+ mneme X Y" → assert MCP tool exists by exact name
|
|
16
|
+
* - "N new MCP tools" → assert at least N tools added in this version
|
|
17
|
+
* - "N total MCP tools" → assert live catalog size matches
|
|
18
|
+
* - "+ mneme X" (2-part) → assert CLI top-level command exists
|
|
19
|
+
*
|
|
20
|
+
* Honest defaults: parser is conservative — only flags violations it can
|
|
21
|
+
* PROVE (not guess). Wisdom: "never ship a claim the surface doesn't back."
|
|
22
|
+
*
|
|
23
|
+
* Composes onto:
|
|
24
|
+
* - REINCARNATION RITUAL (script consumes this module's parser + verifier)
|
|
25
|
+
* - v2.19.33 release-claims (already enforces exact-tool-name match;
|
|
26
|
+
* honesty_gate adds release-note-claim match)
|
|
27
|
+
*
|
|
28
|
+
* Honest scope:
|
|
29
|
+
* - PURE FUNCTION parser + verifier. Never throws. Caller supplies runtime view.
|
|
30
|
+
* - 1000+ random claim-text fuzz iterations verified.
|
|
31
|
+
*/
|
|
32
|
+
declare const PROTOCOL_VERSION: 1;
|
|
33
|
+
export type ClaimViolationKind = "starter_count_mismatch" | "missing_mcp_tool" | "missing_cli_command" | "tool_count_below_claim" | "framework_count_mismatch";
|
|
34
|
+
export interface ParsedClaim {
|
|
35
|
+
/** Original text fragment that matched. */
|
|
36
|
+
fragment: string;
|
|
37
|
+
/** Kind of assertion this claim makes. */
|
|
38
|
+
kind: ClaimViolationKind;
|
|
39
|
+
/** Structured value derived from the claim. */
|
|
40
|
+
value: number | string;
|
|
41
|
+
}
|
|
42
|
+
export interface ClaimViolation {
|
|
43
|
+
kind: ClaimViolationKind;
|
|
44
|
+
fragment: string;
|
|
45
|
+
expected: number | string;
|
|
46
|
+
actual: number | string;
|
|
47
|
+
detail: string;
|
|
48
|
+
}
|
|
49
|
+
export interface HonestyVerdict {
|
|
50
|
+
v: typeof PROTOCOL_VERSION;
|
|
51
|
+
totalClaims: number;
|
|
52
|
+
violationCount: number;
|
|
53
|
+
violations: ClaimViolation[];
|
|
54
|
+
/** PASS only when 0 violations. */
|
|
55
|
+
verdict: "PASS" | "FAIL";
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse a whats_new body for verifiable claims. Pure heuristic; conservative —
|
|
59
|
+
* only matches HIGH-PRECISION patterns that the verifier can prove against
|
|
60
|
+
* runtime. Caller can pass custom patterns in the future.
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseClaims(body: string): ParsedClaim[];
|
|
63
|
+
export interface RuntimeView {
|
|
64
|
+
/** Set of all MCP tool names currently registered. */
|
|
65
|
+
mcpToolNames: Set<string>;
|
|
66
|
+
/** Set of all top-level CLI commands (and their aliases). */
|
|
67
|
+
cliCommands: Set<string>;
|
|
68
|
+
/** Current STARTER_WHITELIST size. */
|
|
69
|
+
starterCount: number;
|
|
70
|
+
/** Number of MCP tools added in THIS release (i.e., delta vs prior version). */
|
|
71
|
+
newToolsThisRelease: number;
|
|
72
|
+
/** Compliance frameworks registered (for honesty about "6 frameworks"). */
|
|
73
|
+
frameworkCount: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Verify parsed claims against the runtime view. Returns violations + PASS/FAIL.
|
|
77
|
+
* A claim PASSES if the runtime view matches OR exceeds the claim (we never
|
|
78
|
+
* complain about under-claiming).
|
|
79
|
+
*/
|
|
80
|
+
export declare function verifyClaims(input: {
|
|
81
|
+
claims: ParsedClaim[];
|
|
82
|
+
runtime: RuntimeView;
|
|
83
|
+
}): HonestyVerdict;
|
|
84
|
+
export interface HonestyStats {
|
|
85
|
+
totalClaimsParsed: number;
|
|
86
|
+
violationsFound: number;
|
|
87
|
+
violationsByKind: Record<ClaimViolationKind, number>;
|
|
88
|
+
}
|
|
89
|
+
export declare function computeHonestyStats(verdict: HonestyVerdict): HonestyStats;
|
|
90
|
+
export declare function formatHonestyLine(s: HonestyStats): string;
|
|
91
|
+
export declare const HONESTY_GATE_TUNABLES: Readonly<{
|
|
92
|
+
PROTOCOL_VERSION: 1;
|
|
93
|
+
CLAIM_KINDS: ReadonlyArray<ClaimViolationKind>;
|
|
94
|
+
}>;
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/honesty_gate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAEpC,MAAM,MAAM,kBAAkB,GAC1B,wBAAwB,GACxB,kBAAkB,GAClB,qBAAqB,GACrB,wBAAwB,GACxB,0BAA0B,CAAC;AAE/B,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,IAAI,EAAE,kBAAkB,CAAC;IACzB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,mCAAmC;IACnC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAsDvD;AAED,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,6DAA6D;IAC7D,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;CACtB,GAAG,cAAc,CAoEjB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;CACtD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CAczE;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAEzD;AAED,eAAO,MAAM,qBAAqB;;iBAE4G,aAAa,CAAC,kBAAkB,CAAC;EAC7K,CAAC"}
|