@mneme-ai/core 2.19.14 → 2.19.16
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/cosmic/aurelian_v1915.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1915.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1915.test.js +34 -0
- package/dist/cosmic/aurelian_v1915.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1916.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1916.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1916.test.js +47 -0
- package/dist/cosmic/aurelian_v1916.test.js.map +1 -0
- package/dist/federated_truth/federated_truth.test.d.ts +2 -0
- package/dist/federated_truth/federated_truth.test.d.ts.map +1 -0
- package/dist/federated_truth/federated_truth.test.js +301 -0
- package/dist/federated_truth/federated_truth.test.js.map +1 -0
- package/dist/federated_truth/index.d.ts +180 -0
- package/dist/federated_truth/index.d.ts.map +1 -0
- package/dist/federated_truth/index.js +302 -0
- package/dist/federated_truth/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/truth_forensic_pipeline/index.d.ts +133 -0
- package/dist/truth_forensic_pipeline/index.d.ts.map +1 -0
- package/dist/truth_forensic_pipeline/index.js +346 -0
- package/dist/truth_forensic_pipeline/index.js.map +1 -0
- package/dist/truth_forensic_pipeline/truth_forensic_pipeline.test.d.ts +2 -0
- package/dist/truth_forensic_pipeline/truth_forensic_pipeline.test.d.ts.map +1 -0
- package/dist/truth_forensic_pipeline/truth_forensic_pipeline.test.js +256 -0
- package/dist/truth_forensic_pipeline/truth_forensic_pipeline.test.js.map +1 -0
- 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 +8 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.15 — MNEME TRUTH FORENSIC PIPELINE (the verify command that calls its own bluff)
|
|
3
|
+
*
|
|
4
|
+
* "Every AI verify tool today asks the wrong question: 'is this claim
|
|
5
|
+
* supported?'. It scrapes the codebase for keyword matches and rubber-
|
|
6
|
+
* stamps anything that has a hit. When the claim says 'Mneme registers
|
|
7
|
+
* 4 mneme.nexus.* tools', it sees the words 'mneme' and 'tools' in
|
|
8
|
+
* the codebase and certifies TRUSTWORTHY — even if the actual count
|
|
9
|
+
* is 0. This is the W2 disease.
|
|
10
|
+
*
|
|
11
|
+
* Mneme's TRUTH FORENSIC PIPELINE inverts the question: 'what would
|
|
12
|
+
* REFUTE this claim, and have we searched + failed to find every
|
|
13
|
+
* refutation?'. For the AI-tool-self-description class (which is the
|
|
14
|
+
* most common verify target for AI agents) we ship a SNIFFER that
|
|
15
|
+
* extracts verifiable assertions (mneme.X.Y exists, 'N mneme.X.*
|
|
16
|
+
* tools', 'ships M MCP tools', version=X) and CHECKS them against
|
|
17
|
+
* Mneme's own ground truth (the live MCP catalog + installed version).
|
|
18
|
+
*
|
|
19
|
+
* For self-description claims, the pipeline is VENDOR-AGNOSTIC AND
|
|
20
|
+
* OFFLINE — no LLM call needed. For generic claims, it composes onto
|
|
21
|
+
* INVERSE-LLM (v2.19.3) + NEGATIVE-EVIDENCE (v2.19.13) for the same
|
|
22
|
+
* burden-of-proof inversion. The W2 lie becomes structurally
|
|
23
|
+
* impossible."
|
|
24
|
+
*
|
|
25
|
+
* Architecture:
|
|
26
|
+
* - 5 built-in SNIFFERS that extract verifiable assertions from claim text:
|
|
27
|
+
* • sniffMcpToolExact: "ships mneme.X.Y" / "registers mneme.X.Y"
|
|
28
|
+
* • sniffMcpFamilyCount: "N mneme.X.* tools"
|
|
29
|
+
* • sniffMcpTotalCount: "ships N MCP tools" / "N tools total"
|
|
30
|
+
* • sniffVersion: "v2.19.X" / "version 2.19.X"
|
|
31
|
+
* • sniffFilePath: "the file packages/.../foo.ts"
|
|
32
|
+
* - `forensicVerify({claim, mcpCatalog, installedVersion, ...})` —
|
|
33
|
+
* parse assertions → check each against ground truth → apply
|
|
34
|
+
* negative-evidence rules → issue HMAC-signed certificate.
|
|
35
|
+
* - Verdict bands: ACCEPTED + cert / REJECTED + defeating evidence /
|
|
36
|
+
* UNKNOWN + untested assertions.
|
|
37
|
+
*
|
|
38
|
+
* Honest scope:
|
|
39
|
+
* - Built-in sniffers cover AI-tool-self-description claims (the W2
|
|
40
|
+
* class). For generic factual claims, caller supplies refutations +
|
|
41
|
+
* search outcomes (composes onto v2.19.13 NEGATIVE-EVIDENCE).
|
|
42
|
+
* - "ACCEPTED" means every SNIFFED assertion grounded. Untested
|
|
43
|
+
* unsniffable claim text doesn't auto-accept — it returns UNKNOWN
|
|
44
|
+
* unless caller supplies vendor refutations + searches.
|
|
45
|
+
* - Certificate is HMAC-signed so a forged verdict is detectable.
|
|
46
|
+
*/
|
|
47
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
48
|
+
const PROTOCOL_VERSION = 1;
|
|
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_TRUTH_SECRET"] || `mneme-truth-forensic-v${PROTOCOL_VERSION}`;
|
|
59
|
+
}
|
|
60
|
+
function sha256Hex(s) {
|
|
61
|
+
return createHmac("sha256", "mneme-truth-claim-id").update(s).digest("hex");
|
|
62
|
+
}
|
|
63
|
+
function signCertificate(body, secret) {
|
|
64
|
+
return createHmac("sha256", secret).update(canon(body)).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
|
+
// ─── SNIFFERS ────────────────────────────────────────────────────────────
|
|
75
|
+
/** Extract exact `mneme.X.Y` tool-name mentions from claim text. */
|
|
76
|
+
export function sniffMcpToolExact(claim) {
|
|
77
|
+
const re = /\bmneme\.[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_]*\b/g;
|
|
78
|
+
const hits = new Set();
|
|
79
|
+
let m;
|
|
80
|
+
while ((m = re.exec(claim)) !== null)
|
|
81
|
+
hits.add(m[0]);
|
|
82
|
+
return Array.from(hits).map((name) => ({
|
|
83
|
+
kind: "mcp_tool_exact",
|
|
84
|
+
asserted: `MCP tool '${name}' is registered`,
|
|
85
|
+
value: { toolName: name },
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
/** Extract "N mneme.X.* tools" family-count assertions. */
|
|
89
|
+
export function sniffMcpFamilyCount(claim) {
|
|
90
|
+
const re = /\b(\d+)\s+mneme\.([a-z_][a-z0-9_]*)\.(\*|tools?)\s*(?:mcp\s+)?(?:tools?)?/gi;
|
|
91
|
+
const re2 = /\bregisters?\s+(\d+)\s+mneme\.([a-z_][a-z0-9_]*)\.\*/gi;
|
|
92
|
+
const hits = new Map();
|
|
93
|
+
for (const r of [re, re2]) {
|
|
94
|
+
let m;
|
|
95
|
+
while ((m = r.exec(claim)) !== null) {
|
|
96
|
+
const n = parseInt(m[1], 10);
|
|
97
|
+
const family = m[2].toLowerCase();
|
|
98
|
+
// Last-wins per family (claim might restate)
|
|
99
|
+
hits.set(family, n);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return Array.from(hits.entries()).map(([family, n]) => ({
|
|
103
|
+
kind: "mcp_family_count",
|
|
104
|
+
asserted: `MCP family 'mneme.${family}.*' has exactly ${n} tools`,
|
|
105
|
+
value: { family, expectedCount: n },
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
/** Extract "ships N MCP tools" / "N tools total" claims. */
|
|
109
|
+
export function sniffMcpTotalCount(claim) {
|
|
110
|
+
const patterns = [
|
|
111
|
+
/\bships?\s+(\d+)\s+mcp\s+tools?\b/i,
|
|
112
|
+
/\b(\d+)\s+(?:total\s+)?mcp\s+tools?\b/i,
|
|
113
|
+
/\bregisters?\s+(\d+)\s+(?:total\s+)?mcp\s+tools?\b/i,
|
|
114
|
+
/\b(\d+)\s+tools?\s+total\b/i,
|
|
115
|
+
];
|
|
116
|
+
for (const re of patterns) {
|
|
117
|
+
const m = claim.match(re);
|
|
118
|
+
if (m) {
|
|
119
|
+
const n = parseInt(m[1], 10);
|
|
120
|
+
return [{
|
|
121
|
+
kind: "mcp_total_count",
|
|
122
|
+
asserted: `Mneme ships exactly ${n} MCP tools total`,
|
|
123
|
+
value: { expectedCount: n },
|
|
124
|
+
}];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
/** Extract "v2.19.X" / "version 2.19.X" version claims. */
|
|
130
|
+
export function sniffVersion(claim) {
|
|
131
|
+
const re = /\bv?(\d+\.\d+\.\d+)\b/g;
|
|
132
|
+
const hits = new Set();
|
|
133
|
+
let m;
|
|
134
|
+
while ((m = re.exec(claim)) !== null)
|
|
135
|
+
hits.add(m[1]);
|
|
136
|
+
return Array.from(hits).map((ver) => ({
|
|
137
|
+
kind: "version_exact",
|
|
138
|
+
asserted: `installed version equals ${ver}`,
|
|
139
|
+
value: { version: ver },
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
/** Extract file paths mentioned in claim. */
|
|
143
|
+
export function sniffFilePath(claim) {
|
|
144
|
+
const re = /\b((?:packages|scripts|tests|src)\/[\w./-]+\.(?:ts|tsx|js|mjs|cjs|md|json|mdx))\b/g;
|
|
145
|
+
const hits = new Set();
|
|
146
|
+
let m;
|
|
147
|
+
while ((m = re.exec(claim)) !== null)
|
|
148
|
+
hits.add(m[1]);
|
|
149
|
+
return Array.from(hits).map((p) => ({
|
|
150
|
+
kind: "file_path",
|
|
151
|
+
asserted: `file '${p}' exists`,
|
|
152
|
+
value: { path: p },
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
export function sniffAllAssertions(claim) {
|
|
156
|
+
return [
|
|
157
|
+
...sniffMcpToolExact(claim),
|
|
158
|
+
...sniffMcpFamilyCount(claim),
|
|
159
|
+
...sniffMcpTotalCount(claim),
|
|
160
|
+
...sniffVersion(claim),
|
|
161
|
+
...sniffFilePath(claim),
|
|
162
|
+
];
|
|
163
|
+
}
|
|
164
|
+
function checkAssertion(a, gt) {
|
|
165
|
+
if (a.kind === "mcp_tool_exact") {
|
|
166
|
+
const v = a.value;
|
|
167
|
+
if (!gt.mcpCatalog) {
|
|
168
|
+
return { kind: a.kind, asserted: a.asserted, sub_verdict: "untested", evidence: "no mcpCatalog supplied to checker" };
|
|
169
|
+
}
|
|
170
|
+
const found = gt.mcpCatalog.includes(v.toolName);
|
|
171
|
+
return {
|
|
172
|
+
kind: a.kind,
|
|
173
|
+
asserted: a.asserted,
|
|
174
|
+
sub_verdict: found ? "supported" : "refuted",
|
|
175
|
+
evidence: found ? `tool '${v.toolName}' is in the live MCP catalog` : `tool '${v.toolName}' NOT FOUND in the live MCP catalog (${gt.mcpCatalog.length} tools registered)`,
|
|
176
|
+
observed: found,
|
|
177
|
+
expected: true,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
if (a.kind === "mcp_family_count") {
|
|
181
|
+
const v = a.value;
|
|
182
|
+
if (!gt.mcpCatalog) {
|
|
183
|
+
return { kind: a.kind, asserted: a.asserted, sub_verdict: "untested", evidence: "no mcpCatalog supplied" };
|
|
184
|
+
}
|
|
185
|
+
const prefix = `mneme.${v.family}.`;
|
|
186
|
+
const actual = gt.mcpCatalog.filter((t) => t.startsWith(prefix)).length;
|
|
187
|
+
const supported = actual === v.expectedCount;
|
|
188
|
+
return {
|
|
189
|
+
kind: a.kind,
|
|
190
|
+
asserted: a.asserted,
|
|
191
|
+
sub_verdict: supported ? "supported" : "refuted",
|
|
192
|
+
evidence: supported
|
|
193
|
+
? `live catalog has exactly ${actual} tools matching '${prefix}*'`
|
|
194
|
+
: `live catalog has ${actual} tools matching '${prefix}*', not ${v.expectedCount} — claim refuted`,
|
|
195
|
+
observed: actual,
|
|
196
|
+
expected: v.expectedCount,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (a.kind === "mcp_total_count") {
|
|
200
|
+
const v = a.value;
|
|
201
|
+
if (!gt.mcpCatalog) {
|
|
202
|
+
return { kind: a.kind, asserted: a.asserted, sub_verdict: "untested", evidence: "no mcpCatalog supplied" };
|
|
203
|
+
}
|
|
204
|
+
const actual = gt.mcpCatalog.length;
|
|
205
|
+
const supported = actual === v.expectedCount;
|
|
206
|
+
return {
|
|
207
|
+
kind: a.kind,
|
|
208
|
+
asserted: a.asserted,
|
|
209
|
+
sub_verdict: supported ? "supported" : "refuted",
|
|
210
|
+
evidence: supported
|
|
211
|
+
? `live catalog has exactly ${actual} tools`
|
|
212
|
+
: `live catalog has ${actual} tools, not ${v.expectedCount} — claim refuted`,
|
|
213
|
+
observed: actual,
|
|
214
|
+
expected: v.expectedCount,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (a.kind === "version_exact") {
|
|
218
|
+
const v = a.value;
|
|
219
|
+
if (!gt.installedVersion) {
|
|
220
|
+
return { kind: a.kind, asserted: a.asserted, sub_verdict: "untested", evidence: "no installedVersion supplied" };
|
|
221
|
+
}
|
|
222
|
+
const supported = gt.installedVersion === v.version;
|
|
223
|
+
return {
|
|
224
|
+
kind: a.kind,
|
|
225
|
+
asserted: a.asserted,
|
|
226
|
+
sub_verdict: supported ? "supported" : "refuted",
|
|
227
|
+
evidence: supported
|
|
228
|
+
? `installed version is ${gt.installedVersion}`
|
|
229
|
+
: `installed version is ${gt.installedVersion}, not ${v.version} — claim refuted`,
|
|
230
|
+
observed: gt.installedVersion,
|
|
231
|
+
expected: v.version,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
if (a.kind === "file_path") {
|
|
235
|
+
const v = a.value;
|
|
236
|
+
if (!gt.fileExists) {
|
|
237
|
+
return { kind: a.kind, asserted: a.asserted, sub_verdict: "untested", evidence: "no fileExists checker supplied" };
|
|
238
|
+
}
|
|
239
|
+
const found = gt.fileExists(v.path);
|
|
240
|
+
return {
|
|
241
|
+
kind: a.kind,
|
|
242
|
+
asserted: a.asserted,
|
|
243
|
+
sub_verdict: found ? "supported" : "refuted",
|
|
244
|
+
evidence: found ? `file '${v.path}' exists on disk` : `file '${v.path}' does NOT exist — claim refuted`,
|
|
245
|
+
observed: found,
|
|
246
|
+
expected: true,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
return { kind: a.kind, asserted: a.asserted, sub_verdict: "untested", evidence: "unknown assertion kind" };
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Run the full forensic pipeline:
|
|
253
|
+
* 1. Sniff assertions from claim text.
|
|
254
|
+
* 2. Check each against ground truth.
|
|
255
|
+
* 3. Apply negative-evidence rule:
|
|
256
|
+
* ANY assertion 'refuted' → REJECTED
|
|
257
|
+
* else ALL assertions 'supported' → ACCEPTED
|
|
258
|
+
* else (some 'untested' / no sniff hits) → UNKNOWN
|
|
259
|
+
* 4. Issue HMAC-signed certificate.
|
|
260
|
+
* 5. Produce plain-English explanation.
|
|
261
|
+
*/
|
|
262
|
+
export function forensicVerify(input) {
|
|
263
|
+
const ts = input.nowMs ?? Date.now();
|
|
264
|
+
const secret = input.secret ?? defaultSecret();
|
|
265
|
+
const assertions = sniffAllAssertions(input.claim);
|
|
266
|
+
const results = assertions.map((a) => checkAssertion(a, input.groundTruth ?? {}));
|
|
267
|
+
const refuted = results.filter((r) => r.sub_verdict === "refuted");
|
|
268
|
+
const supported = results.filter((r) => r.sub_verdict === "supported");
|
|
269
|
+
const untested = results.filter((r) => r.sub_verdict === "untested");
|
|
270
|
+
// Negative-evidence rule
|
|
271
|
+
let verdict;
|
|
272
|
+
if (refuted.length > 0)
|
|
273
|
+
verdict = "REJECTED";
|
|
274
|
+
else if ((input.externalRefutationsFound ?? 0) > 0)
|
|
275
|
+
verdict = "REJECTED";
|
|
276
|
+
else if (assertions.length > 0 && untested.length === 0)
|
|
277
|
+
verdict = "ACCEPTED";
|
|
278
|
+
else
|
|
279
|
+
verdict = "UNKNOWN";
|
|
280
|
+
const claimSha = sha256Hex(input.claim).slice(0, 32);
|
|
281
|
+
const certBody = {
|
|
282
|
+
v: PROTOCOL_VERSION,
|
|
283
|
+
claim: input.claim,
|
|
284
|
+
claimSha,
|
|
285
|
+
assertions: results,
|
|
286
|
+
verdict,
|
|
287
|
+
ts,
|
|
288
|
+
};
|
|
289
|
+
const cert = { ...certBody, hmac: signCertificate(certBody, secret) };
|
|
290
|
+
// Plain-English explanation
|
|
291
|
+
const lines = [];
|
|
292
|
+
if (verdict === "ACCEPTED") {
|
|
293
|
+
lines.push(`✅ TRUTH-FORENSIC verdict: ACCEPTED. Every assertion sniffed from the claim grounded against Mneme's live state.`);
|
|
294
|
+
for (const r of supported)
|
|
295
|
+
lines.push(` ✓ ${r.asserted} — ${r.evidence}`);
|
|
296
|
+
}
|
|
297
|
+
else if (verdict === "REJECTED") {
|
|
298
|
+
lines.push(`❌ TRUTH-FORENSIC verdict: REJECTED. Claim contains assertion(s) refuted by Mneme's live state — DO NOT trust this claim.`);
|
|
299
|
+
for (const r of refuted)
|
|
300
|
+
lines.push(` ✗ ${r.asserted} — ${r.evidence}`);
|
|
301
|
+
if (supported.length > 0) {
|
|
302
|
+
lines.push(`(Other parts of the claim grounded: ${supported.length} supported assertion(s).)`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
if (assertions.length === 0) {
|
|
307
|
+
lines.push(`❓ TRUTH-FORENSIC verdict: UNKNOWN. No verifiable assertions sniffed from the claim. Mneme refuses to auto-accept untested claims.`);
|
|
308
|
+
lines.push(`Tip: rephrase to include checkable specifics — e.g., a tool name 'mneme.X.Y', a count 'N mneme.X.* tools', or a file path.`);
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
lines.push(`❓ TRUTH-FORENSIC verdict: UNKNOWN. Sniffed ${assertions.length} assertion(s) but ${untested.length} could not be checked (missing ground truth).`);
|
|
312
|
+
for (const r of untested)
|
|
313
|
+
lines.push(` ? ${r.asserted} — ${r.evidence}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
verdict,
|
|
318
|
+
claim: input.claim,
|
|
319
|
+
assertions: results,
|
|
320
|
+
refutedAssertions: refuted,
|
|
321
|
+
untested: assertions.length === 0,
|
|
322
|
+
certificate: cert,
|
|
323
|
+
explanation: lines.join("\n"),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
export function verifyForensicCertificate(cert, secret) {
|
|
327
|
+
const { hmac, ...body } = cert;
|
|
328
|
+
const expected = signCertificate(body, secret ?? defaultSecret());
|
|
329
|
+
if (!safeEqHex(expected, hmac)) {
|
|
330
|
+
return { ok: false, reason: "HMAC mismatch — forged certificate or wrong secret" };
|
|
331
|
+
}
|
|
332
|
+
return { ok: true };
|
|
333
|
+
}
|
|
334
|
+
export function classifyClaim(claim) {
|
|
335
|
+
const assertions = sniffAllAssertions(claim);
|
|
336
|
+
const classes = Array.from(new Set(assertions.map((a) => a.kind)));
|
|
337
|
+
return { assertionsExpected: assertions.length, classes };
|
|
338
|
+
}
|
|
339
|
+
export function formatForensicLine(r) {
|
|
340
|
+
const tag = r.verdict === "ACCEPTED" ? "✅" : r.verdict === "REJECTED" ? "❌" : "❓";
|
|
341
|
+
const sup = r.assertions.filter((x) => x.sub_verdict === "supported").length;
|
|
342
|
+
const ref = r.refutedAssertions.length;
|
|
343
|
+
const unt = r.assertions.filter((x) => x.sub_verdict === "untested").length;
|
|
344
|
+
return `${tag} TRUTH-FORENSIC · ${r.verdict} · sniffed=${r.assertions.length} (✓${sup} ✗${ref} ?${unt})`;
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/truth_forensic_pipeline/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truth_forensic_pipeline.test.d.ts","sourceRoot":"","sources":["../../src/truth_forensic_pipeline/truth_forensic_pipeline.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { sniffMcpToolExact, sniffMcpFamilyCount, sniffMcpTotalCount, sniffVersion, sniffFilePath, sniffAllAssertions, forensicVerify, verifyForensicCertificate, classifyClaim, formatForensicLine, } from "./index.js";
|
|
3
|
+
const SECRET = "truth-test-secret-99221144";
|
|
4
|
+
// Live catalog stub used across tests
|
|
5
|
+
const CATALOG = [
|
|
6
|
+
"mneme.nexus.subscribe",
|
|
7
|
+
"mneme.nexus.publish_observation",
|
|
8
|
+
"mneme.nexus.drain",
|
|
9
|
+
"mneme.nexus.ack",
|
|
10
|
+
"mneme.confessional.audit",
|
|
11
|
+
"mneme.ghost.distill",
|
|
12
|
+
"mneme.inverse.audit",
|
|
13
|
+
];
|
|
14
|
+
describe("v2.19.15 TRUTH FORENSIC · sniffMcpToolExact", () => {
|
|
15
|
+
it("extracts every mneme.X.Y mention from claim text, dedup", () => {
|
|
16
|
+
const a = sniffMcpToolExact("ships mneme.nexus.subscribe and mneme.inverse.audit and mneme.nexus.subscribe again");
|
|
17
|
+
expect(a.map((x) => x.value.toolName).sort()).toEqual([
|
|
18
|
+
"mneme.inverse.audit",
|
|
19
|
+
"mneme.nexus.subscribe",
|
|
20
|
+
]);
|
|
21
|
+
});
|
|
22
|
+
it("ignores partial matches (mneme.X without action)", () => {
|
|
23
|
+
const a = sniffMcpToolExact("mneme is great; mneme.nexus has tools");
|
|
24
|
+
expect(a).toHaveLength(0);
|
|
25
|
+
});
|
|
26
|
+
it("handles snake_case actions", () => {
|
|
27
|
+
const a = sniffMcpToolExact("mneme.nexus.publish_observation is registered");
|
|
28
|
+
expect(a).toHaveLength(1);
|
|
29
|
+
expect(a[0].value.toolName).toBe("mneme.nexus.publish_observation");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe("v2.19.15 TRUTH FORENSIC · sniffMcpFamilyCount", () => {
|
|
33
|
+
it("extracts 'N mneme.X.* tools' pattern", () => {
|
|
34
|
+
const a = sniffMcpFamilyCount("Mneme v2.19.14 registers 4 mneme.nexus.* MCP tools");
|
|
35
|
+
expect(a).toHaveLength(1);
|
|
36
|
+
expect(a[0].value).toEqual({ family: "nexus", expectedCount: 4 });
|
|
37
|
+
});
|
|
38
|
+
it("extracts 'registers N mneme.X.*' variant", () => {
|
|
39
|
+
const a = sniffMcpFamilyCount("registers 3 mneme.inverse.* tools");
|
|
40
|
+
expect(a).toHaveLength(1);
|
|
41
|
+
});
|
|
42
|
+
it("handles multiple families in one claim", () => {
|
|
43
|
+
const a = sniffMcpFamilyCount("ships 5 mneme.nexus.* tools and 3 mneme.ghost.* tools");
|
|
44
|
+
expect(a).toHaveLength(2);
|
|
45
|
+
const fams = a.map((x) => x.value.family).sort();
|
|
46
|
+
expect(fams).toEqual(["ghost", "nexus"]);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe("v2.19.15 TRUTH FORENSIC · sniffMcpTotalCount", () => {
|
|
50
|
+
it("extracts 'ships N MCP tools' pattern", () => {
|
|
51
|
+
const a = sniffMcpTotalCount("Mneme ships 508 MCP tools");
|
|
52
|
+
expect(a).toHaveLength(1);
|
|
53
|
+
expect(a[0].value).toEqual({ expectedCount: 508 });
|
|
54
|
+
});
|
|
55
|
+
it("extracts 'N tools total' pattern", () => {
|
|
56
|
+
const a = sniffMcpTotalCount("we have 100 tools total now");
|
|
57
|
+
expect(a).toHaveLength(1);
|
|
58
|
+
});
|
|
59
|
+
it("returns empty array when no total-count claim present", () => {
|
|
60
|
+
expect(sniffMcpTotalCount("Mneme ships proof and reverse")).toHaveLength(0);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe("v2.19.15 TRUTH FORENSIC · sniffVersion", () => {
|
|
64
|
+
it("extracts versions of form vX.Y.Z and X.Y.Z", () => {
|
|
65
|
+
const a = sniffVersion("Mneme v2.19.14 is the current release; previously 2.19.13 was live");
|
|
66
|
+
const versions = a.map((x) => x.value.version).sort();
|
|
67
|
+
expect(versions).toContain("2.19.14");
|
|
68
|
+
expect(versions).toContain("2.19.13");
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe("v2.19.15 TRUTH FORENSIC · sniffFilePath", () => {
|
|
72
|
+
it("extracts repo paths ending in .ts/.tsx/.js/.json/.md", () => {
|
|
73
|
+
const a = sniffFilePath("see packages/core/src/foo.ts and tests/integration.test.ts plus scripts/build.mjs");
|
|
74
|
+
const paths = a.map((x) => x.value.path).sort();
|
|
75
|
+
expect(paths).toContain("packages/core/src/foo.ts");
|
|
76
|
+
expect(paths).toContain("tests/integration.test.ts");
|
|
77
|
+
expect(paths).toContain("scripts/build.mjs");
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe("v2.19.15 TRUTH FORENSIC · forensicVerify ACCEPTED path", () => {
|
|
81
|
+
it("ACCEPTED when every sniff grounds: claim 'registers 4 mneme.nexus.* tools' on a catalog with 4", () => {
|
|
82
|
+
const r = forensicVerify({
|
|
83
|
+
claim: "Mneme v2.19.15 registers 4 mneme.nexus.* MCP tools",
|
|
84
|
+
groundTruth: { mcpCatalog: CATALOG, installedVersion: "2.19.15" },
|
|
85
|
+
secret: SECRET,
|
|
86
|
+
});
|
|
87
|
+
expect(r.verdict).toBe("ACCEPTED");
|
|
88
|
+
expect(r.certificate.verdict).toBe("ACCEPTED");
|
|
89
|
+
expect(r.assertions.some((a) => a.sub_verdict === "supported")).toBe(true);
|
|
90
|
+
expect(verifyForensicCertificate(r.certificate, SECRET).ok).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
it("ACCEPTED also includes the exact mneme.X.Y mentions in the claim (sniffMcpToolExact)", () => {
|
|
93
|
+
const r = forensicVerify({
|
|
94
|
+
claim: "Uses mneme.inverse.audit then mneme.confessional.audit; v2.19.15",
|
|
95
|
+
groundTruth: { mcpCatalog: CATALOG, installedVersion: "2.19.15" },
|
|
96
|
+
secret: SECRET,
|
|
97
|
+
});
|
|
98
|
+
expect(r.verdict).toBe("ACCEPTED");
|
|
99
|
+
const toolKinds = r.assertions.filter((a) => a.kind === "mcp_tool_exact");
|
|
100
|
+
expect(toolKinds.length).toBe(2);
|
|
101
|
+
expect(toolKinds.every((a) => a.sub_verdict === "supported")).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe("v2.19.15 TRUTH FORENSIC · forensicVerify REJECTED path (the W2 kill)", () => {
|
|
105
|
+
it("REJECTED when claim states wrong nexus count: 7 vs actual 4", () => {
|
|
106
|
+
const r = forensicVerify({
|
|
107
|
+
claim: "Mneme registers 7 mneme.nexus.* MCP tools",
|
|
108
|
+
groundTruth: { mcpCatalog: CATALOG },
|
|
109
|
+
secret: SECRET,
|
|
110
|
+
});
|
|
111
|
+
expect(r.verdict).toBe("REJECTED");
|
|
112
|
+
expect(r.refutedAssertions.length).toBe(1);
|
|
113
|
+
expect(r.refutedAssertions[0].evidence).toContain("not 7");
|
|
114
|
+
// The killer: explanation surfaces the actual count
|
|
115
|
+
expect(r.explanation).toContain("REJECTED");
|
|
116
|
+
});
|
|
117
|
+
it("REJECTED when claim mentions a tool that doesn't exist in the catalog", () => {
|
|
118
|
+
const r = forensicVerify({
|
|
119
|
+
claim: "ships mneme.nexus.subscribe and mneme.fictional.lie",
|
|
120
|
+
groundTruth: { mcpCatalog: CATALOG },
|
|
121
|
+
secret: SECRET,
|
|
122
|
+
});
|
|
123
|
+
expect(r.verdict).toBe("REJECTED");
|
|
124
|
+
const refuted = r.refutedAssertions[0];
|
|
125
|
+
expect(refuted.asserted).toContain("mneme.fictional.lie");
|
|
126
|
+
});
|
|
127
|
+
it("REJECTED when version claim mismatches installed version", () => {
|
|
128
|
+
const r = forensicVerify({
|
|
129
|
+
claim: "installed at v2.19.99",
|
|
130
|
+
groundTruth: { installedVersion: "2.19.15" },
|
|
131
|
+
secret: SECRET,
|
|
132
|
+
});
|
|
133
|
+
expect(r.verdict).toBe("REJECTED");
|
|
134
|
+
expect(r.refutedAssertions[0].evidence).toContain("not 2.19.99");
|
|
135
|
+
});
|
|
136
|
+
it("REJECTED when file claim points at non-existent path", () => {
|
|
137
|
+
const r = forensicVerify({
|
|
138
|
+
claim: "see packages/core/src/imaginary.ts",
|
|
139
|
+
groundTruth: { fileExists: (_p) => false },
|
|
140
|
+
secret: SECRET,
|
|
141
|
+
});
|
|
142
|
+
expect(r.verdict).toBe("REJECTED");
|
|
143
|
+
});
|
|
144
|
+
it("REJECTED wins over supported assertions (any refutation is fatal)", () => {
|
|
145
|
+
const r = forensicVerify({
|
|
146
|
+
claim: "ships mneme.nexus.subscribe and registers 99 mneme.nexus.* tools",
|
|
147
|
+
groundTruth: { mcpCatalog: CATALOG },
|
|
148
|
+
secret: SECRET,
|
|
149
|
+
});
|
|
150
|
+
expect(r.verdict).toBe("REJECTED");
|
|
151
|
+
// tool-exact assertion is supported, count assertion is refuted → still REJECTED
|
|
152
|
+
expect(r.assertions.some((a) => a.sub_verdict === "supported")).toBe(true);
|
|
153
|
+
expect(r.refutedAssertions.length).toBeGreaterThan(0);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe("v2.19.15 TRUTH FORENSIC · forensicVerify UNKNOWN path", () => {
|
|
157
|
+
it("UNKNOWN when claim has no sniffable assertions", () => {
|
|
158
|
+
const r = forensicVerify({
|
|
159
|
+
claim: "the codebase is healthy and developer morale is high",
|
|
160
|
+
groundTruth: { mcpCatalog: CATALOG },
|
|
161
|
+
secret: SECRET,
|
|
162
|
+
});
|
|
163
|
+
expect(r.verdict).toBe("UNKNOWN");
|
|
164
|
+
expect(r.untested).toBe(true);
|
|
165
|
+
expect(r.explanation).toContain("UNKNOWN");
|
|
166
|
+
});
|
|
167
|
+
it("UNKNOWN when sniffed assertions can't be checked (missing ground truth)", () => {
|
|
168
|
+
const r = forensicVerify({
|
|
169
|
+
claim: "ships mneme.nexus.subscribe",
|
|
170
|
+
groundTruth: {}, // no catalog
|
|
171
|
+
secret: SECRET,
|
|
172
|
+
});
|
|
173
|
+
expect(r.verdict).toBe("UNKNOWN");
|
|
174
|
+
expect(r.assertions[0].sub_verdict).toBe("untested");
|
|
175
|
+
});
|
|
176
|
+
it("externalRefutationsFound > 0 forces REJECTED even with no sniff", () => {
|
|
177
|
+
const r = forensicVerify({
|
|
178
|
+
claim: "the codebase is healthy",
|
|
179
|
+
groundTruth: {},
|
|
180
|
+
externalRefutationsFound: 3,
|
|
181
|
+
secret: SECRET,
|
|
182
|
+
});
|
|
183
|
+
expect(r.verdict).toBe("REJECTED");
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe("v2.19.15 TRUTH FORENSIC · certificate integrity", () => {
|
|
187
|
+
it("certificate verifies against the same secret", () => {
|
|
188
|
+
const r = forensicVerify({
|
|
189
|
+
claim: "ships mneme.nexus.subscribe",
|
|
190
|
+
groundTruth: { mcpCatalog: CATALOG },
|
|
191
|
+
secret: SECRET,
|
|
192
|
+
});
|
|
193
|
+
expect(verifyForensicCertificate(r.certificate, SECRET).ok).toBe(true);
|
|
194
|
+
});
|
|
195
|
+
it("forged certificate (tampered claim) is rejected", () => {
|
|
196
|
+
const r = forensicVerify({
|
|
197
|
+
claim: "ships mneme.nexus.subscribe",
|
|
198
|
+
groundTruth: { mcpCatalog: CATALOG },
|
|
199
|
+
secret: SECRET,
|
|
200
|
+
});
|
|
201
|
+
const forged = { ...r.certificate, claim: "evil-claim" };
|
|
202
|
+
expect(verifyForensicCertificate(forged, SECRET).ok).toBe(false);
|
|
203
|
+
});
|
|
204
|
+
it("certificate fails to verify with a different secret", () => {
|
|
205
|
+
const r = forensicVerify({
|
|
206
|
+
claim: "ships mneme.nexus.subscribe",
|
|
207
|
+
groundTruth: { mcpCatalog: CATALOG },
|
|
208
|
+
secret: SECRET,
|
|
209
|
+
});
|
|
210
|
+
expect(verifyForensicCertificate(r.certificate, "wrong-secret").ok).toBe(false);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
describe("v2.19.15 TRUTH FORENSIC · classifyClaim + formatter + sniffAll", () => {
|
|
214
|
+
it("classifyClaim reports number + classes of sniffed assertions", () => {
|
|
215
|
+
const c = classifyClaim("v2.19.15 ships 4 mneme.nexus.* tools using mneme.inverse.audit");
|
|
216
|
+
expect(c.assertionsExpected).toBeGreaterThan(0);
|
|
217
|
+
expect(c.classes).toContain("mcp_tool_exact");
|
|
218
|
+
expect(c.classes).toContain("mcp_family_count");
|
|
219
|
+
expect(c.classes).toContain("version_exact");
|
|
220
|
+
});
|
|
221
|
+
it("sniffAllAssertions returns the union of all sniffers", () => {
|
|
222
|
+
const all = sniffAllAssertions("v2.19.15 ships 4 mneme.nexus.* tools using mneme.inverse.audit in packages/core/src/foo.ts");
|
|
223
|
+
expect(all.length).toBeGreaterThanOrEqual(4);
|
|
224
|
+
});
|
|
225
|
+
it("formatter line includes verdict + counts", () => {
|
|
226
|
+
const r = forensicVerify({
|
|
227
|
+
claim: "ships mneme.nexus.subscribe and mneme.nexus.drain",
|
|
228
|
+
groundTruth: { mcpCatalog: CATALOG },
|
|
229
|
+
secret: SECRET,
|
|
230
|
+
});
|
|
231
|
+
const line = formatForensicLine(r);
|
|
232
|
+
expect(line).toContain("ACCEPTED");
|
|
233
|
+
expect(line).toContain("sniffed=2");
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
describe("v2.19.15 TRUTH FORENSIC · the exact W2 lie kill scenario", () => {
|
|
237
|
+
it("kills the user's W2 example claim: 'Mneme v2.19.14 registers 4 mneme.nexus.* MCP tools' against ACTUAL catalog", () => {
|
|
238
|
+
// Simulate the exact user complaint: at the time of the test in v2.19.6 the
|
|
239
|
+
// catalog had 0 nexus tools (the bug). With current state we have 4 — claim
|
|
240
|
+
// accurate now. But if anyone restates an outdated count, the pipeline catches it.
|
|
241
|
+
const trueWith4 = forensicVerify({
|
|
242
|
+
claim: "Mneme v2.19.14 registers 4 mneme.nexus.* MCP tools",
|
|
243
|
+
groundTruth: { mcpCatalog: CATALOG, installedVersion: "2.19.14" },
|
|
244
|
+
secret: SECRET,
|
|
245
|
+
});
|
|
246
|
+
expect(trueWith4.verdict).toBe("ACCEPTED");
|
|
247
|
+
const lieWith7 = forensicVerify({
|
|
248
|
+
claim: "Mneme v2.19.14 registers 7 mneme.nexus.* MCP tools",
|
|
249
|
+
groundTruth: { mcpCatalog: CATALOG, installedVersion: "2.19.14" },
|
|
250
|
+
secret: SECRET,
|
|
251
|
+
});
|
|
252
|
+
expect(lieWith7.verdict).toBe("REJECTED");
|
|
253
|
+
expect(lieWith7.refutedAssertions[0].evidence).toMatch(/has 4 tools matching .* not 7/);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=truth_forensic_pipeline.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truth_forensic_pipeline.test.js","sourceRoot":"","sources":["../../src/truth_forensic_pipeline/truth_forensic_pipeline.test.ts"],"names":[],"mappings":"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"}
|