docs(specs): record what shipped, and where the design bent

DR-242 … DR-247 are in. The spec now says so rather than reading as a proposal
for work that already exists.

One deviation is recorded rather than quietly absorbed: DR-246 called for the
engines to own seek strategy outright, and they cannot — re-negotiating a
stream needs the repository, which sits above them. The engine declares the
ability and the caller acts on it. `determine_video_seek_strategy` therefore
survives, correctly typed over a declared capability instead of over a guess,
because the defect was its input rather than its existence.
This commit is contained in:
2026-08-22 22:23:20 +02:00
parent 9d6b4f819c
commit 954546434a
+15 -1
View File
@@ -1,6 +1,11 @@
# Spec: MediaPlayer — one controller API, three interchangeable engines # Spec: MediaPlayer — one controller API, three interchangeable engines
**Status:** Proposed **Status:** **Partially implemented.** DR-242 … DR-247 have shipped: the
contract, `FakePlayer` and the conformance suite, `MpvPlayer`, the standalone
runner, `LegacyPlayer`, the controller port, the capability-driven seek
strategy, and ExoPlayer conformance on a device. What is left is DR-248 (the
webview as an engine) and DR-249 (deleting `PlayerBackend` and the frontend
playback-state flags).
**Requirements:** UR-081 (new) → DR-242 … DR-249 (new); IR-034. Re-check **Requirements:** UR-081 (new) → DR-242 … DR-249 (new); IR-034. Re-check
`requirements.md` before allocating — ids moved several times while this was `requirements.md` before allocating — ids moved several times while this was
written. written.
@@ -226,6 +231,15 @@ Strangler, not a rewrite. Each step ships independently and leaves the app worki
behind an adapter so the other engines keep working. behind an adapter so the other engines keep working.
5. **DR-246** Move seek strategy and reload orchestration out of 5. **DR-246** Move seek strategy and reload orchestration out of
`commands/player/mod.rs` into the engines; delete `seek.rs`'s truth table. `commands/player/mod.rs` into the engines; delete `seek.rs`'s truth table.
**Shipped with a deviation.** The engine cannot own this outright:
re-negotiating a stream needs the repository, which sits *above* the engine.
So the engine *declares* `seeks_transcoded_in_place` and the caller acts on
it. That removes the defect — nobody guesses on another component's behalf,
and adding an engine no longer means editing a shared table — without
pretending an engine can reach upward. `determine_video_seek_strategy`
survives as a correctly-typed decision over declared abilities rather than
being deleted; the defect was its *input*, not its existence.
6. **DR-247** `ExoPlayerPlayer`; conformance on device. 6. **DR-247** `ExoPlayerPlayer`; conformance on device.
7. **DR-248** `WebviewPlayer`; retire the adapter shim. 7. **DR-248** `WebviewPlayer`; retire the adapter shim.
8. **DR-249** Delete `PlayerBackend` and the frontend playback-state flags. 8. **DR-249** Delete `PlayerBackend` and the frontend playback-state flags.