# PJ2026-0106050514 Workbench实时运行面

## 修改历史

| 版本 | 对应 commit id | 更新日期 | 变更说明 |
| --- | --- | --- | --- |

当前正文仍在规格治理草稿中；未定稿前不新增版本号，不为单次编辑追加 `待提交` 版本。

## 正文

## PJ2026-0106050514 Workbench实时运行面需求规格

## 1. 文档控制

| 字段 | 内容 |
| --- | --- |
| 编号 | PJ2026-0106050514 |
| 短名 | Workbench实时运行面 |
| 层级 | L4 专项规格切片 |
| 状态 | 草稿 |
| 实现引用版本 | draft-2026-06-30-p0-1297-spec-first; PJ2026-010401080313 Workbench实时权威 draft-2026-07-08-p0-workbench-realtime-authority-v2 |
| 需求规格模板 | [ISO/IEC/IEEE 29148 需求规格模板](../../templates/iso-iec-ieee-29148-requirements-spec-template.md) |
| 上级规格 | [PJ2026-01060505 Workbench性能](PJ2026-01060505-workbench-performance.md) |
| 关联规格 | [PJ2026-010401 Web工作台](PJ2026-010401-web-workbench.md)、[PJ2026-010401080313 Workbench实时权威](PJ2026-010401080313-workbench-realtime-authority.md)、[PJ2026-010403 API契约](PJ2026-010403-api-contract.md)、[PJ2026-01060508 Web哨兵](PJ2026-01060508-web-probe-sentinel.md)、[PJ2026-010603 YAML运维](PJ2026-010603-yaml-first-ops.md) |
| 规格治理索引 | [规格治理](spec-governance.md) |

本文定义 Workbench 浏览器实时运行面的迁移边界：SSE、Kafka retention replay、错误处理、限流/队列、缓存、timeline、storage、scroll、health、OTel 与 Web 哨兵冻结探测必须用同一组受控语义协作。实时事实权威、禁止前端多源补洞和单步调试工作台以 [PJ2026-010401080313 Workbench实时权威](PJ2026-010401080313-workbench-realtime-authority.md) 为准；本文只定义浏览器运行面、队列、性能和 no-probe-masking 规则。

## 2. 目的和范围

### 2.1 目的

Workbench实时运行面负责把浏览器侧多轮 Workbench 的实时输入、SSE typed event、Kafka retention replay SSE、initial snapshot、trace/detail 只读投影、可见性诊断和 Web 哨兵采样收敛为可控、可观测、可回归的运行链路。目标是解除第二轮消息后页面卡死、浏览器内存无界上涨、SSE error 引发请求风暴、刷新后消息堆叠、跨 session/trace 串线和 monitor 只能看到症状看不到根因的问题。

本专项采用 OpenCode serve 的边界作为对照：事件流负责 replay 和 ordering，Kafka retention replay 负责按 durable cursor 追平，REST detail/history 只负责显式详情和历史分页，错误 envelope 统一诊断，队列/single-flight 限制重复工作，timeline row model 保持稳定 identity。可整模块迁移的 TypeScript 策略模块必须先按 OpenCode 原文件或原核心函数机械拷贝，再在拷贝件上做 Vue/HWLAB 适配；禁止只阅读 OpenCode 后重写一个薄 wrapper 或只覆盖 happy path。Solid/Effect/TanStack 等框架专属层不直接搬运，但其状态机、分支语义、错误处理和 row/queue/transport 边界必须在 HWLAB runtime 中逐项保真。

所有可调参数必须来自 YAML/source-of-truth 或其前端 runtime projection。本文和源码只定义字段族、状态机、责任边界和验收读取方式；不得写入硬编码阈值、采样周期、重试次数、并发数、缓存容量、退避窗口、超时窗口或浏览器内存 kill 数值。

### 2.2 范围内

- Workbench 浏览器 typed error、diagnostic envelope 和用户可见错误归一化。
- SSE runtime、cursor replay、Kafka replay、gap 分类、transport state 和 recovery action。
- event coalescing、keyed single-flight、bounded refresh queue、prefetch/cache trimming 和 scoped key。
- message/part/timeline row model、刷新恢复、增量归一化和 DOM row identity。
- localStorage/sessionStorage 容错、namespace 迁移、quota/security exception 降级和可观测 storage failure。
- scroll/follow/anchor 稳定、pane 内部滚动和布局不无限拉长。
- server health/availability 探测、诊断投影和避免健康探测放大请求风暴。
- OTel/RUM/web-probe 对同一 Workbench 运行链路的 trace id、span、browser memory、request family 和 freeze/blocker 观测。
- Web 哨兵在浏览器无响应或浏览器内存超过受控 YAML 参数时直接杀死浏览器并报阻塞红错误；不得 fallback、自动刷新或把阻塞降为普通警告。
- Workbench 请求风暴和浏览器 freeze 的防回归 closeout，要求修复点落在 Workbench runtime/projection/read model 或共享 runtime 模块，不得落在 web-probe/Playwright 资源削减、自动刷新或 analyzer 降级。
- 多阶段执行 issue、PR、rollout 和 web-probe smoke 的收口要求。

### 2.3 范围外

- Workbench durable facts、message/part authority、terminal final response 和 read model 写侧仍由 [PJ2026-010401080313 Workbench实时权威](PJ2026-010401080313-workbench-realtime-authority.md) 定义。
- AgentRun run/command/runner job、provider profile 和 backend execution lifecycle 不由本专项重新定义。
- 具体 YAML 路径下的参数数值、Secret、runtime image、node/lane、namespace、public origin 和 rollout 策略不在本文硬编码。
- Web 哨兵不负责修复业务投影；它只负责采样、分类、保存证据、报红和暴露根因入口。

## 3. 术语表

| 术语 | 定义 |
| --- | --- |
| 实时运行面 | Workbench 浏览器侧从用户动作到 REST/SSE/read model/timeline/DOM 可见性/诊断的运行链路。 |
| typed error | 带 code、layer、category、route、traceId、requestId、retryable 和 diagnostic 的标准错误对象。 |
| transport state | SSE/EventSource 与Kafka retention replay 的连接、打开、错误、关闭、replay、degraded 和 blocked 状态。 |
| recovery action | transport state 变化后允许触发的受控动作，例如继续 Kafka retention replay SSE、标记 degraded 或直接 blocked；动作不得触发 `/v1/workbench/sync` 或 trace/session/turn 多端点补洞。 |
| refresh queue | Workbench 前端聚合 REST refresh 请求的队列，按 scope/key 去重、限流、标记原因并输出诊断。 |
| scoped key | 由 node/lane/user/session/trace/message/part 等 authority id 归一化后的键，用于 cache、queue、storage、row identity 和 OTel 属性。 |
| timeline row model | 面向 Vue 渲染的稳定行模型，把 message、part、diagnostic、trace summary 和 gap placeholder 表达为可增量替换的 row。 |
| freeze blocker | web-probe 或浏览器运行面证明页面无响应、浏览器无法操作或浏览器内存超过受控 policy 后产生的阻塞红错误。 |
| browser memory policy | YAML/source-of-truth 下发给 web-probe 或 runtime 的浏览器内存观测与 kill 策略；本文只定义字段语义，不定义数值。 |
| REST 风暴 | 同一用户动作或 transport 错误导致 `/sessions`、`/messages`、`/turns`、`/traceEvents`、`/health` 等请求族无界重复或互相触发的状态。 |
| 架构退化修复 | 为了让 smoke、dashboard 或哨兵变绿而改变探针、刷新策略、fallback、采样强度或错误等级，却没有修复 Workbench runtime/projection/read model 根因的行为；本专项禁止该模式。 |
| 单步调试工作台 | [PJ2026-010401080313 Workbench实时权威](PJ2026-010401080313-workbench-realtime-authority.md) 定义的独立 debug route，用 fake live/replay SSE 与 detail fixture 单步驱动 reducer，不触发真实 Workbench mutation 或 automatic recovery。 |

## 4. 系统边界和接口

| 边界项 | 内容 |
| --- | --- |
| 外部使用者 | Workbench 用户、平台值守人员、web-probe smoke、Web 哨兵、OTel 调查 agent、发布验收流程。 |
| 外部输入 | 用户消息、session route、REST snapshot、SSE event/cursor、runtime config projection、YAML policy、browser memory sample、Long Task/freeze sample、OTel trace context。 |
| 受控资源 | Vue Workbench store、SSE client、event queue、refresh queue、session/cache/timeline model、storage namespace、scroll controller、web-probe observer、OTel/RUM events。 |
| 外部输出 | 用户可见 timeline、diagnostic panel、OTel span/attribute、RUM event、web-probe analysis report、monitor red finding、PR/issue closeout 复查证据。 |
| 用户接口 | HWLAB Cloud Web `/workbench`、同源 `/v1/workbench/*` REST/SSE、`web-probe observe`、monitor Web 哨兵报告和受控 GitHub issue/PR。 |
| 系统边界 | 本专项只约束浏览器运行面和哨兵观测面；不拥有 durable Workbench facts、AgentRun execution facts、Secret、用户权限或发布流水 source of truth。 |

## 5. 内部分工与规格索引

| 编号 | 内部模块 | 规格文档 | 主责边界 | 上游依赖 | 下游支撑 |
| --- | --- | --- | --- | --- | --- |
| PJ2026-010605051401 | ErrorRuntime | 本规格 6.1 | typed error、diagnostic envelope、用户可见错误和 OTel 关联 | API契约、Workbench实时权威 | Workbench store、diagnostic panel |
| PJ2026-010605051402 | QueueRuntime | 本规格 6.2 | coalesced event queue、keyed single-flight、Kafka replay queue 和 prefetch/cache trimming | YAML运维、Workbench性能、Workbench实时权威 | SSE、Kafka replay、请求风暴治理 |
| PJ2026-010605051403 | SseRuntime | 本规格 6.3 | EventSource lifecycle、cursor replay、transport state、gap 分类和 recovery action | API契约、唯一投影 | timeline、web-probe、OTel |
| PJ2026-010605051404 | TimelineRuntime | 本规格 6.4 | message/part 增量归一化、row identity、刷新恢复和跨 session/trace 隔离 | Web工作台、唯一投影 | Vue timeline、scroll、probe analyzer |
| PJ2026-010605051405 | BrowserRuntime | 本规格 6.5 | storage 容错、scroll 稳定、pane 滚动、health 探测和 local state 诊断 | Web工作台、YAML运维 | 用户体验、freeze 复现 |
| PJ2026-010605051406 | SentinelFreeze | 本规格 6.6 | browser memory/freeze 采样、kill policy、blocked red finding 和 no fallback/no auto refresh | Web哨兵、Workbench性能 | monitor、rollout smoke、issue evidence |
| PJ2026-010605051407 | OTelEvidence | 本规格 6.7 | trace/span 关联、request family、memory/freeze/root cause 可见性和调查入口 | 运维监控、API契约 | 根因调查、回归判定 |
| PJ2026-010605051408 | CodeReference | 本规格 6.8 | 源码文件头部 SPEC 标注、阶段子 issue 和 PR/rollout/web-probe smoke 收口 | 规格治理 | 后续实现审计 |

### 5.1 目标架构图

```mermaid
flowchart LR
  subgraph Config[YAML / runtime projection]
    Policy[Workbench realtime policy fields]
    Memory[web-probe browser memory policy]
    Cadence[sentinel scenario/cadence fields]
  end

  subgraph Browser[Cloud Web Workbench]
    Store[Pinia Workbench store]
    Errors[typed error runtime]
    Queue[coalesced queue / single-flight / refresh queue]
    SSE[SSE runtime]
    Timeline[timeline row model]
    Storage[storage namespace]
    Scroll[scroll/anchor controller]
    Health[server health probe]
    Store --> Timeline
    SSE --> Queue
    Queue --> Store
    Errors --> Store
    Storage --> Store
    Scroll --> Timeline
    Health --> Errors
  end

  subgraph API[HWLAB Cloud API]
    Rest[REST read model]
    Events[SSE cursor replay]
    OTel[OTel spans]
    Rest --> OTel
    Events --> OTel
  end

  subgraph Probe[web-probe / Web哨兵]
    Observe[observe runner]
    Mem[browser memory/freeze sampler]
    Analyze[analyze report]
    Monitor[monitor red finding]
    Observe --> Mem
    Mem --> Analyze
    Analyze --> Monitor
  end

  Policy --> Queue
  Policy --> SSE
  Policy --> Storage
  Memory --> Mem
  Cadence --> Observe
  Rest --> Store
  Events --> SSE
  Browser --> OTel
  Observe --> Browser
```

### 5.2 运行数据流图

```mermaid
flowchart TD
  U[用户消息或 session 切换] --> K[scoped key]
  K --> Q[refresh queue / single-flight]
  Q --> R[initial snapshot or /workbench/Kafka replay]
  Q --> E[SSE subscribe with cursor]
  E --> C[event coalescing]
  C --> S[server-state reducer]
  R --> S
  S --> T[timeline row model]
  T --> D[Vue DOM rows]
  D --> A[visible ack / scroll anchor]
  E --> X[transport diagnostic]
  R --> X
  A --> O[OTel/RUM event]
  X --> O
  O --> P[web-probe / monitor evidence]
```

同一用户动作只能通过 scoped key 进入受控 queue；SSE error、visibility change、health probe 或 storage failure 只能产生 diagnostic 和受控 recovery action。允许的 live recovery 只有 Kafka retention replay SSE；禁止调用 `/v1/workbench/sync` 或 session/message/turn/trace 多端点 fan-out。

### 5.3 SSE gap 与阻塞时序图

```mermaid
sequenceDiagram
  participant W as Workbench
  participant S as SSE Runtime
  participant Q as Refresh Queue
  participant A as Cloud API
  participant O as OTel/RUM
  participant P as web-probe

  W->>S: connect with cursor
  S-->>W: connected + cursor summary
  A-->>S: event / snapshot
  S->>Q: coalesced event by scoped key
  Q->>W: apply projection
  S-->>S: transport error or seq gap
  S->>O: transport diagnostic
  S->>Q: allowed recovery action
  Q->>A: bounded /workbench/Kafka replay when policy allows
  P->>W: sample responsiveness and browser memory
  P->>O: freeze/memory evidence
  P-->>P: kill browser and mark blocked when policy says blocked
```

## 6. 原子需求

| ID | 模块 | 需求 |
| --- | --- | --- |
| OPS-WBRT-REQ-001 | ConfigSource | Workbench realtime、refresh queue、cache、storage、health、browser memory、freeze、sentinel cadence 和 smoke policy 的所有可调参数必须来自 YAML/source-of-truth 或其前端 runtime projection；源码和 SPEC 不得保存第二份数值真相。 |
| OPS-WBRT-REQ-002 | ErrorRuntime | 浏览器侧所有 REST/SSE/storage/health/projection 错误必须归一化为 typed error，并保留 layer、category、route、retryable、traceId/requestId 和 redaction 状态。 |
| OPS-WBRT-REQ-003 | QueueRuntime | SSE event、Kafka replay、explicit snapshot/detail/history、prefetch 和 health probe 必须通过 key 去重、single-flight 或 coalesced queue；同一错误路径不得产生无界 REST fan-out。 |
| OPS-WBRT-REQ-004 | SseRuntime | SSE runtime 必须以 server cursor/replay 为同步 authority；live recovery 只允许 SSE replay、Kafka retention replay SSE 或 diagnostic，不得在 SSE error 中全量刷新多个请求族来“补洞”。 |
| OPS-WBRT-REQ-005 | TimelineRuntime | timeline 渲染必须基于稳定 message/part/row identity；刷新、SSE snapshot、trace event 和 REST page 替换不能造成用户消息堆叠、agent message 重复或跨 session/trace 串线。 |
| OPS-WBRT-REQ-006 | BrowserRuntime | storage、scroll、pane layout 和 health probe 的失败只能写入 diagnostic 或受控 recovery action；不得通过 reload、fallback、localStorage truth 或 document 级无限滚动掩盖状态分裂。 |
| OPS-WBRT-REQ-007 | SentinelFreeze | web-probe 必须把浏览器无响应和浏览器内存超过受控 policy 的状态分类为 blocker red，并保存 memory sample、freeze sample、request family、trace/span 和截图/日志证据；触发 blocker 后必须杀死浏览器，不得自动刷新页面或降级为 fallback。 |
| OPS-WBRT-REQ-008 | OTelEvidence | REST/SSE/queue/timeline/web-probe 必须暴露同一 scoped key 摘要、request family、transport state、recovery action 和 root cause 字段，确保 monitor 再次出现 INV/CHECK 类问题时能直接看到根因。 |
| OPS-WBRT-REQ-009 | CompletionReview | Workbench OpenCode 迁移完成度不以 smoke、上线或一次 web-probe 通过为判据；每个实现阶段必须按 OpenCode 对照、HWLAB 迁移模块、生产接入、旧散逻辑删除/变薄和 guard 结果做多轮复查。web-probe smoke 只作为入口健康补充证据。 |
| OPS-WBRT-REQ-010 | StageTracking | 本专项每个执行阶段必须有独立 GitHub 子 issue 跟踪，父 issue 只保存总 SPEC、阶段索引、PR/rollout/web-probe evidence 和剩余风险。 |
| OPS-WBRT-REQ-011 | MechanicalCopy | 可迁移的 OpenCode 通用模块必须先机械拷贝再适配；closeout 必须记录 OpenCode 来源行号、HWLAB 拷贝后行号、适配 diff 范围、被保留/删除/改名的能力清单，以及不存在“参考后重写”的复查结论。 |
| OPS-WBRT-REQ-012 | ShrinkageReview | 缩水是独立 P0 缺口；如果迁移后模块缺少 OpenCode 原有状态机、错误处理、限流/防抖、SSE/reducer、scroll persistence、timeline row parity 或 root cause 输出，即使生产路径已经 import，也不得判定完成。 |
| OPS-WBRT-REQ-013 | AppFixBoundary | 请求风暴、浏览器卡死、内存上涨、final response 投影缺失和刷新堆叠的修复必须落在 Workbench runtime、projection writer/finalizer、read model、SSE/REST contract、Vue store/reducer 或本专项迁移的共享模块；web-probe/Playwright 只能增强证据、baseline、blocker red 和 report 可见性，不能作为业务修复点。 |
| OPS-WBRT-REQ-014 | RequestStormRegression | 所有 SSE error、visibility change、health probe、explicit snapshot/detail/history 读取和 Kafka replay 都必须携带 scoped key、原因、in-flight/dedup 诊断和 recovery action；同一 scoped key 的重复恢复必须被 queue/single-flight 合并或阻塞，不能跨请求族递归触发。 |
| OPS-WBRT-REQ-015 | EvidenceSplit | closeout 必须区分 provider/AgentRun 执行完成、Workbench projection 完成和浏览器可见完成。OTel 显示 completed 但 UI trace rows/final response 为空时，应归入 read model/projection/runtime 可见性问题继续调查；不得把 completed trace 的空 UI 重新归因成 provider 失败，也不得用 analyzer fallback 生成假的 final response。 |
| OPS-WBRT-REQ-016 | NoProbeMasking | web-probe smoke 的目标是用户指定业务入口。为通过 smoke 而减少轮次、禁用内存/freeze 检测、自动 reload、重建页面、关闭 network 采样、吞掉 submit/command 失败或把 blocker red 降级为 warning，都属于架构退化。 |
| OPS-WBRT-REQ-017 | SingleStepDebug | Workbench 必须支持隔离的 fake SSE/sync/detail 单步调试工作台，用于验证 authority gate、sealed guard、detail-only rejection、cursor/reconnect 和 cross-page convergence；纯 SSE 模式下任何 automatic `/sync` 或旧 detail fan-out 都必须红灯。 |

## 7. 过程控制和源码引用

新增或修改的 HWLAB Cloud Web、Cloud API、web-probe、monitor、OTel 和相关测试源码文件头部必须引用本规格，例如：

```text
SPEC: PJ2026-0106050514 Workbench实时运行面 draft-2026-06-30-p0-1297-spec-first; PJ2026-010401080313 Workbench实时权威 <实现引用版本>.
```

自动生成文件、锁文件、第三方 vendored 文件和不能承载注释头的二进制产物不要求源码头部，但生成器、渲染器或配置入口必须能追溯到本规格。

阶段子 issue 的最小划分如下：

| 阶段 | 子 issue 职责 | 退出条件 |
| --- | --- | --- |
| P0 SPEC | 更新本 SPEC、父 issue P0 gate、阶段子 issue 索引和 YAML 参数来源约束 | 父 issue 链接 SPEC 和所有子 issue，后续代码阶段不再缺规格入口 |
| P1 纯 TS 模块 | 先机械拷贝 OpenCode typed error、queue/single-flight、scoped key、timeline row、storage、health 等纯 TS 模块或核心函数，再做 HWLAB 类型/API 适配和窄测试 | 模块有源码 SPEC 头，测试覆盖 key/coalesce/cache/timeline/storage/health 基本语义，并能追溯 OpenCode 来源行号 |
| P2 Vue runtime 接入 | 接入 SSE runtime、refresh queue、server-state reducer、timeline/scroll/storage/health 和 OTel/RUM 事件 | 第二轮消息不再请求风暴，刷新后 timeline 不堆叠，scope/key/原因可见；store 中对应通用逻辑已删除或变薄 |
| P3 Web 哨兵增强 | 接入 browser memory/freeze blocker red、no fallback/no auto refresh 和 monitor root cause 展示 | 卡死或内存 policy 命中时浏览器被杀死并报阻塞红错误，monitor 能看到根因 |
| P4 多轮复查 | issue closeout 前按缩水表、未使用/部分使用/散写表、生产 import/call site 和 guard 结果复查 | 表项达到 100%，父 issue 回填 PR、单测、行号对照、机械拷贝证明和剩余风险；上线和 smoke 不作为完成度前置 |

P0 未完成前，不得把 P1-P4 标记为可执行完成；P1-P4 中任何稳定语义、字段族、状态机或验收口径变化，必须先更新本 SPEC，再更新对应子 issue 和代码。

### 7.1 防请求风暴与防架构退化 closeout

Workbench 请求风暴或浏览器 freeze 类 issue 的关闭证据必须同时覆盖：

- 原入口用户动作：至少证明目标 Workbench 页面、provider/profile、session、prompt/command、traceId 或等价 turn id 与用户实际路径一致。
- 执行链路事实：OTel 或等价诊断能区分 admission、dispatch/provider、projection write/read、turn status read 和 browser visible ack；执行完成不自动等于 UI 完成。
- 请求族事实：report 或 runtime diagnostic 能展示 session/message/turn/trace/health 请求族的 fan-out、dedup、single-flight、recovery action 和 root cause，不只写“没有卡死”。
- 浏览器事实：web-probe 保存页面响应性、memory/freeze sample、requestfailed/pageerror/console 摘要和 analyzer finding；如果未触发 blocker，应说明没有达到 YAML policy，而不是删掉检测。
- 架构事实：修复 PR 应指向 Workbench runtime/projection/read model 或本专项迁移模块的接入点，并说明旧散写 retry/fallback/repair 是否删除或变薄；只改 web-probe/Playwright/analyzer/dashboard 不足以关闭业务修复 issue。

若当前 issue 明确只验收“没有请求风暴或浏览器卡死”，允许把 final response 投影为空、trace rows 为空等问题记录为非阻塞剩余风险；但必须说明该裁剪口径，不得把这类投影缺口写成已修复。

### 7.2 #1315 纠偏完成定义

#1315 不再以“降低 web-probe/Playwright 启动内存占用”作为修复方向；web-probe 的浏览器资源占用只作为观测 baseline。真正完成标准是：OpenCode 可整模块迁移的能力在 HWLAB Vue Workbench 中 100% 完成机械拷贝、适配和生产接入，且所有新增策略参数都由 YAML 或 runtime projection 控制。

| 编号 | 迁移模块 | OpenCode 对照能力 | HWLAB 目标接入点 | 完成口径 |
| --- | --- | --- | --- | --- |
| M01 | ErrorRuntime | typed error、diagnostic envelope、用户可见错误 | `web/hwlab-cloud-web/src/utils/workbench-error-runtime.ts`、Workbench store、消息面板 | REST/SSE/storage/health/projection 错误统一归一化并暴露 root cause/recovery action |
| M02 | RefreshQueueRuntime | queue、single-flight、cooldown、请求风暴抑制 | `workbench-refresh-runtime.ts`、`src/stores/workbench.ts` | Kafka replay、explicit snapshot/detail/history、health probe 进入同一 keyed queue |
| M03 | SseTransportRuntime | EventSource lifecycle、cursor、gap 分类 | `workbench-stream-transport.ts`、Workbench store | SSE reconnect 只触发 Kafka retention replay SSE 或 diagnostic，不触发 `/workbench/sync` 与旧 REST fan-out |
| M04 | ScopedKeyRuntime | scope key、cache key、trace key | `workbench-key.ts`、store/runtime modules | session/trace/message/part 的 key 生成规则生产路径共用 |
| M05 | TimelineRuntime | 稳定 row identity、增量替换、跨 session 隔离 | server-state reducer、timeline composables、Vue message rendering | 刷新和第二轮消息不产生堆叠、重复或串线 |
| M06 | StorageRuntime | safe storage、namespace、quota/security 降级 | `workbench-storage-runtime.ts`、store、session rail | localStorage/sessionStorage 访问不再直接散落在组件和 store |
| M07 | ScrollRuntime | bottom follow、anchor、pane 内滚动 | `useWorkbenchScrollRuntime.ts`、Conversation/Trace panels | 滚动状态由 reusable runtime 管理，页面不靠 document 无限拉长 |
| M08 | HealthRuntime | health probe cache、诊断投影 | `workbench-health-runtime.ts`、store refresh path | 健康探测不放大请求风暴，并输出可读诊断 |
| M09 | SessionCacheRuntime | bounded session cache、retain active scope | `workbench-session-cache.ts`、store reducer 后处理 | session cache 可裁剪，不误删 active/current trace |
| M10 | RealtimeEventCoalescing | 事件合并、sequence/order 可见 | `workbench-realtime-runtime.ts`、SSE handler | burst event 先合并再进入 store/reducer |
| M11 | OTel/RUM Evidence | root cause、request family、scoped key | runtime diagnostic fields、web-probe report | monitor 再次报红时能直接看到根因摘要 |
| M12 | SentinelFreezeRuntime | no fallback、no auto refresh、kill browser | UniDesk web-probe observe runner/analyzer | 页面无响应或页面有效内存超过 YAML policy 时 blocker red |
| M13 | BrowserMemoryBaseline | per-page baseline、effective memory | web-probe page runtime metrics | 多页面启动 RSS 不作为总额阻塞；阻塞按每页 baseline 后的有效内存判断 |
| M14 | ConfigProjection | YAML/source-of-truth 控参 | YAML policy parser、runtime projection | SPEC/源码不新增硬编码阈值、超时、并发、缓存容量 |
| M15 | SmokeRuntime | 原入口 smoke、第二轮消息 | `web-probe observe` JD01 `/workbench` | smoke 覆盖 `hi` 和 `看看有什么hwpod可用`，且页面保持可操作 |
| M16 | RolloutEvidence | PR、rollout、monitor/report evidence | GitHub issue/PR、JD01 rollout、monitor report | #1315 回填 PR、commit、rollout、web-probe report 和剩余风险 |

上述表格的“完成”必须同时满足源码存在、生产路径接入、最小验证通过和 issue 证据回填；只复制模块、只保留测试、只记录 TODO 或只调整探针资源参数均不得计为完成。
