summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CLAUDE.md25
1 files changed, 25 insertions, 0 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index d6160d3..e78257a 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -76,6 +76,14 @@ claims three separate times across these repos.
touched in the same diff. Room tracks by version; a wrong migration corrupts a real,
non-reproducible library.
+## State
+
+Phase 1 is built: subscribe (share sheet, pasted URL, OPML import), refresh, download, queue,
+play, variable speed, sleep timer, retention. 182 unit tests plus instrumented tests.
+
+**Not built yet:** everything in phase 2 — the rule engine, slow-drip subscriptions, and
+intro/outro skipping. Schema fields for manual skip offsets exist but nothing reads them.
+
## Domain notes worth keeping
- **Playback position is the crown jewel of the data model.** It must survive process death. Save
@@ -105,3 +113,20 @@ claims three separate times across these repos.
- **Gradle is pinned to 8.14.3, not 9.x**, because Chaquopy 16.1.0 calls `org.gradle.util.
VersionNumber`, removed in Gradle 9. Chaquopy 17 moved to AGP 9.x; going there means bumping
AGP, Gradle and Chaquopy together. This is the one deliberate divergence from FeeDreader.
+
+## Things a future session should know
+
+- **The coverage gate has been overridden four times**, each recorded in the commit message. All
+ four are Android-framework glue that cannot execute off-device: the Chaquopy bridge,
+ PlaybackService, ChaquopyYouTubeSource, PlayerConnection and the two Workers. Each time the
+ gate fired it was a useful prompt — it drove PositionWriter onto a narrow Playhead interface
+ and pulled RetentionSweeper out of its Worker, both of which found or prevented real bugs.
+ If the exceptions keep accumulating, the honest fix is a jacoco exclusion for framework
+ adapters, which is a decision for Peter rather than something to slip in.
+
+- **Detekt config has been relaxed five times**, all documented inline in `config/detekt/detekt.yml`.
+ Twice the better answer was restructuring instead: `Screens.kt` was split per screen and
+ `ListenViewModel` was split into library and player halves rather than raising a limit again.
+
+- **Feeds are big.** A real subscription in testing produced 2753 episodes in one refresh. Any
+ per-episode work — a query in a loop, an O(n²) match — needs to be considered at that scale.