Step 22 - hardening pass
1 min read
Run a hardening pass over the whiteboard. Work through this checklist and fix what fails:
Accessibility:
- Toolbar and all icon buttons: aria-labels, visible focus states, full keyboard operability; the canvas itself gets an aria-label describing the board.
- Dialogs trap focus and close on Escape; the minimap is keyboard-navigable; color choices meet WCAG AA against their grounds; run an AXE pass over library, canvas chrome, and dialogs.
- prefers-reduced-motion: verify focus-glide, confetti, laser trails, reaction floats and presentation transitions all degrade to instant/still.
Performance:
- Confirm the single rAF-coalesced render effect is the only repaint path; no stray per-event draws.
- Verify caches: note font-fit cache (capped 2000), decoded image cache, presence throttle 55 ms + 4 s heartbeat, draft downsampling at 200 points, self-terminating cursor animation loop on idle boards.
- Load-test with a 500-element board: pan/zoom must stay smooth; if not, profile the painters first.
Robustness:
- Rejected-write rollback paths all show a toast; killing the network mid-session recovers on reconnect.
- Opening a deleted/nonexistent board shows a friendly "board not found" screen, not an infinite loader.
- Undo concurrency guard: verify with two windows per prompt 07.
- Emulator rule tests: guest write blocked under editLocked, presence/vote uid spoofing rejected, comment moderation matrix.
Tests:
vitest specs exist and pass for every pure module - geometry/hit-testing, note fit, eraser clipping, distribute/arrange, connection routing, undo inverse round-trip, and all AI layout kinds.
Finish with a short ARCHITECTURE.md: the collection layout, the flat-element + one-doc-per-element decision, paint bands, the optimistic write model, and the AI structure-not-coordinates rule - the five things a future contributor must not accidentally undo.
Discussion
0 commentsNo comments yet. Start the discussion.