@mneme-ai/core 2.19.13 → 2.19.15
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/chimera_embedder/chimera_embedder.test.d.ts +2 -0
- package/dist/chimera_embedder/chimera_embedder.test.d.ts.map +1 -0
- package/dist/chimera_embedder/chimera_embedder.test.js +158 -0
- package/dist/chimera_embedder/chimera_embedder.test.js.map +1 -0
- package/dist/chimera_embedder/index.d.ts +92 -0
- package/dist/chimera_embedder/index.d.ts.map +1 -0
- package/dist/chimera_embedder/index.js +157 -0
- package/dist/chimera_embedder/index.js.map +1 -0
- package/dist/cli_dreams/cli_dreams.test.d.ts +2 -0
- package/dist/cli_dreams/cli_dreams.test.d.ts.map +1 -0
- package/dist/cli_dreams/cli_dreams.test.js +161 -0
- package/dist/cli_dreams/cli_dreams.test.js.map +1 -0
- package/dist/cli_dreams/index.d.ts +124 -0
- package/dist/cli_dreams/index.d.ts.map +1 -0
- package/dist/cli_dreams/index.js +205 -0
- package/dist/cli_dreams/index.js.map +1 -0
- package/dist/consequence_ledger/consequence_ledger.test.d.ts +2 -0
- package/dist/consequence_ledger/consequence_ledger.test.d.ts.map +1 -0
- package/dist/consequence_ledger/consequence_ledger.test.js +140 -0
- package/dist/consequence_ledger/consequence_ledger.test.js.map +1 -0
- package/dist/consequence_ledger/index.d.ts +114 -0
- package/dist/consequence_ledger/index.d.ts.map +1 -0
- package/dist/consequence_ledger/index.js +234 -0
- package/dist/consequence_ledger/index.js.map +1 -0
- package/dist/cosmic/aurelian_v1914.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1914.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1914.test.js +59 -0
- package/dist/cosmic/aurelian_v1914.test.js.map +1 -0
- 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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -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 +16 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,133 @@
|
|
|
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
|
+
declare const PROTOCOL_VERSION: 1;
|
|
48
|
+
export type AssertionKind = "mcp_tool_exact" | "mcp_family_count" | "mcp_total_count" | "version_exact" | "file_path";
|
|
49
|
+
export interface FactAssertion {
|
|
50
|
+
kind: AssertionKind;
|
|
51
|
+
/** Human-readable rendering of the assertion. */
|
|
52
|
+
asserted: string;
|
|
53
|
+
/** Structured value for ground-truth lookup. */
|
|
54
|
+
value: unknown;
|
|
55
|
+
}
|
|
56
|
+
export type AssertionSubVerdict = "supported" | "refuted" | "untested";
|
|
57
|
+
export interface AssertionResult {
|
|
58
|
+
kind: AssertionKind;
|
|
59
|
+
asserted: string;
|
|
60
|
+
sub_verdict: AssertionSubVerdict;
|
|
61
|
+
evidence?: string;
|
|
62
|
+
observed?: unknown;
|
|
63
|
+
expected?: unknown;
|
|
64
|
+
}
|
|
65
|
+
export type ForensicVerdict = "ACCEPTED" | "REJECTED" | "UNKNOWN";
|
|
66
|
+
export interface ForensicCertificate {
|
|
67
|
+
v: typeof PROTOCOL_VERSION;
|
|
68
|
+
claim: string;
|
|
69
|
+
claimSha: string;
|
|
70
|
+
assertions: AssertionResult[];
|
|
71
|
+
verdict: ForensicVerdict;
|
|
72
|
+
ts: number;
|
|
73
|
+
hmac: string;
|
|
74
|
+
}
|
|
75
|
+
export interface ForensicResult {
|
|
76
|
+
verdict: ForensicVerdict;
|
|
77
|
+
claim: string;
|
|
78
|
+
assertions: AssertionResult[];
|
|
79
|
+
/** Set when verdict='REJECTED' — the assertion(s) whose ground-truth refuted. */
|
|
80
|
+
refutedAssertions: AssertionResult[];
|
|
81
|
+
/** Set when verdict='UNKNOWN' — claim had no sniffable assertions and no caller-supplied refutations. */
|
|
82
|
+
untested?: boolean;
|
|
83
|
+
certificate: ForensicCertificate;
|
|
84
|
+
/** Plain-English explanation safe to show non-engineers. */
|
|
85
|
+
explanation: string;
|
|
86
|
+
}
|
|
87
|
+
/** Extract exact `mneme.X.Y` tool-name mentions from claim text. */
|
|
88
|
+
export declare function sniffMcpToolExact(claim: string): FactAssertion[];
|
|
89
|
+
/** Extract "N mneme.X.* tools" family-count assertions. */
|
|
90
|
+
export declare function sniffMcpFamilyCount(claim: string): FactAssertion[];
|
|
91
|
+
/** Extract "ships N MCP tools" / "N tools total" claims. */
|
|
92
|
+
export declare function sniffMcpTotalCount(claim: string): FactAssertion[];
|
|
93
|
+
/** Extract "v2.19.X" / "version 2.19.X" version claims. */
|
|
94
|
+
export declare function sniffVersion(claim: string): FactAssertion[];
|
|
95
|
+
/** Extract file paths mentioned in claim. */
|
|
96
|
+
export declare function sniffFilePath(claim: string): FactAssertion[];
|
|
97
|
+
export declare function sniffAllAssertions(claim: string): FactAssertion[];
|
|
98
|
+
export interface GroundTruth {
|
|
99
|
+
mcpCatalog?: string[];
|
|
100
|
+
installedVersion?: string;
|
|
101
|
+
fileExists?: (path: string) => boolean;
|
|
102
|
+
}
|
|
103
|
+
export interface ForensicInput {
|
|
104
|
+
claim: string;
|
|
105
|
+
groundTruth?: GroundTruth;
|
|
106
|
+
/** Optional caller-supplied generic refutations (composes with v2.19.13 NEGATIVE-EVIDENCE). */
|
|
107
|
+
externalRefutationsFound?: number;
|
|
108
|
+
nowMs?: number;
|
|
109
|
+
secret?: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Run the full forensic pipeline:
|
|
113
|
+
* 1. Sniff assertions from claim text.
|
|
114
|
+
* 2. Check each against ground truth.
|
|
115
|
+
* 3. Apply negative-evidence rule:
|
|
116
|
+
* ANY assertion 'refuted' → REJECTED
|
|
117
|
+
* else ALL assertions 'supported' → ACCEPTED
|
|
118
|
+
* else (some 'untested' / no sniff hits) → UNKNOWN
|
|
119
|
+
* 4. Issue HMAC-signed certificate.
|
|
120
|
+
* 5. Produce plain-English explanation.
|
|
121
|
+
*/
|
|
122
|
+
export declare function forensicVerify(input: ForensicInput): ForensicResult;
|
|
123
|
+
export declare function verifyForensicCertificate(cert: ForensicCertificate, secret?: string): {
|
|
124
|
+
ok: boolean;
|
|
125
|
+
reason?: string;
|
|
126
|
+
};
|
|
127
|
+
export declare function classifyClaim(claim: string): {
|
|
128
|
+
assertionsExpected: number;
|
|
129
|
+
classes: AssertionKind[];
|
|
130
|
+
};
|
|
131
|
+
export declare function formatForensicLine(r: ForensicResult): string;
|
|
132
|
+
export {};
|
|
133
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/truth_forensic_pipeline/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":""}
|