diff --git a/docs/design/v2.8-state-enhancement.md b/docs/design/v2.8-state-enhancement.md new file mode 100644 index 0000000..aeaa5c8 --- /dev/null +++ b/docs/design/v2.8-state-enhancement.md @@ -0,0 +1,264 @@ +# v2.8 状态增强 + 前端易用性优化 + +> 状态: 设计中 +> 日期: 2026-05-18 +> 作者: 庞统 + +--- + +## 📋 概述 + +### 问题 +1. v2.7 状态机缺少 `paused`、`escalated`、`waiting_human` 三个 v1.0 已有的状态 +2. 前端缺少「已取消」「已归档」筛选,无法管理已完成任务 +3. 卡片没有快捷操作按钮,每次操作需点进 Modal +4. 项目切换在 header 里,不在筛选栏,操作不便 + +### 目标 +1. 补齐 3 个缺失状态(paused/escalated/waiting_human) +2. 加归档机制(archived 字段 + 一键归档) +3. 前端两行筛选栏(仿 v1.0 布局)+ 卡片快捷按钮 +4. 项目下拉移入筛选栏 + 支持"全部任务"跨项目聚合 +5. 新建军令 title 可选(后端自动生成) + +--- + +## 一、状态机增强 + +### 1.1 新增状态定义 + +| 状态 | 中文 | 颜色 | 类型 | 说明 | +|------|------|------|------|------| +| `paused` | 已暂停 | `#818cf8` 紫 | 手动 | 用户主动暂停,不参与聚合、不超时回收 | +| `escalated` | 已升级 | `#ff5270` 红 | 手动 | Agent 升级求助,需人工介入 | +| `waiting_human` | 等待人工 | `#f59e0b` 橙 | 中间态 | Checkpoint 等人工确认后自动推进 | + +### 1.2 完整状态转换表 + +``` +pending: [claimed, cancelled] +claimed: [working, pending, cancelled] +working: [review, blocked, failed, paused, escalated, cancelled] +paused: [working, cancelled] ← 新增 +review: [done, pending, failed, escalated, cancelled] +blocked: [pending, escalated, cancelled] +failed: [pending, escalated, cancelled] +escalated: [working, pending, cancelled] ← 新增 +waiting_human: [working, done, cancelled] ← 新增 +done: [] +cancelled: [] +``` + +### 1.3 各状态设计细节 + +#### paused(已暂停) +- **触发**:用户点暂停按钮(卡片右上角 ⏸) +- **恢复**:用户点 ▶ 继续 → 回到 working +- **调度**:Ticker 跳过 paused 状态的任务(不 claim、不超时回收) +- **聚合**:paused 不参与父 Task 聚合(同 cancelled) +- **超时**:无超时,无限等待用户恢复 + +#### escalated(已升级) +- **触发**:Agent 遇到无法处理的问题主动升级(通过 status API) +- **恢复**:用户介入后手动恢复到 working 或 pending +- **调度**:Ticker 跳过 escalated 状态 +- **聚合**:escalated 视同 working 参与父 Task 聚合(表示活跃但需关注) +- **UI**:卡片红色高亮 + ⚠️ 图标 +- **DB**:复用现有 `escalated INTEGER` 字段作为标志位 + +#### waiting_human(等待人工) +- **触发**:Agent 执行到 Checkpoint 节点,通过 status API 设置 +- **推进**:人工确认后(approve/reject),API 推进到 working 或 done +- **调度**:Ticker 跳过 waiting_human(等人工,不等超时) +- **聚合**:waiting_human 视同 working 参与父 Task 聚合 +- **UI**:卡片橙色高亮 + 🔔 图标 + Checkpoint 面板入口 + +### 1.4 聚合规则更新 + +``` +父 Task 聚合优先级(高→低): + escalated > waiting_human > review > working/claimed > pending > failed > blocked + +不参与聚合: + paused, cancelled(手动状态) + +全部 done → done +``` + +### 1.5 Ticker 调度规则 + +| 状态 | Ticker 行为 | +|------|------------| +| pending | 正常 claim 调度 | +| claimed | 正常超时回收 | +| working | 正常超时监控 | +| review | 正常 review 调度 | +| **paused** | **跳过** | +| **escalated** | **跳过** | +| **waiting_human** | **跳过** | +| done | 终态 | +| failed | 不调度 | +| blocked | 不调度 | +| cancelled | 终态 | + +--- + +## 二、归档机制 + +### 2.1 后端 + +- `tasks` 表新增:`archived INTEGER DEFAULT 0`、`archived_at TEXT` +- `Task` dataclass 新增:`archived: int = 0`、`archived_at: Optional[str] = None` +- `Blackboard` 新增方法: + - `archive_task(task_id)` → 设置 archived=1 + - `unarchive_task(task_id)` → 设置 archived=0 + - `archive_all_done()` → 批量归档 done + cancelled 的任务 +- API 新增: + - `POST /api/projects/{pid}/tasks/{tid}/archive` — 归档/取消归档 + - `POST /api/projects/{pid}/tasks/archive-done` — 一键归档 +- 列表查询 API 加 `?archived=0` 默认过滤 + +### 2.2 前端 + +- 筛选栏第 1 行:活跃/归档/全部 切换 +- 一键归档按钮:仅在有可归档任务时显示 +- 卡片上 done 状态的任务显示 `📦 归档` 按钮 + +--- + +## 三、前端易用性改造 + +### 3.1 筛选栏两行布局 + +**第 1 行(项目 + 归档控制)**: +``` +[📦 项目▾] [活跃] [归档] [全部] 活跃12 · 归档5 · 共17 [📦 一键归档] +``` + +- 项目下拉选项:`📋 全部任务`("")→ `📁 一般任务`("projects")→ 动态项目列表 +- 全部任务:聚合所有项目的 tasks(loadV2Tasks 遍历所有项目合并) +- 活跃/归档/全部:类似 v1.0 的 archive-bar + +**第 2 行(状态筛选 + 搜索)**: +``` +[📋全部] [📋待认领] [👤已认领] [⚔️执行中] [🔍审查中] [⏸已暂停] [⚠️已升级] [🔔等待人工] [✅已完成] [❌失败] [🚧阻塞] [🚫已取消] 🔍[搜索框] +``` + +### 3.2 卡片改造 + +**暂停按钮(右上角)**: +- working/claimed/claimed → 右上角 `⏸` 小图标按钮 +- paused → 右上角 `▶` 恢复按钮 +- escalated/waiting_human → 右上角对应图标(⚠️/🔔) +- 其他状态不显示 + +**底部动作按钮**(替换"详情 →"): + +| 状态 | 右侧按钮 | +|------|----------| +| pending | `👤 认领` `🚫 取消` | +| claimed | `⚔️ 开始` `🚫 取消` | +| working | `🔍 提审` `⏸ 暂停` `🚫 取消` | +| paused | `▶ 继续` `🚫 取消` | +| review | `✅ 通过` `🔄 打回` `❌ 驳回` | +| escalated | `▶ 继续` `🔄 重置` `🚫 取消` | +| waiting_human | `✅ 确认` `❌ 驳回` | +| done | `📦 归档` | +| failed | `🔄 重试` | +| blocked | `🔄 解除` `🚫 取消` | +| cancelled | `📦 归档` | + +- 点击详情:改为点击卡片标题区域打开 Modal +- 动作按钮直接调 API + toast 反馈 + +### 3.3 新建军令 title 自动生成 + +- 前端:title 标注"可选",placeholder 改"不填将自动生成" +- 后端:`create_task` 路由,若 title 为空,取 description 前 30 字 + "…" + +--- + +## 四、影响范围 + +### 后端(6 文件) + +| 文件 | 改动 | +|------|------| +| `models.py` | Task 加 archived/archived_at 字段;from_row 已有防御 | +| `db.py` | CHECK 约束加 paused/escalated/waiting_human;TERMINAL_STATUSES 不变;MANUAL_STATUSES 加 paused/escalated/waiting_human;schema migration | +| `operations.py` | 新增 archive_task/unarchive_task/archive_all_done 方法;update_status 支持 paused/escalated/waiting_human | +| `queries.py` | compute_parent_status 更新聚合规则(escalated/waiting_human 视同 working) | +| `blackboard_routes.py` | 新增归档 API;create_task title 自动生成;update_status 支持新状态 | +| `ticker.py` | 调度跳过 paused/escalated/waiting_human;聚合规则更新 | + +### 前端(5 文件) + +| 文件 | 改动 | +|------|------| +| `EdictBoard.tsx` | 两行布局 + 项目下拉 + 卡片动作按钮 + 暂停/归档按钮 + 新状态筛选 | +| `TaskModal.tsx` | VALID_TRANSITIONS 更新 + 新状态按钮 | +| `App.tsx` | 移除 header 项目 select | +| `store.ts` | loadV2Tasks 全项目聚合 + 归档 state/action + 新状态支持 | +| `api.ts` | 新增 archive/pause/escalate/waiting_human API | + +### 测试 + +| 文件 | 覆盖 | +|------|------| +| `test_blackboard.py` | 新状态的 CRUD + 转换 | +| `test_v27_subtasks.py` | 新状态聚合规则 | +| 新增 `test_state_enhancement.py` | paused/escalated/waiting_human + 归档 E2E | + +--- + +## 五、与 M3 Checkpoint 的关系 + +### M3 已设计内容 +- 三种 Checkpoint 类型:验证/决策/执行 +- ArtifactPanel 成果物面板 +- 前端代码已回滚(ArtifactPanel.tsx、CheckpointPanel.tsx 已删) + +### v2.8 为 M3 铺路 +- `waiting_human` 状态是 M3 Checkpoint 的前置条件 +- Checkpoint 触发 → Agent 设置 `waiting_human` → 用户在卡片/Modal 看到确认入口 +- M3 只需在前端加 CheckpointPanel 组件 + 后端加 checkpoint 数据模型 + +### M3 剩余工作(v2.8 状态增强完成后) + +| M3 任务 | 说明 | 依赖 | +|---------|------|------| +| Checkpoint 数据模型 | `checkpoints` 表 + API | v2.8 waiting_human 状态 | +| CheckpointPanel 前端 | 验证/决策/执行三种面板 | v2.8 卡片改造 | +| ArtifactPanel 前端 | 成果物卡片展示 + 下载 | 无 | +| Agent Checkpoint 触发 | Agent 写 checkpoint 数据 + 设置 waiting_human | v2.8 状态 | +| Ticker Checkpoint 超时 | waiting_human 超时提醒 | v2.8 状态 | +| M3 设计文档更新 | 更新到 v2.8 状态机 | v2.8 完成 | + +--- + +## 六、实施计划 + +### 阶段 1:后端状态增强(核心) +1. `db.py` — schema migration + CHECK 约束 + MANUAL_STATUSES +2. `models.py` — Task 加 archived/archived_at +3. `operations.py` — 归档方法 + 状态转换支持 +4. `queries.py` — 聚合规则更新 +5. `blackboard_routes.py` — 归档 API + title 自动生成 +6. `ticker.py` — 调度规则更新 +7. 测试验证 + +### 阶段 2:前端筛选栏 + 项目下拉 +1. `store.ts` — 全项目聚合 + 归档 state +2. `EdictBoard.tsx` — 两行布局 + 项目下拉 +3. `App.tsx` — 移除 header select + +### 阶段 3:卡片动作按钮 +1. `EdictBoard.tsx` — 卡片右上角暂停 + 底部动作按钮 +2. `TaskModal.tsx` — 新状态转换按钮 +3. `api.ts` — 新 API + +### 阶段 4:集成测试 + 部署 +1. 新状态 E2E 测试 +2. 前端构建验证 +3. 发司马懿评审 +4. 部署上线