diff --git a/docs/reference/hwlab.md b/docs/reference/hwlab.md index f3536cf0..4a6c1d28 100644 --- a/docs/reference/hwlab.md +++ b/docs/reference/hwlab.md @@ -100,6 +100,8 @@ fixture seed 优先来自目标 node/lane 的受控真实样本;采集脚本 `web-probe script` 注入的 `baseUrl` 是 public origin,并且可以带尾随 `/`。自定义脚本构造 API 或页面 URL 时必须使用 `new URL(path, baseUrl).toString()`;不要用 `` `${baseUrl}${path}` `` 直接拼接以 `/` 开头的 path,否则会生成 `//health`、`//v1/...` 这类双斜杠路径,可能被 edge-proxy 当成上游绝对 URL/异常代理路径处理,造成与真实浏览器页面不同的 502 或误判。 +`web-probe script` 的 `fetchJson` 依赖已认证页面所在 origin。自定义脚本必须先通过 `waitWorkbenchReady`、`gotoStable` 或等价页面导航进入目标 public origin,再调用 `fetchJson` 读取 `/v1/...`;不要在 `about:blank` 上先发 API 请求,否则 status 0 只说明浏览器上下文尚未进入同源页面。Workbench 页面存在长连接、轮询或 SSE 时,不要用 Playwright `networkidle` 作为 reload/切换通过条件;应使用 `domcontentloaded` 加明确 DOM/API 条件,例如 final URL、route conversationId、active tab、message card、trace row 或 workspace `selectedConversationId`。 + Workbench 历史会话 deep link 可能属于非默认 project。打开 `/workbench/sessions/` 时如果默认 project 返回 `conversation_project_mismatch`、页面提示 conversation 不可见,不能立即判定原 issue 失效;应先从 workspace/conversation 摘要确认该会话 projectId,再用等价 URL `/workbench/sessions/?projectId=` 做 DOM 断言。closeout 证据应写明实际 projectId、finalUrl、terminal agent card 数量和负向文本断言,避免用默认 project 的 404 掩盖真实页面状态。 Web 登录凭据必须从目标 node/lane 的受控 source 解析并作为一次性进程环境注入,例如先用 `bun scripts/cli.ts hwlab nodes secret status|ensure --node --lane --name hwlab-v03-bootstrap-admin` 确认 bootstrap admin sourceRef,再运行受控 `hwlab nodes web-probe run` / `hwlab nodes web-probe script`。目标 host 没有 owner-only source 文件时,受控入口应快速返回 `web_login_secret_missing`;不要依赖脚本历史默认密码,不要把凭据复制到目标 host、shell 启动文件、issue、日志或 Git 文档。若 sourceRef/fingerprint 已确认但 public `/auth/login` 仍不接受 source 密码,应先区分 API rollout、user-billing 回退和用户表状态;只有明确需要按 YAML source 重灌 bootstrap admin hash 时,才使用受控 `secret ensure --confirm --force`。 @@ -122,6 +124,8 @@ Workbench prompt、TraceTimeline、final response、详情弹窗或工具调用 Session 切换、session rail 或 Workbench 恢复路径类问题必须同时验证点击态和持久化恢复态。浏览器证据应在同一 public origin 中选择一个非当前 session,等待足够覆盖 `hydrate`、`select-conversation`、active trace repair 等异步返回的空闲窗口,确认 active tab 没有回退;随后读取 `/v1/workbench/workspace?projectId=` 确认后端 `selectedConversationId` 已改变并持久化;最后刷新页面并再次等待 session tabs,确认同一个 session 仍是 active。若当前 selected conversation 没有出现在 `/v1/agent/conversations` 当前列表窗口中,前端必须把 workspace 当前选中 conversation 合入 session rail;刷新后没有 active tab、状态显示“等待 workspace”,或只靠内存态显示成功,均不能作为通过证据。session rail 的刷新列表只是候选窗口,不是 selected session 的完整真相;list API 临时缺当前 conversation 时,不得清空当前 tab、取消 active 状态或让标签在刷新/深链恢复中闪烁消失。自定义 Playwright 验收不要只按 tab index 或重复标题判断,应锁定唯一 title、conversationId 或后端 selected id,并记录 `select-conversation` response;与 session 切换无关的 health/RPC 噪声应拆成独立 issue,不阻塞已经通过的切换闭环。 +线上 session rail 当前列表窗口可能只有空会话,或包含已经过期的 stale conversation。选择非空、running 或 terminal 会话作为验收候选时,应先通过 `/v1/agent/conversations?projectId=&limit=` 扩大候选范围,再对候选逐个读取 `/v1/agent/conversations/?projectId=`;只有 detail 200 且消息/trace shape 满足目标场景的会话才可作为正向切换、reload 或 terminal replay 证据。detail 404 的候选本身是 stale/list-window 负向信号,应用于验证隔离路径,而不能继续当作正向 reload 样本。 + Code Agent turn 运行状态的权威入口是 `/v1/agent/turns/:traceId`,`traceId` 是单一查询键;`hwlab-cli client agent result `、Web composer、cancel 按钮、session 标签动效和最终消息状态都应消费同一 turn snapshot 的 `running`、`terminal`、`status`、`finalResponse`、`error` 和 AgentRun provenance。`/v1/agent/trace*`、conversation list、workspace summary、message status、runnerTrace rows 和 currentRequest 只能作为详情、列表或上下文来源,不能再反向推断 turn 是否运行中、是否完成或是否失败,也不能作为 fallback 与 turn endpoint 竞争覆盖 UI 状态。CLI 等待 terminal 时也应优先使用 submit 返回的 `turnUrl` 或 `/v1/agent/turns/:traceId`,只有详情展示才读取 trace rows。 Code Agent 会话恢复的状态权威必须以最新 message 和同 turn trace 为准。conversation 顶层 `status=idle` 只能表示当前没有进行中的 turn,不能覆盖 message 自身的 `running` / `completed` / `failed`,也不能把 agent message 降级成 `source`;conversation 顶层 `lastTraceId` 若与最新 user/agent message trace 脱节,后端 summary 应按最新同 turn user/agent trace 修正,前端 hydrate/select/retry 后也应从最新 active message reattach trace。关闭刷新、deep link 或切换 session 后丢消息/卡住类 issue 时,验收必须同时看 DOM 最后一条 agent 的 `data-status`、conversation API 顶层 `lastTraceId`、最后 user/agent message 的 `traceId`、`runnerTrace.status` 和 `/v1/agent/turns/:traceId` 的 `running` / `terminal`,不能只看 session rail 文案或 trace 面板是否出现占位文本。