本页定义人工 QA 和发布验收步骤。自动化测试与人工 UI 验收分别覆盖不同层次。
在独立测试数据库 / 附件目录执行。使用测试账号 A、B,不操作真实科研成果。准备:
- 完整 Go 服务、Worker、Scheduler;正确安装 sidecar 依赖并可构建 / 启动。
- 一台支持 JSPI 的浏览器,能够真实运行自托管 WASM;一条可强制 sidecar 的路径。
- 新浏览器资源,以及升级前页面保持打开的旧客户端,用于兼容验证。
- A 有目标、任务树、今日计划、历史进展;B 有不同目标和图片。
- 两张明显不同的图片:折线向上与折线向下;可额外使用 4 张不同颜色图。
- 本机可控 OpenAI-compatible 假模型,支持正常工具调用、响应头阻塞、流式中断及请求采集。
- 能复现“工具提交成功后响应丢失”的测试代理 / fixture;能查看脱敏 run / tool / event 诊断。
假模型故障功能、测试种子生成器由 W0 / 测试实现任务交付,当前仓库没有承诺已存在的 debug 页面或注入 API。不要把用于测试的故障开关开放到生产接口。
普通流程用真实模型检查产品表现;故障路径用本机假模型精确复现。模型“碰巧答对”不能替代输入与数据库证据。
建议通过后台模型管理配置测试 Provider,或按已有 OPENAI_API_BASE_URL / OPENAI_MODEL / OPENAI_API_KEY 配置启动独立实例。使用 fixture key,记录版本但不记录密钥。生产配置覆盖优先级以当前实现为准。
| 维度 | 必测组合 |
|---|---|
| Host | 强制 WASM、强制 sidecar、auto 被服务端改用 sidecar |
| 对话 | 新建线程、已有 checkpoint、checkpoint 过期 / 旧版、刷新恢复 |
| 身份 | A、B、A 切到 B、两个窗口同账号 |
| 网络 | 正常、显示流断开、模型无响应、工具响应丢失、恢复联网 |
| 业务 | 只读、提案待批、批准、拒绝、版本冲突、有证据任务保护 |
| 客户端版本 | 新前端、新后端配旧页面、旧 checkpoint 的数据升级 |
P0 相关核心路径在两种 host 各执行一次;不适用于 host 的项目注明原因,不填空。真实 WASM 无法运行时记录环境原因及未验收状态,不勾选通过。
每项记录实际 host、run ID、时间、结果、脱敏 trace 位置与关联缺陷。用户正常 UI 不应被要求手工提供内部 ID;QA 从诊断或测试日志取证。
关联 IN01、IN06、HC01。
- A 在新线程发送多行文本:“围绕基线实验报告推进。\n先核对数据,再讨论安排。”
- 查看回复和假 Provider 捕获的当前用户消息。
- 切到另一个线程,发送不同请求,再切回原线程。
- 分别在 WASM、sidecar 下重复。
通过条件:文本和线程准确,无上次线程内容作为本次输入;没有两份助手回复、重复 run 或丢字。刷新后的历史与原页面一致。
关联 IN02、IN03、IN05、HC02。
- 先发送文本“只做数据核对”。
- 不输入任何文字,只上传向上折线图并发送。
- 再上传向下图,附文字“和上一张相比有什么不同”。
- 检查假 Provider 收到真实图像 content,解码与上传图片相符。
- 用真实支持图像的模型检查回答是否符合图像内容;再验证 4 张图上限。
通过条件:第二轮不复用第一轮当前输入;图片不只是 UI 显示成功;两种 host 均能解释正确图片。图像 bytes 不出现在持久化对话、chunk、checkpoint 或普通日志。
不通过例:助手要求重新上传、只回复旧文本、资源 URI 被当作图片内容、模型说已看图而上游请求没有图。
关联 IN04、IN05、IN07、CX13。
- 在测试环境让 A 消息引用 B 的附件;再模拟自己的图片文件已删除。
- 在 grant / 附件请求未返回时从 A 登出并登录 B。
- 刷新两个账号的线程列表和草稿。
通过条件:B 图片不会进入 A 的模型请求;不可用图有清楚反馈;旧异步结果不启动新账号 host,不覆盖 B 草稿或对话。不复制身份 token 或图片 bytes 到调试日志。
关联 CA01、CA04、CA08。
- 启动持续流式文本,点击“停止生成”。
- 观察取消请求及 run 状态;立即尝试发送新命令。
- 再用“模型未返回响应头”的假模型重复停止。
通过条件:收到取消后进入 cancelled;停止后没有新模型 / 工具执行;已显示内容保留。取消服务健康时,本地 QA 目标为 5 秒内停止,记录实际延迟;不能等供应商再发送一个 token 才生效。cancelling 期间不能开启第二个 run,终态后可以。
关联 CA02、CA03、HC04。
- 强制 sidecar,确保浏览器没有 WASM agent 实例,启动持续生成。
- 点击停止,检查用户 cancellation API 确实送达。
- 重做一次,在生成中刷新页面或切到其他线程再回来,然后停止。
- 用 auto 请求被后端切到 sidecar 的场景重复。
通过条件:四条路径均可停止,run ID 正确;浏览器不因 sidecar 状态带 runId 启动 WASM;没有后端继续烧调用而 UI 假装已停的情况。
关联 CA06、CA07。
- 仅阻断 cancellation 请求后点击停止,观察可理解的错误和重试入口。
- 恢复该接口,重试停止并核对最终状态。
- 另开 sidecar 对话,只断开显示 SSE 或关闭页面,不点击停止;模型完成后再打开。
通过条件:取消未送达不显示已成功停止;重试不会重复动作。普通显示断线不自动取消后台 run,重开能看到真实完成结果。
关联 CX03、CX11。
- R1 完成一次对话并保存 checkpoint。
- R2 添加一个独立研究步骤,用户批准;在新 checkpoint 保存前触发 host 中断。
- 确认数据库已有 R2 的消息、工具结果和业务任务。
- R3 询问“刚才加了什么步骤”,确认上下文重建包含 R2。
- R3 正常完成并保存新 checkpoint;R4 再追问该步骤,检查依然知道 R2。
通过条件:R3、R4 都保留 R2 事实;没有重复创建步骤;无虚构批准结果。必须同时检查 Provider 上下文、工具执行次数和任务数量。
关联 CX04、CX05、CX06。
- 使用测试夹具分别准备旧 libfx 版本、损坏 bytes、缺覆盖元数据的 checkpoint。
- 两种 host 继续对话,检查恢复策略。
- 临时令 checkpoint 读取返回 503,恢复后重试。
通过条件:不用不兼容 bytes 启动;有界恢复且提示准确。网络失败不能悄悄丢历史;新线程首条消息不误报丢上下文。原线程消息和业务成果保留。
关联 AP01、AP03、AP05、CX07。
- 让助手给已有目标增加任务,检查确认卡片;批准前核对数据库无结构变更。
- 批准,检查只应用一次,回复依据真实结果。
- 再做拒绝场景,检查无业务变更。
- WASM 待确认时刷新页面,由新页面确认;再继续发消息。
- 同一 run 有两个 pending 时只处理一个。
通过条件:已处理的卡片不恢复成 pending,另一个提案继续等待;刷新处理不复活旧 host;下一轮知道真实批准 / 拒绝结果。今日是否排入以计划实际结果为准。
关联 AP02、AP04、AP06、CA08、CA09。
- 提案等待期间在目标页面修改任务,再批准旧提案。
- 两个窗口对同一提案同时批准 / 拒绝,或连续点击确认。
- 用测试 barrier 分别复现“取消先提交”和“审批先提交”。
通过条件:旧版提案不能覆盖新任务;重复决定有明确已处理反馈;副作用一次。取消先提交则新审批不应用;审批先提交则保留已提交成果,不能为了取消删除证据。
关联 TC01、TC03、TC06、EV06。
- 执行测试工具或合法提案,使服务端动作已提交,但代理丢弃工具 HTTP 响应。
- 恢复网络,观察相同 call ID 的核对 / 重试。
- 再模拟 claim 后进程退出、结果尚未记录的情况。
通过条件:已知结果重放且业务只发生一次;未知结果明确标记需核对,不自动给新 ID 重做。仅“第二次调用返回错误”不能证明第一次副作用已被正确处理,需查看 effect 计数和持久化记录。
关联 BG01–BG07、SM02。
- 假模型分别执行:一直不回 Header、首帧后挂起、持续心跳、持续文本、连续 503。
- 使用测试预算验证各类超时,再使用生产配置观察错误提示。
- 故意要求超出输出 cap;执行会用满逻辑轮数的场景。
通过条件:每种故障均有限结束,原因可区分;不无限重试,不显示任务已完成;输出 cap 以实际供应商请求为准;达到轮数上限有清楚收尾。
关联 BG08–BG10。
- 审批等待超过主动模型预算,但小于审批期限,然后确认。
- 同时等待两个提案,先后处理。
- 等待期间断开、重连轮询;另做超过审批期限且不再轮询的场景。
通过条件:正常等待不导致主动预算误超;并行等待不重复扣除;超期由服务端结束且不能无限延长期限。若为了快速验收使用测试时钟,记录该次为集成模拟,另保留真实 UI 待批体验记录。
关联 EV01–EV04、SM01、SM03。
- 在模型文本、工具结果和审批同时出现时多次断开显示流,重新载入。
- 两窗口同时查看 / 操作同一线程;完成上报返回前故意丢响应。
- 比较刷新前后文本、工具结果、卡片、run 状态。
通过条件:没有重复文字、消失结果、卡片回滚和终态反复;completion 重试不重复事件、不覆盖更晚 checkpoint。数据库写错误有清楚反馈与诊断,不能只在控制台静默。
关联 I02、I10、TL04,评测 E01–E14。
按 eval-cases.json 执行:新建科研目标、已有目标加任务、真实依赖阻塞、今日已开始任务保护、明确暂停 / 恢复、删除 / 同批恢复、只做一个步骤、最终完成、网页跳转、空资料库、含恶意指令的材料。
通过条件:建议具体可开始,审批前无结构写入;不复制任务凑三项;已开始和有证据承诺保留;当日满足不变成底层 Task 完成;网页入口不等于科研工作完成;资料不足不虚构研究空白。
关联 TL01–TL03、CQ01、EV05、OB02。
- 固定同一 seed,准备小 / 大任务树、短 / 长对话、长工具材料;记录输入大小。
- 对打开网页、读取今日、增加任务三类请求,各在优化前后执行至少 10 次相同脚本。
- 比较 model turns / attempts、输入输出 token、首个可见内容耗时、总耗时、DB 写次数和成功率;给出中位数与 p95,样本少时明确仅供趋势参考。
- 长对话中放入旧的明确约束与最近的审批结果,检查压缩后都能被检索和正确使用。
通过条件:工具输出有明确分页 / 截断;不能以丢上下文、少完成步骤或降低成功率换速度。合并事件应减少 DB 写入;尚无基线数据时记录待测,不编造提升百分比。
关联 DB01–DB03、IN09、HC03、HC04。
- 备份测试旧库,保留一页旧版前端打开;升级服务端和新前端。
- 新旧页面分别发送消息,读取旧 checkpoint、处理已有待批卡片;更新 tools ETag。
- 对比升级前后的任务、消息、证据、提案数与字段。
- 在测试副本验证旧程序是否能忽略新增字段 / 表;不能兼容则记录回滚限制。
通过条件:迁移、Ready 和两份 SQL 一致;旧数据保留,新旧客户端不会双驱动。回滚不能恢复一份旧库覆盖升级后用户成果。
关联 OB01–OB03、AU04、HC02。
- 配置非默认 reasoning 与 output cap,检查上游请求映射;unsupported 参数反馈明确。
- 查看正常、重试、取消、重建上下文、usage 缺失等运行的结构化记录。
- 假 Provider 错误中放 fixture Key;扫描日志 / 错误 / chunks / snapshots。
- 反复启动、停止和切线程,检查 agent、timer、fetch 数;验证 token 轮换响应丢失的恢复。
通过条件:usage 不因重复报告双计,未知不伪造为 0;没有敏感原值;运行结束释放实例和定时器;合法 host 不因一次轮换响应丢失永久卡住。
优先由测试程序保存快照;需要手工核对时仅对测试库执行以下只读 SQL。run / thread 参数用数据库客户端绑定参数,不复制真实 token。新增 step / baseline 表名按实现更新。
SELECT id, thread_id, harness_mode, status, cancel_requested,
model_calls, approval_wait_ms, error_code, revision
FROM agent_runs WHERE id = :run_id;
SELECT m.seq, m.role, p.idx, p.type, p.tool_call_id, p.tool_name,
p.tool_model_turn, p.tool_args_ready, p.tool_execution_claimed,
p.approval_status, p.is_error
FROM agent_messages m
JOIN agent_message_parts p ON p.message_id = m.id AND p.user_id = m.user_id
WHERE m.thread_id = :thread_id AND m.user_id = :user_id
ORDER BY m.seq, p.idx;
SELECT COUNT(*) AS count, COUNT(DISTINCT seq) AS distinct_count,
MIN(seq) AS min_seq, MAX(seq) AS max_seq
FROM agent_run_chunks WHERE run_id = :run_id AND user_id = :user_id;事件总数与 distinct 相等只证明没有重复序号,不能证明没有丢事件;还需比较预期 payload 与 replay State。不要在报告中贴附件 base64、完整私人材料或原始认证头。
| 等级 | 示例 | 发布处理 |
|---|---|---|
| Blocker | 跨用户数据、未批写入、重复副作用、历史 / 证据丢失、取消确认后继续新动作 | 阻止发布 |
| Critical | sidecar 无法停止、图片未进入模型、旧 checkpoint 丢最近结果、运行无限等待、错误状态伪装成功 | 阻止发布 |
| Major | 部分恢复提示不准、工具输出过大、配置未生效、不可解释的性能退化 | 本次功能受影响则修复;分期需明确排除和跟进 |
| Minor | 不影响事实与操作的提示排版 / 文案问题 | 可记录跟进,不覆盖真实失败 |
QA 不能因“Go / npm 绿了”直接签字;必须列出实际 host 和场景。被 skip 的真实 WASM 或不可复现故障不算通过。
| 案例 | WASM | Sidecar | Auto / 恢复 | Trace / 缺陷 | 执行者 / 日期 |
|---|---|---|---|---|---|
| QA01–QA03 输入与隔离 | 未执行 | 未执行 | 未执行 | 待填 | 待填 |
| QA04–QA06 停止与断线 | 未执行 | 未执行 | 未执行 | 待填 | 待填 |
| QA07–QA08 上下文恢复 | 未执行 | 未执行 | 未执行 | 待填 | 待填 |
| QA09–QA10 审批 | 未执行 | 未执行 | 未执行 | 待填 | 待填 |
| QA11–QA14 故障与一致性 | 未执行 | 未执行 | 未执行 | 待填 | 待填 |
| QA15 科研业务 | 未执行 | 未执行 | 未执行 | 待填 | 待填 |
| QA16 性能 | 未执行 | 未执行 | 未执行 | 待填 | 待填 |
| QA17 升级 | 未执行 | 未执行 | 未执行 | 待填 | 待填 |
| QA18 观测与资源 | 未执行 | 未执行 | 未执行 | 待填 | 待填 |
正式报告按单项 QA ID 展开,不用上面分组行隐藏某一子项未测。
构建提交 / 部署版本:
数据库版本 / 迁移来源:
浏览器版本 / JSPI:
Node / libfx / sidecar backend:
模型 / Provider / 测试预算(不含密钥):
案例 ID / 前置 seed:
步骤偏差(如有):
预期:
实际:
状态:通过 / 失败 / 未执行 / 不适用(附原因)
服务端与上游证据:
关联自动化测试 ID / 缺陷:
执行者 / 复核者 / 日期:
Q:取消后上游仍显示少量 token 费用算失败吗? 供应商已生成 / 计费的 token 不可撤销。核对服务端取消是否及时传播、确认后是否新发调用;不能仅凭账单瞬间变化判断。
Q:显示流断开后为什么后台还在运行? sidecar 的运行与显示连接独立;用户主动点击停止才请求取消。WASM 页面真正关闭会丢 host,由 heartbeat reaper 收尾并保留证据。
Q:context degraded 提示本身是否失败? 已明确使用权威历史重建且事实完整时不是失败;静默丢失最近约束 / 工具结果才是失败。新线程不应错误提示丢历史。
Q:工具 HTTP 重试出现 409 是否一定失败? 不一定。需核对原执行是否已提交、是否可读到稳定结果、是否有第二次副作用。结果未知且错误解释清楚,比盲目重跑更符合规范。
Q:旧提案版本冲突要不要自动重新批准? 不要。读取新数据、形成新提案,再由用户决定,不能借旧批准授权新内容。
Q:图像问答真实模型回答不准怎么归因? 先检查上游是否收到正确图像及模型图像能力;输入缺失属于 harness 缺陷,输入正确但模型理解错误属于行为质量问题,分别记录。
Q:可以把所有新测试和 QA 一次性标记通过吗? 不可以。每项记录实际命令 / 环境 / 证据;此文档默认全部待执行。