CLAUDE.md: build/test gotchas from the cyclic-taper + backup sessions

Six recurring, non-obvious learnings: Gradle config-cache corruption fix,
Room NOT NULL-column migrations needing @ColumnInfo(defaultValue), the
scrypt wf=15 rationale (do not bump to 18), Compose dialogs not being
adb/uiautomator-tappable (verify via instrumented tests), backticks
breaking git commit -m, and wireless adb port rotation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Ole-Morten Duesund 2026-06-11 22:19:50 +02:00
commit dfb7c5a826

View file

@ -58,6 +58,10 @@ The name says the brief: nag me to take the dose *now*.
- Room 3 (`androidx.room3`) is alpha — stay on Room 2.x. `room-ktx` is merged into `room-runtime`.
- androidx security-crypto is fully deprecated — SettingsStore is our own Keystore wrapper instead.
- No appcompat: `?attr/colorControlNormal` doesn't exist; Compose tints icons via LocalContentColor.
- Gradle config-cache can corrupt → `BuildOperationInvocationException (no error message)`;
fix: `rm -rf .gradle/configuration-cache` (it's not a code error).
- A migration that ADDs a NOT NULL column needs `@ColumnInfo(defaultValue = "0")` on the entity,
else Room's migration validation fails (exported schema has no default, the ALTER does).
## Load-bearing — change with care
- The reminder subsystem is the reliability core. After any change, re-verify: alarms
@ -75,6 +79,8 @@ The name says the brief: nag me to take the dose *now*.
- kage is trusted only because CctvScryptVectorTest passes — keep the vendored CCTV
vectors green when bumping kage.
- Doctor PDF formatting is locale-pinned to nb; the default locale prints English month names.
- Backup scrypt work factor is 15, not age's default 18 — 18 needs ~256 MiB and OOM-crashes
on-device; `largeHeap` only covers DECRYPTING foreign wf-18 files. Don't bump it back.
## Out of scope — don't add without asking
Caregiver/"Team" alerts, multi-profile, Health Connect, streaks/gamification,
@ -99,5 +105,11 @@ All gradlew calls need `JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64` — system
unscoped.** Every `adb` call gets `-s <serial>`; connected tests get
`ANDROID_SERIAL=emulator-<n>`. The build fails connected* tasks without an emulator
serial — that guard stays. The phone is never a test target.
- Can't drive Compose dialogs via adb/uiautomator (esp. with the soft keyboard up — it
reports phantom button nodes and taps don't land). Verify dialog flows with instrumented
tests (see the backup round-trip / migration tests), not screen tapping.
- `git commit -m`: no backticks — bash command-substitutes `` `word` `` inside double quotes
and eats it. Use single-quoted or plain messages.
- Wireless adb port rotates between sessions; rediscover with `adb devices` / `adb connect <ip:port>`.
See @README.md for architecture detail.