LLM slop discipline: duplicated helpers, dead exports and unread bindings, hostname-sniffed environments, careless text matching, collapsed boolean states. Born from 1,368 Bugbot findings across 182 reviewed PRs.
| Severity | Check | Catches |
|---|---|---|
| info | identical-helper-body-in-two-modules |
A function body identical (literals included) in two modules — consolidation suggestion, not a proven defect |
| info | environment-guessed-from-hostname-substring |
Environment routing by hostname substring with a fixed fallback |
| info | boolean-collapsed-into-three-state |
A nullish-defaulted boolean collapsed into a two-way ternary feeding a three-state domain |
| warning | prefix-overlapping-substring-match |
An OR-chain of substring tests whose literals overlap by prefix |
| warning | named-import-without-reference |
A named import with zero references — value, JSX, and type positions all resolve |
| info | export-without-any-consumer |
A named export with no consumer found — bounded review candidate, not deletion authorization |
| info | unread-local-binding |
A non-exported local binding never read in its file |
| info | unanchored-abbreviation-regex |
A short case-insensitive regex tested against text without word boundaries |
Blind spots (the short version)
- Helpers: named function declarations and expressions are compared; bodies must be identically equal, and trivial bodies are ignored. Doctors and build output are exempt.
- Dead exports: host-resolved module identities include tests, generated consumers, types, barrels, dynamic imports and declared public entries. Unresolved namespaces/configuration and undeclared external loading remain review questions.
- Bindings: the engine resolves value, JSX and type positions. A masked whole-word guard preserves unsupported identifier uses without counting comments, strings or regex literals as usage.
- Hostname, substring, tri-state and regex checks use shared call/value facts,
so multiline formatting does not change the answer. The substring check
requires the same lexical receiver; the regex must be a direct literal used
as the actual
.test()receiver or.match()argument. - URL parsing, configured-base-URL-first flows, switches, interprocedural
defaults and compiled
RegExpobjects remain outside the supported shapes. - All eight checks need shared analysis; without it they narrow to silence and the report says so.
The full list prints in every report this doctor appears in.