summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/detection-findings.md39
1 files changed, 39 insertions, 0 deletions
diff --git a/docs/detection-findings.md b/docs/detection-findings.md
index 9898dfd..8f5cea7 100644
--- a/docs/detection-findings.md
+++ b/docs/detection-findings.md
@@ -945,3 +945,42 @@ the state file, uncomputed.
figures above are computable from `state.json` for every show. A show whose gaps straddle zero
has no usable yardstick and arguably should not publish a subtraction-derived `ad` either.
3. Whether #188's 89-second span is actually advertising. Needs a listen, not a measurement.
+
+## 2026-11-03: a quarter of the whisper budget was re-doing work
+
+Retention was publication date and nothing else. `Show.Partition` kept the newest N and everything
+else was pruned, and pruning called `words.Forget`, which deletes the transcript *file* as well as
+the state's record of it. So an episode outside the window was fetched on demand, recognised,
+served, and deleted again on the next poll -- and asking for it a second time paid the whole cost
+over.
+
+Measured from the live server's journal over twenty-one days:
+
+| | |
+|---|---|
+| transcription runs | 397 |
+| distinct episodes | 309 |
+| first-time work | 25.7 h |
+| **repeat work** | **7.7 h — 23% of all whisper time** |
+
+The mechanism, confirmed in the code rather than inferred: `serveRequest` mirrors an on-demand
+episode and `detect`s it, but nothing records that anybody wanted it, so the next feed poll
+partitions by date and prunes exactly what was just fetched. For a back catalogue -- the archive
+tier, the slow-drip shows, the listening this feature was for -- every episode cost a full
+recognition and resuming one cost another.
+
+**The window now decides what is worth fetching and being asked for decides what is worth
+keeping.** `Episode.RequestedAtUnix` is stamped on every `/api/episode` call, mirrored episodes
+included, because resuming something played last month must not let it fall out mid-listen.
+`Partition` spares anything asked for in the last 28 days -- the same span `refetchAfterSeconds`
+uses, being the same kind of judgement about how long something stays interesting.
+
+Disk makes this cheap in the right direction: transcripts are 36MB for 445 files, audio is 17GB
+for 336 episodes, and the volume has 365GB free. The expensive artefact is the small one.
+
+### Still open
+
+The phone's half. A `pending` reply is retried only on a feed refresh -- the 5am alarm, launch, or
+the button -- so an episode the server will have in about a minute stays "waiting for server"
+until the next refresh. That, rather than anything on the server, is what makes "not checked yet"
+a state a listener sees.