400 lines
13 KiB
Markdown
400 lines
13 KiB
Markdown
# 自动任务、目标与调度 PRD
|
||
|
||
## 文档信息
|
||
|
||
| 项目 | 内容 |
|
||
| --- | --- |
|
||
| 状态 | 设计中 |
|
||
| 版本 | 0.1 |
|
||
| 日期 | 2026-08-13 |
|
||
| 依赖 | [自动化、监督与记忆平台总体设计](./automation-platform-architecture.md) |
|
||
|
||
## 1. 背景
|
||
|
||
GoodBuddy 当前的定时任务支持单次、每日和每周触发固定 Ask 提示,并保存任务和成果;
|
||
智能心跳支持每日或每周回顾有界的会话、任务和已确认记忆。两者尚不能表达事件触发、
|
||
目标、成功标准、预算、停止条件和安全恢复。
|
||
|
||
## 2. 产品边界
|
||
|
||
| 类型 | 用户意图 | 是否形成循环 |
|
||
| --- | --- | --- |
|
||
| 定时任务 | 在指定时间执行已知操作 | 否 |
|
||
| 事件任务 | 当明确事件发生时执行已知操作 | 否 |
|
||
| 目标任务 | 在预算内持续推进到可验证结果 | 是 |
|
||
|
||
智能心跳是特殊的定时观察任务。并行实验属于独立产品。
|
||
|
||
## 3. 已确认的产品决策
|
||
|
||
1. 自动化定义与每次运行分离,编辑计划不改变已启动 Run。
|
||
2. 第一阶段保留现有定时任务的 Ask 限制,Execute 分阶段开放。
|
||
3. Execute 自动化不能因无人值守而绕过现有审批、沙箱和工具控制。
|
||
4. 应用退出后不承诺继续运行,重启后只进行状态恢复和错过执行结算。
|
||
5. 目标任务必须有成功标准,以及预算或人工结束条件。
|
||
6. 模型可以提出计划,确定性状态机负责预算、停止、权限和恢复。
|
||
7. 同一计划默认最多一个活动 Run。
|
||
8. 后台任务可被背压延后,不能挤占用户正在等待的前台请求。
|
||
9. 结果未知的外部副作用步骤不自动重试。
|
||
10. 项目、知识库、记忆、目录和工具范围在保存和运行页持续可见。
|
||
|
||
## 4. 目标
|
||
|
||
- 支持单次、每日、每周、每月、工作日和受限 Cron。
|
||
- 支持任务完成、失败、会话完成等内部事件触发。
|
||
- 允许用户用自然语言生成结构化草稿,再检查后启用。
|
||
- 为目标任务建立有界的“观察、计划、行动、评估”循环。
|
||
- 提供幂等、租约、错过执行、取消、重试、恢复、预算和审计。
|
||
- 为后续并行实验和持续学习复用协议、指标和运行基础。
|
||
|
||
## 5. 非目标
|
||
|
||
- 第一阶段不提供任意节点、脚本和循环的通用 DAG 编辑器。
|
||
- 不允许模型编写并执行任意 Shell、SQL 或无限频率 Cron。
|
||
- 不支持应用退出后通过未安装的系统服务继续运行。
|
||
- 不把“模型说完成了”作为唯一成功标准。
|
||
- 不允许自动任务静默修改自身权限、触发器或预算。
|
||
- 不在目标循环中无限创建子任务或专家。
|
||
|
||
## 6. 创建与启用
|
||
|
||
用户可以先输入自然语言意图:
|
||
|
||
```text
|
||
每周五下午 5 点总结本项目本周完成和失败的任务,
|
||
列出下周三个优先事项,不要修改文件。
|
||
```
|
||
|
||
模型只生成草稿:
|
||
|
||
- 名称、说明和自动化类型。
|
||
- 触发器。
|
||
- 目标、输出和成功标准建议。
|
||
- 工作模式和 Runtime 建议。
|
||
- 数据范围。
|
||
- 预算、停止条件和通知。
|
||
|
||
草稿不能自动启用。用户必须检查结构化配置。
|
||
|
||
### 6.1 所有计划必填
|
||
|
||
- 名称、范围和类型。
|
||
- 触发器。
|
||
- 工作模式和 Runtime。
|
||
- 输入、输出和通知。
|
||
- 预算和数据保留。
|
||
- 知识库、记忆、目录和工具范围。
|
||
|
||
### 6.2 目标任务额外必填
|
||
|
||
- 目标描述。
|
||
- 至少一个成功标准。
|
||
- 约束。
|
||
- 最大轮数或截止时间。
|
||
- 每轮评估方式。
|
||
- 无进展处理。
|
||
|
||
### 6.3 启用前检查
|
||
|
||
- 时区和下一次运行时间可解析。
|
||
- 项目、目录、Runtime 和模型可用。
|
||
- Ask 没有写入或外部副作用要求。
|
||
- Execute 的工具和审批范围明确。
|
||
- 预算不是无界值。
|
||
- 事件来源存在且已启用。
|
||
- 目标任务存在停止条件。
|
||
|
||
## 7. 触发器
|
||
|
||
### 7.1 时间触发
|
||
|
||
```ts
|
||
type TimeTrigger =
|
||
| { type: 'once'; at: string; timezone: string }
|
||
| { type: 'daily'; localTime: string; timezone: string }
|
||
| {
|
||
type: 'weekly'
|
||
weekdays: number[]
|
||
localTime: string
|
||
timezone: string
|
||
}
|
||
| {
|
||
type: 'monthly'
|
||
day: number | 'last'
|
||
localTime: string
|
||
timezone: string
|
||
}
|
||
| {
|
||
type: 'cron'
|
||
expression: string
|
||
timezone: string
|
||
}
|
||
```
|
||
|
||
受限 Cron 只允许五字段,不支持秒、年份、宏、`L`、`W`、`#` 或供应商扩展。
|
||
Main 负责解析并展示未来五次运行时间,默认最小间隔为 15 分钟。
|
||
|
||
### 7.2 事件触发
|
||
|
||
第二阶段支持:
|
||
|
||
- `conversation.completed`
|
||
- `task.completed`
|
||
- `task.failed`
|
||
- `artifact.created`
|
||
- `knowledge.sync.completed`
|
||
- `magic_note.updated`
|
||
|
||
事件触发必须配置来源范围、确定性过滤、去重窗口、冷却时间和并发上限。
|
||
基础匹配不调用模型。
|
||
|
||
### 7.3 手动触发
|
||
|
||
- “立即运行”创建独立 Run,不改变下次计划时间。
|
||
- 多次点击使用调用级幂等键去重。
|
||
- 未保存的变更需先保存为新版本,或明确使用当前已发布版本。
|
||
|
||
### 7.4 错过执行
|
||
|
||
| 策略 | 行为 |
|
||
| --- | --- |
|
||
| `skip` | 记录跳过,不补跑 |
|
||
| `run_once` | 无论错过多少次,只补一次 |
|
||
| `catch_up_bounded` | 在数量和时间窗口上限内补跑 |
|
||
|
||
有界补跑默认最多 3 次、最多回溯 7 天。补跑同样受并发和预算控制。
|
||
|
||
### 7.5 时区和夏令时
|
||
|
||
- 保存 IANA 时区,不保存固定 UTC 偏移。
|
||
- 春季不存在的本地时间在当日第一个有效分钟运行。
|
||
- 秋季重复时间只运行一次。
|
||
- 系统时区变化不自动修改计划时区。
|
||
- UI 显示计划时区与本机时区差异。
|
||
|
||
## 8. 目标任务
|
||
|
||
### 8.1 目标模型
|
||
|
||
```ts
|
||
type AutomationObjective = {
|
||
statement: string
|
||
successCriteria: SuccessCriterion[]
|
||
constraints: Constraint[]
|
||
deadline?: string
|
||
}
|
||
|
||
type SuccessCriterion =
|
||
| { type: 'artifact_exists'; kind: string; minimumCount: number }
|
||
| { type: 'task_state'; taskId: string; expected: 'completed' }
|
||
| {
|
||
type: 'metric_threshold'
|
||
metric: string
|
||
operator: string
|
||
value: number
|
||
}
|
||
| { type: 'checklist'; items: string[] }
|
||
| { type: 'human_review' }
|
||
| {
|
||
type: 'model_rubric'
|
||
rubricId: string
|
||
minimumScore: number
|
||
}
|
||
```
|
||
|
||
模型 Rubric 不能是唯一标准,除非任务本质是开放内容评价且 UI 明确标注。
|
||
|
||
### 8.2 有界循环
|
||
|
||
```text
|
||
Observe
|
||
→ Plan next action
|
||
→ Check permissions and budget
|
||
→ Act or request approval
|
||
→ Evaluate progress
|
||
→ Complete, pause, revise or continue
|
||
```
|
||
|
||
每轮持久化观察摘要、下一步、实际任务或工具、成果、指标、预算、进展状态和
|
||
Supervisor 决策。只保存专门生成的结构化理由摘要,不保存隐藏推理。
|
||
|
||
### 8.3 无进展检测
|
||
|
||
出现任一情况进入 `attention_required`:
|
||
|
||
- 连续两轮没有指标改善或新成果。
|
||
- 重复提出相同下一步。
|
||
- 连续失败达到上限。
|
||
- 需要的输入或权限不可用。
|
||
- 剩余预算不足。
|
||
- Supervisor 判定目标或前提需要澄清。
|
||
|
||
默认暂停并请求用户选择,不自动扩大范围。
|
||
|
||
### 8.4 计划修订
|
||
|
||
目标任务可以建议修改步骤、缩小目标、请求输入、增加预算或改变 Runtime。
|
||
修改范围、预算、Runtime、工作模式或权限必须用户确认,并形成新版本或 Run 修订记录。
|
||
|
||
## 9. 工作模式与审批
|
||
|
||
### 9.1 Ask
|
||
|
||
- 默认只读。
|
||
- 只使用明确开放的只读数据工具。
|
||
- 不写文件、不执行命令、不发送消息、不修改远程数据。
|
||
- 输出进入成果和通知。
|
||
|
||
### 9.2 Execute
|
||
|
||
按以下顺序开放:
|
||
|
||
1. 有人值守,沿用逐工具审批。
|
||
2. 预批准低风险工具和参数范围。
|
||
3. 经过专项验证的内置无人值守模板。
|
||
|
||
即使预批准,也不能扩大目录和能力。高风险或越界动作进入 `waiting_approval`。
|
||
密码输入、支付、授权、删除、公开发布和生产变更不能预批准。
|
||
|
||
## 10. 预算与背压
|
||
|
||
```ts
|
||
type AutomationBudget = {
|
||
maximumDurationMs: number
|
||
maximumIterations: number
|
||
maximumModelCalls: number
|
||
maximumInputTokens?: number
|
||
maximumOutputTokens?: number
|
||
maximumToolCalls: number
|
||
maximumChildTasks: number
|
||
maximumArtifactBytes: number
|
||
maximumConcurrentChildren: number
|
||
}
|
||
```
|
||
|
||
建议默认值:
|
||
|
||
| 类型 | 最长时间 | 模型调用 | 子任务并发 |
|
||
| --- | --- | --- | --- |
|
||
| 定时 Ask | 5 分钟 | 4 | 1 |
|
||
| 心跳回顾 | 5 分钟 | 2 | 0 |
|
||
| 目标 Ask | 30 分钟 | 12 | 2 |
|
||
| 目标 Execute | 30 分钟 | 12 | 1 |
|
||
|
||
前台请求优先。后台使用独立并发池,达到上限时排队。高负载时低优先级心跳和维护任务
|
||
记录为 `deferred`,压力解除后有界恢复,不能一次性释放全部积压。
|
||
|
||
## 11. 重试、恢复与取消
|
||
|
||
| 失败类型 | 行为 |
|
||
| --- | --- |
|
||
| 瞬时网络或限流 | 指数退避,有界重试 |
|
||
| 模型格式错误 | 最多一次结构化修复 |
|
||
| 配置或权限错误 | 不重试,等待修复 |
|
||
| 无副作用的确定性工具失败 | 按工具策略重试 |
|
||
| 结果未知或已有外部副作用 | 不自动重试 |
|
||
|
||
应用退出时停止声明新 Run,取消可取消工作,活动 Run 标记为 `interrupted` 并保存安全
|
||
检查点。重启后用户可恢复、复制剩余步骤或放弃;结果未知步骤必须先人工核实。
|
||
|
||
暂停 Plan 只阻止新 Run,不终止当前 Run。取消 Run 必须传播到子任务和 Runtime,
|
||
但不能把已发生的外部副作用假装撤销。
|
||
|
||
## 12. 输出与通知
|
||
|
||
输出可保存为文字或文件成果、创建后续任务建议,或仅通知。后续可支持更新指定魔法笔记。
|
||
|
||
通知事件:
|
||
|
||
- Run 完成或失败。
|
||
- 等待审批。
|
||
- Supervisor 要求关注。
|
||
- 目标达成。
|
||
- 预算达到 80%。
|
||
- 连续无进展。
|
||
|
||
同一事件不同时显示重复页内横幅和全局通知。
|
||
|
||
## 13. 信息架构
|
||
|
||
计划列表显示名称、类型、范围、启用状态、下次运行、最近 Run、目标状态和需要关注数量。
|
||
|
||
计划详情页签:
|
||
|
||
- 概览。
|
||
- 目标与协议。
|
||
- 触发器。
|
||
- 权限与预算。
|
||
- 运行历史。
|
||
|
||
Run 详情展示总览、时间线、任务、审批、监督、指标、证据、成果以及实际读取的知识和记忆。
|
||
|
||
## 14. 数据模型建议
|
||
|
||
```ts
|
||
type AutomationPlan = {
|
||
id: string
|
||
projectId?: string
|
||
kind: 'scheduled_task' | 'heartbeat_review' | 'goal_loop'
|
||
name: string
|
||
description: string
|
||
status: 'draft' | 'active' | 'paused' | 'archived'
|
||
currentVersion: number
|
||
nextRunAt?: string
|
||
createdAt: string
|
||
updatedAt: string
|
||
}
|
||
|
||
type AutomationPlanVersion = {
|
||
planId: string
|
||
version: number
|
||
trigger: TriggerPolicy
|
||
objective?: AutomationObjective
|
||
protocol: ExecutionProtocol
|
||
budget: AutomationBudget
|
||
approvalPolicy: ApprovalPolicy
|
||
supervisorPolicy?: SupervisorPolicy
|
||
memoryBinding: MemoryBinding
|
||
}
|
||
```
|
||
|
||
状态、范围、下次运行、版本和索引字段使用显式列;版本化协议可以使用经过共享 Schema
|
||
验证的 JSON。
|
||
|
||
## 15. 安全要求
|
||
|
||
1. 所有输入由共享 Zod Schema 验证。
|
||
2. Main 重新验证项目、目录、Runtime、工具、知识库和记忆分区归属。
|
||
3. Renderer 不可直接声明 Run 完成或批准工具。
|
||
4. 自动化提示、事件、记忆和成果都视为不可信数据。
|
||
5. 事件过滤不执行用户 JavaScript、SQL 或无限复杂表达式。
|
||
6. Cron 有复杂度和最小间隔限制。
|
||
7. 自动化不能读取未绑定知识库、桌面上下文或其他项目记忆。
|
||
8. 日志和通知对私人内容、密钥和工具输出有界脱敏。
|
||
|
||
## 16. 实施顺序
|
||
|
||
1. 统一现有 Schedule 和 Heartbeat 的 Run 视图。
|
||
2. 增加幂等、租约、月度、工作日、受限 Cron、错过执行和未来运行预览。
|
||
3. 建立内部持久事件、过滤、冷却和去重,首期只支持 Ask。
|
||
4. 上线目标 Ask、有界循环、无进展检测和人工暂停。
|
||
5. 接入会话监督。
|
||
6. 再开放有人值守和预批准低风险 Execute。
|
||
|
||
## 17. 验收标准
|
||
|
||
- [ ] 支持单次、每日、每周、每月、工作日和受限 Cron。
|
||
- [ ] UI 显示计划时区和未来五次运行时间。
|
||
- [ ] 夏令时不会造成计划漂移或双跑。
|
||
- [ ] 同一计划同一时间点只产生一个 Run。
|
||
- [ ] 错过执行按配置跳过、补一次或有界补跑。
|
||
- [ ] 手动运行不改变下次计划时间。
|
||
- [ ] Ask 自动化在 Runtime 边界拒绝写工具和外部副作用。
|
||
- [ ] 目标任务必须有成功标准和停止条件。
|
||
- [ ] 每轮都有观察、行动、评估和预算记录。
|
||
- [ ] 连续无进展会暂停,不无限循环。
|
||
- [ ] 达到预算使用 `budget_exceeded`,不伪装为成功。
|
||
- [ ] 设置变化不影响已启动 Run。
|
||
- [ ] 重启后不自动重放结果未知的副作用步骤。
|
||
- [ ] 后台任务排队时不挤占前台模型请求。
|