Skip to content

Fix unread navigation loading entire message history - #740

Merged
witbrock merged 1 commit into
mainfrom
codex/von-4eff93cd8a5e6645
Sep 17, 2026
Merged

witbrock merged 1 commit into
mainfrom
codex/von-4eff93cd8a5e6645

Conversation

@witbrock

Copy link
Copy Markdown
Member

Merge decision: ready — unread navigation seeks directly to a bounded window instead of loading the entire exchange, preserving scoped access and history navigation.

User outcome

“Jump to first unread” no longer walks every historical page. In the matched 1,000-message browser fixture it falls from 2.08–2.62 seconds (19 requests, 1,000 rendered messages) to 66–77 ms (one request, 50 rendered messages). Native task: #V#task_agent_43536ba9d1dd211b359a0cf4709f8707.

Material changes

The existing exchange endpoint locates the earliest unread using the same actor/group/organisation/deletion scope, then returns a bounded chronological window with earlier/later cursors. The pane preserves pending position and retry, suppresses disconnected latest-page polling while reading an earlier window, and supports explicit return to Latest message. No schema/index migration or represented write.

Evidence

  • 24 backend exchange/route tests pass, including authenticated actor routing, visibility, unread gaps, equal-time and both-direction pagination.
  • 26 frontend exchange tests pass; changed-module static lint passes.
  • Production frontend/CSS Playwright fixtures pass at 390/1280 px: unread navigation/read receipts and the matched latency comparison.
  • Full scope, source-image hash and timings: docs/engineering/unread_message_latency_2026_09_17.md.

Ship boundary

Minimum ship criteria are removal of full-history traversal, correct chronological target and preserved bounded navigation/read state. Wrong actor/group visibility, skipped message ranges or broken retry would block shipment; tests found none.

Public database/network latency remains unmeasured: these browser timings use synthetic HTTP responses with 50 ms latency. There is no prepared live browser profile bound to this checkout. This limits the public under-one-second claim, not the demonstrated client traversal improvement. No deployment is requested or included. No secrets or runtime data committed.

@witbrock
witbrock merged commit 2932708 into main Sep 17, 2026
2 checks passed
@witbrock
witbrock deleted the codex/von-4eff93cd8a5e6645 branch September 17, 2026 16:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant