- AGENTS.md:补「前端测试界面线」条目(状态 + 开工入口三件套) - docs/memory/MEMORY.md:仓库地图 web/ 由「不存在」订正为「已实现并入库」; 「下一步开发」与「当前优先级」中的 web/ init 待办改为已完成 - docs/memory/TODO.md:前端入口待办勾选并注明落地为第四线 - docs/项目框架设计/开发计划-前端测试界面.md:测试报告「不入库」订正为已入库 - 事实订正:docs/测试报告/ 仅含 generate_report.js + 52 张截图, Word 报告 .docx 实物不在仓库(需跑脚本现生成) - 本地交接文档(交接文档.md / 交接文档-前端测试界面.md,均在 .gitignore 内)同步订正: 原「一律不提交」口径作废,改为 §2「入库状态」节
30 KiB
开发计划 · 前端测试界面(web/)
文档状态:v1.2(第二阶段增补:T-10~T-14,上游 = PRD v1.2 §9 + 架构 v1.2 §8)· 2026-09-12(v1.1 = 同日第一阶段定稿,T-0~T-9 已全部完成收官)
环境基线:Node v24.19.0 / npm 11.17.0(2026-09-12 实测,满足 Vite 7 要求 20.19+/22.12+)· 后端 pytest 基线 849 passed / 8 skipped
上游依据:PRD-前端测试界面.md v1.2(§9 = 二期需求)· 架构设计-前端测试界面.md v1.2(§8 = 二期设计,独立评审通过 2026-09-12)· README「前端接入契约」·
交接文档.md§A.2红线(每个任务收尾必查):
app/、tests/、scripts/零改动(git status三查);契约问题一律挂账上报(PRD §8 G1~G2 未解,前端如实呈现),不走私改。
§1 前置与基线
| 项 | 内容 |
|---|---|
| 质量门命令(每任务收尾三查) | ① npm run build 零 TS 错误;② npx vitest run 全绿;③ git status 确认 app/ tests/ scripts/ 无变更 |
| 后端启动(联调用) | uvicorn app.main:app --reload → GET /health;前置检查:确认后端处于 debug 头可用形态(APP_ENV=development 且未配 jwt_public_key_path——若配了 RS256 公钥,通道 A 全 401,会被误判为前端 bug);演示数据前置见 R-5 |
| 依赖渠道核对(T-0 首件事) | npm view @ant-design/pro-components version(+ dist-tags):latest 已是 3.x → 直接装;仍为 2.8.x → 装 @next tag 并知会用户;子包 peer warning(#9629)属预期不阻断 |
| 基座模板 | npm create vite@latest web -- --template react-ts(Vite 7 线) |
§2 任务总览(串行开发,单人单线,顺序即依赖序)
| 任务 | 内容 | 依赖 | 规模 |
|---|---|---|---|
| T-0 | web/ init + 工程骨架 + 四路由占位 |
— | M |
| T-1 | 身份上下文(类型/快照/请求头/矩阵数据)+ 工具函数(idGenerator) | T-0 | M |
| T-2 | HTTP client + 统一错误链路 | T-1 | M |
| T-3 | App 骨架(ProLayout + 顶栏工具条 + 探活横幅) | T-2 | S |
| T-4 | SSE 解析器 + streamChat | T-2 | M |
| T-5 | 对话页 ChatPage | T-3, T-4 | L |
| T-6 | 身份面板 IdentityPage + 对话×身份联调 | T-5 | M |
| T-7 | 基金转换页 ConvertPage | T-2, T-3, T-6 | L |
| T-8 | 风控预警台账 AlertsPage | T-2, T-3, T-6, T-7 | M |
| T-9 | 全局走查 + 后端回归复核(= 第 6 步集成测试入口) | 全部 | S |
| T-10 | 【二期】P5 适当性校验页(api + labels 纯函数 + 徽标组件 + 页面 + 历史区) | T-2, T-3 | M |
| T-11 | 【二期】P6 AML 扫描页(api + 确认弹窗 + 摘要卡 + 联动入口) | T-12(T-2/T-3 为一期基座沿用) | S |
| T-12 | 【二期】台账页 URL 参数预填(联动承接) | —(纯增量,可先行) | S |
| T-13 | 【二期】六页 GUI 全功能走查 + 截图收集(= 第二阶段集成测试) | T-10~T-12 | L |
| T-14 | 【二期】Word 测试报告产出 + 交接文档更新 | T-13 | M |
二期依赖说明:T-11 依赖 T-12 是因为联动跳转目标(
/alerts?alert_type=aml自动查询)由 T-12 提供——实现顺序推荐 T-12 → T-10 → T-11(T-12 最小且独立);T-10 与 T-12 无依赖可并行,单人单线按推荐序串行(R-1)。依赖列中的 T-2/T-3 为一期已完成基座沿用,非当期串行前置。二期各任务完成后回写架构 §7 实现状态表(实际产出文件清单一并登记,含 T-10 允许的 HistoryPanel 弹性拆分)。
§3 逐任务(范围 / 改法 / DoD)
T-0 工程骨架
范围:web/ init 全目录(架构 §3 目录树一次建齐,含占位空文件);依赖安装;vite.config / tsconfig / vitest.config / eslint;src/main.tsx(ConfigProvider + HashRouter + IdentityProvider 占位)+ src/router.tsx(/chat /convert /alerts /identity,默认→/chat)+ src/App.tsx(ProLayout 四菜单 + 空页面占位)。
改法要点:按 §1 核对 pro-components 渠道后安装;tsconfig 在 Vite 模板上补 noUncheckedIndexedAccess 等严格项(架构 §4.3);proxy 按架构 §4.1(/api + /health 两条);vitest 配 passWithNoTests: true(否则 T-0 三查必挂——无测试文件时默认 exit 1)。
DoD:
npm run dev启动,四路由可切换、菜单高亮正确;npm run build零 TS 错误;vitest run绿(暂无用例);- 实际安装版本号写回架构 §1 实现状态表并知会用户(R-4);
git status后端零改动。
T-1 身份上下文
范围:identity/types.ts(IdentityConfig + 默认值)、identity/snapshot.ts(模块级快照 set/get)、identity/IdentityContext.tsx(Provider + localStorage xrisk.identity + 变更同步 snapshot + 挂载即写初始值)、identity/headers.ts(config→Headers 纯函数)、identity/matrix.ts(四线×角色速查 + 特例标注)、utils/idGenerator.ts(client_request_id 生成,T-7 首次消费)。
改法要点:默认值按架构 §4.5(channel='debug' / agentType='risk' / roles=['risk_officer'] / actorId='STAFF-90001' / baseUrl='');headers 双通道互斥(debug:X-Debug-Role 逗号拼接 + X-Debug-Actor;bearer:Authorization: Bearer);X-Agent-Type 恒携带;matrix 数据逐字以 PRD §4.4.5 定稿为准(含 risk_demo 特例、转换页三闸门、compliance 强制 aml 且 officer 优先、risk_manager 对话线 403)。
DoD:
- Vitest:headers(双通道互斥 / 多角色拼接 / X-Agent-Type 恒带)、snapshot(set→get 一致、默认值)、idGenerator(产物满足
[A-Za-z0-9._-]{1,64}白名单); - build / vitest / git status 三查过。
T-2 HTTP client + 错误链路
范围:api/http.ts、api/healthApi.ts、components/ErrorNotice.tsx、components/DebugDrawer.tsx。
改法要点:按架构 §4.2——读快照组头 → fetch(30s AbortController)→ 非 2xx 解析 {error_code, message, trace_id, request_id} → ApiClientError{status, errorCode, message, traceId, rawBody, requestSnapshot};DebugDrawer 展示快照 + rawBody + trace_id 一键复制;422 呈现 REQUEST_VALIDATION_FAILED 原样(G2 已知限制)。
DoD:
- Vitest:错误体解析(标准 4xx JSON / 422 / 非 JSON 响应 / 网络异常);
- 临时挂一个调试路由手测:对
/api/risk/alerts发无身份请求 → ErrorNotice 弹 401 + DebugDrawer 可看原始报文; - 三查过。
T-3 App 骨架
范围:App.tsx 完整化(ProLayout:菜单四项 + 顶栏右侧身份工具条(当前 agentType + 角色/Actor 摘要,点击跳 /identity)+ 面包屑)+ 挂载时 GET /health 探活横幅(失败 Alert 常驻顶部)。
DoD:
- 后端起 → 探活绿、无横幅;后端停 → 失败横幅出现、恢复后刷新消失;
- 工具条显示当前身份且跳转正确;
- 确认 T-2 的临时调试路由已移除(避免带进演示);
- 三查过。
T-4 SSE 解析器 + streamChat
范围:sse/sseParser.ts(纯函数状态机)、sse/streamChat.ts(POST /api/chat/stream 消费 + 回调)。
改法要点:架构 §4.4 全语义——TextDecoder({stream:true}) → \n\n 切帧 → data: 行解析;首帧 meta 6 键 → onMeta;delta.content → onDelta;finish_reason==='stop' → [DONE] → onDone;error 帧(STREAM_FAILED/PERSIST_FAILED)→ onError 后仍消费至 [DONE];前置错误分支:ok===false 或 content-type 非 text/event-stream → 读 JSON 抛 ApiClientError(不进消息流);请求体 {session_id?, message, customer_id?, title?};SSE 不设超时。
DoD:
- Vitest 全场景:正常流 / 首帧 meta / error 帧后 [DONE] / 半帧粘包(chunk 边界切在帧中间)/ 多行 data / 前置 JSON 错误分支;
- 三查过(端到端联调在 T-5/T-6)。
T-5 对话页
范围:api/chatApi.ts(sessions / messages / close)、pages/ChatPage/(SessionsSider / MessageFlow / InputBar)+ DisclaimerBar.tsx 接入。
改法要点:PRD §4.1 功能 1~7 逐条——会话列表分页(limit=20 递增 offset);历史 seq 升序、user 右气泡 / assistant 左块、has_disclaimer 尾部免责;InputBar 提供可选 customer_id 输入控件(PRD §3.3 请求体契约,T-6 advisor 代客联调依赖它,不做返工);关闭会话确认弹窗 + 409 如实呈现 + closed 禁发;流式打字机、完成后重拉该会话尾部核对落库一致、新会话首帧 session_id 插列表顶;Enter 发送 / Shift+Enter 换行、空输入前端先拦、发送中禁用;免责条 null 隐藏;错误呈现全集(401 / 403 risk_manager 特例 / 403 归属 / 429 / 400 / 404 / 409 + 失败轮空会话如实呈现)。
DoD:
- PRD §6 P1 DoD 中非身份相关条目全条手测过(默认 risk_officer debug 身份;risk_manager 403 / advisor 归属 403 两条身份相关验证留 T-6 联调——T-5 时点身份编辑 UI 尚未建成);
- 三查过。
T-6 身份面板 + 对话×身份联调
范围:pages/IdentityPage/(双通道 Radio + roles/actor 输入 + token 粘贴 + agentType Radio + 常用角色 chips(risk_demo 特例标注)+ BaseURL 只读展示(相对路径口径 + /health 不走 /api 说明)+ 探活按钮 + HeadersPreview(复用 headers.ts)+ 矩阵速查 Table(matrix.ts 数据))。
改法要点:PRD §4.4 六项;配置变更即时生效(Context + snapshot 同步)。
DoD:
- PRD §6 P4 DoD(配置即改即生效 + 刷新持久化 + 探活双态 + 矩阵表与
deps.py一致); - 同端点切换 debug / bearer 双通道,观察 401↔200 翻转(PRD §6 全局 DoD 的显式验证落点);
- 对话×身份联调(PRD §6 P1 增补项):切 customer / risk 线流式对话 + 免责条出现;advisor 线带 customer_id 代客对话成功;advisor 指定非名下客户 → 403 归属;risk_manager 进对话线 → 403(PRD 4A.1);连发超限 → 429;
- 三查过。
T-7 基金转换页
范围:api/convertApi.ts(accept / cancel / query / confirmBatch)、components/StatusTag.tsx(六态/预警状态映射,T-8 复用)、pages/ConvertPage/(AcceptFormCard(ProForm)→ AcceptReceipt 回执卡;RecordsTable → DetailDrawer;底部折叠 ConfirmBatchCard;errorMessages.ts 13 码映射)。
改法要点:PRD §4.2 A/B/C 全表——受理表单(份额标签明示 + 种子 ID placeholder + client_request_id 自动生成/锁定/重发);回执卡键全量 + requested_qty vs qty 对比提示(方向:强制全转时 qty 大于申请量)+ forced_full_transfer 徽标 + blocked 阻断卡 + 幂等按 status 渲染;记录列表 requested_qty 列 + status 列用 StatusTag 六态映射(PRD §4.2B.2 颜色文案,与后端枚举一一对应);详情抽屉受理区 17 键(含 confirmed)+ 确认区 18 键 + lot_breakdown 6 列 + G1 tooltip(confirmed 单 forced_full_transfer 恒 False 如实渲染)+ 撤单按钮窗口逻辑(accepted 且未过 cancel_deadline 可用,否则置灰 + tooltip)+ 刷新/2s 轮询开关(默认关);确认触发卡(accept_date 默认当天 + label"业务确认日(T+1)" + 统计回显 + 409 锁语义)。
DoD:
- PRD §6 P2 DoD 全条手测过(受理/撤单用 risk_demo 或客户本人身份;确认触发用 risk_officer;锁冲突项按代码核对口径);
- 三查过。
T-8 风控预警台账
范围:api/alertsApi.ts(alerts 分页 / handle)、pages/AlertsPage/(ProTable 查询 + 表格 + 行 DetailDrawer + 处置 Modal;status Badge 复用 StatusTag)。
改法要点:PRD §4.3 表——查询(status 四值 / alert_type 五值 / customer_id / start_date/end_date(DatePicker Dayjs→ISO 串)/ 分页 1~100);表格列按 risk_alert 列;详情 payload JSON 树;处置 Modal 三值 Radio + comment≤512 + 409 如实呈现;compliance 强制 aml 提示条 + officer 优先口径;risk_manager 只读 403 如实呈现;disclaimer 页脚。
DoD:
- PRD §6 P3 DoD 全条手测过;
- 三查过。
T-9 全局走查 + 后端回归复核(第 6 步集成测试入口)
范围:全仓。
改法要点:PRD §6 全 DoD 逐条复核打勾;按演示 SOP §2 重灌后完整走一遍演示主路径(对话流式 → 转换受理/撤单/确认 → 台账处置);python -m pytest 全量复核 849 基线;git status 终查。
DoD:
- PRD §6 全 DoD 通过;
- pytest 849 passed / 8 skipped 不回归;
- 后端零改动终查通过。
以下为 v1.2 第二阶段任务(T-10~T-14)。上游:PRD v1.2 §9 / 架构 v1.2 §8。质量门三查沿用,
git status检查口径 = 后端三目录零改动 且不做任何 commit。
T-12(二期 · 建议首做)台账页 URL 参数预填 ✅(2026-09-12 完成,架构 §7 已登记)
范围:pages/AlertsPage/index.tsx 单文件增量(其余零改动)。
改法要点:架构 §8.4 全条——useSearchParams 读 status / alert_type / customer_id 三键;白名单校验(status 四值 / alert_type 五值,非法忽略,W-4);实现口径(评审 P2-1):URL 参数在 filters 的 useState 初始化器中同步解析注入(useState(() => parseUrlFilters())),保证首次 fetchPage effect 即带参、恰好一次请求;form.setFieldsValue 放挂载期 effect;无参数时初始化器返回 {} 逐字节回归现状。
DoD:
#/alerts?customer_id=CUST-1001&alert_type=aml&status=pending_review进入 → 表单预填(三键)+ 恰好一次自动查询(Network 面板核实单请求);✅- 非法参数(如
status=xxx)进入 → 被忽略,行为与无参一致;✅ - 无参进入 → 行为与改动前逐字节一致(回归);✅
- 三查过。✅(vitest 30/30 → T-10 后 35/35 / build 8.5s / 后端零改动)
T-10(二期)P5 适当性校验页 ✅(2026-09-12 完成,架构 §7 已登记)
范围:api/suitabilityApi.ts、utils/suitabilityLabels.ts + suitabilityLabels.test.ts、components/SuitabilityTag.tsx、pages/SuitabilityPage/index.tsx(历史区逻辑内聚本页,若超 300 行拆 HistoryPanel.tsx,回写架构 §7 时登记)+ router.tsx/App.tsx 挂载(/suitability 路由 + 菜单项「适当性校验」)。
改法要点:架构 §8.2 全条——页头身份前提 Alert(含 advisor 线选线提示);Form 两输入 required 前端先拦;结果卡 Descriptions 15 键全量、blocked 红卡 + advice/notice 提示条、requires_disclosure/needs_branch_confirm 显著提示、rule_refs[] Tag 列表;suitabilityLabels 三张映射表全值覆盖 + 未知值原样返回(StatusTag 同款口径,W-2 类型可选键);历史区 unshift 插顶不去重(W-3)、行点击 Drawer 回看 raw、内存态刷新即清;统一 useErrorNotice 链路。
DoD:
- Vitest:三张映射表逐值断言(5+7+7 全值)+ 未知值兜底原样返回;✅(30→35 用例)
- PRD §9.6 P5 四条 DoD 全条手测过(联调前按 R-7 重灌;officer 放行/拦截组合 + risk_expired 态实证(现成过期测评客户 CUST-1018,2025-03 到期) + advisor/customer 归属 403 + risk_manager 403 SCOPE + 历史区);「404」项按 T-10 实测订正(PRD v1.3):不存在客户/产品无 HTTP 404 路径——officer 侧 200 SUIT_NOT_FOUND(forbidden + mismatch_type=not_found)红卡呈现,advisor/customer 侧归属断言先拦 403;✅
- 六菜单项齐全、
/suitability路由可达;✅(菜单 4→5 项,第 6 项 AML 由 T-11 补) - 三查过。✅(vitest 35/35 / build 8.6s 零 TS 错误 / 后端零改动)
T-11(二期)P6 AML 扫描页 ✅(2026-09-12 完成,架构 §7 已登记)
范围:api/amlApi.ts、pages/AmlPage/index.tsx + router.tsx/App.tsx 挂载(/aml 路由 + 菜单项「AML 扫描」)。
改法要点:架构 §8.3 全条——页头身份前提 Alert(仅 risk_officer);Button + Modal.confirm 二次确认(三要素文案);请求飞行中 loading 防重复点击;摘要卡四键 + alerts/skipped_existing 逐 id Typography.Link 跳 /alerts?alert_type=aml(W-1);skipped_existing 非空幂等提示条;disclaimer 页脚;统一错误链路(401/403 AUTH_403_ROLE)。
DoD:
- PRD §9.6 P6 前两条 DoD 手测过(officer 触发成功四键 + disclaimer;同日重扫 alerts 空 + skipped_existing 命中;manager / compliance / customer 403 复现);✅(首扫 scanned=33/hit=1/alerts=[ALT-20260912-E9FBA36E];重扫 alerts=[] + skipped=[同 id] + 幂等提示条;三身份 403 AUTH_403_ROLE 全复现)
- 联动端到端本任务手测过:点 alert_id → 跳
#/alerts?alert_type=aml→ 预填 + 恰好一次自动查询(T-12 已就绪);✅(表单预填「反洗钱」+ performance 取证参数alert_type=aml&page=1&page_size=20,dev StrictMode ×2 按 W-5 口径;新建单落首屏 + SQL 佐证 L3 high / aml_scan 审计) - 三查过。✅(build 8.71s 零 TS 错误 / vitest 35/35 / 后端零改动)
T-13(二期)六页 GUI 全功能走查 + 截图收集(第二阶段集成测试)✅(2026-09-12 完成,架构 §7 已登记)
执行记录:① 造数走真实业务链(simulate 大额申购 CUST-3001 50 万 PROD-510300 → RISK-001/002 命中产 large_amount 单 ALT-5303FFBC / AML 扫描产 aml 单 ALT-E9FBA36E(T-11)/ P5 阻断校验产 suitability 单 / 转换受理 5 单含强转单);② 48 张截图存
docs/测试报告/screenshots/(P1×9 / P2×15 / P3×8 / P4×3 / P5×8 / P6×4 / E-01×1,不 commit);③ 错误路径专项:401(bearer 空 token MISSING_DEBUG_HEADERS)/ 403 全矩阵(对话 ROLE·台账 AML ROLE·转换受理 ROLE·撤单 owner·P5 三码·manager SCOPE)/ 400×4(GUARD_BLOCKED_INJECTION 精确短语·CROSS_ENTITY_NOT_SUPPORTED·BELOW_MIN_QTY·INSUFFICIENT_SHARES)/ 409(已处置单 UI 禁用 + title「仅待复核状态可处置」,后端 pytest 覆盖)/ 429(引用 T-6 留档 32 连发 30×200+2×429 证据)/ 404 会话不存在与 422 按「GUI 无法触发」口径登记;④ LLM 未配置降级口径:DEEPSEEK_API_KEY 为空 → 对话回复 = 后端降级文案(agent_service._DEGRADED_PREFIX 设计行为,演示链路不断),SSE 管道 / 免责条 / 落库回显 / 关闭只读全链真实验证;⑤ 终查:重灌双库(verify_convert_seed 全 PASS)+ 清 13 张运行时表 + sync_advisor_rel 33 行 + uvicorn 重启 → pytest 849 passed / 8 skipped 零失败(16.91s) + build 9.18s 零 TS 错误 + vitest 35/35 + git status 后端三目录零改动零 commit。
DoD:
- PRD §6 + §9.6 验收条全覆盖执行,每条有截图或证据(命令输出/网络面板可作证据)与结论(通过/已知取舍/GUI 无法触发的登记口径);✅(48 张截图 + 问题登记:转换页撤单入口工作流断点——risk_demo 受理人查询自身单 403 致详情抽屉不可达、撤单按钮不可触达,customer 本人线可撤(已按此完成撤单走查)——登记 §T-14 报告问题节)
- 错误路径专项有证据截图;✅(E-01 401 / P1-06 注入 400 / P1-07·P2-03·P2-07a/b·P3-07·P5-05/06·P6-04 403 矩阵 / P2-08·BELOW_MIN_QTY·INSUFFICIENT_SHARES 400 / P3-05 409 前置拦截)
- vitest 全绿 + build 零 TS 错误 + pytest 849 基线不回归 + 后端零改动终查。✅
T-14(二期)Word 测试报告产出 + 交接文档更新
范围:docs/测试报告/(新建;2026-09-14 起随前端整线入库)+ 交接文档。
改法要点:报告六节结构(PRD §9.5):概述 / 用例总表 / 分页详述(步骤+截图+结果)/ 错误路径专项 / 问题与已知取舍(G1/G2、幂等语义、A-1 防护行为等如实登记)/ 结论;生成走 document-skills docx 能力(R-9,不进 web/ 工程);截图按页归档嵌入;交接文档-前端测试界面.md 更新(第二阶段收官状态 + 测试报告位置)+ 主交接文档 §0 表 ④ 行同步。
DoD:
- Word 报告可打开、六节完整、截图嵌入清晰、用例总表与走查记录一致(judge 视觉验收三轮:前两轮发现 docx-js tblGrid 写死 100 twips 塌缩,columnWidths 修复后 23/23 页 pass);
- 问题/挂账如实登记(不粉饰)——I-1 撤单断点 / I-2 LLM 未配置均登记于报告 §5.1;
- 交接文档双更新落笔;产物零 commit;
- 收尾重灌恢复干净演示态(清 T-13 造数残留,防 A-1 交叉防护影响后续会话)。
I-1(报告问题闭环)撤单入口下沉 ✅(2026-09-13 完成,架构 §7 已登记)
背景:T-13 报告 §5.1 登记 I-1——risk_demo 无查询权(403)→ 详情抽屉不可达 → 撤单按钮不可触达。用户 2026-09-13 拍板:「按照实际业务走,查一下,感觉有必要的就修」。
业务查证(联网核实铁律):柜面经办代客撤销为行业真实形态(中宏撤单申请表撤销种类明含基金转换 / 天弘「申购赎回转换当日 15:00 前可撤」/ 易方达机构撤销需经办人签字 / 华宝·大成凭委托号即可撤销)→ 撤单不需要查询权,前端修成立。
改法:pages/ConvertPage/index.tsx 单文件增量——RecordRow 补 cancel_deadline(回执/detail 双源)+ rowCancelGate 闸门纯函数(状态先于时间,与抽屉同口径)+ 操作列(非 accepted「—」/ accepted 撤单按钮 + Popconfirm + tooltip + stopPropagation)+ handleRowCancel(成功本地迁移 cancelled,失败 13 码映射)。抽屉撤单按钮保留。
DoD:
- risk_demo 行内撤单全流程 GUI 手测过(受理 CNV-20260913-CAD72FD6 → 确认气泡 → 已撤销,4 截图 P2-10a~d);
- officer 行内撤单 403 AUTH_403_ROLE 如实呈现(权限矩阵未放松);
- 三查过(build 8.31s 零 TS 错误 / vitest 35/35 / 后端零改动零 commit);
- 报告 §2.2/§3.2/§5.1 同步更新重新生成 + 收尾清理手测残留。
§4 实现级裁定
| # | 裁定 | 理由 |
|---|---|---|
| R-1 | 串行开发:T-0→T-9 严格按序,每任务质量门过了才进下一步 | 全局铁律"每步测试确认后才进行下一步";单人单线无并行收益 |
| R-2 | 每任务收尾三查:build + vitest run + git status |
§1 质量门;后端零改动红线的落地手段 |
| R-3 | 单测只覆盖架构 §6 列出的纯函数对象(sseParser / headers / idGenerator / http 错误解析),不做组件测试 | PRD §1.4 非目标定稿 |
| R-4 | T-0 核对 pro-components 渠道后,实际安装版本写回架构 §1 实现状态表 + 随 T-0 提交 package.json | 评审 P1-1(beta 渠道)的闭环手段;渠道变更知会用户 |
| R-5 | T-6/T-7/T-8 各自联调前按演示 SOP §2 重灌双库(T-6 的 advisor 代客成功侧依赖 customer_advisor_rel 种子在位,库脏会把成功复现失败误读为前端缺陷),演示态干净 |
演示 SOP 惯例;联调数据前置 |
| R-6 | 时间与 Decimal 串一律原样展示,前端零格式化加工 | PRD §5 定稿(所见即契约);format.ts 仅做安全兜底(空值显示"-") |
| R-7(二期) | T-10/T-11/T-12 各自联调前重灌双库(沿 R-5 惯例);T-13 集成测试前重灌 + 演示造数走真实业务链(适当性阻断产 suitability 单、大额申购产 large_amount/aml 单,沿 T-8 先例) | 联调数据前置;成功场景复现不得被脏库误判 |
| R-8(二期) | T-13 截图由浏览器自动化逐用例采集,存 docs/测试报告/screenshots/,按页归档命名(P1-01-会话列表.png 式) |
报告素材即测即存,避免走查完补截图遗漏;不 commit |
| R-9(二期) | Word 报告生成走 docx 文档能力(Python 侧),不进 web/ 工程、不加任何 npm 依赖 | 报告是文档产物不是前端功能;依赖硬阀门 |
| R-10(二期) | 台账 URL 预填实现口径按架构 §8.4:filters useState 初始化器注入 + form.setFieldsValue 挂载期 effect,禁止挂载后 effect 里 setFilters |
评审 P2-1:后者会双请求(先无参后带参,首屏闪现全量列表) |
§5 回归面(前端线)
| 面 | 内容 | 检查时机 |
|---|---|---|
| 后端零改动 | git status 无 app/ tests/ scripts/ 变更(二期加:且全程零 commit) |
每任务(R-2 三查) |
| 后端基线 | pytest 全量 849 passed / 8 skipped | T-9(及任何怀疑后端行为异常时);二期 T-13 收尾复核 |
| 前端自回归 | vitest run 全绿 + build 零 TS 错误 |
每任务(R-2 三查) |
| 契约回归 | 改动触及 api/ 或 sse/ 时,重跑对应单测 + 手测一次该页主路径 |
每任务触及接入层时 |
| 台账页无参回归(二期) | T-12 改动后,无参数进入 /alerts 行为逐字节一致 |
T-12 + T-13 |
§6 验收清单
= PRD v1.1 §6 全部 DoD + PRD v1.2 §9.6 二期增补 DoD(引用不重抄),映射:
| PRD DoD 组 | 落地任务 |
|---|---|
| 全局(init/双通道/错误组件/后端零改动) | T-0 / T-1 / T-2 / T-3 / T-9 |
| P1 对话页 | T-5 + T-6(身份联调增补项) |
| P2 转换页 | T-7 |
| P3 台账页 | T-8 |
| P4 身份面板 | T-6 |
| P5 适当性页(二期 §9.6) | T-10 |
| P6 AML 页前两条(二期 §9.6) | T-11 |
| P6 联动第 3 条(二期 §9.6) | T-11(发起端)+ T-12(承接端) |
| P3 台账增量(二期 §9.6 末条) | T-12 |
| 测试报告(二期 §9.6) | T-13(走查+截图)+ T-14(报告产出) |
§7 审核记录
第一轮(独立评审员 · 2026-09-12)
| # | 审核意见 | 档位 | 本轮处理 |
|---|---|---|---|
| P1-1 | T-5 DoD 自我矛盾:身份相关两条(risk_manager 403 / advisor 归属 403)在 T-5 时点不可执行(身份编辑 UI 在 T-6 才建),按 R-1 会卡死或打假勾 | 重要 | 接受:T-5 DoD 改"非身份相关条目全过,两条留 T-6 联调" |
| P1-2 | 接入层文件认领缺失:chatApi/convertApi/alertsApi 散落隐含未点名;StatusTag.tsx(六态映射)无任何任务认领,T-7 改法漏六态映射 |
重要 | 接受:T-5/T-7/T-8 范围分别补列 chatApi/convertApi+StatusTag/alertsApi(T-8 标复用);T-7 改法要点补 status 列六态映射 |
| P2-1 | T-7/T-8 依赖列失真(手测需切身份,实际依赖 T-6) | 可选 | 接受:依赖列补 T-6 |
| P2-2 | T-0 "vitest run 绿(暂无用例)"必败坑(无测试文件默认 exit 1) | 可选 | 接受:T-0 改法补 passWithNoTests: true |
| P2-3 | T-2 临时调试路由拆除无确认项 | 可选 | 接受:T-3 DoD 补确认拆除 |
| P2-4 | 环境前置缺 debug 头可用性检查(若配了 RS256 公钥通道 A 全 401) | 可选 | 接受:§1 后端启动行补前置检查 |
| P2-5 | idGenerator 单测无人认领 | 可选 | 接受:T-1 范围 + DoD 补 idGenerator |
| P2-6 | T-6 联调数据前置:advisor 代客成功侧依赖 customer_advisor_rel 种子在位,R-5 原排在 T-7/T-8 前太晚 |
可选 | 接受:R-5 时机提前至 T-6/T-7/T-8 各自联调前 |
| P2-7 | 全局 DoD"401→200 翻转"仅 T-9 兜底 | 可选 | 接受:T-6 DoD 补双通道翻转显式验证 |
| P2-8 | T-5 改法要点漏 customer_id 输入控件(T-6 联调依赖) | 可选 | 接受:T-5 改法要点补 |
第二轮(二期 v1.2 增补 · 独立评审员 · 2026-09-12)
结论:PASS with findings(P0=0 / P1=4 / P2=6),全部采纳修订,修订闭环后开工。
| # | 审核意见 | 档位 | 本轮处理 |
|---|---|---|---|
| P1-1 | 路由/菜单挂载无任务认领(一期 P1-2 同类问题重演) | 重要 | 接受:T-10/T-11 范围分别补 router.tsx/App.tsx 挂载;T-10 DoD 补「六菜单项齐全、路由可达」 |
| P1-2 | P6 联动端到端认领错位(§6 映射记 T-12 vs T-11 DoD 旧序括注打架) | 重要 | 接受:T-11 DoD 第 2 条改「联动端到端本任务手测过」(推荐序下 T-12 已就绪);§6 映射行改「T-11(发起端)+ T-12(承接端)」并单列 P3 增量行 |
| P1-3 | T-13 收尾 pytest 复核缺「清演示残留」前置(一期实踩 A-1 假失败坑) | 重要 | 接受:T-13 ④ 补「复核前重灌/清演示造数残留,A-1 属预期非缺陷」;T-14 DoD 补收尾重灌恢复演示态 |
| P1-4 | T-10 DoD 括注漏 risk_expired 三态实证(唯一需特殊造数的态) | 重要 | 接受:括注补「选现成风评过期客户或 SQL 调 risk_assessment 到期日」造数前置 |
| P2-1 | 文档头 L7 与 §6 引言 v1.1 版本引用残留 | 建议 | 接受:上游依据改 v1.2;§6 引言改「v1.1 §6 + v1.2 §9.6」 |
| P2-2 | T-11 DoD 漏 compliance 403 | 建议 | 接受:补 manager / compliance / customer 403 复现 |
| P2-3 | 「每条有截图」对非 UI 条目不可操作;422 GUI 难触发 | 建议 | 接受:改「截图或证据」;422 按「GUI 无法触发、由 vitest + 后端 pytest 覆盖」口径登记 |
| P2-4 | T-12 DoD 未断言 status 合法值预填 | 建议 | 接受:DoD 1 扩为三键组合(+status=pending_review) |
| P2-5 | 二期缺架构 §7 回写机制 + T-10 弹性拆分未登记 | 建议 | 接受:依赖说明补「各任务完成后回写架构 §7(含弹性拆分登记)」 |
| P2-6 | T-11 依赖列 T-2/T-3 粒度失真 | 建议 | 接受:依赖列注记「一期基座沿用」 |