From dfb7c5a826e51c6713952f02957295d2d767cf85 Mon Sep 17 00:00:00 2001 From: Ole-Morten Duesund Date: Thu, 11 Jun 2026 22:19:50 +0200 Subject: [PATCH] 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 --- CLAUDE.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 2e12abf..802d134 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 `; connected tests get `ANDROID_SERIAL=emulator-`. 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 `. See @README.md for architecture detail.