OpenProgram Scheduler 与 Memory 接口
Scheduler 负责时间、执行、状态和结果;Memory 负责长期语义事实。两者通过稳定引用连接,但不共享状态文件或写入事务。
1. 目标与边界
一次性任务
保存带时区的 run_at,到期后只执行一次。旧的有日期 Commitments 迁移为此类型。
周期任务
复用现有五字段 cron 解析、owner 签名、冻结 sandbox policy 和非交互执行边界。
监控任务
使用 cron 周期执行观察 prompt。首版记录执行日志和状态,不承诺跨渠道 exactly-once 通知。
明确排除
Memory writer 不再推断任务;Memory 页面不显示 Commitments;Scheduler 不自动修改 Memory;不新增第二套执行器;不包含 Windows 专项、系统 keyring、项目管理、任务依赖或子任务。
2. 目标数据关系
workspace_id + memory_id 读取当前 Memory 内容。3. MemoryRef 公共契约
| 字段 | 规则 | 失败 |
|---|---|---|
workspace_id | 必须等于当前 Memory workspace 的稳定 ID。 | 拒绝跨 workspace 隐式读取。 |
memory_id | 创建和更新时必须解析到唯一 Topic block;内容在每次执行时重新读取。 | 写入时拒绝缺失、重复、跨 workspace 或格式错误的引用;执行前引用失效时任务失败,不回退到旧快照。 |
| 写入能力 | 引用只授予读取上下文,不授予 Memory 编辑权。 | 需要写入时仍走现有 Memory revision/transaction 接口。 |
4. 旧 Commitments 迁移
- 只迁移
open记录;有日期记录成为启用的一次性任务,执行时间为本地日期 09:00。 - 无日期记录成为暂停的一次性草稿,保留文本和 provenance,等待 owner 设置时间。
- 迁移成功后把原始
commitments.jsonl移到 Scheduler migration archive;重复启动不得重复创建。 - Memory writer 删除
record_commitments工具与提示,旧 runtime parser 只作为一次性迁移兼容代码保留。
5. UI 信息结构
独立 /scheduler 页面复用 Chats、Memory、Programs 与 MCP 的管理页结构:64px topbar 只显示一次页面标题,搜索和 Create 作为右侧工具;topbar 下方固定为左侧分类栏和右侧内容区。页面不设置第二个大标题或宣传式说明区,避免与 OpenProgram 其他管理页产生不同的字号、留白和操作层级。
页面结构
Scheduler | [Search] [Create][All tasks] | Scheduled tasks (n)[One-time] | 1 title · schedule · prompt · MemoryRef | status | actions[Recurring] | 2 title · schedule · prompt · MemoryRef | status | actions[Monitors] | 3 ...无任务时:右侧内容区显示三条可直接创建的较大建议行
任务行显示类型、执行计划、prompt 摘要、启用状态和 Memory 引用数量;执行计划使用等宽数据样式作为 Scheduler 的唯一专属视觉标识。Memory 页面只保留 Topics、Timeline、Recent 与 Core。
6. 采用、修改与拒绝
| 参考 | 处理 |
|---|---|
| 用户提供的 Scheduled tasks 页面截图 | 采用独立页面、Create、搜索和一次性/周期/监控的产品分类;不采用重复 hero 标题和大面积留白。页面直接复用 OpenProgram 的 ManagePageHeader、ManageRow、左右分栏尺寸与主题 token。 |
| 现有 OpenProgram cron | 保留执行安全机制与 cron 兼容入口,产品名称迁移为 Scheduler,并集成到常驻 worker。 |
| 原 Commitments/heartbeat | 拒绝继续作为 Memory 类型;只保留迁移读取,不保留 Memory tab、status 字段或特殊 heartbeat。 |
7. 实施 brief 与验收
实现范围限定为 Scheduler service、worker 集成、REST/UI、MemoryRef、旧数据迁移和 Memory 去 Commitments。公共 RED 覆盖三种 task、跨进程一次性 claim、claim 写入与 spawn 故障隔离、并发 CRUD、动态 MemoryRef、写入前解析、跨 workspace 拒绝、旧 cron/Commitments 幂等迁移和 Memory status 去 Commitments。
| 验收项 | 当前证据 |
|---|---|
| 专项 Python | Scheduler、权限、cron CLI、Memory routes/runtime 共 133 passed;Ruff 通过。 |
| 完整 Python | 5316 passed, 15 skipped, 2 deselected, 1 xfailed。剩余 4 项失败在基线提交 17db67dc 上逐项复现,分别属于既有 channel HTTP inventory 与 agentic harness 扫描。 |
| Web | 全量静态检查、Scheduler 检查与 tsc --noEmit 通过;独立页面包含首次加载错误、操作错误和 icon button 可访问名称。视觉验收要求只有一个页面标题、64px 管理页 topbar、搜索与主操作同栏、topbar 下方保持左栏分类和右栏内容、任务按可见顺序编号、空状态在右栏显示三条建议,并在默认 18100 App 中截图确认。 |
| 独立审查 | 规格审查通过;质量审查提出的权限、状态 claim、并发、MemoryRef、兼容入口与 UI 错误处理问题全部修复,复审通过。管理页结构统一修订另行完成规格 PASS;质量审查要求补充窄分栏重排、可区分操作名称和可执行视图逻辑检查,修复后 scoped re-review PASS。 |