- Cost-panel custom row order now syncs across devices โ closes the named rev-126 next-sprint candidateRev 126 shipped the localStorage-backed primitive on the rev-57 cost-by-source / rev-52 cost-by-assignee / rev-66 cost-by-tag panels. Until rev 127 the order was per-device โ an operator who reordered the per-source panel on their laptop saw the default sort again on their phone. Rev 127 mirrors the order onto the rev-78 dashboardPrefs JSONB so the order follows the operator across machines. Same dual-layer pattern as the rev-78 panel-collapse multi-device sync: localStorage stays as the write-through cache for sync render so the dashboard never blocks on a network round-trip; server JSONB is the source of truth for cross-device drift; every order change fires a fire-and-forget PUT to /api/workspace/dashboard-prefs to keep the server JSONB authoritative. New `costPanelOrder?: { source?: string[]; assignee?: string[]; tag?: string[] }` field on `DashboardPrefs` with per-axis 50-ID cap (matches the rev-126 localStorage cap exactly so the two layers never disagree). Wired through the dashboard `/api/workspace/dashboard-prefs` Zod schema + the v1 `/api/v1/workspace/dashboard-prefs` mirror in lockstep โ the cadence pattern from rev 37 onwards continues unbroken into rev 127.
- useCostPanelOrder hook gains serverInitialOrder prop + isCrossDeviceSynced flagThe rev-126 hook in `src/lib/cost-panel-order.ts` now accepts an optional `serverInitialOrder` prop passed in from the server-rendered dashboardPrefs.costPanelOrder. On mount, server JSONB wins over localStorage when both are present (this is the cross-device sync path โ Machine A wrote a new order, Machine B's localStorage is stale). When `serverInitialOrder` is an empty array (operator clicked Reset on Machine A), the hook clears localStorage on Machine B too. The new `isCrossDeviceSynced` boolean on the hook's return shape drives the rev-127 'synced across devices' hint chip on every cost panel's reset row. All three cost panels (cost-by-source, cost-by-assignee, cost-by-tag) consume the prop + flag in lockstep so the multi-device sync vocabulary reads consistently across all three operator-direction surfaces.
- OpenAPI typed coverage for the rev-127 costPanelOrder field โ typed lockstep with the dashboard primitiveThe cadence pattern from rev 78 onwards (every dashboard prefs field gets typed in the OpenAPI 3.1 spec in the same cycle it ships) holds unbroken into rev 127. Both the GET response shape and PUT request body now type the new `costPanelOrder` field with the per-axis 50-ID cap inline. The OpenAPI spec changelog header gains a rev 127 block explaining the multi-device sync pattern and how the field closes the named rev-126 candidate. MCP-host code generators reading the spec see one consistent contract for cross-device sync of cost-panel ordering. The MCP server (Q3 #1) gains one more pre-typed surface with nothing left to design on the cost-panel-order axis at either authentication model.
- Visual polish โ 'synced across devices' chip + brand-color accent on the rev-126 reset hintCumulative micro-polish (every rev 22+ has carried at least one). The rev-126 'Custom order applied ยท Reset' hint now surfaces a tiny inline state chip โ brand-color teal 'ยท synced across devices' when the order is mirrored to the server JSONB, muted-grey italic 'ยท saved on this device' when only localStorage carries it (e.g. a rev-126-era client that hasn't been updated yet, or a network failure on the fire-and-forget PUT). Tooltip on the synced chip explains 'Saved to your account โ this order follows you across devices' so operators know the order is portable. Distinct visual states with brand-color accent on the load-bearing case so the operator's eye reads success without the chip having to scream. New `.ld-cost-order-sync` + `.ld-cost-order-local` CSS classes scoped to the rev-126 hint row.