Files
inkwell/android/config/detekt.yml
T
bvandeusenandClaude Opus 5.5 0a631219ee
CI & Build / Python lint (push) Successful in 2s
CI & Build / Build now, or wait for Android? (push) Successful in 3s
Android / Build, or is the channel already serving this? (push) Successful in 3s
Desktop (Tauri) / Build, or is the channel already serving this? (push) Successful in 2s
Desktop (Tauri) / Web tests, clippy, Rust tests and rustfmt (push) Skipped
Desktop (Tauri) / Tauri desktop (Linux) (push) Skipped
Desktop (Tauri) / Windows installer (cross-compiled) (push) Skipped
Desktop (Tauri) / Update manifest (push) Skipped
CI & Build / Web typecheck and unit tests (push) Successful in 9s
CI & Build / Python tests (push) Successful in 15s
Android / Core and FFI clippy and tests (push) Successful in 27s
CI & Build / integration (push) Successful in 1m39s
CI & Build / Build & push image (push) Skipped
Android / Kotlin + Rust (APK) (push) Successful in 7m55s
Android / Build the server image (push) Successful in 6s
Android comments describe the code to a stranger (#6223)
Milestone 546 "Bring the repo to the comment standard (rule 32) and
compose defaults (rule 198)", step #6223 "Comment standard sweep:
Android client".

KDoc, comments, manifest and resource notes, Gradle and TOML comments
and the ffi crate's docs now state what the code does and the
non-obvious why in the present tense. Issue, Scribe-note, milestone
(M13, M304, M315, M12) and family-idea references are gone, as are
comparisons to Minstrel and the narration of what used to be: the
capture sheet the editor replaced, the per-note colour story, the
operator's device-pass feedback, the bindgen-as-[[bin]] failure, the
0.60 edge alpha before it was re-solved, and the checker bugs behind
check-strings/check-symbols. Hazards stay as facts: the signing key that
can't be rotated, the alias that keeps the earlier name, PKCS12's single
password, unwind over abort, the UTC date-picker read, the
DerivedTint/colors.ts mirror.

One stale claim is gone: DerivedTint said the web had no test runner,
but notes/grammar.test.ts runs the same tint cases. detekt.yml said
"these two places" over a list of five.

49 files, comments only: a comment-stripping diff of every changed file
against HEAD is identical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 20:24:52 -04:00

81 lines
3.7 KiB
YAML

# Per-rule overrides layered on top of detekt's defaults
# (`--build-upon-default-config` on the CLI invocation in the Android lane).
#
# Failure is controlled by the CLI's exit code; detekt 2 has no `build:`
# top-level.
naming:
# Composables conventionally use PascalCase function names. Matches every
# mainstream Compose codebase, and mirrors the ktlint exemption in
# android/.editorconfig — the two tools have to agree or one of them is always
# wrong.
FunctionNaming:
ignoreAnnotated:
- "Composable"
style:
MagicNumber:
ignoreAnnotated:
- "Composable"
# Colour literals and dp constants are declared as named properties, which is
# exactly the "define it as a well-named constant" the rule asks for — the
# number simply appears in the declaration itself. Flagging
# `private val Brand = Color(0xFFF5C518)` would demand a constant holding the
# constant.
ignorePropertyDeclaration: true
complexity:
# Compose breaks the PREMISE of both rules below, not just their thresholds.
#
# * LongParameterList assumes a long list means an over-general function. A
# composable's parameters ARE its UI contract — Material's own TextField
# takes twenty — and collapsing them into a parameter object makes the call
# site worse, not better, because named arguments are what keep a Compose
# tree readable.
# * LongMethod assumes length tracks branching. A composable's length tracks
# how many ELEMENTS are on the screen; a full-screen editor with a title, a
# body, a checklist, labels and a reminder row is long because it renders
# five things, and cutting it into five one-call wrappers would add
# indirection without removing a single decision.
#
# Scoped to @Composable rather than disabled: on ordinary functions both rules
# are right, and one of them still fires below (see BoardViewModel).
LongParameterList:
ignoreAnnotated:
- "Composable"
LongMethod:
ignoreAnnotated:
- "Composable"
exceptions:
TooGenericExceptionCaught:
# Catching broadly is DELIBERATE in these places, and each site says so.
#
# * the ViewModel — a note that fails to save must become a visible error
# banner, never a crash. Narrowing this would mean an unanticipated
# failure takes the app down instead of being reported, which is strictly
# worse for the user.
# * the Application — the store failing to open is the one thing that must
# still let the app start, so it can explain itself.
# * the background Worker — it runs with nobody present, so an escaping
# exception is a crash report for a job the person never asked for. Every
# realistic failure there (no route, server down, token rotating) has the
# same right answer, which is Result.retry().
# * the reminder BroadcastReceiver — same argument, one step worse: it can be
# woken at 3am by an alarm or by BOOT_COMPLETED, and every path inside it
# has already logged its own failure by the time this catches anything.
# * the self-updater — the install path throws IOException from three
# different calls and SecurityException when the "install unknown apps"
# grant has been revoked since it was checked. All of them mean one thing
# to the person ("it did not install"), and none should take the app down
# while it is holding their notes.
#
# Scoped to those paths rather than disabled globally: elsewhere the rule is
# right and still applies.
excludes:
- "**/ui/**"
- "**/InkwellApplication.kt"
- "**/SyncWorker.kt"
- "**/ReminderReceiver.kt"
- "**/AppUpdate.kt"