Build1 publisher3 min readPublished
A dev.to post argues that assistant-written Kotlin breaks between files rather than inside them. Its own worked example, a nine-dependency ViewModel with an empty catch block, is already covered by detekt defaults nobody has to enable.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Take the worked example the post uses: a nine-dependency ViewModel with an empty `catch` block sitting in `main` right now [10]. `LongParameterList` ships with `constructorThreshold` set to 7 [13]. Nine constructor arguments is two over a line detekt already draws [2], and `SwallowedException` is active by default as well [7]. Neither rule needs the compiler's type information; the author singles out `UnsafeCallOnNullableType` as the one default-on rule that does [8][1]. That class in `main` is evidence that a correctly configured file-scoped tool either produced a finding nobody acted on or never ran, rather than evidence that file-scoped tools are blind.
Which is why the four explanations matter more than the rule list, and only one of them is about rule coverage: a Gradle task no pipeline calls, a `detekt-baseline.xml` entry, an unread report, or a pipeline invoking `detekt` rather than `detektMain` [10]. The report is produced either way. Opening it is not a Gradle task.
The cross-file half of the argument survives that. Patterns 1, 5 and 8, in the post's numbering, share a shape: the file is internally fine and the violation is its relationship to a decision made elsewhere, so the check needs the whole source tree as its input [16]. Tightening a per-file threshold does not reach those, which is the basis for the claim that adding more local rules buys you almost nothing [4]. Tightening still buys something for the file-local ones: moving `LargeClass` from the default 600 lines to 250 removes 350 lines of allowance [12][13][3], and the shipped default was never an encoding of any team's review standard [12].
What would have to be true for the framing to transfer to your repo. The claim is that an assistant makes local mistakes far less often than a tired human and instead emits code that is defensible in the file you are looking at and wrong only against a decision made somewhere else [2], so there is no line to underline and the review passes [3]. The post argues that from a pattern list sorted by which level catches each item [16], not from measured defect counts [20]. It also assumes the defects themselves are old, and that what changed is the rate plus the level of tool required [5][6]. Both of those are plausible and neither is quantified here.
The cost asymmetry is the part I would act on. Level 1 needs no new tool and no new CI step: read the baseline, confirm you are on a task that does type resolution, and set thresholds that match what the team would actually accept [15]. Everything above it, by the post's own ordering, costs more to stand up [16]. On this evidence the cheap gate has to be shown to fire before the expensive one is worth buying, because a tightened threshold in a config no pipeline reads changes nothing but the diff.
Ranked by verification strength, evidence, and original report placement.
ktlint, detekt and Android Lint are local tools: they answer questions about one file, often one function, and catch local mistakes such as a null dereference, a leaked scope or a wrong operator.
The post concedes nothing on its defect list is new: God ViewModels, layer leaks and tests that assert their own mocks were in Android code review checklists years before anyone shipped an LLM.
detekt's LongParameterList, LargeClass, SwallowedException and TooGenericExceptionCaught rules are all active by default; nobody has to turn them on.
UnsafeCallOnNullableType is active by default too, but it needs type resolution: detekt must see the compiler's type information to know the receiver was nullable. The plain detekt Gradle task does not provide that; detektMain and detektTest do.
The post gives four explanations for a nine-dependency ViewModel with an empty catch block sitting in the main branch: detekt is not actually running in CI; a detekt-baseline.xml is suppressing it; the defaults are firing and nobody reads the report; or the pipeline runs detekt rather than detektMain, leaving every type-resolution rule silently inert.
The baseline is the common explanation: someone added detekt to a project that already had thousands of violations and generated a baseline so CI could go green. A baseline suppresses by signature, has no expiry, and now sits underneath a steady stream of machine-written code.
Publishers with included, body-backed reporting in this cluster.
1 article · September 6, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
"No key, no SDK" is not a guarantee on Android: the manifest merger gets there first1 publisher
build
One game, two codebases: where parity belongs when you ship native on iOS and Android1 publisher
build
Renovate opens the PR, Gradle's checksum verification fails the build1 publisher
build
An ADR routes refund eligibility to three plain-Java rules the CI can actually assert1 publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Verifiable in a build file, unverified here
The configuration specifics are precise enough to be falsifiable in minutes: four rules named as default-on, a 600-line LargeClass limit, a seven-parameter constructor threshold, the split between the detekt and detektMain tasks, and the 2.0 renames to allowedConstructorParameters and allowedLines. What no part of our coverage supplies is a number behind the central argument about where assistant code fails, and one author carries all of it.
No measured usage
The two statements that touch real-world uptake, that almost everyone is on detekt 1.23.x and that the nullable-call rule has never fired on many projects, arrive without a survey, a repository sample or one named project. Nothing in our coverage records a release, a deployment or a pipeline anyone inspected.
Framing outruns the worked example
The headline argument is that a new tier of whole-repository checks is needed because linters cannot see the defect. Then the example chosen to illustrate it, a nine-dependency ViewModel with an empty catch block, trips two rules detekt already runs by default. The author partly owns this by making level 1 pure configuration, which keeps the gap modest rather than large.
Nothing disclosed either way
The piece recommends Konsist and states no relationship to it, for or against. With a single author, no disclosure line and no second account of the same story, there is no incentive structure to weigh rather than an absent one to report.
Single author, self-checking claims
One community post, one author, no corroboration. Confidence stays mid-range rather than low because the load of the piece falls on assertions that fail loudly when wrong: anyone who switches from detekt to detektMain either sees new findings or does not. The unverifiable claims are the sweeping ones about how many teams live with an inert rule set.