# J-PLAY-11 deadline follow-up Branch `test/j-play-11-deadline`, linked to issue #421. Based on origin/master `ab4b07ceeaed59407b099641d00a3689e81c84f8`. Head `e41cbb4a964580b5ad5af3d23c199360d112efae`. ## Changes V-415b traced the qualifying checkpoint to the second disk write, about 20 seconds after the episode click. The old 20-second test deadline left only a few hundred milliseconds for polling and I/O. The test now allows 30 seconds and still requires a saved position of at least 5 seconds, preserving the later restore assertions. The requested one-line comment explains the second-write timing. For a playing episode, playbackOver now observes once, sleeps for gapMs, and observes once more. Paused episodes retain their full observation window and early failure on any change. Playback advancement and paused-state assertions remain unchanged. The offline test no longer compares the request count of a stopped server, which could not observe later request attempts. It still proves the server is unreachable, cached episodes can be browsed, the downloaded audio plays locally and advances, and an uncached podcast shows the expected failure notice. The future-schema test waits for the explicit unsupported-schema notice instead of sleeping for 200 ms. It still compares persisted data exactly and requires no ready plugin or registered show command. These are the two requested leftovers; neither is deferred. ## Mutation One M5 invocation on real Obsidian 1.14.4, with the verifier's 4-second rewind on browse, clamped to zero and scheduled after 600 ms. Command `npm run test:e2e -- -t '#355 audio keeps playing'` failed #355 at the intended assertion: `on the podcast grid: seconds advanced: expected 0.5213329999999999 to be greater than 1`. One failed, 76 skipped, exit 1. The failure capture was opened and inspected; it shows the podcast grid. Source was restored byte-for-byte before the commit and all later validation. The PR contains no src changes. ## Validation Seven gates, two full suites and five isolated J-PLAY-11 commands run sequentially at the same committed head. Results are in results.json and per-command logs. The isolated runs record data.json changes every 250 ms in jplay11-N-data.jsonl. This trace observes disk state and does not alter plugin behavior. All commands use Node v22.23.2 through `fnm exec --using 22 --`, TMPDIR=/data/home/tmp/podnotes-qa2, and this worktree's isolated vault. The default app is the official user-local Obsidian 1.14.4; the floor run sets PODNOTES_OBSIDIAN_APP=/opt/Obsidian/obsidian for 1.13.7. XDG_RUNTIME_DIR is unset. OBSIDIAN_BIN=/usr/bin/false checks that the runner supplies the selected app's CLI. No test retries are configured or invoked. ## Scope and review Four test files, 21 insertions and 12 deletions. No product, navigation, dependency or published-doc changes. Mechanical edits and diff review were performed in-thread using the verifier's supplied contract. Fix Root Causes changes the deadline to fit the measured write schedule rather than weakening the progress threshold. The coordinator owns independent verification and merge. ## Final results - `npm run lint`: exit 0, 3.569 s. - `npm run format:check`: exit 0, 0.88 s. - `npm run typecheck`: exit 0, 0.656 s. - `npm run build`: exit 0, 1.571 s. - `npm run test`: exit 0, 14.061 s, 1714 passed (1714). - `npm run test:tooling`: exit 0, 8.161 s, 10 passed (10). - `npm run docs:build`: exit 0, 5.706 s. - `npm run test:e2e` on 1.14.4: exit 0, 261.686 s, 77 passed (77). - `npm run test:e2e` on 1.13.7: exit 0, 253.704 s, 77 passed (77). - `npm run test:e2e -- tests/e2e/journey-playback.test.ts -t J-PLAY-11` on 1.14.4: exit 0, 29.813 s, 1 passed | 10 skipped (11). - `npm run test:e2e -- tests/e2e/journey-playback.test.ts -t J-PLAY-11` on 1.14.4: exit 0, 29.657 s, 1 passed | 10 skipped (11). - `npm run test:e2e -- tests/e2e/journey-playback.test.ts -t J-PLAY-11` on 1.14.4: exit 0, 30.255 s, 1 passed | 10 skipped (11). - `npm run test:e2e -- tests/e2e/journey-playback.test.ts -t J-PLAY-11` on 1.14.4: exit 0, 31.114 s, 1 passed | 10 skipped (11). - `npm run test:e2e -- tests/e2e/journey-playback.test.ts -t J-PLAY-11` on 1.14.4: exit 0, 31.476 s, 1 passed | 10 skipped (11). Both full suites ran the same 77 unique tests across 12 files. Application tests passed 1,714 tests in 99 files; tooling passed 10 tests; both Svelte checks reported zero errors and warnings; docs links and all 112 legacy fragments are valid. M5 was the sole intentionally failing invocation. The five disk traces show the first progress write below five seconds and the qualifying write at approximately 20 seconds after the first observed episode-selection write. Exact values are in checkpoint-summary.json. These are data.json mtime differences sampled every 250 ms, not a direct measurement of the mouse click or an exact poll-deadline margin. The mechanism is the five-second checkpoint sampling and ten-second disk-write cadence identified by V-415b. All seven runtime invocations stopped their instances; each cleanup dry-run reports no owned PIDs. The tracked tree is clean. No additional fix or retry occurred.