@mneme-ai/core 2.53.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 (42) hide show
  1. package/dist/agent_manifest.d.ts.map +1 -1
  2. package/dist/agent_manifest.js +13 -0
  3. package/dist/agent_manifest.js.map +1 -1
  4. package/dist/index.d.ts +3 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +7 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/indispensability.d.ts +31 -0
  9. package/dist/indispensability.d.ts.map +1 -0
  10. package/dist/indispensability.js +182 -0
  11. package/dist/indispensability.js.map +1 -0
  12. package/dist/nemesis/gavel.d.ts +102 -0
  13. package/dist/nemesis/gavel.d.ts.map +1 -0
  14. package/dist/nemesis/gavel.js +192 -0
  15. package/dist/nemesis/gavel.js.map +1 -0
  16. package/dist/nemesis/index.d.ts +3 -0
  17. package/dist/nemesis/index.d.ts.map +1 -1
  18. package/dist/nemesis/index.js +7 -0
  19. package/dist/nemesis/index.js.map +1 -1
  20. package/dist/nemesis/lethe.d.ts +112 -0
  21. package/dist/nemesis/lethe.d.ts.map +1 -0
  22. package/dist/nemesis/lethe.js +211 -0
  23. package/dist/nemesis/lethe.js.map +1 -0
  24. package/dist/nemesis/nimbus.d.ts +117 -0
  25. package/dist/nemesis/nimbus.d.ts.map +1 -0
  26. package/dist/nemesis/nimbus.js +208 -0
  27. package/dist/nemesis/nimbus.js.map +1 -0
  28. package/dist/perf_budget.d.ts +48 -0
  29. package/dist/perf_budget.d.ts.map +1 -0
  30. package/dist/perf_budget.js +111 -0
  31. package/dist/perf_budget.js.map +1 -0
  32. package/dist/strategy.d.ts +43 -0
  33. package/dist/strategy.d.ts.map +1 -0
  34. package/dist/strategy.js +117 -0
  35. package/dist/strategy.js.map +1 -0
  36. package/dist/truth_gate/claims.d.ts.map +1 -1
  37. package/dist/truth_gate/claims.js +28 -0
  38. package/dist/truth_gate/claims.js.map +1 -1
  39. package/dist/truth_gate/probes.d.ts.map +1 -1
  40. package/dist/truth_gate/probes.js +134 -0
  41. package/dist/truth_gate/probes.js.map +1 -1
  42. package/package.json +1 -1
@@ -0,0 +1,117 @@
1
+ /**
2
+ * v2.54.0 — NIMBUS: federated trust mesh primitive.
3
+ *
4
+ * Latin: cloud / aura. Per-org leaderboards + cross-org reputation
5
+ * transfer, gated by CONSENT FABRIC.
6
+ *
7
+ * Design (network-effects-first):
8
+ * Each Mneme installation can publish a signed LEADERBOARD CARD
9
+ * summarising the org's TRUSTed primitives:
10
+ * - COLOSSEUM top-5 vendors + ELO scores
11
+ * - HONEST MIRROR per-vendor false-rate windowed lower bound
12
+ * - NEMESIS dispute count
13
+ * - Org-level consent + scope (which artifacts shareable)
14
+ *
15
+ * Consumers subscribe to other orgs' cards + compute weighted
16
+ * cross-org reputation. The trust mesh is a federation, not a
17
+ * central server.
18
+ *
19
+ * v2.54 ships the LOCAL pub/sub primitive (no network). Network
20
+ * transport is a future extension via the existing bridge.
21
+ *
22
+ * Privacy: only AGGREGATED scores cross the boundary. Per-commit
23
+ * fingerprints + raw activity never leave the org.
24
+ *
25
+ * Composes: createHmac + the existing leaderboard / mirror primitives.
26
+ * Pure deterministic + defensive; never throws.
27
+ */
28
+ export interface NimbusVendorEntry {
29
+ vendor: string;
30
+ elo?: number;
31
+ falseRateLB?: number;
32
+ /** Sample size — readers can weight by N. */
33
+ n?: number;
34
+ }
35
+ export interface NimbusCard {
36
+ /** Anonymized org identifier (HMAC of git-remote or user-set tag). */
37
+ orgFingerprint: string;
38
+ at: string;
39
+ /** Top vendors by ELO (from COLOSSEUM). */
40
+ topByElo: NimbusVendorEntry[];
41
+ /** Vendors by lowest false-rate LB (from HONEST MIRROR / BOUNTY). */
42
+ topByHonesty: NimbusVendorEntry[];
43
+ /** Consent fields — what may consumers do with this card. */
44
+ consent: {
45
+ sharedScopes: string[];
46
+ expiresAt: string;
47
+ /** Revocation URI (if any). */
48
+ revocationRef?: string;
49
+ };
50
+ /** Optional sticky note for human readers. */
51
+ note?: string;
52
+ /** Card-level HMAC. */
53
+ hmac: string;
54
+ }
55
+ export interface PublishInput {
56
+ repoRoot: string;
57
+ orgTag: string;
58
+ topByElo?: NimbusVendorEntry[];
59
+ topByHonesty?: NimbusVendorEntry[];
60
+ sharedScopes?: string[];
61
+ expiresAtIso?: string;
62
+ revocationRef?: string;
63
+ note?: string;
64
+ persist?: boolean;
65
+ }
66
+ export interface PublishResult {
67
+ ok: boolean;
68
+ card?: NimbusCard;
69
+ path?: string;
70
+ reason: string;
71
+ }
72
+ /**
73
+ * Publish a NIMBUS card to the local pub-store. Pure: card is just a
74
+ * signed JSON envelope; transport to other orgs is the caller's job
75
+ * (HTTP / git / file copy / etc).
76
+ */
77
+ export declare function publishCard(input: PublishInput): PublishResult;
78
+ /** Verify a NIMBUS card's HMAC + expiry. Pure. */
79
+ export declare function verifyCard(card: NimbusCard): {
80
+ ok: boolean;
81
+ expired: boolean;
82
+ reason: string;
83
+ };
84
+ export interface SubscriptionEntry {
85
+ at: string;
86
+ orgFingerprint: string;
87
+ card: NimbusCard;
88
+ /** Caller's local trust weight for this org (0..1). */
89
+ trustWeight: number;
90
+ }
91
+ export interface SubscribeInput {
92
+ repoRoot: string;
93
+ card: NimbusCard;
94
+ trustWeight?: number;
95
+ persist?: boolean;
96
+ }
97
+ export declare function subscribeCard(input: SubscribeInput): {
98
+ ok: boolean;
99
+ entry?: SubscriptionEntry;
100
+ reason: string;
101
+ };
102
+ /**
103
+ * Compute cross-org weighted reputation: per vendor, weighted average
104
+ * of (ELO + 1/(1+falseRateLB)) across all subscribed cards.
105
+ * Returns a ranked list with confidence.
106
+ */
107
+ export interface CrossOrgReputation {
108
+ vendor: string;
109
+ weightedScore: number;
110
+ contributingOrgs: number;
111
+ /** Sum of trustWeights — proxy for confidence. */
112
+ totalWeight: number;
113
+ }
114
+ export declare function computeCrossOrgReputation(repoRoot: string): CrossOrgReputation[];
115
+ export declare function listPublished(repoRoot: string): NimbusCard[];
116
+ export declare function listSubscriptions(repoRoot: string): SubscriptionEntry[];
117
+ //# sourceMappingURL=nimbus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nimbus.d.ts","sourceRoot":"","sources":["../../src/nemesis/nimbus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * v2.54.0 — NIMBUS: federated trust mesh primitive.
3
+ *
4
+ * Latin: cloud / aura. Per-org leaderboards + cross-org reputation
5
+ * transfer, gated by CONSENT FABRIC.
6
+ *
7
+ * Design (network-effects-first):
8
+ * Each Mneme installation can publish a signed LEADERBOARD CARD
9
+ * summarising the org's TRUSTed primitives:
10
+ * - COLOSSEUM top-5 vendors + ELO scores
11
+ * - HONEST MIRROR per-vendor false-rate windowed lower bound
12
+ * - NEMESIS dispute count
13
+ * - Org-level consent + scope (which artifacts shareable)
14
+ *
15
+ * Consumers subscribe to other orgs' cards + compute weighted
16
+ * cross-org reputation. The trust mesh is a federation, not a
17
+ * central server.
18
+ *
19
+ * v2.54 ships the LOCAL pub/sub primitive (no network). Network
20
+ * transport is a future extension via the existing bridge.
21
+ *
22
+ * Privacy: only AGGREGATED scores cross the boundary. Per-commit
23
+ * fingerprints + raw activity never leave the org.
24
+ *
25
+ * Composes: createHmac + the existing leaderboard / mirror primitives.
26
+ * Pure deterministic + defensive; never throws.
27
+ */
28
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync } from "node:fs";
29
+ import { join } from "node:path";
30
+ import { createHmac } from "node:crypto";
31
+ const NIMBUS_DIR = ".mneme/nemesis/nimbus";
32
+ const PUBLISHED_FILE = "published_cards.jsonl";
33
+ const SUBSCRIPTIONS_FILE = "subscriptions.jsonl";
34
+ const KEY_ENV = "MNEME_NIMBUS_KEY";
35
+ const DEFAULT_KEY = "mneme-nimbus-v1";
36
+ function keyOf() {
37
+ return process.env[KEY_ENV] ?? DEFAULT_KEY;
38
+ }
39
+ function hmacOf(body) {
40
+ return createHmac("sha256", keyOf()).update(JSON.stringify(body)).digest("hex");
41
+ }
42
+ /**
43
+ * Publish a NIMBUS card to the local pub-store. Pure: card is just a
44
+ * signed JSON envelope; transport to other orgs is the caller's job
45
+ * (HTTP / git / file copy / etc).
46
+ */
47
+ export function publishCard(input) {
48
+ try {
49
+ if (!input || !input.orgTag)
50
+ return { ok: false, reason: "orgTag required" };
51
+ const orgFingerprint = createHmac("sha256", keyOf()).update("org:").update(input.orgTag).digest("hex").slice(0, 16);
52
+ const at = new Date().toISOString();
53
+ const expiresAt = input.expiresAtIso ?? new Date(Date.now() + 90 * 86_400_000).toISOString();
54
+ const cardBody = {
55
+ orgFingerprint,
56
+ at,
57
+ topByElo: input.topByElo ?? [],
58
+ topByHonesty: input.topByHonesty ?? [],
59
+ consent: {
60
+ sharedScopes: input.sharedScopes ?? ["leaderboard:read"],
61
+ expiresAt,
62
+ revocationRef: input.revocationRef,
63
+ },
64
+ note: input.note,
65
+ };
66
+ const card = { ...cardBody, hmac: hmacOf(cardBody) };
67
+ if (input.persist !== false) {
68
+ try {
69
+ const dir = join(input.repoRoot, NIMBUS_DIR);
70
+ if (!existsSync(dir))
71
+ mkdirSync(dir, { recursive: true });
72
+ const p = join(dir, PUBLISHED_FILE);
73
+ appendFileSync(p, JSON.stringify(card) + "\n");
74
+ return { ok: true, card, path: p, reason: `card published to ${p}` };
75
+ }
76
+ catch (e) {
77
+ return { ok: true, card, reason: `card built but persist failed: ${e.message}` };
78
+ }
79
+ }
80
+ return { ok: true, card, reason: "card built (no persist)" };
81
+ }
82
+ catch (e) {
83
+ return { ok: false, reason: `publish failed: ${e.message}` };
84
+ }
85
+ }
86
+ /** Verify a NIMBUS card's HMAC + expiry. Pure. */
87
+ export function verifyCard(card) {
88
+ if (!card || typeof card.hmac !== "string")
89
+ return { ok: false, expired: false, reason: "missing card or hmac" };
90
+ const { hmac, ...body } = card;
91
+ const expected = hmacOf(body);
92
+ if (expected !== hmac)
93
+ return { ok: false, expired: false, reason: "hmac mismatch" };
94
+ const expired = Date.parse(card.consent.expiresAt) < Date.now();
95
+ if (expired)
96
+ return { ok: false, expired: true, reason: "card expired" };
97
+ return { ok: true, expired: false, reason: "card verified + within expiry" };
98
+ }
99
+ export function subscribeCard(input) {
100
+ try {
101
+ if (!input || !input.card)
102
+ return { ok: false, reason: "card required" };
103
+ const v = verifyCard(input.card);
104
+ if (!v.ok)
105
+ return { ok: false, reason: `card refused: ${v.reason}` };
106
+ const trustWeight = typeof input.trustWeight === "number" ? Math.max(0, Math.min(1, input.trustWeight)) : 0.5;
107
+ const entry = {
108
+ at: new Date().toISOString(),
109
+ orgFingerprint: input.card.orgFingerprint,
110
+ card: input.card,
111
+ trustWeight,
112
+ };
113
+ if (input.persist !== false) {
114
+ try {
115
+ const dir = join(input.repoRoot, NIMBUS_DIR);
116
+ if (!existsSync(dir))
117
+ mkdirSync(dir, { recursive: true });
118
+ appendFileSync(join(dir, SUBSCRIPTIONS_FILE), JSON.stringify(entry) + "\n");
119
+ }
120
+ catch { /* */ }
121
+ }
122
+ return { ok: true, entry, reason: "card subscribed + verified" };
123
+ }
124
+ catch (e) {
125
+ return { ok: false, reason: `subscribe failed: ${e.message}` };
126
+ }
127
+ }
128
+ export function computeCrossOrgReputation(repoRoot) {
129
+ const p = join(repoRoot, NIMBUS_DIR, SUBSCRIPTIONS_FILE);
130
+ if (!existsSync(p))
131
+ return [];
132
+ const entries = [];
133
+ for (const line of readFileSync(p, "utf8").split("\n")) {
134
+ if (!line.trim())
135
+ continue;
136
+ try {
137
+ entries.push(JSON.parse(line));
138
+ }
139
+ catch { /* */ }
140
+ }
141
+ // Aggregate
142
+ const acc = new Map();
143
+ for (const e of entries) {
144
+ const w = e.trustWeight;
145
+ const seen = new Set();
146
+ for (const v of e.card.topByElo) {
147
+ const score = (v.elo ?? 1200) / 2000; // normalize to ~0..1
148
+ const cur = acc.get(v.vendor) ?? { weightedScoreSum: 0, orgs: new Set(), totalWeight: 0 };
149
+ cur.weightedScoreSum += score * w;
150
+ cur.totalWeight += w;
151
+ cur.orgs.add(e.orgFingerprint);
152
+ acc.set(v.vendor, cur);
153
+ seen.add(v.vendor);
154
+ }
155
+ for (const v of e.card.topByHonesty) {
156
+ if (seen.has(v.vendor))
157
+ continue;
158
+ const score = 1 / (1 + (v.falseRateLB ?? 0.5));
159
+ const cur = acc.get(v.vendor) ?? { weightedScoreSum: 0, orgs: new Set(), totalWeight: 0 };
160
+ cur.weightedScoreSum += score * w;
161
+ cur.totalWeight += w;
162
+ cur.orgs.add(e.orgFingerprint);
163
+ acc.set(v.vendor, cur);
164
+ }
165
+ }
166
+ const out = [];
167
+ for (const [vendor, a] of acc) {
168
+ out.push({
169
+ vendor,
170
+ weightedScore: a.totalWeight > 0 ? +(a.weightedScoreSum / a.totalWeight).toFixed(3) : 0,
171
+ contributingOrgs: a.orgs.size,
172
+ totalWeight: +a.totalWeight.toFixed(3),
173
+ });
174
+ }
175
+ return out.sort((a, b) => b.weightedScore - a.weightedScore);
176
+ }
177
+ export function listPublished(repoRoot) {
178
+ const p = join(repoRoot, NIMBUS_DIR, PUBLISHED_FILE);
179
+ if (!existsSync(p))
180
+ return [];
181
+ const out = [];
182
+ for (const line of readFileSync(p, "utf8").split("\n")) {
183
+ if (!line.trim())
184
+ continue;
185
+ try {
186
+ out.push(JSON.parse(line));
187
+ }
188
+ catch { /* */ }
189
+ }
190
+ return out;
191
+ }
192
+ export function listSubscriptions(repoRoot) {
193
+ const p = join(repoRoot, NIMBUS_DIR, SUBSCRIPTIONS_FILE);
194
+ if (!existsSync(p))
195
+ return [];
196
+ const out = [];
197
+ for (const line of readFileSync(p, "utf8").split("\n")) {
198
+ if (!line.trim())
199
+ continue;
200
+ try {
201
+ out.push(JSON.parse(line));
202
+ }
203
+ catch { /* */ }
204
+ }
205
+ return out;
206
+ }
207
+ void writeFileSync; // referenced for future use (revoke API)
208
+ //# sourceMappingURL=nimbus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nimbus.js","sourceRoot":"","sources":["../../src/nemesis/nimbus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
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
+ export interface PerfBudget {
16
+ /** Op identifier. */
17
+ op: string;
18
+ /** Budget ceiling in milliseconds (warm-path target). */
19
+ budgetMs: number;
20
+ /** Optional cold-path ceiling (first call). */
21
+ coldBudgetMs?: number;
22
+ /** Human-readable rationale for the budget. */
23
+ rationale: string;
24
+ }
25
+ export declare const PERF_BUDGETS: ReadonlyArray<PerfBudget>;
26
+ export interface PerfMeasurement {
27
+ op: string;
28
+ budgetMs: number;
29
+ warmMeanMs: number;
30
+ warmP95Ms: number;
31
+ coldFirstMs: number;
32
+ iterations: number;
33
+ ok: boolean;
34
+ }
35
+ export interface PerfBudgetReport {
36
+ ok: boolean;
37
+ measurements: PerfMeasurement[];
38
+ failing: string[];
39
+ at: string;
40
+ }
41
+ /**
42
+ * Run the full perf budget suite in-process. Iterations chosen so total
43
+ * runtime stays <2s on typical hardware.
44
+ */
45
+ export declare function runPerfBudget(): PerfBudgetReport;
46
+ /** Human-friendly text report. */
47
+ export declare function renderPerfBudgetReport(r: PerfBudgetReport): string;
48
+ //# sourceMappingURL=perf_budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf_budget.d.ts","sourceRoot":"","sources":["../src/perf_budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,UAAU,CAMlD,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAqCD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,gBAAgB,CAwBhD;AAED,kCAAkC;AAClC,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAUlE"}
@@ -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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"}
@@ -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"}