Files
sanguo_moziplus_v2/docs/design/v2.8-state-enhancement.md
T
2026-05-18 22:36:43 +08:00

9.4 KiB
Raw Blame History

v2.8 状态增强 + 前端易用性优化

状态: 设计中
日期: 2026-05-18
作者: 庞统


📋 概述

问题

  1. v2.7 状态机缺少 pausedescalatedwaiting_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 0archived_at TEXT
  • Task dataclass 新增:archived: int = 0archived_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_humanTERMINAL_STATUSES 不变;MANUAL_STATUSES 加 paused/escalated/waiting_humanschema 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 新增归档 APIcreate_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. 部署上线