Repository navigation
test(e2e): intermittent J-PLAY-11 playback checkpoint timeout #421
Description
J-PLAY-11 intermittently times out before restarting Obsidian because it does not observe a playback checkpoint of at least 5 seconds within its 20-second wait.
Observed while validating PR #415 at 441eef3a949273e1b42072ff74c860643e4c79a8, after merging master 3d7cc6e. The V-415 playback-window correction passed its rewind mutation proof; this failure is at a different checkpoint wait.
Reproduction and results
Headless Linux, Node v22.23.2, the isolated podnotes-test-e2e-hardening vault, Obsidian 1.14.4 from the official user-local install. Run TMPDIR=/data/home/tmp/podnotes-qa2 fnm exec --using 22 -- npm run test:e2e. The runner explicitly selects its CLI; the run also set OBSIDIAN_BIN=/usr/bin/false to check that selection.
- First 1.14.4 suite passed 77/77. Its parent validation driver received SIGTERM, but detached Vitest finished; cleanup was performed explicitly.
- Obsidian 1.13.7 passed 77/77, complete command exit 0.
- Repeating the full 1.14.4 command to verify normal wrapper completion produced 76/77, exit 1. No individual-test retries were enabled. J-PLAY-11 was the sole failure; all other tests, including Playback stops when browsing away from the player #355 and the fix: make podcast name lookups exact and safe #413 journeys, passed.
The failing test is tests/e2e/journey-playback.test.ts:198. After seeding Journey Playback and starting Long Listen, it waits for library.progress(...).seconds >= 5 on disk. It failed with:
a playback checkpoint of at least 5 s on disk (data.json never matched): WaitForTimeoutError: Timed out waiting for condition after 20000ms.
Evidence and hypothesis
Logs, mutation proof, failure capture, state snapshots and hashes. The failed run is run-1.14.4-retry.log; its captured state is in remaining-flake/.
At capture time, podnotes-data.json has Journey Playback::Long Listen with time: 15.064597, duration: 60, and finished: false. The screenshot shows about 19 seconds in the player. Both runtime errors and console messages are empty. The local feed was http://podnotes.test:44271/playback/feed.xml, with a 60-second WAV at /playback/1.wav.
Hypothesis, not established: checkpoint scheduling or the poll deadline races with a late disk write. PlayerController samples checkpoints at its throttle interval; DataFileWriter waits 10 seconds after the most recent save and can reschedule when another save starts. The successful checkpoint in the post-timeout snapshot is consistent with a late write, but the capture cannot establish exactly when it landed. Instrument the sampled disk values and writer timing before changing the timeout or persistence behavior.
No additional fix or rerun was attempted, per the coordinator's stopping rule. The instance was stopped and the cleanup dry-run reported no owned PIDs.
Activity