Issue 23482 — Linux, Node v26.12.1, current main 5ffe045931 Isolated temporary databases only; never wrote live state. Reporter script, copied verbatim from issue: $ cd packages/shared $ node repro-wal-gate.ts worker checkpointWorker=true: outside reader holds a read transaction write 552 STALLED for 5s+ (WAL 39.3 MB) outside reader closed; next write took 273 ms $ node repro-wal-gate.ts noworker checkpointWorker=false: outside reader holds a read transaction all 1500 writes finished with the reader open (WAL 106.9 MB) Red regression test, test-only commit 9ab6ed54f8: keeps admitting writes while an outside read transaction pins the WAL AssertionError: write 39 is held by admission while an outside reader pins the WAL (41517272 bytes, journal_size_limit 33554432) Repeated 3/3 with same failure by reproduce-test child. Real dev server: vp run dev at /home/ubuntu/wt/issue-23482 Isolated .t3 state, seeded read-only from developer snapshot; 65.2MB, six stopped threads. Healthy initial startup, GET /api/orchestration/shell HTTP 200 in 34 ms; browser loaded sidebar and thread. Stopped server before preparing issue_23482_wal_fixture table. Outside read-only BEGIN+SELECT held; separate fixture writer filled WAL 92.58 MiB. Restarted vp run dev with read open: Vite ready, backend did not reach Listening; HTTP /api/orchestration/shell returned503. Released outside reader at 08:37:55 UTC; backend reached Listening 08:38:02 UTC, shell HTTP 200 in 37 ms at 08:38:03 UTC. Caveat: red-test edits also triggered dev watcher restarts during this attempt; clean red test and literal script above provide primary proof. Clean runtime repeat (no watch mode): Started the real server entrypoint with explicit isolated --base-dir .t3, --port 15661, --no-browser. External reader pinned WAL 46.29 MiB before server startup. After 15 s: no Listening log; GET /api/auth/session HTTP 503 in0.006251s. Committed and closed external reader. Backend completed startup at 08:42:09.894 UTC; GET /api/auth/session HTTP 200 in0.017010s. Stopped only the server process owned by this test. Selective old-TRUNCATE regression (supplied by test child; not rerun by evidence auditor): With only the old finishTruncate restored, readerAfter=38 fails: AssertionError: write 39 is held by admission while an outside reader pins the WAL (41517272 bytes, journal_size_limit 33554432) The original readerAfter=0 case passes in that selective restoration. Source was restored afterward; focused suite returned 18/18 passing.