1
0
Files
DiAL/openspec/changes/archive/2026-05-11-simplify-judgment-model/design.md

64 lines
2.7 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.
## Context
当前系统采用 `success` + `matched` 两层判定模型:
- `success`拨测是否成功完成HTTP 收到响应 / Command 正常退出)
- `matched`expect 规则是否匹配
- UP = `success AND matched`
但实际代码中 `fetcher.ts``command-runner.ts` 均将 `success` 设为 `expectResult.matched`,导致 `success ≡ matched`。两层模型从未真正生效,`success` 字段是冗余的。
同时发现两个附带问题:
1. 分组排序使用 `ORDER BY grp`字母序spec 要求按 YAML 首现顺序
2. `command-runner` 未设置 `stdin: "ignore"`spec 要求禁止写入 stdin
## Goals / Non-Goals
**Goals:**
- 移除 `success` 字段,将判定模型简化为 `matched` 单层判定
- 修复分组排序为 YAML 首现顺序
- 确保 command-runner 禁用 stdin
**Non-Goals:**
- 不涉及 `success` 以外的其他字段变更
- 不涉及前端 UI 样式或布局调整
- 不涉及新增功能特性
- 不处理代码质量问题P2/P3 级别留给后续 change
## Decisions
### 1. 判定模型简化为 matched 单层
**选择**: 移除 `success`,仅保留 `matched`
**理由**: `success``matched` 在实现中始终同值,没有独立语义。执行失败(网络错误、超时、进程崩溃)和 expect 不匹配都统一为 `matched=false`,通过 `failure.kind` 区分(`"error"` vs `"mismatch"`)。
**替代方案**: 修复 `success` 使其真正独立(如 HTTP 返回 404 时 success=true, matched=false。被否决——当前项目不需要区分"请求成功但内容不符"和"请求失败",单层判定更简洁。
### 2. 可用率计算基于 matched
**选择**: `availability = matched=true 的记录数 / 总记录数 * 100`
avgDurationMs 仅计算 `matched=true` 记录的平均耗时:`AVG(CASE WHEN matched = 1 THEN duration_ms END)`
**理由**: 用户关心的是"健康请求"的性能趋势,排除失败请求的干扰。
### 3. 分组排序改为按 id 排序
**选择**: `ORDER BY CASE WHEN grp='default' THEN 0 ELSE 1 END, id`
**理由**: 目标按 YAML 顺序插入,`id` 自增,`ORDER BY id` 天然等于 YAML 首现顺序。无需额外存储排序权重。
### 4. 数据库迁移策略
**选择**: 直接删除旧数据库文件重新创建
**理由**: 项目未上线无向前兼容要求。SQLite 不支持 `DROP COLUMN`(需重建表),直接删除是最简方案。
## Risks / Trade-offs
- [风险] 数据库 schema 变更导致已有数据丢失 → 项目未上线,可接受
- [风险] 前端 API 响应格式变更 → 前端代码同步修改,全量测试覆盖
- [风险] 大量文件同时修改可能引入遗漏 → 通过 `bun run verify` 全量验证