Inbox
Home presents new work, last touched reviews, news since the previous visit, and role-specific queues. These reads use projections and event rows.
Data and pagination
The dashboard server page calls queryInbox using the saved page-size cookie.
The client uses viewport-derived sizing, clamped to 1–100. Each section has its own page
offset. A section-only request avoids requerying the other lists; totals come from SQL.
Page clamping handles a shrinking result set.
| Section | Source |
|---|---|
| New | Active index rows with no examiner-open time. |
| Last touched | Staff/team touch rows; flag-only epoch timestamps are excluded. |
| Since last visit | Events in the visit watermark window. |
| Queue | Index rows in awaiting states for the actor role. |
The shared SQL scope limits program and examiner/team visibility. PEC inbox adds awaiting-PEC state. QueuePane uses the same API in 14-row windows. Review URLs come from UUID keys.
News and read state
Review append derives events from changes to assignment, workflow, documents, appointments
and decisions. Recipients and IDs are computed in inbox-events.ts. Event read
state differs from review read_version and from the Home visit watermark: opening a
review, reading a notification, and marking Home seen are separate operations.
The notification provider polls every five minutes and on focus/visibility/custom refresh events. Preferences filter event kinds. Its full unread count can exceed the capped list of 100 events. Home also refreshes periodically when visible; there is no live stream. Clear uses a through timestamp so later news remains unread.
Changing inbox behavior
Keep snapshots out of these queries. Check examiner/team scope, pagination after rows disappear, watermark windows, and retry-safe event IDs. OperationsPreview is static explanatory content, not live counts. Multiple mounted polling surfaces can make separate requests; measure traffic before adding another timer.