- Per-row column visibility on cost panels โ closes one of the two remaining rev-82 forward-compat candidatesRev 82 named four forward-compat candidates for dashboard-prefs: panel order, default sort, per-row column visibility on cost panels, per-recipient Slack quiet hours. Rev 83 closed the first two; rev 84 closes the third. New optional `costPanelColumns?: { source?: string[]; assignee?: string[]; tag?: string[] }` field on `DashboardPrefs`. Each list is *subtractive* (defaults visible) โ operators with dense cost panels (50+ rows after a busy quarter) can hide trajectory sparklines, spike pills, token counts, or task counts they don't actively triage on. Recognised column ids: `trajectory` (rev-60 sparkline), `spike-pill` (rev-58 โก pill), `tokens` (meta tokens count), `task-count` (meta task count). Per-axis (source / assignee / tag) so an operator who wants the trajectory visible on the per-task axis but hidden on the per-source axis can express that. Capped at 30 hidden columns per axis. Wired into all three cost panels (CostBySourcePanel, CostByAssigneePanel, CostByTagPanel) so the schema field is load-bearing on the dashboard surface immediately. Also wired into both `/api/workspace/dashboard-prefs` and `/api/v1/workspace/dashboard-prefs` Zod schemas in lockstep, plus typed in the OpenAPI 3.1 spec. **Strategic significance**: the dashboard now has all four axes of dashboard-prefs forward-compat closed across rev 82/83/84 โ panel order, default sort, per-axis column visibility (rev 84). The remaining rev-82 candidate (per-recipient Slack quiet hours) sits naturally for rev 85+ since Slack pushes go to a workspace-wide webhook so per-recipient mute would need to map onto per-event surfaces like assignment/mention-ack rather than the brief push.
- DELETE /api/workspace/dashboard-prefs + v1 mirror โ reset all preferences to defaultsNew primitive that pairs with the rev-78 multi-device sync as the 'back to defaults' affordance. Until rev 84, an operator who accidentally hid too many panels via rev-77 collapse + rev-82 panelOrder + rev-84 costPanelColumns had to enumerate each field individually to restore. Rev 84 collapses that to one DELETE. Clears every rev-77/79/82/83/84 prefs field so all panels show, panels are in default order, active-work sort is smart, and all cost-panel columns are visible. New `DELETE /api/workspace/dashboard-prefs` (viewer+ โ operator can only reset their own prefs) + matching `DELETE /api/v1/workspace/dashboard-prefs?userId=โฆ` v1 mirror in lockstep. **Strategic significance**: cumulative trust signal โ every operator-tunable layer on the dashboard now has a clean reset path. Foundation for a rev-85+ 'reset to defaults' UI affordance.
- OpenAPI spec coverage expansion to integration observability + procurement evidence cluster โ closes the named rev-83 next-sprint candidateRev 83's running state explicitly named 'OpenAPI spec coverage expansion to the outbound deliveries + retry endpoints' as the rev-84 candidate. Rev 84 closes that โ and pairs it with the rest of the integration + procurement-evidence cluster: `/outbound/deliveries` GET + `/outbound/deliveries/{id}/retry` POST (rev-46 v1 endpoints with no typed schema), `/workspace/export` GET (rev-45 โ full procurement takeaway), `/workspace/import` POST (rev-41 โ categorical append), `/workspace/cost-export` GET (rev-62 โ cost CSV), `/workspace/summary` GET (rev-43 โ procurement panel), `/workspace/tag-search` GET (rev-40 โ cross-entity drill-down), `/sources/preview` POST (rev-40 โ silent-failure prevention), `/workspace/dashboard-prefs` DELETE (rev-84 โ new). The OpenAPI spec now covers the integration observability cluster, the procurement evidence cluster, the cost-axis cluster, the discussion + reactions + focus surface, the workspace-config cluster, the team-management surface, and the load-bearing core. **Strategic significance**: every dashboard primitive that operates on the protocol-bound side now has a typed schema for code generators + MCP hosts. The MCP server (Q3 #1) gains typed contracts for outbound observability + procurement evidence โ the two surfaces procurement-conscious B2B buyers care about most.
- Cumulative cost-panel polish โ uniform row hover + meta typography across the three cost panelsUntil rev 84 each cost panel had slightly different row padding + meta spacing. The new rev-84 hidden-column primitive (`dashboardPrefs.costPanelColumns`) means row content is now genuinely variable per operator preference, so the underlying typography needs to compose cleanly across any subset of {trajectory, spike-pill, tokens, task-count}. New unified `.ld-cost-{axis}-meta` styling (flex + gap + uniform color + min-height) so a row with all four columns shown reads identically to a row with only one. Plus subtle row-hover treatment on all three cost panels so they read as scannable rather than static โ same hover lift the rev-22+ design-language thread established. Cumulative micro-polish (every rev 22+ has carried at least one).