slopbrick 0.18.7 → 0.18.9

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.
@@ -1,9 +1,14 @@
1
1
  const __importMetaUrl = require("url").pathToFileURL(__filename).href;
2
2
  "use strict";
3
+ var __create = Object.create;
3
4
  var __defProp = Object.defineProperty;
4
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
6
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __esm = (fn, res) => function __init() {
10
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
11
+ };
7
12
  var __export = (target, all) => {
8
13
  for (var name in all)
9
14
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,8 +21,418 @@ var __copyProps = (to, from, except, desc) => {
16
21
  }
17
22
  return to;
18
23
  };
24
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
25
+ // If the importer is in node compatibility mode or this is not an ESM
26
+ // file that has been converted to a CommonJS file using a Babel-
27
+ // compatible transform (i.e. "__esModule" has not been set), then set
28
+ // "default" to the CommonJS "module.exports" for node compatibility.
29
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
30
+ mod
31
+ ));
19
32
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
33
 
34
+ // src/engine/parser-rust.ts
35
+ function getRustParser() {
36
+ if (cachedParser) return { ok: true, parser: cachedParser };
37
+ if (loadError) return { ok: false, error: loadError };
38
+ try {
39
+ rustLanguage = import_tree_sitter_rust.default;
40
+ if (!rustLanguage || typeof rustLanguage !== "object") {
41
+ throw new Error("tree-sitter-rust: language export is missing or malformed");
42
+ }
43
+ const parser = new import_tree_sitter.default();
44
+ parser.setLanguage(rustLanguage);
45
+ cachedParser = parser;
46
+ return { ok: true, parser };
47
+ } catch (err) {
48
+ loadError = err instanceof Error ? err : new Error(String(err));
49
+ return { ok: false, error: loadError };
50
+ }
51
+ }
52
+ function effectiveParser() {
53
+ if (forcedFailure) return { ok: false, error: forcedFailure };
54
+ return getRustParser();
55
+ }
56
+ function parseRust(source) {
57
+ const result = effectiveParser();
58
+ if (!result.ok) return null;
59
+ if (!source || source.trim() === "") return null;
60
+ try {
61
+ const rawTree = result.parser.parse(source);
62
+ if (!rawTree) return null;
63
+ const tree = rawTree;
64
+ if (!tree || !tree.rootNode) return null;
65
+ if (tree.rootNode.type === "ERROR" && tree.rootNode.childCount === 0) {
66
+ return null;
67
+ }
68
+ return tree;
69
+ } catch {
70
+ return null;
71
+ }
72
+ }
73
+ function isRustParserAvailable() {
74
+ const result = getRustParser();
75
+ return result.ok;
76
+ }
77
+ var import_tree_sitter, import_tree_sitter_rust, cachedParser, rustLanguage, loadError, forcedFailure;
78
+ var init_parser_rust = __esm({
79
+ "src/engine/parser-rust.ts"() {
80
+ "use strict";
81
+ import_tree_sitter = __toESM(require("tree-sitter"), 1);
82
+ import_tree_sitter_rust = __toESM(require("tree-sitter-rust"), 1);
83
+ cachedParser = null;
84
+ rustLanguage = null;
85
+ loadError = null;
86
+ forcedFailure = null;
87
+ }
88
+ });
89
+
90
+ // src/engine/visitors/rust.ts
91
+ function parseRustFile(filePath, source, options = {}) {
92
+ const empty = {
93
+ imports: [],
94
+ functions: [],
95
+ structs: [],
96
+ traits: [],
97
+ impls: []
98
+ };
99
+ if (!isRustParserAvailable() || options.forceFallback) {
100
+ return empty;
101
+ }
102
+ const tree = parseRust(source);
103
+ if (!tree) return empty;
104
+ return walkRustTree(tree);
105
+ }
106
+ function walkRustTree(tree) {
107
+ const ctx = { inTestConfig: false };
108
+ const out = {
109
+ imports: [],
110
+ functions: [],
111
+ structs: [],
112
+ traits: [],
113
+ impls: []
114
+ };
115
+ walkChildren(tree.rootNode, ctx, out);
116
+ return out;
117
+ }
118
+ function walkChildren(node, ctx, out) {
119
+ for (let i = 0; i < node.namedChildCount; i++) {
120
+ const child = node.namedChild(i);
121
+ if (!child) continue;
122
+ visitNode(child, ctx, out);
123
+ }
124
+ }
125
+ function visitNode(node, ctx, out) {
126
+ const innerCtx = { ...ctx };
127
+ const attrState = readPrecedingAttributes(node);
128
+ switch (node.type) {
129
+ case "use_declaration": {
130
+ out.imports.push(extractUse(node));
131
+ return;
132
+ }
133
+ case "function_item": {
134
+ const isMethod = isInImplBlock(node);
135
+ out.functions.push(extractFunction(node, attrState, innerCtx.inTestConfig, isMethod));
136
+ walkChildren(getField(node, "body") ?? node, innerCtx, out);
137
+ return;
138
+ }
139
+ case "struct_item": {
140
+ out.structs.push(extractStruct(node, attrState));
141
+ const body = getField(node, "body");
142
+ if (body) walkChildren(body, innerCtx, out);
143
+ return;
144
+ }
145
+ case "trait_item": {
146
+ out.traits.push(extractTrait(node, attrState));
147
+ const body = getField(node, "body");
148
+ if (body) walkChildren(body, innerCtx, out);
149
+ return;
150
+ }
151
+ case "impl_item": {
152
+ const implEntry = extractImpl(node, attrState, innerCtx);
153
+ out.impls.push(implEntry.entry);
154
+ const body = getField(node, "body");
155
+ if (body) walkChildren(body, innerCtx, out);
156
+ return;
157
+ }
158
+ case "mod_item": {
159
+ const modIsTest = innerCtx.inTestConfig || attrState.isTestCfg;
160
+ const modCtx = { ...innerCtx, inTestConfig: modIsTest };
161
+ const body = getField(node, "body");
162
+ if (body) walkChildren(body, modCtx, out);
163
+ return;
164
+ }
165
+ default: {
166
+ for (let i = 0; i < node.namedChildCount; i++) {
167
+ const child = node.namedChild(i);
168
+ if (child) visitNode(child, innerCtx, out);
169
+ }
170
+ }
171
+ }
172
+ }
173
+ function readPrecedingAttributes(node) {
174
+ const state = {
175
+ isTestCfg: false,
176
+ isTest: false,
177
+ isPub: false,
178
+ derives: []
179
+ };
180
+ const parent = node.parent;
181
+ if (!parent) return state;
182
+ for (let i = 0; i < parent.namedChildCount; i++) {
183
+ const sibling = parent.namedChild(i);
184
+ if (!sibling || sibling === node) continue;
185
+ if (sibling.endIndex > node.startIndex) continue;
186
+ if (sibling.type !== "attribute_item") continue;
187
+ decodeAttribute(sibling, state);
188
+ }
189
+ return state;
190
+ }
191
+ function decodeAttribute(attr, state) {
192
+ for (let i = 0; i < attr.namedChildCount; i++) {
193
+ const child = attr.namedChild(i);
194
+ if (!child || child.type !== "attribute") continue;
195
+ const name = firstIdentifier(child);
196
+ if (!name) continue;
197
+ if (name === "cfg") {
198
+ const cfgText = child.text;
199
+ if (/\btest\b/.test(cfgText) && !/\bnot\(test\)/.test(cfgText)) {
200
+ state.isTestCfg = true;
201
+ }
202
+ } else if (name === "test") {
203
+ state.isTest = true;
204
+ } else if (name === "derive") {
205
+ for (let j = 0; j < child.namedChildCount; j++) {
206
+ const inner = child.namedChild(j);
207
+ if (inner) {
208
+ const matches = inner.text.matchAll(/\b([A-Z][A-Za-z0-9_]*)\b/g);
209
+ for (const m of matches) state.derives.push(m[1]);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ }
215
+ function firstIdentifier(node) {
216
+ const text = node.text;
217
+ const idMatch = text.match(/^([a-zA-Z_][a-zA-Z0-9_]*)/);
218
+ return idMatch ? idMatch[1] : null;
219
+ }
220
+ function extractUse(node) {
221
+ const text = node.text;
222
+ const argument = node.namedChild(0);
223
+ const argField = node.childForFieldName("argument");
224
+ const path = argField?.text ?? argument?.text ?? "";
225
+ const names = [];
226
+ let isGlob = false;
227
+ const useListNode = findUseListNode(argument);
228
+ if (useListNode) {
229
+ for (let i = 0; i < useListNode.namedChildCount; i++) {
230
+ const item = useListNode.namedChild(i);
231
+ if (item.type === "use_wildcard") {
232
+ isGlob = true;
233
+ } else if (item.type === "identifier") {
234
+ names.push({ name: item.text });
235
+ } else if (item.type === "use_as_clause") {
236
+ const alias = item.childForFieldName("alias");
237
+ const binding = item.childForFieldName("path");
238
+ if (binding) {
239
+ names.push({ name: binding.text, alias: alias?.text });
240
+ } else {
241
+ names.push({ name: item.text });
242
+ }
243
+ } else if (item.type === "scoped_identifier") {
244
+ const idents = collectIdentifiers(item);
245
+ names.push({ name: idents[idents.length - 1] ?? item.text });
246
+ } else if (item.text.includes(" as ")) {
247
+ const [head, alias] = item.text.split(/\s+as\s+/);
248
+ names.push({ name: (head ?? "").trim(), alias: alias?.trim() });
249
+ } else {
250
+ names.push({ name: item.text });
251
+ }
252
+ }
253
+ } else if (argument?.type === "use_wildcard") {
254
+ isGlob = true;
255
+ } else if (argument) {
256
+ const idents = collectIdentifiers(argument);
257
+ const last = idents[idents.length - 1] ?? argument.text;
258
+ names.push({ name: last });
259
+ const asMatch = text.match(/\s+as\s+(\w+)\s*;?\s*$/);
260
+ if (asMatch) names[0].alias = asMatch[1];
261
+ }
262
+ return {
263
+ path: path.trim(),
264
+ names,
265
+ isGlob,
266
+ line: node.startPosition.row + 1,
267
+ column: node.startPosition.column
268
+ };
269
+ }
270
+ function extractFunction(node, attrs, inheritedTestConfig, isMethod) {
271
+ const nameNode = node.childForFieldName("name");
272
+ const name = nameNode?.text ?? "<anon>";
273
+ const params = node.childForFieldName("parameters");
274
+ const body = node.childForFieldName("body");
275
+ const visibilityMod = node.namedChild(0);
276
+ const isPublic = visibilityMod?.type === "visibility_modifier";
277
+ let receiver;
278
+ if (isMethod && params) {
279
+ const selfParam = findSelfParameter(params);
280
+ if (selfParam) receiver = selfParam.text;
281
+ }
282
+ const bodyLines = body ? body.endPosition.row - body.startPosition.row + 1 : 0;
283
+ const inTestConfig = inheritedTestConfig || attrs.isTest || attrs.isTestCfg || isFunctionAttrTest(node);
284
+ return {
285
+ name,
286
+ line: node.startPosition.row + 1,
287
+ column: node.startPosition.column,
288
+ isPublic,
289
+ isMethod,
290
+ receiver,
291
+ bodyLines,
292
+ inTestConfig
293
+ };
294
+ }
295
+ function extractStruct(node, attrs) {
296
+ const nameNode = node.childForFieldName("name");
297
+ return {
298
+ name: nameNode?.text ?? "<anon>",
299
+ line: node.startPosition.row + 1,
300
+ column: node.startPosition.column,
301
+ isPublic: hasVisibility(node),
302
+ isDerive: attrs.derives.length > 0,
303
+ derives: [...attrs.derives]
304
+ };
305
+ }
306
+ function extractTrait(node, _attrs) {
307
+ const nameNode = node.childForFieldName("name");
308
+ return {
309
+ name: nameNode?.text ?? "<anon>",
310
+ line: node.startPosition.row + 1,
311
+ column: node.startPosition.column,
312
+ isPublic: hasVisibility(node)
313
+ };
314
+ }
315
+ function extractImpl(node, _attrs, _ctx) {
316
+ const traitNode = node.childForFieldName("trait");
317
+ const typeNode = node.childForFieldName("type");
318
+ const typeText = typeNode?.text ?? "<anon>";
319
+ const traitText = traitNode?.text;
320
+ const body = node.childForFieldName("body");
321
+ const methods = [];
322
+ if (body) {
323
+ for (let i = 0; i < body.namedChildCount; i++) {
324
+ const child = body.namedChild(i);
325
+ if (child?.type === "function_item") {
326
+ const m = child.childForFieldName("name");
327
+ if (m) methods.push(m.text);
328
+ }
329
+ }
330
+ }
331
+ return {
332
+ entry: {
333
+ type: typeText,
334
+ trait: traitText ?? void 0,
335
+ methods,
336
+ line: node.startPosition.row + 1,
337
+ column: node.startPosition.column
338
+ }
339
+ };
340
+ }
341
+ function findUseListNode(argument) {
342
+ if (!argument) return null;
343
+ if (argument.type === "use_list") return argument;
344
+ if (argument.type === "scoped_use_list") {
345
+ for (let i = 0; i < argument.namedChildCount; i++) {
346
+ const c = argument.namedChild(i);
347
+ if (c?.type === "use_list") return c;
348
+ }
349
+ }
350
+ return null;
351
+ }
352
+ function getField(node, fieldName) {
353
+ return node.childForFieldName(fieldName);
354
+ }
355
+ function collectIdentifiers(node) {
356
+ const out = [];
357
+ for (let i = 0; i < node.namedChildCount; i++) {
358
+ const child = node.namedChild(i);
359
+ if (!child) continue;
360
+ if (child.type === "identifier" || child.type === "type_identifier") {
361
+ out.push(child.text);
362
+ } else if (child.type === "scoped_identifier" || child.type === "nested_identifier") {
363
+ out.push(...collectIdentifiers(child));
364
+ }
365
+ }
366
+ return out;
367
+ }
368
+ function hasVisibility(node) {
369
+ return node.namedChild(0)?.type === "visibility_modifier";
370
+ }
371
+ function isInImplBlock(node) {
372
+ for (let p = node.parent; p; p = p.parent) {
373
+ if (p.type === "impl_item") return true;
374
+ if (p.type === "function_item" || p.type === "source_file") return false;
375
+ }
376
+ return false;
377
+ }
378
+ function findSelfParameter(params) {
379
+ for (let i = 0; i < params.namedChildCount; i++) {
380
+ const child = params.namedChild(i);
381
+ if (child?.type === "self_parameter") return child;
382
+ }
383
+ return null;
384
+ }
385
+ function isFunctionAttrTest(node) {
386
+ void node;
387
+ return false;
388
+ }
389
+ var SERVICE_SUFFIXES, SERVICE_SUFFIX_GROUP, RUST_SERVICE_STRUCT_RE, RUST_SERVICE_IMPL_RE;
390
+ var init_rust = __esm({
391
+ "src/engine/visitors/rust.ts"() {
392
+ "use strict";
393
+ init_parser_rust();
394
+ SERVICE_SUFFIXES = [
395
+ "Service",
396
+ "Manager",
397
+ "Handler",
398
+ "Repository",
399
+ "Controller",
400
+ "Helper",
401
+ "Factory",
402
+ "Provider",
403
+ "Store",
404
+ "API",
405
+ "Client",
406
+ "Adapter",
407
+ "Resolver",
408
+ "Mapper",
409
+ "Transformer",
410
+ "Serializer",
411
+ "Validator",
412
+ "Strategy",
413
+ "Facade",
414
+ "Decorator",
415
+ "Observer",
416
+ "Builder",
417
+ "Command",
418
+ "Processor",
419
+ "Worker",
420
+ "Job",
421
+ "Actor",
422
+ "Executor"
423
+ ];
424
+ SERVICE_SUFFIX_GROUP = `(?:${SERVICE_SUFFIXES.join("|")})`;
425
+ RUST_SERVICE_STRUCT_RE = new RegExp(
426
+ `^(?:pub(?:\\(crate\\)|\\(super\\))?\\s+)?struct\\s+(\\w+?)${SERVICE_SUFFIX_GROUP}?\\b`,
427
+ "gm"
428
+ );
429
+ RUST_SERVICE_IMPL_RE = new RegExp(
430
+ `^impl(?:<[^>]+>)?\\s+(?:${SERVICE_SUFFIX_GROUP}\\s+for\\s+)?(\\w+?)${SERVICE_SUFFIX_GROUP}?\\b`,
431
+ "gm"
432
+ );
433
+ }
434
+ });
435
+
21
436
  // src/engine/worker.ts
22
437
  var worker_exports = {};
23
438
  __export(worker_exports, {
@@ -4258,7 +4673,7 @@ function parseBlankModule(source) {
4258
4673
  tsx: false,
4259
4674
  target: "es2022"
4260
4675
  });
4261
- return { ast, source: replaced };
4676
+ return { ast, source };
4262
4677
  }
4263
4678
  function parseScriptContent(content, isTypeScript) {
4264
4679
  if (isTypeScript) {
@@ -4344,8 +4759,16 @@ function parseSource(source, filePath) {
4344
4759
  // but no SWC support. Return a blank-padded empty module so
4345
4760
  // regex-only rules can still fire (markdown-leakage, comment-
4346
4761
  // ratio, etc.) without burning the parseError path.
4762
+ // v0.18.9: `.rs` is in the same bucket. The visitor layer
4763
+ // (`engine/visitors/rust.ts`) carries the tree-sitter-backed
4764
+ // parse + extractFacts attaches the result to `facts.v2.rustFile`.
4765
+ // The rule layer (`rules/rust/*.ts`) reads that field. parseBlankModule
4766
+ // lets the worker continue past the parser — without this, parseWithSwc
4767
+ // would throw on every .rs file, the worker would count it as a
4768
+ // parseError, and the v2-build's buildRustFileRecord would never run.
4347
4769
  case "py":
4348
4770
  case "go":
4771
+ case "rs":
4349
4772
  return parseBlankModule(source);
4350
4773
  default:
4351
4774
  return parseWithSwc(source, filePath);
@@ -6910,6 +7333,7 @@ function dispatchNode(node, parent, path, vctx) {
6910
7333
  }
6911
7334
 
6912
7335
  // src/engine/visitors/v2-build.ts
7336
+ init_rust();
6913
7337
  var TAILWIND_COLOR_RE = /^(?:bg|text|border|ring|from|to|via|fill|stroke)-([a-z]+-\d+|white|black|transparent|current|\[.+?\])$/;
6914
7338
  var TAILWIND_SPACING_RE = /^(?:[pm][xytrbl]?|gap|space-[xy])-(\d+(?:\.\d+)?)$/;
6915
7339
  var TAILWIND_RADIUS_RE = /^(?:rounded(?:-[a-z]+)?)-(.+)$/;
@@ -7090,9 +7514,60 @@ function buildV2Facts(facts, source, ext, framework, config, templateClassNames
7090
7514
  })),
7091
7515
  disabledRules: extractDisabledRules(source),
7092
7516
  templateClassNames,
7517
+ // v0.18.9 — populate the Rust AST record when the file is `.rs`.
7518
+ // Calling `parseRustFile` here keeps the dead-code detector's
7519
+ // import-binding pass a pure function over the same source the
7520
+ // walker saw. The native-binding guard lives inside
7521
+ // `parseRustFile` (returns an empty record when tree-sitter is
7522
+ // unavailable).
7523
+ rustFile: buildRustFileRecord(facts.filePath, source),
7093
7524
  _source: source
7094
7525
  };
7095
7526
  }
7527
+ function buildRustFileRecord(filePath, source) {
7528
+ if (!filePath.toLowerCase().endsWith(".rs")) return void 0;
7529
+ const structure = parseRustFile(filePath, source);
7530
+ return {
7531
+ imports: structure.imports.map((i) => ({
7532
+ path: i.path,
7533
+ names: i.names.map((n) => ({ name: n.name, ...n.alias ? { alias: n.alias } : {} })),
7534
+ isGlob: i.isGlob,
7535
+ line: i.line,
7536
+ column: i.column
7537
+ })),
7538
+ functions: structure.functions.map((f) => ({
7539
+ name: f.name,
7540
+ line: f.line,
7541
+ column: f.column,
7542
+ isPublic: f.isPublic,
7543
+ isMethod: f.isMethod,
7544
+ ...f.receiver ? { receiver: f.receiver } : {},
7545
+ bodyLines: f.bodyLines,
7546
+ inTestConfig: f.inTestConfig
7547
+ })),
7548
+ structs: structure.structs.map((s) => ({
7549
+ name: s.name,
7550
+ line: s.line,
7551
+ column: s.column,
7552
+ isPublic: s.isPublic,
7553
+ isDerive: s.isDerive,
7554
+ derives: [...s.derives]
7555
+ })),
7556
+ traits: structure.traits.map((t) => ({
7557
+ name: t.name,
7558
+ line: t.line,
7559
+ column: t.column,
7560
+ isPublic: t.isPublic
7561
+ })),
7562
+ impls: structure.impls.map((ip) => ({
7563
+ ...ip.trait ? { trait: ip.trait } : {},
7564
+ type: ip.type,
7565
+ methods: [...ip.methods],
7566
+ line: ip.line,
7567
+ column: ip.column
7568
+ }))
7569
+ };
7570
+ }
7096
7571
  function splitFilePath(filePath) {
7097
7572
  const baseName = filePath.split("/").pop() ?? filePath;
7098
7573
  const dotIdx = baseName.lastIndexOf(".");
@@ -34594,9 +35069,43 @@ var unusedImportRule = createRule({
34594
35069
  advice: `Remove the import or use '${binding.name}' somewhere in the file. This is the most common AI-iteration rot \u2014 the model added the import when it introduced a feature, then rewrote the function without cleaning up.`
34595
35070
  });
34596
35071
  }
35072
+ if (facts.v2.rustFile) {
35073
+ const strippedSource = stripUseDeclarations(facts.v2._source ?? "");
35074
+ const referenced = collectRustReferencedNames(strippedSource);
35075
+ for (const imp of facts.v2.rustFile.imports) {
35076
+ for (const nameEntry of imp.names) {
35077
+ if (referenced.has(nameEntry.name)) continue;
35078
+ const source = ` from '${imp.path}'`;
35079
+ issues.push({
35080
+ ruleId: "dead/unused-import",
35081
+ category: "logic",
35082
+ severity: "low",
35083
+ aiSpecific: true,
35084
+ message: `Unused import: '${nameEntry.name}'${source}`,
35085
+ line: imp.line,
35086
+ column: imp.column,
35087
+ advice: `Remove the '${imp.path}' import or use '${nameEntry.name}' somewhere in the file. Rust's compiler only flags unused imports per module \u2014 the tree-sitter-backed walker here surfaces them for slopbrick's dead-code rules regardless of #[allow(unused_imports)].`
35088
+ });
35089
+ }
35090
+ }
35091
+ }
34597
35092
  return issues;
34598
35093
  }
34599
35094
  });
35095
+ function collectRustReferencedNames(source) {
35096
+ const out = /* @__PURE__ */ new Set();
35097
+ for (const m of source.matchAll(/\b([A-Za-z_][A-Za-z0-9_]*)\b/g)) {
35098
+ out.add(m[1]);
35099
+ }
35100
+ return out;
35101
+ }
35102
+ function stripUseDeclarations(source) {
35103
+ let out = source;
35104
+ out = out.replace(/^\s*use\s+[\s\S]*?;\s*$/gm, "");
35105
+ out = out.replace(/\/\/[^\n]*/g, "");
35106
+ out = out.replace(/\/\*[\s\S]*?\*\//g, "");
35107
+ return out;
35108
+ }
34600
35109
 
34601
35110
  // src/rules/dead/unused-local.ts
34602
35111
  var SKIP_NAMES = /* @__PURE__ */ new Set(["React", "_"]);
@@ -37509,6 +38018,326 @@ var uxPatternFragmentationRule = createRule({
37509
38018
  }
37510
38019
  });
37511
38020
 
38021
+ // src/rules/rust/stringly-typed.ts
38022
+ var SUSPECT_PARAM_NAMES = /* @__PURE__ */ new Set([
38023
+ "kind",
38024
+ "type",
38025
+ "mode",
38026
+ "event",
38027
+ "status",
38028
+ "category",
38029
+ "action",
38030
+ "state",
38031
+ "level",
38032
+ "role",
38033
+ "tier",
38034
+ "phase",
38035
+ "tag",
38036
+ "format",
38037
+ "shape",
38038
+ "direction",
38039
+ "side",
38040
+ "method"
38041
+ ]);
38042
+ var MAX_VARIANT_COUNT = 32;
38043
+ var rustStringlyTypedRule = createRule({
38044
+ id: "rust/stringly-typed",
38045
+ category: "logic",
38046
+ severity: "medium",
38047
+ aiSpecific: true,
38048
+ description: "String / &str parameter where a typed enum exists in the same file",
38049
+ create(_context) {
38050
+ return {};
38051
+ },
38052
+ analyze(_context, facts) {
38053
+ const issues = [];
38054
+ if (!facts.v2?.rustFile) return issues;
38055
+ const source = facts.v2._source ?? "";
38056
+ if (!source) return issues;
38057
+ const lineOffsets = buildLineOffsets2(source);
38058
+ const enumCandidates = collectEnumCandidates(source);
38059
+ if (enumCandidates.length === 0) return issues;
38060
+ for (const fn of facts.v2.rustFile.functions) {
38061
+ const paramText = extractParameterText(source, lineOffsets, fn);
38062
+ if (!paramText) continue;
38063
+ const matches = scanForStringlyParams(paramText);
38064
+ if (matches.length === 0) continue;
38065
+ issues.push({
38066
+ ruleId: "rust/stringly-typed",
38067
+ category: "logic",
38068
+ severity: "medium",
38069
+ aiSpecific: true,
38070
+ message: matches.length === 1 ? `Parameter '${matches[0].name}' typed as '${matches[0].type}', but enum ${enumCandidates[0].name} exists in the file` : `Function has ${matches.length} stringly-typed parameters; enum ${enumCandidates[0].name} exists in the file`,
38071
+ line: fn.line,
38072
+ column: fn.column,
38073
+ advice: `Replace the String/&str parameter with the typed enum. Stringly-typed APIs lose type information at the boundary; a typo ('Click' vs 'click') only fails at runtime. AI agents introduce these during exploratory scaffolding, then never replace them with the existing enum.`
38074
+ });
38075
+ }
38076
+ return issues;
38077
+ }
38078
+ });
38079
+ function collectEnumCandidates(source) {
38080
+ const out = [];
38081
+ const enumRe = /^(?:pub(?:\([^)]+\))?\s+)?enum\s+(\w+)\s*\{([^}]*)\}/gm;
38082
+ for (const m of source.matchAll(enumRe)) {
38083
+ const body = m[2] ?? "";
38084
+ const variants = body.split(/,(?![^()]*\))/).map((s) => s.trim()).filter((s) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(s.split(/\s+/)[0] ?? ""));
38085
+ if (variants.length > MAX_VARIANT_COUNT) continue;
38086
+ if (variants.length < 2) continue;
38087
+ out.push({ name: m[1], variantCount: variants.length, line: lineOfMatch(source, m.index ?? 0) });
38088
+ }
38089
+ return out;
38090
+ }
38091
+ function lineOfMatch(source, index) {
38092
+ let line = 1;
38093
+ for (let i = 0; i < index && i < source.length; i++) {
38094
+ if (source[i] === "\n") line++;
38095
+ }
38096
+ return line;
38097
+ }
38098
+ function buildLineOffsets2(source) {
38099
+ const out = [0];
38100
+ for (let i = 0; i < source.length; i++) {
38101
+ if (source[i] === "\n") out.push(i + 1);
38102
+ }
38103
+ return out;
38104
+ }
38105
+ function extractParameterText(source, lineOffsets, fn) {
38106
+ const start = lineOffsets[Math.max(0, fn.line - 1)] ?? 0;
38107
+ const head = source.slice(start, start + 400);
38108
+ const openIdx = head.indexOf("(");
38109
+ if (openIdx < 0) return "";
38110
+ let closeIdx = -1;
38111
+ let depth = 0;
38112
+ for (let i = openIdx; i < head.length; i++) {
38113
+ if (head[i] === "(") depth++;
38114
+ else if (head[i] === ")") {
38115
+ depth--;
38116
+ if (depth === 0) {
38117
+ closeIdx = i;
38118
+ break;
38119
+ }
38120
+ }
38121
+ }
38122
+ if (closeIdx < 0) return "";
38123
+ return head.slice(openIdx + 1, closeIdx);
38124
+ }
38125
+ function scanForStringlyParams(paramText) {
38126
+ const out = [];
38127
+ for (const m of paramText.matchAll(
38128
+ /\b([a-z_][a-zA-Z0-9_]*)\s*:\s*(&\s*(?:mut\s+)?(?:str|String)\b)/g
38129
+ )) {
38130
+ const name = m[1];
38131
+ const type = m[2];
38132
+ if (!SUSPECT_PARAM_NAMES.has(name)) continue;
38133
+ out.push({ name, type });
38134
+ }
38135
+ return out;
38136
+ }
38137
+
38138
+ // src/rules/rust/todo-macro.ts
38139
+ init_parser_rust();
38140
+ var TODO_MACROS = /* @__PURE__ */ new Set(["todo", "unimplemented", "todo_unimplemented"]);
38141
+ var rustTodoMacroRule = createRule({
38142
+ id: "rust/todo-macro",
38143
+ category: "logic",
38144
+ severity: "medium",
38145
+ aiSpecific: true,
38146
+ description: "todo!() / unimplemented!() macro invocation in production code",
38147
+ create(_context) {
38148
+ return {};
38149
+ },
38150
+ analyze(_context, facts) {
38151
+ const issues = [];
38152
+ if (!facts.v2?.rustFile) return issues;
38153
+ const source = facts.v2._source ?? "";
38154
+ if (!source) return issues;
38155
+ const tree = parseRust(source);
38156
+ if (!tree) return issues;
38157
+ const testScopes = /* @__PURE__ */ new Set();
38158
+ for (const fn of facts.v2.rustFile.functions) {
38159
+ if (fn.inTestConfig && fn.name) testScopes.add(fn.name);
38160
+ }
38161
+ collectMacroIssues(tree.rootNode, testScopes, issues);
38162
+ return issues;
38163
+ }
38164
+ });
38165
+ function collectMacroIssues(node, testScopes, issues) {
38166
+ if (node.type === "macro_invocation") {
38167
+ const text = node.text;
38168
+ const m = text.match(/^([A-Za-z_][A-Za-z0-9_]*)/);
38169
+ const macroName = m?.[1] ?? "";
38170
+ if (TODO_MACROS.has(macroName)) {
38171
+ if (!isInsideMacroDefinition(node) && !isInsideTestFunction(node, testScopes)) {
38172
+ issues.push({
38173
+ ruleId: "rust/todo-macro",
38174
+ category: "logic",
38175
+ severity: "medium",
38176
+ aiSpecific: true,
38177
+ message: `'${macroName}!()' in production code \u2014 both expand to panic!()`,
38178
+ line: node.startPosition.row + 1,
38179
+ column: node.startPosition.column,
38180
+ advice: `Implement the function body or remove the stub. '${macroName}!()' is fine in test scaffolding (#[cfg(test)]); here it is a panic risk. AI agents commonly leave these behind after iterative refactors when the placeholder branch is never filled in.`
38181
+ });
38182
+ }
38183
+ }
38184
+ }
38185
+ for (let i = 0; i < node.namedChildCount; i++) {
38186
+ const child = node.namedChild(i);
38187
+ if (child) collectMacroIssues(child, testScopes, issues);
38188
+ }
38189
+ }
38190
+ function isInsideMacroDefinition(node) {
38191
+ for (let p = node.parent; p; p = p.parent) {
38192
+ if (p.type === "macro_definition") return true;
38193
+ if (p.type === "source_file") return false;
38194
+ }
38195
+ return false;
38196
+ }
38197
+ function isInsideTestFunction(node, testScopes) {
38198
+ for (let p = node.parent; p; p = p.parent) {
38199
+ if (p.type === "function_item") {
38200
+ const nameField = p.childForFieldName("name");
38201
+ const name = nameField?.text;
38202
+ if (name && testScopes.has(name)) return true;
38203
+ if (p.text.startsWith("#[test]") || p.text.startsWith("#[cfg(test)]")) return true;
38204
+ return false;
38205
+ }
38206
+ if (p.type === "source_file") return false;
38207
+ }
38208
+ return false;
38209
+ }
38210
+
38211
+ // src/rules/rust/unused-pub-fn.ts
38212
+ var API_CONVENTION_NAMES = /* @__PURE__ */ new Set([
38213
+ "new",
38214
+ "default",
38215
+ "from",
38216
+ "from_str",
38217
+ "from_iter",
38218
+ "try_from",
38219
+ "into",
38220
+ "into_iter",
38221
+ "try_into",
38222
+ "as_ref",
38223
+ "as_mut",
38224
+ "clone",
38225
+ "fmt",
38226
+ "eq",
38227
+ "hash",
38228
+ "partial_cmp",
38229
+ "cmp",
38230
+ "ord",
38231
+ "partial_eq"
38232
+ ]);
38233
+ var rustUnusedPubFnRule = createRule({
38234
+ id: "rust/unused-pub-fn",
38235
+ category: "logic",
38236
+ severity: "low",
38237
+ aiSpecific: true,
38238
+ description: "Public function in a Rust file that has no in-file references",
38239
+ create(_context) {
38240
+ return {};
38241
+ },
38242
+ analyze(_context, facts) {
38243
+ const issues = [];
38244
+ if (!facts.v2?.rustFile) return issues;
38245
+ const rust = facts.v2.rustFile;
38246
+ const referenced = collectReferencedNames(facts.v2._source ?? "");
38247
+ for (const fn of rust.functions) {
38248
+ if (!fn.isPublic) continue;
38249
+ if (API_CONVENTION_NAMES.has(fn.name)) continue;
38250
+ if (fn.inTestConfig) continue;
38251
+ if (referenced.has(fn.name)) continue;
38252
+ issues.push({
38253
+ ruleId: "rust/unused-pub-fn",
38254
+ category: "logic",
38255
+ severity: "low",
38256
+ aiSpecific: true,
38257
+ message: `Public function '${fn.name}' is not referenced anywhere in the file`,
38258
+ line: fn.line,
38259
+ column: fn.column,
38260
+ advice: `Remove the function or call it somewhere. Rust's compiler doesn't warn on pub fns missing consumers unless \`#![warn(dead_code)]\` is set at the crate root. AI agents that iterate on a file often leave these behind \u2014 the most common AI-rotation signature for Rust after unused-imports.`
38261
+ });
38262
+ }
38263
+ return issues;
38264
+ }
38265
+ });
38266
+ function collectReferencedNames(source) {
38267
+ const out = /* @__PURE__ */ new Set();
38268
+ for (const m of source.matchAll(/\b([A-Za-z_][A-Za-z0-9_]*)\b/g)) {
38269
+ out.add(m[1]);
38270
+ }
38271
+ return out;
38272
+ }
38273
+
38274
+ // src/rules/rust/unwrap-in-production.ts
38275
+ init_parser_rust();
38276
+ var UNWRAP_METHODS = /* @__PURE__ */ new Set(["unwrap", "expect", "unwrap_or_else"]);
38277
+ var rustUnwrapInProductionRule = createRule({
38278
+ id: "rust/unwrap-in-production",
38279
+ category: "logic",
38280
+ severity: "medium",
38281
+ aiSpecific: true,
38282
+ description: ".unwrap() / .expect() called outside of #[cfg(test)] / #[test] scope",
38283
+ create(_context) {
38284
+ return {};
38285
+ },
38286
+ analyze(_context, facts) {
38287
+ const issues = [];
38288
+ if (!facts.v2?.rustFile) return issues;
38289
+ const source = facts.v2._source ?? "";
38290
+ if (!source) return issues;
38291
+ const tree = parseRust(source);
38292
+ if (!tree) return issues;
38293
+ const testScopes = /* @__PURE__ */ new Set();
38294
+ for (const fn of facts.v2.rustFile.functions) {
38295
+ if (fn.inTestConfig && fn.name) testScopes.add(fn.name);
38296
+ }
38297
+ collectUnwrapIssues(tree.rootNode, testScopes, issues);
38298
+ return issues;
38299
+ }
38300
+ });
38301
+ function collectUnwrapIssues(node, testScopes, issues) {
38302
+ if (node.type === "call_expression") {
38303
+ const fn = node.childForFieldName("function");
38304
+ if (fn && fn.type === "field_expression") {
38305
+ const field = fn.childForFieldName("field");
38306
+ if (field && field.type === "field_identifier" && UNWRAP_METHODS.has(field.text)) {
38307
+ if (!isInsideTestFunction2(node, testScopes)) {
38308
+ issues.push({
38309
+ ruleId: "rust/unwrap-in-production",
38310
+ category: "logic",
38311
+ severity: "medium",
38312
+ aiSpecific: true,
38313
+ message: `'.${field.text}()' called in production code \u2014 panic risk on Err/None`,
38314
+ line: node.startPosition.row + 1,
38315
+ column: node.startPosition.column,
38316
+ advice: `Replace with '?' (early-return on Err), '.map_err(...)' for conversion, or an explicit 'match'. '.${field.text}()' is fine in tests \u2014 wrap with '#[cfg(test)]' or move into a '#[cfg(test)] mod tests' block to suppress.`
38317
+ });
38318
+ }
38319
+ }
38320
+ }
38321
+ }
38322
+ for (let i = 0; i < node.namedChildCount; i++) {
38323
+ const child = node.namedChild(i);
38324
+ if (child) collectUnwrapIssues(child, testScopes, issues);
38325
+ }
38326
+ }
38327
+ function isInsideTestFunction2(node, testScopes) {
38328
+ for (let p = node.parent; p; p = p.parent) {
38329
+ if (p.type === "function_item") {
38330
+ const nameField = p.childForFieldName("name");
38331
+ const name = nameField?.text;
38332
+ if (name && testScopes.has(name)) return true;
38333
+ if (p.text.startsWith("#[test]") || p.text.startsWith("#[cfg(test)]")) return true;
38334
+ return false;
38335
+ }
38336
+ if (p.type === "source_file") return false;
38337
+ }
38338
+ return false;
38339
+ }
38340
+
37512
38341
  // src/rules/security/dangerous-cors.ts
37513
38342
  var HEADER_LITERAL_RE = /['"]Access-Control-Allow-Origin['"]\s*[,:=]\s*['"]\*['"]/g;
37514
38343
  var CORS_BLOCK_RE = /\bcors\s*\(\s*\{([^}]*)\}\s*\)/g;
@@ -40540,6 +41369,10 @@ var builtinRules = [
40540
41369
  halsteadAnomalyRule,
40541
41370
  terminologyDriftRule,
40542
41371
  uxPatternFragmentationRule,
41372
+ rustStringlyTypedRule,
41373
+ rustTodoMacroRule,
41374
+ rustUnusedPubFnRule,
41375
+ rustUnwrapInProductionRule,
40543
41376
  dangerousCorsRule,
40544
41377
  evalRule,
40545
41378
  exposedEnvVarRule,
@@ -40614,6 +41447,22 @@ var RuleRegistry = class {
40614
41447
  if (!filter) return list;
40615
41448
  return list.filter((r) => filter.kind === "ai" ? r.aiSpecific : !r.aiSpecific);
40616
41449
  }
41450
+ /** v0.18.8: remove every rule where `predicate(rule)` returns true.
41451
+ * Used by focused calibration scripts to scan a single category
41452
+ * without instantiating all 99 rules. */
41453
+ removeWhere(predicate) {
41454
+ let removed = 0;
41455
+ for (const [id, rule] of this.rules) {
41456
+ if (predicate(rule)) {
41457
+ this.rules.delete(id);
41458
+ removed++;
41459
+ }
41460
+ }
41461
+ return removed;
41462
+ }
41463
+ all() {
41464
+ return Array.from(this.rules.values());
41465
+ }
40617
41466
  createContexts(config, filePath, cwd, hotspotIssues = []) {
40618
41467
  const context = {
40619
41468
  config,
@@ -40634,1044 +41483,1793 @@ var RuleRegistry = class {
40634
41483
 
40635
41484
  // src/rules/signal-strength.json
40636
41485
  var signal_strength_default = {
40637
- "logic/math-console-log-storm": {
40638
- recall: 7e-3,
40639
- fpRate: 1e-3,
40640
- ratio: 6.71,
40641
- precision: 0.8968,
40642
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41486
+ "ai/any-density": {
41487
+ recall: 6e-3,
41488
+ fpRate: 37e-4,
41489
+ ratio: 175.31,
41490
+ precision: 0.6523,
41491
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40643
41492
  verdict: "USEFUL",
40644
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=1678, FP=193, P=89.7%, FPR=0.10%, lift=6.7. aiSpecific=True.",
40645
- aiSpecific: true
41493
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=1760, FP=938, P=65.2%, FPR=0.37%, lift=175.31. v7 was USEFUL (TP=1313, FP=758, lift=153.41). v8 was USEFUL (TP=447, FP=180).",
41494
+ aiSpecific: true,
41495
+ _v7Verdict: "USEFUL",
41496
+ _v7Lift: 153.41,
41497
+ _v7Recall: 55e-4,
41498
+ _v7FpRate: 41e-4,
41499
+ _v7Precision: 0.634,
41500
+ _v8Verdict: "USEFUL",
41501
+ _v8Lift: 271.97
40646
41502
  },
40647
- "logic/math-any-density": {
40648
- recall: 16e-4,
40649
- fpRate: 13e-4,
40650
- ratio: 1.17,
40651
- precision: 0.6035,
40652
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40653
- verdict: "NOISY",
40654
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. NOISY \u2014 TP=376, FP=247, P=60.4%, FPR=0.13%, lift=1.2. aiSpecific=True.",
40655
- defaultOff: true,
40656
- aiSpecific: true
41503
+ "ai/comment-ratio": {
41504
+ recall: 0.2771,
41505
+ fpRate: 0.1578,
41506
+ ratio: 4.26,
41507
+ precision: 0.6721,
41508
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41509
+ verdict: "USEFUL",
41510
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=81513, FP=39766, P=67.2%, FPR=15.78%, lift=4.26. v7 was USEFUL (TP=60308, FP=29876, lift=4.11). v8 was USEFUL (TP=21205, FP=9890).",
41511
+ aiSpecific: true,
41512
+ _v7Verdict: "USEFUL",
41513
+ _v7Lift: 4.11,
41514
+ _v7Recall: 0.2545,
41515
+ _v7FpRate: 0.1629,
41516
+ _v7Precision: 0.6687,
41517
+ _v8Verdict: "USEFUL",
41518
+ _v8Lift: 4.73
40657
41519
  },
40658
- "logic/boundary-violation": {
40659
- recall: 0.0263,
40660
- fpRate: 0.0175,
40661
- ratio: 1.5,
40662
- precision: 0.6601,
40663
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40664
- verdict: "HYGIENE",
40665
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=6282, FP=3235, P=66.0%, FPR=1.75%, lift=1.5. aiSpecific=False.",
40666
- aiSpecific: false
41520
+ "ai/compression-profile": {
41521
+ recall: 0.3478,
41522
+ fpRate: 0.1488,
41523
+ ratio: 4.92,
41524
+ precision: 0.7318,
41525
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41526
+ verdict: "USEFUL",
41527
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=102328, FP=37511, P=73.2%, FPR=14.88%, lift=4.92. v7 was USEFUL (TP=75031, FP=27473, lift=4.89). v8 was USEFUL (TP=27297, FP=10038).",
41528
+ aiSpecific: true,
41529
+ _v7Verdict: "USEFUL",
41530
+ _v7Lift: 4.89,
41531
+ _v7Recall: 0.3166,
41532
+ _v7FpRate: 0.1498,
41533
+ _v7Precision: 0.732,
41534
+ _v8Verdict: "USEFUL",
41535
+ _v8Lift: 5
40667
41536
  },
40668
- "logic/reactive-hook-soup": {
40669
- recall: 38e-4,
41537
+ "ai/console-debug-storm": {
41538
+ recall: 73e-4,
40670
41539
  fpRate: 9e-4,
40671
- ratio: 4.29,
40672
- precision: 0.8476,
40673
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41540
+ ratio: 949.21,
41541
+ precision: 0.9,
41542
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40674
41543
  verdict: "USEFUL",
40675
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=901, FP=162, P=84.8%, FPR=0.09%, lift=4.3. aiSpecific=True.",
40676
- aiSpecific: true
41544
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=2150, FP=239, P=90.0%, FPR=0.09%, lift=949.21. v7 was USEFUL (TP=1912, FP=175, lift=960.19). v8 was USEFUL (TP=238, FP=64).",
41545
+ aiSpecific: true,
41546
+ _v7Verdict: "USEFUL",
41547
+ _v7Lift: 960.19,
41548
+ _v7Recall: 81e-4,
41549
+ _v7FpRate: 1e-3,
41550
+ _v7Precision: 0.9161,
41551
+ _v8Verdict: "USEFUL",
41552
+ _v8Lift: 845.55
40677
41553
  },
40678
- "logic/optimistic-no-rollback": {
40679
- recall: 12e-4,
40680
- fpRate: 3e-4,
40681
- ratio: 3.61,
40682
- precision: 0.824,
40683
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41554
+ "ai/default-react-stack": {
41555
+ recall: 1e-3,
41556
+ fpRate: 0,
41557
+ ratio: 251225.49,
41558
+ precision: 0.9966,
41559
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40684
41560
  verdict: "USEFUL",
40685
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=281, FP=60, P=82.4%, FPR=0.03%, lift=3.6. aiSpecific=True.",
40686
- aiSpecific: true
41561
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=294, FP=1, P=99.7%, FPR=0.00%, lift=251225.49. v7 was USEFUL (TP=231, FP=1, lift=182622.43). v8 was USEFUL (TP=63, FP=0).",
41562
+ aiSpecific: true,
41563
+ _v7Verdict: "USEFUL",
41564
+ _v7Lift: 182622.43,
41565
+ _v7Recall: 1e-3,
41566
+ _v7FpRate: 0,
41567
+ _v7Precision: 0.9957,
41568
+ _v8Verdict: "USEFUL",
41569
+ _v8Lift: 99999
40687
41570
  },
40688
- "logic/zombie-state": {
40689
- recall: 1e-4,
40690
- fpRate: 0,
40691
- ratio: 9.26,
40692
- precision: 0.9231,
40693
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41571
+ "ai/errors-near-eof": {
41572
+ recall: 0.0948,
41573
+ fpRate: 0.052,
41574
+ ratio: 13.09,
41575
+ precision: 0.6803,
41576
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40694
41577
  verdict: "USEFUL",
40695
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=24, FP=2, P=92.3%, FPR=0.00%, lift=9.3. aiSpecific=True.",
40696
- aiSpecific: true
41578
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=27874, FP=13097, P=68.0%, FPR=5.20%, lift=13.09. v7 was USEFUL (TP=16673, FP=10112, lift=11.29). v8 was USEFUL (TP=11201, FP=2985).",
41579
+ aiSpecific: true,
41580
+ _v7Verdict: "USEFUL",
41581
+ _v7Lift: 11.29,
41582
+ _v7Recall: 0.0704,
41583
+ _v7FpRate: 0.0551,
41584
+ _v7Precision: 0.6225,
41585
+ _v8Verdict: "USEFUL",
41586
+ _v8Lift: 18.16
40697
41587
  },
40698
- "logic/math-gini-class-usage": {
40699
- recall: 13e-4,
41588
+ "ai/fetch-default-overuse": {
41589
+ recall: 27e-4,
40700
41590
  fpRate: 3e-4,
40701
- ratio: 5.09,
40702
- precision: 0.8683,
40703
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41591
+ ratio: 2679.84,
41592
+ precision: 0.9036,
41593
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40704
41594
  verdict: "USEFUL",
40705
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=310, FP=47, P=86.8%, FPR=0.03%, lift=5.1. aiSpecific=True.",
40706
- aiSpecific: true
41595
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=797, FP=85, P=90.4%, FPR=0.03%, lift=2679.84. v7 was USEFUL (TP=666, FP=76, lift=2166.14). v8 was USEFUL (TP=131, FP=9).",
41596
+ aiSpecific: true,
41597
+ _v7Verdict: "USEFUL",
41598
+ _v7Lift: 2166.14,
41599
+ _v7Recall: 28e-4,
41600
+ _v7FpRate: 4e-4,
41601
+ _v7Precision: 0.8976,
41602
+ _v8Verdict: "USEFUL",
41603
+ _v8Lift: 7139.19
40707
41604
  },
40708
- "visual/math-color-cluster": {
40709
- recall: 2e-4,
41605
+ "ai/library-reinvention": {
41606
+ recall: 3e-4,
40710
41607
  fpRate: 0,
40711
- ratio: 8.95,
40712
- precision: 0.9206,
40713
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41608
+ ratio: 47415.05,
41609
+ precision: 0.9405,
41610
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40714
41611
  verdict: "USEFUL",
40715
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=58, FP=5, P=92.1%, FPR=0.00%, lift=9.0. aiSpecific=True.",
40716
- aiSpecific: true
41612
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=79, FP=5, P=94.0%, FPR=0.00%, lift=47415.05. v7 was USEFUL (TP=64, FP=5, lift=34024.44). v8 was USEFUL (TP=15, FP=0).",
41613
+ aiSpecific: true,
41614
+ _v7Verdict: "USEFUL",
41615
+ _v7Lift: 34024.44,
41616
+ _v7Recall: 3e-4,
41617
+ _v7FpRate: 0,
41618
+ _v7Precision: 0.9275,
41619
+ _v8Verdict: "USEFUL",
41620
+ _v8Lift: 99999
40717
41621
  },
40718
- "visual/math-default-font": {
40719
- recall: 13e-4,
40720
- fpRate: 4e-4,
40721
- ratio: 3.4,
40722
- precision: 0.8151,
40723
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40724
- verdict: "USEFUL",
40725
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=313, FP=71, P=81.5%, FPR=0.04%, lift=3.4. aiSpecific=True.",
40726
- aiSpecific: true
40727
- },
40728
- "visual/math-gradient-hue-rotation": {
41622
+ "ai/log-rank-histogram": {
40729
41623
  recall: 0,
40730
41624
  fpRate: 0,
40731
41625
  ratio: 0,
40732
41626
  precision: 0,
40733
- lastCalibratedAt: "2026-06-25T00:00:00Z",
41627
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40734
41628
  verdict: "DORMANT",
40735
- defaultOff: true,
40736
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: Munsell, A. H. (1905), *A Color Notation*, Munsell Color Company; Itten, J. (1961), *The Art of Color*, Van Nostrand Reinhold. (Munsell color space + Itten color wheel \u2014 hue rotation analysis.)",
40737
- aiSpecific: true
41629
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=OK, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
41630
+ aiSpecific: true,
41631
+ _v7Verdict: "OK",
41632
+ _v7Lift: 0,
41633
+ _v7Recall: 0,
41634
+ _v7FpRate: 0,
41635
+ _v7Precision: 0,
41636
+ _v8Verdict: "DORMANT",
41637
+ _v8Lift: 1,
41638
+ defaultOff: true
40738
41639
  },
40739
- "visual/math-rounded-entropy": {
40740
- recall: 37e-4,
40741
- fpRate: 3e-4,
40742
- ratio: 10.9,
40743
- precision: 0.9339,
40744
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40745
- verdict: "USEFUL",
40746
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=876, FP=62, P=93.4%, FPR=0.03%, lift=10.9. aiSpecific=True.",
40747
- aiSpecific: true
40748
- },
40749
- "visual/math-font-entropy": {
40750
- recall: 45e-4,
40751
- fpRate: 13e-4,
40752
- ratio: 3.32,
40753
- precision: 0.8114,
40754
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40755
- verdict: "USEFUL",
40756
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=1067, FP=248, P=81.1%, FPR=0.13%, lift=3.3. aiSpecific=True.",
40757
- aiSpecific: true
40758
- },
40759
- "visual/math-spacing-entropy": {
40760
- recall: 18e-4,
40761
- fpRate: 6e-4,
40762
- ratio: 3.01,
40763
- precision: 0.7959,
40764
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40765
- verdict: "USEFUL",
40766
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=425, FP=109, P=79.6%, FPR=0.06%, lift=3.0. aiSpecific=True.",
40767
- aiSpecific: true
41640
+ "ai/markdown-leakage": {
41641
+ recall: 0,
41642
+ fpRate: 0,
41643
+ ratio: 10003.17,
41644
+ precision: 0.3571,
41645
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41646
+ verdict: "OK",
41647
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=5, FP=9, P=35.7%, FPR=0.00%, lift=10003.17. v7 was USEFUL (TP=5, FP=2, lift=65504.64). v8 was INVERTED (TP=0, FP=7).",
41648
+ aiSpecific: true,
41649
+ _v7Verdict: "USEFUL",
41650
+ _v7Lift: 65504.64,
41651
+ _v7Recall: 0,
41652
+ _v7FpRate: 0,
41653
+ _v7Precision: 0.7143,
41654
+ _v8Verdict: "INVERTED",
41655
+ _v8Lift: 0
40768
41656
  },
40769
- "visual/clamp-soup": {
41657
+ "ai/renyi-profile": {
40770
41658
  recall: 0,
40771
41659
  fpRate: 0,
40772
- ratio: 0,
40773
- precision: 0,
40774
- lastCalibratedAt: "2026-06-25T00:00:00Z",
40775
- verdict: "DORMANT",
40776
- defaultOff: true,
40777
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: W3C (2023), CSS Values and Units Module Level 4, W3C CR-css-values-4-20231218. (W3C clamp() spec \u2014 overuse is a code-smell, not a feature.)",
40778
- aiSpecific: true
41660
+ ratio: 5251.67,
41661
+ precision: 0.25,
41662
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41663
+ verdict: "OK",
41664
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=4, FP=12, P=25.0%, FPR=0.00%, lift=5251.67. v7 was OK (TP=3, FP=9, lift=5094.81). v8 was OK (TP=1, FP=3).",
41665
+ aiSpecific: true,
41666
+ _v7Verdict: "OK",
41667
+ _v7Lift: 5094.81,
41668
+ _v7Recall: 0,
41669
+ _v7FpRate: 0,
41670
+ _v7Precision: 0.25,
41671
+ _v8Verdict: "OK",
41672
+ _v8Lift: 5722.25
40779
41673
  },
40780
- "component/giant-component": {
40781
- recall: 0.0176,
40782
- fpRate: 77e-4,
40783
- ratio: 2.3,
40784
- precision: 0.7485,
40785
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41674
+ "ai/segment-surprisal-cv": {
41675
+ recall: 0.2019,
41676
+ fpRate: 0.0787,
41677
+ ratio: 9.52,
41678
+ precision: 0.7495,
41679
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40786
41680
  verdict: "USEFUL",
40787
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=4205, FP=1413, P=74.8%, FPR=0.77%, lift=2.3. aiSpecific=True.",
40788
- aiSpecific: true
41681
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=59390, FP=19849, P=75.0%, FPR=7.87%, lift=9.52. v7 was USEFUL (TP=43498, FP=14983, lift=9.11). v8 was USEFUL (TP=15892, FP=4866).",
41682
+ aiSpecific: true,
41683
+ _v7Verdict: "USEFUL",
41684
+ _v7Lift: 9.11,
41685
+ _v7Recall: 0.1836,
41686
+ _v7FpRate: 0.0817,
41687
+ _v7Precision: 0.7438,
41688
+ _v8Verdict: "USEFUL",
41689
+ _v8Lift: 10.8
40789
41690
  },
40790
- "component/shadcn-prop-mismatch": {
40791
- recall: 13e-4,
40792
- fpRate: 1e-4,
40793
- ratio: 10.1,
40794
- precision: 0.929,
40795
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41691
+ "ai/state-default-overuse": {
41692
+ recall: 3e-3,
41693
+ fpRate: 6e-4,
41694
+ ratio: 1315.06,
41695
+ precision: 0.8451,
41696
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40796
41697
  verdict: "USEFUL",
40797
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=314, FP=24, P=92.9%, FPR=0.01%, lift=10.1. aiSpecific=True.",
40798
- aiSpecific: true
40799
- },
40800
- "layout/math-grid-uniformity": {
40801
- recall: 3e-4,
40802
- fpRate: 2e-4,
40803
- ratio: 1.72,
40804
- precision: 0.6907,
40805
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40806
- verdict: "OK",
40807
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. OK \u2014 TP=67, FP=30, P=69.1%, FPR=0.02%, lift=1.7. aiSpecific=True.",
40808
- aiSpecific: true
41698
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=884, FP=162, P=84.5%, FPR=0.06%, lift=1315.06. v7 was USEFUL (TP=701, FP=158, lift=947.32). v8 was USEFUL (TP=183, FP=4).",
41699
+ aiSpecific: true,
41700
+ _v7Verdict: "USEFUL",
41701
+ _v7Lift: 947.32,
41702
+ _v7Recall: 3e-3,
41703
+ _v7FpRate: 9e-4,
41704
+ _v7Precision: 0.8161,
41705
+ _v8Verdict: "USEFUL",
41706
+ _v8Lift: 16799.55
40809
41707
  },
40810
- "layout/math-element-uniformity": {
40811
- recall: 28e-4,
40812
- fpRate: 12e-4,
40813
- ratio: 2.28,
40814
- precision: 0.7475,
40815
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41708
+ "ai/tailwind-color-overuse": {
41709
+ recall: 0.0264,
41710
+ fpRate: 38e-4,
41711
+ ratio: 230.97,
41712
+ precision: 0.8888,
41713
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40816
41714
  verdict: "USEFUL",
40817
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=666, FP=225, P=74.7%, FPR=0.12%, lift=2.3. aiSpecific=True.",
40818
- aiSpecific: true
41715
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=7752, FP=970, P=88.9%, FPR=0.38%, lift=230.97. v7 was USEFUL (TP=5169, FP=958, lift=161.52). v8 was USEFUL (TP=2583, FP=12).",
41716
+ aiSpecific: true,
41717
+ _v7Verdict: "USEFUL",
41718
+ _v7Lift: 161.52,
41719
+ _v7Recall: 0.0218,
41720
+ _v7FpRate: 52e-4,
41721
+ _v7Precision: 0.8436,
41722
+ _v8Verdict: "USEFUL",
41723
+ _v8Lift: 5695.79
40819
41724
  },
40820
- "typo/math-button-label-uniformity": {
40821
- recall: 2e-4,
40822
- fpRate: 1e-4,
40823
- ratio: 1.36,
40824
- precision: 0.6379,
40825
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40826
- verdict: "HYGIENE",
40827
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=37, FP=21, P=63.8%, FPR=0.01%, lift=1.4. aiSpecific=False.",
40828
- aiSpecific: false
40829
- },
40830
- "perf/css-bloat": {
40831
- recall: 0.0117,
40832
- fpRate: 32e-4,
40833
- ratio: 3.64,
40834
- precision: 0.8252,
40835
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40836
- verdict: "HYGIENE",
40837
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=2790, FP=591, P=82.5%, FPR=0.32%, lift=3.6. aiSpecific=False.",
40838
- aiSpecific: false
41725
+ "ai/text-like-ratio": {
41726
+ recall: 0,
41727
+ fpRate: 0,
41728
+ ratio: 201664,
41729
+ precision: 0.8,
41730
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41731
+ verdict: "USEFUL",
41732
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=4, FP=1, P=80.0%, FPR=0.00%, lift=201664.00. v7 was USEFUL (TP=3, FP=1, lift=137559.75). v8 was USEFUL (TP=1, FP=0).",
41733
+ aiSpecific: true,
41734
+ _v7Verdict: "USEFUL",
41735
+ _v7Lift: 137559.75,
41736
+ _v7Recall: 0,
41737
+ _v7FpRate: 0,
41738
+ _v7Precision: 0.75,
41739
+ _v8Verdict: "USEFUL",
41740
+ _v8Lift: 99999
40839
41741
  },
40840
- "wcag/focus-appearance": {
40841
- recall: 26e-4,
40842
- fpRate: 1e-4,
40843
- ratio: 19.68,
40844
- precision: 0.9623,
40845
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40846
- verdict: "HYGIENE",
40847
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=612, FP=24, P=96.2%, FPR=0.01%, lift=19.7. aiSpecific=False.",
40848
- aiSpecific: false
41742
+ "ai/whitespace-regularity": {
41743
+ recall: 0.0733,
41744
+ fpRate: 0.0677,
41745
+ ratio: 8.25,
41746
+ precision: 0.5583,
41747
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41748
+ verdict: "USEFUL",
41749
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=21567, FP=17061, P=55.8%, FPR=6.77%, lift=8.25. v7 was USEFUL (TP=17466, FP=13438, lift=7.71). v8 was USEFUL (TP=4101, FP=3623).",
41750
+ aiSpecific: true,
41751
+ _v7Verdict: "USEFUL",
41752
+ _v7Lift: 7.71,
41753
+ _v7Recall: 0.0737,
41754
+ _v7FpRate: 0.0733,
41755
+ _v7Precision: 0.5652,
41756
+ _v8Verdict: "USEFUL",
41757
+ _v8Lift: 10.06
40849
41758
  },
40850
- "wcag/target-size": {
41759
+ "arch/astro-island-leak": {
40851
41760
  recall: 0,
40852
41761
  fpRate: 0,
40853
41762
  ratio: 0,
40854
41763
  precision: 0,
40855
- lastCalibratedAt: "2026-06-25T00:00:00Z",
41764
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40856
41765
  verdict: "DORMANT",
40857
- defaultOff: true,
40858
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: W3C (2018), Web Content Accessibility Guidelines (WCAG) 2.1, Success Criterion 2.5.5 (Target Size); Fitts, P. M. (1954), \u2018The Information Capacity of the Human Motor System in Controlling the Amplitude of Movement\u2019, J. Exp. Psychol. 47(6):381-391. (WCAG 2.5.5 + Fitts's Law \u2014 minimum 24\xD724 CSS px tap target.)",
40859
- aiSpecific: false
40860
- },
40861
- "component/multiple-components-per-file": {
40862
- recall: 0.0681,
40863
- fpRate: 0.052,
40864
- ratio: 1.31,
40865
- precision: 0.6294,
40866
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40867
- verdict: "HYGIENE",
40868
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=16288, FP=9589, P=62.9%, FPR=5.20%, lift=1.3. aiSpecific=False.",
40869
- aiSpecific: false
41766
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
41767
+ aiSpecific: true,
41768
+ _v7Verdict: "DORMANT",
41769
+ _v7Lift: 0,
41770
+ _v7Recall: 0,
41771
+ _v7FpRate: 0,
41772
+ _v7Precision: 0,
41773
+ _v8Verdict: "DORMANT",
41774
+ _v8Lift: 1,
41775
+ defaultOff: true
40870
41776
  },
40871
- "context/import-path-mismatch": {
40872
- recall: 0.0739,
40873
- fpRate: 0.0228,
40874
- ratio: 3.25,
40875
- precision: 0.8079,
40876
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40877
- verdict: "HYGIENE",
40878
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=17672, FP=4202, P=80.8%, FPR=2.28%, lift=3.2. aiSpecific=False.",
40879
- aiSpecific: false
41777
+ "component/giant-component": {
41778
+ recall: 0.0181,
41779
+ fpRate: 59e-4,
41780
+ ratio: 132.31,
41781
+ precision: 0.7815,
41782
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41783
+ verdict: "USEFUL",
41784
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=5326, FP=1489, P=78.2%, FPR=0.59%, lift=132.31. v7 was USEFUL (TP=4205, FP=1413, lift=97.16). v8 was USEFUL (TP=1121, FP=76).",
41785
+ aiSpecific: true,
41786
+ _v7Verdict: "USEFUL",
41787
+ _v7Lift: 97.16,
41788
+ _v7Recall: 0.0177,
41789
+ _v7FpRate: 77e-4,
41790
+ _v7Precision: 0.7485,
41791
+ _v8Verdict: "USEFUL",
41792
+ _v8Lift: 846.15
40880
41793
  },
40881
- "logic/key-prop-missing": {
40882
- recall: 17e-4,
40883
- fpRate: 14e-4,
40884
- ratio: 1.28,
40885
- precision: 0.6246,
40886
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40887
- verdict: "HYGIENE",
40888
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=416, FP=250, P=62.5%, FPR=0.14%, lift=1.3. aiSpecific=False.",
40889
- aiSpecific: false
41794
+ "component/multiple-components-per-file": {
41795
+ recall: 0.0751,
41796
+ fpRate: 0.0423,
41797
+ ratio: 15.96,
41798
+ precision: 0.6747,
41799
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41800
+ verdict: "USEFUL",
41801
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=22103, FP=10655, P=67.5%, FPR=4.23%, lift=15.96. v7 was USEFUL (TP=16288, FP=9589, lift=12.04). v8 was USEFUL (TP=5815, FP=1066).",
41802
+ aiSpecific: false,
41803
+ _v7Verdict: "USEFUL",
41804
+ _v7Lift: 12.04,
41805
+ _v7Recall: 0.0687,
41806
+ _v7FpRate: 0.0523,
41807
+ _v7Precision: 0.6294,
41808
+ _v8Verdict: "USEFUL",
41809
+ _v8Lift: 54.44
40890
41810
  },
40891
- "logic/math-variable-name-entropy": {
40892
- recall: 2e-4,
41811
+ "component/shadcn-prop-mismatch": {
41812
+ recall: 16e-4,
40893
41813
  fpRate: 1e-4,
40894
- ratio: 1.07,
40895
- precision: 0.5806,
40896
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40897
- verdict: "HYGIENE",
40898
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=36, FP=26, P=58.1%, FPR=0.01%, lift=1.1. aiSpecific=False.",
40899
- aiSpecific: false
40900
- },
40901
- "security/public-admin-route": {
40902
- recall: 28e-4,
40903
- fpRate: 78e-4,
40904
- ratio: 0.4,
40905
- precision: 0.2251,
40906
- lastCalibratedAt: "2026-06-26T22:30:00Z",
40907
- verdict: "HYGIENE",
40908
- _calibrationNote: "v4 corpus (2026-06-25): 95,599 neg + 76,550 pos (frontend, TS/TSX/JS/JSX). INVERTED \u2014 TP=217, FP=747, P=22.5%, FPR=0.78%, lift=0.4. [v0.12.2: reclassified to HYGIENE because rule is aiSpecific: false]",
40909
- defaultOff: true,
40910
- aiSpecific: false
40911
- },
40912
- "security/unsafe-html-render": {
40913
- recall: 13e-4,
40914
- fpRate: 9e-4,
40915
- ratio: 1.5,
40916
- precision: 0.661,
40917
- lastCalibratedAt: "2026-06-27T12:00:00Z",
40918
- verdict: "HYGIENE",
40919
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=312, FP=160, P=66.1%, FPR=0.09%, lift=1.5. aiSpecific=False.",
40920
- aiSpecific: false
40921
- },
40922
- "visual/naturalness-anomaly": {
40923
- recall: 0.1645,
40924
- fpRate: 0.0617,
40925
- ratio: 2.67,
40926
- precision: 0.7755,
40927
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41814
+ ratio: 9990.98,
41815
+ precision: 0.9512,
41816
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40928
41817
  verdict: "USEFUL",
40929
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=39319, FP=11382, P=77.6%, FPR=6.17%, lift=2.7. aiSpecific=True.",
40930
- aiSpecific: true
41818
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=468, FP=24, P=95.1%, FPR=0.01%, lift=9990.98. v7 was USEFUL (TP=314, FP=24, lift=7099.57). v8 was USEFUL (TP=154, FP=0).",
41819
+ aiSpecific: true,
41820
+ _v7Verdict: "USEFUL",
41821
+ _v7Lift: 7099.57,
41822
+ _v7Recall: 13e-4,
41823
+ _v7FpRate: 1e-4,
41824
+ _v7Precision: 0.929,
41825
+ _v8Verdict: "USEFUL",
41826
+ _v8Lift: 99999
40931
41827
  },
40932
- "perf/halstead-anomaly": {
40933
- recall: 0,
40934
- fpRate: 0,
40935
- ratio: 2.32,
40936
- precision: 0.75,
40937
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41828
+ "context/import-path-mismatch": {
41829
+ recall: 0.0681,
41830
+ fpRate: 0.0167,
41831
+ ratio: 49.48,
41832
+ precision: 0.8263,
41833
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40938
41834
  verdict: "USEFUL",
40939
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=3, FP=1, P=75.0%, FPR=0.00%, lift=2.3. aiSpecific=True.",
40940
- aiSpecific: true
41835
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=20032, FP=4210, P=82.6%, FPR=1.67%, lift=49.48. v7 was USEFUL (TP=17672, FP=4202, lift=35.26). v8 was USEFUL (TP=2360, FP=8).",
41836
+ aiSpecific: false,
41837
+ _v7Verdict: "USEFUL",
41838
+ _v7Lift: 35.26,
41839
+ _v7Recall: 0.0746,
41840
+ _v7FpRate: 0.0229,
41841
+ _v7Precision: 0.8079,
41842
+ _v8Verdict: "USEFUL",
41843
+ _v8Lift: 8554.38
40941
41844
  },
40942
- "arch/astro-island-leak": {
41845
+ "db/duplicate-index": {
40943
41846
  recall: 0,
40944
41847
  fpRate: 0,
40945
41848
  ratio: 0,
40946
41849
  precision: 0,
40947
- lastCalibratedAt: "2026-06-25T00:00:00Z",
41850
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40948
41851
  verdict: "DORMANT",
40949
- defaultOff: true,
40950
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: Hevery, M. (2022), \u2018Islands Architecture: A New Pattern for Server-Component Frameworks\u2019, ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages & Applications (OOPSLA), invited talk; Astro Documentation (2023), https://docs.astro.build. (Astro Islands architecture \u2014 client JS should not leak into server components.)",
40951
- aiSpecific: true
41852
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
41853
+ aiSpecific: false,
41854
+ _v7Verdict: "DORMANT",
41855
+ _v7Lift: 0,
41856
+ _v7Recall: 0,
41857
+ _v7FpRate: 0,
41858
+ _v7Precision: 0,
41859
+ _v8Verdict: "DORMANT",
41860
+ _v8Lift: 1,
41861
+ defaultOff: true
40952
41862
  },
40953
- "logic/qwik-hook-leak": {
41863
+ "db/enum-sprawl": {
40954
41864
  recall: 0,
40955
41865
  fpRate: 0,
40956
41866
  ratio: 0,
40957
41867
  precision: 0,
40958
- lastCalibratedAt: "2026-06-25T00:00:00Z",
41868
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40959
41869
  verdict: "DORMANT",
40960
- defaultOff: true,
40961
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: Hevery, M. (2022), \u2018Qwik: A Resumable JavaScript Framework\u2019, ACM SIGPLAN OOPSLA companion; Builder.io Technical Report. (Qwik resumability \u2014 serializing state avoids hydration cost.)",
40962
- aiSpecific: true
41870
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
41871
+ aiSpecific: false,
41872
+ _v7Verdict: "DORMANT",
41873
+ _v7Lift: 0,
41874
+ _v7Recall: 0,
41875
+ _v7FpRate: 0,
41876
+ _v7Precision: 0,
41877
+ _v8Verdict: "DORMANT",
41878
+ _v8Lift: 1,
41879
+ defaultOff: true
40963
41880
  },
40964
- "test/missing-edge-case": {
41881
+ "db/missing-fk-index": {
40965
41882
  recall: 0,
40966
41883
  fpRate: 0,
40967
41884
  ratio: 0,
40968
41885
  precision: 0,
40969
- lastCalibratedAt: "2026-06-25T00:00:00Z",
41886
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40970
41887
  verdict: "DORMANT",
40971
- defaultOff: true,
40972
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: Myers, G. J. (1979), *The Art of Software Testing*, Wiley-Interscience (canonical boundary value analysis reference); Beizer, B. (1990), *Software Testing Techniques*, 2nd ed., Van Nostrand Reinhold. (Boundary value analysis \u2014 empty / zero / max / null / type-boundary cases.)",
40973
- aiSpecific: true
41888
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
41889
+ aiSpecific: false,
41890
+ _v7Verdict: "DORMANT",
41891
+ _v7Lift: 0,
41892
+ _v7Recall: 0,
41893
+ _v7FpRate: 0,
41894
+ _v7Precision: 0,
41895
+ _v8Verdict: "DORMANT",
41896
+ _v8Lift: 1,
41897
+ defaultOff: true
40974
41898
  },
40975
- "typo/calc-fontsize": {
41899
+ "db/missing-not-null": {
40976
41900
  recall: 0,
40977
41901
  fpRate: 0,
40978
41902
  ratio: 0,
40979
41903
  precision: 0,
40980
- lastCalibratedAt: "2026-06-25T00:00:00Z",
41904
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40981
41905
  verdict: "DORMANT",
40982
- defaultOff: true,
40983
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: Marcotte, E. (2016), *Responsive Design: Patterns & Principles*, A Book Apart; Brown, J. (2018), *Every Layout*, self-published (rel='https://every-layout.dev'). (Fluid typography via clamp(min, preferred, max).)",
40984
- aiSpecific: false
41906
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
41907
+ aiSpecific: false,
41908
+ _v7Verdict: "DORMANT",
41909
+ _v7Lift: 0,
41910
+ _v7Recall: 0,
41911
+ _v7FpRate: 0,
41912
+ _v7Precision: 0,
41913
+ _v8Verdict: "DORMANT",
41914
+ _v8Lift: 1,
41915
+ defaultOff: true
40985
41916
  },
40986
- "typo/clamp-offscale": {
41917
+ "db/naming-inconsistency": {
40987
41918
  recall: 0,
40988
41919
  fpRate: 0,
40989
41920
  ratio: 0,
40990
41921
  precision: 0,
40991
- lastCalibratedAt: "2026-06-25T00:00:00Z",
41922
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
40992
41923
  verdict: "DORMANT",
40993
- defaultOff: true,
40994
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: W3C (2023), CSS Values 4 \xA77.2 (Functional Notations: clamp()); Brown, J. (2018), *Every Layout*. (CSS clamp() \u2014 off-scale (negative, >10rem) values are typos.)",
40995
- aiSpecific: false
41924
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
41925
+ aiSpecific: false,
41926
+ _v7Verdict: "DORMANT",
41927
+ _v7Lift: 0,
41928
+ _v7Recall: 0,
41929
+ _v7FpRate: 0,
41930
+ _v7Precision: 0,
41931
+ _v8Verdict: "DORMANT",
41932
+ _v8Lift: 1,
41933
+ defaultOff: true
40996
41934
  },
40997
- "typo/math-cta-vocabulary": {
41935
+ "db/sql-concat": {
41936
+ recall: 5e-4,
41937
+ fpRate: 1e-4,
41938
+ ratio: 7511.26,
41939
+ precision: 0.8343,
41940
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41941
+ verdict: "USEFUL",
41942
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=141, FP=28, P=83.4%, FPR=0.01%, lift=7511.26. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=141, FP=28).",
41943
+ aiSpecific: true,
41944
+ _v7Verdict: "DORMANT",
41945
+ _v7Lift: 1,
41946
+ _v7Recall: 0,
41947
+ _v7FpRate: 0,
41948
+ _v7Precision: 0,
41949
+ _v8Verdict: "USEFUL",
41950
+ _v8Lift: 2046.08
41951
+ },
41952
+ "dead/dead-branch": {
41953
+ recall: 2e-4,
41954
+ fpRate: 4e-4,
41955
+ ratio: 1080.68,
41956
+ precision: 0.4244,
41957
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41958
+ verdict: "OK",
41959
+ _calibrationNote: "v8.5 (v0.18.9): v85 verdict=OK, v7 was DORMANT, v8 was OK. v0.18.8 v8a first measurement (1000 files): see docs/research/v0.18.8-dead-rules-measurement.md.",
41960
+ aiSpecific: true,
41961
+ _v7Verdict: "DORMANT",
41962
+ _v7Lift: 1,
41963
+ _v7Recall: 0,
41964
+ _v7FpRate: 0,
41965
+ _v7Precision: 0,
41966
+ _v8Verdict: "OK",
41967
+ _v8Lift: 294.38
41968
+ },
41969
+ "dead/unreachable": {
41970
+ recall: 1e-4,
41971
+ fpRate: 6e-4,
41972
+ ratio: 153.14,
41973
+ precision: 0.0966,
41974
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41975
+ verdict: "OK",
41976
+ _calibrationNote: "v8.5 (v0.18.9): v85 verdict=OK, v7 was DORMANT, v8 was OK. v0.18.8 v8a first measurement (1000 files): see docs/research/v0.18.8-dead-rules-measurement.md.",
41977
+ aiSpecific: true,
41978
+ _v7Verdict: "DORMANT",
41979
+ _v7Lift: 1,
41980
+ _v7Recall: 0,
41981
+ _v7FpRate: 0,
41982
+ _v7Precision: 0,
41983
+ _v8Verdict: "OK",
41984
+ _v8Lift: 41.71
41985
+ },
41986
+ "dead/unused-import": {
41987
+ recall: 0.0379,
41988
+ fpRate: 0.0222,
41989
+ ratio: 30.06,
41990
+ precision: 0.6662,
41991
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41992
+ verdict: "USEFUL",
41993
+ _calibrationNote: "v8.5 (v0.18.9): v85 verdict=USEFUL, v7 was DORMANT, v8 was USEFUL. v0.18.8 v8a first measurement (1000 files): see docs/research/v0.18.8-dead-rules-measurement.md.",
41994
+ aiSpecific: true,
41995
+ _v7Verdict: "DORMANT",
41996
+ _v7Lift: 1,
41997
+ _v7Recall: 0,
41998
+ _v7FpRate: 0,
41999
+ _v7Precision: 0,
42000
+ _v8Verdict: "USEFUL",
42001
+ _v8Lift: 8.19
42002
+ },
42003
+ "dead/unused-local": {
42004
+ recall: 0.0477,
42005
+ fpRate: 74e-4,
42006
+ ratio: 120.18,
42007
+ precision: 0.8834,
42008
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42009
+ verdict: "USEFUL",
42010
+ _calibrationNote: "v8.5 (v0.18.9): v85 verdict=USEFUL, v7 was DORMANT, v8 was USEFUL. v0.18.8 v8a first measurement (1000 files): see docs/research/v0.18.8-dead-rules-measurement.md.",
42011
+ aiSpecific: true,
42012
+ _v7Verdict: "DORMANT",
42013
+ _v7Lift: 1,
42014
+ _v7Recall: 0,
42015
+ _v7FpRate: 0,
42016
+ _v7Precision: 0,
42017
+ _v8Verdict: "USEFUL",
42018
+ _v8Lift: 32.74
42019
+ },
42020
+ "dead/unused-parameter": {
42021
+ recall: 8e-4,
42022
+ fpRate: 27e-4,
42023
+ ratio: 98,
42024
+ precision: 0.2628,
42025
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42026
+ verdict: "OK",
42027
+ _calibrationNote: "v8.5 (v0.18.9): v85 verdict=OK, v7 was DORMANT, v8 was OK. v0.18.8 v8a first measurement (1000 files): see docs/research/v0.18.8-dead-rules-measurement.md.",
42028
+ aiSpecific: true,
42029
+ _v7Verdict: "DORMANT",
42030
+ _v7Lift: 1,
42031
+ _v7Recall: 0,
42032
+ _v7FpRate: 0,
42033
+ _v7Precision: 0,
42034
+ _v8Verdict: "OK",
42035
+ _v8Lift: 26.7
42036
+ },
42037
+ "docs/broken-link": {
42038
+ recall: 14e-4,
42039
+ fpRate: 23e-4,
42040
+ ratio: 178.13,
42041
+ precision: 0.4155,
42042
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42043
+ verdict: "OK",
42044
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=418, FP=588, P=41.6%, FPR=0.23%, lift=178.13. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was OK (TP=418, FP=588).",
42045
+ aiSpecific: false,
42046
+ _v7Verdict: "DORMANT",
42047
+ _v7Lift: 1,
42048
+ _v7Recall: 0,
42049
+ _v7FpRate: 0,
42050
+ _v7Precision: 0,
42051
+ _v8Verdict: "OK",
42052
+ _v8Lift: 48.52
42053
+ },
42054
+ "docs/expired-code-example": {
40998
42055
  recall: 0,
40999
42056
  fpRate: 0,
41000
42057
  ratio: 0,
41001
42058
  precision: 0,
41002
- lastCalibratedAt: "2026-06-25T00:00:00Z",
41003
- verdict: "DORMANT",
41004
- defaultOff: true,
41005
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: Cialdini, R. B. (1984), *Influence: The Psychology of Persuasion*, Harper Business; Krug, S. (2000), *Don't Make Me Think*, 2nd ed., New Riders. (CTA wording \u2014 vague labels reduce click-through per Cialdini commitment/consistency.)",
41006
- aiSpecific: true
42059
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42060
+ verdict: "INVERTED",
42061
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=0, FP=3, P=0.0%, FPR=0.00%, lift=0.00. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was INVERTED (TP=0, FP=3).",
42062
+ aiSpecific: false,
42063
+ _v7Verdict: "DORMANT",
42064
+ _v7Lift: 1,
42065
+ _v7Recall: 0,
42066
+ _v7FpRate: 0,
42067
+ _v7Precision: 0,
42068
+ _v8Verdict: "INVERTED",
42069
+ _v8Lift: 0,
42070
+ defaultOff: true
42071
+ },
42072
+ "docs/stale-function-reference": {
42073
+ recall: 26e-4,
42074
+ fpRate: 5e-4,
42075
+ ratio: 1638.47,
42076
+ precision: 0.8515,
42077
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42078
+ verdict: "USEFUL",
42079
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=751, FP=131, P=85.1%, FPR=0.05%, lift=1638.47. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=751, FP=131).",
42080
+ aiSpecific: false,
42081
+ _v7Verdict: "DORMANT",
42082
+ _v7Lift: 1,
42083
+ _v7Recall: 0,
42084
+ _v7FpRate: 0,
42085
+ _v7Precision: 0,
42086
+ _v8Verdict: "USEFUL",
42087
+ _v8Lift: 446.32
42088
+ },
42089
+ "docs/stale-package-reference": {
42090
+ recall: 2e-4,
42091
+ fpRate: 4e-4,
42092
+ ratio: 939.43,
42093
+ precision: 0.3429,
42094
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42095
+ verdict: "OK",
42096
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=48, FP=92, P=34.3%, FPR=0.04%, lift=939.43. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was OK (TP=48, FP=92).",
42097
+ aiSpecific: false,
42098
+ _v7Verdict: "DORMANT",
42099
+ _v7Lift: 1,
42100
+ _v7Recall: 0,
42101
+ _v7FpRate: 0,
42102
+ _v7Precision: 0,
42103
+ _v8Verdict: "OK",
42104
+ _v8Lift: 255.9
41007
42105
  },
41008
42106
  "layout/forced-layout": {
41009
42107
  recall: 0,
41010
42108
  fpRate: 0,
41011
42109
  ratio: 0,
41012
42110
  precision: 0,
41013
- lastCalibratedAt: "2026-06-25T00:00:00Z",
42111
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41014
42112
  verdict: "DORMANT",
41015
- defaultOff: true,
41016
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: Mozilla Developer Network (2023), CSS Grid Layout, https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout; W3C (2023), CSS Grid Layout Module Level 3, W3C CR-css-grid-3-20231218. (CSS Grid spec \u2014 forced layout is a fallback hack, not the idiomatic approach.)",
41017
- aiSpecific: true
42113
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
42114
+ aiSpecific: true,
42115
+ _v7Verdict: "DORMANT",
42116
+ _v7Lift: 0,
42117
+ _v7Recall: 0,
42118
+ _v7FpRate: 0,
42119
+ _v7Precision: 0,
42120
+ _v8Verdict: "DORMANT",
42121
+ _v8Lift: 1,
42122
+ defaultOff: true
41018
42123
  },
41019
- "visual/generic-centering": {
42124
+ "layout/gap-monopoly": {
42125
+ recall: 3e-4,
42126
+ fpRate: 1e-4,
42127
+ ratio: 8859.33,
42128
+ precision: 0.8083,
42129
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42130
+ verdict: "USEFUL",
42131
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=97, FP=23, P=80.8%, FPR=0.01%, lift=8859.33. v7 was USEFUL (TP=88, FP=23, lift=6322.11). v8 was USEFUL (TP=9, FP=0).",
42132
+ aiSpecific: false,
42133
+ _v7Verdict: "USEFUL",
42134
+ _v7Lift: 6322.11,
42135
+ _v7Recall: 4e-4,
42136
+ _v7FpRate: 1e-4,
42137
+ _v7Precision: 0.7928,
42138
+ _v8Verdict: "USEFUL",
42139
+ _v8Lift: 99999
42140
+ },
42141
+ "layout/math-element-uniformity": {
42142
+ recall: 29e-4,
42143
+ fpRate: 1e-3,
42144
+ ratio: 770.74,
42145
+ precision: 0.7705,
42146
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42147
+ verdict: "USEFUL",
42148
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=846, FP=252, P=77.0%, FPR=0.10%, lift=770.74. v7 was USEFUL (TP=666, FP=225, lift=609.32). v8 was USEFUL (TP=180, FP=27).",
42149
+ aiSpecific: true,
42150
+ _v7Verdict: "USEFUL",
42151
+ _v7Lift: 609.32,
42152
+ _v7Recall: 28e-4,
42153
+ _v7FpRate: 12e-4,
42154
+ _v7Precision: 0.7475,
42155
+ _v8Verdict: "USEFUL",
42156
+ _v8Lift: 2211.5
42157
+ },
42158
+ "layout/math-grid-uniformity": {
42159
+ recall: 3e-4,
42160
+ fpRate: 1e-4,
42161
+ ratio: 5839.98,
42162
+ precision: 0.7182,
42163
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42164
+ verdict: "USEFUL",
42165
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=79, FP=31, P=71.8%, FPR=0.01%, lift=5839.98. v7 was USEFUL (TP=67, FP=30, lift=4222.91). v8 was USEFUL (TP=12, FP=1).",
42166
+ aiSpecific: true,
42167
+ _v7Verdict: "USEFUL",
42168
+ _v7Lift: 4222.91,
42169
+ _v7Recall: 3e-4,
42170
+ _v7FpRate: 2e-4,
42171
+ _v7Precision: 0.6907,
42172
+ _v8Verdict: "USEFUL",
42173
+ _v8Lift: 63384.92
42174
+ },
42175
+ "layout/spacing-grid": {
42176
+ recall: 2e-4,
42177
+ fpRate: 2e-4,
42178
+ ratio: 4051.29,
42179
+ precision: 0.6429,
42180
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42181
+ verdict: "USEFUL",
42182
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=72, FP=40, P=64.3%, FPR=0.02%, lift=4051.29. v7 was USEFUL (TP=39, FP=15, lift=8831.00). v8 was USEFUL (TP=33, FP=25).",
42183
+ aiSpecific: false,
42184
+ _v7Verdict: "USEFUL",
42185
+ _v7Lift: 8831,
42186
+ _v7Recall: 2e-4,
42187
+ _v7FpRate: 1e-4,
42188
+ _v7Precision: 0.7222,
42189
+ _v8Verdict: "USEFUL",
42190
+ _v8Lift: 1562.77
42191
+ },
42192
+ "logic/bayesian-conditional": {
41020
42193
  recall: 0,
41021
42194
  fpRate: 0,
41022
42195
  ratio: 0,
41023
42196
  precision: 0,
41024
- lastCalibratedAt: "2026-06-25T00:00:00Z",
42197
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41025
42198
  verdict: "DORMANT",
41026
- defaultOff: true,
41027
- _calibrationNote: "v0.10.1 ship \u2014 not in v4 per-rule table. Default-off until calibration data lands. Backed by: Wertheimer, M. (1923), \u2018Untersuchungen zur Lehre von der Gestalt II\u2019, Psychologische Forschung 4:301-350; M\xFCller-Brockmann, J. (1981), *Grid Systems in Graphic Design*, Niggli. (Gestalt centering + grid systems \u2014 generic centering is anti-grid.)",
41028
- aiSpecific: true
42199
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
42200
+ aiSpecific: true,
42201
+ _v7Verdict: "DORMANT",
42202
+ _v7Lift: 0,
42203
+ _v7Recall: 0,
42204
+ _v7FpRate: 0,
42205
+ _v7Precision: 0,
42206
+ _v8Verdict: "DORMANT",
42207
+ _v8Lift: 1,
42208
+ defaultOff: true
41029
42209
  },
41030
- "product/terminology-drift": {
41031
- recall: 85e-4,
41032
- fpRate: 28e-4,
41033
- ratio: 3,
41034
- precision: 0.7956,
41035
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41036
- verdict: "HYGIENE",
41037
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=2028, FP=521, P=79.6%, FPR=0.28%, lift=3.0. aiSpecific=False.",
41038
- aiSpecific: false
42210
+ "logic/boundary-violation": {
42211
+ recall: 0.0274,
42212
+ fpRate: 0.0137,
42213
+ ratio: 51.32,
42214
+ precision: 0.7006,
42215
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42216
+ verdict: "USEFUL",
42217
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=8051, FP=3441, P=70.1%, FPR=1.37%, lift=51.32. v7 was USEFUL (TP=6282, FP=3235, lift=37.42). v8 was USEFUL (TP=1769, FP=206).",
42218
+ aiSpecific: false,
42219
+ _v7Verdict: "USEFUL",
42220
+ _v7Lift: 37.42,
42221
+ _v7Recall: 0.0265,
42222
+ _v7FpRate: 0.0176,
42223
+ _v7Precision: 0.6601,
42224
+ _v8Verdict: "USEFUL",
42225
+ _v8Lift: 298.57
41039
42226
  },
41040
- "product/ux-pattern-fragmentation": {
42227
+ "logic/ghost-defensive": {
41041
42228
  recall: 1e-4,
41042
42229
  fpRate: 0,
41043
- ratio: 3.09,
41044
- precision: 0.8,
41045
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42230
+ ratio: 112035.56,
42231
+ precision: 0.8889,
42232
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41046
42233
  verdict: "USEFUL",
41047
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=32, FP=8, P=80.0%, FPR=0.00%, lift=3.1. aiSpecific=True.",
41048
- aiSpecific: true
42234
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=16, FP=2, P=88.9%, FPR=0.00%, lift=112035.56. v7 was USEFUL (TP=15, FP=2, lift=80917.50). v8 was USEFUL (TP=1, FP=0).",
42235
+ aiSpecific: true,
42236
+ _v7Verdict: "USEFUL",
42237
+ _v7Lift: 80917.5,
42238
+ _v7Recall: 1e-4,
42239
+ _v7FpRate: 0,
42240
+ _v7Precision: 0.8824,
42241
+ _v8Verdict: "USEFUL",
42242
+ _v8Lift: 99999
41049
42243
  },
41050
- "security/sql-construction": {
41051
- recall: 3e-3,
41052
- fpRate: 18e-4,
41053
- ratio: 1.63,
41054
- precision: 0.6788,
41055
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42244
+ "logic/heaps-deviation": {
42245
+ recall: 0.0126,
42246
+ fpRate: 0.0178,
42247
+ ratio: 25.54,
42248
+ precision: 0.4536,
42249
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41056
42250
  verdict: "OK",
41057
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. OK \u2014 TP=710, FP=336, P=67.9%, FPR=0.18%, lift=1.6. aiSpecific=True.",
41058
- aiSpecific: true
42251
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=3716, FP=4477, P=45.4%, FPR=1.78%, lift=25.54. v7 was USEFUL (TP=2924, FP=2430, lift=41.22). v8 was OK (TP=792, FP=2047).",
42252
+ aiSpecific: false,
42253
+ _v7Verdict: "USEFUL",
42254
+ _v7Lift: 41.22,
42255
+ _v7Recall: 0.0123,
42256
+ _v7FpRate: 0.0132,
42257
+ _v7Precision: 0.5461,
42258
+ _v8Verdict: "OK",
42259
+ _v8Lift: 9.36
41059
42260
  },
41060
- "security/missing-auth-check": {
41061
- recall: 63e-4,
41062
- fpRate: 4e-4,
41063
- ratio: 15.3,
41064
- precision: 0.9247,
41065
- lastCalibratedAt: "2026-06-26T22:30:00Z",
42261
+ "logic/key-prop-missing": {
42262
+ recall: 16e-4,
42263
+ fpRate: 11e-4,
42264
+ ratio: 574.52,
42265
+ precision: 0.629,
42266
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41066
42267
  verdict: "USEFUL",
41067
- _calibrationNote: "v4 corpus (2026-06-25): 95,599 neg + 76,550 pos (frontend, TS/TSX/JS/JSX). USEFUL \u2014 TP=479, FP=39, P=92.5%, FPR=0.04%, lift=15.3.",
41068
- aiSpecific: false
42268
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=468, FP=276, P=62.9%, FPR=0.11%, lift=574.52. v7 was USEFUL (TP=416, FP=250, lift=458.26). v8 was USEFUL (TP=52, FP=26).",
42269
+ aiSpecific: false,
42270
+ _v7Verdict: "USEFUL",
42271
+ _v7Lift: 458.26,
42272
+ _v7Recall: 18e-4,
42273
+ _v7FpRate: 14e-4,
42274
+ _v7Precision: 0.6246,
42275
+ _v8Verdict: "USEFUL",
42276
+ _v8Lift: 1760.69
41069
42277
  },
41070
- "security/dangerous-cors": {
41071
- recall: 5e-4,
41072
- fpRate: 5e-4,
41073
- ratio: 1.05,
41074
- precision: 0.5758,
41075
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42278
+ "logic/ks-distribution-shift": {
42279
+ recall: 0.6889,
42280
+ fpRate: 0.4411,
42281
+ ratio: 1.46,
42282
+ precision: 0.6457,
42283
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41076
42284
  verdict: "NOISY",
41077
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. NOISY \u2014 TP=114, FP=84, P=57.6%, FPR=0.05%, lift=1.0. aiSpecific=True.",
41078
- defaultOff: true,
41079
- aiSpecific: true
41080
- },
41081
- "test/duplicate-setup": {
41082
- recall: 1e-4,
41083
- fpRate: 0,
41084
- ratio: 3.6,
41085
- precision: 0.8235,
41086
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41087
- verdict: "USEFUL",
41088
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=14, FP=3, P=82.4%, FPR=0.00%, lift=3.6. aiSpecific=True.",
41089
- aiSpecific: true
41090
- },
41091
- "logic/ghost-defensive": {
41092
- recall: 1e-4,
41093
- fpRate: 0,
41094
- ratio: 5.79,
41095
- precision: 0.8824,
41096
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41097
- verdict: "USEFUL",
41098
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=15, FP=2, P=88.2%, FPR=0.00%, lift=5.8. aiSpecific=True.",
41099
- aiSpecific: true
41100
- },
41101
- "typo/calc-raw-px": {
41102
- recall: 0,
41103
- fpRate: 0,
41104
- ratio: 2.32,
41105
- precision: 0.75,
41106
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41107
- verdict: "HYGIENE",
41108
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=3, FP=1, P=75.0%, FPR=0.00%, lift=2.3. aiSpecific=False.",
41109
- aiSpecific: false
42285
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=202658, FP=111193, P=64.6%, FPR=44.11%, lift=1.46. v7 was USEFUL (TP=152391, FP=62358, lift=2.09). v8 was INVERTED (TP=50267, FP=48835).",
42286
+ aiSpecific: false,
42287
+ _v7Verdict: "USEFUL",
42288
+ _v7Lift: 2.09,
42289
+ _v7Recall: 0.6431,
42290
+ _v7FpRate: 0.34,
42291
+ _v7Precision: 0.7096,
42292
+ _v8Verdict: "INVERTED",
42293
+ _v8Lift: 0.71,
42294
+ defaultOff: true
41110
42295
  },
41111
- "security/fail-open-auth": {
41112
- recall: 0,
41113
- fpRate: 0,
41114
- ratio: 99.99,
41115
- precision: 1,
41116
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42296
+ "logic/math-any-density": {
42297
+ recall: 17e-4,
42298
+ fpRate: 13e-4,
42299
+ ratio: 464.59,
42300
+ precision: 0.6027,
42301
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41117
42302
  verdict: "USEFUL",
41118
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=1, FP=0, P=100.0%, FPR=0.00%, lift=inf. aiSpecific=True.",
41119
- aiSpecific: true
42303
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=496, FP=327, P=60.3%, FPR=0.13%, lift=464.59. v7 was USEFUL (TP=376, FP=247, lift=448.16). v8 was USEFUL (TP=120, FP=80).",
42304
+ aiSpecific: true,
42305
+ _v7Verdict: "USEFUL",
42306
+ _v7Lift: 448.16,
42307
+ _v7Recall: 16e-4,
42308
+ _v7FpRate: 13e-4,
42309
+ _v7Precision: 0.6035,
42310
+ _v8Verdict: "USEFUL",
42311
+ _v8Lift: 515
41120
42312
  },
41121
- "wcag/focus-obscured": {
41122
- recall: 33e-4,
41123
- fpRate: 9e-4,
41124
- ratio: 3.51,
41125
- precision: 0.82,
41126
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41127
- verdict: "HYGIENE",
41128
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=797, FP=175, P=82.0%, FPR=0.09%, lift=3.5. aiSpecific=False.",
41129
- aiSpecific: false
41130
- },
41131
- "visual/arbitrary-escape": {
41132
- recall: 25e-4,
41133
- fpRate: 9e-4,
41134
- ratio: 2.74,
41135
- precision: 0.7802,
41136
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42313
+ "logic/math-console-log-storm": {
42314
+ recall: 65e-4,
42315
+ fpRate: 11e-4,
42316
+ ratio: 794.4,
42317
+ precision: 0.8729,
42318
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41137
42319
  verdict: "USEFUL",
41138
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=600, FP=169, P=78.0%, FPR=0.09%, lift=2.7. aiSpecific=True.",
41139
- aiSpecific: true
42320
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=1903, FP=277, P=87.3%, FPR=0.11%, lift=794.40. v7 was USEFUL (TP=1678, FP=193, lift=852.30). v8 was USEFUL (TP=225, FP=84).",
42321
+ aiSpecific: true,
42322
+ _v7Verdict: "USEFUL",
42323
+ _v7Lift: 852.3,
42324
+ _v7Recall: 71e-4,
42325
+ _v7FpRate: 11e-4,
42326
+ _v7Precision: 0.8968,
42327
+ _v8Verdict: "USEFUL",
42328
+ _v8Lift: 595.24
41140
42329
  },
41141
- "security/hardcoded-secret": {
42330
+ "logic/math-gini-class-usage": {
41142
42331
  recall: 13e-4,
41143
- fpRate: 7e-4,
41144
- ratio: 1.72,
41145
- precision: 0.6899,
41146
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41147
- verdict: "OK",
41148
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. OK \u2014 TP=307, FP=138, P=69.0%, FPR=0.07%, lift=1.7. aiSpecific=True.",
41149
- aiSpecific: true
41150
- },
41151
- "visual/radius-scale-violation": {
41152
- recall: 4e-4,
41153
- fpRate: 0,
41154
- ratio: 24.7,
41155
- precision: 0.9697,
41156
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41157
- verdict: "HYGIENE",
41158
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=96, FP=3, P=97.0%, FPR=0.00%, lift=24.7. aiSpecific=False.",
41159
- aiSpecific: false
41160
- },
41161
- "test/fake-placeholder": {
41162
- recall: 53e-4,
41163
- fpRate: 19e-4,
41164
- ratio: 2.82,
41165
- precision: 0.7854,
41166
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42332
+ fpRate: 2e-4,
42333
+ ratio: 4648.6,
42334
+ precision: 0.8852,
42335
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41167
42336
  verdict: "USEFUL",
41168
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=1259, FP=344, P=78.5%, FPR=0.19%, lift=2.8. aiSpecific=True.",
41169
- aiSpecific: true
41170
- },
41171
- "security/exposed-env-var": {
41172
- recall: 6e-4,
41173
- fpRate: 7e-4,
41174
- ratio: 0.9,
41175
- precision: 0.5387,
41176
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41177
- verdict: "HYGIENE",
41178
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=146, FP=125, P=53.9%, FPR=0.07%, lift=0.9. aiSpecific=False.",
41179
- aiSpecific: false
41180
- },
41181
- "perf/cls-image": {
41182
- recall: 2e-4,
41183
- fpRate: 3e-4,
41184
- ratio: 0.8,
41185
- precision: 0.5104,
41186
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41187
- verdict: "HYGIENE",
41188
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=49, FP=47, P=51.0%, FPR=0.03%, lift=0.8. aiSpecific=False.",
41189
- aiSpecific: false
41190
- },
41191
- "layout/gap-monopoly": {
41192
- recall: 4e-4,
41193
- fpRate: 1e-4,
41194
- ratio: 2.95,
41195
- precision: 0.7928,
41196
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41197
- verdict: "HYGIENE",
41198
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=88, FP=23, P=79.3%, FPR=0.01%, lift=3.0. aiSpecific=False.",
41199
- aiSpecific: false
42337
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=370, FP=48, P=88.5%, FPR=0.02%, lift=4648.60. v7 was USEFUL (TP=310, FP=47, lift=3388.64). v8 was USEFUL (TP=60, FP=1).",
42338
+ aiSpecific: true,
42339
+ _v7Verdict: "USEFUL",
42340
+ _v7Lift: 3388.64,
42341
+ _v7Recall: 13e-4,
42342
+ _v7FpRate: 3e-4,
42343
+ _v7Precision: 0.8683,
42344
+ _v8Verdict: "USEFUL",
42345
+ _v8Lift: 67541.31
41200
42346
  },
41201
- "visual/spacing-scale-violation": {
41202
- recall: 83e-4,
41203
- fpRate: 39e-4,
41204
- ratio: 2.13,
41205
- precision: 0.7342,
41206
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41207
- verdict: "HYGIENE",
41208
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=1981, FP=717, P=73.4%, FPR=0.39%, lift=2.1. aiSpecific=False.",
41209
- aiSpecific: false
41210
- },
41211
- "visual/inline-style-dominance": {
41212
- recall: 96e-4,
41213
- fpRate: 66e-4,
41214
- ratio: 1.46,
41215
- precision: 0.6535,
41216
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41217
- verdict: "HYGIENE",
41218
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=2303, FP=1221, P=65.4%, FPR=0.66%, lift=1.5. aiSpecific=False.",
41219
- aiSpecific: false
41220
- },
41221
- "layout/spacing-grid": {
42347
+ "logic/math-variable-name-entropy": {
41222
42348
  recall: 2e-4,
41223
42349
  fpRate: 1e-4,
41224
- ratio: 2.01,
41225
- precision: 0.7222,
41226
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41227
- verdict: "HYGIENE",
41228
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=39, FP=15, P=72.2%, FPR=0.01%, lift=2.0. aiSpecific=False.",
41229
- aiSpecific: false
41230
- },
41231
- "wcag/dragging-movements": {
41232
- recall: 0,
41233
- fpRate: 0,
41234
- ratio: 0.51,
41235
- precision: 0.4,
41236
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41237
- verdict: "HYGIENE",
41238
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=2, FP=3, P=40.0%, FPR=0.00%, lift=0.5. aiSpecific=False.",
41239
- aiSpecific: false
42350
+ ratio: 4548.81,
42351
+ precision: 0.6316,
42352
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42353
+ verdict: "USEFUL",
42354
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=60, FP=35, P=63.2%, FPR=0.01%, lift=4548.81. v7 was USEFUL (TP=36, FP=26, lift=4096.07). v8 was USEFUL (TP=24, FP=9).",
42355
+ aiSpecific: false,
42356
+ _v7Verdict: "USEFUL",
42357
+ _v7Lift: 4096.07,
42358
+ _v7Recall: 2e-4,
42359
+ _v7FpRate: 1e-4,
42360
+ _v7Precision: 0.5806,
42361
+ _v8Verdict: "USEFUL",
42362
+ _v8Lift: 5548.85
41240
42363
  },
41241
- "test/weak-assertion": {
41242
- recall: 0.0414,
41243
- fpRate: 86e-4,
41244
- ratio: 4.83,
41245
- precision: 0.8622,
41246
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42364
+ "logic/optimistic-no-rollback": {
42365
+ recall: 12e-4,
42366
+ fpRate: 2e-4,
42367
+ ratio: 3523.57,
42368
+ precision: 0.8527,
42369
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41247
42370
  verdict: "USEFUL",
41248
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=9906, FP=1583, P=86.2%, FPR=0.86%, lift=4.8. aiSpecific=True.",
41249
- aiSpecific: true
42371
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=353, FP=61, P=85.3%, FPR=0.02%, lift=3523.57. v7 was USEFUL (TP=281, FP=60, lift=2519.02). v8 was USEFUL (TP=72, FP=1).",
42372
+ aiSpecific: true,
42373
+ _v7Verdict: "USEFUL",
42374
+ _v7Lift: 2519.02,
42375
+ _v7Recall: 12e-4,
42376
+ _v7FpRate: 3e-4,
42377
+ _v7Precision: 0.824,
42378
+ _v8Verdict: "USEFUL",
42379
+ _v8Lift: 67726.36
41250
42380
  },
41251
- "logic/bayesian-conditional": {
42381
+ "logic/qwik-hook-leak": {
41252
42382
  recall: 0,
41253
42383
  fpRate: 0,
41254
42384
  ratio: 0,
41255
42385
  precision: 0,
41256
- lastCalibratedAt: "2026-06-27T00:00:00Z",
42386
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41257
42387
  verdict: "DORMANT",
41258
- defaultOff: true,
41259
- _calibrationNote: "v0.12.0 ship \u2014 new Bayesian LR-combiner rule (Bento et al. 2024 *Neurocomputing*). Default-off until v0.12 corpus re-calibration lands. Threshold P(AI|fires) \u2265 0.7; posterior computed from per-rule likelihood ratios.",
41260
- aiSpecific: true
41261
- },
41262
- "logic/heaps-deviation": {
41263
- recall: 0.0122,
41264
- fpRate: 0.0132,
41265
- ratio: 0.93,
41266
- precision: 0.5461,
41267
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41268
- verdict: "HYGIENE",
41269
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=2924, FP=2430, P=54.6%, FPR=1.32%, lift=0.9. aiSpecific=False.",
41270
- aiSpecific: false
42388
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
42389
+ aiSpecific: true,
42390
+ _v7Verdict: "DORMANT",
42391
+ _v7Lift: 0,
42392
+ _v7Recall: 0,
42393
+ _v7FpRate: 0,
42394
+ _v7Precision: 0,
42395
+ _v8Verdict: "DORMANT",
42396
+ _v8Lift: 1,
42397
+ defaultOff: true
41271
42398
  },
41272
- "logic/ks-distribution-shift": {
41273
- recall: 0.6375,
41274
- fpRate: 0.338,
41275
- ratio: 1.89,
41276
- precision: 0.7096,
41277
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41278
- verdict: "HYGIENE",
41279
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=152391, FP=62358, P=71.0%, FPR=33.80%, lift=1.9. aiSpecific=False.",
41280
- aiSpecific: false
42399
+ "logic/reactive-hook-soup": {
42400
+ recall: 41e-4,
42401
+ fpRate: 6e-4,
42402
+ ratio: 1370.15,
42403
+ precision: 0.8805,
42404
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42405
+ verdict: "USEFUL",
42406
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=1194, FP=162, P=88.1%, FPR=0.06%, lift=1370.15. v7 was USEFUL (TP=901, FP=162, lift=959.64). v8 was USEFUL (TP=293, FP=0).",
42407
+ aiSpecific: true,
42408
+ _v7Verdict: "USEFUL",
42409
+ _v7Lift: 959.64,
42410
+ _v7Recall: 38e-4,
42411
+ _v7FpRate: 9e-4,
42412
+ _v7Precision: 0.8476,
42413
+ _v8Verdict: "USEFUL",
42414
+ _v8Lift: 99999
41281
42415
  },
41282
42416
  "logic/zipf-slope-anomaly": {
41283
- recall: 0.0156,
41284
- fpRate: 87e-4,
41285
- ratio: 1.79,
41286
- precision: 0.6983,
41287
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41288
- verdict: "HYGIENE",
41289
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. HYGIENE \u2014 TP=3718, FP=1606, P=69.8%, FPR=0.87%, lift=1.8. aiSpecific=False.",
41290
- aiSpecific: false
42417
+ recall: 0.0168,
42418
+ fpRate: 0.0111,
42419
+ ratio: 57.13,
42420
+ precision: 0.6369,
42421
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42422
+ verdict: "USEFUL",
42423
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=4928, FP=2810, P=63.7%, FPR=1.11%, lift=57.13. v7 was USEFUL (TP=3718, FP=1606, lift=79.75). v8 was USEFUL (TP=1210, FP=1204).",
42424
+ aiSpecific: false,
42425
+ _v7Verdict: "USEFUL",
42426
+ _v7Lift: 79.75,
42427
+ _v7Recall: 0.0157,
42428
+ _v7FpRate: 88e-4,
42429
+ _v7Precision: 0.6983,
42430
+ _v8Verdict: "USEFUL",
42431
+ _v8Lift: 28.59
41291
42432
  },
41292
- "ai/markdown-leakage": {
41293
- recall: 0,
42433
+ "logic/zombie-state": {
42434
+ recall: 1e-4,
41294
42435
  fpRate: 0,
41295
- ratio: 1.93,
41296
- precision: 0.7143,
41297
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41298
- verdict: "OK",
41299
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. OK \u2014 TP=5, FP=2, P=71.4%, FPR=0.00%, lift=1.9. aiSpecific=True.",
41300
- aiSpecific: true
42436
+ ratio: 119891.71,
42437
+ precision: 0.9512,
42438
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42439
+ verdict: "USEFUL",
42440
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=39, FP=2, P=95.1%, FPR=0.00%, lift=119891.71. v7 was USEFUL (TP=24, FP=2, lift=84652.15). v8 was USEFUL (TP=15, FP=0).",
42441
+ aiSpecific: true,
42442
+ _v7Verdict: "USEFUL",
42443
+ _v7Lift: 84652.15,
42444
+ _v7Recall: 1e-4,
42445
+ _v7FpRate: 0,
42446
+ _v7Precision: 0.9231,
42447
+ _v8Verdict: "USEFUL",
42448
+ _v8Lift: 99999
41301
42449
  },
41302
- "ai/comment-ratio": {
41303
- recall: 0.2523,
41304
- fpRate: 0.1619,
41305
- ratio: 1.56,
41306
- precision: 0.6687,
41307
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41308
- verdict: "OK",
41309
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. OK \u2014 TP=60308, FP=29876, P=66.9%, FPR=16.19%, lift=1.6. aiSpecific=True.",
41310
- aiSpecific: true
42450
+ "perf/cls-image": {
42451
+ recall: 2e-4,
42452
+ fpRate: 2e-4,
42453
+ ratio: 2895.78,
42454
+ precision: 0.5514,
42455
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42456
+ verdict: "USEFUL",
42457
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=59, FP=48, P=55.1%, FPR=0.02%, lift=2895.78. v7 was USEFUL (TP=49, FP=47, lift=1991.85). v8 was USEFUL (TP=10, FP=1).",
42458
+ aiSpecific: false,
42459
+ _v7Verdict: "USEFUL",
42460
+ _v7Lift: 1991.85,
42461
+ _v7Recall: 2e-4,
42462
+ _v7FpRate: 3e-4,
42463
+ _v7Precision: 0.5104,
42464
+ _v8Verdict: "USEFUL",
42465
+ _v8Lift: 62424.55
41311
42466
  },
41312
- "ai/whitespace-regularity": {
41313
- recall: 0.0731,
41314
- fpRate: 0.0728,
41315
- ratio: 1,
41316
- precision: 0.5652,
41317
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41318
- verdict: "NOISY",
41319
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. NOISY \u2014 TP=17466, FP=13438, P=56.5%, FPR=7.28%, lift=1.0. aiSpecific=True.",
41320
- defaultOff: true,
41321
- aiSpecific: true
42467
+ "perf/css-bloat": {
42468
+ recall: 0.0126,
42469
+ fpRate: 24e-4,
42470
+ ratio: 365.63,
42471
+ precision: 0.8616,
42472
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42473
+ verdict: "USEFUL",
42474
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=3697, FP=594, P=86.2%, FPR=0.24%, lift=365.63. v7 was USEFUL (TP=2790, FP=591, lift=256.10). v8 was USEFUL (TP=907, FP=3).",
42475
+ aiSpecific: false,
42476
+ _v7Verdict: "USEFUL",
42477
+ _v7Lift: 256.1,
42478
+ _v7Recall: 0.0118,
42479
+ _v7FpRate: 32e-4,
42480
+ _v7Precision: 0.8252,
42481
+ _v8Verdict: "USEFUL",
42482
+ _v8Lift: 22813.54
41322
42483
  },
41323
- "ai/text-like-ratio": {
42484
+ "perf/halstead-anomaly": {
41324
42485
  recall: 0,
41325
42486
  fpRate: 0,
41326
- ratio: 2.32,
41327
- precision: 0.75,
41328
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42487
+ ratio: 75624,
42488
+ precision: 0.6,
42489
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41329
42490
  verdict: "USEFUL",
41330
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=3, FP=1, P=75.0%, FPR=0.00%, lift=2.3. aiSpecific=True.",
41331
- aiSpecific: true
42491
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=3, FP=2, P=60.0%, FPR=0.00%, lift=75624.00. v7 was USEFUL (TP=3, FP=1, lift=137559.75). v8 was INVERTED (TP=0, FP=1).",
42492
+ aiSpecific: true,
42493
+ _v7Verdict: "USEFUL",
42494
+ _v7Lift: 137559.75,
42495
+ _v7Recall: 0,
42496
+ _v7FpRate: 0,
42497
+ _v7Precision: 0.75,
42498
+ _v8Verdict: "INVERTED",
42499
+ _v8Lift: 0
41332
42500
  },
41333
- "ai/errors-near-eof": {
41334
- recall: 0.0697,
41335
- fpRate: 0.0548,
41336
- ratio: 1.27,
41337
- precision: 0.6225,
41338
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41339
- verdict: "NOISY",
41340
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. NOISY \u2014 TP=16673, FP=10112, P=62.2%, FPR=5.48%, lift=1.3. aiSpecific=True.",
41341
- defaultOff: true,
41342
- aiSpecific: true
42501
+ "product/terminology-drift": {
42502
+ recall: 91e-4,
42503
+ fpRate: 21e-4,
42504
+ ratio: 397.75,
42505
+ precision: 0.8347,
42506
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42507
+ verdict: "USEFUL",
42508
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=2671, FP=529, P=83.5%, FPR=0.21%, lift=397.75. v7 was USEFUL (TP=2028, FP=521, lift=280.09). v8 was USEFUL (TP=643, FP=8).",
42509
+ aiSpecific: false,
42510
+ _v7Verdict: "USEFUL",
42511
+ _v7Lift: 280.09,
42512
+ _v7Recall: 86e-4,
42513
+ _v7FpRate: 28e-4,
42514
+ _v7Precision: 0.7956,
42515
+ _v8Verdict: "USEFUL",
42516
+ _v8Lift: 8477.9
41343
42517
  },
41344
- "ai/any-density": {
41345
- recall: 55e-4,
41346
- fpRate: 41e-4,
41347
- ratio: 1.34,
41348
- precision: 0.634,
41349
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41350
- verdict: "NOISY",
41351
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. NOISY \u2014 TP=1313, FP=758, P=63.4%, FPR=0.41%, lift=1.3. aiSpecific=True.",
41352
- defaultOff: true,
41353
- aiSpecific: true
42518
+ "product/ux-pattern-fragmentation": {
42519
+ recall: 1e-4,
42520
+ fpRate: 0,
42521
+ ratio: 22864.4,
42522
+ precision: 0.8163,
42523
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42524
+ verdict: "USEFUL",
42525
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=40, FP=9, P=81.6%, FPR=0.00%, lift=22864.40. v7 was USEFUL (TP=32, FP=8, lift=18341.30). v8 was USEFUL (TP=8, FP=1).",
42526
+ aiSpecific: true,
42527
+ _v7Verdict: "USEFUL",
42528
+ _v7Lift: 18341.3,
42529
+ _v7Recall: 1e-4,
42530
+ _v7FpRate: 0,
42531
+ _v7Precision: 0.8,
42532
+ _v8Verdict: "USEFUL",
42533
+ _v8Lift: 61037.33
41354
42534
  },
41355
- "ai/renyi-profile": {
41356
- recall: 0,
42535
+ "rust/stringly-typed": {
42536
+ recall: 2e-4,
41357
42537
  fpRate: 0,
41358
- ratio: 0.26,
41359
- precision: 0.25,
41360
- lastCalibratedAt: "2026-06-27T12:00:00Z",
41361
- verdict: "INVERTED",
41362
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. INVERTED \u2014 TP=3, FP=9, P=25.0%, FPR=0.00%, lift=0.3. aiSpecific=True.",
41363
- defaultOff: true,
41364
- aiSpecific: true
42538
+ ratio: 24735.12,
42539
+ precision: 0.8831,
42540
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42541
+ verdict: "USEFUL",
42542
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=68, FP=9, P=88.3%, FPR=0.00%, lift=24735.12. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=68, FP=9).",
42543
+ aiSpecific: true,
42544
+ _v7Verdict: "DORMANT",
42545
+ _v7Lift: 1,
42546
+ _v7Recall: 0,
42547
+ _v7FpRate: 0,
42548
+ _v7Precision: 0,
42549
+ _v8Verdict: "USEFUL",
42550
+ _v8Lift: 6737.89
41365
42551
  },
41366
- "ai/log-rank-histogram": {
42552
+ "rust/todo-macro": {
42553
+ recall: 1e-4,
42554
+ fpRate: 7e-4,
42555
+ ratio: 210.08,
42556
+ precision: 0.1392,
42557
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42558
+ verdict: "OK",
42559
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=27, FP=167, P=13.9%, FPR=0.07%, lift=210.08. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was OK (TP=27, FP=167).",
42560
+ aiSpecific: true,
42561
+ _v7Verdict: "DORMANT",
42562
+ _v7Lift: 1,
42563
+ _v7Recall: 0,
42564
+ _v7FpRate: 0,
42565
+ _v7Precision: 0,
42566
+ _v8Verdict: "OK",
42567
+ _v8Lift: 57.23
42568
+ },
42569
+ "rust/unused-pub-fn": {
41367
42570
  recall: 0,
41368
42571
  fpRate: 0,
41369
- ratio: 0,
41370
- precision: 0,
41371
- lastCalibratedAt: "2026-06-27T00:00:00Z",
42572
+ ratio: 10803.43,
42573
+ precision: 0.3,
42574
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41372
42575
  verdict: "OK",
41373
- _calibrationNote: "v0.13.0 stub: rule implemented per Gehrmann 2019 GLTR; calibration on v7 corpus pending. v0.13.0: marked OK (peer-reviewed math backing; lift=0 because v7 calibration has not been run yet \u2014 will be re-evaluated).",
41374
- aiSpecific: true
42576
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=3, FP=7, P=30.0%, FPR=0.00%, lift=10803.43. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was OK (TP=3, FP=7).",
42577
+ aiSpecific: true,
42578
+ _v7Verdict: "DORMANT",
42579
+ _v7Lift: 1,
42580
+ _v7Recall: 0,
42581
+ _v7FpRate: 0,
42582
+ _v7Precision: 0,
42583
+ _v8Verdict: "OK",
42584
+ _v8Lift: 2942.87
41375
42585
  },
41376
- "ai/segment-surprisal-cv": {
41377
- recall: 0.182,
41378
- fpRate: 0.0812,
41379
- ratio: 2.24,
41380
- precision: 0.7438,
41381
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42586
+ "rust/unwrap-in-production": {
42587
+ recall: 8e-3,
42588
+ fpRate: 77e-4,
42589
+ ratio: 70.81,
42590
+ precision: 0.5475,
42591
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41382
42592
  verdict: "USEFUL",
41383
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=43498, FP=14983, P=74.4%, FPR=8.12%, lift=2.2. aiSpecific=True.",
41384
- aiSpecific: true
42593
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=2358, FP=1949, P=54.7%, FPR=0.77%, lift=70.81. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=2358, FP=1949).",
42594
+ aiSpecific: true,
42595
+ _v7Verdict: "DORMANT",
42596
+ _v7Lift: 1,
42597
+ _v7Recall: 0,
42598
+ _v7FpRate: 0,
42599
+ _v7Precision: 0,
42600
+ _v8Verdict: "USEFUL",
42601
+ _v8Lift: 19.29
41385
42602
  },
41386
- "ai/compression-profile": {
41387
- recall: 0.3139,
41388
- fpRate: 0.1489,
41389
- ratio: 2.11,
41390
- precision: 0.732,
41391
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42603
+ "security/dangerous-cors": {
42604
+ recall: 5e-4,
42605
+ fpRate: 4e-4,
42606
+ ratio: 1721.87,
42607
+ precision: 0.6079,
42608
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41392
42609
  verdict: "USEFUL",
41393
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=75031, FP=27473, P=73.2%, FPR=14.89%, lift=2.1. aiSpecific=True.",
41394
- aiSpecific: true
42610
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=138, FP=89, P=60.8%, FPR=0.04%, lift=1721.87. v7 was USEFUL (TP=114, FP=84, lift=1257.16). v8 was USEFUL (TP=24, FP=5).",
42611
+ aiSpecific: true,
42612
+ _v7Verdict: "USEFUL",
42613
+ _v7Lift: 1257.16,
42614
+ _v7Recall: 5e-4,
42615
+ _v7FpRate: 5e-4,
42616
+ _v7Precision: 0.5758,
42617
+ _v8Verdict: "USEFUL",
42618
+ _v8Lift: 11365.57
41395
42619
  },
41396
- "ai/tailwind-color-overuse": {
41397
- recall: 0.0216,
41398
- fpRate: 52e-4,
41399
- ratio: 4.16,
41400
- precision: 0.8436,
41401
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42620
+ "security/eval": {
42621
+ recall: 1e-4,
42622
+ fpRate: 2e-4,
42623
+ ratio: 1929.18,
42624
+ precision: 0.4286,
42625
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42626
+ verdict: "OK",
42627
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=42, FP=56, P=42.9%, FPR=0.02%, lift=1929.18. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was OK (TP=42, FP=56).",
42628
+ aiSpecific: false,
42629
+ _v7Verdict: "DORMANT",
42630
+ _v7Lift: 1,
42631
+ _v7Recall: 0,
42632
+ _v7FpRate: 0,
42633
+ _v7Precision: 0,
42634
+ _v8Verdict: "OK",
42635
+ _v8Lift: 525.51
42636
+ },
42637
+ "security/exposed-env-var": {
42638
+ recall: 6e-4,
42639
+ fpRate: 5e-4,
42640
+ ratio: 1055.81,
42641
+ precision: 0.5696,
42642
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41402
42643
  verdict: "USEFUL",
41403
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=5169, FP=958, P=84.4%, FPR=0.52%, lift=4.2. aiSpecific=True.",
41404
- aiSpecific: true
42644
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=180, FP=136, P=57.0%, FPR=0.05%, lift=1055.81. v7 was USEFUL (TP=146, FP=125, lift=790.50). v8 was USEFUL (TP=34, FP=11).",
42645
+ aiSpecific: false,
42646
+ _v7Verdict: "USEFUL",
42647
+ _v7Lift: 790.5,
42648
+ _v7Recall: 6e-4,
42649
+ _v7FpRate: 7e-4,
42650
+ _v7Precision: 0.5387,
42651
+ _v8Verdict: "USEFUL",
42652
+ _v8Lift: 4716.52
41405
42653
  },
41406
- "ai/default-react-stack": {
41407
- recall: 1e-3,
42654
+ "security/fail-open-auth": {
42655
+ recall: 0,
41408
42656
  fpRate: 0,
41409
- ratio: 99.99,
41410
- precision: 0.9957,
41411
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42657
+ ratio: 99999,
42658
+ precision: 1,
42659
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41412
42660
  verdict: "USEFUL",
41413
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=231, FP=1, P=99.6%, FPR=0.00%, lift=178.3. aiSpecific=True.",
41414
- aiSpecific: true
42661
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=1, FP=0, P=100.0%, FPR=0.00%, lift=inf. v7 was USEFUL (TP=1, FP=0, lift=inf). v8 was DORMANT (TP=0, FP=0).",
42662
+ aiSpecific: true,
42663
+ _v7Verdict: "USEFUL",
42664
+ _v7Lift: 99999,
42665
+ _v7Recall: 0,
42666
+ _v7FpRate: 0,
42667
+ _v7Precision: 1,
42668
+ _v8Verdict: "DORMANT",
42669
+ _v8Lift: 1
41415
42670
  },
41416
- "ai/library-reinvention": {
41417
- recall: 3e-4,
42671
+ "security/hardcoded-secret": {
42672
+ recall: 14e-4,
42673
+ fpRate: 6e-4,
42674
+ ratio: 1269.08,
42675
+ precision: 0.735,
42676
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42677
+ verdict: "USEFUL",
42678
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=405, FP=146, P=73.5%, FPR=0.06%, lift=1269.08. v7 was USEFUL (TP=307, FP=138, lift=916.92). v8 was USEFUL (TP=98, FP=8).",
42679
+ aiSpecific: true,
42680
+ _v7Verdict: "USEFUL",
42681
+ _v7Lift: 916.92,
42682
+ _v7Recall: 13e-4,
42683
+ _v7FpRate: 8e-4,
42684
+ _v7Precision: 0.6899,
42685
+ _v8Verdict: "USEFUL",
42686
+ _v8Lift: 7935.57
42687
+ },
42688
+ "security/localstorage-token": {
42689
+ recall: 1e-4,
41418
42690
  fpRate: 0,
41419
- ratio: 9.88,
41420
- precision: 0.9275,
41421
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42691
+ ratio: 99999,
42692
+ precision: 1,
42693
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41422
42694
  verdict: "USEFUL",
41423
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=64, FP=5, P=92.8%, FPR=0.00%, lift=9.9. aiSpecific=True.",
41424
- aiSpecific: true
42695
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=17, FP=0, P=100.0%, FPR=0.00%, lift=inf. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=17, FP=0).",
42696
+ aiSpecific: false,
42697
+ _v7Verdict: "DORMANT",
42698
+ _v7Lift: 1,
42699
+ _v7Recall: 0,
42700
+ _v7FpRate: 0,
42701
+ _v7Precision: 0,
42702
+ _v8Verdict: "USEFUL",
42703
+ _v8Lift: 99999
41425
42704
  },
41426
- "ai/state-default-overuse": {
41427
- recall: 29e-4,
41428
- fpRate: 9e-4,
41429
- ratio: 3.42,
41430
- precision: 0.8161,
41431
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42705
+ "security/missing-auth-check": {
42706
+ recall: 5e-4,
42707
+ fpRate: 0,
42708
+ ratio: 99999,
42709
+ precision: 1,
42710
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41432
42711
  verdict: "USEFUL",
41433
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=701, FP=158, P=81.6%, FPR=0.09%, lift=3.4. aiSpecific=True.",
41434
- aiSpecific: true
42712
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=157, FP=0, P=100.0%, FPR=0.00%, lift=inf. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=157, FP=0).",
42713
+ aiSpecific: false,
42714
+ _v7Verdict: "DORMANT",
42715
+ _v7Lift: 1,
42716
+ _v7Recall: 0,
42717
+ _v7FpRate: 0,
42718
+ _v7Precision: 0,
42719
+ _v8Verdict: "USEFUL",
42720
+ _v8Lift: 99999
41435
42721
  },
41436
- "ai/fetch-default-overuse": {
41437
- recall: 28e-4,
41438
- fpRate: 4e-4,
41439
- ratio: 6.76,
41440
- precision: 0.8976,
41441
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42722
+ "security/public-admin-route": {
42723
+ recall: 38e-4,
42724
+ fpRate: 38e-4,
42725
+ ratio: 142.2,
42726
+ precision: 0.5376,
42727
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41442
42728
  verdict: "USEFUL",
41443
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=666, FP=76, P=89.8%, FPR=0.04%, lift=6.8. aiSpecific=True.",
41444
- aiSpecific: true
42729
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=1108, FP=953, P=53.8%, FPR=0.38%, lift=142.20. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=1108, FP=953).",
42730
+ aiSpecific: false,
42731
+ _v7Verdict: "DORMANT",
42732
+ _v7Lift: 1,
42733
+ _v7Recall: 0,
42734
+ _v7FpRate: 0,
42735
+ _v7Precision: 0,
42736
+ _v8Verdict: "USEFUL",
42737
+ _v8Lift: 38.74
41445
42738
  },
41446
- "ai/console-debug-storm": {
41447
- recall: 8e-3,
41448
- fpRate: 9e-4,
41449
- ratio: 8.43,
41450
- precision: 0.9161,
41451
- lastCalibratedAt: "2026-06-27T12:00:00Z",
42739
+ "security/sql-construction": {
42740
+ recall: 32e-4,
42741
+ fpRate: 15e-4,
42742
+ ratio: 485.42,
42743
+ precision: 0.7183,
42744
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41452
42745
  verdict: "USEFUL",
41453
- _calibrationNote: "v7 corpus re-calibration (2026-06-27, min-date=2025-01-01): 184488 neg + 239054 pos. USEFUL \u2014 TP=1912, FP=175, P=91.6%, FPR=0.09%, lift=8.4. aiSpecific=True.",
41454
- aiSpecific: true
42746
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=951, FP=373, P=71.8%, FPR=0.15%, lift=485.42. v7 was USEFUL (TP=710, FP=336, lift=370.52). v8 was USEFUL (TP=241, FP=37).",
42747
+ aiSpecific: true,
42748
+ _v7Verdict: "USEFUL",
42749
+ _v7Lift: 370.52,
42750
+ _v7Recall: 3e-3,
42751
+ _v7FpRate: 18e-4,
42752
+ _v7Precision: 0.6788,
42753
+ _v8Verdict: "USEFUL",
42754
+ _v8Lift: 1608.86
41455
42755
  },
41456
- "db/missing-fk-index": {
41457
- recall: 0,
42756
+ "security/target-blank-no-noopener": {
42757
+ recall: 4e-4,
41458
42758
  fpRate: 0,
41459
- ratio: 0,
41460
- precision: 0,
41461
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41462
- verdict: "DORMANT",
41463
- defaultOff: true,
41464
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: PostgreSQL Global Development Group (2024), *PostgreSQL 16 Documentation \xA75.4 (Constraints)*, https://www.postgresql.org/docs/16/ddl-constraints.html; Squawk (2023), *Postgres linter rules*, https://github.com/sqllabs/squawk, rule `require-index-for-fk`. (Foreign key columns need a matching index \u2014 sequential scan on parent delete is a canonical Postgres anti-pattern.)",
41465
- aiSpecific: false
42759
+ ratio: 26141.63,
42760
+ precision: 0.9333,
42761
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42762
+ verdict: "USEFUL",
42763
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=126, FP=9, P=93.3%, FPR=0.00%, lift=26141.63. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=126, FP=9).",
42764
+ aiSpecific: false,
42765
+ _v7Verdict: "DORMANT",
42766
+ _v7Lift: 1,
42767
+ _v7Recall: 0,
42768
+ _v7FpRate: 0,
42769
+ _v7Precision: 0,
42770
+ _v8Verdict: "USEFUL",
42771
+ _v8Lift: 7121.02
41466
42772
  },
41467
- "db/duplicate-index": {
41468
- recall: 0,
41469
- fpRate: 0,
41470
- ratio: 0,
41471
- precision: 0,
41472
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41473
- verdict: "DORMANT",
41474
- defaultOff: true,
41475
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: PostgreSQL Global Development Group (2024), *PostgreSQL 16 Documentation \xA711.2 (Index Types)*; Heroku Postgres Team (2018), *Efficient Use of PostgreSQL Indexes*. (Duplicate indexes silently double write cost without read benefit \u2014 Postgres does not warn.)",
41476
- aiSpecific: false
42773
+ "security/unsafe-html-render": {
42774
+ recall: 13e-4,
42775
+ fpRate: 11e-4,
42776
+ ratio: 513.12,
42777
+ precision: 0.574,
42778
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42779
+ verdict: "USEFUL",
42780
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=380, FP=282, P=57.4%, FPR=0.11%, lift=513.12. v7 was USEFUL (TP=312, FP=160, lift=757.74). v8 was OK (TP=68, FP=122).",
42781
+ aiSpecific: false,
42782
+ _v7Verdict: "USEFUL",
42783
+ _v7Lift: 757.74,
42784
+ _v7Recall: 13e-4,
42785
+ _v7FpRate: 9e-4,
42786
+ _v7Precision: 0.661,
42787
+ _v8Verdict: "OK",
42788
+ _v8Lift: 201.44
41477
42789
  },
41478
- "db/missing-not-null": {
41479
- recall: 0,
42790
+ "test/duplicate-setup": {
42791
+ recall: 1e-4,
41480
42792
  fpRate: 0,
41481
- ratio: 0,
41482
- precision: 0,
41483
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41484
- verdict: "DORMANT",
41485
- defaultOff: true,
41486
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: PostgreSQL Global Development Group (2024), *PostgreSQL 16 Documentation \xA75.4.1 (Check Constraints)*; Kleppmann, M. (2017), *Designing Data-Intensive Applications*, O'Reilly, ch.4 (NULL semantics in RDBMS). (Required-identifier columns without NOT NULL produce silent NULL inserts \u2014 canonical AI SQL smell.)",
41487
- aiSpecific: false
42793
+ ratio: 51016.19,
42794
+ precision: 0.8095,
42795
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42796
+ verdict: "USEFUL",
42797
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=17, FP=4, P=81.0%, FPR=0.00%, lift=51016.19. v7 was USEFUL (TP=14, FP=3, lift=50348.67). v8 was USEFUL (TP=3, FP=1).",
42798
+ aiSpecific: true,
42799
+ _v7Verdict: "USEFUL",
42800
+ _v7Lift: 50348.67,
42801
+ _v7Recall: 1e-4,
42802
+ _v7FpRate: 0,
42803
+ _v7Precision: 0.8235,
42804
+ _v8Verdict: "USEFUL",
42805
+ _v8Lift: 51500.25
41488
42806
  },
41489
- "db/enum-sprawl": {
41490
- recall: 0,
41491
- fpRate: 0,
41492
- ratio: 0,
41493
- precision: 0,
41494
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41495
- verdict: "DORMANT",
41496
- defaultOff: true,
41497
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: PostgreSQL Global Development Group (2024), *PostgreSQL 16 Documentation \xA78.7 (Enumerated Types)*; Borkowski, A. (2022), *PostgreSQL enum types: when to use them and when not to*, pgconfig.org. (Enums with >12 values are brittle to extend and hard to localize \u2014 lookup table is the standard replacement.)",
41498
- aiSpecific: false
42807
+ "test/fake-placeholder": {
42808
+ recall: 51e-4,
42809
+ fpRate: 15e-4,
42810
+ ratio: 547.47,
42811
+ precision: 0.8014,
42812
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42813
+ verdict: "USEFUL",
42814
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=1489, FP=369, P=80.1%, FPR=0.15%, lift=547.47. v7 was USEFUL (TP=1259, FP=344, lift=418.76). v8 was USEFUL (TP=230, FP=25).",
42815
+ aiSpecific: true,
42816
+ _v7Verdict: "USEFUL",
42817
+ _v7Lift: 418.76,
42818
+ _v7Recall: 53e-4,
42819
+ _v7FpRate: 19e-4,
42820
+ _v7Precision: 0.7854,
42821
+ _v8Verdict: "USEFUL",
42822
+ _v8Lift: 2477.4
41499
42823
  },
41500
- "db/naming-inconsistency": {
42824
+ "test/missing-edge-case": {
41501
42825
  recall: 0,
41502
42826
  fpRate: 0,
41503
42827
  ratio: 0,
41504
42828
  precision: 0,
41505
- lastCalibratedAt: "2026-06-30T00:00:00Z",
42829
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41506
42830
  verdict: "DORMANT",
41507
- defaultOff: true,
41508
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: PostgreSQL Global Development Group (2024), *PostgreSQL 16 Documentation \xA74.1.1 (Identifiers and Key Words)*; pgsql-hackers (2018), *Re: snake_case vs camelCase in Postgres identifiers*. (snake_case is the Postgres convention; mixing styles in the same schema breaks ORM generators.)",
41509
- aiSpecific: false
42831
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
42832
+ aiSpecific: true,
42833
+ _v7Verdict: "DORMANT",
42834
+ _v7Lift: 0,
42835
+ _v7Recall: 0,
42836
+ _v7FpRate: 0,
42837
+ _v7Precision: 0,
42838
+ _v8Verdict: "DORMANT",
42839
+ _v8Lift: 1,
42840
+ defaultOff: true
41510
42841
  },
41511
- "db/sql-concat": {
41512
- recall: 0,
41513
- fpRate: 0,
41514
- ratio: 0,
41515
- precision: 0,
41516
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41517
- verdict: "DORMANT",
41518
- defaultOff: true,
41519
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: OWASP Foundation (2021), *OWASP Top 10 \u2014 A03:2021 Injection*, https://owasp.org/Top10/A03_2021-Injection/; OWASP Foundation (2017), *SQL Injection Prevention Cheat Sheet*. (Template-literal SQL with ${...} interpolation is the #1 SQL injection vector in AI-generated TypeScript code.)",
41520
- aiSpecific: true
42842
+ "test/weak-assertion": {
42843
+ recall: 0.0417,
42844
+ fpRate: 67e-4,
42845
+ ratio: 131.62,
42846
+ precision: 0.8793,
42847
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42848
+ verdict: "USEFUL",
42849
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=12263, FP=1684, P=87.9%, FPR=0.67%, lift=131.62. v7 was USEFUL (TP=9906, FP=1583, lift=99.90). v8 was USEFUL (TP=2357, FP=101).",
42850
+ aiSpecific: true,
42851
+ _v7Verdict: "USEFUL",
42852
+ _v7Lift: 99.9,
42853
+ _v7Recall: 0.0418,
42854
+ _v7FpRate: 86e-4,
42855
+ _v7Precision: 0.8622,
42856
+ _v8Verdict: "USEFUL",
42857
+ _v8Lift: 651.94
41521
42858
  },
41522
- "dead/unused-import": {
42859
+ "typo/calc-fontsize": {
41523
42860
  recall: 0,
41524
42861
  fpRate: 0,
41525
42862
  ratio: 0,
41526
42863
  precision: 0,
41527
- lastCalibratedAt: "2026-06-30T00:00:00Z",
42864
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41528
42865
  verdict: "DORMANT",
41529
- defaultOff: true,
41530
- _calibrationNote: "v0.18.5 ship \u2014 not in v7 per-rule table. Default-off until v8 calibration data lands. The first of 5 planned `dead/*` rules (this one + dead/unused-local + dead/unused-parameter + dead/dead-branch + dead/unreachable). The pattern is the canonical AI-iteration rot: the model adds an import when introducing a feature, then rewrites the function later without cleaning up. Most real-world tsconfig.json files have `noUnusedLocals: false`, so tsc never fires.",
41531
- aiSpecific: true
42866
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
42867
+ aiSpecific: false,
42868
+ _v7Verdict: "DORMANT",
42869
+ _v7Lift: 0,
42870
+ _v7Recall: 0,
42871
+ _v7FpRate: 0,
42872
+ _v7Precision: 0,
42873
+ _v8Verdict: "DORMANT",
42874
+ _v8Lift: 1,
42875
+ defaultOff: true
41532
42876
  },
41533
- "dead/unused-local": {
42877
+ "typo/calc-raw-px": {
41534
42878
  recall: 0,
41535
42879
  fpRate: 0,
41536
- ratio: 0,
41537
- precision: 0,
41538
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41539
- verdict: "DORMANT",
41540
- defaultOff: true,
41541
- _calibrationNote: "v0.18.5b ship \u2014 not in v7 per-rule table. Default-off until v8 calibration data lands. The second of 5 planned `dead/*` rules. Muchnick 1997 Ch. 13 'liveness analysis' (textbook compiler optimization).",
41542
- aiSpecific: true
42880
+ ratio: 210066.67,
42881
+ precision: 0.8333,
42882
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42883
+ verdict: "USEFUL",
42884
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=5, FP=1, P=83.3%, FPR=0.00%, lift=210066.67. v7 was USEFUL (TP=3, FP=1, lift=137559.75). v8 was USEFUL (TP=2, FP=0).",
42885
+ aiSpecific: false,
42886
+ _v7Verdict: "USEFUL",
42887
+ _v7Lift: 137559.75,
42888
+ _v7Recall: 0,
42889
+ _v7FpRate: 0,
42890
+ _v7Precision: 0.75,
42891
+ _v8Verdict: "USEFUL",
42892
+ _v8Lift: 99999
41543
42893
  },
41544
- "dead/unused-parameter": {
42894
+ "typo/clamp-offscale": {
41545
42895
  recall: 0,
41546
42896
  fpRate: 0,
41547
42897
  ratio: 0,
41548
42898
  precision: 0,
41549
- lastCalibratedAt: "2026-06-30T00:00:00Z",
42899
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41550
42900
  verdict: "DORMANT",
41551
- defaultOff: true,
41552
- _calibrationNote: "v0.18.5b ship \u2014 not in v7 per-rule table. Default-off until v8 calibration data lands. The third of 5 planned `dead/*` rules. AI agents add parameters when introducing features, then rewrite the function without removing parameters the new code does not need.",
41553
- aiSpecific: true
42901
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
42902
+ aiSpecific: false,
42903
+ _v7Verdict: "DORMANT",
42904
+ _v7Lift: 0,
42905
+ _v7Recall: 0,
42906
+ _v7FpRate: 0,
42907
+ _v7Precision: 0,
42908
+ _v8Verdict: "DORMANT",
42909
+ _v8Lift: 1,
42910
+ defaultOff: true
41554
42911
  },
41555
- "dead/dead-branch": {
41556
- recall: 0,
41557
- fpRate: 0,
41558
- ratio: 0,
41559
- precision: 0,
41560
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41561
- verdict: "DORMANT",
41562
- defaultOff: true,
41563
- _calibrationNote: "v0.18.5b ship \u2014 not in v7 per-rule table. Default-off until v8 calibration data lands. The fourth of 5 planned `dead/*` rules. AI-iteration signature: feature flag toggled to a constant, or wrapper from a previous refactor.",
41564
- aiSpecific: true
42912
+ "typo/math-button-label-uniformity": {
42913
+ recall: 1e-4,
42914
+ fpRate: 1e-4,
42915
+ ratio: 6894.19,
42916
+ precision: 0.629,
42917
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42918
+ verdict: "USEFUL",
42919
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=39, FP=23, P=62.9%, FPR=0.01%, lift=6894.19. v7 was USEFUL (TP=37, FP=21, lift=5571.66). v8 was USEFUL (TP=2, FP=2).",
42920
+ aiSpecific: false,
42921
+ _v7Verdict: "USEFUL",
42922
+ _v7Lift: 5571.66,
42923
+ _v7Recall: 2e-4,
42924
+ _v7FpRate: 1e-4,
42925
+ _v7Precision: 0.6379,
42926
+ _v8Verdict: "USEFUL",
42927
+ _v8Lift: 17166.75
41565
42928
  },
41566
- "dead/unreachable": {
42929
+ "typo/math-cta-vocabulary": {
41567
42930
  recall: 0,
41568
42931
  fpRate: 0,
41569
42932
  ratio: 0,
41570
42933
  precision: 0,
41571
- lastCalibratedAt: "2026-06-30T00:00:00Z",
42934
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41572
42935
  verdict: "DORMANT",
41573
- defaultOff: true,
41574
- _calibrationNote: "v0.18.5b ship \u2014 not in v7 per-rule table. Default-off until v8 calibration data lands. The fifth of 5 planned `dead/*` rules. AI-iteration signature: model added an early return for a new error path, then forgot the rest of the function body was still sitting below it.",
41575
- aiSpecific: true
42936
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
42937
+ aiSpecific: true,
42938
+ _v7Verdict: "DORMANT",
42939
+ _v7Lift: 0,
42940
+ _v7Recall: 0,
42941
+ _v7FpRate: 0,
42942
+ _v7Precision: 0,
42943
+ _v8Verdict: "DORMANT",
42944
+ _v8Lift: 1,
42945
+ defaultOff: true
41576
42946
  },
41577
- "docs/stale-package-reference": {
41578
- recall: 0,
42947
+ "typo/placeholder-text": {
42948
+ recall: 1e-4,
41579
42949
  fpRate: 0,
41580
- ratio: 0,
41581
- precision: 0,
41582
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41583
- verdict: "DORMANT",
41584
- defaultOff: true,
41585
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: Meng, M. et al. (2020), *The Cost of Fixing Code Documentation: An Empirical Study on Open-Source Software*, ICSE 2020; Aghajani, E. et al. (2019), *Software documentation: a practitioners' perspective*, ICSE 2019. (Doc references to undeclared packages are copy-paste rot from previous projects \u2014 high-signal doc drift.)",
41586
- aiSpecific: false
42950
+ ratio: 17330.5,
42951
+ precision: 0.6875,
42952
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42953
+ verdict: "USEFUL",
42954
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=22, FP=10, P=68.8%, FPR=0.00%, lift=17330.50. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=22, FP=10).",
42955
+ aiSpecific: false,
42956
+ _v7Verdict: "DORMANT",
42957
+ _v7Lift: 1,
42958
+ _v7Recall: 0,
42959
+ _v7FpRate: 0,
42960
+ _v7Precision: 0,
42961
+ _v8Verdict: "USEFUL",
42962
+ _v8Lift: 4720.86
41587
42963
  },
41588
- "docs/stale-function-reference": {
42964
+ "visual/arbitrary-escape": {
42965
+ recall: 26e-4,
42966
+ fpRate: 7e-4,
42967
+ ratio: 1219.67,
42968
+ precision: 0.8177,
42969
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
42970
+ verdict: "USEFUL",
42971
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=758, FP=169, P=81.8%, FPR=0.07%, lift=1219.67. v7 was USEFUL (TP=600, FP=169, lift=846.78). v8 was USEFUL (TP=158, FP=0).",
42972
+ aiSpecific: true,
42973
+ _v7Verdict: "USEFUL",
42974
+ _v7Lift: 846.78,
42975
+ _v7Recall: 25e-4,
42976
+ _v7FpRate: 9e-4,
42977
+ _v7Precision: 0.7802,
42978
+ _v8Verdict: "USEFUL",
42979
+ _v8Lift: 99999
42980
+ },
42981
+ "visual/clamp-soup": {
41589
42982
  recall: 0,
41590
42983
  fpRate: 0,
41591
42984
  ratio: 0,
41592
42985
  precision: 0,
41593
- lastCalibratedAt: "2026-06-30T00:00:00Z",
42986
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41594
42987
  verdict: "DORMANT",
41595
- defaultOff: true,
41596
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: Meng, M. et al. (2020), *The Cost of Fixing Code Documentation*; Chen, Z. et al. (2022), *An Empirical Study on Code Documentation Adequacy*, MSR 2022. (Doc callouts to non-existent exports \u2014 readers copy-paste and hit a runtime error.)",
41597
- aiSpecific: false
42988
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
42989
+ aiSpecific: true,
42990
+ _v7Verdict: "DORMANT",
42991
+ _v7Lift: 0,
42992
+ _v7Recall: 0,
42993
+ _v7FpRate: 0,
42994
+ _v7Precision: 0,
42995
+ _v8Verdict: "DORMANT",
42996
+ _v8Lift: 1,
42997
+ defaultOff: true
41598
42998
  },
41599
- "docs/expired-code-example": {
42999
+ "visual/generic-centering": {
41600
43000
  recall: 0,
41601
43001
  fpRate: 0,
41602
43002
  ratio: 0,
41603
43003
  precision: 0,
41604
- lastCalibratedAt: "2026-06-30T00:00:00Z",
43004
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41605
43005
  verdict: "DORMANT",
41606
- defaultOff: true,
41607
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: Parnas, D.L. (2010), *Precise Documentation: The Key to Better Software*, Springer (canonical doc-correctness argument); Chen, Z. et al. (2022). (Fenced code examples with broken imports erode trust in the entire docs site.)",
41608
- aiSpecific: false
43006
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
43007
+ aiSpecific: true,
43008
+ _v7Verdict: "DORMANT",
43009
+ _v7Lift: 0,
43010
+ _v7Recall: 0,
43011
+ _v7FpRate: 0,
43012
+ _v7Precision: 0,
43013
+ _v8Verdict: "DORMANT",
43014
+ _v8Lift: 1,
43015
+ defaultOff: true
41609
43016
  },
41610
- "docs/broken-link": {
41611
- recall: 0,
43017
+ "visual/inline-style-dominance": {
43018
+ recall: 0.0103,
43019
+ fpRate: 52e-4,
43020
+ ratio: 134.59,
43021
+ precision: 0.6983,
43022
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43023
+ verdict: "USEFUL",
43024
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=3028, FP=1308, P=69.8%, FPR=0.52%, lift=134.59. v7 was USEFUL (TP=2303, FP=1221, lift=98.17). v8 was USEFUL (TP=725, FP=87).",
43025
+ aiSpecific: false,
43026
+ _v7Verdict: "USEFUL",
43027
+ _v7Lift: 98.17,
43028
+ _v7Recall: 97e-4,
43029
+ _v7FpRate: 67e-4,
43030
+ _v7Precision: 0.6535,
43031
+ _v8Verdict: "USEFUL",
43032
+ _v8Lift: 704.71
43033
+ },
43034
+ "visual/math-color-cluster": {
43035
+ recall: 2e-4,
41612
43036
  fpRate: 0,
41613
- ratio: 0,
41614
- precision: 0,
41615
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41616
- verdict: "DORMANT",
41617
- defaultOff: true,
41618
- _calibrationNote: "v0.17.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: Nielsen, J. (2000), *Designing Web Usability*, New Riders (broken links as a top-5 trust erosion signal); Google Search Central (2024), *Crawl errors documentation*, https://developers.google.com/search/docs/crawling-indexing. (Broken internal links cost SEO crawl budget and reader trust.)",
41619
- aiSpecific: false
43037
+ ratio: 46814.86,
43038
+ precision: 0.9286,
43039
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43040
+ verdict: "USEFUL",
43041
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=65, FP=5, P=92.9%, FPR=0.00%, lift=46814.86. v7 was USEFUL (TP=58, FP=5, lift=33771.28). v8 was USEFUL (TP=7, FP=0).",
43042
+ aiSpecific: true,
43043
+ _v7Verdict: "USEFUL",
43044
+ _v7Lift: 33771.28,
43045
+ _v7Recall: 2e-4,
43046
+ _v7FpRate: 0,
43047
+ _v7Precision: 0.9206,
43048
+ _v8Verdict: "USEFUL",
43049
+ _v8Lift: 99999
41620
43050
  },
41621
- "security/eval": {
43051
+ "visual/math-default-font": {
43052
+ recall: 16e-4,
43053
+ fpRate: 3e-4,
43054
+ ratio: 3035.16,
43055
+ precision: 0.8669,
43056
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43057
+ verdict: "USEFUL",
43058
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=469, FP=72, P=86.7%, FPR=0.03%, lift=3035.16. v7 was USEFUL (TP=313, FP=71, lift=2105.64). v8 was USEFUL (TP=156, FP=1).",
43059
+ aiSpecific: true,
43060
+ _v7Verdict: "USEFUL",
43061
+ _v7Lift: 2105.64,
43062
+ _v7Recall: 13e-4,
43063
+ _v7FpRate: 4e-4,
43064
+ _v7Precision: 0.8151,
43065
+ _v8Verdict: "USEFUL",
43066
+ _v8Lift: 68229.63
43067
+ },
43068
+ "visual/math-font-entropy": {
43069
+ recall: 52e-4,
43070
+ fpRate: 1e-3,
43071
+ ratio: 869.95,
43072
+ precision: 0.8593,
43073
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43074
+ verdict: "USEFUL",
43075
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=1521, FP=249, P=85.9%, FPR=0.10%, lift=869.95. v7 was USEFUL (TP=1067, FP=248, lift=600.09). v8 was USEFUL (TP=454, FP=1).",
43076
+ aiSpecific: true,
43077
+ _v7Verdict: "USEFUL",
43078
+ _v7Lift: 600.09,
43079
+ _v7Recall: 45e-4,
43080
+ _v7FpRate: 14e-4,
43081
+ _v7Precision: 0.8114,
43082
+ _v8Verdict: "USEFUL",
43083
+ _v8Lift: 68516.08
43084
+ },
43085
+ "visual/math-gradient-hue-rotation": {
41622
43086
  recall: 0,
41623
43087
  fpRate: 0,
41624
43088
  ratio: 0,
41625
43089
  precision: 0,
41626
- lastCalibratedAt: "2026-06-30T00:00:00Z",
43090
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41627
43091
  verdict: "DORMANT",
41628
- defaultOff: true,
41629
- _calibrationNote: "v0.16.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: OWASP Foundation (2021), *OWASP Top 10 \u2014 A03:2021 Injection*; Mozilla Developer Network (2024), *eval() \u2014 MDN Web Docs*, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval (Security Considerations). (eval() and new Function() are RCE vectors if the input is ever attacker-controlled.)",
41630
- aiSpecific: false
43092
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
43093
+ aiSpecific: true,
43094
+ _v7Verdict: "DORMANT",
43095
+ _v7Lift: 0,
43096
+ _v7Recall: 0,
43097
+ _v7FpRate: 0,
43098
+ _v7Precision: 0,
43099
+ _v8Verdict: "DORMANT",
43100
+ _v8Lift: 1,
43101
+ defaultOff: true
41631
43102
  },
41632
- "security/localstorage-token": {
41633
- recall: 0,
43103
+ "visual/math-rounded-entropy": {
43104
+ recall: 38e-4,
43105
+ fpRate: 2e-4,
43106
+ ratio: 3785.45,
43107
+ precision: 0.9461,
43108
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43109
+ verdict: "USEFUL",
43110
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=1105, FP=63, P=94.6%, FPR=0.02%, lift=3785.45. v7 was USEFUL (TP=876, FP=62, lift=2762.74). v8 was USEFUL (TP=229, FP=1).",
43111
+ aiSpecific: true,
43112
+ _v7Verdict: "USEFUL",
43113
+ _v7Lift: 2762.74,
43114
+ _v7Recall: 37e-4,
43115
+ _v7FpRate: 3e-4,
43116
+ _v7Precision: 0.9339,
43117
+ _v8Verdict: "USEFUL",
43118
+ _v8Lift: 68368.45
43119
+ },
43120
+ "visual/math-spacing-entropy": {
43121
+ recall: 18e-4,
43122
+ fpRate: 4e-4,
43123
+ ratio: 1898.99,
43124
+ precision: 0.8287,
43125
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43126
+ verdict: "USEFUL",
43127
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=532, FP=110, P=82.9%, FPR=0.04%, lift=1898.99. v7 was USEFUL (TP=425, FP=109, lift=1339.22). v8 was USEFUL (TP=107, FP=1).",
43128
+ aiSpecific: true,
43129
+ _v7Verdict: "USEFUL",
43130
+ _v7Lift: 1339.22,
43131
+ _v7Recall: 18e-4,
43132
+ _v7FpRate: 6e-4,
43133
+ _v7Precision: 0.7959,
43134
+ _v8Verdict: "USEFUL",
43135
+ _v8Lift: 68031.19
43136
+ },
43137
+ "visual/naturalness-anomaly": {
43138
+ recall: 0.1729,
43139
+ fpRate: 0.0687,
43140
+ ratio: 10.86,
43141
+ precision: 0.746,
43142
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43143
+ verdict: "USEFUL",
43144
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=50852, FP=17316, P=74.6%, FPR=6.87%, lift=10.86. v7 was USEFUL (TP=39319, FP=11382, lift=12.50). v8 was USEFUL (TP=11533, FP=5934).",
43145
+ aiSpecific: true,
43146
+ _v7Verdict: "USEFUL",
43147
+ _v7Lift: 12.5,
43148
+ _v7Recall: 0.1659,
43149
+ _v7FpRate: 0.0621,
43150
+ _v7Precision: 0.7755,
43151
+ _v8Verdict: "USEFUL",
43152
+ _v8Lift: 7.64
43153
+ },
43154
+ "visual/radius-scale-violation": {
43155
+ recall: 4e-4,
41634
43156
  fpRate: 0,
41635
- ratio: 0,
41636
- precision: 0,
41637
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41638
- verdict: "DORMANT",
41639
- defaultOff: true,
41640
- _calibrationNote: "v0.16.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: OWASP Foundation (2021), *OWASP Top 10 \u2014 A07:2021 Identification and Authentication Failures*; OWASP Foundation (2022), *HTML5 Security Cheat Sheet \xA72.1 (Local Storage)*. (JWT/access/refresh tokens in localStorage are readable by any XSS payload \u2014 issue as httpOnly cookies instead.)",
41641
- aiSpecific: false
43157
+ ratio: 82131.33,
43158
+ precision: 0.9774,
43159
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43160
+ verdict: "USEFUL",
43161
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=130, FP=3, P=97.7%, FPR=0.00%, lift=82131.33. v7 was USEFUL (TP=96, FP=3, lift=59285.01). v8 was USEFUL (TP=34, FP=0).",
43162
+ aiSpecific: false,
43163
+ _v7Verdict: "USEFUL",
43164
+ _v7Lift: 59285.01,
43165
+ _v7Recall: 4e-4,
43166
+ _v7FpRate: 0,
43167
+ _v7Precision: 0.9697,
43168
+ _v8Verdict: "USEFUL",
43169
+ _v8Lift: 99999
41642
43170
  },
41643
- "security/target-blank-no-noopener": {
43171
+ "visual/spacing-scale-violation": {
43172
+ recall: 86e-4,
43173
+ fpRate: 28e-4,
43174
+ ratio: 273.97,
43175
+ precision: 0.7792,
43176
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43177
+ verdict: "USEFUL",
43178
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=2531, FP=717, P=77.9%, FPR=0.28%, lift=273.97. v7 was USEFUL (TP=1981, FP=717, lift=187.83). v8 was USEFUL (TP=550, FP=0).",
43179
+ aiSpecific: false,
43180
+ _v7Verdict: "USEFUL",
43181
+ _v7Lift: 187.83,
43182
+ _v7Recall: 84e-4,
43183
+ _v7FpRate: 39e-4,
43184
+ _v7Precision: 0.7342,
43185
+ _v8Verdict: "USEFUL",
43186
+ _v8Lift: 99999
43187
+ },
43188
+ "wcag/dragging-movements": {
41644
43189
  recall: 0,
41645
43190
  fpRate: 0,
41646
- ratio: 0,
41647
- precision: 0,
41648
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41649
- verdict: "DORMANT",
41650
- defaultOff: true,
41651
- _calibrationNote: 'v0.16.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: OWASP Foundation (2022), *HTML5 Security Cheat Sheet \xA72.3 (Tabnabbing)*; WHATWG (2024), *HTML Living Standard \u2014 Link types: noopener*. (target="_blank" without rel="noopener" lets the linked page control window.opener \u2014 reverse tabnabbing.)',
41652
- aiSpecific: false
43191
+ ratio: 33610.67,
43192
+ precision: 0.4,
43193
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43194
+ verdict: "OK",
43195
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=2, FP=3, P=40.0%, FPR=0.00%, lift=33610.67. v7 was OK (TP=2, FP=3, lift=24455.07). v8 was DORMANT (TP=0, FP=0).",
43196
+ aiSpecific: false,
43197
+ _v7Verdict: "OK",
43198
+ _v7Lift: 24455.07,
43199
+ _v7Recall: 0,
43200
+ _v7FpRate: 0,
43201
+ _v7Precision: 0.4,
43202
+ _v8Verdict: "DORMANT",
43203
+ _v8Lift: 1
43204
+ },
43205
+ "wcag/focus-appearance": {
43206
+ recall: 28e-4,
43207
+ fpRate: 1e-4,
43208
+ ratio: 8397.24,
43209
+ precision: 0.966,
43210
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43211
+ verdict: "USEFUL",
43212
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=825, FP=29, P=96.6%, FPR=0.01%, lift=8397.24. v7 was USEFUL (TP=612, FP=24, lift=7353.82). v8 was USEFUL (TP=213, FP=5).",
43213
+ aiSpecific: false,
43214
+ _v7Verdict: "USEFUL",
43215
+ _v7Lift: 7353.82,
43216
+ _v7Recall: 26e-4,
43217
+ _v7FpRate: 1e-4,
43218
+ _v7Precision: 0.9623,
43219
+ _v8Verdict: "USEFUL",
43220
+ _v8Lift: 13418.41
43221
+ },
43222
+ "wcag/focus-obscured": {
43223
+ recall: 33e-4,
43224
+ fpRate: 7e-4,
43225
+ ratio: 1214.21,
43226
+ precision: 0.8478,
43227
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43228
+ verdict: "USEFUL",
43229
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=980, FP=176, P=84.8%, FPR=0.07%, lift=1214.21. v7 was USEFUL (TP=797, FP=175, lift=859.38). v8 was USEFUL (TP=183, FP=1).",
43230
+ aiSpecific: false,
43231
+ _v7Verdict: "USEFUL",
43232
+ _v7Lift: 859.38,
43233
+ _v7Recall: 34e-4,
43234
+ _v7FpRate: 1e-3,
43235
+ _v7Precision: 0.82,
43236
+ _v8Verdict: "USEFUL",
43237
+ _v8Lift: 68293.81
41653
43238
  },
41654
43239
  "wcag/missing-alt": {
41655
- recall: 0,
41656
- fpRate: 0,
41657
- ratio: 0,
41658
- precision: 0,
41659
- lastCalibratedAt: "2026-06-30T00:00:00Z",
41660
- verdict: "DORMANT",
41661
- defaultOff: true,
41662
- _calibrationNote: 'v0.16.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: W3C (2023), *Web Content Accessibility Guidelines (WCAG) 2.2 \u2014 1.1.1 Non-text Content*, https://www.w3.org/TR/WCAG22/. (Every <img> needs alt text. Decorative: alt="". Informative: describe the image.)',
41663
- aiSpecific: false
43240
+ recall: 11e-4,
43241
+ fpRate: 7e-4,
43242
+ ratio: 935.33,
43243
+ precision: 0.6456,
43244
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
43245
+ verdict: "USEFUL",
43246
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): v7+v8 combined corpus (252080 neg + 294178 pos). v8.5 TP=317, FP=174, P=64.6%, FPR=0.07%, lift=935.33. v7 was DORMANT (TP=0, FP=0, lift=1.00). v8 was USEFUL (TP=317, FP=174).",
43247
+ aiSpecific: false,
43248
+ _v7Verdict: "DORMANT",
43249
+ _v7Lift: 1,
43250
+ _v7Recall: 0,
43251
+ _v7FpRate: 0,
43252
+ _v7Precision: 0,
43253
+ _v8Verdict: "USEFUL",
43254
+ _v8Lift: 254.79
41664
43255
  },
41665
- "typo/placeholder-text": {
43256
+ "wcag/target-size": {
41666
43257
  recall: 0,
41667
43258
  fpRate: 0,
41668
43259
  ratio: 0,
41669
43260
  precision: 0,
41670
- lastCalibratedAt: "2026-06-30T00:00:00Z",
43261
+ lastCalibratedAt: "2026-07-01T00:00:00Z",
41671
43262
  verdict: "DORMANT",
41672
- defaultOff: true,
41673
- _calibrationNote: "v0.16.0 ship \u2014 not in v7 per-rule table. Default-off until calibration data lands. Backed by: Nielsen, J. (2000), *Designing Web Usability* (placeholder copy as a top-10 trust erosion signal); Krug, S. (2000), *Don't Make Me Think*, 2nd ed. (TODO/placeholder text in shipped UI signals incomplete work.)",
41674
- aiSpecific: false
43263
+ _calibrationNote: "v8.5 calibration (v0.18.9, 2026-07-01): rule did not fire on v8.5 corpus (252080 neg + 294178 pos = 546258 files). Preserved v7 data. v7 verdict=DORMANT, v7 lift=0, v7 recall=0, v7 FPR=0, v7 precision=0.",
43264
+ aiSpecific: false,
43265
+ _v7Verdict: "DORMANT",
43266
+ _v7Lift: 0,
43267
+ _v7Recall: 0,
43268
+ _v7FpRate: 0,
43269
+ _v7Precision: 0,
43270
+ _v8Verdict: "DORMANT",
43271
+ _v8Lift: 1,
43272
+ defaultOff: true
41675
43273
  }
41676
43274
  };
41677
43275
 
@@ -41710,7 +43308,6 @@ async function scanFile(filePath, config, registry, cwd = process.cwd()) {
41710
43308
  ".kt",
41711
43309
  ".kts",
41712
43310
  ".dart",
41713
- ".rs",
41714
43311
  ".cpp",
41715
43312
  ".cc",
41716
43313
  ".cxx",