docs: tighten F6 dashboard render budget to 350ms

1s was too soft; reads already return in ~20ms at 2k rows. Set the target to
350ms across DESIGN and the checkpoints.
This commit is contained in:
Julien Calixte
2026-05-28 00:24:02 +02:00
parent e5c002547f
commit c6b991646a
2 changed files with 4 additions and 4 deletions

View File

@@ -31,7 +31,7 @@ Strength weights used in matrices: **9** strong, **3** medium, **1** weak, blank
| F3 | Suggest existing projects (creatable, deduped) | ↑ | 0 retypes for known projects; new ones persisted |
| F4 | Render the red-dot defect map legibly | → | Readable to a cap (~812 visible dots/section, then "+N more") |
| F5 | Show verbatim detail without leaving the board | → | Modal open/close; board stays visible |
| F6 | Render the dashboard quickly at expected volume | ↓ | ≤ ~1s for up to ~2,000 defects |
| F6 | Render the dashboard quickly at expected volume | ↓ | ≤350ms for up to ~2,000 defects |
| F7 | Deliver a push promptly after a defect is filed | ↓ | ≤ ~10s to subscribed devices |
| F8 | Enroll & maintain push subscriptions | → | Multiple devices; survives re-subscribe |
| F9 | Gate every request behind Google SSO + server-side domain check | → | 100% of routes; `hd` never trusted alone |
@@ -56,7 +56,7 @@ Strength weights used in matrices: **9** strong, **3** medium, **1** weak, blank
- **F5** Show verbatim without leaving the board _→ modal_
- **How**: click a section/dot → modal lists that section's defects (date, project, reporter, verbatim); a reverse-chronological feed sits alongside
- **Component**: C6 VerbatimModal + Feed
- **F6** Dashboard renders quickly _↓ ≤1s @2k defects_
- **F6** Dashboard renders quickly _↓ ≤350ms @2k defects_
- **How**: server returns per-section counts + a bounded recent slice; full section history fetched lazily on modal open
- **Component**: C7 server API, C8 schema
- **G3** Owner notified promptly on phone _W:7_
@@ -150,7 +150,7 @@ Cells: link strength (9/3/1/blank). Importance = `Σ(goal weight × strength)`.
| 3 | F9 auth coverage | 100% of routes gated | Integration test hitting routes unauthenticated | Default-deny middleware; block deploy if a route leaks |
| 4 | F4 dot legibility | Readable to the cap | Seed N defects on one section, eyeball | Lower the visible-dot cap / tighten "+N more" threshold |
| 5 | F7 push latency | ≤10s to device | File a defect, time the phone | Accept the delay; show an in-app unread badge as fallback (no retry queue) |
| 6 | F6 dashboard render | ≤1s @ ~2k defects | Seed 2k rows, measure render | Add index on (section_id, created_at); precompute section counts |
| 6 | F6 dashboard render | ≤350ms @ ~2k defects | Seed 2k rows, measure render | Add index on (section_id, created_at); precompute section counts |
| 7 | F10 durability | 0 data loss on redeploy | Redeploy on Coolify, verify data present | Restore from Coolify's automatic Postgres backup; block launch until verified |
## 8. Tradeoffs — Got / Paid / ADR

View File

@@ -19,7 +19,7 @@ review.
- [x] **T6** Defects read API: feed + per-section counts (C7) — F6 (M) — _deps: T3_
- [ ] **T7** Dashboard DotMap (C5) — F4 (M) — _deps: T2, T6_
- [ ] **T8** VerbatimModal + Feed (C6) — F5 (M) — _deps: T6, T7_
- [ ]**Checkpoint:** dashboard dot map + feed + modal work, ≤1s @2k, human review
- [ ]**Checkpoint:** dashboard dot map + feed + modal work, ≤350ms @2k, human review
## Phase 4 — Authentication (G4)
- [ ] **T9** Google OAuth + session + domain-check middleware (C9) — F9 (M) — _deps: T1, retrofits T5_