summaryrefslogtreecommitdiff
path: root/CLAUDE.md
diff options
context:
space:
mode:
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md34
1 files changed, 30 insertions, 4 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index bca2a68..ab38a4b 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -94,6 +94,9 @@ claims three separate times across these repos.
6. **Schema migrations** — if `AppDatabase.kt`'s `version` changed, a migration test must be
touched in the same diff. Room tracks by version; a wrong migration corrupts a real,
non-reproducible library.
+7. **Exported schemas are append-only** — a commit that *modifies* an existing
+ `app/schemas/**/*.json` is refused. Adding a new one is how a version bump is supposed to
+ look; changing an old one means the record of what is on the phone has been overwritten.
## State
@@ -108,8 +111,10 @@ library and voice search. 207 unit tests plus instrumented tests covering the me
title, duration, age and season, and actions to queue top/bottom, mark played, auto-download, or
pin a speed. `RuleEngine` decides, `RuleApplier` carries it out, `RuleSummary` describes a rule
in one line, and every claimed episode records which rule fired and why.
-- **Track 2, slow-drip archives — not started.** Includes walking RFC 5005 `prev-archive` pages;
- `ParsedFeed.previousArchiveUrl` is already parsed and tested and nothing consumes it.
+- **Track 2, slow-drip archives — done.** Per-show cadence (`DripSchedule` decides what is owed,
+ `DripReleaser` pays it out), a released-set the show and Android Auto both list, and
+ `FeedArchiveWalker` following RFC 5005 `prev-archive` pages to fetch a back catalogue. A drip
+ release always enqueues and deliberately bypasses the rule engine.
- **Track 3, simple skip — not started.** Manual per-show offsets (`skipIntroMs`/`skipOutroMs`
exist on `SubscriptionEntity` and nothing reads them) and Podcasting 2.0 chapter JSON via
`EpisodeEntity.chaptersUrl`, which the parser already captures.
@@ -194,8 +199,12 @@ library and voice search. 207 unit tests plus instrumented tests covering the me
for whatever version is declared, so editing `EpisodeEntity` while the database still says
`version = 1` silently overwrites `schemas/1.json` with the new shape. That file is the only
record of what is on the phone, and once it matches the new code the migration test validates
- happily against a schema that never existed. It happened building the rules table; the fix was
- `git checkout -- app/schemas/`.
+ happily against a schema that never existed.
+
+ This happened twice in one session -- once building the rules table, once building drip --
+ the second time *after* writing this warning down. Step 9 of the pre-commit hook now refuses a
+ commit that modifies an already-committed schema JSON, because a note was demonstrably not
+ enough. If it fires: bump the version first, then `git checkout -- app/schemas/`.
- **The migration test needs two pieces of plumbing that fail obscurely.** `MigrationTestHelper`
reads the exported schemas from the instrumented test APK's assets, so `schemas/` is wired into
@@ -215,6 +224,23 @@ library and voice search. 207 unit tests plus instrumented tests covering the me
episode screen is absent from the dump and plainly visible in a screenshot. Treat a missing
line in a dump as inconclusive, not as absence.
+- **A bare `Switch` has no name.** It announces nothing to TalkBack and `android-ui tap` cannot
+ find it, so both toggles carry an explicit `contentDescription` -- and the drip one says "Turn
+ slow drip on or off" rather than "Slow drip", because a description identical to the heading
+ beside it makes the tap ambiguous.
+
+- **`connectedDebugAndroidTest` can wipe the app's data.** A run cleared `listen.db` on the
+ emulator mid-session. It is the test harness's install path, not a migration: a real v2
+ database seeded with a subscription, an episode at position 424242 and a rule was upgraded in
+ place by launching the v3 build, and all three survived with drip defaulting to off. Do not
+ read an empty database after an instrumented run as a migration failure -- but do check.
+
+- **The drip released-set is a query parameter, not stored state.** `observeVisible`/`getVisible`
+ take `dripEnabled` and hide unreleased episodes only when it is true, so switching drip off
+ restores the whole catalogue without touching a row, and switching it back on resumes where it
+ left off. `getForSubscription` deliberately still returns everything: feed reconciliation must
+ see held-back episodes or it re-inserts them on every refresh.
+
- **XML comments cannot contain `--`.** The house prose style uses it constantly and it makes
the manifest unparseable, with a merge error that doesn't name the line.