@mneme-ai/core 2.19.12 → 2.19.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/chimera_embedder/chimera_embedder.test.d.ts +2 -0
  2. package/dist/chimera_embedder/chimera_embedder.test.d.ts.map +1 -0
  3. package/dist/chimera_embedder/chimera_embedder.test.js +158 -0
  4. package/dist/chimera_embedder/chimera_embedder.test.js.map +1 -0
  5. package/dist/chimera_embedder/index.d.ts +92 -0
  6. package/dist/chimera_embedder/index.d.ts.map +1 -0
  7. package/dist/chimera_embedder/index.js +157 -0
  8. package/dist/chimera_embedder/index.js.map +1 -0
  9. package/dist/cli_dreams/cli_dreams.test.d.ts +2 -0
  10. package/dist/cli_dreams/cli_dreams.test.d.ts.map +1 -0
  11. package/dist/cli_dreams/cli_dreams.test.js +161 -0
  12. package/dist/cli_dreams/cli_dreams.test.js.map +1 -0
  13. package/dist/cli_dreams/index.d.ts +124 -0
  14. package/dist/cli_dreams/index.d.ts.map +1 -0
  15. package/dist/cli_dreams/index.js +205 -0
  16. package/dist/cli_dreams/index.js.map +1 -0
  17. package/dist/consequence_ledger/consequence_ledger.test.d.ts +2 -0
  18. package/dist/consequence_ledger/consequence_ledger.test.d.ts.map +1 -0
  19. package/dist/consequence_ledger/consequence_ledger.test.js +140 -0
  20. package/dist/consequence_ledger/consequence_ledger.test.js.map +1 -0
  21. package/dist/consequence_ledger/index.d.ts +114 -0
  22. package/dist/consequence_ledger/index.d.ts.map +1 -0
  23. package/dist/consequence_ledger/index.js +234 -0
  24. package/dist/consequence_ledger/index.js.map +1 -0
  25. package/dist/cosmic/aurelian_v1913.test.d.ts +2 -0
  26. package/dist/cosmic/aurelian_v1913.test.d.ts.map +1 -0
  27. package/dist/cosmic/aurelian_v1913.test.js +46 -0
  28. package/dist/cosmic/aurelian_v1913.test.js.map +1 -0
  29. package/dist/cosmic/aurelian_v1914.test.d.ts +2 -0
  30. package/dist/cosmic/aurelian_v1914.test.d.ts.map +1 -0
  31. package/dist/cosmic/aurelian_v1914.test.js +59 -0
  32. package/dist/cosmic/aurelian_v1914.test.js.map +1 -0
  33. package/dist/index.d.ts +5 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +5 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/negative_evidence/index.d.ts +162 -0
  38. package/dist/negative_evidence/index.d.ts.map +1 -0
  39. package/dist/negative_evidence/index.js +244 -0
  40. package/dist/negative_evidence/index.js.map +1 -0
  41. package/dist/negative_evidence/negative_evidence.test.d.ts +2 -0
  42. package/dist/negative_evidence/negative_evidence.test.d.ts.map +1 -0
  43. package/dist/negative_evidence/negative_evidence.test.js +188 -0
  44. package/dist/negative_evidence/negative_evidence.test.js.map +1 -0
  45. package/dist/neuromorphic_embedder/index.d.ts +139 -0
  46. package/dist/neuromorphic_embedder/index.d.ts.map +1 -0
  47. package/dist/neuromorphic_embedder/index.js +306 -0
  48. package/dist/neuromorphic_embedder/index.js.map +1 -0
  49. package/dist/neuromorphic_embedder/neuromorphic_embedder.test.d.ts +2 -0
  50. package/dist/neuromorphic_embedder/neuromorphic_embedder.test.d.ts.map +1 -0
  51. package/dist/neuromorphic_embedder/neuromorphic_embedder.test.js +194 -0
  52. package/dist/neuromorphic_embedder/neuromorphic_embedder.test.js.map +1 -0
  53. package/dist/whats_new.d.ts.map +1 -1
  54. package/dist/whats_new.js +16 -0
  55. package/dist/whats_new.js.map +1 -1
  56. package/dist/wrapper_genesis/index.d.ts.map +1 -1
  57. package/dist/wrapper_genesis/index.js +26 -0
  58. package/dist/wrapper_genesis/index.js.map +1 -1
  59. package/package.json +1 -1
@@ -0,0 +1,162 @@
1
+ /**
2
+ * v2.19.13 — MNEME NEGATIVE-EVIDENCE FIREWALL (Hallucination Kill)
3
+ *
4
+ * "Every AI safety tool asks the wrong question: 'what supports this
5
+ * claim?'. Mneme inverts: 'what REFUTES it, and did we search and NOT
6
+ * find?'. A claim is ACCEPTED only when every generated refutation
7
+ * candidate has been explicitly searched across all relevant sources
8
+ * and produced NOTHING. If even one refutation finds evidence, the
9
+ * claim is REJECTED. If any refutation search is inconclusive, the
10
+ * verdict is UNKNOWN (not ACCEPTED).
11
+ *
12
+ * No vendor ships this because the UX cost is brutal — slower answers,
13
+ * more 'I don't know' verdicts — and every AI tool is optimised for
14
+ * confident-and-fast. Negative-evidence primacy contradicts every AI
15
+ * vendor's incentive. Only an independent tool (Mneme) can enforce it.
16
+ *
17
+ * Companion layer: HALLUCINATION TOKEN-TAX. Each vendor starts with
18
+ * 1000 credits/month; every REJECTED claim costs 10 credits; exhaustion
19
+ * triggers a routing fallback signal to the caller ('vendor exhausted
20
+ * hallucination budget; route to fallback'). Vendors get skin in the
21
+ * game."
22
+ *
23
+ * Architecture (vendor-agnostic orchestrator):
24
+ * - `gateClaim({claim, refutations, searchResults})` — caller supplies
25
+ * refutations (from inverse-LLM or manual) + search outcomes (from
26
+ * caller's git/file/test/web searcher); we compute the verdict.
27
+ * - HMAC-signed certificate per ACCEPTED claim — content-addressed +
28
+ * tamper-detectable.
29
+ * - TokenTaxLedger: HMAC-chained credits/charges; routing decision is
30
+ * pure function of remaining budget.
31
+ *
32
+ * Honest scope:
33
+ * - We do NOT generate refutations ourselves; INVERSE-LLM (v2.19.3) or
34
+ * any caller-supplied generator does. Composes onto v2.19.3.
35
+ * - We do NOT execute searches; caller does git/file/test/web. We grade
36
+ * the outcomes.
37
+ * - Token-tax is advisory: we signal route-to-fallback; the caller (the
38
+ * MCP client) decides whether to honour it.
39
+ */
40
+ declare const PROTOCOL_VERSION: 1;
41
+ export type SearchVerdict = "found" | "not_found" | "inconclusive";
42
+ export interface SearchResult {
43
+ refutation: string;
44
+ source: "git" | "file" | "test" | "web" | "other";
45
+ verdict: SearchVerdict;
46
+ /** Evidence string when verdict='found'; reason when 'inconclusive'. */
47
+ evidence?: string;
48
+ }
49
+ export type GateVerdict = "ACCEPTED" | "REJECTED" | "UNKNOWN";
50
+ export interface NegativeEvidenceCertificate {
51
+ v: typeof PROTOCOL_VERSION;
52
+ claim: string;
53
+ refutationCount: number;
54
+ searchCount: number;
55
+ ts: number;
56
+ hmac: string;
57
+ }
58
+ export interface GateResult {
59
+ verdict: GateVerdict;
60
+ /** Set when verdict='REJECTED' — the refutation + evidence that defeated the claim. */
61
+ rejectedBy?: SearchResult;
62
+ /** Set when verdict='UNKNOWN' — list of inconclusive searches. */
63
+ pendingSearches?: SearchResult[];
64
+ /** Set when verdict='ACCEPTED' — HMAC-signed proof of completion. */
65
+ certificate?: NegativeEvidenceCertificate;
66
+ refutationCount: number;
67
+ searchCount: number;
68
+ }
69
+ export interface GateInput {
70
+ claim: string;
71
+ refutations: string[];
72
+ searchResults: SearchResult[];
73
+ nowMs?: number;
74
+ secret?: string;
75
+ }
76
+ /**
77
+ * Compute verdict from refutations + search outcomes. Pure function.
78
+ *
79
+ * Rules:
80
+ * 1. If ANY search verdict is 'found' → REJECTED (any refutation evidence is fatal).
81
+ * 2. Else if ANY search verdict is 'inconclusive' → UNKNOWN.
82
+ * 3. Else if EVERY refutation has at least one 'not_found' search → ACCEPTED + certificate.
83
+ * 4. Else (refutations exist with NO searches at all) → UNKNOWN.
84
+ * 5. Empty refutations list → UNKNOWN (we refuse to auto-accept untested claims).
85
+ */
86
+ export declare function gateClaim(input: GateInput): GateResult;
87
+ export declare function verifyCertificate(cert: NegativeEvidenceCertificate, secret?: string): {
88
+ ok: boolean;
89
+ reason?: string;
90
+ };
91
+ export interface TaxEntry {
92
+ v: typeof PROTOCOL_VERSION;
93
+ vendor: string;
94
+ kind: "credit" | "charge";
95
+ amount: number;
96
+ reason: string;
97
+ monthKey: string;
98
+ ts: number;
99
+ prevSig: string | null;
100
+ sig: string;
101
+ }
102
+ export interface TaxLedger {
103
+ v: typeof PROTOCOL_VERSION;
104
+ entries: TaxEntry[];
105
+ }
106
+ export declare function emptyTaxLedger(): TaxLedger;
107
+ /**
108
+ * Issue the monthly credit. Idempotent within the month: a second call for
109
+ * the same vendor in the same month is a NO-OP.
110
+ */
111
+ export declare function initMonthlyBudget(opts: {
112
+ ledger: TaxLedger;
113
+ vendor: string;
114
+ amount?: number;
115
+ nowMs?: number;
116
+ secret?: string;
117
+ }): TaxLedger;
118
+ /** Append a charge for a refuted claim. Negative amount NOT permitted; pass positive. */
119
+ export declare function chargeTax(opts: {
120
+ ledger: TaxLedger;
121
+ vendor: string;
122
+ amount?: number;
123
+ reason: string;
124
+ nowMs?: number;
125
+ secret?: string;
126
+ }): TaxLedger;
127
+ /** Verify HMAC chain integrity end-to-end. */
128
+ export declare function verifyTaxLedger(ledger: TaxLedger, secret?: string): {
129
+ ok: boolean;
130
+ brokenAt?: number;
131
+ reason?: string;
132
+ };
133
+ export interface VendorStatus {
134
+ vendor: string;
135
+ monthKey: string;
136
+ budget: number;
137
+ charged: number;
138
+ remaining: number;
139
+ exhausted: boolean;
140
+ rejectedClaimCount: number;
141
+ }
142
+ export declare function vendorStatus(opts: {
143
+ ledger: TaxLedger;
144
+ vendor: string;
145
+ nowMs?: number;
146
+ }): VendorStatus;
147
+ export interface RoutingDecision {
148
+ route: "primary" | "fallback";
149
+ primaryVendor: string;
150
+ fallbackVendor: string;
151
+ reason: string;
152
+ primaryStatus: VendorStatus;
153
+ }
154
+ export declare function routingDecision(opts: {
155
+ ledger: TaxLedger;
156
+ primaryVendor: string;
157
+ fallbackVendor: string;
158
+ nowMs?: number;
159
+ }): RoutingDecision;
160
+ export declare function formatGateLine(r: GateResult): string;
161
+ export {};
162
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/negative_evidence/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * v2.19.13 — MNEME NEGATIVE-EVIDENCE FIREWALL (Hallucination Kill)
3
+ *
4
+ * "Every AI safety tool asks the wrong question: 'what supports this
5
+ * claim?'. Mneme inverts: 'what REFUTES it, and did we search and NOT
6
+ * find?'. A claim is ACCEPTED only when every generated refutation
7
+ * candidate has been explicitly searched across all relevant sources
8
+ * and produced NOTHING. If even one refutation finds evidence, the
9
+ * claim is REJECTED. If any refutation search is inconclusive, the
10
+ * verdict is UNKNOWN (not ACCEPTED).
11
+ *
12
+ * No vendor ships this because the UX cost is brutal — slower answers,
13
+ * more 'I don't know' verdicts — and every AI tool is optimised for
14
+ * confident-and-fast. Negative-evidence primacy contradicts every AI
15
+ * vendor's incentive. Only an independent tool (Mneme) can enforce it.
16
+ *
17
+ * Companion layer: HALLUCINATION TOKEN-TAX. Each vendor starts with
18
+ * 1000 credits/month; every REJECTED claim costs 10 credits; exhaustion
19
+ * triggers a routing fallback signal to the caller ('vendor exhausted
20
+ * hallucination budget; route to fallback'). Vendors get skin in the
21
+ * game."
22
+ *
23
+ * Architecture (vendor-agnostic orchestrator):
24
+ * - `gateClaim({claim, refutations, searchResults})` — caller supplies
25
+ * refutations (from inverse-LLM or manual) + search outcomes (from
26
+ * caller's git/file/test/web searcher); we compute the verdict.
27
+ * - HMAC-signed certificate per ACCEPTED claim — content-addressed +
28
+ * tamper-detectable.
29
+ * - TokenTaxLedger: HMAC-chained credits/charges; routing decision is
30
+ * pure function of remaining budget.
31
+ *
32
+ * Honest scope:
33
+ * - We do NOT generate refutations ourselves; INVERSE-LLM (v2.19.3) or
34
+ * any caller-supplied generator does. Composes onto v2.19.3.
35
+ * - We do NOT execute searches; caller does git/file/test/web. We grade
36
+ * the outcomes.
37
+ * - Token-tax is advisory: we signal route-to-fallback; the caller (the
38
+ * MCP client) decides whether to honour it.
39
+ */
40
+ import { createHmac, timingSafeEqual } from "node:crypto";
41
+ const PROTOCOL_VERSION = 1;
42
+ const DEFAULT_MONTHLY_BUDGET = 1000;
43
+ const DEFAULT_REJECT_COST = 10;
44
+ function canon(v) {
45
+ if (v === null || typeof v !== "object")
46
+ return JSON.stringify(v);
47
+ if (Array.isArray(v))
48
+ return "[" + v.map(canon).join(",") + "]";
49
+ const keys = Object.keys(v).sort();
50
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
51
+ }
52
+ function defaultSecret() {
53
+ return process.env["MNEME_NEGEV_SECRET"] || `mneme-negative-evidence-v${PROTOCOL_VERSION}`;
54
+ }
55
+ function signCert(body, secret) {
56
+ return createHmac("sha256", secret).update(canon(body)).digest("hex");
57
+ }
58
+ function safeEqHex(a, b) {
59
+ try {
60
+ return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ /**
67
+ * Compute verdict from refutations + search outcomes. Pure function.
68
+ *
69
+ * Rules:
70
+ * 1. If ANY search verdict is 'found' → REJECTED (any refutation evidence is fatal).
71
+ * 2. Else if ANY search verdict is 'inconclusive' → UNKNOWN.
72
+ * 3. Else if EVERY refutation has at least one 'not_found' search → ACCEPTED + certificate.
73
+ * 4. Else (refutations exist with NO searches at all) → UNKNOWN.
74
+ * 5. Empty refutations list → UNKNOWN (we refuse to auto-accept untested claims).
75
+ */
76
+ export function gateClaim(input) {
77
+ const refCount = input.refutations.length;
78
+ const searchCount = input.searchResults.length;
79
+ // Rule 5: empty refutations → UNKNOWN (don't auto-accept)
80
+ if (refCount === 0) {
81
+ return { verdict: "UNKNOWN", refutationCount: 0, searchCount };
82
+ }
83
+ // Rule 1: any FOUND is fatal
84
+ const found = input.searchResults.find((s) => s.verdict === "found");
85
+ if (found) {
86
+ return { verdict: "REJECTED", rejectedBy: found, refutationCount: refCount, searchCount };
87
+ }
88
+ // Rule 2: any INCONCLUSIVE → UNKNOWN
89
+ const inconclusive = input.searchResults.filter((s) => s.verdict === "inconclusive");
90
+ if (inconclusive.length > 0) {
91
+ return { verdict: "UNKNOWN", pendingSearches: inconclusive, refutationCount: refCount, searchCount };
92
+ }
93
+ // Rule 3 + 4: every refutation must have at least one NOT_FOUND search
94
+ const coverage = new Set();
95
+ for (const s of input.searchResults) {
96
+ if (s.verdict === "not_found")
97
+ coverage.add(s.refutation);
98
+ }
99
+ const uncovered = input.refutations.filter((r) => !coverage.has(r));
100
+ if (uncovered.length > 0) {
101
+ return { verdict: "UNKNOWN", refutationCount: refCount, searchCount };
102
+ }
103
+ const ts = input.nowMs ?? Date.now();
104
+ const body = {
105
+ v: PROTOCOL_VERSION,
106
+ claim: input.claim,
107
+ refutationCount: refCount,
108
+ searchCount,
109
+ ts,
110
+ };
111
+ const certificate = { ...body, hmac: signCert(body, input.secret ?? defaultSecret()) };
112
+ return { verdict: "ACCEPTED", certificate, refutationCount: refCount, searchCount };
113
+ }
114
+ export function verifyCertificate(cert, secret) {
115
+ const { hmac, ...body } = cert;
116
+ const expected = signCert(body, secret ?? defaultSecret());
117
+ if (!safeEqHex(expected, hmac)) {
118
+ return { ok: false, reason: "HMAC mismatch — forged or wrong secret" };
119
+ }
120
+ return { ok: true };
121
+ }
122
+ function signTaxEntry(body, secret) {
123
+ return createHmac("sha256", secret).update(canon(body)).digest("hex");
124
+ }
125
+ function monthKeyOf(ts) {
126
+ const d = new Date(ts);
127
+ return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, "0")}`;
128
+ }
129
+ export function emptyTaxLedger() {
130
+ return { v: PROTOCOL_VERSION, entries: [] };
131
+ }
132
+ /**
133
+ * Issue the monthly credit. Idempotent within the month: a second call for
134
+ * the same vendor in the same month is a NO-OP.
135
+ */
136
+ export function initMonthlyBudget(opts) {
137
+ const nowMs = opts.nowMs ?? Date.now();
138
+ const monthKey = monthKeyOf(nowMs);
139
+ const alreadyCredited = opts.ledger.entries.some((e) => e.vendor === opts.vendor && e.kind === "credit" && e.monthKey === monthKey);
140
+ if (alreadyCredited)
141
+ return opts.ledger;
142
+ const prev = opts.ledger.entries[opts.ledger.entries.length - 1];
143
+ const body = {
144
+ v: PROTOCOL_VERSION,
145
+ vendor: opts.vendor,
146
+ kind: "credit",
147
+ amount: opts.amount ?? DEFAULT_MONTHLY_BUDGET,
148
+ reason: `monthly budget grant ${monthKey}`,
149
+ monthKey,
150
+ ts: nowMs,
151
+ prevSig: prev ? prev.sig : null,
152
+ };
153
+ const sig = signTaxEntry(body, opts.secret ?? defaultSecret());
154
+ return { v: PROTOCOL_VERSION, entries: [...opts.ledger.entries, { ...body, sig }] };
155
+ }
156
+ /** Append a charge for a refuted claim. Negative amount NOT permitted; pass positive. */
157
+ export function chargeTax(opts) {
158
+ const nowMs = opts.nowMs ?? Date.now();
159
+ const monthKey = monthKeyOf(nowMs);
160
+ const amount = opts.amount ?? DEFAULT_REJECT_COST;
161
+ if (amount < 0)
162
+ throw new Error("chargeTax: amount must be non-negative");
163
+ const prev = opts.ledger.entries[opts.ledger.entries.length - 1];
164
+ const body = {
165
+ v: PROTOCOL_VERSION,
166
+ vendor: opts.vendor,
167
+ kind: "charge",
168
+ amount,
169
+ reason: opts.reason,
170
+ monthKey,
171
+ ts: nowMs,
172
+ prevSig: prev ? prev.sig : null,
173
+ };
174
+ const sig = signTaxEntry(body, opts.secret ?? defaultSecret());
175
+ return { v: PROTOCOL_VERSION, entries: [...opts.ledger.entries, { ...body, sig }] };
176
+ }
177
+ /** Verify HMAC chain integrity end-to-end. */
178
+ export function verifyTaxLedger(ledger, secret) {
179
+ const sec = secret ?? defaultSecret();
180
+ let prevSig = null;
181
+ for (let i = 0; i < ledger.entries.length; i++) {
182
+ const e = ledger.entries[i];
183
+ const { sig, ...body } = e;
184
+ if (body.prevSig !== prevSig) {
185
+ return { ok: false, brokenAt: i, reason: `prevSig mismatch at step ${i}` };
186
+ }
187
+ if (!safeEqHex(signTaxEntry(body, sec), sig)) {
188
+ return { ok: false, brokenAt: i, reason: `HMAC mismatch at step ${i}` };
189
+ }
190
+ prevSig = sig;
191
+ }
192
+ return { ok: true };
193
+ }
194
+ export function vendorStatus(opts) {
195
+ const nowMs = opts.nowMs ?? Date.now();
196
+ const monthKey = monthKeyOf(nowMs);
197
+ let budget = 0;
198
+ let charged = 0;
199
+ let rejectedClaimCount = 0;
200
+ for (const e of opts.ledger.entries) {
201
+ if (e.vendor !== opts.vendor || e.monthKey !== monthKey)
202
+ continue;
203
+ if (e.kind === "credit")
204
+ budget += e.amount;
205
+ else {
206
+ charged += e.amount;
207
+ rejectedClaimCount++;
208
+ }
209
+ }
210
+ const remaining = budget - charged;
211
+ return {
212
+ vendor: opts.vendor,
213
+ monthKey,
214
+ budget,
215
+ charged,
216
+ remaining,
217
+ exhausted: remaining <= 0,
218
+ rejectedClaimCount,
219
+ };
220
+ }
221
+ export function routingDecision(opts) {
222
+ const status = vendorStatus({ ledger: opts.ledger, vendor: opts.primaryVendor, nowMs: opts.nowMs });
223
+ if (status.exhausted) {
224
+ return {
225
+ route: "fallback",
226
+ primaryVendor: opts.primaryVendor,
227
+ fallbackVendor: opts.fallbackVendor,
228
+ reason: `vendor '${opts.primaryVendor}' exhausted hallucination budget (${status.charged}/${status.budget} for ${status.monthKey}); routing to ${opts.fallbackVendor}`,
229
+ primaryStatus: status,
230
+ };
231
+ }
232
+ return {
233
+ route: "primary",
234
+ primaryVendor: opts.primaryVendor,
235
+ fallbackVendor: opts.fallbackVendor,
236
+ reason: `vendor '${opts.primaryVendor}' has ${status.remaining}/${status.budget} credits remaining`,
237
+ primaryStatus: status,
238
+ };
239
+ }
240
+ export function formatGateLine(r) {
241
+ const tag = r.verdict === "ACCEPTED" ? "✅" : r.verdict === "REJECTED" ? "❌" : "❓";
242
+ return `${tag} NEGEV · ${r.verdict} · refutations=${r.refutationCount} · searches=${r.searchCount}`;
243
+ }
244
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/negative_evidence/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=negative_evidence.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negative_evidence.test.d.ts","sourceRoot":"","sources":["../../src/negative_evidence/negative_evidence.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,188 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { gateClaim, verifyCertificate, emptyTaxLedger, initMonthlyBudget, chargeTax, verifyTaxLedger, vendorStatus, routingDecision, formatGateLine, } from "./index.js";
3
+ const SECRET = "negev-test-secret-99887766";
4
+ describe("v2.19.13 NEGATIVE-EVIDENCE FIREWALL · gateClaim verdicts", () => {
5
+ it("Rule 5: empty refutations → UNKNOWN (never auto-accept untested)", () => {
6
+ const r = gateClaim({ claim: "X is true", refutations: [], searchResults: [], secret: SECRET });
7
+ expect(r.verdict).toBe("UNKNOWN");
8
+ expect(r.certificate).toBeUndefined();
9
+ });
10
+ it("Rule 3: every refutation has at least one NOT_FOUND search → ACCEPTED + certificate", () => {
11
+ const refutations = ["X is actually false in case A", "X contradicts B", "X has known counter-example C"];
12
+ const searchResults = refutations.flatMap((r) => [
13
+ { refutation: r, source: "git", verdict: "not_found" },
14
+ { refutation: r, source: "file", verdict: "not_found" },
15
+ ]);
16
+ const r = gateClaim({ claim: "X is true", refutations, searchResults, secret: SECRET, nowMs: 1_000_000 });
17
+ expect(r.verdict).toBe("ACCEPTED");
18
+ expect(r.certificate).toBeDefined();
19
+ expect(r.certificate.refutationCount).toBe(3);
20
+ expect(r.certificate.searchCount).toBe(6);
21
+ });
22
+ it("Rule 1: ANY found is fatal → REJECTED, returns the defeating evidence", () => {
23
+ const r = gateClaim({
24
+ claim: "Y is true",
25
+ refutations: ["Y is false in case A", "Y contradicts B"],
26
+ searchResults: [
27
+ { refutation: "Y is false in case A", source: "git", verdict: "not_found" },
28
+ { refutation: "Y contradicts B", source: "file", verdict: "found", evidence: "src/foo.ts:42 contradicts Y" },
29
+ { refutation: "Y contradicts B", source: "git", verdict: "not_found" },
30
+ ],
31
+ secret: SECRET,
32
+ });
33
+ expect(r.verdict).toBe("REJECTED");
34
+ expect(r.rejectedBy?.evidence).toContain("contradicts");
35
+ });
36
+ it("Rule 2: any INCONCLUSIVE (no found) → UNKNOWN, returns pending searches", () => {
37
+ const r = gateClaim({
38
+ claim: "Z is true",
39
+ refutations: ["Z fails on input A"],
40
+ searchResults: [
41
+ { refutation: "Z fails on input A", source: "test", verdict: "inconclusive", evidence: "test timed out" },
42
+ ],
43
+ secret: SECRET,
44
+ });
45
+ expect(r.verdict).toBe("UNKNOWN");
46
+ expect(r.pendingSearches?.length).toBe(1);
47
+ });
48
+ it("Rule 4: refutation with NO search at all → UNKNOWN (don't auto-accept uncovered refutations)", () => {
49
+ const r = gateClaim({
50
+ claim: "W is true",
51
+ refutations: ["W fails on edge case", "W is undefined for inputs > 1e9"],
52
+ searchResults: [
53
+ { refutation: "W fails on edge case", source: "git", verdict: "not_found" },
54
+ // second refutation has zero searches
55
+ ],
56
+ secret: SECRET,
57
+ });
58
+ expect(r.verdict).toBe("UNKNOWN");
59
+ });
60
+ it("REJECTED wins even when some refutations are inconclusive (FOUND is always fatal)", () => {
61
+ const r = gateClaim({
62
+ claim: "A",
63
+ refutations: ["r1", "r2"],
64
+ searchResults: [
65
+ { refutation: "r1", source: "web", verdict: "inconclusive" },
66
+ { refutation: "r2", source: "git", verdict: "found", evidence: "commit deadbeef refutes r2" },
67
+ ],
68
+ secret: SECRET,
69
+ });
70
+ expect(r.verdict).toBe("REJECTED");
71
+ });
72
+ });
73
+ describe("v2.19.13 NEGATIVE-EVIDENCE FIREWALL · certificate", () => {
74
+ it("certificate is HMAC-verifiable + deterministic given same inputs", () => {
75
+ const refs = ["r1"];
76
+ const searches = [{ refutation: "r1", source: "git", verdict: "not_found" }];
77
+ const a = gateClaim({ claim: "claim-A", refutations: refs, searchResults: searches, secret: SECRET, nowMs: 5_000_000 });
78
+ const b = gateClaim({ claim: "claim-A", refutations: refs, searchResults: searches, secret: SECRET, nowMs: 5_000_000 });
79
+ expect(a.certificate.hmac).toBe(b.certificate.hmac);
80
+ expect(verifyCertificate(a.certificate, SECRET).ok).toBe(true);
81
+ });
82
+ it("forged certificate (tampered claim) is rejected", () => {
83
+ const refs = ["r1"];
84
+ const searches = [{ refutation: "r1", source: "git", verdict: "not_found" }];
85
+ const r = gateClaim({ claim: "real-claim", refutations: refs, searchResults: searches, secret: SECRET });
86
+ const forged = { ...r.certificate, claim: "evil-claim" };
87
+ expect(verifyCertificate(forged, SECRET).ok).toBe(false);
88
+ });
89
+ it("verifyCertificate fails with wrong secret", () => {
90
+ const refs = ["r1"];
91
+ const searches = [{ refutation: "r1", source: "git", verdict: "not_found" }];
92
+ const r = gateClaim({ claim: "A", refutations: refs, searchResults: searches, secret: SECRET });
93
+ expect(verifyCertificate(r.certificate, "wrong-secret").ok).toBe(false);
94
+ });
95
+ });
96
+ describe("v2.19.13 NEGATIVE-EVIDENCE FIREWALL · TokenTaxLedger", () => {
97
+ it("emptyTaxLedger has no entries", () => {
98
+ expect(emptyTaxLedger().entries).toHaveLength(0);
99
+ });
100
+ it("initMonthlyBudget grants 1000 credits + is IDEMPOTENT within the same month", () => {
101
+ const t0 = 1715817600000; // 2024-05-16
102
+ let l = initMonthlyBudget({ ledger: emptyTaxLedger(), vendor: "v-anthropic", nowMs: t0, secret: SECRET });
103
+ expect(l.entries).toHaveLength(1);
104
+ expect(l.entries[0].amount).toBe(1000);
105
+ // second call same month → no-op
106
+ l = initMonthlyBudget({ ledger: l, vendor: "v-anthropic", nowMs: t0 + 1000, secret: SECRET });
107
+ expect(l.entries).toHaveLength(1);
108
+ });
109
+ it("chargeTax appends a charge; positive amount required", () => {
110
+ let l = initMonthlyBudget({ ledger: emptyTaxLedger(), vendor: "v-openai", nowMs: 1_000_000, secret: SECRET });
111
+ l = chargeTax({ ledger: l, vendor: "v-openai", amount: 10, reason: "refuted claim X", nowMs: 1_001_000, secret: SECRET });
112
+ expect(l.entries).toHaveLength(2);
113
+ expect(l.entries[1].kind).toBe("charge");
114
+ expect(() => chargeTax({ ledger: l, vendor: "v-openai", amount: -5, reason: "bad", secret: SECRET })).toThrow();
115
+ });
116
+ it("HMAC chain integrity: ledger verifies before tamper, fails after", () => {
117
+ let l = initMonthlyBudget({ ledger: emptyTaxLedger(), vendor: "v-a", nowMs: 1_000_000, secret: SECRET });
118
+ l = chargeTax({ ledger: l, vendor: "v-a", amount: 10, reason: "x", nowMs: 1_000_100, secret: SECRET });
119
+ l = chargeTax({ ledger: l, vendor: "v-a", amount: 10, reason: "y", nowMs: 1_000_200, secret: SECRET });
120
+ expect(verifyTaxLedger(l, SECRET).ok).toBe(true);
121
+ const tampered = {
122
+ ...l,
123
+ entries: l.entries.map((e, i) => (i === 1 ? { ...e, amount: 1000000 } : e)),
124
+ };
125
+ const v = verifyTaxLedger(tampered, SECRET);
126
+ expect(v.ok).toBe(false);
127
+ expect(v.brokenAt).toBe(1);
128
+ });
129
+ it("vendorStatus: budget - charged = remaining; exhausted=true when remaining<=0", () => {
130
+ let l = initMonthlyBudget({ ledger: emptyTaxLedger(), vendor: "v-x", nowMs: 1_000_000, secret: SECRET, amount: 100 });
131
+ for (let i = 0; i < 9; i++) {
132
+ l = chargeTax({ ledger: l, vendor: "v-x", amount: 10, reason: `r${i}`, nowMs: 1_000_000 + i, secret: SECRET });
133
+ }
134
+ let s = vendorStatus({ ledger: l, vendor: "v-x", nowMs: 1_000_010 });
135
+ expect(s.remaining).toBe(10);
136
+ expect(s.exhausted).toBe(false);
137
+ expect(s.rejectedClaimCount).toBe(9);
138
+ l = chargeTax({ ledger: l, vendor: "v-x", amount: 10, reason: "r9", nowMs: 1_000_020, secret: SECRET });
139
+ s = vendorStatus({ ledger: l, vendor: "v-x", nowMs: 1_000_030 });
140
+ expect(s.remaining).toBe(0);
141
+ expect(s.exhausted).toBe(true);
142
+ });
143
+ it("vendor status is scoped to current month (last month's charges don't count)", () => {
144
+ const may = new Date(Date.UTC(2024, 4, 16)).getTime(); // 2024-05-16
145
+ const june = new Date(Date.UTC(2024, 5, 16)).getTime(); // 2024-06-16
146
+ let l = initMonthlyBudget({ ledger: emptyTaxLedger(), vendor: "v-z", nowMs: may, secret: SECRET });
147
+ l = chargeTax({ ledger: l, vendor: "v-z", amount: 500, reason: "may charge", nowMs: may + 1000, secret: SECRET });
148
+ // June: status should show full new budget (June grant) minus zero charges
149
+ l = initMonthlyBudget({ ledger: l, vendor: "v-z", nowMs: june, secret: SECRET });
150
+ const s = vendorStatus({ ledger: l, vendor: "v-z", nowMs: june + 1000 });
151
+ expect(s.budget).toBe(1000);
152
+ expect(s.charged).toBe(0);
153
+ expect(s.remaining).toBe(1000);
154
+ });
155
+ });
156
+ describe("v2.19.13 NEGATIVE-EVIDENCE FIREWALL · routingDecision", () => {
157
+ it("not-exhausted primary → route=primary", () => {
158
+ let l = initMonthlyBudget({ ledger: emptyTaxLedger(), vendor: "v-claude", nowMs: 1_000_000, secret: SECRET });
159
+ l = chargeTax({ ledger: l, vendor: "v-claude", amount: 100, reason: "x", nowMs: 1_000_001, secret: SECRET });
160
+ const d = routingDecision({ ledger: l, primaryVendor: "v-claude", fallbackVendor: "v-llama", nowMs: 1_000_002 });
161
+ expect(d.route).toBe("primary");
162
+ expect(d.primaryStatus.remaining).toBe(900);
163
+ });
164
+ it("exhausted primary → route=fallback with explanatory reason", () => {
165
+ let l = initMonthlyBudget({ ledger: emptyTaxLedger(), vendor: "v-claude", nowMs: 1_000_000, secret: SECRET, amount: 50 });
166
+ l = chargeTax({ ledger: l, vendor: "v-claude", amount: 50, reason: "x", nowMs: 1_000_001, secret: SECRET });
167
+ const d = routingDecision({ ledger: l, primaryVendor: "v-claude", fallbackVendor: "v-llama", nowMs: 1_000_002 });
168
+ expect(d.route).toBe("fallback");
169
+ expect(d.reason).toContain("exhausted hallucination budget");
170
+ expect(d.reason).toContain("v-llama");
171
+ });
172
+ it("primary that was never granted any budget = exhausted = fallback", () => {
173
+ const l = emptyTaxLedger();
174
+ const d = routingDecision({ ledger: l, primaryVendor: "v-unknown", fallbackVendor: "v-llama", nowMs: 1_000_000 });
175
+ expect(d.route).toBe("fallback");
176
+ });
177
+ });
178
+ describe("v2.19.13 NEGATIVE-EVIDENCE FIREWALL · formatter", () => {
179
+ it("formatter line uses ✅/❌/❓ per verdict", () => {
180
+ const accept = formatGateLine({ verdict: "ACCEPTED", refutationCount: 3, searchCount: 6 });
181
+ const reject = formatGateLine({ verdict: "REJECTED", refutationCount: 3, searchCount: 6 });
182
+ const unknown = formatGateLine({ verdict: "UNKNOWN", refutationCount: 1, searchCount: 0 });
183
+ expect(accept).toContain("✅");
184
+ expect(reject).toContain("❌");
185
+ expect(unknown).toContain("❓");
186
+ });
187
+ });
188
+ //# sourceMappingURL=negative_evidence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negative_evidence.test.js","sourceRoot":"","sources":["../../src/negative_evidence/negative_evidence.test.ts"],"names":[],"mappings":"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"}