slopbrick 0.21.1 → 0.21.2

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.
@@ -36304,6 +36304,7 @@ var javaArraylistVsLinkedlistRule = createRule({
36304
36304
  const issues = [];
36305
36305
  const source = facts.v2?._source;
36306
36306
  if (!source) return issues;
36307
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36307
36308
  let m;
36308
36309
  NEW_LINKED_LIST_REGEX.lastIndex = 0;
36309
36310
  while ((m = NEW_LINKED_LIST_REGEX.exec(source)) !== null) {
@@ -36338,6 +36339,7 @@ var javaEmptyCatchBlockRule = createRule({
36338
36339
  const issues = [];
36339
36340
  const source = facts.v2?._source;
36340
36341
  if (!source) return issues;
36342
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36341
36343
  let m;
36342
36344
  SINGLE_LINE_EMPTY_CATCH_REGEX.lastIndex = 0;
36343
36345
  while ((m = SINGLE_LINE_EMPTY_CATCH_REGEX.exec(source)) !== null) {
@@ -36374,6 +36376,7 @@ var javaLegacyDateApiRule = createRule({
36374
36376
  const issues = [];
36375
36377
  const source = facts.v2?._source;
36376
36378
  if (!source) return issues;
36379
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36377
36380
  const flagged = /* @__PURE__ */ new Set();
36378
36381
  let m;
36379
36382
  LEGACY_IMPORT_REGEX.lastIndex = 0;
@@ -36440,6 +36443,7 @@ var javaRawTypeOveruseRule = createRule({
36440
36443
  const issues = [];
36441
36444
  const source = facts.v2?._source;
36442
36445
  if (!source) return issues;
36446
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36443
36447
  let m;
36444
36448
  RAW_TYPE_REGEX.lastIndex = 0;
36445
36449
  while ((m = RAW_TYPE_REGEX.exec(source)) !== null) {
@@ -36475,6 +36479,7 @@ var javaStringConcatLoopRule = createRule({
36475
36479
  const issues = [];
36476
36480
  const source = facts.v2?._source;
36477
36481
  if (!source) return issues;
36482
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36478
36483
  if (!/\b(for|while|do)\b/.test(source)) return issues;
36479
36484
  let m;
36480
36485
  STRING_CONCAT_REGEX.lastIndex = 0;
@@ -36511,6 +36516,7 @@ var javaSystemOutPrintlnRule = createRule({
36511
36516
  const issues = [];
36512
36517
  const source = facts.v2?._source;
36513
36518
  if (!source) return issues;
36519
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36514
36520
  const matches = [];
36515
36521
  let m;
36516
36522
  PRINTLN_REGEX.lastIndex = 0;
@@ -42210,7 +42216,8 @@ var signal_strength_default = {
42210
42216
  precision: 0.5583,
42211
42217
  lastCalibratedAt: "2026-07-01T00:00:00Z",
42212
42218
  verdict: "USEFUL",
42213
- _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).",
42219
+ defaultOff: true,
42220
+ _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). v0.21.2: marked defaultOff because precision 0.5583 < 0.60 floor (the v9.5 methodology in `docs/research/methodology-minimum-sample-size.md` sets the default-on threshold at P >= 0.60). At 55.8% precision, 44% of fires are false positives \u2014 too noisy to gate on. The rule stays available for opt-in via `rules: { 'ai/whitespace-regularity': 'low' }` in slopbrick.config.mjs. The 18 src/ self-scan fires are the typical noise profile.",
42214
42221
  aiSpecific: true,
42215
42222
  _v7Verdict: "USEFUL",
42216
42223
  _v7Lift: 7.71,
@@ -42558,7 +42565,8 @@ var signal_strength_default = {
42558
42565
  precision: 0,
42559
42566
  lastCalibratedAt: "2026-07-01T00:00:00Z",
42560
42567
  verdict: "DORMANT",
42561
- _calibrationNote: "v0.19: new rule, not yet calibrated. v8.5 calibration does not run dup/* rules. Scheduled for v0.20 calibration on near-dup corpus.",
42568
+ defaultOff: false,
42569
+ _calibrationNote: "v0.19: new rule, not yet calibrated. v8.5 calibration does not run dup/* rules (the calibration script analyzes each file in isolation, but dup/* rules require cross-file state \u2014 the module-scope dedup cache is per-process, not per-file, so per-file analysis never produces cross-file matches and the rule's recall reads as 0). Scheduled for v0.22 calibration on the v9 corpus with a per-project dedup cache. v0.21.1 self-scan: 207 fires in src/ after WINDOW_SIZE 10\u219220 (was 575) \u2014 69% reduction. The actual precision/recall of these 207 fires is unverified ground truth. Default stays on because the rule's value is real (block-level duplications are a classic AI-fingerprint) and the corpus-measured 0.0 is a methodology artifact, not a real measurement.",
42562
42570
  aiSpecific: false,
42563
42571
  _v7Verdict: "DORMANT",
42564
42572
  _v7Lift: 1,
@@ -36275,6 +36275,7 @@ var javaArraylistVsLinkedlistRule = createRule({
36275
36275
  const issues = [];
36276
36276
  const source = facts.v2?._source;
36277
36277
  if (!source) return issues;
36278
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36278
36279
  let m;
36279
36280
  NEW_LINKED_LIST_REGEX.lastIndex = 0;
36280
36281
  while ((m = NEW_LINKED_LIST_REGEX.exec(source)) !== null) {
@@ -36309,6 +36310,7 @@ var javaEmptyCatchBlockRule = createRule({
36309
36310
  const issues = [];
36310
36311
  const source = facts.v2?._source;
36311
36312
  if (!source) return issues;
36313
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36312
36314
  let m;
36313
36315
  SINGLE_LINE_EMPTY_CATCH_REGEX.lastIndex = 0;
36314
36316
  while ((m = SINGLE_LINE_EMPTY_CATCH_REGEX.exec(source)) !== null) {
@@ -36345,6 +36347,7 @@ var javaLegacyDateApiRule = createRule({
36345
36347
  const issues = [];
36346
36348
  const source = facts.v2?._source;
36347
36349
  if (!source) return issues;
36350
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36348
36351
  const flagged = /* @__PURE__ */ new Set();
36349
36352
  let m;
36350
36353
  LEGACY_IMPORT_REGEX.lastIndex = 0;
@@ -36411,6 +36414,7 @@ var javaRawTypeOveruseRule = createRule({
36411
36414
  const issues = [];
36412
36415
  const source = facts.v2?._source;
36413
36416
  if (!source) return issues;
36417
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36414
36418
  let m;
36415
36419
  RAW_TYPE_REGEX.lastIndex = 0;
36416
36420
  while ((m = RAW_TYPE_REGEX.exec(source)) !== null) {
@@ -36446,6 +36450,7 @@ var javaStringConcatLoopRule = createRule({
36446
36450
  const issues = [];
36447
36451
  const source = facts.v2?._source;
36448
36452
  if (!source) return issues;
36453
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36449
36454
  if (!/\b(for|while|do)\b/.test(source)) return issues;
36450
36455
  let m;
36451
36456
  STRING_CONCAT_REGEX.lastIndex = 0;
@@ -36482,6 +36487,7 @@ var javaSystemOutPrintlnRule = createRule({
36482
36487
  const issues = [];
36483
36488
  const source = facts.v2?._source;
36484
36489
  if (!source) return issues;
36490
+ if (!/\.java$/i.test(facts.filePath)) return issues;
36485
36491
  const matches = [];
36486
36492
  let m;
36487
36493
  PRINTLN_REGEX.lastIndex = 0;
@@ -42181,7 +42187,8 @@ var signal_strength_default = {
42181
42187
  precision: 0.5583,
42182
42188
  lastCalibratedAt: "2026-07-01T00:00:00Z",
42183
42189
  verdict: "USEFUL",
42184
- _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).",
42190
+ defaultOff: true,
42191
+ _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). v0.21.2: marked defaultOff because precision 0.5583 < 0.60 floor (the v9.5 methodology in `docs/research/methodology-minimum-sample-size.md` sets the default-on threshold at P >= 0.60). At 55.8% precision, 44% of fires are false positives \u2014 too noisy to gate on. The rule stays available for opt-in via `rules: { 'ai/whitespace-regularity': 'low' }` in slopbrick.config.mjs. The 18 src/ self-scan fires are the typical noise profile.",
42185
42192
  aiSpecific: true,
42186
42193
  _v7Verdict: "USEFUL",
42187
42194
  _v7Lift: 7.71,
@@ -42529,7 +42536,8 @@ var signal_strength_default = {
42529
42536
  precision: 0,
42530
42537
  lastCalibratedAt: "2026-07-01T00:00:00Z",
42531
42538
  verdict: "DORMANT",
42532
- _calibrationNote: "v0.19: new rule, not yet calibrated. v8.5 calibration does not run dup/* rules. Scheduled for v0.20 calibration on near-dup corpus.",
42539
+ defaultOff: false,
42540
+ _calibrationNote: "v0.19: new rule, not yet calibrated. v8.5 calibration does not run dup/* rules (the calibration script analyzes each file in isolation, but dup/* rules require cross-file state \u2014 the module-scope dedup cache is per-process, not per-file, so per-file analysis never produces cross-file matches and the rule's recall reads as 0). Scheduled for v0.22 calibration on the v9 corpus with a per-project dedup cache. v0.21.1 self-scan: 207 fires in src/ after WINDOW_SIZE 10\u219220 (was 575) \u2014 69% reduction. The actual precision/recall of these 207 fires is unverified ground truth. Default stays on because the rule's value is real (block-level duplications are a classic AI-fingerprint) and the corpus-measured 0.0 is a methodology artifact, not a real measurement.",
42533
42541
  aiSpecific: false,
42534
42542
  _v7Verdict: "DORMANT",
42535
42543
  _v7Lift: 1,
package/dist/index.cjs CHANGED
@@ -36,7 +36,7 @@ var VERSION;
36
36
  var init_header = __esm({
37
37
  "src/types/_header.ts"() {
38
38
  "use strict";
39
- VERSION = "0.21.1";
39
+ VERSION = "0.21.2";
40
40
  }
41
41
  });
42
42
 
@@ -29856,6 +29856,7 @@ var init_arraylist_vs_linkedlist = __esm({
29856
29856
  const issues = [];
29857
29857
  const source = facts.v2?._source;
29858
29858
  if (!source) return issues;
29859
+ if (!/\.java$/i.test(facts.filePath)) return issues;
29859
29860
  let m;
29860
29861
  NEW_LINKED_LIST_REGEX.lastIndex = 0;
29861
29862
  while ((m = NEW_LINKED_LIST_REGEX.exec(source)) !== null) {
@@ -29897,6 +29898,7 @@ var init_empty_catch_block = __esm({
29897
29898
  const issues = [];
29898
29899
  const source = facts.v2?._source;
29899
29900
  if (!source) return issues;
29901
+ if (!/\.java$/i.test(facts.filePath)) return issues;
29900
29902
  let m;
29901
29903
  SINGLE_LINE_EMPTY_CATCH_REGEX.lastIndex = 0;
29902
29904
  while ((m = SINGLE_LINE_EMPTY_CATCH_REGEX.exec(source)) !== null) {
@@ -29940,6 +29942,7 @@ var init_legacy_date_api = __esm({
29940
29942
  const issues = [];
29941
29943
  const source = facts.v2?._source;
29942
29944
  if (!source) return issues;
29945
+ if (!/\.java$/i.test(facts.filePath)) return issues;
29943
29946
  const flagged = /* @__PURE__ */ new Set();
29944
29947
  let m;
29945
29948
  LEGACY_IMPORT_REGEX.lastIndex = 0;
@@ -30013,6 +30016,7 @@ var init_raw_type_overuse = __esm({
30013
30016
  const issues = [];
30014
30017
  const source = facts.v2?._source;
30015
30018
  if (!source) return issues;
30019
+ if (!/\.java$/i.test(facts.filePath)) return issues;
30016
30020
  let m;
30017
30021
  RAW_TYPE_REGEX.lastIndex = 0;
30018
30022
  while ((m = RAW_TYPE_REGEX.exec(source)) !== null) {
@@ -30055,6 +30059,7 @@ var init_string_concat_loop = __esm({
30055
30059
  const issues = [];
30056
30060
  const source = facts.v2?._source;
30057
30061
  if (!source) return issues;
30062
+ if (!/\.java$/i.test(facts.filePath)) return issues;
30058
30063
  if (!/\b(for|while|do)\b/.test(source)) return issues;
30059
30064
  let m;
30060
30065
  STRING_CONCAT_REGEX.lastIndex = 0;
@@ -30098,6 +30103,7 @@ var init_system_out_println = __esm({
30098
30103
  const issues = [];
30099
30104
  const source = facts.v2?._source;
30100
30105
  if (!source) return issues;
30106
+ if (!/\.java$/i.test(facts.filePath)) return issues;
30101
30107
  const matches = [];
30102
30108
  let m;
30103
30109
  PRINTLN_REGEX.lastIndex = 0;
@@ -48090,7 +48096,8 @@ var init_signal_strength = __esm({
48090
48096
  precision: 0.5583,
48091
48097
  lastCalibratedAt: "2026-07-01T00:00:00Z",
48092
48098
  verdict: "USEFUL",
48093
- _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).",
48099
+ defaultOff: true,
48100
+ _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). v0.21.2: marked defaultOff because precision 0.5583 < 0.60 floor (the v9.5 methodology in `docs/research/methodology-minimum-sample-size.md` sets the default-on threshold at P >= 0.60). At 55.8% precision, 44% of fires are false positives \u2014 too noisy to gate on. The rule stays available for opt-in via `rules: { 'ai/whitespace-regularity': 'low' }` in slopbrick.config.mjs. The 18 src/ self-scan fires are the typical noise profile.",
48094
48101
  aiSpecific: true,
48095
48102
  _v7Verdict: "USEFUL",
48096
48103
  _v7Lift: 7.71,
@@ -48438,7 +48445,8 @@ var init_signal_strength = __esm({
48438
48445
  precision: 0,
48439
48446
  lastCalibratedAt: "2026-07-01T00:00:00Z",
48440
48447
  verdict: "DORMANT",
48441
- _calibrationNote: "v0.19: new rule, not yet calibrated. v8.5 calibration does not run dup/* rules. Scheduled for v0.20 calibration on near-dup corpus.",
48448
+ defaultOff: false,
48449
+ _calibrationNote: "v0.19: new rule, not yet calibrated. v8.5 calibration does not run dup/* rules (the calibration script analyzes each file in isolation, but dup/* rules require cross-file state \u2014 the module-scope dedup cache is per-process, not per-file, so per-file analysis never produces cross-file matches and the rule's recall reads as 0). Scheduled for v0.22 calibration on the v9 corpus with a per-project dedup cache. v0.21.1 self-scan: 207 fires in src/ after WINDOW_SIZE 10\u219220 (was 575) \u2014 69% reduction. The actual precision/recall of these 207 fires is unverified ground truth. Default stays on because the rule's value is real (block-level duplications are a classic AI-fingerprint) and the corpus-measured 0.0 is a methodology artifact, not a real measurement.",
48442
48450
  aiSpecific: false,
48443
48451
  _v7Verdict: "DORMANT",
48444
48452
  _v7Lift: 1,
package/dist/index.js CHANGED
@@ -19,7 +19,7 @@ var VERSION;
19
19
  var init_header = __esm({
20
20
  "src/types/_header.ts"() {
21
21
  "use strict";
22
- VERSION = "0.21.1";
22
+ VERSION = "0.21.2";
23
23
  }
24
24
  });
25
25
 
@@ -29838,6 +29838,7 @@ var init_arraylist_vs_linkedlist = __esm({
29838
29838
  const issues = [];
29839
29839
  const source = facts.v2?._source;
29840
29840
  if (!source) return issues;
29841
+ if (!/\.java$/i.test(facts.filePath)) return issues;
29841
29842
  let m;
29842
29843
  NEW_LINKED_LIST_REGEX.lastIndex = 0;
29843
29844
  while ((m = NEW_LINKED_LIST_REGEX.exec(source)) !== null) {
@@ -29879,6 +29880,7 @@ var init_empty_catch_block = __esm({
29879
29880
  const issues = [];
29880
29881
  const source = facts.v2?._source;
29881
29882
  if (!source) return issues;
29883
+ if (!/\.java$/i.test(facts.filePath)) return issues;
29882
29884
  let m;
29883
29885
  SINGLE_LINE_EMPTY_CATCH_REGEX.lastIndex = 0;
29884
29886
  while ((m = SINGLE_LINE_EMPTY_CATCH_REGEX.exec(source)) !== null) {
@@ -29922,6 +29924,7 @@ var init_legacy_date_api = __esm({
29922
29924
  const issues = [];
29923
29925
  const source = facts.v2?._source;
29924
29926
  if (!source) return issues;
29927
+ if (!/\.java$/i.test(facts.filePath)) return issues;
29925
29928
  const flagged = /* @__PURE__ */ new Set();
29926
29929
  let m;
29927
29930
  LEGACY_IMPORT_REGEX.lastIndex = 0;
@@ -29995,6 +29998,7 @@ var init_raw_type_overuse = __esm({
29995
29998
  const issues = [];
29996
29999
  const source = facts.v2?._source;
29997
30000
  if (!source) return issues;
30001
+ if (!/\.java$/i.test(facts.filePath)) return issues;
29998
30002
  let m;
29999
30003
  RAW_TYPE_REGEX.lastIndex = 0;
30000
30004
  while ((m = RAW_TYPE_REGEX.exec(source)) !== null) {
@@ -30037,6 +30041,7 @@ var init_string_concat_loop = __esm({
30037
30041
  const issues = [];
30038
30042
  const source = facts.v2?._source;
30039
30043
  if (!source) return issues;
30044
+ if (!/\.java$/i.test(facts.filePath)) return issues;
30040
30045
  if (!/\b(for|while|do)\b/.test(source)) return issues;
30041
30046
  let m;
30042
30047
  STRING_CONCAT_REGEX.lastIndex = 0;
@@ -30080,6 +30085,7 @@ var init_system_out_println = __esm({
30080
30085
  const issues = [];
30081
30086
  const source = facts.v2?._source;
30082
30087
  if (!source) return issues;
30088
+ if (!/\.java$/i.test(facts.filePath)) return issues;
30083
30089
  const matches = [];
30084
30090
  let m;
30085
30091
  PRINTLN_REGEX.lastIndex = 0;
@@ -48069,7 +48075,8 @@ var init_signal_strength = __esm({
48069
48075
  precision: 0.5583,
48070
48076
  lastCalibratedAt: "2026-07-01T00:00:00Z",
48071
48077
  verdict: "USEFUL",
48072
- _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).",
48078
+ defaultOff: true,
48079
+ _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). v0.21.2: marked defaultOff because precision 0.5583 < 0.60 floor (the v9.5 methodology in `docs/research/methodology-minimum-sample-size.md` sets the default-on threshold at P >= 0.60). At 55.8% precision, 44% of fires are false positives \u2014 too noisy to gate on. The rule stays available for opt-in via `rules: { 'ai/whitespace-regularity': 'low' }` in slopbrick.config.mjs. The 18 src/ self-scan fires are the typical noise profile.",
48073
48080
  aiSpecific: true,
48074
48081
  _v7Verdict: "USEFUL",
48075
48082
  _v7Lift: 7.71,
@@ -48417,7 +48424,8 @@ var init_signal_strength = __esm({
48417
48424
  precision: 0,
48418
48425
  lastCalibratedAt: "2026-07-01T00:00:00Z",
48419
48426
  verdict: "DORMANT",
48420
- _calibrationNote: "v0.19: new rule, not yet calibrated. v8.5 calibration does not run dup/* rules. Scheduled for v0.20 calibration on near-dup corpus.",
48427
+ defaultOff: false,
48428
+ _calibrationNote: "v0.19: new rule, not yet calibrated. v8.5 calibration does not run dup/* rules (the calibration script analyzes each file in isolation, but dup/* rules require cross-file state \u2014 the module-scope dedup cache is per-process, not per-file, so per-file analysis never produces cross-file matches and the rule's recall reads as 0). Scheduled for v0.22 calibration on the v9 corpus with a per-project dedup cache. v0.21.1 self-scan: 207 fires in src/ after WINDOW_SIZE 10\u219220 (was 575) \u2014 69% reduction. The actual precision/recall of these 207 fires is unverified ground truth. Default stays on because the rule's value is real (block-level duplications are a classic AI-fingerprint) and the corpus-measured 0.0 is a methodology artifact, not a real measurement.",
48421
48429
  aiSpecific: false,
48422
48430
  _v7Verdict: "DORMANT",
48423
48431
  _v7Lift: 1,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slopbrick",
3
- "version": "0.21.1",
3
+ "version": "0.21.2",
4
4
  "description": "Discovered, modeled, and governed repository structure. SlopBrick scans source code, classifies it against 95+ rules in 15 categories, computes 4 scores (aiSlopScore: lower=cleaner, engineeringHygiene, security, repositoryHealth composite), and persists the structure for AI agents and CI.",
5
5
  "type": "module",
6
6
  "bin": {