# QA Checklist — 001 Public Grid Viewer ## Setup / Environment - [ ] App boots locally (Sail up, migrations run) - [ ] `npm run dev` works and page loads without console errors - [ ] Storage is writable (local/s3) and master image is accessible ## Grid Rendering - [ ] Master image renders at correct aspect ratio - [ ] Grid overlay aligns with master image (no offset) - [ ] Cell size matches config (e.g., 20px) and selection snaps to cell units - [ ] Zoom in/out works (mouse wheel + pinch on mobile) - [ ] Pan/drag works without jitter ## Selection Behavior - [ ] Drag selection produces correct rectangle (top-left, bottom-right) - [ ] Selection count equals `(w * h)` in cells - [ ] Selection cannot go out of bounds (clamped) - [ ] Clearing selection resets UI state cleanly ## Reservation Flow (if present) - [ ] Reserve request succeeds for free area - [ ] Conflict returns 409 and UI shows a clear error - [ ] Reserved area is visibly blocked in the grid - [ ] Holds expire after configured minutes (manual prune or scheduler) ## Status & Feedback - [ ] Sidebar updates live (cells, price, status) - [ ] User sees loading state while reserving/charging - [ ] Success/failure toasts (or inline messages) appear appropriately ## Performance / Stability - [ ] No “thousands of DOM nodes” grid rendering (canvas/konva only) - [ ] Page remains responsive when zooming/panning rapidly - [ ] No memory leak warnings in devtools during repeated interactions ## Security / Input Validation (basic) - [ ] Server rejects invalid payloads (missing coords, negative sizes, too-large selection) - [ ] Server maps pixels → cells consistently (tested) ## Regression - [ ] `./vendor/bin/sail artisan test` passes - [ ] `./vendor/bin/sail artisan pint` produces no unexpected changes (after formatting pass)