canvas-query-cache.tsfix(canvas): stop a stale getCanvases cache from reverting saved view configs
A canvas viewConfig save wrote to the server but left the pre-save row in the
cached canvas.getCanvases response. The store rehydrates from that query on
every consumer mount, and it is persisted to IndexedDB, so remounting or
reloading inside the staleTime window put the old config back — and the next
save then wrote that stale config to the server, losing the change for good.
The existing dirty-flag guard only covers the window while a save is in flight.
Saves now patch the cached rows, and upsertCanvas rejects any snapshot older
than the one it holds, which also closes the in-flight-refetch race.
Also default new kanban boards to CRM-synced deals only when a CRM is
connected: the default existed for the list canvas, but the kanban branch never
had it and /pipeline's create path called buildCanvasViewConfig without the
hasCrmConnected option, so nothing created there got it.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 4, 2026, 3:47 PMtop-deals.tsfeat: context column is the ~2/3 main panel; rename Top Deals -> Deals that need attention
AppShell: the context column holds ~2/3 (chat ~1/3) on /agent-at-rest and whenever
an artifact is open (was chat-dominant / 50-50); other routes unchanged. Renamed the
Top Deals canvas marker+title to 'Deals that need attention' (server + client);
jesse's existing canvas retitled in place.
Co-Authored-By: Claude Opus 4.8 (1M context) <<email>>Jul 26, 2026, 10:59 PM