@mneme-ai/core 1.69.0 → 1.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +13 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/precog/bayesian_priors.d.ts +49 -0
  6. package/dist/precog/bayesian_priors.d.ts.map +1 -0
  7. package/dist/precog/bayesian_priors.js +135 -0
  8. package/dist/precog/bayesian_priors.js.map +1 -0
  9. package/dist/precog/firewall.d.ts +72 -0
  10. package/dist/precog/firewall.d.ts.map +1 -0
  11. package/dist/precog/firewall.js +141 -0
  12. package/dist/precog/firewall.js.map +1 -0
  13. package/dist/precog/index.d.ts +54 -0
  14. package/dist/precog/index.d.ts.map +1 -0
  15. package/dist/precog/index.js +94 -0
  16. package/dist/precog/index.js.map +1 -0
  17. package/dist/precog/package_verifier.d.ts +45 -0
  18. package/dist/precog/package_verifier.d.ts.map +1 -0
  19. package/dist/precog/package_verifier.js +139 -0
  20. package/dist/precog/package_verifier.js.map +1 -0
  21. package/dist/precog/precog.test.d.ts +5 -0
  22. package/dist/precog/precog.test.d.ts.map +1 -0
  23. package/dist/precog/precog.test.js +224 -0
  24. package/dist/precog/precog.test.js.map +1 -0
  25. package/dist/precog/sha_version_verifier.d.ts +34 -0
  26. package/dist/precog/sha_version_verifier.d.ts.map +1 -0
  27. package/dist/precog/sha_version_verifier.js +131 -0
  28. package/dist/precog/sha_version_verifier.js.map +1 -0
  29. package/dist/precog/temporal_verifier.d.ts +45 -0
  30. package/dist/precog/temporal_verifier.d.ts.map +1 -0
  31. package/dist/precog/temporal_verifier.js +139 -0
  32. package/dist/precog/temporal_verifier.js.map +1 -0
  33. package/dist/precog/trust_certificate.d.ts +44 -0
  34. package/dist/precog/trust_certificate.d.ts.map +1 -0
  35. package/dist/precog/trust_certificate.js +103 -0
  36. package/dist/precog/trust_certificate.js.map +1 -0
  37. package/package.json +1 -1
@@ -0,0 +1,94 @@
1
+ /**
2
+ * v1.70.0 -- PRECOG PROTOCOL.
3
+ *
4
+ * The paradigm shift: from DETECT-AFTER to PREVENT-BEFORE. Every AI
5
+ * claim that flows through Mneme is intercepted at the MCP boundary,
6
+ * verified against ACTUAL repo state (git, fs, package.json), and
7
+ * either certified or auto-hedged with named causes.
8
+ *
9
+ * P1 PACKAGE VERIFIER npm / import / install references
10
+ * P2 SHA/VERSION/EMAIL git rev-list / tags / author log
11
+ * P3 TEMPORAL VERIFIER "last week" -> git log range
12
+ * P4 FIREWALL intercept + auto-hedge + verdict
13
+ * P5 TRUST CERTIFICATE HMAC-signed proof for downstream
14
+ * P6 BAYESIAN REPO PRIORS per-repo failure-shape memory
15
+ *
16
+ * Position: AI tools that connect to Mneme via MCP become
17
+ * STRUCTURALLY INCAPABLE of hallucinating because every claim runs
18
+ * through this layer before reaching the user.
19
+ */
20
+ export * as packageVerifier from "./package_verifier.js";
21
+ export * as factVerifier from "./sha_version_verifier.js";
22
+ export * as temporalVerifier from "./temporal_verifier.js";
23
+ export * as bayesianPriors from "./bayesian_priors.js";
24
+ export * as trustCertificate from "./trust_certificate.js";
25
+ export * as firewall from "./firewall.js";
26
+ export { verifyPackages, extractPackageRefs } from "./package_verifier.js";
27
+ export { verifyFacts, extractFactRefs } from "./sha_version_verifier.js";
28
+ export { verifyTemporal, extractTemporalRefs } from "./temporal_verifier.js";
29
+ export { priorFor, recordFailure, readFailureHistory } from "./bayesian_priors.js";
30
+ export { issueCertificate, verifyCertificate, readCertLedger } from "./trust_certificate.js";
31
+ export { intercept } from "./firewall.js";
32
+ import { intercept } from "./firewall.js";
33
+ const PRECOG_LIE_CORPUS = [
34
+ // Package fabrications
35
+ { claim: "we use wraith-utils-2099 for caching across the stack", truth: "lie" },
36
+ { claim: "import x from 'totally-fake-package-9999'", truth: "lie" },
37
+ { claim: "npm install phantom-monitor-pro --save", truth: "lie" },
38
+ { claim: "we depend on legendary-cache@9.99.0 for everything", truth: "lie" },
39
+ // SHA / version fabs
40
+ { claim: "the bug landed in commit deadbeefcafefade1234567890abcdef12345678", truth: "lie" },
41
+ { claim: "we shipped v9.99.0 last quarter with these improvements", truth: "lie" },
42
+ { claim: "Alice <madeupperson@nowhere.invalid> authored that commit", truth: "lie" },
43
+ // Temporal fabs (claim deletion of files that never existed)
44
+ { claim: "we deleted packages/fake-imaginary-9999.ts last week", truth: "lie" },
45
+ { claim: "yesterday the broken_made_up_xyz file was added to the build", truth: "lie" },
46
+ ];
47
+ const PRECOG_TRUTH_CORPUS = [
48
+ // Real packages from this repo
49
+ { claim: "the project uses typescript for type-checking", truth: "truth" },
50
+ { claim: "import { join } from 'node:path'", truth: "truth" },
51
+ // Generic mild claims
52
+ { claim: "the CHANGELOG documents past releases", truth: "truth" },
53
+ { claim: "README explains the project", truth: "truth" },
54
+ ];
55
+ /** Run the firewall against a synthetic bench corpus. */
56
+ export function runPrecogBench(repoRoot) {
57
+ const samples = [...PRECOG_LIE_CORPUS, ...PRECOG_TRUTH_CORPUS];
58
+ let certified = 0, hedged = 0, rejected = 0;
59
+ let lieCaught = 0;
60
+ let truthPreserved = 0;
61
+ for (const s of samples) {
62
+ const r = intercept(repoRoot, s.claim, { recordOnReject: false, issueCert: false });
63
+ if (r.verdict === "CERTIFIED")
64
+ certified += 1;
65
+ else if (r.verdict === "HEDGED")
66
+ hedged += 1;
67
+ else
68
+ rejected += 1;
69
+ if (s.truth === "lie" && r.verdict !== "CERTIFIED")
70
+ lieCaught += 1;
71
+ if (s.truth === "truth" && r.verdict === "CERTIFIED")
72
+ truthPreserved += 1;
73
+ }
74
+ const catchRate = lieCaught / PRECOG_LIE_CORPUS.length;
75
+ const preservationRate = truthPreserved / PRECOG_TRUTH_CORPUS.length;
76
+ return {
77
+ total: samples.length,
78
+ certified, hedged, rejected,
79
+ catchRate, preservationRate,
80
+ headline: `PRECOG bench: ${(catchRate * 100).toFixed(0)}% lies caught, ${(preservationRate * 100).toFixed(0)}% truths preserved. Verdicts: ${certified} CERTIFIED / ${hedged} HEDGED / ${rejected} REJECTED.`,
81
+ };
82
+ }
83
+ export function renderBench(r) {
84
+ return [
85
+ "PRECOG FIREWALL BENCH",
86
+ "",
87
+ r.headline,
88
+ "",
89
+ `Verdicts: CERTIFIED ${r.certified} | HEDGED ${r.hedged} | REJECTED ${r.rejected}`,
90
+ `Catch rate: ${(r.catchRate * 100).toFixed(0)}% (lies caught: hedged-or-rejected)`,
91
+ `Preservation: ${(r.preservationRate * 100).toFixed(0)}% (truths certified)`,
92
+ ].join("\n");
93
+ }
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/precog/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * v1.70.0 -- PRECOG P1: PACKAGE VERIFIER.
3
+ *
4
+ * Catch the most common AI fabrication: "we use X package" where X
5
+ * is hallucinated. Extracts package references from prose:
6
+ *
7
+ * 1. `pkg@version` form
8
+ * 2. `import ... from "pkg"` style
9
+ * 3. `npm install pkg` style
10
+ * 4. quoted package names in prose ("uses 'lodash'")
11
+ *
12
+ * Cross-checks against:
13
+ * - package.json {dependencies, devDependencies, peerDependencies}
14
+ * - workspace patterns from package.json#workspaces
15
+ * - HEURISTIC npm-name validity (npm registry naming rules)
16
+ *
17
+ * Returns suspect packages + the specific rule that flagged them.
18
+ */
19
+ export interface PackageRef {
20
+ /** Package name as it appears. */
21
+ name: string;
22
+ /** Optional version captured. */
23
+ version?: string;
24
+ /** How we found it. */
25
+ source: "pkg-at-version" | "import-from" | "npm-install" | "prose-shape";
26
+ offset: number;
27
+ }
28
+ export interface PackageSuspect {
29
+ ref: PackageRef;
30
+ reason: string;
31
+ /** 0..1; higher = stronger suspicion. */
32
+ confidence: number;
33
+ }
34
+ export interface PackageVerifyReport {
35
+ refs: PackageRef[];
36
+ /** Packages whose existence we couldn't confirm. */
37
+ suspects: PackageSuspect[];
38
+ /** Packages confirmed in package.json. */
39
+ confirmed: string[];
40
+ /** Plain-English. */
41
+ headline: string;
42
+ }
43
+ export declare function extractPackageRefs(text: string): PackageRef[];
44
+ export declare function verifyPackages(repoRoot: string, text: string): PackageVerifyReport;
45
+ //# sourceMappingURL=package_verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package_verifier.d.ts","sourceRoot":"","sources":["../../src/precog/package_verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAcH,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,MAAM,EAAE,gBAAgB,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;IACzE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,oDAAoD;IACpD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAyBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAkC7D;AAeD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAkClF"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * v1.70.0 -- PRECOG P1: PACKAGE VERIFIER.
3
+ *
4
+ * Catch the most common AI fabrication: "we use X package" where X
5
+ * is hallucinated. Extracts package references from prose:
6
+ *
7
+ * 1. `pkg@version` form
8
+ * 2. `import ... from "pkg"` style
9
+ * 3. `npm install pkg` style
10
+ * 4. quoted package names in prose ("uses 'lodash'")
11
+ *
12
+ * Cross-checks against:
13
+ * - package.json {dependencies, devDependencies, peerDependencies}
14
+ * - workspace patterns from package.json#workspaces
15
+ * - HEURISTIC npm-name validity (npm registry naming rules)
16
+ *
17
+ * Returns suspect packages + the specific rule that flagged them.
18
+ */
19
+ import { existsSync, readFileSync } from "node:fs";
20
+ import { join } from "node:path";
21
+ const PKG_AT_VERSION = /\b([@a-z0-9][\w@./-]+)@(\d+\.\d+\.\d+(?:-[\w.-]+)?)\b/gi;
22
+ const IMPORT_FROM = /(?:from|require)\s*\(?\s*["']([^"']+)["']/g;
23
+ const NPM_INSTALL = /\bnpm\s+(?:install|i|add)\s+([\w@./-]+)/g;
24
+ // v1.70 -- bare prose package-shape (3+ hyphenated segments).
25
+ // Catches "wraith-utils-2099", "phantom-fake-9999" without @version
26
+ // or import syntax. Anchored to lowercase + hyphens to reduce FP on
27
+ // natural-language hyphenated phrases.
28
+ const PROSE_PKG_SHAPE = /\b([a-z][a-z0-9]*(?:-[a-z0-9]+){2,})\b/g;
29
+ const NPM_NAME_VALID = /^(@[a-z0-9-_.]+\/)?[a-z0-9-_.]+$/i;
30
+ function loadKnownDeps(repoRoot) {
31
+ const deps = new Set();
32
+ const p = join(repoRoot, "package.json");
33
+ if (!existsSync(p))
34
+ return deps;
35
+ try {
36
+ const pkg = JSON.parse(readFileSync(p, "utf8"));
37
+ for (const key of ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"]) {
38
+ const obj = pkg[key];
39
+ if (obj)
40
+ for (const name of Object.keys(obj))
41
+ deps.add(name);
42
+ }
43
+ // Also bring in workspace package names so internal references resolve.
44
+ const wsRaw = pkg["workspaces"];
45
+ if (Array.isArray(wsRaw)) {
46
+ for (const ws of wsRaw) {
47
+ if (typeof ws === "string" && !ws.includes("*"))
48
+ deps.add(ws);
49
+ }
50
+ }
51
+ }
52
+ catch { /* */ }
53
+ return deps;
54
+ }
55
+ export function extractPackageRefs(text) {
56
+ const out = [];
57
+ const seen = new Set();
58
+ const push = (ref) => {
59
+ const key = `${ref.source}|${ref.name}|${ref.version ?? ""}`;
60
+ if (seen.has(key))
61
+ return;
62
+ seen.add(key);
63
+ out.push(ref);
64
+ };
65
+ for (const m of text.matchAll(PKG_AT_VERSION)) {
66
+ push({ name: m[1], version: m[2], source: "pkg-at-version", offset: m.index ?? 0 });
67
+ }
68
+ for (const m of text.matchAll(IMPORT_FROM)) {
69
+ const raw = m[1];
70
+ // Take top-level segment (e.g. @scope/pkg or pkg from pkg/sub/path).
71
+ const top = raw.startsWith("@") ? raw.split("/").slice(0, 2).join("/") : raw.split("/")[0];
72
+ if (top && !top.startsWith(".") && !top.startsWith("/")) {
73
+ push({ name: top, source: "import-from", offset: m.index ?? 0 });
74
+ }
75
+ }
76
+ for (const m of text.matchAll(NPM_INSTALL)) {
77
+ push({ name: m[1], source: "npm-install", offset: m.index ?? 0 });
78
+ }
79
+ // Prose-shape: only catch when other extractors didn't already match.
80
+ // Most code-y phrases like "node-modules", "package-lock" are skipped by
81
+ // the 3-segment requirement; but we whitelist a few obvious non-packages.
82
+ const FALSE_POSITIVE_PROSE = new Set(["package-lock-json", "tsconfig-build-json", "single-page-app"]);
83
+ for (const m of text.matchAll(PROSE_PKG_SHAPE)) {
84
+ const name = m[1];
85
+ if (FALSE_POSITIVE_PROSE.has(name))
86
+ continue;
87
+ const offset = m.index ?? 0;
88
+ push({ name, source: "prose-shape", offset });
89
+ }
90
+ return out;
91
+ }
92
+ const BUILTIN_NODE_MODULES = new Set([
93
+ "node:fs", "node:path", "node:os", "node:crypto", "node:child_process",
94
+ "node:http", "node:https", "node:url", "node:util", "node:events", "node:stream",
95
+ "node:buffer", "node:zlib", "node:assert", "node:test", "node:net", "node:tls",
96
+ "node:dns", "node:querystring", "node:readline", "node:worker_threads",
97
+ "node:perf_hooks", "node:vm", "node:timers", "node:console",
98
+ // legacy non-prefixed forms
99
+ "fs", "path", "os", "crypto", "child_process", "http", "https", "url", "util",
100
+ "events", "stream", "buffer", "zlib", "assert", "net", "tls", "dns",
101
+ "querystring", "readline", "worker_threads", "perf_hooks", "vm", "timers",
102
+ "console",
103
+ ]);
104
+ export function verifyPackages(repoRoot, text) {
105
+ const refs = extractPackageRefs(text);
106
+ const known = loadKnownDeps(repoRoot);
107
+ const suspects = [];
108
+ const confirmed = [];
109
+ for (const ref of refs) {
110
+ // Suspicious future version BEATS name-confirmation -- if someone
111
+ // claims typescript@99.5.0, the package exists but the version is fab.
112
+ if (ref.version && /^([89]\d|\d{3,})\./.test(ref.version)) {
113
+ suspects.push({ ref, reason: `Suspicious future version ${ref.version} on package "${ref.name}"`, confidence: 0.75 });
114
+ continue;
115
+ }
116
+ if (BUILTIN_NODE_MODULES.has(ref.name.toLowerCase())) {
117
+ confirmed.push(ref.name);
118
+ continue;
119
+ }
120
+ if (known.has(ref.name)) {
121
+ confirmed.push(ref.name);
122
+ continue;
123
+ }
124
+ // Validity heuristics.
125
+ if (!NPM_NAME_VALID.test(ref.name)) {
126
+ suspects.push({ ref, reason: `Invalid npm package name shape: "${ref.name}"`, confidence: 0.85 });
127
+ continue;
128
+ }
129
+ // Not in deps + not built-in -> NOT necessarily a lie, but flag at low confidence.
130
+ suspects.push({
131
+ ref,
132
+ reason: `Package "${ref.name}" not in package.json dependencies (could be a hallucinated reference).`,
133
+ confidence: ref.source === "pkg-at-version" ? 0.7 : 0.55,
134
+ });
135
+ }
136
+ const headline = `${refs.length} package ref(s); ${confirmed.length} confirmed, ${suspects.length} suspect.`;
137
+ return { refs, suspects, confirmed, headline };
138
+ }
139
+ //# sourceMappingURL=package_verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package_verifier.js","sourceRoot":"","sources":["../../src/precog/package_verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,cAAc,GAAG,yDAAyD,CAAC;AACjF,MAAM,WAAW,GAAG,4CAA4C,CAAC;AACjE,MAAM,WAAW,GAAG,0CAA0C,CAAC;AAC/D,8DAA8D;AAC9D,oEAAoE;AACpE,oEAAoE;AACpE,uCAAuC;AACvC,MAAM,eAAe,GAAG,yCAAyC,CAAC;AA6BlE,MAAM,cAAc,GAAG,mCAAmC,CAAC;AAE3D,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAA4B,CAAC;QAC3E,KAAK,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,sBAAsB,CAAC,EAAE,CAAC;YAClG,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAwC,CAAC;YAC5D,IAAI,GAAG;gBAAE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC;QACD,wEAAwE;QACxE,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;IACjB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAG,CAAC,GAAe,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC7D,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAClB,qEAAqE;QACrE,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC5F,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,sEAAsE;IACtE,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACtG,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACnB,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7C,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB;IACtE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa;IAChF,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU;IAC9E,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB;IACtE,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc;IAC3D,4BAA4B;IAC5B,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;IAC7E,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACnE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ;IACzE,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,IAAY;IAC3D,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,kEAAkE;QAClE,uEAAuE;QACvE,IAAI,GAAG,CAAC,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,6BAA6B,GAAG,CAAC,OAAO,gBAAgB,GAAG,CAAC,IAAI,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YACtH,SAAS;QACX,CAAC;QACD,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACrD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,uBAAuB;QACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,oCAAoC,GAAG,CAAC,IAAI,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YAClG,SAAS;QACX,CAAC;QACD,mFAAmF;QACnF,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG;YACH,MAAM,EAAE,YAAY,GAAG,CAAC,IAAI,yEAAyE;YACrG,UAAU,EAAE,GAAG,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;SACzD,CAAC,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,oBAAoB,SAAS,CAAC,MAAM,eAAe,QAAQ,CAAC,MAAM,WAAW,CAAC;IAC7G,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjD,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * v1.70.0 -- PRECOG PROTOCOL test suite.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=precog.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precog.test.d.ts","sourceRoot":"","sources":["../../src/precog/precog.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * v1.70.0 -- PRECOG PROTOCOL test suite.
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
5
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
8
+ import { execSync } from "node:child_process";
9
+ import { verifyPackages, extractPackageRefs } from "./package_verifier.js";
10
+ import { verifyFacts, extractFactRefs } from "./sha_version_verifier.js";
11
+ import { verifyTemporal, extractTemporalRefs } from "./temporal_verifier.js";
12
+ import { intercept } from "./firewall.js";
13
+ import { issueCertificate, verifyCertificate } from "./trust_certificate.js";
14
+ import { priorFor, recordFailure } from "./bayesian_priors.js";
15
+ import { runPrecogBench } from "./index.js";
16
+ function setup() { return mkdtempSync(join(tmpdir(), "mneme-pc-")); }
17
+ function cleanup(r) { try {
18
+ rmSync(r, { recursive: true, force: true });
19
+ }
20
+ catch { /* */ } }
21
+ function initGitWithTags(r, commits, tags) {
22
+ execSync(`git init --quiet -b main`, { cwd: r, stdio: "ignore" });
23
+ execSync(`git config user.email "alice@example.com"`, { cwd: r, stdio: "ignore" });
24
+ execSync(`git config user.name "Alice"`, { cwd: r, stdio: "ignore" });
25
+ execSync(`git config commit.gpgsign false`, { cwd: r, stdio: "ignore" });
26
+ for (let i = 0; i < commits.length; i++) {
27
+ writeFileSync(join(r, `f${i}.txt`), `${i}`, "utf8");
28
+ execSync(`git add -A`, { cwd: r, stdio: "ignore" });
29
+ execSync(`git commit -m "${commits[i]}" --no-gpg-sign --quiet`, { cwd: r, stdio: "ignore" });
30
+ }
31
+ for (const t of tags)
32
+ execSync(`git tag ${t}`, { cwd: r, stdio: "ignore" });
33
+ }
34
+ // ─── P1 PACKAGE VERIFIER ─────────────────────────────────────────────
35
+ describe("v1.70 Precog P1 · Package Verifier", () => {
36
+ let r;
37
+ beforeEach(() => {
38
+ r = setup();
39
+ writeFileSync(join(r, "package.json"), JSON.stringify({
40
+ name: "test", dependencies: { typescript: "5.0.0", react: "18.0.0" },
41
+ }), "utf8");
42
+ });
43
+ afterEach(() => cleanup(r));
44
+ it("extracts pkg@version + import-from + npm-install refs", () => {
45
+ const refs = extractPackageRefs("import x from 'lodash'; npm install foo-bar; legendary@9.99.0 also");
46
+ expect(refs.length).toBeGreaterThanOrEqual(3);
47
+ });
48
+ it("flags package not in deps", () => {
49
+ const r1 = verifyPackages(r, "we use wraith-utils-2099 for caching");
50
+ expect(r1.suspects.find((s) => s.ref.name.includes("wraith"))).toBeDefined();
51
+ });
52
+ it("confirms real deps", () => {
53
+ const r1 = verifyPackages(r, "import { thing } from 'typescript'; import x from 'react'");
54
+ expect(r1.confirmed).toContain("typescript");
55
+ expect(r1.confirmed).toContain("react");
56
+ expect(r1.suspects.length).toBe(0);
57
+ });
58
+ it("treats node:* built-ins as confirmed", () => {
59
+ const r1 = verifyPackages(r, "import { readFileSync } from 'node:fs'");
60
+ expect(r1.confirmed).toContain("node:fs");
61
+ });
62
+ it("flags suspicious future versions", () => {
63
+ const r1 = verifyPackages(r, "we use typescript@99.5.0 in production");
64
+ expect(r1.suspects.find((s) => s.ref.version === "99.5.0")).toBeDefined();
65
+ });
66
+ });
67
+ // ─── P2 SHA / VERSION / EMAIL VERIFIER ───────────────────────────────
68
+ describe("v1.70 Precog P2 · SHA/Version/Email Verifier", () => {
69
+ let r;
70
+ beforeEach(() => { r = setup(); initGitWithTags(r, ["first", "second"], ["v1.0.0"]); });
71
+ afterEach(() => cleanup(r));
72
+ it("extracts SHA + version + email refs", () => {
73
+ const refs = extractFactRefs("commit deadbeefcafe shipped in v1.0.0 by alice@example.com");
74
+ const kinds = refs.map((r) => r.kind);
75
+ expect(kinds).toContain("sha");
76
+ expect(kinds).toContain("version");
77
+ expect(kinds).toContain("email");
78
+ });
79
+ it("flags fake SHA", () => {
80
+ const r1 = verifyFacts(r, "the bug was in commit deadbeefcafefade1234567890abcdef1234567");
81
+ expect(r1.suspects.find((s) => s.ref.kind === "sha")).toBeDefined();
82
+ });
83
+ it("confirms real tag", () => {
84
+ const r1 = verifyFacts(r, "shipped in v1.0.0 last week");
85
+ expect(r1.confirmed.some((c) => c.kind === "version" && c.value.endsWith("1.0.0"))).toBe(true);
86
+ });
87
+ it("flags fake version", () => {
88
+ const r1 = verifyFacts(r, "shipped in v9.99.0 the legendary feature");
89
+ expect(r1.suspects.find((s) => s.ref.kind === "version" && s.ref.value.endsWith("9.99.0"))).toBeDefined();
90
+ });
91
+ it("confirms real author email", () => {
92
+ const r1 = verifyFacts(r, "Alice <alice@example.com> wrote this");
93
+ expect(r1.confirmed.some((c) => c.kind === "email" && c.value === "alice@example.com")).toBe(true);
94
+ });
95
+ });
96
+ // ─── P3 TEMPORAL VERIFIER ────────────────────────────────────────────
97
+ describe("v1.70 Precog P3 · Temporal Verifier", () => {
98
+ let r;
99
+ beforeEach(() => { r = setup(); initGitWithTags(r, ["init"], []); });
100
+ afterEach(() => cleanup(r));
101
+ it("extracts temporal phrases", () => {
102
+ const refs = extractTemporalRefs("we did this yesterday and last week shipped X");
103
+ expect(refs.length).toBeGreaterThanOrEqual(2);
104
+ });
105
+ it("flags claim about file deletion when none in window", () => {
106
+ const r1 = verifyTemporal(r, "we deleted packages/imaginary-9999.ts last week");
107
+ expect(r1.suspects.length).toBeGreaterThanOrEqual(1);
108
+ });
109
+ it("INSUFFICIENT EVIDENCE on empty window", () => {
110
+ const r1 = verifyTemporal(r, "we did some work 365 days ago in the deep past");
111
+ // 365 days ago -- new repo has no commits there.
112
+ expect(r1.suspects.length).toBeGreaterThanOrEqual(1);
113
+ });
114
+ });
115
+ // ─── P5 TRUST CERTIFICATE ────────────────────────────────────────────
116
+ describe("v1.70 Precog P5 · Trust Certificate", () => {
117
+ let r;
118
+ beforeEach(() => { r = setup(); });
119
+ afterEach(() => cleanup(r));
120
+ it("issues CERTIFIED when all verifiers pass", () => {
121
+ const cert = issueCertificate(r, "claim", [
122
+ { name: "P1", passed: true },
123
+ { name: "P2", passed: true },
124
+ ]);
125
+ expect(cert.verdict).toBe("CERTIFIED");
126
+ expect(cert.signers.length).toBe(2);
127
+ expect(verifyCertificate(r, cert)).toBe("VALID");
128
+ });
129
+ it("issues REVOKED when majority flagged", () => {
130
+ const cert = issueCertificate(r, "claim", [
131
+ { name: "P1", passed: false },
132
+ { name: "P2", passed: false },
133
+ { name: "P3", passed: true },
134
+ ]);
135
+ expect(cert.verdict).toBe("REVOKED");
136
+ expect(verifyCertificate(r, cert)).toBe("NOT_CERTIFIED");
137
+ });
138
+ it("detects invalid HMAC", () => {
139
+ const cert = issueCertificate(r, "claim", [{ name: "P1", passed: true }]);
140
+ const tampered = { ...cert, hmac: "x".repeat(64) };
141
+ expect(verifyCertificate(r, tampered)).toBe("INVALID_HMAC");
142
+ });
143
+ it("expires", () => {
144
+ const cert = issueCertificate(r, "claim", [{ name: "P1", passed: true }], { ttlMs: 1 });
145
+ return new Promise((resolve) => setTimeout(() => {
146
+ expect(verifyCertificate(r, cert)).toBe("EXPIRED");
147
+ resolve();
148
+ }, 10));
149
+ });
150
+ });
151
+ // ─── P6 BAYESIAN PRIORS ──────────────────────────────────────────────
152
+ describe("v1.70 Precog P6 · Bayesian Priors", () => {
153
+ let r;
154
+ beforeEach(() => { r = setup(); });
155
+ afterEach(() => cleanup(r));
156
+ it("base prior on empty history", () => {
157
+ const p = priorFor(r, "some claim");
158
+ expect(p.posterior).toBeCloseTo(0.05, 2);
159
+ });
160
+ it("posterior rises after similar failure", () => {
161
+ recordFailure(r, "wraith-utils-2099 is a fake package", "npm-package");
162
+ recordFailure(r, "wraith-utils-2099 is a fake package", "npm-package");
163
+ const p = priorFor(r, "wraith-utils-2099 is a fake package");
164
+ expect(p.posterior).toBeGreaterThan(0.05);
165
+ expect(p.topNeighbors.length).toBeGreaterThanOrEqual(1);
166
+ });
167
+ });
168
+ // ─── P4 FIREWALL ────────────────────────────────────────────────────
169
+ describe("v1.70 Precog P4 · Firewall", () => {
170
+ let r;
171
+ beforeEach(() => {
172
+ r = setup();
173
+ writeFileSync(join(r, "package.json"), JSON.stringify({ name: "test", dependencies: { typescript: "5.0.0" } }), "utf8");
174
+ initGitWithTags(r, ["init"], []);
175
+ });
176
+ afterEach(() => cleanup(r));
177
+ it("HEDGES claim with fake package", () => {
178
+ const r1 = intercept(r, "we use wraith-utils-2099 for caching", { recordOnReject: false });
179
+ expect(r1.verdict).toBe("HEDGED");
180
+ expect(r1.hedges.length).toBeGreaterThanOrEqual(1);
181
+ expect(r1.verified).toContain("[unverified package");
182
+ });
183
+ it("CERTIFIED clean claim with real dep", () => {
184
+ const r1 = intercept(r, "the project uses typescript for type safety", { recordOnReject: false });
185
+ expect(r1.verdict).toBe("CERTIFIED");
186
+ expect(r1.certificate).not.toBeNull();
187
+ });
188
+ it("REJECTS claim with many hedges", () => {
189
+ const claim = "wraith-utils-2099 and phantom-fake-9999 and ghost-cache-9998 and demon-99 were all used in v9.99.0 last quarter by alice@nowhere.invalid commit deadbeefcafefade1234567890ab";
190
+ const r1 = intercept(r, claim, { recordOnReject: false });
191
+ expect(["HEDGED", "REJECTED"]).toContain(r1.verdict);
192
+ expect(r1.hedges.length).toBeGreaterThanOrEqual(3);
193
+ });
194
+ it("hedges preserve unrelated text", () => {
195
+ const r1 = intercept(r, "the project uses typescript and wraith-utils-2099 for builds", { recordOnReject: false });
196
+ expect(r1.verified).toContain("typescript"); // Real dep preserved
197
+ expect(r1.verified).toContain("[unverified package"); // Fake hedged
198
+ });
199
+ it("verifierResults reflect each P-layer", () => {
200
+ const r1 = intercept(r, "we use typescript", { recordOnReject: false });
201
+ const names = r1.verifierResults.map((v) => v.name);
202
+ expect(names).toContain("P1-package");
203
+ expect(names).toContain("P2-fact");
204
+ expect(names).toContain("P3-temporal");
205
+ expect(names).toContain("P6-prior");
206
+ });
207
+ });
208
+ // ─── BENCH ───────────────────────────────────────────────────────────
209
+ describe("v1.70 Precog · BENCH", () => {
210
+ let r;
211
+ beforeEach(() => {
212
+ r = setup();
213
+ writeFileSync(join(r, "package.json"), JSON.stringify({ name: "test", dependencies: { typescript: "5.0.0", react: "18.0.0" } }), "utf8");
214
+ writeFileSync(join(r, "README.md"), "# Project\n\nUses TypeScript.\n", "utf8");
215
+ writeFileSync(join(r, "CHANGELOG.md"), "## [1.0.0]\n", "utf8");
216
+ initGitWithTags(r, ["init"], []);
217
+ });
218
+ afterEach(() => cleanup(r));
219
+ it("catch rate >= 80% on 9-lie corpus", () => {
220
+ const r1 = runPrecogBench(r);
221
+ expect(r1.catchRate).toBeGreaterThanOrEqual(0.8);
222
+ });
223
+ });
224
+ //# sourceMappingURL=precog.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precog.test.js","sourceRoot":"","sources":["../../src/precog/precog.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * v1.70.0 -- PRECOG P2: SHA / VERSION / EMAIL VERIFIER.
3
+ *
4
+ * Common AI fabrications:
5
+ * - "in commit abc1234" (commit doesn't exist)
6
+ * - "we shipped v9.99.0 last quarter" (no such tag)
7
+ * - "Alice <alice@example.com> wrote this" (no such git author)
8
+ *
9
+ * Each fact verifier shells out to git/CHANGELOG/git-log respectively:
10
+ * - SHA -> git rev-list / git cat-file -e
11
+ * - Version -> git tags + CHANGELOG.md
12
+ * - Email -> distinct authors from git log --format=%ae
13
+ *
14
+ * Pure read; no side effects.
15
+ */
16
+ export interface FactRef {
17
+ kind: "sha" | "version" | "email";
18
+ value: string;
19
+ offset: number;
20
+ }
21
+ export interface FactSuspect {
22
+ ref: FactRef;
23
+ reason: string;
24
+ confidence: number;
25
+ }
26
+ export interface FactReport {
27
+ refs: FactRef[];
28
+ confirmed: FactRef[];
29
+ suspects: FactSuspect[];
30
+ headline: string;
31
+ }
32
+ export declare function extractFactRefs(text: string): FactRef[];
33
+ export declare function verifyFacts(repoRoot: string, text: string): FactReport;
34
+ //# sourceMappingURL=sha_version_verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sha_version_verifier.d.ts","sourceRoot":"","sources":["../../src/precog/sha_version_verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0CD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAwBvD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAwBtE"}