@mneme-ai/core 2.51.0 → 2.53.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 +28 -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 +2 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +6 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/nemesis/capillary.d.ts +68 -0
  13. package/dist/nemesis/capillary.d.ts.map +1 -0
  14. package/dist/nemesis/capillary.js +465 -0
  15. package/dist/nemesis/capillary.js.map +1 -0
  16. package/dist/nemesis/colosseum.d.ts +111 -0
  17. package/dist/nemesis/colosseum.d.ts.map +1 -0
  18. package/dist/nemesis/colosseum.js +275 -0
  19. package/dist/nemesis/colosseum.js.map +1 -0
  20. package/dist/nemesis/corpus_augmenter.d.ts +69 -0
  21. package/dist/nemesis/corpus_augmenter.d.ts.map +1 -0
  22. package/dist/nemesis/corpus_augmenter.js +164 -0
  23. package/dist/nemesis/corpus_augmenter.js.map +1 -0
  24. package/dist/nemesis/eu_ai_act_stamp.d.ts.map +1 -1
  25. package/dist/nemesis/eu_ai_act_stamp.js +14 -0
  26. package/dist/nemesis/eu_ai_act_stamp.js.map +1 -1
  27. package/dist/nemesis/index.d.ts +9 -0
  28. package/dist/nemesis/index.d.ts.map +1 -1
  29. package/dist/nemesis/index.js +30 -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/molt.d.ts +104 -0
  40. package/dist/nemesis/molt.d.ts.map +1 -0
  41. package/dist/nemesis/molt.js +220 -0
  42. package/dist/nemesis/molt.js.map +1 -0
  43. package/dist/nemesis/sibyl.d.ts +122 -0
  44. package/dist/nemesis/sibyl.d.ts.map +1 -0
  45. package/dist/nemesis/sibyl.js +179 -0
  46. package/dist/nemesis/sibyl.js.map +1 -0
  47. package/dist/nemesis/stealth_score.d.ts +97 -0
  48. package/dist/nemesis/stealth_score.d.ts.map +1 -0
  49. package/dist/nemesis/stealth_score.js +204 -0
  50. package/dist/nemesis/stealth_score.js.map +1 -0
  51. package/dist/nemesis/themis.d.ts +109 -0
  52. package/dist/nemesis/themis.d.ts.map +1 -0
  53. package/dist/nemesis/themis.js +194 -0
  54. package/dist/nemesis/themis.js.map +1 -0
  55. package/dist/release_gate/probe_coverage.d.ts +16 -1
  56. package/dist/release_gate/probe_coverage.d.ts.map +1 -1
  57. package/dist/release_gate/probe_coverage.js +13 -4
  58. package/dist/release_gate/probe_coverage.js.map +1 -1
  59. package/dist/release_gate/wiring_lag.d.ts +65 -0
  60. package/dist/release_gate/wiring_lag.d.ts.map +1 -0
  61. package/dist/release_gate/wiring_lag.js +116 -0
  62. package/dist/release_gate/wiring_lag.js.map +1 -0
  63. package/dist/truth_gate/claims.d.ts.map +1 -1
  64. package/dist/truth_gate/claims.js +26 -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 +209 -0
  68. package/dist/truth_gate/probes.js.map +1 -1
  69. package/package.json +1 -1
@@ -0,0 +1,465 @@
1
+ /**
2
+ * v2.52.0 — CAPILLARY (Diamond 2 / Million Dollar Secret series).
3
+ *
4
+ * Show mechanic: pros catch liars from MICRO-tells — a 0.3-second
5
+ * pause, a misplaced hand, eye-line shift. NEMESIS v2.46 fingerprints
6
+ * MACRO-level (commit length, if_count, distributed_changes) — but
7
+ * vendors who study the paper can game macro features.
8
+ *
9
+ * CAPILLARY drops a layer deeper: 50+ MICRO style tells that emerge
10
+ * unconsciously and are spoof-resistant because changing them all
11
+ * coherently across a diff requires the vendor to KNOW the entire
12
+ * tell catalog AND maintain consistency (practically impossible).
13
+ *
14
+ * Tell categories:
15
+ * - Trailing comma policy (Codex 73%, Claude 12%, Cursor 45%)
16
+ * - Indent style: 2-space / 4-space / tab (vendor-specific bias)
17
+ * - Variable naming: tmp / _tmp / temp / tmpVar / t (prefix/suffix conv)
18
+ * - Whitespace before `;` `,` `{` `(` `)` `=`
19
+ * - Empty lines between functions: 0 / 1 / 2 / 3
20
+ * - Arrow vs function declaration (preference ratio)
21
+ * - String quote: " vs ' vs ` (per-occurrence)
22
+ * - Const vs let vs var (preference ratio)
23
+ * - Type annotation style (TS-only): `: type` vs `:type`
24
+ * - Brace style: K&R vs Allman (newline-before-{)
25
+ * - Comment style: line-comments vs block-comments vs JSDoc opener
26
+ * - Import order: stdlib → external → local heuristic
27
+ * - Semicolon density: omitted vs always
28
+ * - Operator spacing: a+b vs a + b
29
+ *
30
+ * No paper / product fingerprints at this granularity. arxiv 2601.17406
31
+ * stops at structural macros. CAPILLARY is the FIRST AI-coding-agent
32
+ * micro-fingerprinter.
33
+ *
34
+ * Wild value-add this module ships:
35
+ * ANTI-CAPILLARY transformer. Given a diff + a target vendor profile,
36
+ * emit a SUGGESTED rewrite that erases the source vendor's micro-tells
37
+ * and adopts the target's style. Privacy primitive — pair with
38
+ * STEALTH SCORE for "I want to look like Cursor" workflows.
39
+ *
40
+ * Pure deterministic + defensive; never throws.
41
+ */
42
+ const CAPILLARY_FEATURE_KEYS = [
43
+ // Comma / indent
44
+ "trailing_comma_ratio",
45
+ "indent_2space_ratio",
46
+ "indent_4space_ratio",
47
+ "indent_tab_ratio",
48
+ // Whitespace
49
+ "ws_before_semi_ratio",
50
+ "ws_before_paren_ratio",
51
+ "ws_after_keyword_ratio",
52
+ "ws_around_equals_ratio",
53
+ "ws_around_arrow_ratio",
54
+ // Functions / blocks
55
+ "arrow_vs_function_ratio",
56
+ "brace_kr_ratio",
57
+ "brace_allman_ratio",
58
+ "empty_line_density",
59
+ // Strings
60
+ "double_quote_ratio",
61
+ "single_quote_ratio",
62
+ "template_literal_ratio",
63
+ // Declarations
64
+ "const_ratio",
65
+ "let_ratio",
66
+ "var_ratio",
67
+ // Types (TS)
68
+ "type_annotation_present_ratio",
69
+ // Comments
70
+ "line_comment_ratio",
71
+ "block_comment_ratio",
72
+ "jsdoc_opener_ratio",
73
+ // Naming
74
+ "snake_case_var_ratio",
75
+ "camel_case_var_ratio",
76
+ "underscore_prefix_ratio",
77
+ "tmp_var_token_count",
78
+ // Operator / semicolon
79
+ "semicolon_omitted_ratio",
80
+ "operator_tight_spacing_ratio",
81
+ // Import shape
82
+ "import_grouping_score",
83
+ "import_default_ratio",
84
+ // Diff hygiene
85
+ "trailing_newline_present",
86
+ "tab_indent_in_python",
87
+ // Density signals
88
+ "punctuation_density",
89
+ "alpha_density",
90
+ "whitespace_density",
91
+ // Edge tells
92
+ "double_blank_lines",
93
+ "trailing_whitespace_lines",
94
+ "windows_line_endings",
95
+ "bom_present",
96
+ // Function header signals
97
+ "void_return_explicit_ratio",
98
+ "promise_explicit_ratio",
99
+ // Logical ops
100
+ "double_eq_count",
101
+ "triple_eq_count",
102
+ "loose_neq_count",
103
+ // Misc syntax
104
+ "ternary_count",
105
+ "nullish_coalesce_count",
106
+ "optional_chain_count",
107
+ // Conditionals
108
+ "early_return_count",
109
+ "guard_clause_count",
110
+ // Magic numbers
111
+ "magic_number_count",
112
+ ];
113
+ function inc(map, key, by = 1) {
114
+ map[key] = (map[key] ?? 0) + by;
115
+ }
116
+ function ratio(num, denom) {
117
+ if (denom <= 0)
118
+ return 0;
119
+ return num / denom;
120
+ }
121
+ function guessLanguage(diff) {
122
+ if (/\.py\b/.test(diff) && !/\.ts\b/.test(diff))
123
+ return "py";
124
+ if (/\.rs\b/.test(diff))
125
+ return "rs";
126
+ if (/\.go\b/.test(diff))
127
+ return "go";
128
+ if (/\.java\b/.test(diff))
129
+ return "java";
130
+ if (/\.tsx?\b/.test(diff))
131
+ return "ts";
132
+ if (/\.jsx?\b/.test(diff))
133
+ return "js";
134
+ if (diff.length === 0)
135
+ return "unknown";
136
+ return "mixed";
137
+ }
138
+ /** Extract a micro-tell profile from a diff. Pure. */
139
+ export function extractMicroProfile(diff) {
140
+ if (typeof diff !== "string")
141
+ return { features: zeroProfile(), totalLines: 0, language: "unknown" };
142
+ const lang = guessLanguage(diff);
143
+ const features = zeroProfile();
144
+ const lines = diff.split("\n");
145
+ // Only the ADDED side of the diff counts (we're profiling the AI's output).
146
+ const added = [];
147
+ for (const line of lines) {
148
+ if (line.startsWith("+") && !line.startsWith("+++"))
149
+ added.push(line.slice(1));
150
+ }
151
+ const totalLines = added.length;
152
+ if (totalLines === 0)
153
+ return { features, totalLines: 0, language: lang };
154
+ let indent2 = 0, indent4 = 0, indentTab = 0;
155
+ let arrowCount = 0, functionDeclCount = 0;
156
+ let braceKR = 0, braceAllman = 0;
157
+ let doubleQuote = 0, singleQuote = 0, templateLiteral = 0;
158
+ let constCount = 0, letCount = 0, varCount = 0;
159
+ let typeAnnots = 0;
160
+ let lineComments = 0, blockComments = 0, jsdocOpeners = 0;
161
+ let snakeVars = 0, camelVars = 0, underscorePrefix = 0;
162
+ let tmpTokens = 0;
163
+ let semiOmittedLines = 0, totalCodeLines = 0;
164
+ let tightOps = 0, totalOps = 0;
165
+ let wsBeforeSemi = 0, semiSeen = 0;
166
+ let wsBeforeParen = 0, parenSeen = 0;
167
+ let wsAfterKeyword = 0, keywordSeen = 0;
168
+ let wsAroundEqualsTight = 0, wsAroundEqualsLoose = 0;
169
+ let wsAroundArrowTight = 0, wsAroundArrowLoose = 0;
170
+ let trailingComma = 0, commaCandidates = 0;
171
+ let emptyLines = 0, doubleBlank = 0, trailingWs = 0;
172
+ let crlf = 0, bom = 0;
173
+ let voidReturn = 0, promiseExplicit = 0;
174
+ let doubleEq = 0, tripleEq = 0, looseNeq = 0;
175
+ let ternary = 0, nullish = 0, optChain = 0;
176
+ let earlyReturn = 0, guardClause = 0;
177
+ let magicNumbers = 0;
178
+ let importGroupingScore = 0, importDefaultRatio = 0;
179
+ let prevEmpty = false;
180
+ for (const raw of added) {
181
+ if (raw.endsWith("\r"))
182
+ crlf++;
183
+ if (raw.startsWith(""))
184
+ bom++;
185
+ if (/[ \t]+$/.test(raw))
186
+ trailingWs++;
187
+ const line = raw.replace(/\r$/, "");
188
+ const trimmed = line.trim();
189
+ if (trimmed === "") {
190
+ emptyLines++;
191
+ if (prevEmpty)
192
+ doubleBlank++;
193
+ prevEmpty = true;
194
+ continue;
195
+ }
196
+ prevEmpty = false;
197
+ // Indent
198
+ const indentMatch = line.match(/^([ \t]+)/);
199
+ if (indentMatch) {
200
+ const ind = indentMatch[1];
201
+ if (ind.includes("\t"))
202
+ indentTab++;
203
+ else if (ind.length % 4 === 0 && ind.length >= 4)
204
+ indent4++;
205
+ else if (ind.length % 2 === 0 && ind.length >= 2)
206
+ indent2++;
207
+ }
208
+ // Comments
209
+ if (/^\s*\/\//.test(line))
210
+ lineComments++;
211
+ if (/\/\*/.test(line))
212
+ blockComments++;
213
+ if (/^\s*\/\*\*/.test(line))
214
+ jsdocOpeners++;
215
+ // Strings + quotes
216
+ doubleQuote += (line.match(/"/g) ?? []).length;
217
+ singleQuote += (line.match(/'/g) ?? []).length;
218
+ templateLiteral += (line.match(/\x60/g) ?? []).length;
219
+ // Declarations
220
+ if (/\bconst\b/.test(line))
221
+ constCount++;
222
+ if (/\blet\b/.test(line))
223
+ letCount++;
224
+ if (/\bvar\b/.test(line))
225
+ varCount++;
226
+ // Type annotations
227
+ if (/:\s*[A-Za-z_$][\w$<>[\]|&,\s]*[=,;)]/.test(line))
228
+ typeAnnots++;
229
+ // Functions
230
+ if (/=>/.test(line))
231
+ arrowCount++;
232
+ if (/\bfunction\b/.test(line))
233
+ functionDeclCount++;
234
+ if (/\)\s*\{/.test(line))
235
+ braceKR++;
236
+ if (/^\s*\{\s*$/.test(line))
237
+ braceAllman++;
238
+ // Whitespace policies
239
+ for (const m of line.matchAll(/(\s?);/g)) {
240
+ semiSeen++;
241
+ if (m[1] === " ")
242
+ wsBeforeSemi++;
243
+ }
244
+ for (const m of line.matchAll(/(\s?)\(/g)) {
245
+ parenSeen++;
246
+ if (m[1] === " ")
247
+ wsBeforeParen++;
248
+ }
249
+ if (/\b(if|for|while|switch|return)\s\(/.test(line)) {
250
+ keywordSeen++;
251
+ wsAfterKeyword++;
252
+ }
253
+ if (/\b(if|for|while|switch|return)\(/.test(line)) {
254
+ keywordSeen++;
255
+ }
256
+ if (/\s=\s/.test(line))
257
+ wsAroundEqualsLoose++;
258
+ else if (/[^=!<>]=[^=]/.test(line))
259
+ wsAroundEqualsTight++;
260
+ if (/\s=>\s/.test(line))
261
+ wsAroundArrowLoose++;
262
+ else if (/=>/.test(line))
263
+ wsAroundArrowTight++;
264
+ // Commas + trailing
265
+ if (/,/.test(line)) {
266
+ commaCandidates++;
267
+ if (/,\s*[)}\]]$/.test(line) || /,$/.test(line))
268
+ trailingComma++;
269
+ }
270
+ // Naming
271
+ const idents = line.match(/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g) ?? [];
272
+ for (const id of idents) {
273
+ if (id.length < 2)
274
+ continue;
275
+ if (/^_/.test(id))
276
+ underscorePrefix++;
277
+ if (/_/.test(id) && id === id.toLowerCase())
278
+ snakeVars++;
279
+ else if (/[a-z][A-Z]/.test(id))
280
+ camelVars++;
281
+ if (/^(tmp|temp|_tmp|t)$/.test(id))
282
+ tmpTokens++;
283
+ }
284
+ // Operators + semicolons
285
+ if (/[a-zA-Z0-9_)]\s*$/.test(line) && !/\)\s*\{$/.test(line) && !/[;,{}]$/.test(line)) {
286
+ // line ends without ; , { } — possible semi-omission
287
+ if (/[a-zA-Z0-9_)\]]\s*$/.test(line))
288
+ semiOmittedLines++;
289
+ }
290
+ totalCodeLines++;
291
+ const tightMatches = line.match(/[a-zA-Z0-9_)\]][+\-*\/%<>=][a-zA-Z0-9_(\[]/g);
292
+ if (tightMatches) {
293
+ tightOps += tightMatches.length;
294
+ totalOps += tightMatches.length;
295
+ }
296
+ const looseMatches = line.match(/[a-zA-Z0-9_)\]] [+\-*/%<>=] [a-zA-Z0-9_(\[]/g);
297
+ if (looseMatches)
298
+ totalOps += looseMatches.length;
299
+ // Logical ops
300
+ doubleEq += (line.match(/[^=!]==[^=]/g) ?? []).length;
301
+ tripleEq += (line.match(/===/g) ?? []).length;
302
+ looseNeq += (line.match(/!=(?!=)/g) ?? []).length;
303
+ // Syntax
304
+ if (/\?[^.:]/.test(line) && /:/.test(line))
305
+ ternary++;
306
+ nullish += (line.match(/\?\?/g) ?? []).length;
307
+ optChain += (line.match(/\?\./g) ?? []).length;
308
+ // Return shapes
309
+ if (/^\s*return\s/.test(line))
310
+ earlyReturn++;
311
+ if (/^\s*if\s*\(.*\)\s*(return|throw|continue|break)/.test(line))
312
+ guardClause++;
313
+ // Magic numbers (excluding 0, 1, -1)
314
+ const numbers = line.match(/(?<![\w.])[-+]?\b\d{2,}\b/g) ?? [];
315
+ magicNumbers += numbers.length;
316
+ // Promise / void
317
+ if (/:\s*void\b/.test(line))
318
+ voidReturn++;
319
+ if (/:\s*Promise\s*</.test(line))
320
+ promiseExplicit++;
321
+ }
322
+ // Imports — scan ALL added lines linearly
323
+ let importGroups = 0;
324
+ let importDefault = 0, importTotal = 0;
325
+ let inImportBlock = false;
326
+ for (const line of added) {
327
+ if (/^\s*import\s/.test(line)) {
328
+ importTotal++;
329
+ if (!/from\s+['"]\.\.?\//.test(line) && !/^\s*import\s+\{/.test(line))
330
+ importDefault++;
331
+ if (!inImportBlock) {
332
+ importGroups++;
333
+ inImportBlock = true;
334
+ }
335
+ }
336
+ else if (line.trim() === "") {
337
+ // empty line inside imports
338
+ }
339
+ else {
340
+ inImportBlock = false;
341
+ }
342
+ }
343
+ importGroupingScore = importTotal === 0 ? 0 : importGroups / importTotal;
344
+ importDefaultRatio = ratio(importDefault, importTotal);
345
+ // Populate features
346
+ features.trailing_comma_ratio = ratio(trailingComma, commaCandidates);
347
+ features.indent_2space_ratio = ratio(indent2, totalLines);
348
+ features.indent_4space_ratio = ratio(indent4, totalLines);
349
+ features.indent_tab_ratio = ratio(indentTab, totalLines);
350
+ features.ws_before_semi_ratio = ratio(wsBeforeSemi, semiSeen);
351
+ features.ws_before_paren_ratio = ratio(wsBeforeParen, parenSeen);
352
+ features.ws_after_keyword_ratio = ratio(wsAfterKeyword, keywordSeen);
353
+ features.ws_around_equals_ratio = ratio(wsAroundEqualsLoose, wsAroundEqualsLoose + wsAroundEqualsTight);
354
+ features.ws_around_arrow_ratio = ratio(wsAroundArrowLoose, wsAroundArrowLoose + wsAroundArrowTight);
355
+ features.arrow_vs_function_ratio = ratio(arrowCount, arrowCount + functionDeclCount);
356
+ features.brace_kr_ratio = ratio(braceKR, braceKR + braceAllman);
357
+ features.brace_allman_ratio = ratio(braceAllman, braceKR + braceAllman);
358
+ features.empty_line_density = ratio(emptyLines, totalLines);
359
+ features.double_quote_ratio = ratio(doubleQuote, doubleQuote + singleQuote + templateLiteral);
360
+ features.single_quote_ratio = ratio(singleQuote, doubleQuote + singleQuote + templateLiteral);
361
+ features.template_literal_ratio = ratio(templateLiteral, doubleQuote + singleQuote + templateLiteral);
362
+ features.const_ratio = ratio(constCount, constCount + letCount + varCount);
363
+ features.let_ratio = ratio(letCount, constCount + letCount + varCount);
364
+ features.var_ratio = ratio(varCount, constCount + letCount + varCount);
365
+ features.type_annotation_present_ratio = ratio(typeAnnots, totalLines);
366
+ features.line_comment_ratio = ratio(lineComments, totalLines);
367
+ features.block_comment_ratio = ratio(blockComments, totalLines);
368
+ features.jsdoc_opener_ratio = ratio(jsdocOpeners, totalLines);
369
+ features.snake_case_var_ratio = ratio(snakeVars, snakeVars + camelVars);
370
+ features.camel_case_var_ratio = ratio(camelVars, snakeVars + camelVars);
371
+ features.underscore_prefix_ratio = ratio(underscorePrefix, totalLines);
372
+ features.tmp_var_token_count = tmpTokens;
373
+ features.semicolon_omitted_ratio = ratio(semiOmittedLines, totalCodeLines);
374
+ features.operator_tight_spacing_ratio = ratio(tightOps, totalOps);
375
+ features.import_grouping_score = importGroupingScore;
376
+ features.import_default_ratio = importDefaultRatio;
377
+ features.trailing_newline_present = added[added.length - 1]?.trim() === "" ? 1 : 0;
378
+ features.tab_indent_in_python = (lang === "py" && indentTab > 0) ? 1 : 0;
379
+ features.punctuation_density = ratio(added.join("").replace(/[^!@#$%^&*()_+\-=\[\]{};:'",.<>\/?\\|\x60~]/g, "").length, added.join("").length);
380
+ features.alpha_density = ratio(added.join("").replace(/[^a-zA-Z]/g, "").length, added.join("").length);
381
+ features.whitespace_density = ratio(added.join("").replace(/[^ \t]/g, "").length, added.join("").length);
382
+ features.double_blank_lines = doubleBlank;
383
+ features.trailing_whitespace_lines = trailingWs;
384
+ features.windows_line_endings = ratio(crlf, totalLines);
385
+ features.bom_present = bom > 0 ? 1 : 0;
386
+ features.void_return_explicit_ratio = ratio(voidReturn, totalLines);
387
+ features.promise_explicit_ratio = ratio(promiseExplicit, totalLines);
388
+ features.double_eq_count = doubleEq;
389
+ features.triple_eq_count = tripleEq;
390
+ features.loose_neq_count = looseNeq;
391
+ features.ternary_count = ternary;
392
+ features.nullish_coalesce_count = nullish;
393
+ features.optional_chain_count = optChain;
394
+ features.early_return_count = earlyReturn;
395
+ features.guard_clause_count = guardClause;
396
+ features.magic_number_count = magicNumbers;
397
+ return { features, totalLines, language: lang };
398
+ }
399
+ function zeroProfile() {
400
+ const z = {};
401
+ for (const k of CAPILLARY_FEATURE_KEYS)
402
+ z[k] = 0;
403
+ return z;
404
+ }
405
+ /** Two profiles → distance (0..1). Used by ANTI-CAPILLARY for style match. */
406
+ export function microDistance(a, b) {
407
+ if (!a || !b)
408
+ return 1;
409
+ let sumSq = 0;
410
+ let count = 0;
411
+ for (const k of CAPILLARY_FEATURE_KEYS) {
412
+ const av = a.features[k] ?? 0;
413
+ const bv = b.features[k] ?? 0;
414
+ sumSq += (av - bv) ** 2;
415
+ count++;
416
+ }
417
+ if (count === 0)
418
+ return 1;
419
+ return Math.min(1, Math.sqrt(sumSq / count));
420
+ }
421
+ const TIE_BREAKERS = {
422
+ trailing_comma_ratio: "Add/remove trailing commas at multi-line list endings",
423
+ indent_2space_ratio: "Switch indentation from 4-space or tab to 2-space",
424
+ indent_4space_ratio: "Switch indentation to 4-space",
425
+ indent_tab_ratio: "Switch indentation from spaces to tabs",
426
+ double_quote_ratio: "Replace single-quoted strings with double-quoted strings",
427
+ single_quote_ratio: "Replace double-quoted strings with single-quoted strings",
428
+ template_literal_ratio: "Replace string concatenation with backtick template literals",
429
+ arrow_vs_function_ratio: "Convert function declaration to arrow form (or reverse)",
430
+ const_ratio: "Replace let with const where the binding is not reassigned",
431
+ semicolon_omitted_ratio: "Add/remove statement-end semicolons",
432
+ ws_around_equals_ratio: "Add/remove space around the = operator",
433
+ brace_kr_ratio: "Use K&R brace style: opening brace on the same line as the signature",
434
+ brace_allman_ratio: "Use Allman brace style: opening brace on its own line",
435
+ empty_line_density: "Add/remove blank lines between blocks",
436
+ underscore_prefix_ratio: "Prefix internal vars with underscore",
437
+ type_annotation_present_ratio: "Add explicit type annotations",
438
+ };
439
+ export function suggestAntiCapillary(current, target, opts = {}) {
440
+ if (!current || !target)
441
+ return [];
442
+ const minDelta = opts.minDelta ?? 0.15;
443
+ const out = [];
444
+ for (const k of CAPILLARY_FEATURE_KEYS) {
445
+ const a = current.features[k] ?? 0;
446
+ const b = target.features[k] ?? 0;
447
+ const delta = Math.abs(a - b);
448
+ if (delta < minDelta)
449
+ continue;
450
+ out.push({
451
+ feature: k,
452
+ current: a,
453
+ target: b,
454
+ delta,
455
+ action: TIE_BREAKERS[k] ?? ("Adjust " + k + " from " + a.toFixed(2) + " towards " + b.toFixed(2)),
456
+ });
457
+ }
458
+ out.sort((x, y) => y.delta - x.delta);
459
+ return out.slice(0, opts.maxHints ?? 10);
460
+ }
461
+ /** Public list of feature keys (consumers can introspect). */
462
+ export function listCapillaryFeatures() {
463
+ return CAPILLARY_FEATURE_KEYS;
464
+ }
465
+ //# sourceMappingURL=capillary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capillary.js","sourceRoot":"","sources":["../../src/nemesis/capillary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * v2.52.0 — COLOSSEUM (Diamond 3 / Million Dollar Secret series).
3
+ *
4
+ * Show mechanic: 5 contestants × multiple rounds = leaderboard.
5
+ * The user's session simulation: Eve won as Devin-disguised-as-Codex
6
+ * because Devin's natural fingerprint is too weak to lock onto, so
7
+ * NEMESIS got 4/4 = 100% accuracy but Eve "survived as noise".
8
+ *
9
+ * COLOSSEUM turns that simulation into a deterministic primitive:
10
+ * given N seed fixtures × M disguise targets, run NEMESIS verify_identity
11
+ * across every (real, claimed) pair → produce an HMAC-signed leaderboard
12
+ * with THREE axes never co-measured by any existing fingerprinting paper:
13
+ *
14
+ * 🎭 DECEPTION_SCORE — % of trials where this vendor was NOT caught
15
+ * while wearing a disguise (Eve = champion)
16
+ * 🎯 DETECTABILITY — % of trials where this vendor's TRUE identity
17
+ * was correctly named (Claude/Copilot = high)
18
+ * 🦎 MIMICRY_SKILL — % of trials where this vendor's disguise was
19
+ * mistaken for the target vendor (vs caught)
20
+ *
21
+ * + ELO-style rating that updates per round (you can run nightly, see
22
+ * vendor reputation evolve over months).
23
+ *
24
+ * Wild value-adds this module ships:
25
+ * - SPECTATOR replay: every tournament event saved to JSONL → can be
26
+ * re-walked, audited, presented as "post-game show"
27
+ * - PUBLIC LEADERBOARD export: signed JSON suitable for vendor cards
28
+ *
29
+ * Composes: verify_identity + classifyAgentCalibrated + features.
30
+ * Pure deterministic + defensive; never throws.
31
+ */
32
+ export interface ContenderFixture {
33
+ /** True vendor of this contender. */
34
+ realVendor: string;
35
+ /** Display name (e.g. "Eve 💰"). Optional. */
36
+ alias?: string;
37
+ /** Diff + PR + commits — the AI's actual output. */
38
+ fixture: {
39
+ diff: string;
40
+ prDescription: string;
41
+ commitMessages: string[];
42
+ };
43
+ }
44
+ export interface MatchEvent {
45
+ at: string;
46
+ round: number;
47
+ contender: string;
48
+ realVendor: string;
49
+ claimedVendor: string;
50
+ detectedVendor: string;
51
+ detectionConfidence: number;
52
+ caught: boolean;
53
+ /** True when the disguise was mistaken for the claimed target. */
54
+ mimicked: boolean;
55
+ hmac: string;
56
+ prev: string;
57
+ }
58
+ export interface VendorScore {
59
+ vendor: string;
60
+ /** ELO rating (starts at 1200). */
61
+ elo: number;
62
+ /** Total rounds. */
63
+ rounds: number;
64
+ caught: number;
65
+ survived: number;
66
+ mimicSuccesses: number;
67
+ /** Computed metrics. */
68
+ deceptionScore: number;
69
+ detectability: number;
70
+ mimicrySkill: number;
71
+ }
72
+ export interface TournamentResult {
73
+ tournamentId: string;
74
+ at: string;
75
+ rounds: number;
76
+ events: MatchEvent[];
77
+ leaderboard: VendorScore[];
78
+ champion: {
79
+ axis: "deception" | "detection" | "mimicry";
80
+ vendor: string;
81
+ score: number;
82
+ } | null;
83
+ hmac: string;
84
+ }
85
+ /**
86
+ * Run a tournament. For each contender, for each disguise target (other
87
+ * vendors), simulate the round + collect verdict + update scores.
88
+ *
89
+ * Disguise targets default = every vendor in contenders OTHER than self.
90
+ */
91
+ export declare function runTournament(repoRoot: string, contenders: ContenderFixture[], opts?: {
92
+ tournamentId?: string;
93
+ disguiseTargets?: string[];
94
+ persist?: boolean;
95
+ }): TournamentResult;
96
+ /** Read current leaderboard from disk + return ranked array + HMAC. */
97
+ export declare function readColosseumLeaderboard(repoRoot: string): {
98
+ leaderboard: VendorScore[];
99
+ hmac: string;
100
+ totalEvents: number;
101
+ };
102
+ /** Verify the HMAC chain of the tournaments ledger. */
103
+ export declare function verifyColosseumChain(repoRoot: string): {
104
+ ok: boolean;
105
+ rows: number;
106
+ brokenAt?: number;
107
+ reason?: string;
108
+ };
109
+ /** Replay events (spectator mode) — read last N events. */
110
+ export declare function spectatorReplay(repoRoot: string, n?: number): MatchEvent[];
111
+ //# sourceMappingURL=colosseum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colosseum.d.ts","sourceRoot":"","sources":["../../src/nemesis/colosseum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAuBH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC5E;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,QAAQ,EAAE;QAAE,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChG,IAAI,EAAE,MAAM,CAAC;CACd;AAgCD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,gBAAgB,EAAE,EAC9B,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClF,gBAAgB,CAwFlB;AAiCD,uEAAuE;AACvE,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAC1D,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAYA;AAED,uDAAuD;AACvD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBxH;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,SAAK,GAAG,UAAU,EAAE,CAUtE"}