Skip to content

Latest commit

 

History

History
314 lines (207 loc) · 17.9 KB

qa.md

File metadata and controls

314 lines (207 loc) · 17.9 KB

Agent / Harness 人工 QA 与发布验收

本页定义人工 QA 和发布验收步骤。自动化测试与人工 UI 验收分别覆盖不同层次。

关联:实施设计、自动化测试规范、行为评测数据。

1. 环境与测试资产

在独立测试数据库 / 附件目录执行。使用测试账号 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,记录版本但不记录密钥。生产配置覆盖优先级以当前实现为准。

2. 执行矩阵

维度 必测组合
Host 强制 WASM、强制 sidecar、auto 被服务端改用 sidecar
对话 新建线程、已有 checkpoint、checkpoint 过期 / 旧版、刷新恢复
身份 A、B、A 切到 B、两个窗口同账号
网络 正常、显示流断开、模型无响应、工具响应丢失、恢复联网
业务 只读、提案待批、批准、拒绝、版本冲突、有证据任务保护
客户端版本 新前端、新后端配旧页面、旧 checkpoint 的数据升级

P0 相关核心路径在两种 host 各执行一次;不适用于 host 的项目注明原因,不填空。真实 WASM 无法运行时记录环境原因及未验收状态,不勾选通过。

3. 标准验收步骤

每项记录实际 host、run ID、时间、结果、脱敏 trace 位置与关联缺陷。用户正常 UI 不应被要求手工提供内部 ID;QA 从诊断或测试日志取证。

QA01:普通文本与线程一致性

关联 IN01、IN06、HC01。

  1. A 在新线程发送多行文本:“围绕基线实验报告推进。\n先核对数据,再讨论安排。”
  2. 查看回复和假 Provider 捕获的当前用户消息。
  3. 切到另一个线程,发送不同请求,再切回原线程。
  4. 分别在 WASM、sidecar 下重复。

通过条件:文本和线程准确,无上次线程内容作为本次输入;没有两份助手回复、重复 run 或丢字。刷新后的历史与原页面一致。

QA02:图片确实进入模型

关联 IN02、IN03、IN05、HC02。

  1. 先发送文本“只做数据核对”。
  2. 不输入任何文字,只上传向上折线图并发送。
  3. 再上传向下图,附文字“和上一张相比有什么不同”。
  4. 检查假 Provider 收到真实图像 content,解码与上传图片相符。
  5. 用真实支持图像的模型检查回答是否符合图像内容;再验证 4 张图上限。

通过条件:第二轮不复用第一轮当前输入;图片不只是 UI 显示成功;两种 host 均能解释正确图片。图像 bytes 不出现在持久化对话、chunk、checkpoint 或普通日志。

不通过例:助手要求重新上传、只回复旧文本、资源 URI 被当作图片内容、模型说已看图而上游请求没有图。

QA03:附件不可用与跨账号隔离

关联 IN04、IN05、IN07、CX13。

  1. 在测试环境让 A 消息引用 B 的附件;再模拟自己的图片文件已删除。
  2. 在 grant / 附件请求未返回时从 A 登出并登录 B。
  3. 刷新两个账号的线程列表和草稿。

通过条件:B 图片不会进入 A 的模型请求;不可用图有清楚反馈;旧异步结果不启动新账号 host,不覆盖 B 草稿或对话。不复制身份 token 或图片 bytes 到调试日志。

QA04:WASM 停止

关联 CA01、CA04、CA08。

  1. 启动持续流式文本,点击“停止生成”。
  2. 观察取消请求及 run 状态;立即尝试发送新命令。
  3. 再用“模型未返回响应头”的假模型重复停止。

通过条件:收到取消后进入 cancelled;停止后没有新模型 / 工具执行;已显示内容保留。取消服务健康时,本地 QA 目标为 5 秒内停止,记录实际延迟;不能等供应商再发送一个 token 才生效。cancelling 期间不能开启第二个 run,终态后可以。

QA05:sidecar 停止与刷新后停止

关联 CA02、CA03、HC04。

  1. 强制 sidecar,确保浏览器没有 WASM agent 实例,启动持续生成。
  2. 点击停止,检查用户 cancellation API 确实送达。
  3. 重做一次,在生成中刷新页面或切到其他线程再回来,然后停止。
  4. 用 auto 请求被后端切到 sidecar 的场景重复。

通过条件:四条路径均可停止,run ID 正确;浏览器不因 sidecar 状态带 runId 启动 WASM;没有后端继续烧调用而 UI 假装已停的情况。

QA06:取消发送失败和普通断线

关联 CA06、CA07。

  1. 仅阻断 cancellation 请求后点击停止,观察可理解的错误和重试入口。
  2. 恢复该接口,重试停止并核对最终状态。
  3. 另开 sidecar 对话,只断开显示 SSE 或关闭页面,不点击停止;模型完成后再打开。

通过条件:取消未送达不显示已成功停止;重试不会重复动作。普通显示断线不自动取消后台 run,重开能看到真实完成结果。

QA07:旧 checkpoint 丢一轮后继续

关联 CX03、CX11。

  1. R1 完成一次对话并保存 checkpoint。
  2. R2 添加一个独立研究步骤,用户批准;在新 checkpoint 保存前触发 host 中断。
  3. 确认数据库已有 R2 的消息、工具结果和业务任务。
  4. R3 询问“刚才加了什么步骤”,确认上下文重建包含 R2。
  5. R3 正常完成并保存新 checkpoint;R4 再追问该步骤,检查依然知道 R2。

通过条件:R3、R4 都保留 R2 事实;没有重复创建步骤;无虚构批准结果。必须同时检查 Provider 上下文、工具执行次数和任务数量。

QA08:旧版本、损坏和读取失败

关联 CX04、CX05、CX06。

  1. 使用测试夹具分别准备旧 libfx 版本、损坏 bytes、缺覆盖元数据的 checkpoint。
  2. 两种 host 继续对话,检查恢复策略。
  3. 临时令 checkpoint 读取返回 503,恢复后重试。

通过条件:不用不兼容 bytes 启动;有界恢复且提示准确。网络失败不能悄悄丢历史;新线程首条消息不误报丢上下文。原线程消息和业务成果保留。

QA09:批准 / 拒绝及刷新恢复

关联 AP01、AP03、AP05、CX07。

  1. 让助手给已有目标增加任务,检查确认卡片;批准前核对数据库无结构变更。
  2. 批准,检查只应用一次,回复依据真实结果。
  3. 再做拒绝场景,检查无业务变更。
  4. WASM 待确认时刷新页面,由新页面确认;再继续发消息。
  5. 同一 run 有两个 pending 时只处理一个。

通过条件:已处理的卡片不恢复成 pending,另一个提案继续等待;刷新处理不复活旧 host;下一轮知道真实批准 / 拒绝结果。今日是否排入以计划实际结果为准。

QA10:审批冲突、重复点击和取消竞态

关联 AP02、AP04、AP06、CA08、CA09。

  1. 提案等待期间在目标页面修改任务,再批准旧提案。
  2. 两个窗口对同一提案同时批准 / 拒绝,或连续点击确认。
  3. 用测试 barrier 分别复现“取消先提交”和“审批先提交”。

通过条件:旧版提案不能覆盖新任务;重复决定有明确已处理反馈;副作用一次。取消先提交则新审批不应用;审批先提交则保留已提交成果,不能为了取消删除证据。

QA11:工具响应丢失和未知结果

关联 TC01、TC03、TC06、EV06。

  1. 执行测试工具或合法提案,使服务端动作已提交,但代理丢弃工具 HTTP 响应。
  2. 恢复网络,观察相同 call ID 的核对 / 重试。
  3. 再模拟 claim 后进程退出、结果尚未记录的情况。

通过条件:已知结果重放且业务只发生一次;未知结果明确标记需核对,不自动给新 ID 重做。仅“第二次调用返回错误”不能证明第一次副作用已被正确处理,需查看 effect 计数和持久化记录。

QA12:超时、轮次和重试上限

关联 BG01–BG07、SM02。

  1. 假模型分别执行:一直不回 Header、首帧后挂起、持续心跳、持续文本、连续 503。
  2. 使用测试预算验证各类超时,再使用生产配置观察错误提示。
  3. 故意要求超出输出 cap;执行会用满逻辑轮数的场景。

通过条件:每种故障均有限结束,原因可区分;不无限重试,不显示任务已完成;输出 cap 以实际供应商请求为准;达到轮数上限有清楚收尾。

QA13:人工等待不占主动预算

关联 BG08–BG10。

  1. 审批等待超过主动模型预算,但小于审批期限,然后确认。
  2. 同时等待两个提案,先后处理。
  3. 等待期间断开、重连轮询;另做超过审批期限且不再轮询的场景。

通过条件:正常等待不导致主动预算误超;并行等待不重复扣除;超期由服务端结束且不能无限延长期限。若为了快速验收使用测试时钟,记录该次为集成模拟,另保留真实 UI 待批体验记录。

QA14:并发与重连回放

关联 EV01–EV04、SM01、SM03。

  1. 在模型文本、工具结果和审批同时出现时多次断开显示流,重新载入。
  2. 两窗口同时查看 / 操作同一线程;完成上报返回前故意丢响应。
  3. 比较刷新前后文本、工具结果、卡片、run 状态。

通过条件:没有重复文字、消失结果、卡片回滚和终态反复;completion 重试不重复事件、不覆盖更晚 checkpoint。数据库写错误有清楚反馈与诊断,不能只在控制台静默。

QA15:科研业务规则回归

关联 I02、I10、TL04,评测 E01–E14。

按 eval-cases.json 执行:新建科研目标、已有目标加任务、真实依赖阻塞、今日已开始任务保护、明确暂停 / 恢复、删除 / 同批恢复、只做一个步骤、最终完成、网页跳转、空资料库、含恶意指令的材料。

通过条件:建议具体可开始,审批前无结构写入;不复制任务凑三项;已开始和有证据承诺保留;当日满足不变成底层 Task 完成;网页入口不等于科研工作完成;资料不足不虚构研究空白。

QA16:上下文大小与性能

关联 TL01–TL03、CQ01、EV05、OB02。

  1. 固定同一 seed,准备小 / 大任务树、短 / 长对话、长工具材料;记录输入大小。
  2. 对打开网页、读取今日、增加任务三类请求,各在优化前后执行至少 10 次相同脚本。
  3. 比较 model turns / attempts、输入输出 token、首个可见内容耗时、总耗时、DB 写次数和成功率;给出中位数与 p95,样本少时明确仅供趋势参考。
  4. 长对话中放入旧的明确约束与最近的审批结果,检查压缩后都能被检索和正确使用。

通过条件:工具输出有明确分页 / 截断;不能以丢上下文、少完成步骤或降低成功率换速度。合并事件应减少 DB 写入;尚无基线数据时记录待测,不编造提升百分比。

QA17:版本升级、旧页面及回滚演练

关联 DB01–DB03、IN09、HC03、HC04。

  1. 备份测试旧库,保留一页旧版前端打开;升级服务端和新前端。
  2. 新旧页面分别发送消息,读取旧 checkpoint、处理已有待批卡片;更新 tools ETag。
  3. 对比升级前后的任务、消息、证据、提案数与字段。
  4. 在测试副本验证旧程序是否能忽略新增字段 / 表;不能兼容则记录回滚限制。

通过条件:迁移、Ready 和两份 SQL 一致;旧数据保留,新旧客户端不会双驱动。回滚不能恢复一份旧库覆盖升级后用户成果。

QA18:日志、使用量和资源释放

关联 OB01–OB03、AU04、HC02。

  1. 配置非默认 reasoning 与 output cap,检查上游请求映射;unsupported 参数反馈明确。
  2. 查看正常、重试、取消、重建上下文、usage 缺失等运行的结构化记录。
  3. 假 Provider 错误中放 fixture Key;扫描日志 / 错误 / chunks / snapshots。
  4. 反复启动、停止和切线程,检查 agent、timer、fetch 数;验证 token 轮换响应丢失的恢复。

通过条件:usage 不因重复报告双计,未知不伪造为 0;没有敏感原值;运行结束释放实例和定时器;合法 host 不因一次轮换响应丢失永久卡住。

4. 只读数据库核对示例

优先由测试程序保存快照;需要手工核对时仅对测试库执行以下只读 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、完整私人材料或原始认证头。

5. 缺陷等级与发布判断

等级 示例 发布处理
Blocker 跨用户数据、未批写入、重复副作用、历史 / 证据丢失、取消确认后继续新动作 阻止发布
Critical sidecar 无法停止、图片未进入模型、旧 checkpoint 丢最近结果、运行无限等待、错误状态伪装成功 阻止发布
Major 部分恢复提示不准、工具输出过大、配置未生效、不可解释的性能退化 本次功能受影响则修复;分期需明确排除和跟进
Minor 不影响事实与操作的提示排版 / 文案问题 可记录跟进,不覆盖真实失败

QA 不能因“Go / npm 绿了”直接签字;必须列出实际 host 和场景。被 skip 的真实 WASM 或不可复现故障不算通过。

6. 执行记录模板

案例 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 / 缺陷:
执行者 / 复核者 / 日期:

7. QA 常见问题

Q:取消后上游仍显示少量 token 费用算失败吗? 供应商已生成 / 计费的 token 不可撤销。核对服务端取消是否及时传播、确认后是否新发调用;不能仅凭账单瞬间变化判断。

Q:显示流断开后为什么后台还在运行? sidecar 的运行与显示连接独立;用户主动点击停止才请求取消。WASM 页面真正关闭会丢 host,由 heartbeat reaper 收尾并保留证据。

Q:context degraded 提示本身是否失败? 已明确使用权威历史重建且事实完整时不是失败;静默丢失最近约束 / 工具结果才是失败。新线程不应错误提示丢历史。

Q:工具 HTTP 重试出现 409 是否一定失败? 不一定。需核对原执行是否已提交、是否可读到稳定结果、是否有第二次副作用。结果未知且错误解释清楚,比盲目重跑更符合规范。

Q:旧提案版本冲突要不要自动重新批准? 不要。读取新数据、形成新提案,再由用户决定,不能借旧批准授权新内容。

Q:图像问答真实模型回答不准怎么归因? 先检查上游是否收到正确图像及模型图像能力;输入缺失属于 harness 缺陷,输入正确但模型理解错误属于行为质量问题,分别记录。

Q:可以把所有新测试和 QA 一次性标记通过吗? 不可以。每项记录实际命令 / 环境 / 证据;此文档默认全部待执行。