# 复核页保存服务健康检查
## 诊断流程样例\n\n### 场景\n用户拿到一个本地复核页,想把某个 case 从标签 A 移到标签 B,但不确定应该打开哪个 URL,也不确定保存是否真的写回 CSV。\n\n### 运行\n```bash\npython tools/review_page_edit_healthcheck.py \\\n --root /Users/bytedance/Documents/product-bu/<review-project> \\\n --html out/review_v31.html \\\n --csv out/review_cases.csv \\\n --url http://127.0.0.1:18765/\n```\n\n### 检查步骤\n\n| 步骤 | 检查内容 | 成功信号 | 失败信号 |\n|---|---|---|---|\n| 1 | 本地服务 | `127.0.0.1:18765` 正在监听,`/api/health` 返回 ok | 端口未监听、连接拒绝、health 非 2xx |\n| 2 | 打开方式 | HTML 通过 `http://127.0.0.1:18765/` 服务访问 | 工具输出可点击 URL | 用户正在用 `file://` 打开,保存 API 不可用 |\n| 3 | 保存 schema | 前端提交字段与服务端允许字段一致 | schema diff 为空 | 前端发二级/三级分类,但服务端只收生命周期状态/子领域 |\n| 4 | 下拉联动 | 父标签变化后子标签被清空或重算 | DOM 状态与 schema 一致 | 子标签残留旧值,保存后写入非法组合 |\n| 5 | 写回闭环 | Playwright 移动一个临时 case 并保存,再读取 CSV 确认变更 | CSV diff 只有预期 case 变更 | 保存接口 4xx/5xx、CSV 无变化、页面刷新后丢失 |\n\n### 示例输出\n```text\nPASS health: http://127.0.0.1:18765/api/health\nPASS launch: open http://127.0.0.1:18765/\nPASS schema: frontend labels match server schema v31\nPASS save-smoke: moved case tmp_001 from 商品信息设置/主图 to 商品信息设置/标题 and persisted to CSV\nREPORT out/review_healthcheck_report.json\n```\n\n### 失败时落地\n如果失败在端口监听,把一次性后台进程改为 LaunchAgent 或项目内 `make review-server` 持久命令;如果失败在 schema,把服务端 `/api/schema` 作为唯一来源生成前端下拉常量;如果失败在写回闭环,优先保留临时 CSV、HTML copy、Playwright trace 和 server log,作为后续修复输入。