- Panel order UI affordance โ up/down chevrons close the named rev-82 next-sprint candidateRev 82 shipped the `panelOrder` schema + protocol foundation; rev 83 closes the loop with the in-app affordance. New โฒโผ buttons next to the rev-77 collapse chevron on every panel head let operators promote a panel up the order or demote it down. Visual ordering applied via CSS `order` (works on grid + flex children) so we don't mutate the DOM tree โ panels in `panelOrder` get `order: idx - 60` (negative offset so they sort BEFORE unordered panels); panels not in the array stay at their default DOM position. Persisted to localStorage (sync render) + the rev-82 `panelOrder` JSONB on `workspace_member.dashboardPrefs` (cross-device sync). The control group fades to 0.55 opacity by default and emphasises on panel hover so the controls don't scream from every panel head when the user isn't interacting. Pairs with the rev-39 density toggle (panel padding) + rev-77/78 collapse (panel inventory) as the third axis of dashboard tuning. The dashboard now has all three axes: padding (rev 39), inventory (rev 77/78), and order (rev 83).
- Per-user default sort for the Active Work queue โ closes the named rev-82 forward-compat candidateRev 82's running state 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 closes the second. New optional `activeWorkSort?: 'smart' | 'priority' | 'due' | 'recent'` field on `DashboardPrefs`. Default 'smart' preserves the rev-29/22/21 default behaviour (focus โ due โ priority โ updated). The other three give power-users direct control: 'priority' sorts by manual priority desc, 'due' sorts by deadline asc with no-due last, 'recent' sorts by most-recently-touched first (kanban-style). Pinned (rev 23) + needs_input tasks always come first regardless of sort mode โ they're operator-attention buckets, not a sort axis. New `ActiveWorkSort` client component renders a tiny dropdown right above the Active Work panel head (doesn't need a settings section). 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**: closes the second rev-82 forward-compat candidate. Power-users with strict deadline workflows now get due-first ordering with one click; teams running kanban-style backlogs get recently-updated first. The smart default stays correct for everyone else.
- Per-subscription outbound webhook test (closes rev-19 + rev-17 test-surface gap)Rev 17 shipped the single-URL outbound test against `workspace.outboundWebhookUrl`. Rev 19 made outbound a real per-event router (subscriptions, delivery log, retry). Until rev 83 there was no way to test individual rev-19 subscriptions โ the rev-17 test only fired the legacy URL, leaving operators with rev-19 subscriptions unable to verify wiring without waiting for a real production event. Rev 83 closes the gap. New `testOutboundSubscription()` helper in `src/lib/outbound.ts` fires an `artifact.test` payload to the specific subscription's URL using the workspace's `webhookSigningSecret` (so the HMAC signature matches what the endpoint will see in production). Records the attempt in `outbound_webhook_delivery` so the rev-19 delivery log shows it alongside production deliveries. New `POST /api/workspace/outbound/{id}/test` route + matching `POST /api/v1/outbound/subscriptions/{id}/test` v1 mirror in lockstep. New 'Send test' button on every subscription row in the OutboundSubscriptions panel (gated to active subscriptions). **Strategic significance**: closes the per-subscription test parity gap on every channel โ UI, dashboard API, v1/MCP, OpenAPI. The cadence pattern from rev 37 onward continues: ship the dashboard primitive + the v1 mirror + the index entry + the OpenAPI typed schema in lockstep.
- Bug fix: dashboard outbound subscription Zod schemas synced to ALL_OUTBOUND_EVENTSFound while shipping the rev-83 per-subscription test endpoint: the dashboard's `POST /api/workspace/outbound` and `PATCH /api/workspace/outbound/{id}` Zod schemas had been hard-coded to four rev-18 events (`artifact.ready`, `artifact.approved`, `signal.created`, `task.assigned`) since rev 19. Meanwhile the rev-73 grouped picker UI surfaces 30+ events including the entire cost-spike alarm cluster, chronic warnings, and closure receipts. Operators picking newer events in the picker hit a silent 400 'Invalid subscription payload.' on save. The bug was masked because the rev-81 v1 mirror used `ALL_OUTBOUND_EVENTS` correctly, so MCP hosts could create subscriptions but dashboard users couldn't. Rev 83 fixes both dashboard endpoints to mirror `ALL_OUTBOUND_EVENTS` exactly. **Strategic significance**: silent bug fix. Until rev 83, every operator who tried to subscribe to a rev-26+ event via the dashboard was hitting the 400 silently โ the picker showed all 30+ events as available, the save call failed, the operator's subscription never landed.