slopbrick 0.18.1 → 0.18.3

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.
@@ -26,6 +26,7 @@ __export(worker_exports, {
26
26
  module.exports = __toCommonJS(worker_exports);
27
27
  var import_node_worker_threads = require("worker_threads");
28
28
  var import_node_path11 = require("path");
29
+ var import_node_path12 = require("path");
29
30
 
30
31
  // ../engine/dist/index.js
31
32
  var import_promises = require("fs/promises");
@@ -4290,10 +4291,10 @@ function parseSvelte(source) {
4290
4291
  const ast = parseScriptContent(script.content, isTypeScriptScript(script.openTag));
4291
4292
  return { ast, source };
4292
4293
  }
4293
- function cacheEnabled() {
4294
+ function legacyCacheEnabled() {
4294
4295
  return process.env.SLOP_AUDIT_CACHE === "1" || process.env.SLOP_AUDIT_CACHE === "true";
4295
4296
  }
4296
- function cacheRoot() {
4297
+ function legacyCacheRoot() {
4297
4298
  const override = process.env.SLOP_AUDIT_CACHE_ROOT;
4298
4299
  if (override) return override;
4299
4300
  return (0, import_path.join)(process.cwd(), ".slopbrick", "cache", "ast");
@@ -4301,11 +4302,11 @@ function cacheRoot() {
4301
4302
  function hashContent(content) {
4302
4303
  return (0, import_crypto.createHash)("md5").update(content, "utf-8").digest("hex");
4303
4304
  }
4304
- function cachePath(content) {
4305
- return (0, import_path.join)(cacheRoot(), `${hashContent(content)}.json`);
4305
+ function cachePathWithRoot(content, root) {
4306
+ return (0, import_path.join)(root, `${hashContent(content)}.json`);
4306
4307
  }
4307
- async function readCache(filePath, content) {
4308
- const path = cachePath(content);
4308
+ async function readCacheWithRoot(filePath, content, root) {
4309
+ const path = cachePathWithRoot(content, root);
4309
4310
  try {
4310
4311
  await (0, import_promises.access)(path);
4311
4312
  const raw = await (0, import_promises.readFile)(path, "utf8");
@@ -4318,8 +4319,8 @@ async function readCache(filePath, content) {
4318
4319
  }
4319
4320
  return void 0;
4320
4321
  }
4321
- async function writeCache(content, result) {
4322
- const path = cachePath(content);
4322
+ async function writeCacheWithRoot(content, result, root) {
4323
+ const path = cachePathWithRoot(content, root);
4323
4324
  await (0, import_promises.mkdir)((0, import_path.dirname)(path), { recursive: true });
4324
4325
  await (0, import_promises.writeFile)(path, JSON.stringify(result), "utf8");
4325
4326
  }
@@ -4350,15 +4351,17 @@ function parseSource(source, filePath) {
4350
4351
  return parseWithSwc(source, filePath);
4351
4352
  }
4352
4353
  }
4353
- async function parseFile(filePath) {
4354
+ async function parseFile(filePath, opts) {
4354
4355
  const source = await (0, import_promises.readFile)(filePath, "utf-8");
4355
- if (cacheEnabled()) {
4356
- const cached = await readCache(filePath, source);
4356
+ const useCache = opts?.cache?.enabled ?? legacyCacheEnabled();
4357
+ const cacheDir = opts?.cache?.root ?? legacyCacheRoot();
4358
+ if (useCache) {
4359
+ const cached = await readCacheWithRoot(filePath, source, cacheDir);
4357
4360
  if (cached) return cached;
4358
4361
  }
4359
4362
  const result = parseSource(source, filePath);
4360
- if (cacheEnabled()) {
4361
- await writeCache(source, result);
4363
+ if (useCache) {
4364
+ await writeCacheWithRoot(source, result, cacheDir);
4362
4365
  }
4363
4366
  return result;
4364
4367
  }
@@ -39724,7 +39727,8 @@ var signal_strength_default = {
39724
39727
  precision: 0.8968,
39725
39728
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39726
39729
  verdict: "USEFUL",
39727
- _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."
39730
+ _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.",
39731
+ aiSpecific: true
39728
39732
  },
39729
39733
  "logic/math-any-density": {
39730
39734
  recall: 16e-4,
@@ -39734,7 +39738,8 @@ var signal_strength_default = {
39734
39738
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39735
39739
  verdict: "NOISY",
39736
39740
  _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.",
39737
- defaultOff: true
39741
+ defaultOff: true,
39742
+ aiSpecific: true
39738
39743
  },
39739
39744
  "logic/boundary-violation": {
39740
39745
  recall: 0.0263,
@@ -39743,7 +39748,8 @@ var signal_strength_default = {
39743
39748
  precision: 0.6601,
39744
39749
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39745
39750
  verdict: "HYGIENE",
39746
- _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."
39751
+ _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.",
39752
+ aiSpecific: false
39747
39753
  },
39748
39754
  "logic/reactive-hook-soup": {
39749
39755
  recall: 38e-4,
@@ -39752,7 +39758,8 @@ var signal_strength_default = {
39752
39758
  precision: 0.8476,
39753
39759
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39754
39760
  verdict: "USEFUL",
39755
- _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."
39761
+ _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.",
39762
+ aiSpecific: true
39756
39763
  },
39757
39764
  "logic/optimistic-no-rollback": {
39758
39765
  recall: 12e-4,
@@ -39761,7 +39768,8 @@ var signal_strength_default = {
39761
39768
  precision: 0.824,
39762
39769
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39763
39770
  verdict: "USEFUL",
39764
- _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."
39771
+ _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.",
39772
+ aiSpecific: true
39765
39773
  },
39766
39774
  "logic/zombie-state": {
39767
39775
  recall: 1e-4,
@@ -39770,7 +39778,8 @@ var signal_strength_default = {
39770
39778
  precision: 0.9231,
39771
39779
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39772
39780
  verdict: "USEFUL",
39773
- _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."
39781
+ _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.",
39782
+ aiSpecific: true
39774
39783
  },
39775
39784
  "logic/math-gini-class-usage": {
39776
39785
  recall: 13e-4,
@@ -39779,7 +39788,8 @@ var signal_strength_default = {
39779
39788
  precision: 0.8683,
39780
39789
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39781
39790
  verdict: "USEFUL",
39782
- _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."
39791
+ _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.",
39792
+ aiSpecific: true
39783
39793
  },
39784
39794
  "visual/math-color-cluster": {
39785
39795
  recall: 2e-4,
@@ -39788,7 +39798,8 @@ var signal_strength_default = {
39788
39798
  precision: 0.9206,
39789
39799
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39790
39800
  verdict: "USEFUL",
39791
- _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."
39801
+ _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.",
39802
+ aiSpecific: true
39792
39803
  },
39793
39804
  "visual/math-default-font": {
39794
39805
  recall: 13e-4,
@@ -39797,7 +39808,8 @@ var signal_strength_default = {
39797
39808
  precision: 0.8151,
39798
39809
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39799
39810
  verdict: "USEFUL",
39800
- _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."
39811
+ _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.",
39812
+ aiSpecific: true
39801
39813
  },
39802
39814
  "visual/math-gradient-hue-rotation": {
39803
39815
  recall: 0,
@@ -39807,7 +39819,8 @@ var signal_strength_default = {
39807
39819
  lastCalibratedAt: "2026-06-25T00:00:00Z",
39808
39820
  verdict: "DORMANT",
39809
39821
  defaultOff: true,
39810
- _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.)"
39822
+ _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.)",
39823
+ aiSpecific: true
39811
39824
  },
39812
39825
  "visual/math-rounded-entropy": {
39813
39826
  recall: 37e-4,
@@ -39816,7 +39829,8 @@ var signal_strength_default = {
39816
39829
  precision: 0.9339,
39817
39830
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39818
39831
  verdict: "USEFUL",
39819
- _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."
39832
+ _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.",
39833
+ aiSpecific: true
39820
39834
  },
39821
39835
  "visual/math-font-entropy": {
39822
39836
  recall: 45e-4,
@@ -39825,7 +39839,8 @@ var signal_strength_default = {
39825
39839
  precision: 0.8114,
39826
39840
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39827
39841
  verdict: "USEFUL",
39828
- _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."
39842
+ _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.",
39843
+ aiSpecific: true
39829
39844
  },
39830
39845
  "visual/math-spacing-entropy": {
39831
39846
  recall: 18e-4,
@@ -39834,7 +39849,8 @@ var signal_strength_default = {
39834
39849
  precision: 0.7959,
39835
39850
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39836
39851
  verdict: "USEFUL",
39837
- _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."
39852
+ _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.",
39853
+ aiSpecific: true
39838
39854
  },
39839
39855
  "visual/clamp-soup": {
39840
39856
  recall: 0,
@@ -39844,7 +39860,8 @@ var signal_strength_default = {
39844
39860
  lastCalibratedAt: "2026-06-25T00:00:00Z",
39845
39861
  verdict: "DORMANT",
39846
39862
  defaultOff: true,
39847
- _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.)"
39863
+ _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.)",
39864
+ aiSpecific: true
39848
39865
  },
39849
39866
  "component/giant-component": {
39850
39867
  recall: 0.0176,
@@ -39853,7 +39870,8 @@ var signal_strength_default = {
39853
39870
  precision: 0.7485,
39854
39871
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39855
39872
  verdict: "USEFUL",
39856
- _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."
39873
+ _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.",
39874
+ aiSpecific: true
39857
39875
  },
39858
39876
  "component/shadcn-prop-mismatch": {
39859
39877
  recall: 13e-4,
@@ -39862,7 +39880,8 @@ var signal_strength_default = {
39862
39880
  precision: 0.929,
39863
39881
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39864
39882
  verdict: "USEFUL",
39865
- _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."
39883
+ _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.",
39884
+ aiSpecific: true
39866
39885
  },
39867
39886
  "layout/math-grid-uniformity": {
39868
39887
  recall: 3e-4,
@@ -39871,7 +39890,8 @@ var signal_strength_default = {
39871
39890
  precision: 0.6907,
39872
39891
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39873
39892
  verdict: "OK",
39874
- _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."
39893
+ _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.",
39894
+ aiSpecific: true
39875
39895
  },
39876
39896
  "layout/math-element-uniformity": {
39877
39897
  recall: 28e-4,
@@ -39880,7 +39900,8 @@ var signal_strength_default = {
39880
39900
  precision: 0.7475,
39881
39901
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39882
39902
  verdict: "USEFUL",
39883
- _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."
39903
+ _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.",
39904
+ aiSpecific: true
39884
39905
  },
39885
39906
  "typo/math-button-label-uniformity": {
39886
39907
  recall: 2e-4,
@@ -39889,7 +39910,8 @@ var signal_strength_default = {
39889
39910
  precision: 0.6379,
39890
39911
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39891
39912
  verdict: "HYGIENE",
39892
- _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."
39913
+ _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.",
39914
+ aiSpecific: false
39893
39915
  },
39894
39916
  "perf/css-bloat": {
39895
39917
  recall: 0.0117,
@@ -39898,7 +39920,8 @@ var signal_strength_default = {
39898
39920
  precision: 0.8252,
39899
39921
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39900
39922
  verdict: "HYGIENE",
39901
- _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."
39923
+ _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.",
39924
+ aiSpecific: false
39902
39925
  },
39903
39926
  "wcag/focus-appearance": {
39904
39927
  recall: 26e-4,
@@ -39907,7 +39930,8 @@ var signal_strength_default = {
39907
39930
  precision: 0.9623,
39908
39931
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39909
39932
  verdict: "HYGIENE",
39910
- _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."
39933
+ _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.",
39934
+ aiSpecific: false
39911
39935
  },
39912
39936
  "wcag/target-size": {
39913
39937
  recall: 0,
@@ -39917,7 +39941,8 @@ var signal_strength_default = {
39917
39941
  lastCalibratedAt: "2026-06-25T00:00:00Z",
39918
39942
  verdict: "DORMANT",
39919
39943
  defaultOff: true,
39920
- _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.)"
39944
+ _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.)",
39945
+ aiSpecific: false
39921
39946
  },
39922
39947
  "component/multiple-components-per-file": {
39923
39948
  recall: 0.0681,
@@ -39926,7 +39951,8 @@ var signal_strength_default = {
39926
39951
  precision: 0.6294,
39927
39952
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39928
39953
  verdict: "HYGIENE",
39929
- _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."
39954
+ _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.",
39955
+ aiSpecific: false
39930
39956
  },
39931
39957
  "context/import-path-mismatch": {
39932
39958
  recall: 0.0739,
@@ -39935,7 +39961,8 @@ var signal_strength_default = {
39935
39961
  precision: 0.8079,
39936
39962
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39937
39963
  verdict: "HYGIENE",
39938
- _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."
39964
+ _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.",
39965
+ aiSpecific: false
39939
39966
  },
39940
39967
  "logic/key-prop-missing": {
39941
39968
  recall: 17e-4,
@@ -39944,7 +39971,8 @@ var signal_strength_default = {
39944
39971
  precision: 0.6246,
39945
39972
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39946
39973
  verdict: "HYGIENE",
39947
- _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."
39974
+ _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.",
39975
+ aiSpecific: false
39948
39976
  },
39949
39977
  "logic/math-variable-name-entropy": {
39950
39978
  recall: 2e-4,
@@ -39953,7 +39981,8 @@ var signal_strength_default = {
39953
39981
  precision: 0.5806,
39954
39982
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39955
39983
  verdict: "HYGIENE",
39956
- _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."
39984
+ _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.",
39985
+ aiSpecific: false
39957
39986
  },
39958
39987
  "security/public-admin-route": {
39959
39988
  recall: 28e-4,
@@ -39963,7 +39992,8 @@ var signal_strength_default = {
39963
39992
  lastCalibratedAt: "2026-06-26T22:30:00Z",
39964
39993
  verdict: "HYGIENE",
39965
39994
  _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]",
39966
- defaultOff: true
39995
+ defaultOff: true,
39996
+ aiSpecific: false
39967
39997
  },
39968
39998
  "security/unsafe-html-render": {
39969
39999
  recall: 13e-4,
@@ -39972,7 +40002,8 @@ var signal_strength_default = {
39972
40002
  precision: 0.661,
39973
40003
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39974
40004
  verdict: "HYGIENE",
39975
- _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."
40005
+ _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.",
40006
+ aiSpecific: false
39976
40007
  },
39977
40008
  "visual/naturalness-anomaly": {
39978
40009
  recall: 0.1645,
@@ -39981,7 +40012,8 @@ var signal_strength_default = {
39981
40012
  precision: 0.7755,
39982
40013
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39983
40014
  verdict: "USEFUL",
39984
- _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."
40015
+ _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.",
40016
+ aiSpecific: true
39985
40017
  },
39986
40018
  "perf/halstead-anomaly": {
39987
40019
  recall: 0,
@@ -39990,7 +40022,8 @@ var signal_strength_default = {
39990
40022
  precision: 0.75,
39991
40023
  lastCalibratedAt: "2026-06-27T12:00:00Z",
39992
40024
  verdict: "USEFUL",
39993
- _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."
40025
+ _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.",
40026
+ aiSpecific: true
39994
40027
  },
39995
40028
  "arch/astro-island-leak": {
39996
40029
  recall: 0,
@@ -40000,7 +40033,8 @@ var signal_strength_default = {
40000
40033
  lastCalibratedAt: "2026-06-25T00:00:00Z",
40001
40034
  verdict: "DORMANT",
40002
40035
  defaultOff: true,
40003
- _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.)"
40036
+ _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.)",
40037
+ aiSpecific: true
40004
40038
  },
40005
40039
  "logic/qwik-hook-leak": {
40006
40040
  recall: 0,
@@ -40010,7 +40044,8 @@ var signal_strength_default = {
40010
40044
  lastCalibratedAt: "2026-06-25T00:00:00Z",
40011
40045
  verdict: "DORMANT",
40012
40046
  defaultOff: true,
40013
- _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.)"
40047
+ _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.)",
40048
+ aiSpecific: true
40014
40049
  },
40015
40050
  "test/missing-edge-case": {
40016
40051
  recall: 0,
@@ -40020,7 +40055,8 @@ var signal_strength_default = {
40020
40055
  lastCalibratedAt: "2026-06-25T00:00:00Z",
40021
40056
  verdict: "DORMANT",
40022
40057
  defaultOff: true,
40023
- _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.)"
40058
+ _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.)",
40059
+ aiSpecific: true
40024
40060
  },
40025
40061
  "typo/calc-fontsize": {
40026
40062
  recall: 0,
@@ -40030,7 +40066,8 @@ var signal_strength_default = {
40030
40066
  lastCalibratedAt: "2026-06-25T00:00:00Z",
40031
40067
  verdict: "DORMANT",
40032
40068
  defaultOff: true,
40033
- _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).)"
40069
+ _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).)",
40070
+ aiSpecific: false
40034
40071
  },
40035
40072
  "typo/clamp-offscale": {
40036
40073
  recall: 0,
@@ -40040,7 +40077,8 @@ var signal_strength_default = {
40040
40077
  lastCalibratedAt: "2026-06-25T00:00:00Z",
40041
40078
  verdict: "DORMANT",
40042
40079
  defaultOff: true,
40043
- _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.)"
40080
+ _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.)",
40081
+ aiSpecific: false
40044
40082
  },
40045
40083
  "typo/math-cta-vocabulary": {
40046
40084
  recall: 0,
@@ -40050,7 +40088,8 @@ var signal_strength_default = {
40050
40088
  lastCalibratedAt: "2026-06-25T00:00:00Z",
40051
40089
  verdict: "DORMANT",
40052
40090
  defaultOff: true,
40053
- _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.)"
40091
+ _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.)",
40092
+ aiSpecific: true
40054
40093
  },
40055
40094
  "layout/forced-layout": {
40056
40095
  recall: 0,
@@ -40060,7 +40099,8 @@ var signal_strength_default = {
40060
40099
  lastCalibratedAt: "2026-06-25T00:00:00Z",
40061
40100
  verdict: "DORMANT",
40062
40101
  defaultOff: true,
40063
- _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.)"
40102
+ _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.)",
40103
+ aiSpecific: true
40064
40104
  },
40065
40105
  "visual/generic-centering": {
40066
40106
  recall: 0,
@@ -40070,7 +40110,8 @@ var signal_strength_default = {
40070
40110
  lastCalibratedAt: "2026-06-25T00:00:00Z",
40071
40111
  verdict: "DORMANT",
40072
40112
  defaultOff: true,
40073
- _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.)"
40113
+ _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.)",
40114
+ aiSpecific: true
40074
40115
  },
40075
40116
  "product/terminology-drift": {
40076
40117
  recall: 85e-4,
@@ -40079,7 +40120,8 @@ var signal_strength_default = {
40079
40120
  precision: 0.7956,
40080
40121
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40081
40122
  verdict: "HYGIENE",
40082
- _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."
40123
+ _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.",
40124
+ aiSpecific: false
40083
40125
  },
40084
40126
  "product/ux-pattern-fragmentation": {
40085
40127
  recall: 1e-4,
@@ -40088,7 +40130,8 @@ var signal_strength_default = {
40088
40130
  precision: 0.8,
40089
40131
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40090
40132
  verdict: "USEFUL",
40091
- _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."
40133
+ _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.",
40134
+ aiSpecific: true
40092
40135
  },
40093
40136
  "security/sql-construction": {
40094
40137
  recall: 3e-3,
@@ -40097,7 +40140,8 @@ var signal_strength_default = {
40097
40140
  precision: 0.6788,
40098
40141
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40099
40142
  verdict: "OK",
40100
- _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."
40143
+ _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.",
40144
+ aiSpecific: true
40101
40145
  },
40102
40146
  "security/missing-auth-check": {
40103
40147
  recall: 63e-4,
@@ -40106,7 +40150,8 @@ var signal_strength_default = {
40106
40150
  precision: 0.9247,
40107
40151
  lastCalibratedAt: "2026-06-26T22:30:00Z",
40108
40152
  verdict: "USEFUL",
40109
- _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."
40153
+ _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.",
40154
+ aiSpecific: false
40110
40155
  },
40111
40156
  "security/dangerous-cors": {
40112
40157
  recall: 5e-4,
@@ -40116,7 +40161,8 @@ var signal_strength_default = {
40116
40161
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40117
40162
  verdict: "NOISY",
40118
40163
  _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.",
40119
- defaultOff: true
40164
+ defaultOff: true,
40165
+ aiSpecific: true
40120
40166
  },
40121
40167
  "test/duplicate-setup": {
40122
40168
  recall: 1e-4,
@@ -40125,7 +40171,8 @@ var signal_strength_default = {
40125
40171
  precision: 0.8235,
40126
40172
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40127
40173
  verdict: "USEFUL",
40128
- _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."
40174
+ _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.",
40175
+ aiSpecific: true
40129
40176
  },
40130
40177
  "logic/ghost-defensive": {
40131
40178
  recall: 1e-4,
@@ -40134,7 +40181,8 @@ var signal_strength_default = {
40134
40181
  precision: 0.8824,
40135
40182
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40136
40183
  verdict: "USEFUL",
40137
- _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."
40184
+ _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.",
40185
+ aiSpecific: true
40138
40186
  },
40139
40187
  "typo/calc-raw-px": {
40140
40188
  recall: 0,
@@ -40143,7 +40191,8 @@ var signal_strength_default = {
40143
40191
  precision: 0.75,
40144
40192
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40145
40193
  verdict: "HYGIENE",
40146
- _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."
40194
+ _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.",
40195
+ aiSpecific: false
40147
40196
  },
40148
40197
  "security/fail-open-auth": {
40149
40198
  recall: 0,
@@ -40152,7 +40201,8 @@ var signal_strength_default = {
40152
40201
  precision: 1,
40153
40202
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40154
40203
  verdict: "USEFUL",
40155
- _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."
40204
+ _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.",
40205
+ aiSpecific: true
40156
40206
  },
40157
40207
  "wcag/focus-obscured": {
40158
40208
  recall: 33e-4,
@@ -40161,7 +40211,8 @@ var signal_strength_default = {
40161
40211
  precision: 0.82,
40162
40212
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40163
40213
  verdict: "HYGIENE",
40164
- _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."
40214
+ _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.",
40215
+ aiSpecific: false
40165
40216
  },
40166
40217
  "visual/arbitrary-escape": {
40167
40218
  recall: 25e-4,
@@ -40170,7 +40221,8 @@ var signal_strength_default = {
40170
40221
  precision: 0.7802,
40171
40222
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40172
40223
  verdict: "USEFUL",
40173
- _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."
40224
+ _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.",
40225
+ aiSpecific: true
40174
40226
  },
40175
40227
  "security/hardcoded-secret": {
40176
40228
  recall: 13e-4,
@@ -40179,7 +40231,8 @@ var signal_strength_default = {
40179
40231
  precision: 0.6899,
40180
40232
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40181
40233
  verdict: "OK",
40182
- _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."
40234
+ _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.",
40235
+ aiSpecific: true
40183
40236
  },
40184
40237
  "visual/radius-scale-violation": {
40185
40238
  recall: 4e-4,
@@ -40188,7 +40241,8 @@ var signal_strength_default = {
40188
40241
  precision: 0.9697,
40189
40242
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40190
40243
  verdict: "HYGIENE",
40191
- _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."
40244
+ _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.",
40245
+ aiSpecific: false
40192
40246
  },
40193
40247
  "test/fake-placeholder": {
40194
40248
  recall: 53e-4,
@@ -40197,7 +40251,8 @@ var signal_strength_default = {
40197
40251
  precision: 0.7854,
40198
40252
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40199
40253
  verdict: "USEFUL",
40200
- _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."
40254
+ _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.",
40255
+ aiSpecific: true
40201
40256
  },
40202
40257
  "security/exposed-env-var": {
40203
40258
  recall: 6e-4,
@@ -40206,7 +40261,8 @@ var signal_strength_default = {
40206
40261
  precision: 0.5387,
40207
40262
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40208
40263
  verdict: "HYGIENE",
40209
- _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."
40264
+ _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.",
40265
+ aiSpecific: false
40210
40266
  },
40211
40267
  "perf/cls-image": {
40212
40268
  recall: 2e-4,
@@ -40215,7 +40271,8 @@ var signal_strength_default = {
40215
40271
  precision: 0.5104,
40216
40272
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40217
40273
  verdict: "HYGIENE",
40218
- _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."
40274
+ _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.",
40275
+ aiSpecific: false
40219
40276
  },
40220
40277
  "layout/gap-monopoly": {
40221
40278
  recall: 4e-4,
@@ -40224,7 +40281,8 @@ var signal_strength_default = {
40224
40281
  precision: 0.7928,
40225
40282
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40226
40283
  verdict: "HYGIENE",
40227
- _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."
40284
+ _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.",
40285
+ aiSpecific: false
40228
40286
  },
40229
40287
  "visual/spacing-scale-violation": {
40230
40288
  recall: 83e-4,
@@ -40233,7 +40291,8 @@ var signal_strength_default = {
40233
40291
  precision: 0.7342,
40234
40292
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40235
40293
  verdict: "HYGIENE",
40236
- _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."
40294
+ _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.",
40295
+ aiSpecific: false
40237
40296
  },
40238
40297
  "visual/inline-style-dominance": {
40239
40298
  recall: 96e-4,
@@ -40242,7 +40301,8 @@ var signal_strength_default = {
40242
40301
  precision: 0.6535,
40243
40302
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40244
40303
  verdict: "HYGIENE",
40245
- _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."
40304
+ _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.",
40305
+ aiSpecific: false
40246
40306
  },
40247
40307
  "layout/spacing-grid": {
40248
40308
  recall: 2e-4,
@@ -40251,7 +40311,8 @@ var signal_strength_default = {
40251
40311
  precision: 0.7222,
40252
40312
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40253
40313
  verdict: "HYGIENE",
40254
- _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."
40314
+ _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.",
40315
+ aiSpecific: false
40255
40316
  },
40256
40317
  "wcag/dragging-movements": {
40257
40318
  recall: 0,
@@ -40260,7 +40321,8 @@ var signal_strength_default = {
40260
40321
  precision: 0.4,
40261
40322
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40262
40323
  verdict: "HYGIENE",
40263
- _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."
40324
+ _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.",
40325
+ aiSpecific: false
40264
40326
  },
40265
40327
  "test/weak-assertion": {
40266
40328
  recall: 0.0414,
@@ -40269,7 +40331,8 @@ var signal_strength_default = {
40269
40331
  precision: 0.8622,
40270
40332
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40271
40333
  verdict: "USEFUL",
40272
- _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."
40334
+ _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.",
40335
+ aiSpecific: true
40273
40336
  },
40274
40337
  "logic/bayesian-conditional": {
40275
40338
  recall: 0,
@@ -40279,7 +40342,8 @@ var signal_strength_default = {
40279
40342
  lastCalibratedAt: "2026-06-27T00:00:00Z",
40280
40343
  verdict: "DORMANT",
40281
40344
  defaultOff: true,
40282
- _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."
40345
+ _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.",
40346
+ aiSpecific: true
40283
40347
  },
40284
40348
  "logic/heaps-deviation": {
40285
40349
  recall: 0.0122,
@@ -40288,7 +40352,8 @@ var signal_strength_default = {
40288
40352
  precision: 0.5461,
40289
40353
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40290
40354
  verdict: "HYGIENE",
40291
- _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."
40355
+ _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.",
40356
+ aiSpecific: false
40292
40357
  },
40293
40358
  "logic/ks-distribution-shift": {
40294
40359
  recall: 0.6375,
@@ -40297,7 +40362,8 @@ var signal_strength_default = {
40297
40362
  precision: 0.7096,
40298
40363
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40299
40364
  verdict: "HYGIENE",
40300
- _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."
40365
+ _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.",
40366
+ aiSpecific: false
40301
40367
  },
40302
40368
  "logic/zipf-slope-anomaly": {
40303
40369
  recall: 0.0156,
@@ -40306,7 +40372,8 @@ var signal_strength_default = {
40306
40372
  precision: 0.6983,
40307
40373
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40308
40374
  verdict: "HYGIENE",
40309
- _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."
40375
+ _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.",
40376
+ aiSpecific: false
40310
40377
  },
40311
40378
  "ai/markdown-leakage": {
40312
40379
  recall: 0,
@@ -40315,7 +40382,8 @@ var signal_strength_default = {
40315
40382
  precision: 0.7143,
40316
40383
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40317
40384
  verdict: "OK",
40318
- _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."
40385
+ _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.",
40386
+ aiSpecific: true
40319
40387
  },
40320
40388
  "ai/comment-ratio": {
40321
40389
  recall: 0.2523,
@@ -40324,7 +40392,8 @@ var signal_strength_default = {
40324
40392
  precision: 0.6687,
40325
40393
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40326
40394
  verdict: "OK",
40327
- _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."
40395
+ _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.",
40396
+ aiSpecific: true
40328
40397
  },
40329
40398
  "ai/whitespace-regularity": {
40330
40399
  recall: 0.0731,
@@ -40334,7 +40403,8 @@ var signal_strength_default = {
40334
40403
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40335
40404
  verdict: "NOISY",
40336
40405
  _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.",
40337
- defaultOff: true
40406
+ defaultOff: true,
40407
+ aiSpecific: true
40338
40408
  },
40339
40409
  "ai/text-like-ratio": {
40340
40410
  recall: 0,
@@ -40343,7 +40413,8 @@ var signal_strength_default = {
40343
40413
  precision: 0.75,
40344
40414
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40345
40415
  verdict: "USEFUL",
40346
- _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."
40416
+ _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.",
40417
+ aiSpecific: true
40347
40418
  },
40348
40419
  "ai/errors-near-eof": {
40349
40420
  recall: 0.0697,
@@ -40353,7 +40424,8 @@ var signal_strength_default = {
40353
40424
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40354
40425
  verdict: "NOISY",
40355
40426
  _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.",
40356
- defaultOff: true
40427
+ defaultOff: true,
40428
+ aiSpecific: true
40357
40429
  },
40358
40430
  "ai/any-density": {
40359
40431
  recall: 55e-4,
@@ -40363,7 +40435,8 @@ var signal_strength_default = {
40363
40435
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40364
40436
  verdict: "NOISY",
40365
40437
  _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.",
40366
- defaultOff: true
40438
+ defaultOff: true,
40439
+ aiSpecific: true
40367
40440
  },
40368
40441
  "ai/renyi-profile": {
40369
40442
  recall: 0,
@@ -40373,7 +40446,8 @@ var signal_strength_default = {
40373
40446
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40374
40447
  verdict: "INVERTED",
40375
40448
  _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.",
40376
- defaultOff: true
40449
+ defaultOff: true,
40450
+ aiSpecific: true
40377
40451
  },
40378
40452
  "ai/log-rank-histogram": {
40379
40453
  recall: 0,
@@ -40382,7 +40456,8 @@ var signal_strength_default = {
40382
40456
  precision: 0,
40383
40457
  lastCalibratedAt: "2026-06-27T00:00:00Z",
40384
40458
  verdict: "OK",
40385
- _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)."
40459
+ _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).",
40460
+ aiSpecific: true
40386
40461
  },
40387
40462
  "ai/segment-surprisal-cv": {
40388
40463
  recall: 0.182,
@@ -40391,7 +40466,8 @@ var signal_strength_default = {
40391
40466
  precision: 0.7438,
40392
40467
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40393
40468
  verdict: "USEFUL",
40394
- _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."
40469
+ _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.",
40470
+ aiSpecific: true
40395
40471
  },
40396
40472
  "ai/compression-profile": {
40397
40473
  recall: 0.3139,
@@ -40400,7 +40476,8 @@ var signal_strength_default = {
40400
40476
  precision: 0.732,
40401
40477
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40402
40478
  verdict: "USEFUL",
40403
- _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."
40479
+ _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.",
40480
+ aiSpecific: true
40404
40481
  },
40405
40482
  "ai/tailwind-color-overuse": {
40406
40483
  recall: 0.0216,
@@ -40409,7 +40486,8 @@ var signal_strength_default = {
40409
40486
  precision: 0.8436,
40410
40487
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40411
40488
  verdict: "USEFUL",
40412
- _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."
40489
+ _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.",
40490
+ aiSpecific: true
40413
40491
  },
40414
40492
  "ai/default-react-stack": {
40415
40493
  recall: 1e-3,
@@ -40418,7 +40496,8 @@ var signal_strength_default = {
40418
40496
  precision: 0.9957,
40419
40497
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40420
40498
  verdict: "USEFUL",
40421
- _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."
40499
+ _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.",
40500
+ aiSpecific: true
40422
40501
  },
40423
40502
  "ai/library-reinvention": {
40424
40503
  recall: 3e-4,
@@ -40427,7 +40506,8 @@ var signal_strength_default = {
40427
40506
  precision: 0.9275,
40428
40507
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40429
40508
  verdict: "USEFUL",
40430
- _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."
40509
+ _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.",
40510
+ aiSpecific: true
40431
40511
  },
40432
40512
  "ai/state-default-overuse": {
40433
40513
  recall: 29e-4,
@@ -40436,7 +40516,8 @@ var signal_strength_default = {
40436
40516
  precision: 0.8161,
40437
40517
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40438
40518
  verdict: "USEFUL",
40439
- _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."
40519
+ _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.",
40520
+ aiSpecific: true
40440
40521
  },
40441
40522
  "ai/fetch-default-overuse": {
40442
40523
  recall: 28e-4,
@@ -40445,7 +40526,8 @@ var signal_strength_default = {
40445
40526
  precision: 0.8976,
40446
40527
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40447
40528
  verdict: "USEFUL",
40448
- _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."
40529
+ _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.",
40530
+ aiSpecific: true
40449
40531
  },
40450
40532
  "ai/console-debug-storm": {
40451
40533
  recall: 8e-3,
@@ -40454,7 +40536,8 @@ var signal_strength_default = {
40454
40536
  precision: 0.9161,
40455
40537
  lastCalibratedAt: "2026-06-27T12:00:00Z",
40456
40538
  verdict: "USEFUL",
40457
- _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."
40539
+ _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.",
40540
+ aiSpecific: true
40458
40541
  },
40459
40542
  "db/missing-fk-index": {
40460
40543
  recall: 0,
@@ -40464,7 +40547,8 @@ var signal_strength_default = {
40464
40547
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40465
40548
  verdict: "DORMANT",
40466
40549
  defaultOff: true,
40467
- _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.)"
40550
+ _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.)",
40551
+ aiSpecific: false
40468
40552
  },
40469
40553
  "db/duplicate-index": {
40470
40554
  recall: 0,
@@ -40474,7 +40558,8 @@ var signal_strength_default = {
40474
40558
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40475
40559
  verdict: "DORMANT",
40476
40560
  defaultOff: true,
40477
- _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.)"
40561
+ _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.)",
40562
+ aiSpecific: false
40478
40563
  },
40479
40564
  "db/missing-not-null": {
40480
40565
  recall: 0,
@@ -40484,7 +40569,8 @@ var signal_strength_default = {
40484
40569
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40485
40570
  verdict: "DORMANT",
40486
40571
  defaultOff: true,
40487
- _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.)"
40572
+ _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.)",
40573
+ aiSpecific: false
40488
40574
  },
40489
40575
  "db/enum-sprawl": {
40490
40576
  recall: 0,
@@ -40494,7 +40580,8 @@ var signal_strength_default = {
40494
40580
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40495
40581
  verdict: "DORMANT",
40496
40582
  defaultOff: true,
40497
- _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.)"
40583
+ _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.)",
40584
+ aiSpecific: false
40498
40585
  },
40499
40586
  "db/naming-inconsistency": {
40500
40587
  recall: 0,
@@ -40504,7 +40591,8 @@ var signal_strength_default = {
40504
40591
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40505
40592
  verdict: "DORMANT",
40506
40593
  defaultOff: true,
40507
- _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.)"
40594
+ _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.)",
40595
+ aiSpecific: false
40508
40596
  },
40509
40597
  "db/sql-concat": {
40510
40598
  recall: 0,
@@ -40514,7 +40602,8 @@ var signal_strength_default = {
40514
40602
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40515
40603
  verdict: "DORMANT",
40516
40604
  defaultOff: true,
40517
- _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.)"
40605
+ _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.)",
40606
+ aiSpecific: true
40518
40607
  },
40519
40608
  "docs/stale-package-reference": {
40520
40609
  recall: 0,
@@ -40524,7 +40613,8 @@ var signal_strength_default = {
40524
40613
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40525
40614
  verdict: "DORMANT",
40526
40615
  defaultOff: true,
40527
- _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.)"
40616
+ _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.)",
40617
+ aiSpecific: false
40528
40618
  },
40529
40619
  "docs/stale-function-reference": {
40530
40620
  recall: 0,
@@ -40534,7 +40624,8 @@ var signal_strength_default = {
40534
40624
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40535
40625
  verdict: "DORMANT",
40536
40626
  defaultOff: true,
40537
- _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.)"
40627
+ _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.)",
40628
+ aiSpecific: false
40538
40629
  },
40539
40630
  "docs/expired-code-example": {
40540
40631
  recall: 0,
@@ -40544,7 +40635,8 @@ var signal_strength_default = {
40544
40635
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40545
40636
  verdict: "DORMANT",
40546
40637
  defaultOff: true,
40547
- _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.)"
40638
+ _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.)",
40639
+ aiSpecific: false
40548
40640
  },
40549
40641
  "docs/broken-link": {
40550
40642
  recall: 0,
@@ -40554,7 +40646,8 @@ var signal_strength_default = {
40554
40646
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40555
40647
  verdict: "DORMANT",
40556
40648
  defaultOff: true,
40557
- _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.)"
40649
+ _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.)",
40650
+ aiSpecific: false
40558
40651
  },
40559
40652
  "security/eval": {
40560
40653
  recall: 0,
@@ -40564,7 +40657,8 @@ var signal_strength_default = {
40564
40657
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40565
40658
  verdict: "DORMANT",
40566
40659
  defaultOff: true,
40567
- _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.)"
40660
+ _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.)",
40661
+ aiSpecific: false
40568
40662
  },
40569
40663
  "security/localstorage-token": {
40570
40664
  recall: 0,
@@ -40574,7 +40668,8 @@ var signal_strength_default = {
40574
40668
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40575
40669
  verdict: "DORMANT",
40576
40670
  defaultOff: true,
40577
- _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.)"
40671
+ _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.)",
40672
+ aiSpecific: false
40578
40673
  },
40579
40674
  "security/target-blank-no-noopener": {
40580
40675
  recall: 0,
@@ -40584,7 +40679,8 @@ var signal_strength_default = {
40584
40679
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40585
40680
  verdict: "DORMANT",
40586
40681
  defaultOff: true,
40587
- _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.)'
40682
+ _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.)',
40683
+ aiSpecific: false
40588
40684
  },
40589
40685
  "wcag/missing-alt": {
40590
40686
  recall: 0,
@@ -40594,7 +40690,8 @@ var signal_strength_default = {
40594
40690
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40595
40691
  verdict: "DORMANT",
40596
40692
  defaultOff: true,
40597
- _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.)'
40693
+ _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.)',
40694
+ aiSpecific: false
40598
40695
  },
40599
40696
  "typo/placeholder-text": {
40600
40697
  recall: 0,
@@ -40604,7 +40701,8 @@ var signal_strength_default = {
40604
40701
  lastCalibratedAt: "2026-06-30T00:00:00Z",
40605
40702
  verdict: "DORMANT",
40606
40703
  defaultOff: true,
40607
- _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.)"
40704
+ _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.)",
40705
+ aiSpecific: false
40608
40706
  }
40609
40707
  };
40610
40708
 
@@ -40616,6 +40714,12 @@ function loadSignalStrength() {
40616
40714
  }
40617
40715
 
40618
40716
  // src/engine/worker.ts
40717
+ function buildParserCacheConfig(cwd) {
40718
+ const envVal = process.env.SLOP_AUDIT_CACHE;
40719
+ const enabled = envVal === "1" || envVal === "true";
40720
+ const root = process.env.SLOP_AUDIT_CACHE_ROOT ?? (0, import_node_path12.join)(cwd, ".slopbrick", "cache", "ast");
40721
+ return { enabled, root };
40722
+ }
40619
40723
  function applyRuleOverrides(issues, rules) {
40620
40724
  const result = [];
40621
40725
  for (const issue of issues) {
@@ -40630,6 +40734,7 @@ function applyRuleOverrides(issues, rules) {
40630
40734
  return result;
40631
40735
  }
40632
40736
  async function scanFile(filePath, config, registry, cwd = process.cwd()) {
40737
+ const cache = buildParserCacheConfig(cwd);
40633
40738
  const ext = (0, import_node_path11.extname)(filePath).toLowerCase();
40634
40739
  const UNSUPPORTED_LANGS = /* @__PURE__ */ new Set([
40635
40740
  ".swift",
@@ -40660,7 +40765,7 @@ async function scanFile(filePath, config, registry, cwd = process.cwd()) {
40660
40765
  };
40661
40766
  }
40662
40767
  try {
40663
- const { ast, source } = await parseFile(filePath);
40768
+ const { ast, source } = await parseFile(filePath, { cache });
40664
40769
  const facts = extractFacts(filePath, ast, source, config.supportsRsc ?? true, config.framework ?? "react", config);
40665
40770
  const activeRegistry = registry ?? new RuleRegistry();
40666
40771
  if (!registry) {