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.
- package/dist/engine/worker.cjs +10 -2
- package/dist/engine/worker.js +10 -2
- package/dist/index.cjs +11 -3
- package/dist/index.js +11 -3
- package/package.json +1 -1
package/dist/engine/worker.cjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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,
|
package/dist/engine/worker.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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": {
|