# 核销表 · 第8环 审核 > 90分级验收(孙总方法论·硬门禁)。已吸收独立交叉验证修正(⚠️)。auto=机器判定,human=目视。 > ⚠️审计结论:原清单 S1-S6 全部"描述了但代码里没有"——即这是**待执行**清单,不是已完成。落点行号经核对基本准确。 ## 模块目标 ①Sidebar 死链清零 + 加审核台入口 ②组长待审队列(通过/打回带原因) ③打回回路闭环(operator 能感知重选)。 ## Ralph 修改步骤 | # | 改什么 | 落点 | |---|--------|------| | S1 | 删4条死链(/tasks /images /tasks/build /tasks/list),加 `{label:'审核台',href:'/review',roles:['supervisor','admin'],icon:'✅'}`,共5条全有页面 | Sidebar.tsx:19-28 NAV_ITEMS | | S2 | _fmt_task return dict 末尾加 `reject_reason`/`review_status`(均可None);模型 task.py:50-55 已有字段直接引用 | tasks.py:58-64 | | S3 | TaskListItem 加 `reject_reason?:string\|null` + `review_status?:'pending'\|'approved'\|'rejected'\|null` | dto.tasks.ts:8-16 | | S4 | 状态 span 下加 `{task.reject_reason &&
打回:{task.reject_reason}
}`(需先 S3) | RecentTasksBar.tsx:49-61 | | S5 | h2 后插3个 Tab(待审/已通过/已打回),已通过→router.push('/history?status=approved'),已打回→rejected;顶部 import useRouter | review/page.tsx:54-57 | | S5b | ⚠️审计补:history/page.tsx 改 `useSearchParams` 初始化 statusFilter,否则跳来后筛选器停"全部"(A7假通过) | history/page.tsx:26 | | S6 | useEffect setCurrentTask 后补 GET /tasks/{id} 取 reject_reason 存 state;ProgressBar 下、FlywheelBanner 上插红色 alert 横幅(需先 S2/S3) | tasks/[id]/text/page.tsx:23-25 | ## 验收清单(做完一个勾一个) - [ ] **A1**〔auto〕Sidebar 无死链:`grep -n href Sidebar.tsx` 不含四条死链且含 '/review'。 - [ ] **A2**〔auto〕待审队列可用:supervisor GET /api/v1/review/queue → code=0 且 data.items 是数组。 - [ ] **A3**〔auto〕通过写库正确:`SELECT status,review_status,approved_at,reviewer_id FROM generation_tasks WHERE id=