|
| 1 | +# 2026-03-09 笔记(内部) |
| 2 | + |
| 3 | +> Internal-only note: do not publish from `docs-site/` or link from `mkdocs.yml`. |
| 4 | +
|
| 5 | +## 今日竞品/对标工作进展 |
| 6 | + |
| 7 | +- 已完成竞品更新扫描(内部留档):`docs/internal/competitive/2026-03-09-competitor-update-scan.zh-CN.md` |
| 8 | +- 今日落地的“可借鉴点”优先项:**Cron 重启 catch-up + 削峰语义(第一版)** |
| 9 | +- 补充:OpenClaw 近期修复了 `kimi-coding` 的工具 schema 兼容(Anthropic tools 需要保持 native),避免 tool 调用退化成 XML/plain-text 伪调用(见同上扫描) |
| 10 | + |
| 11 | +## Cron runner(第一版)落地内容 |
| 12 | + |
| 13 | +背景:LoopForge 之前的 `cron_create/cron_list/cron_cancel` 仅持久化定义,不会自动执行。为了把“重启补跑 + 削峰(stagger)”这类可靠性语义落到可用的最小闭环,本次新增一个**显式启用**的 cron runner(CLI worker)。 |
| 14 | + |
| 15 | +### 1) 新增 CLI 入口(显式运行) |
| 16 | + |
| 17 | +- `loopforge cron tick`:执行一次 tick(只跑一批 due job) |
| 18 | +- `loopforge cron worker`:常驻 worker(按 interval tick) |
| 19 | + |
| 20 | +### 2) Runner 支持的最小子集(安全默认) |
| 21 | + |
| 22 | +为了避免一开始把 schema 和执行面铺太大,先支持一个小而明确的子集: |
| 23 | + |
| 24 | +- Schedule: |
| 25 | + - `{ "kind": "every", "every_secs": <seconds> }` |
| 26 | + - `{ "kind": "at", "at_epoch_seconds": <epoch_seconds> }` |
| 27 | +- Action: |
| 28 | + - `{ "kind": "system_event", ... }` → 走 `event_publish` |
| 29 | + - `{ "kind": "channel_send", ... }` → 走 `channel_send`(使用 `delivery`/action 合并得到消息参数) |
| 30 | + |
| 31 | +### 3) 重启 catch-up + 削峰(stagger)语义(第一版) |
| 32 | + |
| 33 | +- **全局削峰**:每个 tick 只处理 `max_due_per_tick` 个 due job,避免重启瞬间把 backlog 一次性打爆。 |
| 34 | +- **每 job catch-up 裁剪**:对 `every` job,当 backlog slot 过大时,只保留最近 `max_catchup_slots_per_job` 个 slot,避免无界补跑。 |
| 35 | +- **中断恢复**:用 `running_*` 标记检测上次执行中断;重启后: |
| 36 | + - recurring job:把 `next_run_at` 回拨到中断的 `scheduled_at`,下一轮补跑 |
| 37 | + - one-shot/at job:不重放中断 slot,直接 disable(避免重复触发) |
| 38 | +- **失败保护**:连续失败达到阈值后自动 disable;失败重试至少延迟 `min_retry_delay_secs`,避免紧密重试风暴。 |
| 39 | +- **超时保护**:每个 job 有 `job_timeout_ms` 超时,防止单个 job hang 住 tick。 |
| 40 | + |
| 41 | +### 4) 状态字段(持久化) |
| 42 | + |
| 43 | +`rexos.cron.jobs` 的记录新增了运行期字段(有 `serde(default)`,兼容旧数据): |
| 44 | + |
| 45 | +- `last_run_at` / `next_run_at` |
| 46 | +- `last_status` / `consecutive_errors` |
| 47 | +- `running_started_at` / `running_scheduled_at` |
| 48 | + |
| 49 | +## 参考图(本地提取,不进 git) |
| 50 | + |
| 51 | +来源:`/Users/molei/Downloads/instagram-images(1).zip`(已解压 8 张到 `docs/internal/_assets/2026-03-09-instagram-images/`;今日精选 5 张如下)。 |
| 52 | + |
| 53 | +> 说明:`docs/internal/_assets/` 已加入 `.gitignore`,避免把参考图提交进仓库历史。 |
| 54 | +
|
| 55 | +1)  |
| 56 | +2)  |
| 57 | +3)  |
| 58 | +4)  |
| 59 | +5)  |
0 commit comments