2026-05-31 · Platform
Analytics — multi-chart canvas
- A canvas pins N saved insights at coordinates on a 12-column grid — compose once, load in one click. Closes the Mixpanel/Amplitude boards parity gap end-to-end.
- Backend: migration 0065 adds `platform.analytics_canvases` (jsonb layout array, cap 50 entries by schema). Service `runCanvas` executes pinned insights in parallel via the existing per-kind dispatcher; deleted insights collapse to `result=null + error` so the grid stays stable.
- Routes: `GET/POST /canvases`, `GET/PATCH/DELETE /canvases/:id`, `GET /canvases/:id/run`. Literal `/run` registered before `/:id`.
- Dashboard: `/dashboard/analytics/canvases` list + `[canvasId]` grid renderer with edit mode (pin/unpin from saved-insights library, resize 1/4 → 1/3 → 1/2 → 2/3 → full). New "Canvases" tab beside Boards.
- Schema validation in shared: `canvasLayoutEntrySchema` bounds (uuid insightId + x/y/w/h grid units).