1
0
Files
DiAL/openspec/changes/checker-observation/proposal.md

3.4 KiB
Raw Blame History

Why

各 checker 在执行过程中收集了丰富的结构化数据HTTP 状态码/headers/body、ICMP 延迟/丢包率、LLM token 用量/首 token 延迟等),但 CheckResult 仅有一个 statusDetail: string | null 字段所有观测数据被压缩为人可读字符串后丢弃。这导致排障时无法获取失败上下文HTTP 502 返回了什么 bodyCMD 的 stderr 输出了什么、无法对历史观测数据做结构化查询和趋势分析ICMP 丢包率变化、LLM token 消耗趋势)。

What Changes

  • BREAKING: CheckResult 移除 statusDetail 字段,新增 detail: string | nullobservation: Record<string, unknown> | null
  • BREAKING: 存储层 check_results 表移除 status_detail 列,新增 observation TEXTJSON 格式)
  • 每个 checker 在 execute 返回时组装结构化 observation 对象,包含该类型特有的观测数据(含截断策略);可收集的负向结果保留 observation仅无法形成领域观测时返回 null
  • CheckerDefinition 接口新增 buildDetail(observation) 方法,从 observation 动态构造人可读摘要
  • API 序列化层根据 target type 调用对应 checker 的 buildDetail,动态生成 detail 字段返回给前端
  • 前端展示层将 statusDetail 引用改为 detail,逻辑不变

Capabilities

New Capabilities

  • checker-observation: 定义 observation 数据模型、各 checker 的 observation schema、截断策略、序列化/反序列化规则

Modified Capabilities

  • checker-runner-abstraction: CheckerDefinition 接口新增 buildDetail 方法CheckResult 类型变更statusDetail → detail + observation
  • probe-engine: checker 执行结果写入字段从 status_detail 改为 observationdetail 不进入存储层
  • probe-data-store: check_results 表 schema 变更status_detail → observationinsert/query 方法适配新字段;同步修正现有 spec 中已过时的 target_id 类型为当前代码实际使用的 TEXT
  • probe-api: CheckResult API 合约变更statusDetail → detail + observation序列化层需根据 target type 动态构造 detail
  • cmd-checker: CMD 执行结果改为返回 observationdetail 由 buildDetail 构造
  • tcp-checker: TCP 执行和 banner 摘要改为通过 observation/detail 表达
  • udp-checker: UDP 执行和响应摘要改为通过 observation/detail 表达
  • icmp-checker: Ping/ICMP 摘要改为通过 observation/detail 表达API registry type 仍为 ping
  • llm-checker: LLM 执行期 observation 与持久化 preview 分层,状态摘要改为 detail
  • target-detail-drawer: 记录面板详情列从 statusDetail 改为 detail

Impact

  • 后端: 7 个 checker 的 execute/buildDetail 需改造返回 observationLLM 还涉及 types.ts、observation.ts、expect.ts 的执行期/持久化结构分层engine.ts/store.ts/helpers.ts/routes 适配新字段
  • 前端: 2 处源码 statusDetail 引用改为 detailhistory-table-columns.tsx、OverviewTab.tsx相关测试 fixture 同步更新
  • 存储: SQLite DDL 变更不做数据迁移项目未上线target_id 继续使用当前代码实际的 TEXT 类型
  • 依赖: 无新增依赖observation 使用 JSON.stringify/JSON.parse 序列化
  • 测试: 所有涉及 CheckResult、StoredCheckResult、CheckerDefinition mock、API dashboard/history、各 checker execute/buildDetail、前端展示的测试需适配新字段