refactor: 移除 success 字段,简化为 matched 单层判定模型
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 卡片状态展示
|
||||
系统 SHALL 在卡片上展示目标的 UP/DOWN 状态。
|
||||
|
||||
#### Scenario: 卡片 UP 状态
|
||||
- **WHEN** 目标最近一次拨测 matched=true
|
||||
- **THEN** 系统 SHALL 显示绿色状态点
|
||||
|
||||
#### Scenario: 卡片 DOWN 状态
|
||||
- **WHEN** 目标最近一次拨测 matched=false
|
||||
- **THEN** 系统 SHALL 显示红色状态点
|
||||
@@ -0,0 +1,26 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 命令执行
|
||||
系统 SHALL 使用 Bun.spawn 执行命令类型目标,继承父进程环境变量并支持覆盖。
|
||||
|
||||
#### Scenario: 禁止 stdin 交互
|
||||
- **THEN** 系统 MUST 设置 stdin 为 "ignore",防止子进程等待标准输入而阻塞
|
||||
|
||||
### Requirement: 结果记录
|
||||
系统 SHALL 记录命令执行的完整结果。
|
||||
|
||||
#### Scenario: 命令成功执行
|
||||
- **WHEN** 命令正常退出
|
||||
- **THEN** 系统 SHALL 记录 durationMs、statusDetail="exitCode=N",并进入 expect 校验
|
||||
|
||||
#### Scenario: 命令启动失败
|
||||
- **WHEN** 命令无法启动
|
||||
- **THEN** 系统 SHALL 记录 matched=false,并在 failure 中写入 kind=error 和具体错误信息
|
||||
|
||||
#### Scenario: 命令超时
|
||||
- **WHEN** 命令执行超过 timeout 限制
|
||||
- **THEN** 系统 MUST 终止该子进程,记录 matched=false,并在 failure 中写入命令超时信息
|
||||
|
||||
#### Scenario: 输出超限
|
||||
- **WHEN** 命令输出超过 maxOutputBytes 限制
|
||||
- **THEN** 系统 MUST 停止收集输出并终止该检查,记录 matched=false,并在 failure 中写入输出超限信息
|
||||
@@ -0,0 +1,17 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 目标列表 API
|
||||
系统 SHALL 提供 `GET /api/targets` 端点,返回所有目标及其最新状态。
|
||||
|
||||
#### Scenario: recentSamples.up 判定
|
||||
- **WHEN** 系统返回 recentSamples 数组
|
||||
- **THEN** 每个元素的 `up` 字段 SHALL 为 `matched === true`
|
||||
|
||||
### Requirement: 共享类型
|
||||
系统 SHALL 在 `src/shared/api.ts` 中定义前后端共享的 TypeScript 类型。
|
||||
|
||||
#### Scenario: CheckResult 类型
|
||||
- **THEN** `CheckResult` 类型 SHALL 包含 timestamp、matched、durationMs、statusDetail、failure 字段,不包含 success 字段
|
||||
|
||||
#### Scenario: RecentSample 类型
|
||||
- **THEN** `RecentSample` 类型 SHALL 包含 timestamp、durationMs、up 字段,其中 up 为 boolean 且等于 matched
|
||||
@@ -0,0 +1,12 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 状态判定与展示
|
||||
系统 SHALL 根据最近一次拨测结果展示目标状态。
|
||||
|
||||
#### Scenario: 目标 UP 状态
|
||||
- **WHEN** 目标最近一次拨测 matched=true
|
||||
- **THEN** 系统 SHALL 显示绿色 UP 状态
|
||||
|
||||
#### Scenario: 目标 DOWN 状态
|
||||
- **WHEN** 目标最近一次拨测 matched=false
|
||||
- **THEN** 系统 SHALL 显示红色 DOWN 状态
|
||||
@@ -0,0 +1,41 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 数据库表结构
|
||||
系统 SHALL 使用 SQLite 存储 targets 和 check_results 两张表。
|
||||
|
||||
#### Scenario: check_results 表结构
|
||||
- **THEN** check_results 表 SHALL 包含 id(INTEGER PRIMARY KEY AUTOINCREMENT)、target_id(INTEGER NOT NULL)、timestamp(TEXT NOT NULL)、matched(INTEGER NOT NULL)、duration_ms(REAL)、status_detail(TEXT)、failure(TEXT)列,不包含 success 列
|
||||
|
||||
### Requirement: 结果写入
|
||||
系统 SHALL 将每次拨测结果插入 check_results 表。
|
||||
|
||||
#### Scenario: 插入结果记录
|
||||
- **THEN** 系统 SHALL 插入一条包含 target_id、timestamp、matched、duration_ms、status_detail、failure 的记录
|
||||
|
||||
### Requirement: 可用率计算
|
||||
系统 SHALL 计算目标在指定时间范围内的可用率。
|
||||
|
||||
#### Scenario: 可用率定义
|
||||
- **THEN** 系统 SHALL 返回 matched=true 的记录数占总记录数的百分比
|
||||
|
||||
#### Scenario: 平均耗时
|
||||
- **THEN** 系统 SHALL 返回 duration_ms 的平均值(仅计算 matched=true 的记录)
|
||||
|
||||
### Requirement: 目标排序
|
||||
系统 SHALL 按分组排序返回目标列表。
|
||||
|
||||
#### Scenario: 分组排序规则
|
||||
- **WHEN** 查询目标列表
|
||||
- **THEN** "default" 分组 SHALL 排在最前,其余分组 SHALL 按 YAML 配置中首次出现的顺序(即 id 自增顺序)排列
|
||||
|
||||
### Requirement: 最近采样查询
|
||||
系统 SHALL 提供获取目标最近 N 条采样记录的方法。
|
||||
|
||||
#### Scenario: 采样记录返回字段
|
||||
- **THEN** 系统 SHALL 返回最多 N 条记录,每条包含 timestamp、duration_ms、matched
|
||||
|
||||
### Requirement: 汇总查询
|
||||
系统 SHALL 提供全局汇总统计。
|
||||
|
||||
#### Scenario: UP/DOWN 判定
|
||||
- **THEN** 系统 SHALL 基于 latestCheck.matched 判定目标 UP 或 DOWN:matched=true 为 UP,matched=false 为 DOWN
|
||||
@@ -0,0 +1,21 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 结果记录
|
||||
系统 SHALL 在每次 checker 完成后,将结果写入 SQLite 数据存储,包含 target_id、timestamp、matched、duration_ms、status_detail、failure 字段。
|
||||
|
||||
#### Scenario: 执行成功且 expect 全部匹配
|
||||
- **WHEN** checker 执行成功且所有 expect 规则匹配
|
||||
- **THEN** 系统 SHALL 记录 matched=true、duration_ms、status_detail,failure 为 null
|
||||
|
||||
#### Scenario: 执行失败(网络错误、超时、进程异常)
|
||||
- **THEN** 系统 SHALL 记录 matched=false、failure.kind="error" 和具体错误信息
|
||||
|
||||
#### Scenario: expect 不匹配
|
||||
- **THEN** 系统 SHALL 记录 matched=false、failure.kind="mismatch" 和具体不匹配信息
|
||||
|
||||
### Requirement: 输出读取限制
|
||||
系统 SHALL 对 command checker 的 stdout/stderr 输出设置大小限制。
|
||||
|
||||
#### Scenario: 输出超过 maxOutputBytes
|
||||
- **WHEN** 子进程输出超过 maxOutputBytes 限制
|
||||
- **THEN** 系统 MUST 停止读取并记录 matched=false 和结构化输出超限错误
|
||||
@@ -0,0 +1,8 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 分组排序
|
||||
系统 SHALL 对非 default 分组按 YAML 配置中的首次出现顺序排列。
|
||||
|
||||
#### Scenario: 非默认分组排序
|
||||
- **WHEN** 查询目标列表
|
||||
- **THEN** 非 default 分组 SHALL 按 id 自增顺序排列(即 YAML 配置中的首次出现顺序),而非字母序
|
||||
Reference in New Issue
Block a user