@mneme-ai/core 2.52.0 → 2.54.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 (69) hide show
  1. package/dist/agent_manifest.d.ts.map +1 -1
  2. package/dist/agent_manifest.js +23 -0
  3. package/dist/agent_manifest.js.map +1 -1
  4. package/dist/catalog_count.d.ts +47 -0
  5. package/dist/catalog_count.d.ts.map +1 -0
  6. package/dist/catalog_count.js +76 -0
  7. package/dist/catalog_count.js.map +1 -0
  8. package/dist/index.d.ts +5 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +13 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/indispensability.d.ts +31 -0
  13. package/dist/indispensability.d.ts.map +1 -0
  14. package/dist/indispensability.js +182 -0
  15. package/dist/indispensability.js.map +1 -0
  16. package/dist/nemesis/corpus_augmenter.d.ts +69 -0
  17. package/dist/nemesis/corpus_augmenter.d.ts.map +1 -0
  18. package/dist/nemesis/corpus_augmenter.js +164 -0
  19. package/dist/nemesis/corpus_augmenter.js.map +1 -0
  20. package/dist/nemesis/eu_ai_act_stamp.d.ts.map +1 -1
  21. package/dist/nemesis/eu_ai_act_stamp.js +14 -0
  22. package/dist/nemesis/eu_ai_act_stamp.js.map +1 -1
  23. package/dist/nemesis/gavel.d.ts +102 -0
  24. package/dist/nemesis/gavel.d.ts.map +1 -0
  25. package/dist/nemesis/gavel.js +192 -0
  26. package/dist/nemesis/gavel.js.map +1 -0
  27. package/dist/nemesis/index.d.ts +6 -0
  28. package/dist/nemesis/index.d.ts.map +1 -1
  29. package/dist/nemesis/index.js +14 -0
  30. package/dist/nemesis/index.js.map +1 -1
  31. package/dist/nemesis/janus.d.ts +93 -0
  32. package/dist/nemesis/janus.d.ts.map +1 -0
  33. package/dist/nemesis/janus.js +160 -0
  34. package/dist/nemesis/janus.js.map +1 -0
  35. package/dist/nemesis/key_setup.d.ts +65 -0
  36. package/dist/nemesis/key_setup.d.ts.map +1 -0
  37. package/dist/nemesis/key_setup.js +173 -0
  38. package/dist/nemesis/key_setup.js.map +1 -0
  39. package/dist/nemesis/lethe.d.ts +112 -0
  40. package/dist/nemesis/lethe.d.ts.map +1 -0
  41. package/dist/nemesis/lethe.js +211 -0
  42. package/dist/nemesis/lethe.js.map +1 -0
  43. package/dist/nemesis/nimbus.d.ts +117 -0
  44. package/dist/nemesis/nimbus.d.ts.map +1 -0
  45. package/dist/nemesis/nimbus.js +208 -0
  46. package/dist/nemesis/nimbus.js.map +1 -0
  47. package/dist/perf_budget.d.ts +48 -0
  48. package/dist/perf_budget.d.ts.map +1 -0
  49. package/dist/perf_budget.js +111 -0
  50. package/dist/perf_budget.js.map +1 -0
  51. package/dist/release_gate/probe_coverage.d.ts +16 -1
  52. package/dist/release_gate/probe_coverage.d.ts.map +1 -1
  53. package/dist/release_gate/probe_coverage.js +13 -4
  54. package/dist/release_gate/probe_coverage.js.map +1 -1
  55. package/dist/release_gate/wiring_lag.d.ts +65 -0
  56. package/dist/release_gate/wiring_lag.d.ts.map +1 -0
  57. package/dist/release_gate/wiring_lag.js +116 -0
  58. package/dist/release_gate/wiring_lag.js.map +1 -0
  59. package/dist/strategy.d.ts +43 -0
  60. package/dist/strategy.d.ts.map +1 -0
  61. package/dist/strategy.js +117 -0
  62. package/dist/strategy.js.map +1 -0
  63. package/dist/truth_gate/claims.d.ts.map +1 -1
  64. package/dist/truth_gate/claims.js +41 -0
  65. package/dist/truth_gate/claims.js.map +1 -1
  66. package/dist/truth_gate/probes.d.ts.map +1 -1
  67. package/dist/truth_gate/probes.js +248 -0
  68. package/dist/truth_gate/probes.js.map +1 -1
  69. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ /**
2
+ * v2.54.0 — PERFORMANCE BUDGET infrastructure.
3
+ *
4
+ * From the v2.53 audit: "ถ้า latency เกิน 100ms ใน git hook → user
5
+ * disable → product ตาย". Lock budgets per operation + measure them
6
+ * deterministically every TG run; release-script refuses tag if any
7
+ * budget regresses.
8
+ *
9
+ * Budgets are MEASURED in-process (avoids subprocess noise) where
10
+ * possible. The CLI-level ops also expose budgets via the subprocess
11
+ * benchmark suite for end-to-end verification.
12
+ *
13
+ * Pure deterministic + defensive; never throws.
14
+ */
15
+ import { extractFingerprint } from "./nemesis/features.js";
16
+ import { classifyAgentCalibrated } from "./nemesis/classifier_calibrated.js";
17
+ import { stampArticle50, __resetWarmCacheForTest } from "./nemesis/eu_ai_act_stamp.js";
18
+ import { computeStealthScore } from "./nemesis/stealth_score.js";
19
+ import { observe } from "./nemesis/janus.js";
20
+ export const PERF_BUDGETS = [
21
+ { op: "nemesis.classify_calibrated", budgetMs: 50, coldBudgetMs: 200, rationale: "MCP / git-hook hot path — must be sub-frame on every commit" },
22
+ { op: "nemesis.extract_fingerprint", budgetMs: 30, coldBudgetMs: 100, rationale: "called by classifier + JANUS + STEALTH; must be cheap" },
23
+ { op: "nemesis.eu_stamp", budgetMs: 50, coldBudgetMs: 200, rationale: "git hook UX killer if slow — user will disable" },
24
+ { op: "nemesis.stealth_score", budgetMs: 80, coldBudgetMs: 250, rationale: "reuses classifier; should add <50ms over baseline" },
25
+ { op: "nemesis.janus_observe", budgetMs: 50, coldBudgetMs: 200, rationale: "real-time identity-swap detection requires speed" },
26
+ ];
27
+ function quantile(arr, q) {
28
+ if (arr.length === 0)
29
+ return 0;
30
+ const sorted = [...arr].sort((a, b) => a - b);
31
+ const idx = Math.min(sorted.length - 1, Math.floor(q * (sorted.length - 1)));
32
+ return sorted[idx];
33
+ }
34
+ function measureWarmCold(opName, iterations, fn) {
35
+ // Cold first
36
+ const cold0 = process.hrtime.bigint();
37
+ try {
38
+ fn();
39
+ }
40
+ catch { /* let later loop surface */ }
41
+ const cold1 = process.hrtime.bigint();
42
+ const coldFirstMs = Number(cold1 - cold0) / 1e6;
43
+ // Warm iterations
44
+ const samples = [];
45
+ for (let i = 0; i < iterations; i++) {
46
+ const t0 = process.hrtime.bigint();
47
+ try {
48
+ fn();
49
+ }
50
+ catch { /* count as miss */ }
51
+ const t1 = process.hrtime.bigint();
52
+ samples.push(Number(t1 - t0) / 1e6);
53
+ }
54
+ const budget = (PERF_BUDGETS.find((b) => b.op === opName)?.budgetMs) ?? 100;
55
+ const mean = samples.reduce((s, x) => s + x, 0) / Math.max(1, samples.length);
56
+ const p95 = quantile(samples, 0.95);
57
+ return {
58
+ op: opName,
59
+ budgetMs: budget,
60
+ warmMeanMs: +mean.toFixed(2),
61
+ warmP95Ms: +p95.toFixed(2),
62
+ coldFirstMs: +coldFirstMs.toFixed(2),
63
+ iterations,
64
+ ok: mean < budget,
65
+ };
66
+ }
67
+ /**
68
+ * Run the full perf budget suite in-process. Iterations chosen so total
69
+ * runtime stays <2s on typical hardware.
70
+ */
71
+ export function runPerfBudget() {
72
+ const fixture = { diff: "+const x = 1;\n+function foo() { return x; }\n", prDescription: "## Changes\n- a\n- b\n", commitMessages: ["add foo"] };
73
+ // Reset EU stamp warm cache so the cold path is honest
74
+ try {
75
+ __resetWarmCacheForTest();
76
+ }
77
+ catch { /* */ }
78
+ // Pre-extract a fingerprint so classifier benchmark doesn't double-pay
79
+ const fpForClassify = extractFingerprint(fixture);
80
+ const measurements = [];
81
+ // 1. extract_fingerprint
82
+ measurements.push(measureWarmCold("nemesis.extract_fingerprint", 100, () => extractFingerprint(fixture)));
83
+ // 2. classify_calibrated
84
+ measurements.push(measureWarmCold("nemesis.classify_calibrated", 100, () => classifyAgentCalibrated(fpForClassify)));
85
+ // 3. eu_stamp
86
+ measurements.push(measureWarmCold("nemesis.eu_stamp", 100, () => stampArticle50({ message: "perf test", vendor: "claude-code", confidence: 0.9 })));
87
+ // 4. stealth_score
88
+ measurements.push(measureWarmCold("nemesis.stealth_score", 100, () => computeStealthScore(fixture)));
89
+ // 5. janus_observe
90
+ measurements.push(measureWarmCold("nemesis.janus_observe", 100, () => observe(fixture)));
91
+ const failing = measurements.filter((m) => !m.ok).map((m) => `${m.op} ${m.warmMeanMs}ms ≥ ${m.budgetMs}ms`);
92
+ return {
93
+ ok: failing.length === 0,
94
+ measurements,
95
+ failing,
96
+ at: new Date().toISOString(),
97
+ };
98
+ }
99
+ /** Human-friendly text report. */
100
+ export function renderPerfBudgetReport(r) {
101
+ const rows = r.measurements.map((m) => {
102
+ const status = m.ok ? "✓" : "✗";
103
+ return ` ${status} ${m.op.padEnd(40)} mean=${String(m.warmMeanMs).padStart(7)}ms p95=${String(m.warmP95Ms).padStart(7)}ms cold=${String(m.coldFirstMs).padStart(7)}ms budget=${m.budgetMs}ms`;
104
+ });
105
+ return [
106
+ `PERF BUDGET — ${r.ok ? "PASS" : "FAIL"} at ${r.at}`,
107
+ ...rows,
108
+ r.failing.length > 0 ? `FAILING: ${r.failing.join("; ")}` : "",
109
+ ].filter(Boolean).join("\n");
110
+ }
111
+ //# sourceMappingURL=perf_budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf_budget.js","sourceRoot":"","sources":["../src/perf_budget.ts"],"names":[],"mappings":"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"}
@@ -50,7 +50,22 @@ export interface CrossCheckResult {
50
50
  totalTools: number;
51
51
  totalClaims: number;
52
52
  uncovered: string[];
53
+ /** v2.53: percentage of tools with claim or exemption coverage (0..100). */
54
+ coveragePercent: number;
55
+ /** v2.53: threshold the gate accepted at (0..100). Reported for audit. */
56
+ threshold: number;
53
57
  hint: string;
54
58
  }
55
- export declare function crossCheckFromDisk(repoRoot: string): CrossCheckResult;
59
+ /**
60
+ * v2.53 addition — CrossCheck options.
61
+ * threshold: minimum coverage % required for ok=true (default 50).
62
+ * - 0 → gate disabled (always passes)
63
+ * - 50 → soft enforcement (current legacy state has 14.2% so this
64
+ * still fails until coverage rises; useful for new repos)
65
+ * - 100 → strict (every new tool needs a claim or exemption)
66
+ */
67
+ export interface CrossCheckOpts {
68
+ threshold?: number;
69
+ }
70
+ export declare function crossCheckFromDisk(repoRoot: string, opts?: CrossCheckOpts): CrossCheckResult;
56
71
  //# sourceMappingURL=probe_coverage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"probe_coverage.d.ts","sourceRoot":"","sources":["../../src/release_gate/probe_coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAmCH,MAAM,WAAW,kBAAkB;IACjC,yFAAyF;IACzF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,sEAAsE;IACtE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,8DAA8D;IAC9D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,6CAA6C;IAC7C,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,CAAC,CAAC;IAC1D,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CA6BjF;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CA2BrE"}
1
+ {"version":3,"file":"probe_coverage.d.ts","sourceRoot":"","sources":["../../src/release_gate/probe_coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAmCH,MAAM,WAAW,kBAAkB;IACjC,yFAAyF;IACzF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,sEAAsE;IACtE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,8DAA8D;IAC9D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,6CAA6C;IAC7C,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,CAAC,CAAC;IAC1D,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CA6BjF;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4EAA4E;IAC5E,eAAe,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,gBAAgB,CAoChG"}
@@ -82,12 +82,13 @@ export function checkProbeCoverage(input) {
82
82
  : `${uncovered.length} new tool(s) lack TRUTH GATE probe binding. Either: (a) add a probe.<topic> + claim.<topic> to packages/core/src/truth_gate/{probes,claims}.ts, or (b) add the tool to COVERAGE_EXEMPT in packages/core/src/release_gate/probe_coverage.ts with a written justification.`,
83
83
  };
84
84
  }
85
- export function crossCheckFromDisk(repoRoot) {
85
+ export function crossCheckFromDisk(repoRoot, opts = {}) {
86
86
  try {
87
+ const threshold = Number.isFinite(opts.threshold) ? Math.max(0, Math.min(100, opts.threshold)) : 50;
87
88
  const manifestPath = join(repoRoot, "packages", "core", "src", "agent_manifest.ts");
88
89
  const claimsPath = join(repoRoot, "packages", "core", "src", "truth_gate", "claims.ts");
89
90
  if (!existsSync(manifestPath) || !existsSync(claimsPath)) {
90
- return { ok: true, totalTools: 0, totalClaims: 0, uncovered: [], hint: "release-gate skipped: source files missing" };
91
+ return { ok: true, totalTools: 0, totalClaims: 0, uncovered: [], coveragePercent: 0, threshold, hint: "release-gate skipped: source files missing" };
91
92
  }
92
93
  const manifestBody = readFileSync(manifestPath, "utf8");
93
94
  const claimsBody = readFileSync(claimsPath, "utf8");
@@ -107,10 +108,18 @@ export function crossCheckFromDisk(repoRoot) {
107
108
  claims.push(inner[1]);
108
109
  }
109
110
  const r = checkProbeCoverage({ newTools: Array.from(tools), knownClaims: claims });
110
- return { ok: r.ok, totalTools: tools.size, totalClaims: claims.length, uncovered: r.uncovered, hint: r.hint };
111
+ const totalTools = tools.size;
112
+ const coveredCount = r.covered.length;
113
+ const coveragePercent = totalTools === 0 ? 100 : +((coveredCount / totalTools) * 100).toFixed(1);
114
+ const ok = coveragePercent >= threshold;
115
+ const hint = ok
116
+ ? `coverage ${coveragePercent}% ≥ threshold ${threshold}% — gate passed (${coveredCount}/${totalTools} tools covered)`
117
+ : `coverage ${coveragePercent}% < threshold ${threshold}% — ${r.uncovered.length} uncovered tool(s). Either add probe.<topic>+claim.<topic>, OR add to COVERAGE_EXEMPT (with justification), OR lower threshold via --min-coverage <n>.`;
118
+ return { ok, totalTools, totalClaims: claims.length, uncovered: r.uncovered, coveragePercent, threshold, hint };
111
119
  }
112
120
  catch (e) {
113
- return { ok: true, totalTools: 0, totalClaims: 0, uncovered: [], hint: `release-gate skipped: ${e.message}` };
121
+ const threshold = Number.isFinite(opts.threshold) ? opts.threshold : 50;
122
+ return { ok: true, totalTools: 0, totalClaims: 0, uncovered: [], coveragePercent: 0, threshold, hint: `release-gate skipped: ${e.message}` };
114
123
  }
115
124
  }
116
125
  //# sourceMappingURL=probe_coverage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"probe_coverage.js","sourceRoot":"","sources":["../../src/release_gate/probe_coverage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"probe_coverage.js","sourceRoot":"","sources":["../../src/release_gate/probe_coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * v2.53.0 — WIRING-LAG CI gate.
3
+ *
4
+ * Closes P0-3 from v2.52 audit: WIRING LAG class re-emerges every
5
+ * 2-3 releases (dev_tooling v2.45→v2.49, honest_receipt v2.36 still,
6
+ * probe_coverage v2.48→v2.51). Pattern: commit message claims
7
+ * `mneme <verb>` works but the actual CLI surface wasn't wired.
8
+ *
9
+ * This gate parses recent commit messages, extracts every `mneme <verb>`
10
+ * claim, spawns each as a real subprocess (CLI), and surfaces every
11
+ * "unknown command" exit as a wiring-lag bug.
12
+ *
13
+ * Designed to run BOTH in CI and via release.mjs pre-tag.
14
+ */
15
+ export interface ClaimedVerb {
16
+ /** Full claimed CLI invocation, e.g. "mneme nemesis stealth_score". */
17
+ full: string;
18
+ /** Top-level verb (e.g. "nemesis"). */
19
+ verb: string;
20
+ /** Subverb if present (e.g. "stealth_score"). */
21
+ subverb?: string;
22
+ /** Commit sha + subject this was extracted from. */
23
+ source: {
24
+ sha: string;
25
+ subject: string;
26
+ };
27
+ }
28
+ export interface WiringLagResult {
29
+ ok: boolean;
30
+ totalClaims: number;
31
+ workingCount: number;
32
+ brokenCount: number;
33
+ broken: Array<{
34
+ verb: string;
35
+ reason: string;
36
+ source: {
37
+ sha: string;
38
+ subject: string;
39
+ };
40
+ }>;
41
+ scannedCommits: number;
42
+ /** Hint when broken > 0. */
43
+ hint: string;
44
+ }
45
+ /**
46
+ * Parse `git log -N --format` output + extract every `mneme <verb> [subverb]`
47
+ * claim. Returns deduplicated list of verbs.
48
+ */
49
+ export declare function extractClaimedVerbs(repoRoot: string, opts?: {
50
+ maxCommits?: number;
51
+ }): {
52
+ verbs: ClaimedVerb[];
53
+ scannedCommits: number;
54
+ };
55
+ /**
56
+ * Spawn each verb as a subprocess (with --help to avoid side-effects)
57
+ * + check exit code + stderr for "unknown command" markers.
58
+ *
59
+ * Defensive: respects per-process timeout; never throws.
60
+ */
61
+ export declare function checkWiringLag(repoRoot: string, opts?: {
62
+ maxCommits?: number;
63
+ cliBin?: string;
64
+ }): WiringLagResult;
65
+ //# sourceMappingURL=wiring_lag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiring_lag.d.ts","sourceRoot":"","sources":["../../src/release_gate/wiring_lag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IAC1F,cAAc,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAoC1I;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,eAAe,CA6CrH"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * v2.53.0 — WIRING-LAG CI gate.
3
+ *
4
+ * Closes P0-3 from v2.52 audit: WIRING LAG class re-emerges every
5
+ * 2-3 releases (dev_tooling v2.45→v2.49, honest_receipt v2.36 still,
6
+ * probe_coverage v2.48→v2.51). Pattern: commit message claims
7
+ * `mneme <verb>` works but the actual CLI surface wasn't wired.
8
+ *
9
+ * This gate parses recent commit messages, extracts every `mneme <verb>`
10
+ * claim, spawns each as a real subprocess (CLI), and surfaces every
11
+ * "unknown command" exit as a wiring-lag bug.
12
+ *
13
+ * Designed to run BOTH in CI and via release.mjs pre-tag.
14
+ */
15
+ import { spawnSync, execSync } from "node:child_process";
16
+ import { existsSync } from "node:fs";
17
+ import { resolve } from "node:path";
18
+ /**
19
+ * Parse `git log -N --format` output + extract every `mneme <verb> [subverb]`
20
+ * claim. Returns deduplicated list of verbs.
21
+ */
22
+ export function extractClaimedVerbs(repoRoot, opts = {}) {
23
+ const maxCommits = opts.maxCommits ?? 10;
24
+ try {
25
+ const log = execSync(`git -C "${repoRoot}" log -${maxCommits} --format="%H%n%s%n%b%n--MNEMESPLIT--"`, {
26
+ encoding: "utf8", timeout: 8000,
27
+ });
28
+ const entries = log.split("--MNEMESPLIT--").filter((s) => s.trim());
29
+ const verbs = new Map(); // key = full
30
+ let scanned = 0;
31
+ for (const e of entries) {
32
+ const lines = e.trim().split("\n");
33
+ const sha = lines[0]?.trim() ?? "";
34
+ const subject = lines[1]?.trim() ?? "";
35
+ if (!sha)
36
+ continue;
37
+ scanned++;
38
+ const body = lines.slice(1).join("\n");
39
+ // Match `mneme <verb> [subverb]` — exclude commit prefix words
40
+ const matches = body.match(/`?mneme\s+([a-z_][a-z0-9_]*)(?:\s+([a-z_][a-z0-9_]*))?`?/gi) ?? [];
41
+ for (const m of matches) {
42
+ const inner = m.match(/mneme\s+([a-z_][a-z0-9_]*)(?:\s+([a-z_][a-z0-9_]*))?/i);
43
+ if (!inner)
44
+ continue;
45
+ const verb = inner[1].toLowerCase();
46
+ const subverb = inner[2]?.toLowerCase();
47
+ // Skip common false-positives (commit subject prefixes / placeholders)
48
+ if (["release", "version", "init", "log", "diff", "status", "push", "config"].includes(verb))
49
+ continue;
50
+ const full = subverb ? `mneme ${verb} ${subverb}` : `mneme ${verb}`;
51
+ if (!verbs.has(full)) {
52
+ verbs.set(full, { full, verb, subverb, source: { sha: sha.slice(0, 7), subject } });
53
+ }
54
+ }
55
+ }
56
+ return { verbs: Array.from(verbs.values()), scannedCommits: scanned };
57
+ }
58
+ catch (e) {
59
+ void e;
60
+ return { verbs: [], scannedCommits: 0 };
61
+ }
62
+ }
63
+ /**
64
+ * Spawn each verb as a subprocess (with --help to avoid side-effects)
65
+ * + check exit code + stderr for "unknown command" markers.
66
+ *
67
+ * Defensive: respects per-process timeout; never throws.
68
+ */
69
+ export function checkWiringLag(repoRoot, opts = {}) {
70
+ const cliBin = opts.cliBin ?? resolve(repoRoot, "packages/cli/bin/mneme.js");
71
+ if (!existsSync(cliBin)) {
72
+ return {
73
+ ok: true,
74
+ totalClaims: 0,
75
+ workingCount: 0,
76
+ brokenCount: 0,
77
+ broken: [],
78
+ scannedCommits: 0,
79
+ hint: `CLI bin not built at ${cliBin} — skipping wiring-lag gate (run npm --prefix packages/cli run build)`,
80
+ };
81
+ }
82
+ const { verbs, scannedCommits } = extractClaimedVerbs(repoRoot, { maxCommits: opts.maxCommits ?? 10 });
83
+ const broken = [];
84
+ let working = 0;
85
+ for (const v of verbs) {
86
+ // We probe `<verb> --help` (or `<verb> <subverb> --help`) — every CLI
87
+ // that exists should accept --help and exit 0 (or non-error). Unknown
88
+ // verbs cause commander to print "unknown command" on stderr.
89
+ const args = v.subverb ? [v.verb, v.subverb, "--help"] : [v.verb, "--help"];
90
+ const r = spawnSync(process.execPath, [cliBin, ...args], {
91
+ encoding: "utf8", timeout: 8000, cwd: repoRoot,
92
+ env: { ...process.env, MNEME_WARMCALL: "0", MNEME_MUSCLE_BYPASS: "0", NO_COLOR: "1" },
93
+ });
94
+ const out = (r.stdout ?? "") + (r.stderr ?? "");
95
+ const unknownMatch = /unknown command|did you mean|error: unknown/i.test(out) && !/Did you mean `mneme/.test(out);
96
+ if (unknownMatch) {
97
+ broken.push({ verb: v.full, reason: `subprocess reported "unknown command" — claimed in ${v.source.sha} "${v.source.subject}"`, source: v.source });
98
+ }
99
+ else {
100
+ working++;
101
+ }
102
+ }
103
+ const ok = broken.length === 0;
104
+ return {
105
+ ok,
106
+ totalClaims: verbs.length,
107
+ workingCount: working,
108
+ brokenCount: broken.length,
109
+ broken,
110
+ scannedCommits,
111
+ hint: ok
112
+ ? `wiring-lag gate: ${working}/${verbs.length} claimed verbs work (scanned ${scannedCommits} commits)`
113
+ : `wiring-lag gate FAILED: ${broken.length}/${verbs.length} claimed verbs are unwired. Fix the broken verbs or update the commit messages.`,
114
+ };
115
+ }
116
+ //# sourceMappingURL=wiring_lag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiring_lag.js","sourceRoot":"","sources":["../../src/release_gate/wiring_lag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * v2.54.0 — STRATEGY primitive: turn the v2.53 audit's Tier-3 protocols +
3
+ * pricing + RFC roadmap into a callable Mneme tool.
4
+ *
5
+ * Why ship strategy AS a primitive (not just a docs file): so AI agents
6
+ * can introspect Mneme's roadmap + cite official text + verify pricing
7
+ * tiers all in one place. Pure deterministic + defensive; never throws.
8
+ */
9
+ export interface PricingTier {
10
+ name: string;
11
+ audience: string;
12
+ price: string;
13
+ benefits: string[];
14
+ isFree: boolean;
15
+ }
16
+ export declare const PRICING_TIERS: ReadonlyArray<PricingTier>;
17
+ export interface RfcDraft {
18
+ id: string;
19
+ title: string;
20
+ status: "draft" | "in-review" | "submitted" | "accepted" | "deferred";
21
+ /** Standards body target. */
22
+ targetBody: "W3C" | "ECMA" | "NIST" | "IETF" | "ISO" | "EU-DPA";
23
+ abstract: string;
24
+ /** One-line cite to the existing Mneme primitive this RFC distills. */
25
+ builtOn: string;
26
+ /** Plain-English motivation. */
27
+ motivation: string;
28
+ /** Earliest plausible target date for first review. */
29
+ targetReviewYear: number;
30
+ docPath?: string;
31
+ }
32
+ export declare const RFC_DRAFTS: ReadonlyArray<RfcDraft>;
33
+ export interface StrategyReport {
34
+ pricing: ReadonlyArray<PricingTier>;
35
+ rfcDrafts: ReadonlyArray<RfcDraft>;
36
+ rfcStatusCounts: Record<string, number>;
37
+ pricingNote: string;
38
+ at: string;
39
+ }
40
+ export declare function getStrategyReport(): StrategyReport;
41
+ export declare function renderPricingTable(): string;
42
+ export declare function renderRfcIndex(): string;
43
+ //# sourceMappingURL=strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../src/strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,WAAW,CAoDpD,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC;IACtE,6BAA6B;IAC7B,UAAU,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,QAAQ,CAkC9C,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACpC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAUlD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAGvC"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * v2.54.0 — STRATEGY primitive: turn the v2.53 audit's Tier-3 protocols +
3
+ * pricing + RFC roadmap into a callable Mneme tool.
4
+ *
5
+ * Why ship strategy AS a primitive (not just a docs file): so AI agents
6
+ * can introspect Mneme's roadmap + cite official text + verify pricing
7
+ * tiers all in one place. Pure deterministic + defensive; never throws.
8
+ */
9
+ export const PRICING_TIERS = [
10
+ {
11
+ name: "Free local",
12
+ audience: "Solo dev / OSS",
13
+ price: "$0",
14
+ benefits: [
15
+ "Full CLI surface (200+ tools)",
16
+ "All NEMESIS / TRUTH GATE / PEAK GAUNTLET",
17
+ "Local HMAC chains + verifyCliActivity",
18
+ "MILLION DOLLAR SECRET DIAMONDS (6) — STEALTH / CAPILLARY / COLOSSEUM / MOLT / THEMIS / SIBYL",
19
+ ],
20
+ isFree: true,
21
+ },
22
+ {
23
+ name: "Pro Federation",
24
+ audience: "Small teams (≤25 dev)",
25
+ price: "$20/mo/dev",
26
+ benefits: [
27
+ "Cross-machine handoff via NIMBUS federated mesh",
28
+ "Private HGP federation",
29
+ "Private COLOSSEUM with org-only leaderboard",
30
+ "Priority bug-fix support window",
31
+ "Cross-vendor session handoff (mneme.diaspora) over consented bridge",
32
+ ],
33
+ isFree: false,
34
+ },
35
+ {
36
+ name: "Enterprise Compliance",
37
+ audience: "Companies with EU AI Act exposure",
38
+ price: "$50K/yr/org",
39
+ benefits: [
40
+ "GAVEL court-admissible bundle service",
41
+ "AUDIT REPRODUCTION SUITE (v2.51) with custom claims",
42
+ "SLA on TRUTH GATE probe library + dedicated probe authoring",
43
+ "Quarterly compliance posture review",
44
+ "LETHE GDPR forget primitive + retention policy automation",
45
+ ],
46
+ isFree: false,
47
+ },
48
+ {
49
+ name: "Sovereign",
50
+ audience: "Government / regulators",
51
+ price: "$500K/yr",
52
+ benefits: [
53
+ "On-prem NIMBUS federation (no cloud dependency)",
54
+ "Custom probe binding for sector-specific regulation",
55
+ "Audit log forensics + chain-of-custody export",
56
+ "Dedicated cryptographic key management (HSM integration)",
57
+ "Direct line for Article 50 DPA inquiries",
58
+ ],
59
+ isFree: false,
60
+ },
61
+ ];
62
+ export const RFC_DRAFTS = [
63
+ {
64
+ id: "RFC-001",
65
+ title: "AI-Generated-Content Disclosure Block Format",
66
+ status: "draft",
67
+ targetBody: "W3C",
68
+ abstract: "Defines a machine-parseable + HMAC-signed disclosure block to be embedded in commit messages, code comments, generated documents, and emitted artifacts. Enables EU AI Act Article 50 (Aug 2026) automated compliance.",
69
+ builtOn: "Mneme NEMESIS ORGAN 3 — eu_ai_act_stamp.ts schema (regime / article / vendor / confidence / contentType / at / hmac fields with sentinel-bracketed body).",
70
+ motivation: "EU AI Act Article 50 mandates disclosure but does not specify format. Without a standard, every vendor invents their own; auditors cannot cross-verify; users see noise. Mneme has shipped a working schema in production since v2.46 — propose it as the W3C standard.",
71
+ targetReviewYear: 2026,
72
+ docPath: "docs/rfc/RFC-001-disclosure-format.md",
73
+ },
74
+ {
75
+ id: "RFC-002",
76
+ title: "Cross-Vendor AI Session Handoff Protocol",
77
+ status: "draft",
78
+ targetBody: "ECMA",
79
+ abstract: "Defines a portable, HMAC-signed session envelope ('soul prompt') that lets an in-progress AI session move between vendors (Claude → Cursor → Codex → Gemini) without context loss or vendor lock-in.",
80
+ builtOn: "Mneme DIASPORA / GENESPLICE primitives (mneme.diaspora.session.capture + mneme.genesplice.soul-prompt) + SIBYL identity commitment for cross-vendor identity continuity.",
81
+ motivation: "AI vendors today are silos. Users cannot continue a Claude conversation in Cursor without re-pasting context. A standard handoff protocol is a network-effects unlocker — and the user holds the data, not the vendor.",
82
+ targetReviewYear: 2026,
83
+ docPath: "docs/rfc/RFC-002-cross-vendor-handoff.md",
84
+ },
85
+ {
86
+ id: "RFC-003",
87
+ title: "Behavioural Fingerprint-Based Agent Identity Standard",
88
+ status: "draft",
89
+ targetBody: "NIST",
90
+ abstract: "Defines a 41+ canonical behavioural feature set (extensible via CAPILLARY micro-tells) for deriving + verifying AI agent identity from output alone, without trusting the agent's self-declaration.",
91
+ builtOn: "Mneme NEMESIS classifier (arxiv 2601.17406 features) + CAPILLARY 50+ micro-tells + JANUS cross-cluster boundary detection.",
92
+ motivation: "AI vendors self-declare identity; downstream consumers have no way to verify. NEMESIS demonstrated 97.2% F1 identity verification from output alone (composed on academic feature set + Mneme's HMAC chain). NIST is the right body to canonise the feature set as a verification standard.",
93
+ targetReviewYear: 2027,
94
+ docPath: "docs/rfc/RFC-003-fingerprint-identity-standard.md",
95
+ },
96
+ ];
97
+ export function getStrategyReport() {
98
+ const rfcStatusCounts = {};
99
+ for (const r of RFC_DRAFTS)
100
+ rfcStatusCounts[r.status] = (rfcStatusCounts[r.status] ?? 0) + 1;
101
+ return {
102
+ pricing: PRICING_TIERS,
103
+ rfcDrafts: RFC_DRAFTS,
104
+ rfcStatusCounts,
105
+ pricingNote: "Free local tier is the primary growth engine. Paid tiers fund full-time dev — bus-factor risk reduction from 1 → team.",
106
+ at: new Date().toISOString(),
107
+ };
108
+ }
109
+ export function renderPricingTable() {
110
+ const rows = PRICING_TIERS.map((t) => ` - ${t.name.padEnd(22)} ${t.price.padEnd(14)} — ${t.audience}`);
111
+ return ["PRICING TIERS:", ...rows].join("\n");
112
+ }
113
+ export function renderRfcIndex() {
114
+ const rows = RFC_DRAFTS.map((r) => ` ${r.id} [${r.status}] → ${r.targetBody}: ${r.title}`);
115
+ return ["RFC ROADMAP:", ...rows].join("\n");
116
+ }
117
+ //# sourceMappingURL=strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../src/strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,CAAC,MAAM,aAAa,GAA+B;IACvD;QACE,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,gBAAgB;QAC1B,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE;YACR,+BAA+B;YAC/B,0CAA0C;YAC1C,uCAAuC;YACvC,8FAA8F;SAC/F;QACD,MAAM,EAAE,IAAI;KACb;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,uBAAuB;QACjC,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE;YACR,iDAAiD;YACjD,wBAAwB;YACxB,6CAA6C;YAC7C,iCAAiC;YACjC,qEAAqE;SACtE;QACD,MAAM,EAAE,KAAK;KACd;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,mCAAmC;QAC7C,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE;YACR,uCAAuC;YACvC,qDAAqD;YACrD,6DAA6D;YAC7D,qCAAqC;YACrC,2DAA2D;SAC5D;QACD,MAAM,EAAE,KAAK;KACd;IACD;QACE,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,yBAAyB;QACnC,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE;YACR,iDAAiD;YACjD,qDAAqD;YACrD,+CAA+C;YAC/C,0DAA0D;YAC1D,0CAA0C;SAC3C;QACD,MAAM,EAAE,KAAK;KACd;CACF,CAAC;AAkBF,MAAM,CAAC,MAAM,UAAU,GAA4B;IACjD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,8CAA8C;QACrD,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,wNAAwN;QAClO,OAAO,EAAE,2JAA2J;QACpK,UAAU,EAAE,yQAAyQ;QACrR,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,uCAAuC;KACjD;IACD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,0CAA0C;QACjD,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,sMAAsM;QAChN,OAAO,EAAE,0KAA0K;QACnL,UAAU,EAAE,wNAAwN;QACpO,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,0CAA0C;KACpD;IACD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,uDAAuD;QAC9D,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,qMAAqM;QAC/M,OAAO,EAAE,4HAA4H;QACrI,UAAU,EAAE,6RAA6R;QACzS,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,mDAAmD;KAC7D;CACF,CAAC;AAUF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,eAAe,GAA2B,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7F,OAAO;QACL,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,UAAU;QACrB,eAAe;QACf,WAAW,EAAE,wHAAwH;QACrI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxG,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5F,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"claims.d.ts","sourceRoot":"","sources":["../../src/truth_gate/claims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,KAAK,CA2R9C,CAAC"}
1
+ {"version":3,"file":"claims.d.ts","sourceRoot":"","sources":["../../src/truth_gate/claims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,KAAK,CAoU9C,CAAC"}
@@ -222,6 +222,47 @@ export const CLAIM_CATALOG = [
222
222
  probeId: "probe.activity.vendor_field_never_embedder",
223
223
  severity: "block",
224
224
  },
225
+ // ── v2.54.0 — WORLD-CLASS PREMIUM bindings ──────────────────────────
226
+ {
227
+ id: "claim.nemesis.world_class_premium_primitives",
228
+ source: "v2.54.0 release notes",
229
+ text: "Mneme ships 3 world-class premium NEMESIS extensions inspired by v2.53 audit Tier-2/3: LETHE (GDPR forget with Merkle exclusion proof), GAVEL (court-admissible bundle binding THEMIS + EU stamp + SIBYL via Merkle tree), NIMBUS (federated trust mesh: per-org HMAC-signed leaderboard cards + cross-org weighted reputation)",
230
+ kind: "numeric",
231
+ asserted: { value: 1, op: "=", unit: "boolean" },
232
+ probeId: "probe.nemesis.world_class_premium_primitives",
233
+ severity: "block",
234
+ },
235
+ {
236
+ id: "claim.perf.budgets_met",
237
+ source: "v2.54.0 release notes",
238
+ text: "Mneme's 5 hot-path operations (extract_fingerprint / classify_calibrated / eu_stamp / stealth_score / janus_observe) stay within published per-op performance budgets; release-script gate refuses tag on regression",
239
+ kind: "numeric",
240
+ asserted: { value: 1, op: "=", unit: "boolean" },
241
+ probeId: "probe.perf.budgets_met",
242
+ severity: "block",
243
+ },
244
+ {
245
+ id: "claim.strategy.tier3_complete",
246
+ source: "v2.54.0 release notes",
247
+ text: "Mneme ships strategy primitive with ≥3 RFC drafts (W3C disclosure block / ECMA cross-vendor handoff / NIST fingerprint-identity standard), ≥4 pricing tiers (Free / Pro / Enterprise / Sovereign), and a measurable indispensability score (6-criterion weighted checklist) ≥0.5",
248
+ kind: "numeric",
249
+ asserted: { value: 1, op: "=", unit: "boolean" },
250
+ probeId: "probe.strategy.tier3_complete",
251
+ severity: "block",
252
+ },
253
+ // ── v2.53.0 — PATCH OPEN WOUNDS (P0/P1) binding ─────────────────────
254
+ // Closes the 8-finding session audit: HMAC default key / probe coverage
255
+ // 14.2% / WIRING LAG class / EU stamp 700-984ms / classify accuracy
256
+ // on wild / identity-swap blind spot / flag inconsistency / tool count drift.
257
+ {
258
+ id: "claim.audit.open_wounds_patched",
259
+ source: "v2.53.0 release notes",
260
+ text: "Mneme patches all 8 open wounds from the v2.52 session audit: P0-1 HMAC key wizard auto-generates + STRICT mode refuses default-insecure; P0-2 probe coverage gate accepts a percentage threshold (default 50%); P0-3 wiring-lag CI gate parses commit messages + spawns each claimed verb; P1-1 EU stamp avg <50ms warm-path (was 700-984ms); P1-2 NEMESIS classifier ≥85% on a 6x-augmented corpus (header-less + naturalistic perturbations); P1-3 JANUS organ detects cross-vendor cluster boundary swaps (Eve's blind spot); P1-5 tool count single source of truth (HMAC-signed catalog envelope)",
261
+ kind: "numeric",
262
+ asserted: { value: 1, op: "=", unit: "boolean" },
263
+ probeId: "probe.audit.open_wounds_patched",
264
+ severity: "block",
265
+ },
225
266
  // ── v2.52.0 — MILLION DOLLAR SECRET DIAMONDS binding ────────────────
226
267
  // Inspired by the Netflix identity-deception reality show: 6 NEMESIS
227
268
  // extensions that turn fingerprinting into competitive / forensic /