Files
pikasTech-HWLAB/docs/reference/spec-v02-code-agent-trace.md
T
2026-06-06 21:19:47 +08:00

179 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# v0.2 Code Agent Trace 规格
本文定义 HWLAB v0.2 Code Agent trace、result 和 Cloud Web trace 展示的数据权威、读写路径和回归判定。Trace 是 Workbench 最复杂的用户可见状态面;实现必须先收敛 source of truth,再生成派生 UI/cache,不得通过叠加 fallback、多路径或兼容快照掩盖状态污染。
## 当前态总览
当前 Trace 架构只有一条 completed/final 权威路径:用户入口提交 turn 后,Cloud API 用 `traceId` 绑定 AgentRun commandterminal 读取时重新通过 AgentRun command registry 找到当前 `commandId`,再从 command result 重建 final responserunning trace 刷新只轻量同步 AgentRun events,不等待 command resultWeb 和 CLI 只消费同一个 API payload,并通过同一个 row renderer 展示 trace。其他状态只能是 seed、cache 或 render-only evidence。
| 阶段 | 唯一路径 | 不允许 |
| --- | --- | --- |
| 提交 | Cloud Web 或 `hwlab-cli client` -> Cloud Web 同源 `/v1/agent/chat` -> Cloud API -> AgentRun run/command。 | 绕到内部 manager、临时 job、旧 agent worker、浏览器历史拼 prompt 或 runner 直连入口。 |
| Result | `/v1/agent/chat/result/{traceId}` -> session/run seed -> AgentRun command registry -> command result -> `terminalEvidence`。 | `latest`、top-level session snapshot、旧 `traceResults`、内存旧 cache 或共享 `runId` 直接当 final response。 |
| Trace | `/v1/agent/chat/trace/{traceId}` -> 同一 `traceId -> commandId` 映射 -> AgentRun events 按 command 过滤 -> running 直接返回 live eventsterminal 才同步 command result 形成 `terminalEvidence`。 | running trace 每轮先等待 command result、重复拉 events,未按 commandId 分割事件,或把其他 command 的 assistant/tool/terminal row 挤进当前 trace。 |
| 渲染 | API payload -> `tools/src/hwlab-cli/trace-renderer.ts``traceDisplayRows` -> CLI `--render web` 和 Web `MessageTracePanel`。 | Web、CLI 各自实现一套 row 过滤/去噪/final 展示逻辑。 |
| CI | 后端合同测试 + CLI/Web renderer 测试 + G14 component plan 共同覆盖同一 API path 和同一 renderer 文件。 | CI 只测内部 helper、fixture、裸 API 或旧 fallback contract,却不覆盖 Web 用户路径会用到的 API/renderer。 |
这条路径的核心约束是“final response 只有 AgentRun command result 一个 authority”。`agent_sessions``codeAgentChatResults``runnerTrace`、Web local state 和 CLI summary 都不得产生第二个 final response;它们只能保存可被上述 authority 重建或解释的派生证据。
## 身份模型
| 身份 | 归属 | 语义 |
| --- | --- | --- |
| `traceId` | HWLAB Cloud API | 用户一次 Code Agent turn 的可见追踪 ID,也是 result/trace API 的主键。 |
| `conversationId` | HWLAB Workbench | 用户可见对话容器;只用于业务上下文和 UI 分组。 |
| `sessionId` | HWLAB Code Agent session | 用户显式创建或选择的业务 session,绑定 owner、provider profile 和权限。 |
| `threadId` | HWLAB/AgentRun/Codex | 会话连续性的唯一标准字段;不得新增历史 thread 别名或拼 prompt 替代。 |
| `runId` | AgentRun | 可复用执行壳;同一个 run 可承载同一 session 的多条 command。 |
| `commandId` | AgentRun | 单个 turn 的执行 identity;同一 `runId` 下每个 `traceId` 必须映射到唯一 command。 |
| `runnerId` / `jobName` | AgentRun / k8s | runner 尝试身份,只能作为执行诊断,不代表业务 session。 |
`traceId -> AgentRun commandId` 是 AgentRun 接入后的核心映射。`runId` 只能说明执行壳复用,不能单独说明某个用户 turn 的 final response。Cloud Web、CLI 和 issue closeout 必须同时展示业务身份和执行身份,避免把共享 run 的上一个 command 误认为当前 trace。
## 权威数据源
- **AgentRun command registry 是 completed AgentRun trace 的执行权威**Cloud API 必须通过 `GET /api/v1/runs/{runId}/commands?afterSeq=0&limit=100``idempotencyKey === traceId``payload.traceId === traceId` 找到当前 trace 的 command。
- **AgentRun command result 是 final response 权威**:找到 command 后,Cloud API 必须通过 `GET /api/v1/runs/{runId}/commands/{commandId}/result` 生成 `reply.content``finalResponse``providerTrace` 和 completed result payload。
- **AgentRun events 是 trace row 权威**Cloud API 从 `GET /api/v1/runs/{runId}/events` 读取事件,并按当前 `commandId` 过滤 assistant/tool/terminal rows。旧 command 的 assistant/tool/terminal 事件不得进入当前 trace 的可读事件列表。
- **`agent_sessions` 是业务 session 和 seed store,不是 final response authority**:它保存 owner、project、conversation/session/thread、lastTraceId、AgentRun run seed 和必要派生证据;读取 terminal result 时不得把 `session.finalResponse``session.traceSummary` 或旧 `traceResults` 当成 completed 文本权威。
- **内存 `codeAgentChatResults` 是短连接缓存,不是 terminal authority**running 状态可用它承接轮询状态;terminal AgentRun result 再次读取时必须重新走 command registry/result 或使用由该路径刚生成的新 payload。
- **`traceStore` 是 live event buffer,不是历史 final authority**:它服务增量轮询和短期 trace 展示;事件过期时可以报告 missing/expired,但不能用别的 trace 的 final response 填补。
## 写入流程
1. Cloud Web 或 `hwlab-cli client` 通过同源 `POST /v1/agent/chat` 提交 turn;请求必须携带显式选中的 `conversationId/sessionId/threadId` 和 provider profile 语义。
2. Cloud API 认证 actor,按 session owner 和 tool capability 装配 AgentRun 请求;HWPOD/runner 使用的用户 API key 只允许来自 owner 的 `HWLAB_API_KEY`,浏览器 session、cookie 或其他 env 别名不得成为 CLI/runner key 来源。
3. Cloud API 创建或复用 AgentRun `runId`,再创建新 commandcommand `idempotencyKey``payload.traceId` 必须等于本次 `traceId``payload.conversationId``payload.hwlabSessionId``payload.threadId``payload.providerProfile` 必须保留。
4. Cloud API 写入 session seed:业务 session、lastTraceId、AgentRun `runId`、可选当前 `commandId`、provider profile 和 owner 归属。该 seed 只用于后续找到 run,不承诺 final response 正确。
5. 初始 result 返回 `running/accepted`Web 和 CLI 进入短连接 result/trace 轮询。
写入路径不得把浏览器历史 messages、旧 trace final response、旧 command tail 或 session top-level snapshot 拼入新 command payload。历史只用于 UI 展示和排障,不是模型上下文,也不是新 result 的数据来源。
## Result 读取流程
`GET /v1/agent/chat/result/{traceId}` 是 terminal result 的唯一用户入口。AgentRun adapter 启用时,Cloud API 必须执行以下顺序:
1. 校验 `traceId` 和 session owner;普通用户只能读自己的 trace,admin 按授权读。
2. 从内存缓存或 `agent_sessions` 读取最小 AgentRun seed,至少需要 `runId`;如果没有 seed,返回 not found,不猜测其他 session。
3. 对 terminal 或可能 terminal 的 AgentRun result,必须用 AgentRun command registry 按 `traceId` 解析当前 `commandId`。不得相信缓存里的 `agentRun.commandId``providerTrace.commandId``traceSummary.agentRun.commandId` 或 top-level `lastTraceId` 作为最终映射。
4. 找到 command 后,读取 command result,并从 command result 重建 `reply``finalResponse``providerTrace``traceSummary``agentRun` 字段。
5. 写回内存缓存和 session 派生证据时,只能写刚由 command result 生成的 payload;旧 `finalResponse`、旧 `traceSummary` 和旧 `traceResults` 不得参与 merge 覆盖。
6. 如果 command registry 找不到该 `traceId` 对应 command,返回结构化错误,例如 `agentrun_trace_command_not_found`;不得回退到旧缓存、top-level snapshot、latest trace 或其他 command result。
Completed result 响应必须把 AgentRun command result 的终态证据公开为 `terminalEvidence`,并与 `agentRun.commandId``finalResponse.traceId` 保持一致。`/result``/trace` 响应不得导出 `fallback` 字段;降级、缺失或过期只能用 `status``traceStatus``retention``error``terminalEvidence` 表达,避免旧 fallback contract 重新成为并行 final response 路径。
Running 轮询可以返回 `202` 和当前 runnerTrace;这只是“尚未 terminal”的轮询语义,不是 final fallback。Completed / failed / canceled / blocked 等 terminal 状态必须经过同一 command registry/result 路径确认。
## Running Trace 刷新流程
`GET /v1/agent/chat/trace/{traceId}` 的 running 刷新是 Trace 用户可见性的关键路径,必须保持轻量、单向和可预测:
1. Cloud API 先从当前 result/session seed 取得 AgentRun `runId` 和可用 `commandId` 线索,再调用 `refreshAgentRunTrace` 刷新 AgentRun events。刷新 events 是 running `/trace` 的第一动作;不得在刷新前等待 `syncAgentRunChatResult` 或 command result。
2. AgentRun events 仍按当前 `traceId -> commandId` 过滤并写入 trace buffer。running 响应返回 live events、eventCount、traceStatus 和必要 error/blocker 信息;它不生成 assistant final response。
3. `/trace` 只有在明确 terminal 状态、terminal result event 或 command result 已 terminal 时,才调用 `syncAgentRunChatResult` 读取 command result。此时 `/trace` 已经刷新过 events,result 同步不得再次重复拉同一批 events;实现应显式走 no-refresh-events 语义,避免同一轮请求 events fetch/append 两次。
4. AgentRun/provider 执行失败、限流或 high-demand 错误必须作为 trace/result 状态和 terminal error 暴露;不得把执行层失败隐藏成 trace 缺失,也不得为了给 UI 拼完整回复而从 trace rows 反填 final response。
5. running trace 的用户可见刷新目标是小于 5 秒。这里的目标衡量 Web/CLI 对同源 `/v1/agent/chat/trace/{traceId}` 的可见更新延迟,而不是要求模型执行成功或 final result 小于 5 秒。即使 `/result` 仍 running 或最终 failed`/trace` 也应能在该窗口内暴露新增 events 或明确错误状态。
这条流程禁止把 running `/trace` 做成“先同步最终 result、再刷新 trace”的重路径。Result 慢、provider 慢或 command result 暂不可用时,trace 面板仍必须能独立显示当前 AgentRun eventsterminal final response 则继续只由 command result 权威路径生成。
## Trace 读取与渲染流程
`GET /v1/agent/chat/trace/{traceId}` 服务完整 trace 回放,Cloud Web 与 `hwlab-cli client agent trace --render web` 必须共享同一 row 转换语义:
1. Cloud API 先用 result 同一路径解析当前 `traceId -> commandId`;对于 AgentRun traceevents 必须按该 `commandId` 过滤。
2. 可读 rows 至少覆盖 request/setup、tool call、assistant message、terminal/result 和 blocker。低价值 AgentRun backend echo、状态 echo、terminal boilerplate 和重复噪声可被 row renderer 去噪,但原始 trace JSON 仍应通过 `--full` 或下载保留。
3. Web 默认显示完整可读事件列表。Result polling 返回的 compacted head-tail runnerTrace 不能冒充完整 trace;发现 `eventsCompacted=true` 时必须继续请求 `/trace/{traceId}`
4. 如果完整 trace 已过期或缺失,UI 必须显式展示 missing/expired,并提供 result/inspect 可用证据;不得用最新 trace 或 session final response 填补历史 trace。
5. 同一 run 多 command 时,旧 command 的 assistant/tool/terminal rows 不能挤到新 command 的 final response 或 trace 尾部。取消/失败前的有价值上下文应作为脱敏 conversation facts 或当前 command 自身事件展示,不通过串线实现。
6. Steer 事件归属原 target trace。`POST /v1/agent/chat/steer` 被接受后,原 trace 的完整 trace/read/render 路径必须能看到 `agentrun:steer:accepted``agentrun:steer:command-created`,并保留目标 `runId``targetCommandId``steerCommandId`。后续 provider/backend terminal failure 仍是目标 turn 的终态;它不得删除 steer accepted/command-created rows,也不得被报告成 steer POST 短请求失败。
## Web/CLI/CI 同路径保证
Web、CLI 和 CI 的一致性按“入口同源、API 同 path、renderer 同代码、CI 同组件模型”保证:
- **Web 入口**:浏览器只从 Cloud Web origin 调用相对 `/v1/agent/chat*` 路径,经 Cloud Web/edge 进入 Cloud API;浏览器代码不得直连 AgentRun、内部 manager、pod service 或临时 debug endpoint。
- **CLI 入口**`hwlab-cli client agent send/result/trace/inspect/steer` 的标准 base-url 是目标 lane 的 Cloud Web originv0.2 public Web 等价入口为 `http://74.48.78.17:19666`CLI 再请求同一 `/v1/agent/chat*` path,并且只从 `HWLAB_API_KEY` 生成 `Authorization: Bearer`。Cloud API 直连 `19667` 只允许作为 API 合同、admin/setup/gateway 或明确诊断证据,不能替代 Web trace/result issue 的 Web 等价验收。
- **Trace renderer**CLI 的 `agent trace --render web` 和 Web 的 `MessageTracePanel` 必须共同 import `tools/src/hwlab-cli/trace-renderer.ts`;任何 row 分类、noise count、completion row、assistant markdown、tool row 或 compacted trace 展示改动都先改这个共享 renderer,再由 Web/CLI 测试覆盖。
- **Result/Trace state**Web 的 result polling、trace replay、`mergeTraceResults` 和 CLI 的 poll/wait/trace 命令都必须以 `/v1/agent/chat/result/{traceId}``/v1/agent/chat/trace/{traceId}` 为唯一用户 API;Web 每个刷新 tick 必须并行启动 result 和 trace 请求,不得先等待 result 再请求 trace;不得给 Web 增加一条 session-level final response 查询,或给 CLI 增加一条内部 result manager 查询。
- **CI component model**`tools/src/hwlab-cli/trace-renderer.ts` 是 Cloud Web code input;改动、移动或重命名共享 renderer 时,必须同步 G14 CI component planner 和 planner 测试,保证 renderer 变化触发 Cloud Web 相关验证/rollout。服务端 trace/result 代码、Web trace state 和 CLI trace client 的 affected component 也必须保持在同一发布计划里。
- **CI 语义边界**:CI 同路径不是要求单元测试访问公网;它要求 mock/contract 测试表达同一 HTTP path、同一 identity mapping、同一 renderer import 和同一失败语义。真实关闭 Web trace/result issue 时,再用目标 public Cloud Web origin 或 Web 等价 CLI 做 P4 验收。
如果 Web、CLI 或 CI 只覆盖了上述链路的一段,不能称为同路径修复。例如只修 Web DOM、只修 CLI formatter、只修 session cache、只修 AgentRun events filter、或只让 CI mock helper 变绿,都可能继续保留另一条 final/trace 路径,导致“修过很多次但现象还在”。Trace 相关变更必须同时对齐 authority、API、renderer 和 component plan 四层中的相关部分。
## 组合优先原则
CaseRun、harness、runner、诊断脚本和其他上层编排工具需要查看 Code Agent trace 时,必须采用“ID + 既有工具组合”的方式,而不是在上层工具里重新实现 trace/result/session 查询和渲染逻辑。上层工具的职责是稳定返回 `traceId``sessionId``conversationId``threadId`、AgentRun `runId/commandId` 线索和可复制的下一条 HWLAB CLI 命令;完整 trace、result、inspect 和 Web renderer 语义继续由 `hwlab-cli client agent trace/result/inspect` 提供。
推荐输出合同:
- `traceLookup.source=hwlab-cli.client.agent`,说明后续查询复用既有 HWLAB Agent CLI。
- `traceLookup.strategy=id_plus_existing_cli`,说明当前工具只提供 identity 和组合 hint。
- `traceLookup.commands.result=hwlab-cli client agent result <traceId> --base-url <web-origin>`
- `traceLookup.commands.trace=hwlab-cli client agent trace <traceId> --base-url <web-origin> --render web`
- `traceLookup.commands.inspect=hwlab-cli client agent inspect --trace-id <traceId> --base-url <web-origin>`
-`sessionId` 时可以补 `traceLookup.commands.sessionStatus=hwlab-cli client agent session status <sessionId> --base-url <web-origin>`
这条规则的目的是通过组合复用保持单一 trace authorityCaseRun 或 harness 可以归档 `traceLookup` 和由 result payload 直接可得的终态摘要,但不得为了方便再发明一套 `/trace/{traceId}` fetch、row renderer、session 反查、final response 归因或 AgentRun events 过滤器。需要更多可见性时,先改进 `hwlab-cli client agent trace/result/inspect` 这些已有入口,再让上层工具返回新的 hint 或消费这些入口的稳定字段。
## 派生缓存边界
允许存在的派生状态只有两个用途:降低轮询开销和提升 UI 可见性。派生状态必须可被权威路径重建,且不得成为 terminal result 的替代 authority。
| 派生状态 | 允许用途 | 禁止用途 |
| --- | --- | --- |
| `codeAgentChatResults` | 保存刚提交的 running result、刚由 command result 生成的 terminal payload。 | 在 terminal 读取时跳过 command registry;返回旧 final response。 |
| `session.traceResults` | 保存按 traceId 写回的审计证据,加快 inspect/list 展示。 | 覆盖 command result;把旧 command 文本当成当前 trace final。 |
| `session.agentRun` | 保存最近或可复用 run seed。 | 证明当前 trace 的 commandId 或 final response。 |
| `session.finalResponse` / `session.traceSummary` | 只作为最近消息的派生展示,必须标明 traceId。 | 历史 result/trace 的 authority;修复其他 trace 时覆盖 latest。 |
| `runnerTrace` compact window | result 轮询里的轻量进度。 | Web 完整 trace 列表;历史 trace closeout 证据。 |
当派生状态和 AgentRun command registry 冲突时,以 command registry 和 command result 为准;冲突的派生状态应被下一次权威读取覆盖或忽略,不新增兼容分支。
## 后续变更纪律
后续任何 trace/result/final response 变更,必须先按本节收敛路径,再改实现或测试:
1. **先定 authority**:新增字段或状态必须归类为 authority、seed、cache、render-only evidence 或 diagnostic;除了 AgentRun command result,其他类别都不能生成 terminal `reply.content``finalResponse`
2. **先删旧路再接新路**:如果新需求确实改变 authority 或 API path,必须在同一变更中删除旧 reader/writer、旧测试和旧门禁;不得保留 legacy mode、feature flag、双读、双写、兼容 fallback 或“查不到再试旧路径”。
3. **失败要 fail closed**:找不到 `traceId -> commandId`、owner 不匹配、events 过期、command result 缺失或 cache 冲突时,返回结构化错误/retention/terminalEvidence,不用 latest、cached、top-level session 或其他 command result 补洞。
4. **共享代码优先**Web/CLI row 语义只能落在共享 renderer;Web state 只负责请求、合并和展示状态,CLI 只负责调用同一 API 和输出同一 renderer 结果,不能在两端分头补过滤规则。
5. **组件模型跟着代码走**:移动 trace server、Web trace state、CLI trace client 或共享 renderer 时,必须同步 CI component planner;不能让文件路径变化把 Web/CLI trace 代码移出 Cloud Web 验证面。
6. **旧断言一律拆除**:任何测试、预检、guard、gate 或 fixture 还在要求 `fallback` 字段、latest result、session top-level final、legacy trace snapshot 或双路径兼容时,删除并改写为本 SPEC 的当前目标行为;不得为了让旧断言通过而补兼容分支。
7. **证据按路径给出**trace/result closeout 必须同时列出 `traceId``runId``commandId`、API path、renderer 入口和 Web/CLI base-url;只给 job id、PipelineRun、单测或源码 diff 不足以证明用户路径已收敛。
8. **刷新延迟按同源 trace 测**:trace 刷新性能问题必须用 public Cloud Web origin 或 Web 等价 CLI 采样 `/v1/agent/chat/trace/{traceId}`,记录 eventCount 变化和 trace endpoint latency;不得用内部 AgentRun events、pod log 或 `/result` 完成时间替代用户可见 trace 延迟。
## 禁止路径
- 不得为 trace/result 增加 parallel final response path、legacy mode、feature flag、旧 top-level fallback 或“查不到 command 就用 latest/cached result”的分支。
- 不得把 `runId` 当成 trace authority;共享 run 下必须使用 `commandId` 分割事件和 final response。
- 不得把 `provider=agentrun-v01` 当成真实模型/provider`agentrun-v01` 只属于 adapter/runner infrastructure 字段。
- 不得让 running `/trace` 每轮先等待 command result、重复同步 events 或串行依赖 `/result`;trace 刷新慢不能靠加 Web 专用轮询、CLI 专用快速接口或 latest/cache fallback 解决。
- 不得在 Web、CLI 或 closeout 中把 `AgentRun result is ready`、terminal status echo、boilerplate completion row 或 placeholder status 当成 assistant final response。
- 不得通过拼接浏览器历史消息、旧 trace rows 或旧 summary 来制造 continuitycontinuity 只由标准 `threadId` 和 AgentRun/Codex 原生 resume 证明。
- 不得新增 `HWLAB_API_KEY` 以外的 CLI/runner API key 来源,也不得让 Web session/cookie 成为 runner key fallback。
## 回归测试要求
源码层测试必须覆盖以下最小场景:
- 同一 `runId` 下两个 `traceId` / `commandId`,读取第一条历史 trace 时不显示第二条 command 的 assistant/tool/terminal rows。
- 第二条 trace 的 session top-level、`traceResults` 或内存 cache 被污染成第一条 command/final 时,`GET /result/{secondTraceId}` 必须通过 command registry/result 返回第二条 command 的 final response。
- 已 completed 的 AgentRun 内存缓存也必须走 command registry/result;不能只同步 running。
- command registry 找不到目标 `traceId` 时返回结构化错误,不返回旧 cache/latest/top-level。
- running `GET /trace/{traceId}` 必须先刷新 AgentRun events 并返回 live trace;未 terminal 时不得调用 command result 同步,terminal 时 result 同步不得重复刷新同一批 events。
- Web renderer 的纯逻辑测试覆盖 request/setup、tool call、assistant markdown、completion row、noise count 和 compacted trace 自动回放条件。
- Result/trace 响应序列化测试必须断言没有 `fallback` 字段,且 `traceId``agentRun.commandId``terminalEvidence.agentRun.commandId``finalResponse.traceId` 一致。
- CLI 测试必须覆盖 `agent result``agent trace --render web``harness result``harness trace` 都请求 Cloud Web base-url 下的 `/v1/agent/chat/result/{traceId}``/v1/agent/chat/trace/{traceId}`,并暴露共享 renderer 标识。
- Steer 回归测试必须覆盖 `/v1/agent/chat/steer` 在 AgentRun steer command 创建后短连接 202 返回,不等待 owner/session/workspace 持久化;同一 target trace 的 render rows 必须包含 `agentrun:steer:accepted``agentrun:steer:command-created`
- Web 测试必须覆盖 `mergeTraceResults`、compacted trace 自动请求完整 `/trace/{traceId}``subscribeToTrace` 在同一 refresh tick 并行启动 `/result``/trace``MessageTracePanel` 共享 renderer import,以及 final response 不从 trace row 或 session latest 反填。
- CI planner 测试必须覆盖共享 renderer、服务端 trace/result、Web trace state 和 CLI trace client 的 affected component 归属;路径重命名时先更新 planner 测试,不用旧路径断言保护旧架构。
真实入口验收必须走目标 lane 的 public Cloud Web origin 或 Web 等价 CLI`POST /v1/agent/chat``GET /v1/agent/chat/result/{traceId}``GET /v1/agent/chat/trace/{traceId}``inspect/session list`。v0.2 默认用 `http://74.48.78.17:19666` 作为 Web 等价 base-url`19667` API 直连只能补充证明 Cloud API contract,不能单独关闭 Web trace/result 类 issue。Trace 刷新延迟类 issue 还必须给出至少一轮 running `/trace` eventCount 在小于 5 秒窗口内增长的证据;模型 high-demand、backend failed 或工具执行失败可以作为 out-of-scope 执行层状态记录,但不能替代 trace 可见性判定。仅有单测、PR merge、PipelineRun 或源码证据不能关闭 trace/result 类 issue。
## 相关文档
- [spec-v02-hwlab-cloud-web.md](spec-v02-hwlab-cloud-web.md)Cloud Web 工作台、trace renderer 和 Web/CLI 同路径要求。
- [agentrun-code-agent-dispatch.md](agentrun-code-agent-dispatch.md)AgentRun run/command/resource bundle/credential 装配边界。
- [code-agent-chat-readiness.md](code-agent-chat-readiness.md)Code Agent 真实 completed 判定和 provider readiness。
- [spec-user-access.md](spec-user-access.md)Code Agent session owner、trace/result/cancel 权限边界。