ALL-1874 PR-3: Frontend — ResolutionRules tab in DataReviewPage (list + workspace config)
completed## Context
Linear issue ALL-1874. First frontend PR. Can be developed in parallel with PR-2 (testRule) since it only consumes the already-existing queries: `resolutionRules`, `workspaceResolutionConfig`, `updateResolutionRule` (enable/disable toggle), `updateWorkspaceResolutionConfig`.
## Key files
- `apps/dashboard/components/pages/DataReviewPage.tsx` — add "rules" tab to TABS array and DataReviewTab union type
- `apps/dashboard/components/pages/DataReviewPage/` — create new RulesTab.tsx here (same pattern as AutoFixedTab.tsx, ReviewLogTab.tsx)
- Existing GraphQL fragments/hooks: check `apps/dashboard/graphql/` or `apps/dashboard/hooks/` for any existing resolutionRules hook; if none exists, create `apps/dashboard/hooks/useResolutionRules.ts`
- `apps/dashboard/graphql/identity/` — add resolutionRules.gql and workspaceResolutionConfig.gql query files if not present; check codegen output
## UI spec (Rule List tab)
### RulesTab: top section = WorkspaceConfig toggles
- Toggle for `ruleAutoApply` on/off (label: "Auto-apply rules")
- Show `aiThreshold` as read-only info (editing aiThreshold is out of scope for this PR)
- Call `updateWorkspaceResolutionConfig` mutation on toggle
### RulesTab: bottom section = Rule list table
- Use existing `DataTable` component pattern (same as other tabs)
- Columns: Name, Issue Type, Field, Matcher (summary), Transform (summary), Priority, Enabled toggle, Actions (Edit | Delete)
- For platform-default rules (workspaceId==null): show badge "Platform default"; disable Delete button; Edit disabled (non super-admin)
- Enabled toggle calls `updateResolutionRule({ id, enabled })` inline
- Reorder: show priority as editable inline number input (no drag-and-drop in this PR — that is a follow-up)
- Add rule button opens the RuleEditorModal (stub in this PR — clicking "Add rule" can show a toast "Coming soon" or open an empty modal shell; full editor is PR-4)
- Delete calls `deleteResolutionRule` with a confirm dialog
## Acceptance test
- RulesTab renders in a Storybook story or snapshot test with mocked data (3 workspace rules + 1 platform default)
- Enable/disable toggle fires updateResolutionRule mutation
- ruleAutoApply toggle fires updateWorkspaceResolutionConfig mutation
- Platform-default rule shows badge and delete button is disabled
## Notes
- Do NOT implement the editor form in this PR — that is PR-4
- DataReviewPage.tsx tabs: change `type DataReviewTab = "queue" | "review-log" | "auto-fixed" | "change-log"` to add `| "rules"`
- Add `{ id: "rules", label: "Rules" }` to the TABS array
- No new backend work needed — all GraphQL operations already exist from prior PRs
Event Timeline
created
status_change
queued → in_progress
failed
lease expired — re-queued for retry
in_progress → queued
status_change
queued → completed