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