Estimate: 55m · Type: code · Depends on: 2.9.1, 2.9.2
Build the archived work items view + per-item Restore, at the placement 2.9.1 decides, reading 2.9.2.
IssueListPager, the issues-row vocabulary, and the empty/loading states).unarchiveWorkItem in components/issues/actions/workItemActionsClient.ts (→ DELETE /api/work-items/[id]/archive → workItemsService.unarchiveWorkItem). Do not add a new write path — the service/route/MCP already exist.CreateIssueProvider.issuesChangedAt-style tick the board/issues watch; otherwise router.refresh() the server surfaces. Wait on the unarchive 200 before asserting persisted state.useProjectAccess().canEdit, matching the shipped assertCanEdit); view per the 2.9.1 decision.unarchiveWorkItem. Component test covers render + restore (page-state) + gating; per-file coverage gate holds.design/work-items/ archived asset) · 2.9.2 read path (listArchivedWorkItems)components/issues/actions/workItemActionsClient.ts (unarchiveWorkItem); app/api/work-items/[id]/archive/route.ts (DELETE = unarchive)app/(authed)/issues/_components/IssueListPager.tsx, WorkItemRowActions.tsx (row vocabulary + notifyIssuesChanged tick pattern)motir-core/CLAUDE.md § "Page state after a mutation" + § "E2E waits on the authoritative signal"