QI Console Reports
Canned Custom Views
Saved views
Deadlines this month
7 columns · 3 filters
Open files by coordinator
5 columns · grouped
Funds held > $1M
6 columns · 1 filter
View builder
Unsaved changes
Exchange # Exchanger Type Status Coordinator 45th Day 180th Day Days to deadline Funds held Sale close Created
Status=Active 45th DaywithinNext 30 days Coordinator=All
Showing 6 of 41 matching files · updates as you change columns and filters refreshed just now
Exchange # Exchanger Type Coordinator 45th Day Days to Deadline Funds Held
EX-2026-1187 Matt Belcher Delayed T. Bottenberg Aug 17, 2026 3d $1,120,000
EX-2026-1204 Rosa Alvarez Delayed T. Bottenberg Aug 20, 2026 6d $685,000
EX-2026-1216 Evelyn Cho Delayed T. Bottenberg Aug 26, 2026 12d $925,000
EX-2026-1162 Dana Whitfield Reverse M. Reyes Aug 28, 2026 14d $2,340,000
EX-2026-1226 Hank Barrow Delayed T. Bottenberg Sep 4, 2026 21d $1,410,000
EX-2026-1198 June Calloway Improvement D. Park Sep 9, 2026 26d $760,000
Every column, every filter, your view — export anytime.
Build contract — custom report builder
1 · Tokens, never hex. Every colour resolves from docs/mockups/tokens.css. The [PROPOSED] tokens used here (--console-rail-*, --admin-*, --hub-id-*, --hub-purchase-*, the good/warn/bad triad) get added to packages/web-app/src/index.css under :root and .dark before this is coded — never inlined at the call site. Light and dark are both designed.
2 · Saved views are rows in Supabase, not localStorage. A view is configuration a coordinator relies on across devices and sessions; the column set, filter set, name and ordering are business state and persist server-side under the tenant's RLS policies. A cross-tenant view is impossible by construction, not by a WHERE clause in the query builder.
3 · The preview obeys the caller's row-level permissions. "6 of 41 matching files" is 41 files this user may see. The builder must never widen scope: adding a column or dropping a filter cannot surface a file the coordinator could not already open.
4 · Countdown colour is a summary, never the source of truth. The cd chip renders days remaining against the statutory 45- and 180-day dates held on the exchange. It is computed server-side from those dates and is read-only here — no control in this builder edits a deadline. A clock that has passed renders in the bad role with an explicit "over" label; it may never render as a satisfied or green state.
5 · Every run and every export writes an audit-log entry — actor, view definition, row count, timestamp. The footer states this, so the implementation must actually emit it. Exports carry the same NPI restrictions as the screen: no SSN, no DOB, ever.
6 · Filters are structured, not free-text. Each token is a {field, operator, value} triple validated by a Zod schema at the API boundary and compiled to a parameterised query. Unknown fields are rejected rather than passed through.
7 · Scheduling reuses the existing report schedules rather than introducing a second scheduler — the run itself is a Vectr workflow, not an in-app cron.
All exchange numbers, names and amounts on this surface are synthetic demo data.