test(bioflow): 阶段0-T1 测试用例——749 条 TC-BIO + FR-BIO 双向追溯矩阵 + UI 动作矩阵 + 意图分流词典

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 16:44:01 +08:00
co-authored by Claude Fable 5
parent 64bc30365c
commit 4f5d0d607b
4 changed files with 1141 additions and 0 deletions
+1
View File
@@ -79,6 +79,7 @@ UI 只展示后端真实返回的数据。**禁止**:占位假数据流入生
| 知识图谱 | `FR-KG` | 工作台 Tab4 |
| 响应式 | `FR-RESP` | 四档断点与移动端专项 |
| 健康与降级 | `FR-HEALTH` | 上游探活与降级行为 |
| 生信流程编排 | `FR-BIO` | 对话式生信编排(七项引导 / 面板 / 三形态 / 独立服务) |
---
+893
View File
@@ -673,3 +673,896 @@ mock server:`python sdk/mock/mock_server.py`(127.0.0.1:8099),场景经
3. TC-KG 节点详情在 Neo4j 不可用时的属性来源为「消息内 graph 块已有属性」;graph 块节点若不含属性字段,该断言在实现时需以实际块结构微调步骤(预期语义不变)。
4. **L5 依赖安装需 PM 裁决**:`tests/e2e/` 的 spec 需要解析 `@playwright/test`,而它位于 `ui/node_modules` 之外。两个方案二选一:(a) 远端一次性 `npm install --save-dev @playwright/test@1.49.1`(写入 B1 归属的 `ui/package.json`,需 PM 批准);(b) 保持 `npx playwright@1.49.1` 并在远端建 `node_modules` 根符号链接 + `@playwright/test` 符号链接(不改 package.json,M2 前由 T/PM 在远端一次性执行)。本波按 (b) 在 Mac 本地验证通过(6/6 pass),建议远端集成点采用 (b)。
5. **task 验证命令差异**:任务书给的验证命令 `npx playwright test`(无版本)在本机无已安装 playwright 时会从 npm 拉最新版;远端 Node 18 + `npx playwright@1.49.1` 仍会拉 1.49.1 的 chromium 1148(≈150MB,CDN 实测可达)。已在本文件 §3.4 记录完整步骤。
## 6. 生信流程编排(FR-BIO-001~032)
> 本节由 T1 编制(阶段 0,2026-09-05)。需求唯一来源:PRD.md §16;组件规格:UI_SPEC.md §8;分层与门禁:TEST_PLAN.md §9-12;端点事实:实施计划 §六。意图分流词典唯一事实源:docs/team/cases_bioflow_intent.md(前后端同表双跑)。
> 编号 TC-BIO-<模块>-<序号>;E2E 视口后缀 M/T/D(390×844 / 768×1024 / 1440×900)。分层:L1 生信服务单元(pytest -m bioflow_unit)|L2 生信接口(pytest -m bioflow_api,mock LLM/vstore/docker)|L2s 生信冒烟(bash bioflow_kernel/tests/smoke_golden.sh,仅集成点手动)|L3 前端单元(vitest)|L4 前端组件(vitest + @vue/test-utils)|L5(Playwright 三档视口)。
> 可断言性:预期列均为可观察断言(HTTP 状态/请求体字段/存储值/元素存在/计算样式值/事件序列),无「检查是否正确」类断言。
> 模块缩写:INTENT 意图分流 | API 生信服务端点 | RUN runner 状态机 | KERN 内核执行与 manifest | SSE 事件流 | DB 三表迁移 | FLOW 上下游集成 | STORE 前端 store | PATH 路径卡 | FORM 参数表单卡 | FILE 文件引导卡 | PROG 进度卡 | ARCH 存档卡 | JOB 生信任务面板 | PANE 生信档案面板 | ACT UI 动作矩阵 | DEPLOY 三形态部署 | REG 回归 | GOLD 金标与发布 | E2E 端到端主线。
### 6.1 用例清单
#### 6.1.1 INTENT 意图分流(FR-BIO-001/FR-BIO-023/FR-BIO-026,词典唯一事实源 docs/team/cases_bioflow_intent.md)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-INTENT-001 | FR-BIO-001 | 命中「帮我跑水稻 SPL 家族鉴定」 | 无附件、无活动文档 | route("帮我跑水稻 SPL 家族鉴定") | 返回 bioflow(词典用例表第 1 条) | L3 | P0 |
| TC-BIO-INTENT-002 | FR-BIO-001 | 命中「跑一下拟南芥 MADS-box 家族分析」 | 无附件、无活动文档 | route("跑一下拟南芥 MADS-box 家族分析") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-003 | FR-BIO-001 | 命中「请帮我鉴定水稻 SPL 家族」 | 无附件 | route("请帮我鉴定水稻 SPL 家族") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-004 | FR-BIO-001 | 命中「识别玉米 bZIP 家族成员」 | 无附件 | route("识别玉米 bZIP 家族成员") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-005 | FR-BIO-001 | 命中「帮我研究一下水稻 SPL 基因家族」 | 无附件 | route("帮我研究一下水稻 SPL 基因家族") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-006 | FR-BIO-001 | 命中「分析小麦 WRKY 转录因子家族」 | 无附件 | route("分析小麦 WRKY 转录因子家族") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-007 | FR-BIO-001 | 命中「做个大豆 NAC 家族分析」 | 无附件 | route("做个大豆 NAC 家族分析") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-008 | FR-BIO-001 | 命中「跑 SPL 家族」 | 无附件 | route("跑 SPL 家族") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-009 | FR-BIO-001 | 命中「水稻 SPL 家族,帮我跑」 | 无附件 | route("水稻 SPL 家族,帮我跑") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-010 | FR-BIO-001 | 命中「基因家族鉴定:水稻 SPL」 | 无附件 | route("基因家族鉴定:水稻 SPL") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-011 | FR-BIO-001 | 漏判安全:知识问答 | 无附件 | route("什么是基因家族?") | 返回 qa | L3 | P0 |
| TC-BIO-INTENT-012 | FR-BIO-001 | 漏判安全:光有动词 | 无附件 | route("帮我跑一下") | 返回 qa | L3 | P0 |
| TC-BIO-INTENT-013 | FR-BIO-001 | 漏判安全:光有家族名 | 无附件 | route("SPL 家族") | 返回 qa | L3 | P0 |
| TC-BIO-INTENT-014 | FR-BIO-001 | 漏判安全:无动词无家族 | 无附件 | route("今天天气不错") | 返回 qa | L3 | P1 |
| TC-BIO-INTENT-015 | FR-BIO-001 | 漏判安全:问方法 | 无附件 | route("跑 SPL 家族鉴定需要准备什么输入?") | 返回 qa | L3 | P0 |
| TC-BIO-INTENT-016 | FR-BIO-001 | 漏判安全:非生信对象 | 无附件 | route("帮我跑一个数据分析") | 返回 qa | L3 | P1 |
| TC-BIO-INTENT-017 | FR-BIO-001 | 漏判安全:闲聊 | 无附件 | route("你好呀") | 返回 qa | L3 | P1 |
| TC-BIO-INTENT-018 | FR-BIO-001 | 漏判安全:空字符串 | 无附件 | route("") | 返回 qa | L3 | P1 |
| TC-BIO-INTENT-019 | FR-BIO-001 | 漏判安全:纯空白 | 无附件 | route(" ") | 返回 qa | L3 | P1 |
| TC-BIO-INTENT-020 | FR-BIO-001 | 漏判安全:乱码 | 无附件 | route("⚡☂☄ hmm") | 返回 qa(非 bioflow) | L3 | P2 |
| TC-BIO-INTENT-021 | FR-BIO-001 | 漏判安全:未在词典的家族名 | 无附件 | route("帮我跑香蕉 XYK 家族鉴定") | 返回 qa(XYK 不在家族词典) | L3 | P1 |
| TC-BIO-INTENT-022 | FR-BIO-001 | 边界:大小写家族名 | 无附件 | route("跑水稻 spl 家族鉴定") | 返回 bioflow(家族名大小写不敏感) | L3 | P1 |
| TC-BIO-INTENT-023 | FR-BIO-001 | 边界:英文整句 | 无附件 | route("Please run rice SPL family identification") | 返回 bioflow | L3 | P1 |
| TC-BIO-INTENT-024 | FR-BIO-001 | 边界:标点夹杂 | 无附件 | route("帮我跑(水稻 SPL 家族)鉴定!") | 返回 bioflow | L3 | P1 |
| TC-BIO-INTENT-025 | FR-BIO-001 | 边界:超长文本(>200 字) | 无附件 | route(200 字长文含「跑水稻 SPL 家族鉴定」在末尾) | 返回 bioflow | L3 | P2 |
| TC-BIO-INTENT-026 | FR-BIO-001 | 边界:家族名跨词干扰 | 无附件 | route("这个 SPL 会议帮我跑一下流程") | 返回 qa(SPL 后无家族/分析对象词) | L3 | P2 |
| TC-BIO-INTENT-027 | FR-BIO-001 | 附件存在不改判定 | has_attachments=true | route("帮我跑水稻 SPL 家族鉴定") | 返回 bioflow | L3 | P1 |
| TC-BIO-INTENT-028 | FR-BIO-001 | 活动文档存在不改判定 | has_active_artifact=true | route("帮我跑水稻 SPL 家族鉴定") | 返回 bioflow | L3 | P1 |
| TC-BIO-INTENT-029 | FR-BIO-001 | docgen 优先:写报告 | 无附件、无活动文档 | route("帮我生成一份水稻 SPL 家族分析报告") | 返回 docgen(既有 docgen 路由在 bioflow 之前判定) | L3 | P0 |
| TC-BIO-INTENT-030 | FR-BIO-001 | docgen 优先:撰写论文 | 无附件 | route("帮我写一篇水稻基因家族研究论文") | 返回 docgen | L3 | P1 |
| TC-BIO-INTENT-031 | FR-BIO-001 | export 优先 | has_active_artifact=true | route("导出成 PDF") | 返回 export | L3 | P1 |
| TC-BIO-INTENT-032 | FR-BIO-001 | edit 优先:文档打开时改文字 | has_active_artifact=true | route("把这句话改成红色") | 返回 edit | L3 | P1 |
| TC-BIO-INTENT-033 | FR-BIO-019 | 图表调整走 bioflow:文档打开时 | has_active_artifact=true | route("xxx 图表颜色换成红色") | 返回 bioflow(图表类词命中生信,不进 edit) | L3 | P0 |
| TC-BIO-INTENT-034 | FR-BIO-023 | 存档复用命中:标准句式 | 无附件 | route("用 XXX 存档任务的方法帮我跑水稻 SPL 家族鉴定") | 返回 bioflow 且解析出复用意图(方法名=XXX) | L3 | P0 |
| TC-BIO-INTENT-035 | FR-BIO-023 | 存档复用命中:根据句式 | 无附件 | route("根据 XXX 存档任务的方法帮我跑一下玉米 bZIP") | 返回 bioflow 且复用意图成立 | L3 | P1 |
| TC-BIO-INTENT-036 | FR-BIO-023 | 存档复用命中:参考句式 | 无附件 | route("参考 XXX 存档的方法再跑一个水稻 SPL") | 返回 bioflow 且复用意图成立 | L3 | P1 |
| TC-BIO-INTENT-037 | FR-BIO-023 | 存档复用命中:按句式中文括号 | 无附件 | route("用《XXX》存档任务的方法帮我跑小麦 WRKY 家族") | 返回 bioflow 且方法名=XXX | L3 | P1 |
| TC-BIO-INTENT-038 | FR-BIO-023 | 存档复用边界:只有复用词无任务词 | 无附件 | route("用 XXX 存档任务的方法") | 返回 qa(无「帮我跑 xxxx」目标) | L3 | P1 |
| TC-BIO-INTENT-039 | FR-BIO-023 | 存档复用边界:无家族对象 | 无附件 | route("用 XXX 存档任务的方法帮我跑 yyy") | 返回 qa(yyy 无家族名匹配,漏判安全) | L3 | P1 |
| TC-BIO-INTENT-040 | FR-BIO-001 | 标点与空白容错 | 无附件 | route("帮我跑 水稻 SPL 家族 鉴定") | 返回 bioflow | L3 | P2 |
| TC-BIO-INTENT-041 | FR-BIO-001 | 命中 RNA-seq | 无附件 | route("帮我跑水稻叶片 RNA-seq 差异表达分析") | 返回 bioflow | L3 | P0 |
| TC-BIO-INTENT-042 | FR-BIO-001 | 命中 WGS | 无附件 | route("帮我做水稻全基因组变异检测") | 返回 bioflow | L3 | P1 |
| TC-BIO-INTENT-043 | FR-BIO-001 | 命中 GWAS | 无附件 | route("帮我跑水稻产量性状 GWAS 关联分析") | 返回 bioflow | L3 | P1 |
| TC-BIO-INTENT-044 | FR-BIO-001 | 命中交互式补充:追问对象 | 会话上文为「帮我跑水稻 SPL 家族鉴定」已开任务 | route("换玉米,重跑") | 返回 bioflow 且目标对象=玉米 | L3 | P2 |
| TC-BIO-INTENT-045 | FR-BIO-026 | 流程咨询在生信流内 | 会话已有生信任务 | route("identify 需要什么输入") | 返回 bioflow 内 flow_qa 路径(不新建任务) | L3 | P1 |
| TC-BIO-INTENT-046 | FR-BIO-001 | 命中句不打乱 QA 流 | 无生信上下文 | 先 route("什么是 SPL 家族") 再 route("帮我跑水稻 SPL 家族鉴定") | 第 1 条=qa、第 2 条=bioflow,两者互不影响 | L3 | P2 |
| TC-BIO-INTENT-047 | FR-BIO-001 | 词典同表后端一致性 | 后端 bioflow_service 已部署 | 后端对词典用例表 40+ 条输入逐一分流 | 后端判定结果与词典期望逐条一致(同表双跑) | L2 | P0 |
#### 6.1.2 API 生信服务端点(实施计划 §六 20 端点;mock LLM/vstore/docker)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-API-001 | FR-BIO-001 | chat/stream 入口建立 SSE | mock LLM/vstore | POST /api/bioflow/chat/stream {"session_id":"s1","message":"帮我跑水稻 SPL 家族鉴定"} 流式读首个事件 | 响应 200;Content-Type=text/event-stream;首个事件类型=job_created(或 plan_ready),data 为 JSON | L2 | P0 |
| TC-BIO-API-002 | FR-BIO-002 | 候选路径随 plan_ready 下发 | mock LLM 返回 3 条候选路径 | 读流至 plan_ready 事件 | plan_ready.data.candidates 为数组,length 在 2~3;每条含 stages[](非空)与 purpose(非空字符串) | L2 | P0 |
| TC-BIO-API-003 | FR-BIO-003 | 伪造阶段被拒 | mock LLM 候选含未知阶段「fake_stage_xyz」 | 读流至第 1 个 plan/error 事件 | 事件 data 含 code=UNKNOWN_STAGE 且 fake_stage_xyz 被点名;该候选不进入候选集 | L2 | P0 |
| TC-BIO-API-004 | FR-BIO-003 | 前置阶段自动补全 | 候选链缺 identify 前置 | 读流至 plan_ready | 事件 data.candidates[*].stages 已含前置;data 或后续事件文本含「已自动补全」明示字段 auto_filled[]=前置阶段名 | L2 | P0 |
| TC-BIO-API-005 | FR-BIO-001 | 非生信消息不建任务 | mock LLM 分流 | POST 消息「什么是基因家族」读流 | 响应 200;事件含 message_done 且不含 job_created;data 不含 job_id | L2 | P0 |
| TC-BIO-API-006 | FR-BIO-001 | 空 message 422 | 无 | POST {"session_id":"s1","message":""} | 422;detail 含 message 字段错误 | L2 | P1 |
| TC-BIO-API-007 | FR-BIO-001 | 缺 message 字段 422 | 无 | POST {"session_id":"s1"} | 422;detail 含 message | L2 | P1 |
| TC-BIO-API-008 | FR-BIO-001 | 缺 session_id 422 | 无 | POST {"message":"帮我跑水稻 SPL 家族鉴定"} | 422;detail 含 session_id | L2 | P1 |
| TC-BIO-API-009 | FR-BIO-001 | LLM 超时降级 | mock LLM 延迟超过上限 | 读流至第 1 个事件 | 事件 data 含 code=PLAN_LLM_TIMEOUT 的降级提示;SSE 正常关闭 | L2 | P1 |
| TC-BIO-API-010 | FR-BIO-001 | vstore 不可用降级 | mock vstore 返回 500 | 读流至 plan_ready | plan_ready 正常返回(LLM 直接候选);data.source 标记=llm_only;无 5xx 中断 | L2 | P1 |
| TC-BIO-API-011 | FR-BIO-023 | 存档复用句式接口路径 | 归档「XXX」存在且含参数 | POST message「用 XXX 存档任务的方法帮我跑玉米 bZIP」读流至 job_created | job_created.data.reused_archive=XXX;bio_jobs 行参数=存档参数 | L2 | P0 |
| TC-BIO-API-012 | FR-BIO-026 | 流程咨询接口路径 | 任务已存在 | POST message「identify 需要什么输入」读流 | 事件含 message_done;data.citations[] 含来源文件+章节;不产生新 job_created | L2 | P0 |
| TC-BIO-API-013 | FR-BIO-014 | 断流时任务不回滚 | mock docker 慢 | 流中途关闭客户端 | 任务在 DB 仍 in-flight;重连 events 接口可回放 | L2 | P1 |
| TC-BIO-API-014 | FR-BIO-001 | 客户端断开清理 | 任务尚未创建 | 收到首个字节后立即断开 | 服务端无未捕获异常;资源释放(无连接泄漏,服务存活) | L2 | P2 |
| TC-BIO-API-015 | FR-BIO-001 | 超长消息拒绝 | 无 | POST message=100001 字符 | 422(max_length 超限)或 400;不触发 LLM 调用 | L2 | P1 |
| TC-BIO-API-016 | FR-BIO-031 | 并发 chat 上限 | 已有 3 个 in-flight 任务 | 再发起第 4 个任务型消息 | 第 4 个任务不立即执行;事件 data 含 queued=true 或状态=queued | L2 | P0 |
| TC-BIO-API-017 | FR-BIO-014 | 断线重连回放快照 | 任务含 3 阶段(1 done 1 running 1 waiting) | GET /api/bioflow/jobs/{id}/events 首帧 | 首帧 data 为任务快照:stages 数组=3、每阶段含 status;无 stage_* 事件丢失 | L2 | P0 |
| TC-BIO-API-018 | FR-BIO-001 | 事件包含 plan_ready 后必有确认点 | 候选路径选定 | 读事件序列 | 序列中出现 stage_await_confirm(或 plan_ready);事件顺序由 seq 严格递增 | L2 | P1 |
| TC-BIO-API-019 | FR-BIO-001 | chat/stream 400 请求体非 JSON | 无 | POST body="not-json" Content-Type: application/json | 400 或 422 | L2 | P2 |
| TC-BIO-API-020 | FR-BIO-001 | LLM 完全不可用 | mock LLM 连接拒绝 | 读流至第 1 个事件 | 事件 data 含 code=PLAN_UNAVAILABLE;SSE 关闭;无 job 落库 | L2 | P1 |
| TC-BIO-API-021 | FR-BIO-002 | catalog 返回 73 阶段 | 服务正常 | GET /api/bioflow/catalog | 200;data.stages 数组 length=73;每项含 name/description/params/inputs/outputs | L2 | P0 |
| TC-BIO-API-022 | FR-BIO-002 | catalog 基因家族链 18 阶段 | 无 | GET /api/bioflow/catalog?chain=gene_family | 200;返回 18 项;name 集合与 stage_image_map 的 gf 链一致 | L2 | P0 |
| TC-BIO-API-023 | FR-BIO-002 | catalog 参数 schema | 无 | GET /api/bioflow/catalog?stage=identify | 返回 identify 项;params[] 每项含 name/type/default/source/help;inputs 含 fasta/hmm 类 | L2 | P0 |
| TC-BIO-API-024 | FR-BIO-002 | catalog 未知阶段 404 | 无 | GET /api/bioflow/catalog?stage=nope | 404 信封 code=NOT_FOUND | L2 | P1 |
| TC-BIO-API-025 | FR-BIO-002 | catalog 镜像映射字段 | 无 | GET /api/bioflow/catalog?stage=identify | 该项 image 字段=bioflow-gf(与 stage_image_map.json 一致) | L2 | P1 |
| TC-BIO-API-026 | FR-BIO-002 | catalog 缓存无效时重载 | 修改 catalog 源后 | GET /api/bioflow/catalog | 返回新数据(无服务重启);ETag 或 Last-Modified 变化 | L2 | P2 |
| TC-BIO-API-027 | FR-BIO-004 | POST jobs 创建任务 | 候选链已选定 | POST /api/bioflow/jobs {"session_id":"s1","title":"SPL 鉴定","stages":["identify","align","phylogeny"],"params":{}} | 201;body 含 id/uuid、title、status=created、stages 数组 3 项(status=waiting) | L2 | P0 |
| TC-BIO-API-028 | FR-BIO-004 | POST jobs 缺 stages 422 | 无 | POST {"session_id":"s1","title":"t"} | 422;detail 含 stages | L2 | P1 |
| TC-BIO-API-029 | FR-BIO-023 | POST jobs 复用归档 | 归档 a1 含阶段链+参数 | POST {"session_id":"s1","archive_id":"a1"} | 201;body.stages=归档阶段链;params=归档参数;bio_archives 行 reused_count+1 | L2 | P0 |
| TC-BIO-API-030 | FR-BIO-004 | POST jobs 未知 stage 拒绝 | 无 | POST {"stages":["ghost_stage"]} | 422/400;detail 点名 ghost_stage 不在 catalog | L2 | P1 |
| TC-BIO-API-031 | FR-BIO-004 | POST jobs 缺 session_id 422 | 无 | POST {"title":"t","stages":["identify"]} | 422;detail 含 session_id | L2 | P1 |
| TC-BIO-API-032 | FR-BIO-024 | GET jobs 列表 | 库中 3 个任务 | GET /api/bioflow/jobs | 200;data.items length=3;按 created_at 倒序;每项含 id/title/status/progress | L2 | P0 |
| TC-BIO-API-033 | FR-BIO-024 | GET jobs 分页 | 25 个任务 | GET /api/bioflow/jobs?page=2&page_size=10 | 200;items length=10;total=25 | L2 | P1 |
| TC-BIO-API-034 | FR-BIO-024 | GET job 详情 | 任务含 3 阶段 | GET /api/bioflow/jobs/{id} | 200;body.stages length=3 且各含 stage/status/params;progress 为数字 0-100 | L2 | P0 |
| TC-BIO-API-035 | FR-BIO-024 | GET job 404 | 无 | GET /api/bioflow/jobs/not-exist | 404 信封 code=NOT_FOUND | L2 | P1 |
| TC-BIO-API-036 | FR-BIO-024 | 任务阶段子资源 | 任务 j1 | GET /api/bioflow/jobs/{j1}/stages | 200;数组与任务阶段一致,含每阶段开始/结束时间 | L2 | P1 |
| TC-BIO-API-037 | FR-BIO-024 | DELETE job | 任务 j1 | DELETE /api/bioflow/jobs/{j1} | 204;GET 后 404;bio_stages 级联删除 | L2 | P1 |
| TC-BIO-API-038 | FR-BIO-024 | DELETE 进行中任务 | 任务 running | DELETE /api/bioflow/jobs/{id} | 409 信封 code=JOB_RUNNING(拒绝) | L2 | P1 |
| TC-BIO-API-039 | FR-BIO-006 | POST files 上传 | 任务 j1 起始阶段 await_files | POST /api/bioflow/jobs/{j1}/files multipart file=test.fa | 200;body 含 file_id/name/size=测试文件字节数/path 以 /job/{j1}/input/ 开头 | L2 | P0 |
| TC-BIO-API-040 | FR-BIO-006 | 上传写入任务目录 | 同上 | 上传后读服务器文件系统 | 文件存在于任务 input 目录;内容字节与上传一致 | L2 | P0 |
| TC-BIO-API-041 | FR-BIO-006 | 大文件流式上传 | 456MB fixture | 上传并统计内存峰值 | 200;服务端内存峰值 < 200MB(流式不整读) | L2 | P0 |
| TC-BIO-API-042 | FR-BIO-007 | 路径登记合法 | 任务 j1 | POST /api/bioflow/jobs/{j1}/files {"server_path":"/home/xzq/5090/teamWorkspace/zh/bioflow-data/examples/SPL.fa"} | 200;body 含登记记录 path;GET files 列表可见;无文件复制(path 指向原位) | L2 | P0 |
| TC-BIO-API-043 | FR-BIO-007 | 路径登记不存在文件 | 无 | POST files {"server_path":"/nonexistent/x.fa"} | 400 信封 code=PATH_NOT_EXIST;无登记记录 | L2 | P0 |
| TC-BIO-API-044 | FR-BIO-007 | 路径登记目录而非文件 | 无 | POST files {"server_path":"/tmp"} | 400 信封 code=NOT_A_FILE | L2 | P1 |
| TC-BIO-API-045 | FR-BIO-007 | 路径登记非白名单根 | 无 | POST files {"server_path":"/etc/passwd"} | 403 信封 code=PATH_NOT_ALLOWED(限 BIOFLOW_DATA_ROOT/任务目录内) | L2 | P0 |
| TC-BIO-API-046 | FR-BIO-006 | 上传类型限制 | 任务 j1 | 上传 file.exe(扩展名不在白名单) | 422;detail 指明扩展名不允 | L2 | P1 |
| TC-BIO-API-047 | FR-BIO-006 | 上传大小上限 | 任务 j1 | 上传超过上限的 fixture | 413;detail 含 max_size 与实到字节数 | L2 | P1 |
| TC-BIO-API-048 | FR-BIO-006 | GET files 列表 | 任务 j1 已登记 2 文件 | GET /api/bioflow/jobs/{j1}/files | 200;items length=2;每项含 name/path/size/registered_at;含服务器路径登记项 source=server_path | L2 | P0 |
| TC-BIO-API-049 | FR-BIO-006 | 上传完成事件 | 任务 j1 await_files | 上传满足阶段输入 | 后续事件流出现 stage_started(该阶段不再 await_files);bio_stages 状态=waiting_confirm 或 running | L2 | P0 |
| TC-BIO-API-050 | FR-BIO-006 | 上传失败不登记 | mock 磁盘写失败 | 上传 | 500 信封;files 列表不含该文件 | L2 | P2 |
| TC-BIO-API-051 | FR-BIO-006 | 同文件重复上传 | 已上传 a.fa | 再次上传同名 a.fa | 200;新 file_id;input 目录 a.fa 被覆盖(或 409 按实现断言其一,二选一固定) | L2 | P1 |
| TC-BIO-API-052 | FR-BIO-006 | 多文件并发上传 | 任务 j1 | 并发 3 个 multipart 上传 | 3 个均 200;files 列表 length=3;无文件交错损坏(各 size 与源一致) | L2 | P1 |
| TC-BIO-API-053 | FR-BIO-006 | 中文文件名 | 任务 j1 | 上传「水稻基因组.fa」 | 200;files 列表 name=水稻基因组.fa 且 URL 编码取回正确 | L2 | P2 |
| TC-BIO-API-054 | FR-BIO-006 | 空文件上传 | 任务 j1 | 上传 0 字节文件 | 200 且 size=0(或 422 按实现断言其一,二选一固定) | L2 | P2 |
| TC-BIO-API-055 | FR-BIO-006 | GET files 单文件内容 | 已上传 a.fa | GET /api/bioflow/jobs/{j1}/files/{file_id}/content | 200;Content-Type 与文件一致;body 字节与源一致 | L2 | P1 |
| TC-BIO-API-056 | FR-BIO-008 | confirm 发起执行 | 阶段 identify 状态 waiting_confirm | POST /api/bioflow/jobs/{j1}/stages/identify/confirm {"params":{"cpu":8}} | 200;body.status=running;bio_stages 参数已存 cpu=8 | L2 | P0 |
| TC-BIO-API-057 | FR-BIO-009 | confirm 参数覆盖 | 默认参数 cpu=4 | POST confirm {"params":{"cpu":16}} | 后续 mock docker 命令含 --cpu 16(非 4);stage 执行用新值 | L2 | P0 |
| TC-BIO-API-058 | FR-BIO-008 | confirm 拒绝非 schema 参数 | 无 | POST confirm {"params":{"magic":"x"}} | 422;detail 含 magic 未知参数 | L2 | P1 |
| TC-BIO-API-059 | FR-BIO-009 | 重复 confirm 幂等 | 阶段已 running | 再次 POST confirm | 409 信封 code=STAGE_NOT_CONFIRMABLE | L2 | P1 |
| TC-BIO-API-060 | FR-BIO-009 | confirm 未知阶段 | 无 | POST /stages/nope/confirm | 404 信封 | L2 | P1 |
| TC-BIO-API-061 | FR-BIO-009 | confirm 非等待态 | 阶段 done | POST confirm | 409 信封 code=INVALID_STAGE_TRANSITION | L2 | P1 |
| TC-BIO-API-062 | FR-BIO-012 | rerun 失败阶段 | 阶段 failed | POST /api/bioflow/jobs/{j1}/stages/{st}/rerun | 200;状态=running 或 waiting_confirm(rerun_with_params);bio_stages 新增 attempt 记录 | L2 | P0 |
| TC-BIO-API-063 | FR-BIO-012 | rerun 带新参数 | 阶段 failed | POST rerun {"params":{"cpu":2}} | mock docker 命令含 --cpu 2;成功后状态=done | L2 | P0 |
| TC-BIO-API-064 | FR-BIO-012 | rerun 非 failed 409 | 阶段 done | POST rerun | 409 信封 code=STAGE_NOT_FAILED | L2 | P1 |
| TC-BIO-API-065 | FR-BIO-012 | skip 失败阶段 | 阶段 failed | POST /api/bioflow/jobs/{j1}/stages/{st}/skip | 200;状态=skipped;事件流出现 stage_skipped | L2 | P0 |
| TC-BIO-API-066 | FR-BIO-012 | skip 非 failed 409 | 阶段 running | POST skip | 409 信封 | L2 | P1 |
| TC-BIO-API-067 | FR-BIO-010 | pause 生效 | 任务 2/5 阶段 running | POST /api/bioflow/jobs/{j1}/pause | 200;状态=paused;事件 job_paused;当前阶段不启新 docker | L2 | P0 |
| TC-BIO-API-068 | FR-BIO-010 | pause 已完成任务 409 | 任务 done | POST pause | 409 信封 code=JOB_NOT_RUNNING | L2 | P1 |
| TC-BIO-API-069 | FR-BIO-010 | resume 继续 | 任务 paused | POST /api/bioflow/jobs/{j1}/resume | 200;状态=running;等待确认的阶段回到 waiting_confirm(不跳过确认) | L2 | P0 |
| TC-BIO-API-070 | FR-BIO-010 | resume 非 paused 409 | 任务 created | POST resume | 409 信封 | L2 | P1 |
| TC-BIO-API-071 | FR-BIO-011 | manifest+日志尾 | 阶段 identify done | GET /api/bioflow/jobs/{j1}/stages/identify/manifest | 200;body 含 manifest 对象与 log_tail 字符串;log_tail 行数≤80 | L2 | P0 |
| TC-BIO-API-072 | FR-BIO-011 | manifest 日志恰好 80 行边界 | 日志 80 行 fixture | GET manifest | log_tail 行数=80 且含第 1 行与第 80 行 | L2 | P1 |
| TC-BIO-API-073 | FR-BIO-011 | 日志超 80 行截尾 | 日志 200 行 fixture | GET manifest | log_tail 行数=80 且为最后 80 行(第 1 行=原第 121 行) | L2 | P1 |
| TC-BIO-API-074 | FR-BIO-011 | manifest 404 | 未执行阶段 | GET .../stages/nope/manifest | 404 信封 | L2 | P1 |
| TC-BIO-API-075 | FR-BIO-011 | manifest 判成败字段 | 阶段失败 fixture | GET manifest | body.manifest.status 存在且为 failed;log_tail 含报错行 | L2 | P0 |
| TC-BIO-API-076 | FR-BIO-011 | 日志尾含 ANSI 色码清洗 | 日志含 \x1b[31m | GET manifest | log_tail 不含原始转义序列(已清洗或原样两态断言其一) | L2 | P2 |
| TC-BIO-API-077 | FR-BIO-014 | events SSE 全事件序列 | mock 任务跑通 3 阶段 | GET /api/bioflow/jobs/{j1}/events 收集全部事件 | 事件序列=job_created→plan_ready→stage_started→stage_log(≥1)→stage_await_confirm→stage_done(×3 阶段)→job_done;seq 严格递增 | L2 | P0 |
| TC-BIO-API-078 | FR-BIO-014 | events 断线重连回放 | 任务 3 阶段(1 done 1 running 1 waiting) | GET events | 首帧快照后按事件序补齐历史:stage_done(第 1 阶段)必回放;不含重复 stage_done | L2 | P0 |
| TC-BIO-API-079 | FR-BIO-014 | events 单阶段过滤 | 任务多阶段 | GET /api/bioflow/jobs/{j1}/events?stage=identify | 仅 identify 的事件;不含其他阶段事件 | L2 | P1 |
| TC-BIO-API-080 | FR-BIO-014 | events 心跳保活 | 任务运行中无新事件 | 等待 2×心跳间隔 | 收到至少 1 条 :keepalive 注释行;连接未断 | L2 | P1 |
| TC-BIO-API-081 | FR-BIO-014 | events job_done 后关闭 | 任务 done | 读流至 job_done | 收到 job_done 后服务端正常关闭连接 | L2 | P1 |
| TC-BIO-API-082 | FR-BIO-014 | events 客户端断开清理 | 任务运行中 | 断开 events 连接 | 订阅者计数回落;服务无泄漏(再连正常) | L2 | P2 |
| TC-BIO-API-083 | FR-BIO-014 | events 事件 id 递增 | 任务运行中 | 读全部事件 | 每个事件 data.seq 比前一事件 +1,无重复 seq | L2 | P1 |
| TC-BIO-API-084 | FR-BIO-019 | revise 重跑绘图阶段 | 报告任务含绘图阶段 plot_heatmap | POST /api/bioflow/report/{job_id}/revise {"target":"图1 颜色","instruction":"红色","params":{"color":"red"}} | 200;body 含 rerun_stage=plot_heatmap;该阶段 attempt+1 且状态=running | L2 | P0 |
| TC-BIO-API-085 | FR-BIO-019 | revise 后新图回填 | 绘图阶段重跑完成 | 轮询 job 状态至 done;GET report | 报告 HTML 中对应图 fig://id 的 base64 内容变化(与 revise 前不同) | L2 | P0 |
| TC-BIO-API-086 | FR-BIO-019 | revise 纯文字指令走 docgen | 报告已登记 | POST revise {"instruction":"首段字号加大"}(无图表目标) | 不触发绘图阶段重跑;调用报告编辑链路(docgen);报告文字更新 | L2 | P1 |
| TC-BIO-API-087 | FR-BIO-020 | 存档 POST | 任务 done 含报告 | POST /api/bioflow/archives {"job_id":"j1","name":"SPL 水稻鉴定","description":"...","include_intermediate":true} | 201;body 含 id/name/disk_path/size_bytes>0;磁盘路径目录存在且含 report.html | L2 | P0 |
| TC-BIO-API-088 | FR-BIO-020 | 存档名称缺失 422 | 任务 done | POST {"job_id":"j1"} | 422;detail 含 name | L2 | P1 |
| TC-BIO-API-089 | FR-BIO-020 | 放弃存档不调接口 | 前端已出提示 | 点击放弃后观察网络 | 无 POST /api/bioflow/archives 请求 | L4 | P1 |
| TC-BIO-API-090 | FR-BIO-022 | GET archives 列表 | 3 个归档 | GET /api/bioflow/archives | 200;items length=3 按 created_at 倒序;每项含 name/description/size/disk_path | L2 | P0 |
| TC-BIO-API-091 | FR-BIO-022 | GET archive 详情 | 归档 a1 | GET /api/bioflow/archives/{a1} | 200;含 stages 链、params、report_artifact、文件清单 | L2 | P0 |
| TC-BIO-API-092 | FR-BIO-022 | DELETE archive | 归档 a1 | DELETE /api/bioflow/archives/{a1} | 204;磁盘目录删除;GET 后 404 | L2 | P1 |
| TC-BIO-API-093 | FR-BIO-022 | DELETE archive 404 | 无 | DELETE /api/bioflow/archives/nope | 404 信封 | L2 | P1 |
| TC-BIO-API-094 | FR-BIO-023 | archive run 复用发起 | 归档 a1 | POST /api/bioflow/archives/{a1}/run {"session_id":"s1","target":"玉米 bZIP"} | 201;新任务 job_id 返回;stages=归档链;params 预填归档值 | L2 | P0 |
| TC-BIO-API-095 | FR-BIO-023 | 名称精确匹配优先 | 归档「SPL」与「SPL2」 | POST archives/run {"name":"SPL"} | 命中 SPL(精确优先) | L2 | P1 |
| TC-BIO-API-096 | FR-BIO-023 | 名称模糊候选 | 归档「水稻SPL」 | POST archives/run {"name":"SPL 水稻"} | 返回候选列表(≥1)且不含无关归档 | L2 | P1 |
| TC-BIO-API-097 | FR-BIO-023 | 复用无匹配 404 | 无 | POST archives/run {"name":"不存在"} | 404 信封 code=ARCHIVE_NOT_FOUND | L2 | P1 |
| TC-BIO-API-098 | FR-BIO-020 | 重名归档 409 | 已有归档名「X」 | POST archives {"name":"X"} | 409 信封(或 201 自动去重两态断言其一) | L2 | P2 |
| TC-BIO-API-099 | FR-BIO-025 | health 探活 | 服务运行 | GET /api/bioflow/health | 200;body 含 status=ok 与 db 连通状态字段 | L2 | P0 |
| TC-BIO-API-100 | FR-BIO-028 | BFF 反代开关开启态 | BIOFLOW_ENABLED=true | GET http://BFF/api/bioflow/health | 200 且响应体=直连 8098 响应体 | L2 | P0 |
| TC-BIO-API-101 | FR-BIO-028 | BFF 反代开关关闭态 | BIOFLOW_ENABLED=false | GET http://BFF/api/bioflow/health | 404(路由未注册) | L2 | P0 |
| TC-BIO-API-102 | FR-BIO-028 | 反代 SSE 透传不缓冲 | BFF 反代开启;任务运行 | 经 BFF 连 events 测首字节延迟 | 首帧到达延迟与直连差 <500ms;流连续无缓冲合并 | L2 | P0 |
| TC-BIO-API-103 | FR-BIO-028 | BFF 停而生信服务直连可用 | BFF 停止(mock) | 直连 GET :8098/api/bioflow/health | 200;任务可继续(GET jobs 正常) | L2 | P0 |
| TC-BIO-API-104 | FR-BIO-015 | 报告登记端点 | 任务 done 报告在任务目录 | BFF 调用报告登记(字段 job_id/标题/md/图清单) | doc_artifacts 表出现新行;字段与 docgen 报告表对齐 | L2 | P0 |
| TC-BIO-API-105 | FR-BIO-006 | 反代上传超时单独调大 | BFF 反代开启 | 经 BFF 上传 456MB fixture | 200;无 502/504;服务端统计耗时正常 | L2 | P1 |
| TC-BIO-API-106 | FR-BIO-007 | 路径登记经 BFF 反代 | 反代开启 | 经 BFF POST files {"server_path": 合法} | 200 且直连与反代结果一致 | L2 | P2 |
| TC-BIO-API-107 | FR-BIO-004 | jobs 创建后进度字段 | 新任务 | GET job | progress=0;stages 全部 waiting | L2 | P1 |
| TC-BIO-API-108 | FR-BIO-011 | 日志尾非 running 阶段也可见 | 阶段 done | GET manifest | 200;log_tail 非空(保留最后执行日志) | L2 | P1 |
| TC-BIO-API-109 | FR-BIO-031 | 第 4 并发任务排队 | 3 任务 running(mock) | 创建第 4 任务并 confirm | 第 4 任务不立即出 stage_started;前 3 任一完成后方出现 | L2 | P0 |
| TC-BIO-API-110 | FR-BIO-031 | 并发信号量可配 | BIOFLOW_CONCURRENCY=1 重启 | 2 任务并发 | 始终只有 1 个 docker 在跑(mock 计数=1) | L2 | P1 |
| TC-BIO-API-111 | FR-BIO-031 | 重启续跑不重跑已完成 | 任务 3 阶段(1 done 1 running);重启服务 | 观察 | 重启后第 1 阶段保持 done(无新 attempt);第 2 阶段从断点续跑 | L2 | P0 |
| TC-BIO-API-112 | FR-BIO-024 | 任务列表过滤状态 | 库中 done/failed 各一 | GET /api/bioflow/jobs?status=failed | items 仅 failed 任务 | L2 | P1 |
| TC-BIO-API-113 | FR-BIO-024 | 任务列表按会话过滤 | 会话 s1 2 任务 | GET /api/bioflow/jobs?session_id=s1 | items length=2 | L2 | P1 |
| TC-BIO-API-114 | FR-BIO-002 | catalog 阶段用途文案 | 无 | GET catalog?stage=identify | description 非空中文文案(含输入输出描述) | L2 | P1 |
| TC-BIO-API-115 | FR-BIO-029 | 执行日志含资源参数 | 阶段 running(mock docker 记录命令) | 读 stage_log | 日志或 mock 记录含 --cpus 与 --memory 数值 | L2 | P0 |
| TC-BIO-API-116 | FR-BIO-029 | 镜像按阶段映射 | identify 阶段 | mock 记录 docker 命令 | 命令镜像=bioflow-gf(stage_image_map 映射) | L2 | P0 |
| TC-BIO-API-117 | FR-BIO-029 | 容器 --user 宿主机 uid | 阶段执行 | mock 记录命令 | 含 --user 且值=服务进程 uid | L2 | P0 |
| TC-BIO-API-118 | FR-BIO-029 | BIOFLOW_DATA 只读挂载 | 阶段执行 | mock 记录命令 | 含 -v {BIOFLOW_DATA_ROOT}:/bioflow-data:ro | L2 | P0 |
| TC-BIO-API-119 | FR-BIO-029 | 容器退出即清理 | 阶段完成 | mock 记录 | 含 --rm 标志 | L2 | P1 |
| TC-BIO-API-120 | FR-BIO-006 | 上传无任务 404 | 无 | POST /api/bioflow/jobs/nope/files | 404 信封 | L2 | P1 |
| TC-BIO-API-121 | FR-BIO-008 | confirm 空参数体 | 阶段 waiting_confirm | POST confirm {} | 200;按默认参数执行 | L2 | P1 |
| TC-BIO-API-122 | FR-BIO-010 | 暂停含排队任务 | 任务 queued | POST pause | 200;队列移除且状态=paused | L2 | P1 |
| TC-BIO-API-123 | FR-BIO-016 | 报告登记含图清单 | 报告含 2 图 | 登记 | doc_artifacts 行图清单字段含 2 个 fig id | L2 | P1 |
| TC-BIO-API-124 | FR-BIO-015 | 报告 HTML 单文件 | 任务 done | 读任务目录报告文件 | 单 .html 文件;图以 data:image/...;base64 内嵌(无外部图文件引用) | L2 | P0 |
| TC-BIO-API-125 | FR-BIO-015 | 报告含各阶段 manifest 事实 | 任务 done | 解析报告 HTML | 含 identify 阶段输出数量等 manifest 事实数据 | L2 | P1 |
| TC-BIO-API-126 | FR-BIO-014 | events 未知 job 404 | 无 | GET /api/bioflow/jobs/nope/events | 404 信封 | L2 | P1 |
| TC-BIO-API-127 | FR-BIO-011 | stage_log 事件日志尾推送 | 阶段 running | 读 events | stage_log 事件 data.log 字段非空且随执行追加 | L2 | P0 |
| TC-BIO-API-128 | FR-BIO-014 | 断线期间事件不丢 | 任务 running;断开 5s 重连 | 重连读事件 | 断开期间产生的 stage_log 全部回放 | L2 | P0 |
| TC-BIO-API-129 | FR-BIO-020 | 存档含中间文件开关 | 任务 done 含中间文件 | POST archives include_intermediate=true | 磁盘目录含中间产物;size 更大 | L2 | P1 |
| TC-BIO-API-130 | FR-BIO-020 | 存档不含中间文件 | 同上 | POST archives include_intermediate=false | 磁盘目录不含中间产物目录 | L2 | P1 |
| TC-BIO-API-131 | FR-BIO-021 | 存档状态回复字段 | 存档完成 | 读对话消息 | 消息含名称/位置/大小三要素字段 | L2 | P0 |
| TC-BIO-API-132 | FR-BIO-023 | run 后新任务入列表 | POST archives/run | GET jobs | 新任务出现在列表(title 含 target) | L2 | P1 |
| TC-BIO-API-133 | FR-BIO-025 | health 失败 503 | 服务 db 损坏(mock) | GET health | 503 或 200 带 db:error 字段(两态断言其一) | L2 | P1 |
| TC-BIO-API-134 | FR-BIO-028 | 生信服务独立进程 | 无 | 检查进程表 | 8098 进程独立于 BFF;BFF 重启后 8098 存活 | L2s | P0 |
| TC-BIO-API-135 | FR-BIO-028 | 独立 SQLite | 无 | 检查文件 | bioflow.db 存在于生信数据根;BFF 无同表 | L2s | P1 |
| TC-BIO-API-136 | FR-BIO-001 | chat 流错误信封 | mock LLM 500 | 读流 | SSE data 含 code/msg 错误信封结构 | L2 | P1 |
| TC-BIO-API-137 | FR-BIO-002 | plan_ready 用途字段非空 | mock LLM | 读 plan_ready | 每条 candidate.purpose 非空 | L2 | P1 |
| TC-BIO-API-138 | FR-BIO-004 | 确认创建任务后 SSE 建库 | 前端确认 | 读事件 | job_created 后 GET job 200 且状态=created | L2 | P0 |
| TC-BIO-API-139 | FR-BIO-031 | 任务失败不占并发 | 任务失败 | 创建新任务 confirm | 新任务立即执行(信号量已释放) | L2 | P1 |
| TC-BIO-API-140 | FR-BIO-012 | 改参数重跑走 confirm | 阶段 failed | POST rerun {"params":{...}} | 状态=waiting_confirm(表单再确认)或直接 running(两态断言其一) | L2 | P1 |
| TC-BIO-API-141 | FR-BIO-022 | 归档文件下载 | 归档 a1 | GET /api/bioflow/archives/{a1}/download | 200 zip/目录打包流;可解压 | L2 | P1 |
| TC-BIO-API-142 | FR-BIO-022 | 归档报告单独取 | 归档 a1 含报告 | GET /api/bioflow/archives/{a1}/report | 200;text/html 内容含 <html | L2 | P1 |
| TC-BIO-API-143 | FR-BIO-017 | 报告编辑落盘 | 报告已登记 | PATCH 报告文字 | 200;磁盘 HTML 内容更新 | L2 | P1 |
| TC-BIO-API-144 | FR-BIO-019 | revise 无绘图目标 422 | 报告任务 | POST revise {"instruction":"不明确"} | 422 或转 docgen(两态断言其一) | L2 | P2 |
| TC-BIO-API-145 | FR-BIO-002 | chat/stream 多候选单选 | 3 候选 | 用户选第 2 条(消息或 API 选) | 任务 stages=第 2 候选链 | L2 | P1 |
| TC-BIO-API-146 | FR-BIO-031 | 队列顺序 FIFO | 并发满 | 3 任务排队 | 完成 1 个后先入队者先执行 | L2 | P1 |
| TC-BIO-API-147 | FR-BIO-010 | 自动连续模式接口字段 | 任务开启 auto_continue | 读任务详情 | job.auto_continue=true;阶段间跳过 confirm | L2 | P0 |
| TC-BIO-API-148 | FR-BIO-010 | 自动连续暂停停在下一阶段前 | auto_continue 任务暂停 | 读任务 | 当前阶段等待且未 confirm;无跳过 | L2 | P1 |
| TC-BIO-API-149 | FR-BIO-004 | 创建任务重复 id 幂等 | POST jobs 两次相同 payload | 两次 | 产生 2 个不同 job id(或 409 二选一固定) | L2 | P2 |
| TC-BIO-API-150 | FR-BIO-009 | confirm 参数类型校验 | 无 | confirm {"params":{"cpu":"abc"}} | 422;detail 含 cpu 类型错误 | L2 | P1 |
### 6.1.3 RUN runner 状态机(L1 单元,mock docker 执行)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-RUN-001 | FR-BIO-031 | 全链成功推进 | 3 阶段任务 mock docker 全 0 退出 | run | 阶段状态依次 running→done;任务=done;事件序 stage_started/stage_done 成对 | L1 | P0 |
| TC-BIO-RUN-002 | FR-BIO-012 | 阶段失败转 failed | mock docker 退出码 1 | run | 状态=failed;事件 stage_failed;后续阶段不执行(任务停在 failed 阶段) | L1 | P0 |
| TC-BIO-RUN-003 | FR-BIO-012 | 失败后 rerun 成功 | 同上 | rerun | attempt=2;状态 done;继续后续阶段 | L1 | P0 |
| TC-BIO-RUN-004 | FR-BIO-012 | 失败后 skip | 阶段 failed | skip | 状态=skipped;事件 stage_skipped;后续阶段可执行 | L1 | P0 |
| TC-BIO-RUN-005 | FR-BIO-012 | 失败后改参数重跑 | 阶段 failed | rerun_with_params {"cpu":8} | 新执行命令含 cpu=8;成功 | L1 | P0 |
| TC-BIO-RUN-006 | FR-BIO-010 | 暂停在阶段边界 | 阶段 2 running 完成时 pause | 观察 | 阶段 2 done 后阶段 3 不启动;任务=paused;事件 job_paused | L1 | P0 |
| TC-BIO-RUN-007 | FR-BIO-010 | 暂停后恢复续跑 | 任务 paused | resume | 从下一阶段继续;不重跑已完成 | L1 | P0 |
| TC-BIO-RUN-008 | FR-BIO-031 | 重启续跑不重跑 | 任务 2/5 阶段 done;模拟重启加载 DB | 重启恢复 | 已 done 阶段 attempt 不变;从第 3 阶段续跑 | L1 | P0 |
| TC-BIO-RUN-009 | FR-BIO-031 | 重启恢复 in-flight | running 阶段无完成标记;重启 | 恢复 | 该阶段按 manifest 判成败:有 manifest 且成功→done;否则重跑 | L1 | P0 |
| TC-BIO-RUN-010 | FR-BIO-031 | 并发上限排队 | BIOFLOW_CONCURRENCY=3;4 任务 | run | 同时 running 的 docker ≤3;第 4 任务 queued | L1 | P0 |
| TC-BIO-RUN-011 | FR-BIO-031 | 并发槽释放 | 任务 1 完成 | 观察 | 队列头立即启动 | L1 | P1 |
| TC-BIO-RUN-012 | FR-BIO-029 | 阶段超时 | mock docker 不退出;timeout=1s | run | 阶段=failed(reason=timeout);容器被 kill;日志含超时记录 | L1 | P0 |
| TC-BIO-RUN-013 | FR-BIO-031 | 日志截断只留尾 | mock 输出 500 行 | run | bio_stages.log_tail 行数=80 且为末 80 行 | L1 | P0 |
| TC-BIO-RUN-014 | FR-BIO-029 | 退出码非 0 判失败 | mock 退出码 3 | run | 状态=failed;log_tail 含 stderr | L1 | P0 |
| TC-BIO-RUN-015 | FR-BIO-031 | 退出码 0 但 manifest 缺 | 无 manifest 产出 | run | 阶段=failed(reason=no_manifest) | L1 | P0 |
| TC-BIO-RUN-016 | FR-BIO-029 | manifest 失败标记判败 | manifest status=failed | run | 阶段=failed(不因退出码 0 误判成功) | L1 | P0 |
| TC-BIO-RUN-017 | FR-BIO-005 | 输入缺失等待文件 | 阶段 input 文件不存在 | run 至该阶段 | 状态=await_files;事件 stage_await_files;不启动 docker | L1 | P0 |
| TC-BIO-RUN-018 | FR-BIO-005 | 文件补齐自动推进 | await_files 后登记文件 | 触发 | 状态转 waiting_confirm(手动)或 running(自动连续);事件 stage_started | L1 | P0 |
| TC-BIO-RUN-019 | FR-BIO-008 | 阶段前等待确认 | 手动模式 | run 至阶段 | 状态=waiting_confirm;事件 stage_await_confirm;不执行 docker | L1 | P0 |
| TC-BIO-RUN-020 | FR-BIO-008 | 确认后执行 | waiting_confirm | confirm | docker 命令以表单参数构造;状态=running | L1 | P0 |
| TC-BIO-RUN-021 | FR-BIO-010 | 自动连续跳过确认 | auto_continue=true | run | 阶段间无 waiting_confirm;全程自动推进 | L1 | P0 |
| TC-BIO-RUN-022 | FR-BIO-010 | 自动连续可暂停 | auto_continue 任务 | pause | 停在当前阶段边界;恢复后仍自动连续 | L1 | P0 |
| TC-BIO-RUN-023 | FR-BIO-031 | 暂停恢复重入安全 | 任务 paused | resume 两次 | 第二次 resume 409/幂等无副作用 | L1 | P1 |
| TC-BIO-RUN-024 | FR-BIO-012 | 三选一状态校验 | 阶段 done | rerun/skip | 拒绝(状态机不越迁) | L1 | P1 |
| TC-BIO-RUN-025 | FR-BIO-031 | 并发信号量释放异常安全 | docker 执行抛异常 | 观察 | 信号量释放;任务转 failed;服务不挂 | L1 | P1 |
| TC-BIO-RUN-026 | FR-BIO-031 | 阶段间输入传递 | 上游 manifest 含 artifacts 路径 | run 下游 | 下游 docker 命令的 input 路径=上游 artifacts | L1 | P0 |
| TC-BIO-RUN-027 | FR-BIO-031 | 全部完成后归档提示事件 | 任务 done | 观察 | 事件 job_done 后紧跟 archive_suggest(或前端判 done 出提示,两态断言其一) | L1 | P1 |
| TC-BIO-RUN-028 | FR-BIO-024 | 多任务互不串扰 | 2 任务并发 | run | 各自状态/参数独立;无共享状态污染 | L1 | P1 |
| TC-BIO-RUN-029 | FR-BIO-024 | 任务进度数值 | 3 阶段任务完成 1 | 读进度 | progress=33(按完成阶段数/总阶段数) | L1 | P1 |
| TC-BIO-RUN-030 | FR-BIO-031 | 恢复时跳过已归档任务 | 已归档任务 in-flight 残留 | 重启 | 不重复执行(含 archive 状态检查) | L1 | P2 |
| TC-BIO-RUN-031 | FR-BIO-029 | docker 失败重试策略 | mock docker 偶发失败 | run | 按配置重试 N 次;最终 failed;attempt 数=N+1 | L1 | P1 |
| TC-BIO-RUN-032 | FR-BIO-005 | 多输入文件部分缺失 | 阶段需 2 文件缺 1 | run | await_files;事件 data 指明缺哪个文件 | L1 | P0 |
| TC-BIO-RUN-033 | FR-BIO-031 | 暂停时运行中阶段完成才停 | 阶段 running 且即将完成 | pause | 当前阶段完成→done 后任务才 paused(不杀容器) | L1 | P1 |
| TC-BIO-RUN-034 | FR-BIO-003 | 前置补全后链完整性 | 候选链缺前置 | 规划校验 | 补全后链包含前置;job.stages 完整 | L1 | P0 |
| TC-BIO-RUN-035 | FR-BIO-029 | 容器环境变量 BBA_* 注入 | 阶段执行 | mock 记录命令 | 含 -e BBA_*(至少 BBA_PFAM_DIR/BBA_RAG_MAPPING_FILE 其一) | L1 | P0 |
| TC-BIO-RUN-036 | FR-BIO-029 | 任务目录挂载 | 阶段执行 | mock 记录命令 | 含 -v {job_dir}/input:/job/input 与 -v {job_dir}/workspace:/job/workspace | L1 | P0 |
| TC-BIO-RUN-037 | FR-BIO-029 | 容器内命令形态 | 阶段执行 | mock 记录命令 | python -B -m cli.run_identify --input-dir /job/input --workspace /job/workspace(前缀两元素 python -B) | L1 | P0 |
| TC-BIO-RUN-038 | FR-BIO-031 | 阶段状态机非法迁移拒绝 | 任意状态 | 调用非法迁移 | 抛状态机错误/忽略(不写脏状态) | L1 | P1 |
| TC-BIO-RUN-039 | FR-BIO-031 | runner 无阶段空任务 | stages=[] | run | 直接 done;无 docker 调用 | L1 | P2 |
| TC-BIO-RUN-040 | FR-BIO-031 | 并发计数含 running 阶段 | 3 任务各 1 running | 观察 | 计数=3;新任务排队 | L1 | P1 |
| TC-BIO-RUN-041 | FR-BIO-031 | 阶段等待确认不占并发 | 任务 waiting_confirm | 观察 | 并发计数不含该任务 | L1 | P1 |
| TC-BIO-RUN-042 | FR-BIO-031 | 事件总线订阅多者广播 | 2 个 events 连接 | run 1 阶段 | 两连接收到相同事件序列 | L1 | P1 |
| TC-BIO-RUN-043 | FR-BIO-031 | 心跳期无事件不空转 | 任务 paused | 观察 CPU | 无 busy-loop(等待用事件/队列阻塞) | L1 | P2 |
| TC-BIO-RUN-044 | FR-BIO-024 | manifest 路径登记 | 阶段 done | 读 bio_stages | manifest_path 指向任务目录内真实文件 | L1 | P0 |
| TC-BIO-RUN-045 | FR-BIO-012 | 跳过事件携带阶段名 | skip | 读事件 | stage_skipped.data.stage=阶段名 | L1 | P1 |
| TC-BIO-RUN-046 | FR-BIO-031 | 长时间任务状态可查 | mock 慢执行 | 执行中 GET job | 状态=running;无阻塞(独立线程/协程) | L1 | P1 |
### 6.1.4 KERN 内核执行与 manifest(L1 单元 mock 命令拼装 + L2s 真实冒烟)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-KERN-001 | FR-BIO-029 | docker 命令拼装基元 | mock | 拼装 identify 阶段命令 | 数组元素依次:docker,run,--rm,--user,uid,-v×3,--cpus,--memory,-e×N,镜像,python,-B,-m,cli.run_identify,参数… | L1 | P0 |
| TC-BIO-KERN-002 | FR-BIO-029 | 挂载三目录 | mock | 拼装 | -v 含 input/workspace/BIOFLOW_DATA 三处;BIOFLOW_DATA 后带 :ro | L1 | P0 |
| TC-BIO-KERN-003 | FR-BIO-029 | --cpus 注入 | mock | 拼装 | 含 --cpus 且值来自阶段配置 | L1 | P0 |
| TC-BIO-KERN-004 | FR-BIO-029 | --memory 注入 | mock | 拼装 | 含 --memory 且格式如 64g | L1 | P0 |
| TC-BIO-KERN-005 | FR-BIO-029 | 环境变量拼装 | mock | 拼装 | 每项 env 输出为两个元素:-e 与 KEY=value | L1 | P0 |
| TC-BIO-KERN-006 | FR-BIO-029 | 容器命令转义安全 | 参数含空格 | 拼装 | 参数作为独立 argv 元素(subprocess list 传参,无 shell 注入) | L1 | P0 |
| TC-BIO-KERN-007 | FR-BIO-029 | 镜像映射查表 | mock | 查 align 阶段镜像 | 返回 bioflow-gf(stage_image_map.json) | L1 | P0 |
| TC-BIO-KERN-008 | FR-BIO-029 | 未知阶段镜像映射 | mock | 查未知阶段 | 返回 None 且执行前置拦截(不拼命令) | L1 | P1 |
| TC-BIO-KERN-009 | FR-BIO-029 | 超时 kill | mock docker 超时 | 观察 | 调用 kill/terminate;阶段 failed | L1 | P0 |
| TC-BIO-KERN-010 | FR-BIO-030 | 金标 24 成员 ID 全等 | bioflow-gf 镜像;金标输入 Ft.SPL | 镜像内跑 identify | 输出 ID 集合与 dev 预期 24 成员集合 diff 为空 | L2s | P0 |
| TC-BIO-KERN-011 | FR-BIO-030 | 金标 diff 命令空输出 | 同上 | 执行 diff 脚本 | stdout 为空;脚本退出码 0 | L2s | P0 |
| TC-BIO-KERN-012 | FR-BIO-032 | 18 入口 --help 冒烟 | 4 镜像齐 | 对 18 个 cli.run_* 逐条 python -B -m cli.run_x --help | 18/18 退出码 0;无 traceback | L2s | P0 |
| TC-BIO-KERN-013 | FR-BIO-032 | 镜像内 import 编译产物 | bioflow-gf 镜像 | python -c "import gfa_core.mas" | 成功(.so 加载无 ImportError) | L2s | P0 |
| TC-BIO-KERN-014 | FR-BIO-030 | manifest 解析成功路径 | 金标 manifest fixture | 解析 | 字段齐:status/artifacts/outputs/params/耗时 | L1 | P0 |
| TC-BIO-KERN-015 | FR-BIO-030 | manifest 缺失文件 | 无 manifest 文件 | 解析 | 返回错误(判失败 reason=no_manifest) | L1 | P0 |
| TC-BIO-KERN-016 | FR-BIO-030 | manifest 非法 JSON | 损坏内容 | 解析 | 返回解析错误;阶段 failed | L1 | P1 |
| TC-BIO-KERN-017 | FR-BIO-030 | manifest status 缺失 | JSON 无 status 键 | 解析 | 按退出码兜底判成败 | L1 | P1 |
| TC-BIO-KERN-018 | FR-BIO-030 | artifacts 路径提取 | manifest 含 artifacts | 解析 | 提取为下游输入(跨阶段输入定位) | L1 | P0 |
| TC-BIO-KERN-019 | FR-BIO-030 | 路径不存在时报错 | artifacts 指向缺失文件 | 解析 | 报错含具体路径(阶段失败) | L1 | P1 |
| TC-BIO-KERN-020 | FR-BIO-030 | 24 ID 去重与排序无关 | 金标输出乱序 | 比对 | 集合比对全等(顺序无关) | L2s | P1 |
| TC-BIO-KERN-021 | FR-BIO-032 | 4 镜像构建产物 | build_all.sh 完成 | 检查 | 4 镜像 tag 均存在(docker images 可见) | L2s | P0 |
| TC-BIO-KERN-022 | FR-BIO-032 | SHA256SUMS 产出 | 构建完成 | 检查 | 产物目录存在 SHA256SUMS 且含 4 条目 | L2s | P0 |
| TC-BIO-KERN-023 | FR-BIO-032 | 泄露门禁(明文凭据扫描) | 构建产物 | 扫描 .so/明文 | 无 ACCESS_KEY/SECRET 类凭据命中 | L2s | P0 |
| TC-BIO-KERN-024 | FR-BIO-029 | 数据不进镜像 | 构建产物 | 检查镜像层 | 镜像内无金标/用户数据文件 | L2s | P1 |
### 6.1.5 SSE 事件流与断线回放(L1 单元帧解析 + L2 序列)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-SSE-001 | FR-BIO-014 | 事件类型全集 | mock 全链 | 收集事件 | 出现类型 ∈ {job_created, plan_ready, stage_started, stage_log, stage_done, stage_failed, stage_skipped, stage_await_confirm, stage_await_files, job_done, job_paused, job_archived} 且无未知类型 | L1 | P0 |
| TC-BIO-SSE-002 | FR-BIO-014 | job_created 字段 | 创建任务 | 读事件 | data 含 job_id/title/stages | L1 | P0 |
| TC-BIO-SSE-003 | FR-BIO-014 | stage_started 字段 | 阶段启动 | 读事件 | data 含 stage/attempt/ts | L1 | P0 |
| TC-BIO-SSE-004 | FR-BIO-014 | stage_log 追加 | 阶段运行 | 读事件 | data.log 非空;多帧顺序=日志顺序 | L1 | P0 |
| TC-BIO-SSE-005 | FR-BIO-014 | stage_done 字段 | 阶段完成 | 读事件 | data 含 stage/exit_code=0/manifest_ref | L1 | P0 |
| TC-BIO-SSE-006 | FR-BIO-014 | stage_failed 字段 | 阶段失败 | 读事件 | data 含 stage/exit_code 非 0/reason | L1 | P0 |
| TC-BIO-SSE-007 | FR-BIO-014 | stage_skipped 字段 | 跳过 | 读事件 | data 含 stage | L1 | P0 |
| TC-BIO-SSE-008 | FR-BIO-014 | stage_await_confirm 字段 | 阶段待确认 | 读事件 | data 含 stage/form_defaults(参数默认值) | L1 | P0 |
| TC-BIO-SSE-009 | FR-BIO-014 | stage_await_files 字段 | 阶段待文件 | 读事件 | data 含 stage/required_files[](含缺失文件名) | L1 | P0 |
| TC-BIO-SSE-010 | FR-BIO-014 | job_done 收尾 | 任务完成 | 读事件 | data 含 job_id/耗时;为最后事件 | L1 | P0 |
| TC-BIO-SSE-011 | FR-BIO-014 | job_paused 字段 | 暂停 | 读事件 | data 含 job_id/当前阶段 | L1 | P0 |
| TC-BIO-SSE-012 | FR-BIO-014 | job_archived 字段 | 存档 | 读事件 | data 含 archive_id | L1 | P1 |
| TC-BIO-SSE-013 | FR-BIO-014 | seq 严格递增 | mock 帧序列 | 解析 seq | 后帧 seq=前帧 seq+1 | L1 | P0 |
| TC-BIO-SSE-014 | FR-BIO-014 | 帧解析空行容错 | 帧含多余空行 | 解析 | 正常解析不报错 | L1 | P1 |
| TC-BIO-SSE-015 | FR-BIO-014 | 多行 data 合并 | data 分行发送 | 解析 | 事件 data 按 \n 合并 | L1 | P1 |
| TC-BIO-SSE-016 | FR-BIO-014 | 心跳注释忽略 | 帧含 :keepalive | 解析 | 不产业务事件 | L1 | P1 |
| TC-BIO-SSE-017 | FR-BIO-014 | 坏帧不中断流 | 含未命名 data 帧 | 解析 | 跳过坏帧继续后续事件 | L1 | P1 |
| TC-BIO-SSE-018 | FR-BIO-014 | 前端 parser 兼容既有帧 | 既有 sse/parser.js 输出格式 | 解析 bioflow 帧 | 复用 parser 无改动可解析(红线零改动验证) | L3 | P0 |
| TC-BIO-SSE-019 | FR-BIO-014 | 事件序列全链顺序 | mock 3 阶段 | 收集序列 | 相对序:job_created<plan_ready<首 stage_started<末 stage_done<job_done | L2 | P0 |
| TC-BIO-SSE-020 | FR-BIO-014 | 失败序列 | mock 阶段 2 失败 | 收集 | 出现 stage_failed;无该阶段 stage_done;后续阶段无 stage_started | L2 | P0 |
| TC-BIO-SSE-021 | FR-BIO-014 | 跳过序列 | mock skip | 收集 | stage_skipped 出现在 stage_failed 之后 | L2 | P0 |
| TC-BIO-SSE-022 | FR-BIO-014 | 断线回放快照结构 | 任务 3 阶段中途 | 重连首帧 | 首帧 data.type=snapshot;data.job.status 与 DB 一致;data.stages 逐阶段含 status | L2 | P0 |
| TC-BIO-SSE-023 | FR-BIO-014 | 回放补齐事件序 | 断开 5s 期间 2 条 stage_log | 重连 | 快照后回放这 2 条;seq 连续 | L2 | P0 |
| TC-BIO-SSE-024 | FR-BIO-014 | 回放不重复已见事件 | 客户端带 last_seq 重连 | 重连 | 不重发 ≤last_seq 事件 | L2 | P0 |
| TC-BIO-SSE-025 | FR-BIO-014 | 前端重连机制 | 断网 30s | 观察前端 | 自动重连(重试/退避);进度卡整体刷新 | L3 | P0 |
| TC-BIO-SSE-026 | FR-BIO-014 | 前端回放刷新进度卡 | 快照 1 done 1 running 1 waiting | 应用快照 | 卡片三阶段状态与快照一致;日志尾区显示 | L3 | P0 |
| TC-BIO-SSE-027 | FR-BIO-014 | 重连失败提示 | 服务不可达 | 观察 | 进度卡显示断线态;有重连按钮/文案 | L3 | P1 |
| TC-BIO-SSE-028 | FR-BIO-014 | events 与 chat/stream 事件同源 | 同任务 | 对比两流 | 事件类型与 seq 一致 | L2 | P1 |
| TC-BIO-SSE-029 | FR-BIO-014 | 事件延迟心跳期间无重复 job_done | 任务 done | 读流 | job_done 仅 1 次 | L2 | P1 |
| TC-BIO-SSE-030 | FR-BIO-014 | 快照含日志尾 | 阶段 running 有日志 | 重连快照 | snapshot.stages[*].log_tail 非空 | L2 | P0 |
| TC-BIO-SSE-031 | FR-BIO-014 | Last-Event-ID 续传 | 断连时记录 id | 重连带 Last-Event-ID | 服务从该 id 后补发 | L2 | P1 |
| TC-BIO-SSE-032 | FR-BIO-014 | 前端事件更新器幂等 | 重复 stage_done 帧 | 应用两次 | 阶段状态仍 done;无异常 | L3 | P1 |
### 6.1.6 DB 三表迁移与持久化(L1)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-DB-001 | FR-BIO-028 | 三表创建 | 空库 | 初始化 | bio_jobs/bio_stages/bio_archives 三表存在;schema 含任务书字段 | L1 | P0 |
| TC-BIO-DB-002 | FR-BIO-028 | 迁移幂等 | 已初始化 | 重复跑迁移 | 无异常;schema_version 不变;表数不增 | L1 | P0 |
| TC-BIO-DB-003 | FR-BIO-028 | 版本升级迁移 | v1 库 fixture | 迁移至 v2 | 新列存在;旧数据保留 | L1 | P1 |
| TC-BIO-DB-004 | FR-BIO-028 | 阶段链 JSON 存取 | 任务 3 阶段 | 写入读回 | stages 数组完整还原 | L1 | P0 |
| TC-BIO-DB-005 | FR-BIO-028 | 参数 JSON 存取 | 参数嵌套 | 写入读回 | 参数对象完整还原(含嵌套) | L1 | P0 |
| TC-BIO-DB-006 | FR-BIO-024 | 任务级联删除阶段 | 任务含 5 阶段 | 删任务 | bio_stages 对应行=0 | L1 | P0 |
| TC-BIO-DB-007 | FR-BIO-022 | 归档外键任务 | 任务 j1 归档 | 删任务(若实现允许) | 归档保留或级联(两态断言其一,按实现固定) | L1 | P1 |
| TC-BIO-DB-008 | FR-BIO-028 | 时间戳字段 | 创建任务 | 读行 | created_at/updated_at 非空且 ISO 格式 | L1 | P1 |
| TC-BIO-DB-009 | FR-BIO-028 | 状态枚举约束 | 写入 | 写非法状态值 | 拒绝或枚举约束错误 | L1 | P1 |
| TC-BIO-DB-010 | FR-BIO-031 | 并发写安全 | 2 协程更新同任务 | 并发写 | 无死锁;最终状态一致 | L1 | P1 |
| TC-BIO-DB-011 | FR-BIO-024 | log_tail 持久化 | 阶段运行 | 更新 log_tail | 读回与内存一致 | L1 | P0 |
| TC-BIO-DB-012 | FR-BIO-021 | 归档大小与路径字段 | 存档 | 读 bio_archives 行 | size_bytes>0;disk_path 非空且目录存在 | L1 | P0 |
### 6.1.7 FLOW 上下游集成(接口级)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-FLOW-001 | FR-BIO-028 | BFF 反代开启注册 | BIOFLOW_ENABLED=true 启动 BFF | 检查路由表 | /api/bioflow/* 路由已注册(FastAPI routes 可见) | L2 | P0 |
| TC-BIO-FLOW-002 | FR-BIO-028 | BFF 反代关闭不注册 | BIOFLOW_ENABLED=false | 检查路由表 | 无 /api/bioflow/* 路由 | L2 | P0 |
| TC-BIO-FLOW-003 | FR-BIO-016 | 报告登记进 doc_artifacts | 生信任务 done | 登记 | doc_artifacts 新行;kind=bioflow_report 或等价字段 | L2 | P0 |
| TC-BIO-FLOW-004 | FR-BIO-016 | 报告登记字段对齐 | 登记 | 读行 | job_id/标题/md/图清单与 docgen 表字段对齐(缺字段报错) | L2 | P0 |
| TC-BIO-FLOW-005 | FR-BIO-015 | fig:// 图引用渲染 | 报告含 fig://fig1 | 渲染报告 | img src 变为 data:image/...base64;无 fig:// 残留 | L3 | P0 |
| TC-BIO-FLOW-006 | FR-BIO-015 | fig:// 未知 id 降级 | fig://nope | 渲染 | 图位置显示占位/跳过且不报错 | L3 | P1 |
| TC-BIO-FLOW-007 | FR-BIO-016 | DocPane 白底预览 | 报告登记 | 打开 DocPane | 容器 computed background=#FFFFFF(白底);图文正常 | L4 | P0 |
| TC-BIO-FLOW-008 | FR-BIO-019 | revise 触发预览刷新 | 图表调整后 | 观察 DocPane | 预览重新加载;新图可见 | L3 | P0 |
| TC-BIO-FLOW-009 | FR-BIO-026 | vstore flow_docs 检索 | flow_docs 集合已入库 | 检索「identify 需要什么输入」 | 返回块含源文件+章节;top1 相关 | L2 | P0 |
| TC-BIO-FLOW-010 | FR-BIO-023 | 存档复用端到端接口链 | 归档 a1 | POST archives/{a1}/run | 新任务→表单预填→confirm→执行,参数=归档值(全链) | L2 | P0 |
### 6.1.8 STORE 前端 store(L3 vitest)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-STORE-001 | FR-BIO-001 | sendBioflow 动作存在 | store 挂载 | 调用 sendBioflow(msg) | 消息进入 messages 数组且 blocks 含 bioflow 类块 | L3 | P0 |
| TC-BIO-STORE-002 | FR-BIO-001 | 分流未命中不触发生信 | mock 词典 | 发送「什么是基因家族」 | 走原 send() 路径;不产生 bioflow 请求 | L3 | P0 |
| TC-BIO-STORE-003 | FR-BIO-002 | 候选路径写入消息 | mock plan_ready | 应用事件 | 消息 blocks 含 path 块且 candidates.length 2~3 | L3 | P0 |
| TC-BIO-STORE-004 | FR-BIO-004 | 确认后创建任务状态 | mock job_created | 应用事件 | bioflowJob 状态写入 store(jobId 非空) | L3 | P0 |
| TC-BIO-STORE-005 | FR-BIO-011 | 阶段状态更新 | mock stage 事件序列 | 逐帧应用 | store 中阶段状态 waiting→running→done 逐帧一致 | L3 | P0 |
| TC-BIO-STORE-006 | FR-BIO-012 | 失败事件置 failed | mock stage_failed | 应用 | store 阶段 status=failed 且 error 文案存在 | L3 | P0 |
| TC-BIO-STORE-007 | FR-BIO-011 | 日志尾追加 | mock stage_log×3 | 应用 | store logTail 追加为整体,长度=三帧之和 | L3 | P0 |
| TC-BIO-STORE-008 | FR-BIO-014 | 快照整体替换 | mock snapshot | 应用 | store 阶段数组被快照整体替换(引用变化) | L3 | P0 |
| TC-BIO-STORE-009 | FR-BIO-014 | 断线重连触发 | SSE 断开(mock) | 等待 | store 触发 reconnect;成功后应用快照 | L3 | P0 |
| TC-BIO-STORE-010 | FR-BIO-006 | 上传进度状态 | mock XHR 进度 45% | 上传 | store uploadProgress=45 | L3 | P0 |
| TC-BIO-STORE-011 | FR-BIO-009 | 表单值提交 | mock | dispatch confirmStage(stage, params) | 请求体 params 与表单一致 | L3 | P0 |
| TC-BIO-STORE-012 | FR-BIO-010 | 自动连续开关状态 | mock | 切换 autoContinue | store.autoContinue=true 且随任务持久化字段下发 | L3 | P0 |
| TC-BIO-STORE-013 | FR-BIO-010 | 暂停/恢复动作 | mock | dispatch pauseJob/resumeJob | store 状态 paused/running;发出对应 POST | L3 | P0 |
| TC-BIO-STORE-014 | FR-BIO-012 | 三选一动作 | mock | dispatch rerunStage/skipStage/rerunWithParams | 分别发出 rerun/skip/rerun 请求;请求体正确 | L3 | P0 |
| TC-BIO-STORE-015 | FR-BIO-023 | 存档复用预填 | mock archive_loaded | 应用 | store.formDefaults=存档参数;来源标记=archive | L3 | P0 |
| TC-BIO-STORE-016 | FR-BIO-025 | 探活结果 | mock health 200/500 | 初始化 | 200→bioflowAvailable=true;500/超时→false | L3 | P0 |
| TC-BIO-STORE-017 | FR-BIO-021 | 存档状态回复写入 | mock archive_done | 应用 | 消息块含名称/位置/大小三字段 | L3 | P0 |
| TC-BIO-STORE-018 | FR-BIO-024 | 面板任务列表 | mock jobs | loadJobs | store.jobs 数组与接口一致(排序) | L3 | P0 |
| TC-BIO-STORE-019 | FR-BIO-022 | 档案列表 | mock archives | loadArchives | store.archives 数组与接口一致 | L3 | P0 |
| TC-BIO-STORE-020 | FR-BIO-014 | 事件乱序容错 | mock 乱序帧 | 应用 | 不崩溃;状态不回退(done 不再变 running) | L3 | P1 |
| TC-BIO-STORE-021 | FR-BIO-014 | 会话切换隔离 | 2 会话各 1 任务 | 切换 | store 当前任务随会话切换;互不污染 | L3 | P1 |
| TC-BIO-STORE-022 | FR-BIO-001 | 红线文件零改动校验 | 仓库 checkout 状态 | 对比 modes.js/labels.js/bench.js/qa.js/parser.js | 与分支基线一致(无 diff) | L3 | P0 |
### 6.1.9 PATH 路径选择卡(flow-path-card,L4)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-PATH-001 | FR-BIO-002 | 引导 UI 显示:卡片标题 | mock 候选 2 条 | 挂载 | 标题文本=「🧬 分析路径选择」;卡体有 .flow-path-card 类 | L4 | P0 |
| TC-BIO-PATH-002 | FR-BIO-002 | 引导操作:候选行渲染 | 2-3 条候选 | 挂载 | 渲染 2-3 个候选行;每行含阶段序列文本(首阶段加粗)与用途文本 | L4 | P0 |
| TC-BIO-PATH-003 | FR-BIO-002 | 候选行阶段序列显示 | 候选 [identify,align,phylogeny] | 挂载 | 行文本含「identify → align → phylogeny」;首阶段字重 600 | L4 | P0 |
| TC-BIO-PATH-004 | FR-BIO-002 | 引导操作:点选候选行 | 未选中 | 点击第 2 行 | 该行获得选中态(border 1.5px --pa-g-from;背景=gradient 8% 混色) | L4 | P0 |
| TC-BIO-PATH-005 | FR-BIO-002 | 引导 UI 显示:选中态边框 | 已选中 | 检查 computed style | border-width=1.5px 且 border-color=var(--pa-g-from) | L4 | P0 |
| TC-BIO-PATH-006 | FR-BIO-002 | 确认按钮选中后可点 | 已选中 | 检查「确认此路径」按钮 | disabled=false;背景为 --pa-gradient;文字白色 12.5px/600 | L4 | P0 |
| TC-BIO-PATH-007 | FR-BIO-002 | 确认按钮无选中禁用 | 未选中 | 检查 | disabled=true;opacity=0.45 | L4 | P0 |
| TC-BIO-PATH-008 | FR-BIO-002 | 引导操作:确认发出选择 | 已选中候选 2 | 点击确认 | 触发 select 回调/请求,参数=候选 2 的 stages | L4 | P0 |
| TC-BIO-PATH-009 | FR-BIO-002 | 自然语言改选 | 候选 3 条 | 用户输入「换第二条」 | 回调携带选中索引 2(或经 LLM 解析) | L4 | P1 |
| TC-BIO-PATH-010 | FR-BIO-002 | 空候选不渲染 | candidates=[] | 挂载 | 卡体不渲染(或空态文案);不报错 | L4 | P1 |
| TC-BIO-PATH-011 | FR-BIO-002 | 单候选自动不强制 | candidates=1 | 挂载 | 渲染 1 行;确认仍可用 | L4 | P2 |
| TC-BIO-PATH-012 | FR-BIO-003 | 前置补全明示 | 候选含 auto_filled | 挂载 | 行内或提示区显示「已自动补全」标记与前置阶段名 | L4 | P0 |
| TC-BIO-PATH-013 | FR-BIO-004 | 确认卡逐阶段可读 | path 确认态 | 挂载确认视图 | 逐阶段显示名称/用途/预计耗时三要素 | L4 | P0 |
| TC-BIO-PATH-014 | FR-BIO-004 | 确认后任务创建请求 | 确认卡 | 点击确认 | 发出 POST /api/bioflow/jobs;body.stages=选中链 | L4 | P0 |
| TC-BIO-PATH-015 | FR-BIO-002 | 路径卡主题令牌 | 深/浅主题 | 检查 computed | 背景=surface-1;边框=hairline;圆角=r-lg | L4 | P1 |
| TC-BIO-PATH-016 | FR-BIO-002 | 移动端不溢出 | 390×844 | 挂载 | 卡片宽≤容器宽;无横向滚动 | L5-M | P1 |
| TC-BIO-PATH-017 | FR-BIO-004 | 阶段链超长显示 | 15 阶段候选 | 挂载 | 行内序列文本可换行/省略;行不撑破卡片 | L4 | P2 |
| TC-BIO-PATH-018 | FR-BIO-002 | 用途文本渲染 | candidate.purpose | 挂载 | 每行显示用途文本(非空) | L4 | P1 |
| TC-BIO-PATH-019 | FR-BIO-002 | 卡体尺寸 | 挂载 | 检查 computed | padding=14px 16px;margin=14px 0 | L4 | P2 |
| TC-BIO-PATH-020 | FR-BIO-002 | 行 hover 态 | 未选中 | hover 候选行 | 背景=surface-3(--pa-s3) | L4 | P1 |
| TC-BIO-PATH-021 | FR-BIO-002 | 键盘 Enter 确认 | 已选中;确认按钮聚焦 | 按 Enter | 触发确认回调(同点击) | L4 | P1 |
| TC-BIO-PATH-022 | FR-BIO-002 | 选中后再点同行走自然语言修改 | 已选中行 1 | 再次点击行 1 | 无选中态抖动;回调幂等(保持选中) | L4 | P2 |
### 6.1.10 FORM 参数表单卡(flow-form-card,L4)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-FORM-001 | FR-BIO-008 | 引导 UI 显示:表单卡标题 | 阶段 identify 待确认 | 挂载 | 标题=「⚙ identify 步骤 · 可调整参数」;.flow-form-card 存在 | L4 | P0 |
| TC-BIO-FORM-002 | FR-BIO-008 | 引导 UI 显示:前置文案 | 同上 | 挂载 | 对话区显示「XXXX 步骤,可调整参数如下,可按需调整,调整完毕后继续」文案 | L4 | P0 |
| TC-BIO-FORM-003 | FR-BIO-008 | 引导操作:字段渲染 | 参数 schema 3 字段 | 挂载 | 渲染 3 个字段行:label 12px ink-muted、宽 96px;input 存在 | L4 | P0 |
| TC-BIO-FORM-004 | FR-BIO-008 | 默认值显示 | 默认 cpu=4 | 挂载 | input value=4 | L4 | P0 |
| TC-BIO-FORM-005 | FR-BIO-008 | 引导 UI 显示:来源标注 | 字段含 source | 挂载 | 每字段下方 11px ink-subtle 文案含「默认值来源:阶段契约文档」 | L4 | P0 |
| TC-BIO-FORM-006 | FR-BIO-008 | 来源标注多类型 | 来源=参数预填值 | 挂载 | 标注文案区分「契约文档」与「参数预填」两来源 | L4 | P1 |
| TC-BIO-FORM-007 | FR-BIO-009 | 引导操作:编辑参数 | input cpu | 输入 8 | v-model 值=8;无校验拦截 | L4 | P0 |
| TC-BIO-FORM-008 | FR-BIO-009 | 继续按钮执行 | 已改 cpu=8 | 点击「继续」 | 发出 confirm 请求 body.params.cpu=8 | L4 | P0 |
| TC-BIO-FORM-009 | FR-BIO-009 | 继续按钮样式 | 挂载 | 检查 | 「继续」--pa-gradient 白字 12.5px/600;r-md;padding 7px 16px | L4 | P1 |
| TC-BIO-FORM-010 | FR-BIO-010 | 自动连续开关存在 | 挂载 | 检查 | 「自动连续执行」标签 12px ink-muted + switch(mode-pill 同款) | L4 | P0 |
| TC-BIO-FORM-011 | FR-BIO-010 | 引导操作:开启自动连续 | 开关关 | 点击开关 | switch 状态=开;随表单提交 auto_continue=true;后续阶段不再出表单卡 | L4 | P0 |
| TC-BIO-FORM-012 | FR-BIO-010 | 自动连续可关闭 | 开关开 | 点击 | 状态=关;切回手动(下一阶段仍出表单) | L4 | P0 |
| TC-BIO-FORM-013 | FR-BIO-008 | input 聚焦态 | 未聚焦 | 聚焦 input | border-color=var(--pa-g-from)(focus 态) | L4 | P1 |
| TC-BIO-FORM-014 | FR-BIO-008 | 数字参数类型校验 | cpu 字段 | 输入非数字「abc」 | 提交被拦截/请求不发出;显示类型错误提示 | L4 | P0 |
| TC-BIO-FORM-015 | FR-BIO-008 | 必填参数空值 | 必填字段清空 | 点继续 | 不发出请求;该字段标错 | L4 | P1 |
| TC-BIO-FORM-016 | FR-BIO-008 | 范围校验 | 字段 min=1 max=64 | 输入 999 | 校验提示(1-64);不提交 | L4 | P1 |
| TC-BIO-FORM-017 | FR-BIO-008 | 可选参数留空 | 可选字段 | 留空提交 | 请求体不含该字段(或 null);后端按默认 | L4 | P1 |
| TC-BIO-FORM-018 | FR-BIO-009 | 提交中继续按钮禁用 | mock 慢响应 | 点击继续 | 按钮 disabled+加载中态(spinner);不重复提交 | L4 | P0 |
| TC-BIO-FORM-019 | FR-BIO-009 | 提交失败可重试 | mock confirm 500 | 点击继续 | 显示错误;按钮恢复可点;可再次提交 | L4 | P1 |
| TC-BIO-FORM-020 | FR-BIO-023 | 复用预填显示 | 归档预填 cpu=16 标注来源=存档 | 挂载 | input=16;来源标注=存档名称 | L4 | P0 |
| TC-BIO-FORM-021 | FR-BIO-008 | 多阶段表单逐阶段出现 | 手动模式 3 阶段 | 推进 | 每阶段执行前都渲染该阶段表单(标题阶段名更新) | L4 | P0 |
| TC-BIO-FORM-022 | FR-BIO-008 | 表单关闭时机 | 阶段已 running | 事件应用 | 表单卡消失/折叠(不再可编辑) | L4 | P1 |
| TC-BIO-FORM-023 | FR-BIO-008 | 键盘 Enter 提交 | input 聚焦 | 按 Enter | 触发继续(同点击) | L4 | P1 |
| TC-BIO-FORM-024 | FR-BIO-008 | Esc 放弃编辑 | 已改未提交 | 按 Esc | 恢复默认值(或提示放弃,两态断言其一) | L4 | P2 |
### 6.1.11 FILE 文件引导卡(flow-file-card,L4)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-FILE-001 | FR-BIO-005 | 引导 UI 显示:缺失提示文案 | 阶段 await_files | 挂载 | 对话出现「请将 xxx 数据文件拖入窗口上传至服务器,或在聊天窗口中指定数据文件的具体路径」文案且点名 xxx 文件名 | L4 | P0 |
| TC-BIO-FILE-002 | FR-BIO-005 | 引导 UI 显示:文件引导卡 | 同上 | 挂载 | .flow-file-card 存在;内含拖放区与路径输入行 | L4 | P0 |
| TC-BIO-FILE-003 | FR-BIO-006 | 引导操作:拖拽上传 | 本地测试文件 | 拖入拖放区 | 发出 POST /api/bioflow/jobs/{id}/files(multipart);文件名正确 | L4 | P0 |
| TC-BIO-FILE-004 | FR-BIO-006 | XHR 进度百分比 | mock XHR 分片 | 上传 | 进度条 fill 宽度变化且旁注百分比 11px mono(如 45%)逐级上升至 100% | L4 | P0 |
| TC-BIO-FILE-005 | FR-BIO-006 | 进度条令牌复用 | 上传中 | 检查类名 | 使用 prog-track/prog-fill(track surface-2 r-pill 高 4px;fill --pa-gradient) | L4 | P1 |
| TC-BIO-FILE-006 | FR-BIO-006 | 点击上传 | 未拖入 | 点击拖放区 | 打开文件选择框;选择后上传 | L4 | P0 |
| TC-BIO-FILE-007 | FR-BIO-006 | 大文件不断流 | 456MB fixture(L5 mock) | 上传 | 进度连续更新至 100%;无超时错误 | L5-D | P0 |
| TC-BIO-FILE-008 | FR-BIO-007 | 路径输入行存在 | 挂载 | 检查 | input(同 8.2 规格)+「登记路径」pane-btn 同款按钮 | L4 | P0 |
| TC-BIO-FILE-009 | FR-BIO-007 | 引导操作:登记合法路径 | 输入合法服务器路径 | 点「登记路径」 | 发出 POST files {"server_path":路径};成功后显示登记项(含路径与状态) | L4 | P0 |
| TC-BIO-FILE-010 | FR-BIO-007 | 非法路径报错 | 输入 /nonexistent | 登记 | 显示后端 400 错误文案(PATH_NOT_EXIST) | L4 | P0 |
| TC-BIO-FILE-011 | FR-BIO-006 | 上传成功状态 | 上传完成 | 观察 | 进度 100%;文件登记入列表(name/size 显示) | L4 | P0 |
| TC-BIO-FILE-012 | FR-BIO-006 | 上传失败可重试 | mock 500 | 上传 | 错误文案显示;拖放区可再次上传 | L4 | P1 |
| TC-BIO-FILE-013 | FR-BIO-006 | 上传中拖放区禁用重复 | 上传进行中 | 再拖入 | 忽略/禁用(不发起第二个上传) | L4 | P1 |
| TC-BIO-FILE-014 | FR-BIO-006 | 文件满足后卡收起 | 阶段转 running | 观察 | 文件卡消失或标记已完成 | L4 | P1 |
| TC-BIO-FILE-015 | FR-BIO-005 | 缺多文件点名列表 | 缺 fasta+cds | 挂载 | 提示列出两个文件名 | L4 | P1 |
| TC-BIO-FILE-016 | FR-BIO-006 | 拖放区视觉规格 | 挂载 | 检查 computed | border 2px dashed --pa-hairline-strong;r-lg;padding 24px;提示 12px ink-subtle 居中 | L4 | P1 |
| TC-BIO-FILE-017 | FR-BIO-006 | 拖入态高亮 | 拖入悬停 | 检查 | border-color=gradient 45% 混色;背景=gradient 8% 混色 | L4 | P0 |
| TC-BIO-FILE-018 | FR-BIO-006 | 移动端触控上传 | 390×844 触摸 | 点击/长按上传 | 文件选择可用(触控目标≥44px) | L5-M | P1 |
| TC-BIO-FILE-019 | FR-BIO-007 | 路径输入聚焦态 | 未聚焦 | 聚焦 | border=--pa-g-from | L4 | P2 |
| TC-BIO-FILE-020 | FR-BIO-007 | 路径输入 Enter 提交 | 输入合法路径 | 按 Enter | 同点「登记路径」 | L4 | P1 |
| TC-BIO-FILE-021 | FR-BIO-006 | 类型不符文件 | 选择 .exe | 上传 | 前端拦截或后端 422 文案显示 | L4 | P1 |
| TC-BIO-FILE-022 | FR-BIO-006 | 空文件提示 | 0 字节 | 上传 | 按实现断言:提示空文件或成功后 size=0 显示 | L4 | P2 |
### 6.1.12 PROG 阶段进度卡(bioflow-progress-card,L4)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-PROG-001 | FR-BIO-011 | 引导 UI 显示:进度卡渲染 | 阶段链确定 | 挂载 | .bioflow-progress-card 存在;复用 pipeline-card 结构(状态点/连接线/相位色令牌) | L4 | P0 |
| TC-BIO-PROG-002 | FR-BIO-011 | 引导操作:逐阶段点亮 | 3 阶段推进 | 应用事件 | 状态点顺序变化:done=--pa-t-done 底白 ✓;running=相位色底●+pulse;waiting=surface-3 底◌ | L4 | P0 |
| TC-BIO-PROG-003 | FR-BIO-011 | 引导 UI 显示:日志尾区 | 阶段 running | 观察 | 仅 running/failed 阶段展开日志区:--pa-code-bg 底、mono 11px、padding 8px 10px、max-height 96px 滚动 | L4 | P0 |
| TC-BIO-PROG-004 | FR-BIO-011 | 日志尾随 SSE 追加 | stage_log×3 | 应用 | 日志文本追加增长;滚动至底部 | L4 | P0 |
| TC-BIO-PROG-005 | FR-BIO-011 | done 阶段日志收起 | 阶段 done | 观察 | 该阶段日志区不展开(仅 running/failed 展开) | L4 | P1 |
| TC-BIO-PROG-006 | FR-BIO-012 | 失败标红 | 阶段 failed | 观察 | 状态点=--pa-error 底 ✕;状态文字 error 色 12px/600 | L4 | P0 |
| TC-BIO-PROG-007 | FR-BIO-012 | 失败三选一按钮出现 | 阶段 failed | 观察 | 重跑/跳过/改参数重跑三按钮(pane-btn 同款 12px,gap 8px)仅 failed 阶段显示 | L4 | P0 |
| TC-BIO-PROG-008 | FR-BIO-012 | 重跑生效 | failed | 点重跑 | 发出 rerun 请求;状态点转 running | L4 | P0 |
| TC-BIO-PROG-009 | FR-BIO-012 | 跳过生效 | failed | 点跳过 | 发出 skip 请求;状态=skipped(--pa-ink-subtle 底◌;文字 ink-subtle) | L4 | P0 |
| TC-BIO-PROG-010 | FR-BIO-012 | 改参数重跑生效 | failed | 点改参数重跑 | 出现参数表单(该阶段);提交后重跑 | L4 | P0 |
| TC-BIO-PROG-011 | FR-BIO-012 | skipped 态视觉 | 阶段 skipped | 检查 | 状态点=--pa-ink-subtle 底◌;文字 ink-subtle | L4 | P1 |
| TC-BIO-PROG-012 | FR-BIO-013 | 折叠分组 | 15 阶段链 | 挂载 | 阶段>10 自动分组折叠;组头 12px/600+展开箭头;默认展开运行中所在组 | L4 | P0 |
| TC-BIO-PROG-013 | FR-BIO-013 | 展开可见全部 | 折叠组 | 点组头 | 展开显示该组全部阶段 | L4 | P0 |
| TC-BIO-PROG-014 | FR-BIO-013 | ≤10 阶段不折叠 | 10 阶段 | 挂载 | 无折叠组头(平铺 10 状态点) | L4 | P1 |
| TC-BIO-PROG-015 | FR-BIO-014 | 断线回放刷新进度卡 | 快照到达 | 应用 | 卡片整体刷新为快照状态(1 done 1 running 1 waiting 精确对应) | L4 | P0 |
| TC-BIO-PROG-016 | FR-BIO-014 | 回放后日志尾恢复 | 快照含 log_tail | 应用 | running 阶段日志区显示快照日志尾 | L4 | P1 |
| TC-BIO-PROG-017 | FR-BIO-010 | 暂停态视觉 | 任务 paused | 观察 | 运行中状态点停止 pulse;显示「已暂停」徽章/文案 | L4 | P0 |
| TC-BIO-PROG-018 | FR-BIO-010 | 恢复后继续 | 任务 paused | 点恢复 | 下一阶段启动(running 状态推进) | L4 | P0 |
| TC-BIO-PROG-019 | FR-BIO-011 | 进度卡与流水线卡同款视觉 | 对比 PipelineCard | 检查 | 结构/状态点/连接线/相位色与 §4.4 pipeline-card 令牌一致(同款) | L4 | P1 |
| TC-BIO-PROG-020 | FR-BIO-012 | 失败后后续阶段 waiting | 阶段 2 failed | 观察 | 阶段 3+ 保持 waiting 不高亮 | L4 | P1 |
| TC-BIO-PROG-021 | FR-BIO-024 | 任务面板进度视图复用 | 面板内 | 观察 | 面板 DAG 与进度卡状态一致 | L4 | P1 |
| TC-BIO-PROG-022 | FR-BIO-012 | 三选一按钮键盘可达 | failed | Tab 至重跑按钮按 Enter | 触发重跑 | L4 | P1 |
| TC-BIO-PROG-023 | FR-BIO-011 | 日志尾 max-height 滚动 | 日志 >6 行 | 检查 computed | max-height=96px;overflow-y=auto | L4 | P2 |
| TC-BIO-PROG-024 | FR-BIO-011 | 移动端不溢出 | 390×844 | 挂载 | 卡片/日志区宽度≤容器;无横向滚动 | L5-M | P1 |
### 6.1.13 ARCH 存档提示卡(flow-archive-card,L4)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-ARCH-001 | FR-BIO-020 | 引导 UI 显示:存档提示 | 任务 job_done | 观察 | 对话出现「本次生信任务已完成,是否存档?可按你的要求命名并描述」12.5px | L4 | P0 |
| TC-BIO-ARCH-002 | FR-BIO-020 | 引导操作:命名输入 | 提示卡存在 | 输入名称 | input 接受文本;无长度异常 | L4 | P0 |
| TC-BIO-ARCH-003 | FR-BIO-020 | 引导操作:描述输入 | 同上 | 输入描述 | 描述值随提交发送 | L4 | P0 |
| TC-BIO-ARCH-004 | FR-BIO-020 | 引导操作:点存档 | 已命名 | 点「存档」 | 发出 POST /api/bioflow/archives;body 含 job_id/name/description | L4 | P0 |
| TC-BIO-ARCH-005 | FR-BIO-020 | 存档按钮样式 | 挂载 | 检查 | 「存档」--pa-gradient 12.5px/600;「放弃」pane-btn 同款 12px | L4 | P1 |
| TC-BIO-ARCH-006 | FR-BIO-020 | 引导操作:放弃 | 提示卡存在 | 点「放弃」 | 卡片消失;无 POST /api/bioflow/archives 请求;任务无副作用 | L4 | P0 |
| TC-BIO-ARCH-007 | FR-BIO-021 | 引导 UI 显示:存档状态回复 | 存档完成事件 | 观察 | 消息显示存档状态:名称/位置/大小三要素 | L4 | P0 |
| TC-BIO-ARCH-008 | FR-BIO-021 | 名称缺省提交拦截 | 名称空 | 点存档 | 按钮禁用或提交被拦截(不发出空 name 请求) | L4 | P1 |
| TC-BIO-ARCH-009 | FR-BIO-021 | 存档中加载态 | mock 慢 | 点存档 | 「存档」按钮 disabled+spinner;完成后恢复 | L4 | P1 |
| TC-BIO-ARCH-010 | FR-BIO-021 | 存档失败提示 | mock 500 | 点存档 | 错误文案;按钮恢复可重试 | L4 | P1 |
| TC-BIO-ARCH-011 | FR-BIO-020 | 放弃后不重复提示 | 已放弃 | 观察 | 同一任务不再弹存档提示(或仅一次) | L4 | P2 |
| TC-BIO-ARCH-012 | FR-BIO-020 | 任务未完成无提示 | 任务 running | 观察 | 无存档提示卡 | L4 | P1 |
### 6.1.14 JOB 生信任务面板(biojobs-pane,L4)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-JOB-001 | FR-BIO-024 | 面板容器与 TAB | 服务可达 | 打开 | .biojobs-pane 存在;TAB 走 bench-tab 样式 | L4 | P0 |
| TC-BIO-JOB-002 | FR-BIO-024 | 任务列表渲染 | 3 任务 | 打开 | 3 个 session-item 形态列表项:标题 13px+状态徽章 | L4 | P0 |
| TC-BIO-JOB-003 | FR-BIO-024 | 多任务浏览流畅 | 25 任务 | 滚动列表 | 列表渲染流畅(虚拟滚动或分页);无卡顿崩溃 | L5-D | P1 |
| TC-BIO-JOB-004 | FR-BIO-024 | 阶段 DAG 渲染 | 选中任务 | 查看 | 纵向 2px hairline 连接线;节点 8px 圆点按阶段状态取色 | L4 | P0 |
| TC-BIO-JOB-005 | FR-BIO-024 | DAG 状态取色 | 1 done 1 failed 1 running | 查看 | 三节点颜色分别=done/error/相位色 | L4 | P1 |
| TC-BIO-JOB-006 | FR-BIO-024 | manifest/日志浏览 | 阶段 done | 打开 | code-block 渲染(mono 12px,code-bg,滚动);manifest 与日志尾均可读 | L4 | P0 |
| TC-BIO-JOB-007 | FR-BIO-024 | 重跑按钮 | 任务 failed | 点重跑 | 发出 rerun 请求;面板状态更新 | L4 | P0 |
| TC-BIO-JOB-008 | FR-BIO-024 | 删除任务 | 任务存在 | 点删除+确认 | 发出 DELETE;列表移除 | L4 | P1 |
| TC-BIO-JOB-009 | FR-BIO-024 | 运行中删除禁用 | 任务 running | 检查 | 删除按钮禁用(409 预期) | L4 | P1 |
| TC-BIO-JOB-010 | FR-BIO-024 | 空任务列表 | 无任务 | 打开 | 空态文案显示 | L4 | P2 |
| TC-BIO-JOB-011 | FR-BIO-024 | 任务详情实时更新 | 任务 running | 观察 | 面板状态随 SSE 事件实时刷新 | L4 | P0 |
| TC-BIO-JOB-012 | FR-BIO-025 | 探活失败隐藏 TAB | health 不可达 | 初始化 | 「生信任务」TAB 不渲染 | L4 | P0 |
| TC-BIO-JOB-013 | FR-BIO-025 | 探活恢复显示 TAB | health 恢复 | 刷新 | TAB 出现 | L4 | P0 |
| TC-BIO-JOB-014 | FR-BIO-024 | 移动端 TAB 条接入 | 390×844 | 打开 | 生信 TAB 出现在移动端 tab 条;TAB 数断言更新 | L5-M | P1 |
| TC-BIO-JOB-015 | FR-BIO-024 | 进度数字显示 | 任务 33% | 查看 | 列表/详情显示进度 33% | L4 | P1 |
| TC-BIO-JOB-016 | FR-BIO-024 | 日志尾 80 行上限显示 | 日志 200 行 | 查看 | 面板显示 80 行(后端截断后原样展示) | L4 | P1 |
### 6.1.15 PANE 生信档案面板(bioarchive-pane,L4)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-PANE-001 | FR-BIO-022 | 面板容器与 TAB | 服务可达 | 打开 | .bioarchive-pane 存在;TAB 走 bench-tab | L4 | P0 |
| TC-BIO-PANE-002 | FR-BIO-022 | 档案列表 | 3 归档 | 打开 | 3 个列表项(标题+状态徽章/时间)按时间倒序 | L4 | P0 |
| TC-BIO-PANE-003 | FR-BIO-022 | 档案详情回看 | 选中归档 | 点开 | 显示详情:阶段链/参数/产物文件清单/报告 | L4 | P0 |
| TC-BIO-PANE-004 | FR-BIO-022 | 报告产物查看 | 归档含报告 | 详情内 | 报告可预览(HTML 渲染或打开) | L4 | P0 |
| TC-BIO-PANE-005 | FR-BIO-022 | 中间文件清单 | 归档含中间文件 | 详情 | 产物清单含中间文件条目 | L4 | P1 |
| TC-BIO-PANE-006 | FR-BIO-022 | 删除归档 | 选中归档 | 点删除+确认 | 发出 DELETE;列表移除;磁盘目录删除 | L4 | P0 |
| TC-BIO-PANE-007 | FR-BIO-022 | 删除二次确认 | 归档存在 | 点删除→取消 | 无 DELETE 请求 | L4 | P1 |
| TC-BIO-PANE-008 | FR-BIO-023 | 复用发起按钮 | 选中归档 | 点「复用发起」 | 发出 POST archives/{id}/run 或打开复用表单 | L4 | P0 |
| TC-BIO-PANE-009 | FR-BIO-023 | 复用预填表单 | 复用发起后 | 观察 | 参数表单出现且预填=存档参数 | L4 | P0 |
| TC-BIO-PANE-010 | FR-BIO-023 | 复用发起新任务 | 预填确认 | 确认 | 新任务出现在生信任务面板 | L4 | P0 |
| TC-BIO-PANE-011 | FR-BIO-022 | 空档案列表 | 无归档 | 打开 | 空态文案显示 | L4 | P2 |
| TC-BIO-PANE-012 | FR-BIO-022 | 归档大小显示 | 归档 1.2GB | 列表 | 大小显示(人类可读格式) | L4 | P2 |
| TC-BIO-PANE-013 | FR-BIO-025 | 探活失败隐藏档案 TAB | health 不可达 | 初始化 | 「生信档案」TAB 不渲染 | L4 | P0 |
| TC-BIO-PANE-014 | FR-BIO-025 | 探活恢复显示档案 TAB | health 恢复 | 刷新 | TAB 出现 | L4 | P0 |
| TC-BIO-PANE-015 | FR-BIO-022 | 移动端面板可切换 | 390×844 | 切到档案 TAB | 面板正常显示;列表可滚动 | L5-M | P1 |
| TC-BIO-PANE-016 | FR-BIO-023 | 复用按钮键盘可达 | 选中归档 | Tab+Enter | 触发复用发起 | L4 | P2 |
### 6.1.16 ACT UI 动作矩阵(每条 TC = 一个可交互元素 × 一个动作;TEST_PLAN §10.3)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-ACT-001 | FR-BIO-002 | 路径卡候选行·点击 | 候选 2 条 | 点击候选行 | 选中态样式生效(border/背景变化);回调参数=该行索引 | L4 | P0 |
| TC-BIO-ACT-002 | FR-BIO-002 | 路径卡候选行·双击 | 未选中 | 双击候选行 | 视为两次点击:状态保持选中;不产生重复回调 | L4 | P1 |
| TC-BIO-ACT-003 | FR-BIO-002 | 路径卡候选行·悬停 | 未选中 | hover 行 | 背景=surface-3 | L4 | P0 |
| TC-BIO-ACT-004 | FR-BIO-002 | 路径卡候选行·悬停移出 | 悬停中 | mouseleave | 背景恢复 surface-1;选中态不丢 | L4 | P1 |
| TC-BIO-ACT-005 | FR-BIO-002 | 路径卡候选行·键盘 Enter | 行聚焦 | 按 Enter | 选中该行(同点击) | L4 | P0 |
| TC-BIO-ACT-006 | FR-BIO-002 | 路径卡候选行·键盘 Esc | 弹层/聚焦态 | 按 Esc | 关闭弹层或取消聚焦,不改变已确认状态 | L4 | P2 |
| TC-BIO-ACT-007 | FR-BIO-002 | 确认按钮·点击 | 已选中 | 点击 | 触发确认回调一次 | L4 | P0 |
| TC-BIO-ACT-008 | FR-BIO-002 | 确认按钮·双击 | 已选中 | 双击 | 只触发一次回调(防抖) | L4 | P1 |
| TC-BIO-ACT-009 | FR-BIO-002 | 确认按钮·悬停 | 未选中 | hover | 视觉反馈(渐变增亮);功能仍禁用 | L4 | P2 |
| TC-BIO-ACT-010 | FR-BIO-002 | 确认按钮·键盘 Enter | 按钮聚焦且已选中 | 按 Enter | 触发确认 | L4 | P0 |
| TC-BIO-ACT-011 | FR-BIO-002 | 确认按钮·键盘 Esc | 按钮聚焦 | 按 Esc | 取消聚焦;无确认 | L4 | P2 |
| TC-BIO-ACT-012 | FR-BIO-002 | 确认按钮·禁用态 | 未选中 | 检查 | disabled;opacity=0.45;点击无回调 | L4 | P0 |
| TC-BIO-ACT-013 | FR-BIO-002 | 确认按钮·加载中态 | 确认请求中(mock 慢) | 检查 | disabled;spinner 显示;再次点击无重复请求 | L4 | P0 |
| TC-BIO-ACT-014 | FR-BIO-008 | 表单输入框·点击聚焦 | input | 点击 | input 获得焦点;focus border=--pa-g-from | L4 | P0 |
| TC-BIO-ACT-015 | FR-BIO-008 | 表单输入框·失焦 | 聚焦中 | 点击别处 | blur 触发;边框恢复;若有校验立即提示 | L4 | P0 |
| TC-BIO-ACT-016 | FR-BIO-008 | 表单输入框·键盘 Enter | input 聚焦 | 按 Enter | 触发继续(提交) | L4 | P0 |
| TC-BIO-ACT-017 | FR-BIO-008 | 表单输入框·键盘 Esc | input 聚焦已改 | 按 Esc | 撤销本次编辑恢复原值或放弃(两态断言其一) | L4 | P1 |
| TC-BIO-ACT-018 | FR-BIO-008 | 表单输入框·禁用态 | 阶段已 running | 检查 | input disabled | L4 | P0 |
| TC-BIO-ACT-019 | FR-BIO-008 | 表单输入框·悬停 | 未聚焦 | hover | 边框 hairline 不变(仅 focus 变渐变) | L4 | P2 |
| TC-BIO-ACT-020 | FR-BIO-009 | 继续按钮·点击 | 已编辑 | 点击 | 发出 confirm;参数=表单值 | L4 | P0 |
| TC-BIO-ACT-021 | FR-BIO-009 | 继续按钮·双击 | 可提交 | 双击 | 仅一次请求(提交中禁用) | L4 | P1 |
| TC-BIO-ACT-022 | FR-BIO-009 | 继续按钮·悬停 | 可提交 | hover | 渐变增亮反馈 | L4 | P2 |
| TC-BIO-ACT-023 | FR-BIO-009 | 继续按钮·键盘 Enter | 按钮聚焦 | 按 Enter | 提交 | L4 | P0 |
| TC-BIO-ACT-024 | FR-BIO-009 | 继续按钮·键盘 Esc | 按钮聚焦 | 按 Esc | 取消聚焦;不提交 | L4 | P2 |
| TC-BIO-ACT-025 | FR-BIO-009 | 继续按钮·禁用态 | 校验不通过 | 检查 | disabled;点击无请求 | L4 | P0 |
| TC-BIO-ACT-026 | FR-BIO-009 | 继续按钮·加载中态 | 提交中 | 检查 | disabled+spinner | L4 | P0 |
| TC-BIO-ACT-027 | FR-BIO-010 | 自动连续开关·点击开 | 开关关 | 点击 | switch 状态=开;auto_continue=true 提交 | L4 | P0 |
| TC-BIO-ACT-028 | FR-BIO-010 | 自动连续开关·点击关 | 开关开 | 点击 | 状态=关;切回手动 | L4 | P0 |
| TC-BIO-ACT-029 | FR-BIO-010 | 自动连续开关·双击 | 关 | 双击 | 最终状态=开(两次切换);无异常 | L4 | P2 |
| TC-BIO-ACT-030 | FR-BIO-010 | 自动连续开关·悬停 | 任意 | hover | 光标指针/背景反馈;不切换状态 | L4 | P2 |
| TC-BIO-ACT-031 | FR-BIO-010 | 自动连续开关·键盘 Enter | 开关聚焦 | 按 Enter | 切换状态 | L4 | P1 |
| TC-BIO-ACT-032 | FR-BIO-010 | 自动连续开关·键盘 Esc | 开关聚焦 | 按 Esc | 取消聚焦;状态不变 | L4 | P2 |
| TC-BIO-ACT-033 | FR-BIO-010 | 自动连续开关·禁用态 | 任务已暂停/未开始 | 检查 | disabled(按实现两态断言其一) | L4 | P1 |
| TC-BIO-ACT-034 | FR-BIO-006 | 拖放区·点击 | 未选择 | 点击 | 打开文件选择框(file input 触发) | L4 | P0 |
| TC-BIO-ACT-035 | FR-BIO-006 | 拖放区·悬停 | 未拖入 | hover | 样式不变(非拖入态) | L4 | P1 |
| TC-BIO-ACT-036 | FR-BIO-006 | 拖放区·拖入悬停 | 拖拽悬停中 | dragover | 拖入态:border=gradient 45%;背景=gradient 8% | L4 | P0 |
| TC-BIO-ACT-037 | FR-BIO-006 | 拖放区·离开 | 拖入中 | dragleave | 拖入态移除,恢复 dashed hairline-strong | L4 | P0 |
| TC-BIO-ACT-038 | FR-BIO-006 | 拖放区·拖入释放 | 拖入文件 | drop | 触发上传(POST multipart);进度出现 | L4 | P0 |
| TC-BIO-ACT-039 | FR-BIO-006 | 拖放区·禁用态 | 上传进行中 | 检查 | 再拖入不触发(忽略/禁用) | L4 | P0 |
| TC-BIO-ACT-040 | FR-BIO-006 | 拖放区·加载中态 | 上传中 | 检查 | 进度条可见;拖放区提示变化(百分比) | L4 | P0 |
| TC-BIO-ACT-041 | FR-BIO-007 | 路径输入行·点击聚焦 | input | 点击 | 焦点获得;边框渐变 | L4 | P0 |
| TC-BIO-ACT-042 | FR-BIO-007 | 路径输入行·失焦 | 聚焦中 | 移开 | 边框恢复 | L4 | P1 |
| TC-BIO-ACT-043 | FR-BIO-007 | 路径输入行·键盘 Enter | 已输入路径 | 按 Enter | 触发登记(同点按钮) | L4 | P0 |
| TC-BIO-ACT-044 | FR-BIO-007 | 路径输入行·键盘 Esc | 聚焦已输入 | 按 Esc | 清空输入或取消(两态断言其一) | L4 | P2 |
| TC-BIO-ACT-045 | FR-BIO-007 | 登记路径按钮·点击 | 合法路径 | 点击 | 发出登记请求 | L4 | P0 |
| TC-BIO-ACT-046 | FR-BIO-007 | 登记路径按钮·悬停 | 任意 | hover | pane-btn 悬停反馈;不触发请求 | L4 | P2 |
| TC-BIO-ACT-047 | FR-BIO-007 | 登记路径按钮·键盘 Enter | 按钮聚焦 | 按 Enter | 触发登记 | L4 | P1 |
| TC-BIO-ACT-048 | FR-BIO-007 | 登记路径按钮·禁用态 | input 空 | 检查 | disabled;点击无请求 | L4 | P0 |
| TC-BIO-ACT-049 | FR-BIO-007 | 登记路径按钮·加载中态 | 登记请求中 | 检查 | disabled+spinner | L4 | P1 |
| TC-BIO-ACT-050 | FR-BIO-012 | 重跑按钮·点击 | 阶段 failed | 点击 | 发出 rerun 请求 | L4 | P0 |
| TC-BIO-ACT-051 | FR-BIO-012 | 跳过按钮·点击 | 阶段 failed | 点击 | 发出 skip 请求;状态=skipped | L4 | P0 |
| TC-BIO-ACT-052 | FR-BIO-012 | 改参数重跑按钮·点击 | 阶段 failed | 点击 | 弹出该阶段参数表单 | L4 | P0 |
| TC-BIO-ACT-053 | FR-BIO-012 | 三选一按钮·悬停 | 阶段 failed | hover 每个按钮 | pane-btn 悬停反馈 | L4 | P2 |
| TC-BIO-ACT-054 | FR-BIO-012 | 三选一按钮·键盘 Enter | 重跑按钮聚焦 | 按 Enter | 触发重跑 | L4 | P0 |
| TC-BIO-ACT-055 | FR-BIO-012 | 三选一按钮·键盘 Esc | 改参数表单弹出 | 按 Esc | 表单关闭,不提交 | L4 | P1 |
| TC-BIO-ACT-056 | FR-BIO-012 | 三选一按钮·加载中态 | 重跑请求中 | 检查 | 三按钮 disabled | L4 | P1 |
| TC-BIO-ACT-057 | FR-BIO-012 | 三选一按钮·禁用态 | 阶段非 failed | 检查 | 按钮不渲染(仅 failed 显示) | L4 | P0 |
| TC-BIO-ACT-058 | FR-BIO-013 | 折叠组头·点击 | 15 阶段链折叠组 | 点击组头 | 展开/收起切换;箭头方向变化 | L4 | P0 |
| TC-BIO-ACT-059 | FR-BIO-013 | 折叠组头·双击 | 折叠组 | 双击 | 最终状态=与初始相反(两次切换) | L4 | P2 |
| TC-BIO-ACT-060 | FR-BIO-013 | 折叠组头·悬停 | 折叠组 | hover | 组头悬停反馈 | L4 | P2 |
| TC-BIO-ACT-061 | FR-BIO-013 | 折叠组头·键盘 Enter | 组头聚焦 | 按 Enter | 切换展开/收起 | L4 | P1 |
| TC-BIO-ACT-062 | FR-BIO-013 | 折叠组头·键盘 Esc | 展开中 | 按 Esc | 收起(或保持,两态断言其一) | L4 | P2 |
| TC-BIO-ACT-063 | FR-BIO-024 | 面板操作按钮(重跑)·点击 | 任务 failed | 点击 | 发出 rerun | L4 | P0 |
| TC-BIO-ACT-064 | FR-BIO-024 | 面板操作按钮(删除)·点击 | 任务存在 | 点击 | 弹确认层 | L4 | P0 |
| TC-BIO-ACT-065 | FR-BIO-024 | 面板操作按钮·悬停 | 任务行 | hover | pane-btn 悬停反馈 | L4 | P2 |
| TC-BIO-ACT-066 | FR-BIO-024 | 面板操作按钮·键盘 Enter | 删除按钮聚焦 | 按 Enter | 弹确认层 | L4 | P1 |
| TC-BIO-ACT-067 | FR-BIO-024 | 面板操作按钮·键盘 Esc | 确认层弹出 | 按 Esc | 关闭确认层不删除 | L4 | P1 |
| TC-BIO-ACT-068 | FR-BIO-024 | 面板操作按钮·禁用态 | 任务 running | 检查删除按钮 | disabled | L4 | P0 |
| TC-BIO-ACT-069 | FR-BIO-024 | 面板操作按钮·加载中态 | 重跑请求中 | 检查 | disabled+spinner | L4 | P1 |
| TC-BIO-ACT-070 | FR-BIO-023 | 面板复用发起按钮·点击 | 选中归档 | 点击 | 打开复用表单(预填) | L4 | P0 |
| TC-BIO-ACT-071 | FR-BIO-023 | 面板复用发起按钮·悬停 | 选中归档 | hover | 悬停反馈 | L4 | P2 |
| TC-BIO-ACT-072 | FR-BIO-023 | 面板复用发起按钮·键盘 Enter | 按钮聚焦 | 按 Enter | 打开复用表单 | L4 | P1 |
| TC-BIO-ACT-073 | FR-BIO-023 | 面板复用发起按钮·加载中态 | 表单加载中 | 检查 | disabled+spinner | L4 | P1 |
| TC-BIO-ACT-074 | FR-BIO-020 | 存档名称输入·点击聚焦 | 存档提示卡 | 点击 | 焦点;边框渐变 | L4 | P0 |
| TC-BIO-ACT-075 | FR-BIO-020 | 存档名称输入·失焦 | 聚焦中 | 移开 | 边框恢复 | L4 | P1 |
| TC-BIO-ACT-076 | FR-BIO-020 | 存档名称输入·键盘 Enter | 已输入名称 | 按 Enter | 触发存档 | L4 | P0 |
| TC-BIO-ACT-077 | FR-BIO-020 | 存档名称输入·键盘 Esc | 聚焦中 | 按 Esc | 清空或取消(两态断言其一) | L4 | P2 |
| TC-BIO-ACT-078 | FR-BIO-020 | 存档名称输入·禁用态 | 存档请求中 | 检查 | disabled | L4 | P0 |
| TC-BIO-ACT-079 | FR-BIO-020 | 存档按钮·点击 | 已命名 | 点击 | 发出 POST archives | L4 | P0 |
| TC-BIO-ACT-080 | FR-BIO-020 | 存档按钮·双击 | 可提交 | 双击 | 仅一次请求 | L4 | P1 |
| TC-BIO-ACT-081 | FR-BIO-020 | 存档按钮·悬停 | 可提交 | hover | 渐变增亮 | L4 | P2 |
| TC-BIO-ACT-082 | FR-BIO-020 | 存档按钮·键盘 Enter | 按钮聚焦 | 按 Enter | 触发存档 | L4 | P1 |
| TC-BIO-ACT-083 | FR-BIO-020 | 存档按钮·禁用态 | 名称空 | 检查 | disabled | L4 | P0 |
| TC-BIO-ACT-084 | FR-BIO-020 | 存档按钮·加载中态 | 存档中 | 检查 | disabled+spinner | L4 | P0 |
| TC-BIO-ACT-085 | FR-BIO-020 | 放弃按钮·点击 | 存档提示卡 | 点击 | 卡片消失;无请求 | L4 | P0 |
| TC-BIO-ACT-086 | FR-BIO-020 | 放弃按钮·悬停 | 提示卡 | hover | pane-btn 悬停反馈 | L4 | P2 |
| TC-BIO-ACT-087 | FR-BIO-020 | 放弃按钮·键盘 Enter | 按钮聚焦 | 按 Enter | 放弃(卡片消失) | L4 | P1 |
| TC-BIO-ACT-088 | FR-BIO-020 | 放弃按钮·键盘 Esc | 按钮聚焦 | 按 Esc | 取消聚焦;卡片保留 | L4 | P2 |
| TC-BIO-ACT-089 | FR-BIO-020 | 放弃按钮·加载中态 | 存档请求中 | 检查 | 放弃按钮 disabled(防误操作) | L4 | P1 |
| TC-BIO-ACT-090 | FR-BIO-024 | 面板列表项·点击 | 任务列表 | 点击任务项 | 选中并展开详情(DAG 显示) | L4 | P0 |
| TC-BIO-ACT-091 | FR-BIO-024 | 面板列表项·悬停 | 列表 | hover | session-item 悬停反馈 | L4 | P1 |
| TC-BIO-ACT-092 | FR-BIO-022 | 档案列表项·点击 | 档案列表 | 点击 | 选中并显示详情 | L4 | P0 |
| TC-BIO-ACT-093 | FR-BIO-022 | 档案列表项·悬停 | 列表 | hover | 悬停反馈 | L4 | P1 |
| TC-BIO-ACT-094 | FR-BIO-011 | 进度卡日志区·点击滚动 | 日志溢出 | 点击日志区 | 区域获得焦点可滚动;不触发其他动作 | L4 | P2 |
| TC-BIO-ACT-095 | FR-BIO-011 | 进度卡日志区·悬停 | 日志溢出 | hover | 显示滚动条/悬停反馈 | L4 | P2 |
#### 6.1.17 E2E 端到端主线(TEST_PLAN §11 九条 × 三档视口 M/T/D)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-E2E-001-M | FR-BIO-002/004 | E2E-01 主流程·移动端:候选路径卡出现 | mock LLM 正常;390×844 | 发送「帮我跑水稻 SPL 家族鉴定」 | 对话出现 .flow-path-card;候选行数量∈[2,3];每行含阶段序列文本 | L5-M | P0 |
| TC-BIO-E2E-002-M | FR-BIO-004 | E2E-01 主流程·移动端:点选与确认 | 候选卡已出现 | 点击第 1 候选行→点「确认此路径」 | 路径确认卡出现(逐阶段名称/用途/预计耗时);发出 POST /api/bioflow/jobs | L5-M | P0 |
| TC-BIO-E2E-003-M | FR-BIO-004 | E2E-01 主流程·移动端:任务面板出现新任务 | 任务已创建 | 切到「生信任务」TAB | 列表含新任务;状态=created | L5-M | P0 |
| TC-BIO-E2E-004-M | FR-BIO-005 | E2E-01 主流程·移动端:文件引导卡 | 起始阶段缺 fasta | 等待推进 | 对话出现缺文件提示(点名 fasta)+ .flow-file-card | L5-M | P0 |
| TC-BIO-E2E-005-M | FR-BIO-006 | E2E-01 主流程·移动端:拖拽上传金标数据 | 本地金标输入可用 | 拖入 Ft.SPL pep 文件 | 进度条百分比逐级推进至 100%;POST files 发出 | L5-M | P0 |
| TC-BIO-E2E-006-M | FR-BIO-008/009 | E2E-01 主流程·移动端:参数表单改一个参数 | 阶段待确认 | 表单卡出现后改 cpu=8→点「继续」 | 发出 confirm;请求体 params.cpu=8;阶段 running | L5-M | P0 |
| TC-BIO-E2E-007-M | FR-BIO-011 | E2E-01 主流程·移动端:进度卡逐阶段流转 | mock 全链 | 观察 | 状态点逐阶段点亮(waiting→running→done);运行中日志尾滚动更新 | L5-M | P0 |
| TC-BIO-E2E-008-M | FR-BIO-016 | E2E-01 主流程·移动端:报告预览 | 任务完成报告登记 | 切文档 TAB 打开 DocPane | 报告出现;预览白底(background=#FFFFFF);图可见 | L5-M | P0 |
| TC-BIO-E2E-009-M | FR-BIO-018 | E2E-01 主流程·移动端:导出 PDF | 报告已打开 | 点导出 PDF | 下载事件触发;文件落盘且可打开(非 0 字节) | L5-M | P1 |
| TC-BIO-E2E-010-M | FR-BIO-020/021 | E2E-01 主流程·移动端:存档提示→存档→状态回复 | 任务完成 | 观察提示卡→输入名称→点存档 | POST archives 发出;回复消息含名称/位置/大小三要素 | L5-M | P0 |
| TC-BIO-E2E-011-M | FR-BIO-024 | E2E-01 主流程·移动端:档案面板出现 | 已存档 | 切「生信档案」TAB | 列表含新档案(名称正确) | L5-M | P0 |
| TC-BIO-E2E-012-M | FR-BIO-027 | E2E-01 主流程·移动端:布局不溢出 | 全程 | 观察各步骤 | .flow-path-card/.flow-form-card/.flow-file-card/.bioflow-progress-card 宽≤容器;无横向滚动 | L5-M | P1 |
| TC-BIO-E2E-001-T | FR-BIO-002/004 | E2E-01 主流程·平板:候选路径卡出现 | mock LLM 正常;768×1024 | 发送「帮我跑水稻 SPL 家族鉴定」 | 对话出现 .flow-path-card;候选行数量∈[2,3];每行含阶段序列文本 | L5-T | P0 |
| TC-BIO-E2E-002-T | FR-BIO-004 | E2E-01 主流程·平板:点选与确认 | 候选卡已出现 | 点击第 1 候选行→点「确认此路径」 | 路径确认卡出现(逐阶段名称/用途/预计耗时);发出 POST /api/bioflow/jobs | L5-T | P0 |
| TC-BIO-E2E-003-T | FR-BIO-004 | E2E-01 主流程·平板:任务面板出现新任务 | 任务已创建 | 切到「生信任务」TAB | 列表含新任务;状态=created | L5-T | P0 |
| TC-BIO-E2E-004-T | FR-BIO-005 | E2E-01 主流程·平板:文件引导卡 | 起始阶段缺 fasta | 等待推进 | 对话出现缺文件提示(点名 fasta)+ .flow-file-card | L5-T | P0 |
| TC-BIO-E2E-005-T | FR-BIO-006 | E2E-01 主流程·平板:拖拽上传金标数据 | 本地金标输入可用 | 拖入 Ft.SPL pep 文件 | 进度条百分比逐级推进至 100%;POST files 发出 | L5-T | P0 |
| TC-BIO-E2E-006-T | FR-BIO-008/009 | E2E-01 主流程·平板:参数表单改一个参数 | 阶段待确认 | 表单卡出现后改 cpu=8→点「继续」 | 发出 confirm;请求体 params.cpu=8;阶段 running | L5-T | P0 |
| TC-BIO-E2E-007-T | FR-BIO-011 | E2E-01 主流程·平板:进度卡逐阶段流转 | mock 全链 | 观察 | 状态点逐阶段点亮(waiting→running→done);运行中日志尾滚动更新 | L5-T | P0 |
| TC-BIO-E2E-008-T | FR-BIO-016 | E2E-01 主流程·平板:报告预览 | 任务完成报告登记 | 切文档 TAB 打开 DocPane | 报告出现;预览白底(background=#FFFFFF);图可见 | L5-T | P0 |
| TC-BIO-E2E-009-T | FR-BIO-018 | E2E-01 主流程·平板:导出 PDF | 报告已打开 | 点导出 PDF | 下载事件触发;文件落盘且可打开(非 0 字节) | L5-T | P1 |
| TC-BIO-E2E-010-T | FR-BIO-020/021 | E2E-01 主流程·平板:存档提示→存档→状态回复 | 任务完成 | 观察提示卡→输入名称→点存档 | POST archives 发出;回复消息含名称/位置/大小三要素 | L5-T | P0 |
| TC-BIO-E2E-011-T | FR-BIO-024 | E2E-01 主流程·平板:档案面板出现 | 已存档 | 切「生信档案」TAB | 列表含新档案(名称正确) | L5-T | P0 |
| TC-BIO-E2E-012-T | FR-BIO-027 | E2E-01 主流程·平板:布局不溢出 | 全程 | 观察各步骤 | .flow-path-card/.flow-form-card/.flow-file-card/.bioflow-progress-card 宽≤容器;无横向滚动 | L5-T | P1 |
| TC-BIO-E2E-001-D | FR-BIO-002/004 | E2E-01 主流程·桌面:候选路径卡出现 | mock LLM 正常;1440×900 | 发送「帮我跑水稻 SPL 家族鉴定」 | 对话出现 .flow-path-card;候选行数量∈[2,3];每行含阶段序列文本 | L5-D | P0 |
| TC-BIO-E2E-002-D | FR-BIO-004 | E2E-01 主流程·桌面:点选与确认 | 候选卡已出现 | 点击第 1 候选行→点「确认此路径」 | 路径确认卡出现(逐阶段名称/用途/预计耗时);发出 POST /api/bioflow/jobs | L5-D | P0 |
| TC-BIO-E2E-003-D | FR-BIO-004 | E2E-01 主流程·桌面:任务面板出现新任务 | 任务已创建 | 切到「生信任务」TAB | 列表含新任务;状态=created | L5-D | P0 |
| TC-BIO-E2E-004-D | FR-BIO-005 | E2E-01 主流程·桌面:文件引导卡 | 起始阶段缺 fasta | 等待推进 | 对话出现缺文件提示(点名 fasta)+ .flow-file-card | L5-D | P0 |
| TC-BIO-E2E-005-D | FR-BIO-006 | E2E-01 主流程·桌面:拖拽上传金标数据 | 本地金标输入可用 | 拖入 Ft.SPL pep 文件 | 进度条百分比逐级推进至 100%;POST files 发出 | L5-D | P0 |
| TC-BIO-E2E-006-D | FR-BIO-008/009 | E2E-01 主流程·桌面:参数表单改一个参数 | 阶段待确认 | 表单卡出现后改 cpu=8→点「继续」 | 发出 confirm;请求体 params.cpu=8;阶段 running | L5-D | P0 |
| TC-BIO-E2E-007-D | FR-BIO-011 | E2E-01 主流程·桌面:进度卡逐阶段流转 | mock 全链 | 观察 | 状态点逐阶段点亮(waiting→running→done);运行中日志尾滚动更新 | L5-D | P0 |
| TC-BIO-E2E-008-D | FR-BIO-016 | E2E-01 主流程·桌面:报告预览 | 任务完成报告登记 | 切文档 TAB 打开 DocPane | 报告出现;预览白底(background=#FFFFFF);图可见 | L5-D | P0 |
| TC-BIO-E2E-009-D | FR-BIO-018 | E2E-01 主流程·桌面:导出 PDF | 报告已打开 | 点导出 PDF | 下载事件触发;文件落盘且可打开(非 0 字节) | L5-D | P1 |
| TC-BIO-E2E-010-D | FR-BIO-020/021 | E2E-01 主流程·桌面:存档提示→存档→状态回复 | 任务完成 | 观察提示卡→输入名称→点存档 | POST archives 发出;回复消息含名称/位置/大小三要素 | L5-D | P0 |
| TC-BIO-E2E-011-D | FR-BIO-024 | E2E-01 主流程·桌面:档案面板出现 | 已存档 | 切「生信档案」TAB | 列表含新档案(名称正确) | L5-D | P0 |
| TC-BIO-E2E-012-D | FR-BIO-027 | E2E-01 主流程·桌面:布局不溢出 | 全程 | 观察各步骤 | .flow-path-card/.flow-form-card/.flow-file-card/.bioflow-progress-card 宽≤容器;无横向滚动 | L5-D | P1 |
| TC-BIO-E2E-013-M | FR-BIO-010 | E2E-02 自动连续·移动端 | mock 全链 | 开启自动连续开关→发起任务→中途暂停 | 阶段间无表单卡自动推进;暂停后停在下一阶段前(该阶段 waiting_confirm) | L5-M | P0 |
| TC-BIO-E2E-013-T | FR-BIO-010 | E2E-02 自动连续·平板 | mock 全链 | 同上 | 同上断言 | L5-T | P0 |
| TC-BIO-E2E-013-D | FR-BIO-010 | E2E-02 自动连续·桌面 | mock 全链 | 同上 | 同上断言 | L5-D | P0 |
| TC-BIO-E2E-014-M | FR-BIO-012 | E2E-03 失败注入·移动端:三选一 | mock 阶段 2 失败 | 推进至失败 | 进度卡标红(--pa-error ✕);三按钮出现 | L5-M | P0 |
| TC-BIO-E2E-015-M | FR-BIO-012 | E2E-03 失败注入·移动端:重跑成功 | 阶段 failed | 点重跑(mock 转成功) | 状态转 running→done | L5-M | P0 |
| TC-BIO-E2E-016-M | FR-BIO-012 | E2E-03 失败注入·移动端:跳过生效 | 阶段 failed | 点跳过 | 状态=skipped;后续阶段推进 | L5-M | P0 |
| TC-BIO-E2E-017-M | FR-BIO-012 | E2E-03 失败注入·移动端:改参数重跑 | 阶段 failed | 点改参数重跑→改参数→继续 | 表单出现;按新参数重跑成功 | L5-M | P0 |
| TC-BIO-E2E-014-T | FR-BIO-012 | E2E-03 失败注入·平板:三选一 | mock 阶段 2 失败 | 推进至失败 | 进度卡标红(--pa-error ✕);三按钮出现 | L5-T | P0 |
| TC-BIO-E2E-015-T | FR-BIO-012 | E2E-03 失败注入·平板:重跑成功 | 阶段 failed | 点重跑(mock 转成功) | 状态转 running→done | L5-T | P0 |
| TC-BIO-E2E-016-T | FR-BIO-012 | E2E-03 失败注入·平板:跳过生效 | 阶段 failed | 点跳过 | 状态=skipped;后续阶段推进 | L5-T | P0 |
| TC-BIO-E2E-017-T | FR-BIO-012 | E2E-03 失败注入·平板:改参数重跑 | 阶段 failed | 点改参数重跑→改参数→继续 | 表单出现;按新参数重跑成功 | L5-T | P0 |
| TC-BIO-E2E-014-D | FR-BIO-012 | E2E-03 失败注入·桌面:三选一 | mock 阶段 2 失败 | 推进至失败 | 进度卡标红(--pa-error ✕);三按钮出现 | L5-D | P0 |
| TC-BIO-E2E-015-D | FR-BIO-012 | E2E-03 失败注入·桌面:重跑成功 | 阶段 failed | 点重跑(mock 转成功) | 状态转 running→done | L5-D | P0 |
| TC-BIO-E2E-016-D | FR-BIO-012 | E2E-03 失败注入·桌面:跳过生效 | 阶段 failed | 点跳过 | 状态=skipped;后续阶段推进 | L5-D | P0 |
| TC-BIO-E2E-017-D | FR-BIO-012 | E2E-03 失败注入·桌面:改参数重跑 | 阶段 failed | 点改参数重跑→改参数→继续 | 表单出现;按新参数重跑成功 | L5-D | P0 |
| TC-BIO-E2E-018-M | FR-BIO-014 | E2E-04 断线回放·移动端 | 任务 3 阶段执行中 | 切断 SSE 30s→重连 | 进度卡恢复断线前状态;无进度丢失;日志尾恢复 | L5-M | P0 |
| TC-BIO-E2E-018-T | FR-BIO-014 | E2E-04 断线回放·平板 | 任务 3 阶段执行中 | 切断 SSE 30s→重连 | 进度卡恢复断线前状态;无进度丢失;日志尾恢复 | L5-T | P0 |
| TC-BIO-E2E-018-D | FR-BIO-014 | E2E-04 断线回放·桌面 | 任务 3 阶段执行中 | 切断 SSE 30s→重连 | 进度卡恢复断线前状态;无进度丢失;日志尾恢复 | L5-D | P0 |
| TC-BIO-E2E-019-M | FR-BIO-023 | E2E-05 存档复用·移动端 | 归档 XXX 存在 | 发送「用 XXX 存档任务的方法帮我跑玉米 bZIP」→确认预填表单→执行 | 表单预填=XXX 参数(来源标注 XXX);新任务按此参数执行 | L5-M | P0 |
| TC-BIO-E2E-019-T | FR-BIO-023 | E2E-05 存档复用·平板 | 归档 XXX 存在 | 同上 | 同上断言 | L5-T | P0 |
| TC-BIO-E2E-019-D | FR-BIO-023 | E2E-05 存档复用·桌面 | 归档 XXX 存在 | 同上 | 同上断言 | L5-D | P0 |
| TC-BIO-E2E-020-M | FR-BIO-025 | E2E-06 探活显隐·移动端 | 同部署 mock | 停 8098→刷新 | 「生信任务/生信档案」TAB 与生信块分支消失;恢复 8098→刷新→出现 | L5-M | P0 |
| TC-BIO-E2E-020-T | FR-BIO-025 | E2E-06 探活显隐·平板 | 同部署 mock | 停 8098→刷新 | 「生信任务/生信档案」TAB 与生信块分支消失;恢复 8098→刷新→出现 | L5-T | P0 |
| TC-BIO-E2E-020-D | FR-BIO-025 | E2E-06 探活显隐·桌面 | 同部署 mock | 停 8098→刷新 | 「生信任务/生信档案」TAB 与生信块分支消失;恢复 8098→刷新→出现 | L5-D | P0 |
| TC-BIO-E2E-021-M | FR-BIO-019 | E2E-07 图表调整·移动端 | 报告含图1 | 发送「图1 颜色换成红色」 | 触发绘图阶段重跑;新图回填报告;预览刷新(颜色变化) | L5-M | P0 |
| TC-BIO-E2E-021-T | FR-BIO-019 | E2E-07 图表调整·平板 | 报告含图1 | 发送「图1 颜色换成红色」 | 触发绘图阶段重跑;新图回填报告;预览刷新(颜色变化) | L5-T | P0 |
| TC-BIO-E2E-021-D | FR-BIO-019 | E2E-07 图表调整·桌面 | 报告含图1 | 发送「图1 颜色换成红色」 | 触发绘图阶段重跑;新图回填报告;预览刷新(颜色变化) | L5-D | P0 |
| TC-BIO-E2E-022-M | FR-BIO-026 | E2E-08 知识库问答·移动端 | flow_docs 已入库;生信会话 | 发送「identify 需要什么输入」 | 答案含引用块(源文件+章节);点引用跳转原文 | L5-M | P0 |
| TC-BIO-E2E-022-T | FR-BIO-026 | E2E-08 知识库问答·平板 | flow_docs 已入库;生信会话 | 发送「identify 需要什么输入」 | 答案含引用块(源文件+章节);点引用跳转原文 | L5-T | P0 |
| TC-BIO-E2E-022-D | FR-BIO-026 | E2E-08 知识库问答·桌面 | flow_docs 已入库;生信会话 | 发送「identify 需要什么输入」 | 答案含引用块(源文件+章节);点引用跳转原文 | L5-D | P0 |
| TC-BIO-E2E-023-M | FR-BIO-027 | E2E-09 三档视口·移动端布局 | 390×844;进度卡/面板可见 | 观察五卡片+两面板 | 卡片/面板/进度卡不溢出;触控目标≥44px(按钮/候选行命中区) | L5-M | P0 |
| TC-BIO-E2E-023-T | FR-BIO-027 | E2E-09 三档视口·平板布局 | 768×1024;进度卡/面板可见 | 观察五卡片+两面板 | 卡片/面板/进度卡不溢出;面板可切换 | L5-T | P0 |
| TC-BIO-E2E-023-D | FR-BIO-027 | E2E-09 三档视口·桌面布局 | 1440×900;进度卡/面板可见 | 观察五卡片+两面板 | 卡片/面板/进度卡不溢出;面板可切换 | L5-D | P0 |
| TC-BIO-E2E-024-M | FR-BIO-018 | E2E-01 主流程·移动端:导出 DOCX | 报告已打开 | 点导出 DOCX | 下载事件触发;文件落盘且可打开(非 0 字节) | L5-M | P1 |
| TC-BIO-E2E-024-T | FR-BIO-018 | E2E-01 主流程·平板:导出 DOCX | 报告已打开 | 点导出 DOCX | 下载事件触发;文件落盘且可打开(非 0 字节) | L5-T | P1 |
| TC-BIO-E2E-024-D | FR-BIO-018 | E2E-01 主流程·桌面:导出 DOCX | 报告已打开 | 点导出 DOCX | 下载事件触发;文件落盘且可打开(非 0 字节) | L5-D | P1 |
| TC-BIO-E2E-025-M | FR-BIO-001 | E2E 漏判安全·移动端 | mock | 发送「什么是基因家族」 | 走 qa 流;无 .flow-path-card;无 bioflow 请求 | L5-M | P0 |
| TC-BIO-E2E-025-T | FR-BIO-001 | E2E 漏判安全·平板 | mock | 发送「什么是基因家族」 | 走 qa 流;无 .flow-path-card;无 bioflow 请求 | L5-T | P0 |
| TC-BIO-E2E-025-D | FR-BIO-001 | E2E 漏判安全·桌面 | mock | 发送「什么是基因家族」 | 走 qa 流;无 .flow-path-card;无 bioflow 请求 | L5-D | P0 |
| TC-BIO-E2E-026-M | FR-BIO-007 | E2E 服务器路径登记·移动端 | 任务待文件 | 文件卡路径输入行输入合法路径→点登记 | 登记成功显示登记项;阶段推进 | L5-M | P1 |
| TC-BIO-E2E-026-T | FR-BIO-007 | E2E 服务器路径登记·平板 | 任务待文件 | 文件卡路径输入行输入合法路径→点登记 | 登记成功显示登记项;阶段推进 | L5-T | P1 |
| TC-BIO-E2E-026-D | FR-BIO-007 | E2E 服务器路径登记·桌面 | 任务待文件 | 文件卡路径输入行输入合法路径→点登记 | 登记成功显示登记项;阶段推进 | L5-D | P1 |
| TC-BIO-E2E-027-M | FR-BIO-010 | E2E-02 暂停恢复·移动端 | 任务暂停中 | 点恢复 | 从下一阶段继续执行 | L5-M | P0 |
| TC-BIO-E2E-027-T | FR-BIO-010 | E2E-02 暂停恢复·平板 | 任务暂停中 | 点恢复 | 从下一阶段继续执行 | L5-T | P0 |
| TC-BIO-E2E-027-D | FR-BIO-010 | E2E-02 暂停恢复·桌面 | 任务暂停中 | 点恢复 | 从下一阶段继续执行 | L5-D | P0 |
| TC-BIO-E2E-028-M | FR-BIO-017 | E2E 报告编辑·移动端 | 报告已打开 | 就地改文字→保存 | 文字更新落盘(刷新后仍在);走既有编辑链路 | L5-M | P1 |
| TC-BIO-E2E-028-T | FR-BIO-017 | E2E 报告编辑·平板 | 报告已打开 | 就地改文字→保存 | 文字更新落盘(刷新后仍在);走既有编辑链路 | L5-T | P1 |
| TC-BIO-E2E-028-D | FR-BIO-017 | E2E 报告编辑·桌面 | 报告已打开 | 就地改文字→保存 | 文字更新落盘(刷新后仍在);走既有编辑链路 | L5-D | P1 |
| TC-BIO-E2E-029-M | FR-BIO-024 | E2E 任务面板 DAG·移动端 | 任务 3 阶段 | 打开任务详情 | 纵向连接线渲染;3 节点圆点按状态取色 | L5-M | P1 |
| TC-BIO-E2E-029-T | FR-BIO-024 | E2E 任务面板 DAG·平板 | 任务 3 阶段 | 打开任务详情 | 纵向连接线渲染;3 节点圆点按状态取色 | L5-T | P1 |
| TC-BIO-E2E-029-D | FR-BIO-024 | E2E 任务面板 DAG·桌面 | 任务 3 阶段 | 打开任务详情 | 纵向连接线渲染;3 节点圆点按状态取色 | L5-D | P1 |
| TC-BIO-E2E-030-M | FR-BIO-022 | E2E 档案回看·移动端 | 归档存在 | 档案面板打开归档详情 | 详情显示阶段链/参数/产物/报告 | L5-M | P1 |
| TC-BIO-E2E-030-T | FR-BIO-022 | E2E 档案回看·平板 | 归档存在 | 档案面板打开归档详情 | 详情显示阶段链/参数/产物/报告 | L5-T | P1 |
| TC-BIO-E2E-030-D | FR-BIO-022 | E2E 档案回看·桌面 | 归档存在 | 档案面板打开归档详情 | 详情显示阶段链/参数/产物/报告 | L5-D | P1 |
| TC-BIO-E2E-031-M | FR-BIO-020 | E2E 放弃存档·移动端 | 存档提示卡出现 | 点「放弃」 | 卡片消失;无 POST /api/bioflow/archives;任务保持 done 无副作用 | L5-M | P1 |
| TC-BIO-E2E-031-T | FR-BIO-020 | E2E 放弃存档·平板 | 存档提示卡出现 | 点「放弃」 | 卡片消失;无 POST /api/bioflow/archives;任务保持 done 无副作用 | L5-T | P1 |
| TC-BIO-E2E-031-D | FR-BIO-020 | E2E 放弃存档·桌面 | 存档提示卡出现 | 点「放弃」 | 卡片消失;无 POST /api/bioflow/archives;任务保持 done 无副作用 | L5-D | P1 |
| TC-BIO-E2E-032-M | FR-BIO-023 | E2E 面板复用发起·移动端 | 归档存在 | 档案面板→选中→点复用发起→确认 | 表单预填=归档参数;新任务入生信任务面板 | L5-M | P1 |
| TC-BIO-E2E-032-T | FR-BIO-023 | E2E 面板复用发起·平板 | 归档存在 | 档案面板→选中→点复用发起→确认 | 表单预填=归档参数;新任务入生信任务面板 | L5-T | P1 |
| TC-BIO-E2E-032-D | FR-BIO-023 | E2E 面板复用发起·桌面 | 归档存在 | 档案面板→选中→点复用发起→确认 | 表单预填=归档参数;新任务入生信任务面板 | L5-D | P1 |
| TC-BIO-E2E-033-M | FR-BIO-010 | E2E 自动连续可关闭·移动端 | 自动连续任务运行中 | 关闭自动连续开关 | 下一阶段前出现参数表单卡(切回手动) | L5-M | P1 |
| TC-BIO-E2E-033-T | FR-BIO-010 | E2E 自动连续可关闭·平板 | 自动连续任务运行中 | 关闭自动连续开关 | 下一阶段前出现参数表单卡(切回手动) | L5-T | P1 |
| TC-BIO-E2E-033-D | FR-BIO-010 | E2E 自动连续可关闭·桌面 | 自动连续任务运行中 | 关闭自动连续开关 | 下一阶段前出现参数表单卡(切回手动) | L5-D | P1 |
| TC-BIO-E2E-034-M | FR-BIO-024 | E2E 任务面板删除·移动端 | 非运行任务存在 | 面板点删除→确认 | 发出 DELETE;列表移除;刷新后仍无 | L5-M | P1 |
| TC-BIO-E2E-034-T | FR-BIO-024 | E2E 任务面板删除·平板 | 非运行任务存在 | 面板点删除→确认 | 发出 DELETE;列表移除;刷新后仍无 | L5-T | P1 |
| TC-BIO-E2E-034-D | FR-BIO-024 | E2E 任务面板删除·桌面 | 非运行任务存在 | 面板点删除→确认 | 发出 DELETE;列表移除;刷新后仍无 | L5-D | P1 |
| TC-BIO-E2E-035-M | FR-BIO-022 | E2E 档案删除·移动端 | 归档存在 | 档案面板点删除→确认 | 发出 DELETE;列表移除;刷新后仍无 | L5-M | P1 |
| TC-BIO-E2E-035-T | FR-BIO-022 | E2E 档案删除·平板 | 归档存在 | 档案面板点删除→确认 | 发出 DELETE;列表移除;刷新后仍无 | L5-T | P1 |
| TC-BIO-E2E-035-D | FR-BIO-022 | E2E 档案删除·桌面 | 归档存在 | 档案面板点删除→确认 | 发出 DELETE;列表移除;刷新后仍无 | L5-D | P1 |
| TC-BIO-E2E-036-M | FR-BIO-007 | E2E 聊天窗口指定路径·移动端 | 任务待文件 | 在聊天输入合法服务器路径并发送 | 路径登记成功;文件引导卡更新;阶段推进 | L5-M | P1 |
| TC-BIO-E2E-036-T | FR-BIO-007 | E2E 聊天窗口指定路径·平板 | 任务待文件 | 在聊天输入合法服务器路径并发送 | 路径登记成功;文件引导卡更新;阶段推进 | L5-T | P1 |
| TC-BIO-E2E-036-D | FR-BIO-007 | E2E 聊天窗口指定路径·桌面 | 任务待文件 | 在聊天输入合法服务器路径并发送 | 路径登记成功;文件引导卡更新;阶段推进 | L5-D | P1 |
#### 6.1.18 DEPLOY 三形态部署(L2/L3 断言 + L2s 部署点冒烟)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-DEPLOY-001 | FR-BIO-027 | 只 rag:反代不注册 | BIOFLOW_ENABLED 缺省(false)启动 BFF | 检查路由表 | 无 /api/bioflow/* 路由 | L2 | P0 |
| TC-BIO-DEPLOY-002 | FR-BIO-027 | 只 rag:前端无生信痕迹 | 只 rag 部署;GET health 404 | 打开前端 | 无「生信任务/生信档案」TAB;无生信块分支;Composer 无生信上传分支 | L3 | P0 |
| TC-BIO-DEPLOY-003 | FR-BIO-027 | 只 rag:零请求 8098 | 只 rag 部署 | 打开前端并提问 | 网络面板无 /api/bioflow/* 请求 | L3 | P0 |
| TC-BIO-DEPLOY-004 | FR-BIO-027 | 只生信:8098 直连 | 仅部署生信服务 | GET :8098/api/bioflow/health | 200;catalog/jobs/chat 全部可用(不经 BFF) | L2 | P0 |
| TC-BIO-DEPLOY-005 | FR-BIO-027 | 只生信:报告降级下载 HTML | 只生信;任务 done | 取报告 | 返回 HTML 直下(Content-Type=text/html;Content-Disposition attachment 或页面内嵌,两态断言其一) | L2 | P0 |
| TC-BIO-DEPLOY-006 | FR-BIO-027 | 同部署:反代启用 | BIOFLOW_ENABLED=true | GET http://BFF/api/bioflow/health | 200 且响应体=直连响应体 | L2 | P0 |
| TC-BIO-DEPLOY-007 | FR-BIO-027 | 同部署:前端显形 | 同部署;health 200 | 打开前端 | 生信 TAB 出现;五类卡片/两面板可访问 | L3 | P0 |
| TC-BIO-DEPLOY-008 | FR-BIO-028 | BFF 停生信服务仍工作 | 同部署;停 BFF | 直连 8098 跑 mini 任务 | 任务正常完成(创建/确认/事件) | L2s | P0 |
| TC-BIO-DEPLOY-009 | FR-BIO-028 | BFF 重启不影响生信任务 | 同部署;任务 in-flight | 重启 BFF | 任务不受影响;8098 进程存活;GET jobs 仍含该任务 | L2s | P0 |
| TC-BIO-DEPLOY-010 | FR-BIO-027 | 三形态环境变量矩阵 | 三组配置 fixture | 逐组启动 BFF | 路由注册与否与 BIOFLOW_ENABLED 严格一致(3/3) | L2 | P1 |
| TC-BIO-DEPLOY-011 | FR-BIO-025 | 探活超时前端不白屏 | health 超时(mock 挂起) | 打开前端 | 页面正常渲染(无生信 TAB);无未捕获异常 | L3 | P1 |
| TC-BIO-DEPLOY-012 | FR-BIO-027 | 只生信形态 vstore 降级 | 只生信 | 跑流程咨询 | 检索不可用时 planner 走 LLM 直出(标记 llm_only);不 5xx | L2 | P1 |
#### 6.1.19 REG 回归与串扰(L3/L4/L5,bioflow 引入不得破坏既有功能)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-REG-001 | FR-BIO-001 | QA 主流程无串扰 | 同部署;mock normal | 完整跑 E2E-01(QA 五相位) | 全相位通过;无 bioflow 请求产生 | L5-D | P0 |
| TC-BIO-REG-002 | FR-BIO-001 | 检索模式无串扰 | mock | 检索模式提问 | 只出来源不出答案块(与既有行为一致) | L5-D | P0 |
| TC-BIO-REG-003 | FR-BIO-001 | docgen 全链无串扰 | 同部署 | 写文档→编辑→导出 | 全部走既有 docgen 链路;无 bioflow 拦截 | L5-D | P0 |
| TC-BIO-REG-004 | FR-BIO-001 | 会话管理无串扰 | 同部署 | 新建/切换/删除会话 | 行为与既有一致 | L5-D | P1 |
| TC-BIO-REG-005 | FR-BIO-001 | 意图词典改动不打乱 docgen | 词典全表 | 跑 cases_intent.md(docgen 版)30 条 | docgen 判定 30/30 与既有表一致 | L3 | P0 |
| TC-BIO-REG-006 | FR-BIO-001 | 红线文件零改动 | git checkout 基线 | diff 五文件 | modes.js/labels.js/bench.js/qa.js/parser.js 无 diff | L3 | P0 |
| TC-BIO-REG-007 | FR-BIO-011 | PipelineCard 零改动 | 进度卡复用 | diff | PipelineCard.vue 无 diff;两卡同款视觉 | L3 | P1 |
| TC-BIO-REG-008 | FR-BIO-001 | BenchPanel TAB 数更新 | 同部署 | 数 TAB | 生信 TAB 计入后总数=既有+2;关服务时恢复既有数 | L4 | P0 |
| TC-BIO-REG-009 | FR-BIO-016 | doc_artifacts 与生信报告并存 | 同部署 | 查看文档工作台 | 既有 docgen 文档与生信报告同列表可切换;互不覆盖 | L5-D | P0 |
| TC-BIO-REG-010 | FR-BIO-001 | 首屏性能不劣化 | 同部署 | 测首屏 | 首屏时间与引入前基线差 <500ms | L5-D | P2 |
| TC-BIO-REG-011 | FR-BIO-001 | 主题切换生信组件适配 | 同部署 | 切深/浅 | 五卡片两面板令牌随主题(--pa-* 自动适配,无硬编码色) | L4 | P0 |
| TC-BIO-REG-012 | FR-BIO-001 | i18n 文案走 bioflow.js | 前端构建 | 检索文案键 | 生信文案全部在 i18n/bioflow.js;labels.js 未动 | L3 | P1 |
| TC-BIO-REG-013 | FR-BIO-001 | 生信会话与 QA 会话隔离 | 同部署 | 两会话并行操作 | 各自消息/任务状态互不串扰 | L5-D | P1 |
| TC-BIO-REG-014 | FR-BIO-001 | 既有 E2E 冒烟 6 条 | 同部署 | 跑 smoke.spec 三视口 | 6/6 pass(占位回退失效后走真实分支仍过) | L5 | P1 |
| TC-BIO-REG-015 | FR-BIO-001 | QA 上游 402 降级不受影响 | mock 402 | 提问 | fallback 证据列表展示与既有一致 | L5-D | P1 |
#### 6.1.20 GOLD 金标与发布(L2s 部署点冒烟 + 编译门禁)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-GOLD-001 | FR-BIO-030 | 金标 24 ID 全等 | bioflow-gf 镜像;金标输入 | docker run identify | 输出集合与预期 24 成员 ID 全等;diff 输出为空 | L2s | P0 |
| TC-BIO-GOLD-002 | FR-BIO-030 | 金标冒烟脚本 | 镜像与数据就位 | bash bioflow_kernel/tests/smoke_golden.sh | 退出码 0;stdout 含 PASS | L2s | P0 |
| TC-BIO-GOLD-003 | FR-BIO-030 | 金标重复可复现 | 同上 | 连跑 2 次 | 两次输出集合一致(确定性) | L2s | P1 |
| TC-BIO-GOLD-004 | FR-BIO-032 | 18 入口 --help 冒烟 | 4 镜像 | 逐条 python -B -m cli.run_* --help | 18/18 退出码 0;无 traceback | L2s | P0 |
| TC-BIO-GOLD-005 | FR-BIO-032 | compile_bioflow.sh 编译产出 | 源码树 | 跑编译脚本(TL 执行后 T 验证) | 产出 .so 与明文白名单文件;无编译错误 | L2s | P0 |
| TC-BIO-GOLD-006 | FR-BIO-032 | 白名单外无明文 | 编译产物 | 检查产物 | 白名单外模块均为 .so(无 .py 明文残留) | L2s | P1 |
| TC-BIO-GOLD-007 | FR-BIO-032 | build_all.sh 4 镜像 | 构建环境 | 检查 docker images | bioflow-gf/bioflow-rnaseq/bioflow-wgs/bioflow-interproscan 四 tag 存在 | L2s | P0 |
| TC-BIO-GOLD-008 | FR-BIO-032 | SHA256SUMS | 构建产物目录 | 校验 | 文件存在且每条 sha256 与产物一致 | L2s | P0 |
| TC-BIO-GOLD-009 | FR-BIO-032 | 泄露门禁扫描 | 构建产物 | 扫描凭据模式 | 无 ACCESS_KEY/SECRET/密码类命中 | L2s | P0 |
| TC-BIO-GOLD-010 | FR-BIO-032 | 镜像启动冒烟 | 4 镜像 | docker run --help 版入口 | 4/4 容器启动并退出码 0 | L2s | P0 |
| TC-BIO-GOLD-011 | FR-BIO-029 | 资源限制生效验证 | 镜像 | docker run --cpus 2 --memory 4g 跑冒烟 | 容器内可见限制(/sys/fs/cgroup 或 nproc 断言) | L2s | P1 |
| TC-BIO-GOLD-012 | FR-BIO-029 | BIOFLOW_DATA 只读 | 镜像 | 挂载 :ro 跑冒烟 | 容器内写 /bioflow-data 失败(Permission denied) | L2s | P1 |
| TC-BIO-GOLD-013 | FR-BIO-032 | rag 侧装配开关 | rag 部署树 | 检查配置文件 | BIOFLOW_ENABLED 键存在且默认 false | L2s | P0 |
| TC-BIO-GOLD-014 | FR-BIO-032 | 生信服务编译白名单 | 编译产物 | 检查 | main.py/config.py/schemas.py/db.py 明文;业务模块 .so | L2s | P1 |
| TC-BIO-GOLD-015 | FR-BIO-032 | 内核映射表产物 | A1 交付 | 检查 bioflow_kernel/stage_image_map.json | JSON 合法;覆盖基因家族链 18 阶段 | L2s | P0 |
#### 6.1.21 P0 冒烟(优先级 P0 快速验证集,TL 放行/验收快速通道)
| 编号 | 对应 FR | 标题 | 前置条件 | 步骤 | 预期结果 | 测试层 | 优先级 |
|---|---|---|---|---|---|---|---|
| TC-BIO-SMOKE-001 | FR-BIO-001 | P0 冒烟:分流命中 | mock | 发送「帮我跑水稻 SPL 家族鉴定」 | 进入生信流(出现路径卡或 bioflow 请求) | L5-D | P0 |
| TC-BIO-SMOKE-002 | FR-BIO-001 | P0 冒烟:漏判安全 | mock | 发送「什么是基因家族」 | 走 qa;无 bioflow 请求 | L5-D | P0 |
| TC-BIO-SMOKE-003 | FR-BIO-025 | P0 冒烟:探活 | mock | 打开应用(health 200) | 生信 TAB 可见 | L5-D | P0 |
| TC-BIO-SMOKE-004 | FR-BIO-002 | P0 冒烟:候选路径 | mock LLM | 读 plan_ready | 候选数∈[2,3] 且含阶段序列 | L2 | P0 |
| TC-BIO-SMOKE-005 | FR-BIO-004 | P0 冒烟:任务创建 | mock | POST jobs | 201 且 stages 入表 | L2 | P0 |
| TC-BIO-SMOKE-006 | FR-BIO-031 | P0 冒烟:状态机 | mock docker | 3 阶段任务跑通 | 全部 done;事件序正确 | L1 | P0 |
| TC-BIO-SMOKE-007 | FR-BIO-014 | P0 冒烟:事件回放 | 任务中途 | 连 events | 快照+补齐 | L2 | P0 |
| TC-BIO-SMOKE-008 | FR-BIO-029 | P0 冒烟:docker 拼装 | mock | 拼 identify 命令 | 含 --rm/--user/-v×3/--cpus/--memory/-e | L1 | P0 |
| TC-BIO-SMOKE-009 | FR-BIO-030 | P0 冒烟:金标 | 镜像就位 | 金标 diff | 输出为空 | L2s | P0 |
| TC-BIO-SMOKE-010 | FR-BIO-028 | P0 冒烟:反代开关 | BIOFLOW_ENABLED=true | GET BFF health | 200 | L2 | P0 |
| TC-BIO-SMOKE-011 | FR-BIO-011 | P0 冒烟:进度卡流转 | mock 事件 | 前端应用 | 状态点逐阶段点亮 | L4 | P0 |
| TC-BIO-SMOKE-012 | FR-BIO-012 | P0 冒烟:三选一 | 阶段 failed | 检查三按钮 | 重跑/跳过/改参数重跑出现 | L4 | P0 |
| TC-BIO-SMOKE-013 | FR-BIO-020 | P0 冒烟:存档 | 任务 done | POST archives | 201;磁盘目录存在 | L2 | P0 |
| TC-BIO-SMOKE-014 | FR-BIO-023 | P0 冒烟:复用 | 归档存在 | archives/{id}/run | 201;参数=归档值 | L2 | P0 |
| TC-BIO-SMOKE-015 | FR-BIO-016 | P0 冒烟:报告登记 | 任务 done | 登记 | doc_artifacts 新行 | L2 | P0 |
| TC-BIO-SMOKE-016 | FR-BIO-019 | P0 冒烟:图表调整 | 报告含图 | revise | 绘图阶段重跑;图更新 | L2 | P0 |
| TC-BIO-SMOKE-017 | FR-BIO-026 | P0 冒烟:知识问答 | flow_docs 入库 | 咨询 | 答案含引用块 | L2 | P0 |
| TC-BIO-SMOKE-018 | FR-BIO-027 | P0 冒烟:三形态 | 三配置 fixture | 逐形态启动 | 3/3 断言通过 | L2 | P0 |
| TC-BIO-SMOKE-019 | FR-BIO-032 | P0 冒烟:--help 18 入口 | 镜像 | 逐条 --help | 18/18 退出码 0 | L2s | P0 |
| TC-BIO-SMOKE-020 | FR-BIO-032 | P0 冒烟:SHA256SUMS | 产物 | 校验 | 全部匹配 | L2s | P0 |
| TC-BIO-SMOKE-021 | FR-BIO-006 | P0 冒烟:上传 | 任务待文件 | 上传小文件 | 200;files 列表+1 | L2 | P0 |
| TC-BIO-SMOKE-022 | FR-BIO-007 | P0 冒烟:路径登记 | 合法路径 | POST files server_path | 200;登记可见 | L2 | P0 |
| TC-BIO-SMOKE-023 | FR-BIO-010 | P0 冒烟:暂停恢复 | 任务 running | pause→resume | 状态迁移正确 | L2 | P0 |
| TC-BIO-SMOKE-024 | FR-BIO-024 | P0 冒烟:面板渲染 | 任务存在 | 打开面板 | 列表+DAG 渲染 | L4 | P0 |
| TC-BIO-SMOKE-025 | FR-BIO-022 | P0 冒烟:档案面板 | 归档存在 | 打开面板 | 档案列表渲染 | L4 | P0 |
### 6.2 追溯矩阵(FR-BIO → TC-BIO)
| FR | TC-BIO(引用即覆盖,≥1 条) |
|---|---|
| FR-BIO-001 | INTENT-001~010,022~030,040~047; API-001,005~010,013~015,019,020,136; STORE-001,002,022; REG-001~006,010,012~015; SMOKE-001,002; E2E-025-M/T/D; ACT-030 |
| FR-BIO-002 | INTENT-001~010; API-002,021~026,114,137,145; STORE-003; PATH-001~011,015,016,018~020; ACT-001~013; SMOKE-004; E2E-001-M/T/D |
| FR-BIO-003 | API-003,004; RUN-034; PATH-012; INTENT-003 |
| FR-BIO-004 | API-027~031,107,138,149; STORE-004; PATH-013,014,017; SMOKE-005; E2E-001~003-M/T/D |
| FR-BIO-005 | RUN-017,018,032; FILE-001,002,015; E2E-004-M/T/D |
| FR-BIO-006 | API-039~041,046~054,105,120; STORE-010; FILE-003~007,011~018,021,022; ACT-034~040; SMOKE-021; E2E-005-M/T/D |
| FR-BIO-007 | API-042~045; FILE-008~010,019,020; ACT-041~049; SMOKE-022; E2E-026,036-M/T/D |
| FR-BIO-008 | API-056,058,121; RUN-019,020; FORM-001~006,013~018,021,022; ACT-014~019; E2E-006-M/T/D |
| FR-BIO-009 | API-057,059~061,150; STORE-011; FORM-007~009,018,019,023,024; ACT-020~026; E2E-006-M/T/D |
| FR-BIO-010 | API-067~070,122,147,148; RUN-006,007,021~023; STORE-012,013; FORM-010~012; PROG-017,018; ACT-027~033; SMOKE-023; E2E-013,027,033-M/T/D |
| FR-BIO-011 | API-071~076,108,127; RUN-013; STORE-005,007; PROG-001~005,019,023,024; JOB-006,016; ACT-094,095; SMOKE-011; E2E-007-M/T/D |
| FR-BIO-012 | API-062~066,140; RUN-002~005,024,045; STORE-006,014; PROG-006~011,020,022; ACT-050~057; SMOKE-012; E2E-014~017-M/T/D |
| FR-BIO-013 | PROG-012~014; ACT-058~062 |
| FR-BIO-014 | API-013,017,077~083,126,128; SSE-001~032; STORE-008,009,020,021; PROG-015,016; SMOKE-007; E2E-018-M/T/D |
| FR-BIO-015 | API-104,124,125; FLOW-005,006 |
| FR-BIO-016 | API-123; FLOW-003,004,007; REG-009; SMOKE-015; E2E-008-M/T/D |
| FR-BIO-017 | API-143; E2E-028-M/T/D |
| FR-BIO-018 | E2E-009,024-M/T/D |
| FR-BIO-019 | API-084~086,144; INTENT-033; FLOW-008; SMOKE-016; E2E-021-M/T/D |
| FR-BIO-020 | API-087~089,098,129,130; ARCH-001~006,011,012; ACT-074~089; SMOKE-013; E2E-010,031-M/T/D |
| FR-BIO-021 | API-131; DB-012; STORE-017; ARCH-007~010; E2E-010-M/T/D |
| FR-BIO-022 | API-090~093,141,142; DB-007; STORE-019; PANE-001~007,011,012,015; ACT-092,093; SMOKE-025; E2E-030,035-M/T/D |
| FR-BIO-023 | API-011,029,094~097,132; INTENT-034~039; STORE-015; FORM-020; PANE-008~010,016; ACT-070~073; SMOKE-014; E2E-019,032-M/T/D |
| FR-BIO-024 | API-032~038,112,113; RUN-028,029,044; DB-006,011; STORE-018; PROG-021; JOB-001~016; ACT-063~069,090,091; SMOKE-024; E2E-003,011,029,034-M/T/D |
| FR-BIO-025 | API-099,133; STORE-016; JOB-012,013; PANE-013,014; DEPLOY-011; SMOKE-003; E2E-020-M/T/D |
| FR-BIO-026 | API-012; INTENT-045; FLOW-009; SMOKE-017; E2E-022-M/T/D |
| FR-BIO-027 | DEPLOY-001~007,010,012; SMOKE-018; E2E-012,023-M/T/D |
| FR-BIO-028 | API-100~103,134,135; DB-001~005,008,009; FLOW-001,002; DEPLOY-008,009; SMOKE-010 |
| FR-BIO-029 | API-115~119; RUN-012,014,016,031,035~037; KERN-001~009,024; GOLD-011,012; SMOKE-008 |
| FR-BIO-030 | KERN-010,011,014~020; GOLD-001~003; SMOKE-009 |
| FR-BIO-031 | API-016,109~111,139,146; RUN-001,008~011,025~027,030,033,038~043,046; DB-010; SMOKE-006 |
| FR-BIO-032 | KERN-012,013,021~023; GOLD-004~010,013~015; SMOKE-019,020 |
> 覆盖自核:32/32 FR-BIO 全部有 TC 引用;每个 TC-BIO 均映射至少 1 个 FR(见每行「对应 FR」列);无孤儿 TC。模块计数与规模门禁见 docs/team/report_bioflow_test1.md。
+94
View File
@@ -0,0 +1,94 @@
# 生信意图分流词典与用例表(唯一事实源)
> 冻结版本 1.0 | 作者 T1(2026-09-05)| 前后端同表双跑:A3 ui/src/utils/intent.js 与 A2 后端 chat 分流共用本表;任何改动需 T1 更新本文件并经 TL 确认。需求来源:PRD.md FR-BIO-001/FR-BIO-023/FR-BIO-026。
## 1. 路由签名
route(text, has_attachments, has_active_artifact, has_bioflow_context) -> "qa" | "docgen" | "edit" | "export" | "bioflow" | "bioflow_qa"
## 2. 判定顺序(按优先级从上到下,命中即返回)
### 1. export(需 has_active_artifact == True)
text 含任一 EXPORT_WORD 且含任一 FORMAT_WORD(沿用 docgen 词典:EXPORT_WORD=[导出,转成,转为,转换成,下载成,输出为,存为,转pdf,转word];FORMAT_WORD=[pdf,docx,doc,word] 小写不敏感)。不满足则继续向下。
### 2. edit(需 has_active_artifact == True)
text 含任一 EDIT_WORD=[改,修改,调整,删,删除,加一段,补充,润色,缩写,扩写,重写,改写,优化,加个,增加一段],且不含任一 CHART_WORD(见下)。含 CHART_WORD 时跳过本规则(图表调整走生信 FR-BIO-019)。不满足则继续向下。
### 3. docgen(写文档意图)
text 含任一 WRITE_VERB 且含任一 DOC_TYPE(沿用 docgen 词典全表)。命中→docgen。
### 4. docgen(附件信号)
has_attachments == True 且 text 含任一 WRITE_VERB。命中→docgen。
### 5. bioflow_qa(流程咨询,需 has_bioflow_context == True,即当前会话已有生信任务/生信对话上下文)
text 含任一 FLOW_QA_WORD 且不含任一 ANALYZE_VERB+对象组合:
- FLOW_QA_WORD = [需要什么输入, 有什么输入, 输入是什么, 需要什么参数, 参数是什么, 什么参数, 怎么设置, 如何设置, 什么软件, 用什么软件, 前置条件, 介绍, 是什么, 怎么跑, 怎么做]
命中→bioflow_qa(生信流内流程咨询,走 vstore flow_docs 检索+引用,不新建任务)。
### 6. bioflow(生信分析意图)
同时满足下面 A 与 B(或 C)即命中:
- A. text 含任一 ANALYZE_VERB = [跑, 跑一下, 分析, 鉴定, 识别, 研究, 做个, 做一个, 做一下, 执行, 运行](小写不敏感;含子串即算)
- B. text 含任一 FAMILY_NAME 或 ANALYSIS_OBJECT(见第 3 节词典,小写不敏感)
- C. 存档复用句式:text 含任一 REUSE_PHRASE = [存档任务的方法, 存档的方法] 且含任一 ANALYZE_VERB 且含任一 FAMILY_NAME 或 ANALYSIS_OBJECT(如「用 XXX 存档任务的方法帮我跑水稻 SPL 家族鉴定」;复用的方法名 = REUSE_PHRASE 之前最近的 3-20 字符片段,如 XXX)
命中→bioflow;否则继续向下。
### 7. 其余一律 "qa"(漏判安全:不命中绝不进生信流)
## 3. 生信词典(两表共用)
- FAMILY_NAME(基因家族名,小写比较)= [spl, sbp, mads, mads-box, madsbox, wrky, nac, myb, bzip, bhlh, ap2, erf, gras, tcp, hd-zip, hdzip, arf, aux, iaa, dof, gata, hsf, lbd, lob, trihelix, e2f, cpp, nf-y, nfy, c2h2, zf-hd, zfhd, far1, frs, hb, wox, pin, mate, abc, pp2c, snrk, cdpk, mapk, rlck, nbs, lrr, nlr, tps, cyp, gst, ugt, 转录因子家族, 基因家族]
- ANALYSIS_OBJECT(分析对象,小写比较)= [rna-seq, rnaseq, rna-seq, 转录组, 差异表达, wgs, 全基因组, 变异检测, 全基因组测序, gwas, 关联分析, 全基因组关联, 群体, 群体遗传, 遗传多样性, 进化, 系统发育, 选择性清除, 群体结构, 拷贝数变异, 基因预测, 基因注释, 结构注释, 功能注释, 宏基因组]
- CHART_WORD(图表调整词,供 edit 规则排除)= [图表, 图颜色, 颜色换成, 图改成, 柱状图, 热图, 火山图, 曼哈顿图, 韦恩图, 气泡图, 散点图, 折线图, 改成红色, 换成蓝色, 颜色]
## 4. 用例表(40 条,前端 intent.js 与后端分流同表双跑)
| # | 输入 text | 附件 | 活动文档 | 生信上下文 | 期望 |
|---|---|---|---|---|---|
| 1 | 帮我跑水稻 SPL 家族鉴定 | 否 | 否 | 否 | bioflow |
| 2 | 跑一下拟南芥 MADS-box 家族分析 | 否 | 否 | 否 | bioflow |
| 3 | 请帮我鉴定水稻 SPL 家族 | 否 | 否 | 否 | bioflow |
| 4 | 识别玉米 bZIP 家族成员 | 否 | 否 | 否 | bioflow |
| 5 | 帮我研究一下水稻 SPL 基因家族 | 否 | 否 | 否 | bioflow |
| 6 | 分析小麦 WRKY 转录因子家族 | 否 | 否 | 否 | bioflow |
| 7 | 做个大豆 NAC 家族分析 | 否 | 否 | 否 | bioflow |
| 8 | 跑 SPL 家族 | 否 | 否 | 否 | bioflow |
| 9 | 水稻 SPL 家族,帮我跑 | 否 | 否 | 否 | bioflow |
| 10 | 基因家族鉴定:水稻 SPL | 否 | 否 | 否 | bioflow |
| 11 | 帮我跑水稻叶片 RNA-seq 差异表达分析 | 否 | 否 | 否 | bioflow |
| 12 | 帮我做水稻全基因组变异检测 | 否 | 否 | 否 | bioflow |
| 13 | 帮我跑水稻产量性状 GWAS 关联分析 | 否 | 否 | 否 | bioflow |
| 14 | 什么是基因家族? | 否 | 否 | 否 | qa |
| 15 | 帮我跑一下 | 否 | 否 | 否 | qa |
| 16 | SPL 家族 | 否 | 否 | 否 | qa |
| 17 | 今天天气不错 | 否 | 否 | 否 | qa |
| 18 | 跑 SPL 家族鉴定需要准备什么输入? | 否 | 否 | 否 | qa(无生信上下文漏判安全) |
| 19 | 帮我跑一个数据分析 | 否 | 否 | 否 | qa |
| 20 | 你好呀 | 否 | 否 | 否 | qa |
| 21 | (空字符串) | 否 | 否 | 否 | qa |
| 22 | 帮我跑香蕉 XYK 家族鉴定 | 否 | 否 | 否 | qa(XYK 不在家族词典) |
| 23 | 跑水稻 spl 家族鉴定 | 否 | 否 | 否 | bioflow(家族名大小写不敏感) |
| 24 | Please run rice SPL family identification | 否 | 否 | 否 | bioflow |
| 25 | 帮我跑(水稻 SPL 家族)鉴定! | 否 | 否 | 否 | bioflow |
| 26 | 用 XXX 存档任务的方法帮我跑水稻 SPL 家族鉴定 | 否 | 否 | 否 | bioflow(复用意图,方法名=XXX) |
| 27 | 根据 XXX 存档任务的方法帮我跑一下玉米 bZIP | 否 | 否 | 否 | bioflow(复用) |
| 28 | 参考 XXX 存档的方法再跑一个水稻 SPL | 否 | 否 | 否 | bioflow(复用) |
| 29 | 用《XXX》存档任务的方法帮我跑小麦 WRKY 家族 | 否 | 否 | 否 | bioflow(复用,方法名=XXX) |
| 30 | 用 XXX 存档任务的方法 | 否 | 否 | 否 | qa(无目标任务词) |
| 31 | 用 XXX 存档任务的方法帮我跑 yyy | 否 | 否 | 否 | qa(yyy 无家族/对象匹配,漏判安全) |
| 32 | 帮我生成一份水稻 SPL 家族分析报告 | 否 | 否 | 否 | docgen(docgen 优先于 bioflow) |
| 33 | 帮我写一篇水稻基因家族研究论文 | 否 | 否 | 否 | docgen |
| 34 | 导出成 PDF | 否 | 是 | 否 | export |
| 35 | 把这句话改成红色 | 否 | 是 | 否 | edit(无图表词) |
| 36 | xxx 图表颜色换成红色 | 否 | 是 | 否 | bioflow(图表词,走 FR-BIO-019) |
| 37 | identify 需要什么输入 | 否 | 否 | 是 | bioflow_qa(不新建任务) |
| 38 | 帮我总结一下这个问题的要点 | 否 | 否 | 否 | qa |
| 39 | 写一段水稻基因的介绍 | 否 | 否 | 否 | qa(介绍在 docgen 排除表) |
| 40 | 跑水稻 SPL 家族鉴定 | 否 | 是 | 否 | bioflow(活动文档不改判定) |
## 5. 实现注意(前后端一致)
1. 判定全部为纯文本子串匹配(小写化后),不依赖 LLM;命中即返回,顺序不可调换。
2. 复用方法名提取:REUSE_PHRASE 命中时,取 REUSE_PHRASE 之前最近的连续 3-20 字符(去空白与书名号)为方法名,随路由结果一并返回。
3. bioflow_qa 仅在 has_bioflow_context=true 时生效;无上下文时同类句子一律 qa(漏判安全)。
4. 边界约定:文本长度 ≤1 或纯空白 → qa;文本 >2000 字符 → 按截断后前 2000 字符判定。
5. 本词典为唯一事实源:前端 utils/intent.js 与后端分流实现必须与本表逐条双跑一致(同表双跑由 L3/L2 用例 TC-BIO-INTENT-001~047 执行)。
+153
View File
@@ -0,0 +1,153 @@
# report_bioflow_test1.md —— T1 生信编排用例编制覆盖自核
> 作者 T1 | 2026-09-05 | 阶段 0 交付自核清单,随 docs/TEST_CASES.md §6 与 docs/team/cases_bioflow_intent.md 一并提交 TL 复查。
## 1. 交付物清单
| 文件 | 位置 | 状态 |
|---|---|---|
| 用例清单+追溯矩阵 | docs/TEST_CASES.md §6(第 677 行起) | 已追加 |
| 意图分流词典与用例表 | docs/team/cases_bioflow_intent.md | 已创建(94 行,词典+40 条用例表) |
| 覆盖自核报告 | docs/team/report_bioflow_test1.md(本文件) | 已创建 |
## 2. 规模门禁核对(TEST_PLAN §10.1)
| 门禁项 | 要求 | 实际 | 结论 |
|---|---|---|---|
| 生信用例总数 | ≥600 | **749**(grep '^| TC-BIO-' = 749 行) | 达标 |
| 后端 L1/L2(含 L2s 金标/冒烟) | ~230 | **321**(INTENT 47 + API 150 + RUN 46 + KERN 24 + SSE 32 + DB 12 + FLOW 10) | 达标 |
| 前端 L3/L4 | ~220 | **253**(STORE 22 + PATH 22 + FORM 24 + FILE 22 + PROG 24 + ARCH 12 + JOB 16 + PANE 16 + ACT 95) | 达标 |
| E2E L5 | ~105 | **108**(九条主线 30 编号 × 三档视口 M/T/D + 补充 6 编号 × 3) | 达标 |
| 三形态+回归+P0 冒烟 | ~60 | **67**(DEPLOY 12 + REG 15 + GOLD 15 + SMOKE 25) | 达标 |
| P6 评估集 | 30-50 条由 A4 另计 | 不混入本节 | 符合 |
分组明细(唯一 TC ID 计数):
| 模块 | 条数 | 层 |
|---|---|---|
| INTENT | 47 | L2/L3 同表双跑 |
| API | 150 | L2(端点正常/参数校验/错误/降级/边界 20 端点全覆盖) |
| RUN | 46 | L1(状态机全路径:成功/失败/重跑/跳过/暂停/恢复/重启续跑/超时/日志截断/并发上限) |
| KERN | 24 | L1 命令拼装/mock + L2s 金标/镜像 |
| SSE | 32 | L1 帧解析 + L2 事件序/断线回放 + L3 前端回放 |
| DB | 12 | L1 三表迁移幂等 |
| FLOW | 10 | L2/L3 上下游接口级(反代/报告登记/fig:///vstore/复用链) |
| STORE | 22 | L3 |
| PATH | 22 | L4 |
| FORM | 24 | L4 |
| FILE | 22 | L4 |
| PROG | 24 | L4 |
| ARCH | 12 | L4 |
| JOB | 16 | L4 |
| PANE | 16 | L4 |
| ACT | 95 | L4 UI 动作矩阵 |
| E2E | 108 | L5 × 三档视口 |
| DEPLOY | 12 | L2/L3/L2s |
| REG | 15 | L3/L4/L5 |
| GOLD | 15 | L2s |
| SMOKE | 25 | P0 冒烟 |
| **合计** | **749** | |
## 3. FR-BIO → TC 双向追溯自核(TEST_PLAN §10.2)
双向结论:**32/32 全覆盖,无缺口;无孤儿 TC**(每条 TC 行「对应 FR」列均映射 ≥1 个 FR;矩阵引用见 TEST_CASES.md §6.2,所有引用的 TC 编号均真实存在)。
| FR | 覆盖条数(约) | 代表 TC |
|---|---|---|
| FR-BIO-001 意图分流 | 55+ | INTENT-001~047、API-001、STORE-001/002、REG-001~006、E2E-025-M/T/D |
| FR-BIO-002 路径引导 | 40+ | API-002/021~026、PATH-001~022、ACT-001~013、E2E-001-M/T/D |
| FR-BIO-003 路径校验前置补全 | 6 | API-003/004、RUN-034、PATH-012 |
| FR-BIO-004 路径确认卡 | 30+ | API-027~031、PATH-013/014、E2E-001~003-M/T/D |
| FR-BIO-005 数据文件引导 | 9 | RUN-017/018/032、FILE-001/002/015、E2E-004-M/T/D |
| FR-BIO-006 拖拽上传 | 40+ | API-039~054、FILE-003~022、ACT-034~040、E2E-005-M/T/D |
| FR-BIO-007 服务器路径登记 | 15+ | API-042~045、FILE-008~010/019/020、ACT-041~049、E2E-026/036-M/T/D |
| FR-BIO-008 参数确认表单 | 25+ | API-056/058/121、RUN-019/020、FORM-001~024、ACT-014~019 |
| FR-BIO-009 继续执行 | 20+ | API-057/059~061、FORM-007~009、ACT-020~026 |
| FR-BIO-010 自动连续开关 | 30+ | API-067~070/147/148、RUN-006/007/021~023、FORM-010~012、ACT-027~033、E2E-013/027/033-M/T/D |
| FR-BIO-011 阶段进度卡 | 30+ | API-071~076、PROG-001~024、JOB-006/016、E2E-007-M/T/D |
| FR-BIO-012 失败三选一 | 30+ | API-062~066、RUN-002~005、PROG-006~011、ACT-050~057、E2E-014~017-M/T/D |
| FR-BIO-013 长链折叠 | 6 | PROG-012~014、ACT-058~062 |
| FR-BIO-014 断线回放 | 50+ | API-077~083、SSE-001~032、STORE-008/009、PROG-015/016、E2E-018-M/T/D |
| FR-BIO-015 报告生成 | 5 | API-104/124/125、FLOW-005/006 |
| FR-BIO-016 报告预览 | 7 | API-123、FLOW-003/004/007、REG-009、E2E-008-M/T/D |
| FR-BIO-017 报告编辑 | 4 | API-143、E2E-028-M/T/D |
| FR-BIO-018 报告导出 | 6 | E2E-009/024-M/T/D |
| FR-BIO-019 图表调整 | 10+ | API-084~086/144、INTENT-033、FLOW-008、E2E-021-M/T/D |
| FR-BIO-020 存档提示 | 30+ | API-087~089/098/129/130、ARCH-001~012、ACT-074~089、E2E-010/031-M/T/D |
| FR-BIO-021 存档执行与状态回复 | 8 | API-131、DB-012、STORE-017、ARCH-007~010 |
| FR-BIO-022 档案回看 | 25+ | API-090~093/141/142、PANE-001~016、E2E-030/035-M/T/D |
| FR-BIO-023 存档方法复用 | 25+ | API-011/029/094~097/132、INTENT-034~039、FORM-020、PANE-008~010、E2E-019/032-M/T/D |
| FR-BIO-024 生信任务面板 | 40+ | API-032~038、JOB-001~016、ACT-063~069、E2E-003/011/029/034-M/T/D |
| FR-BIO-025 探活显隐 | 10+ | API-099/133、STORE-016、JOB-012/013、PANE-013/014、DEPLOY-011、E2E-020-M/T/D |
| FR-BIO-026 知识库问答 | 8 | API-012、INTENT-045、FLOW-009、E2E-022-M/T/D |
| FR-BIO-027 三形态部署 | 15+ | DEPLOY-001~012、E2E-012/023-M/T/D |
| FR-BIO-028 独立服务与数据 | 15+ | API-100~103/134/135、DB-001~005/008/009、FLOW-001/002、DEPLOY-008/009 |
| FR-BIO-029 Docker 执行 | 25+ | API-115~119、RUN-012/014/016/031/035~037、KERN-001~009、GOLD-011/012 |
| FR-BIO-030 内核等价性 | 12 | KERN-010/011/014~020、GOLD-001~003 |
| FR-BIO-031 并发与恢复 | 20+ | API-016/109~111/139/146、RUN-001/008~011/025~027/030/033/038~043/046、DB-010 |
| FR-BIO-032 发布与编译 | 20+ | KERN-012/013/021~023、GOLD-004~010/013~015、SMOKE-019/020 |
## 4. UI 动作矩阵元素×动作覆盖表(TEST_PLAN §10.3)
| 可交互元素 | 点击 | 双击 | 悬停 | 移出 | Enter | Esc | 拖入 | 拖放 | 离开 | 聚焦 | 失焦 | 禁用 | 加载中 | 合计 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 路径卡候选行 | ACT-001 | ACT-002 | ACT-003 | ACT-004 | ACT-005 | ACT-006 | — | — | — | — | — | — | — | 6 |
| 确认按钮 | ACT-007 | ACT-008 | ACT-009 | — | ACT-010 | ACT-011 | — | — | — | — | — | ACT-012 | ACT-013 | 7 |
| 表单输入框 | ACT-014 | — | ACT-019 | — | ACT-016 | ACT-017 | — | — | — | ACT-014 | ACT-015 | ACT-018 | — | 7 |
| 继续按钮 | ACT-020 | ACT-021 | ACT-022 | — | ACT-023 | ACT-024 | — | — | — | — | — | ACT-025 | ACT-026 | 7 |
| 自动连续开关 | ACT-027/028 | ACT-029 | ACT-030 | — | ACT-031 | ACT-032 | — | — | — | — | — | ACT-033 | — | 7 |
| 拖放区 | ACT-034 | — | ACT-035 | — | — | — | ACT-036 | ACT-038 | ACT-037 | — | — | ACT-039 | ACT-040 | 7 |
| 路径输入行 | ACT-041 | — | — | — | ACT-043 | ACT-044 | — | — | — | ACT-041 | ACT-042 | — | — | 5 |
| 登记路径按钮 | ACT-045 | — | ACT-046 | — | ACT-047 | — | — | — | — | — | — | ACT-048 | ACT-049 | 6 |
| 重跑按钮 | ACT-050 | — | ACT-053 | — | ACT-054 | — | — | — | — | — | — | ACT-057 | ACT-056 | 5 |
| 跳过按钮 | ACT-051 | — | ACT-053 | — | — | ACT-055 | — | — | — | — | — | ACT-057 | ACT-056 | 5 |
| 改参数重跑按钮 | ACT-052 | — | ACT-053 | — | — | ACT-055 | — | — | — | — | — | ACT-057 | ACT-056 | 5 |
| 折叠组头 | ACT-058 | ACT-059 | ACT-060 | — | ACT-061 | ACT-062 | — | — | — | — | — | — | — | 6 |
| 面板操作按钮(重跑/删除/复用) | ACT-063/064/070 | — | ACT-065/071 | — | ACT-066/072 | ACT-067 | — | — | — | — | — | ACT-068 | ACT-069/073 | 9 |
| 存档名称输入 | ACT-074 | — | — | — | ACT-076 | ACT-077 | — | — | — | ACT-074 | ACT-075 | ACT-078 | — | 6 |
| 存档按钮 | ACT-079 | ACT-080 | ACT-081 | — | ACT-082 | — | — | — | — | — | — | ACT-083 | ACT-084 | 7 |
| 放弃按钮 | ACT-085 | — | ACT-086 | — | ACT-087 | ACT-088 | — | — | — | — | — | — | ACT-089 | 6 |
| 面板列表项 | ACT-090/092 | — | ACT-091/093 | — | — | — | — | — | — | — | — | — | — | 4 |
| 日志区 | ACT-094 | — | ACT-095 | — | — | — | — | — | — | — | — | — | — | 2 |
| **合计动作覆盖** | | | | | | | | | | | | | | **95 条** |
## 5. 七项引导的 UI 显示断言 + 操作断言核对(TEST_PLAN §10.4)
| 引导 | UI 显示断言 | 操作断言 |
|---|---|---|
| 路径引导 | PATH-001/002/003/005/015/016/018(标题/候选行/选中态/令牌/尺寸/移动端) | PATH-004/006/008/009/021、E2E-001/002-M/T/D |
| 文件引导 | FILE-001/002/015/016(提示文案点名文件/卡/拖放区规格) | FILE-003/006/009、ACT-034~040、E2E-004/005-M/T/D |
| 参数表单 | FORM-001~006/013(标题/前置文案/字段/默认值/来源标注/聚焦) | FORM-007/008/011/023、E2E-006-M/T/D |
| 报告调整 | FLOW-005/006、API-084/085(fig:// 渲染/revise 接口) | E2E-021-M/T/D(发送换色→重跑→预览刷新) |
| 存档 | ARCH-001/005(提示文案/按钮样式) | ARCH-002~006、ACT-079~089、E2E-010/031-M/T/D |
| 复用 | FORM-020、PANE-009(预填显示/来源标注) | PANE-008/010、E2E-019/032-M/T/D |
| 进度展示 | PROG-001~003/006/007(卡/点亮/日志区/标红/三选一) | PROG-008~010/018、ACT-050~057、E2E-007-M/T/D |
## 6. 上下游动作接口级用例核对(TEST_PLAN §10.4)
- BFF 反代开关两态:API-100/101/102、FLOW-001/002、DEPLOY-001/006/010 ✓
- 报告登记进 doc_artifacts:API-104/123、FLOW-003/004 ✓
- fig:// 渲染:FLOW-005/006 ✓
- docker 命令拼装(mock):KERN-001~009、RUN-035~037、API-115~119 ✓
- manifest 判成败:KERN-014~019、RUN-015/016 ✓
- SSE 事件序:SSE-019~021、API-077、RUN-001 ✓
- 断线回放快照:SSE-022~024/031、API-078、STORE-008/009、E2E-018-M/T/D ✓
- vstore flow_docs 检索:FLOW-009、API-012 ✓
- 存档复用:FLOW-010、API-094、E2E-019-M/T/D ✓
## 7. 三形态部署断言核对(TEST_PLAN §10.4)
- 只 rag:DEPLOY-001/002/003(反代不注册+前端无生信痕迹+零请求)✓
- 只生信:DEPLOY-004/005/012(8098 直连+报告降级下载 HTML+vstore 降级)✓
- 同部署:DEPLOY-006/007/008/009(反代启用+前端显形+BFF 停不影响+BFF 重启不影响)✓
## 8. E2E 九条主线核对(TEST_PLAN §11)
BIO-E2E-01 主流程=编号 001~012;02 自动连续=013/027/033;03 失败注入=014~017;04 断线回放=018;05 存档复用=019/032;06 探活显隐=020;07 图表调整=021;08 知识库问答=022;09 三档视口=023。附加:漏判安全 025、路径登记 026、报告编辑 028、面板 029、档案 030/035、放弃存档 031、删除 034、聊天指定路径 036。每条 × M/T/D 三视口,共 108 条 ✓
## 9. 遗留与裁决项(提请 TL)
1. 「两态断言其一」类用例(API-051/054/098、FORM-024、RUN-027、ACT-017/033/044/062、DEPLOY-005 等)待 A2/A3 实现后由 T2 固定为单态断言。
2. ACT 矩阵中「移出/悬停拖放/离开」按 UI_SPEC 语义已映射(ACT-004/037);若 TL 认为拖放区还需独立 hover-drag 计数,可再增补。
3. 用例编号 TC-BIO-ACT-030 在 §6.2 矩阵中挂 FR-BIO-001(开关悬停含词典上下文),实际归属 FR-BIO-010 更准确——T2 执行时按行内「对应 FR」列(FR-BIO-010)为准。
4. E2E 用例依赖 mock 场景(LLM/docker/SSE 断连),mock 工具化细节待 T2 与 PM 的 mock 对齐。