Task System Reality Map · 2026-03-19
任务系统统一现状图:飞书日推、Today-Focus、todo-board、Public Pages 的真实链路与收敛顺序
这次不再抽象讲“系统应该统一”,而是把当前已经在跑的真实链路摊开:到底是谁在定义任务语义、谁只是做通知、哪些页面在看同一层、哪些页面其实看的是完全不同的层,以及为什么你会感到“有的地方有,有的地方没有”。
结论:问题核心不是页面多,而是状态契约没统一
当前主调度器:OpenClaw
GitHub Actions:9 条 workflow 均为 disabled_manually
目标:先统一真相层,再统一通知和看板
127
`todo-board` 当前从 Obsidian 读到的任务总数
1 / 0
`Today-Focus` 当前是 1 条 focus、0 条待确认
1489
`priority.json` 当前导出的全仓优先级任务数
4+
并行存在的任务语义产物层数,不是一个统一 read model
飞书不是主问题
飞书现在主要只是输出层。它之所以让你感觉“发得不对”,是因为上游的 `Today-Focus`、`public pages`、`todo-board` 没有共享同一套状态定义。
Today-Focus 已经是最接近主入口的层
`09:10` 的 daily push 真实读取的是 `Today-Focus.md`,而不是昨日 `DailyRecord`。但它目前只保证“有 Top1”,还没保证这条 Top1 的治理字段完整。
todo-board 不是没接入,而是接得太独立
它已经能读 `TODO-Inbox`、`Today-Focus`、review、`DailyRecord Top1`,是最像全局驾驶舱的一层。但它使用自己的 parser 和 sync,不是公共站点唯一共享的数据源。
最小正确做法
不是立刻重写所有页面,而是先导出一份唯一 `task-state.json`。让 `Today Focus / Daily / Priority / todo-board / Feishu` 都从同一个任务状态主表切片,而不是各自重解析 markdown。
As-Is Flow
当前真实链路:谁在跑、谁在改、谁在看
现在的真实系统并不是“没有主链”,而是已经有主链,但主链外还残留了多个各自解释任务的消费者。
主调度器已经是 OpenClaw;真相层主要是 `TODO-Inbox`、`Today-Focus`、`DailyRecord`;问题出在这几个输出层没有共享同一个任务语义核心。
这张图最关键的点是:当前至少有 3 个消费者在独立解释同一批 Obsidian 任务文件,而 `09:10 daily push` 本身甚至还在发送前回写真相层,所以“通知层看起来不对”其实是上游语义层未统一。
Surface Split
为什么你会感觉“有的地方有,有的地方没有”
| 入口 |
主数据源 |
它展示的语义 |
为什么会让你误会 |
| Today Focus |
`Today-Focus.md` |
今天 1-3 条真正需要你动手或确认的事 |
它已经是“人工入口”,但目前没强制补齐所有治理字段,所以会出现“有 Top1,但你仍不知道为什么是它”的半成品。 |
| Daily |
`report-*.data.js` + `priority.json` + day json |
日报 / issue / 报告运营态 |
它名字像“今天要做什么”,但本质上不是 canonical task list,所以会和 Today Focus 对不上。 |
| Priority |
全仓 markdown checklist 扫描 |
全仓优先级分类 |
它任务数很多,当前是 1489 条,更像导出视图,不该直接充当“今日入口”。 |
| Task Ops |
旧执行日志 + TODO-Inbox |
执行流水 / 待确认审计 |
页面仍在展示 2 月 20-25 日旧“待你确认”语义,所以你看到它时会以为今天系统里还有很多确认项没进 Today Focus。 |
| todo-board |
`TODO-Inbox` + `Today-Focus` + reviews + `DailyRecord` |
最接近全局驾驶舱的 read model |
它已经接得最深,但和公共站点没有共享同一个导出 JSON,所以看起来像另一套系统。 |
不是所有页面都应该合并成一个页面,但它们至少应该共享同一个状态主表。现在的问题是:同一个任务在不同页面里被当成了“今日入口 / 优先级导出 / 执行流水 / issue 日报 / 驾驶舱任务”,名字相似、含义不同。
Feishu Audit
飞书每日推送审计:现在到底发的是什么
真实 job
`myobsidian-daily-tasks @09:10` 是当前每天飞书日推的真实 job。它属于 OpenClaw,而不是 GitHub Actions。
当前主链存在
真实来源
脚本默认 `source-mode=focus-file`,所以 09:10 发送时真实读取的是 `Today-Focus.md`。cron 文案里残留的 `DailyRecord task digest` 只是过时描述。
描述已漂移
最近一次发送
最新成功发送是 2026-03-19 09:10。消息内容是一条纯文本 `【今日聚焦】`,而不是图片卡片。
发送正常
为什么你会觉得不对
因为飞书发出的是 09:10 当时版本;而 `Today-Focus.md` 在当天之后继续被改过,所以飞书、当前文件、公开页可能看起来不是同一版内容。
同日内容漂移
用户体感中的“飞书发错了”常常不是因为发送失败,而是因为发送时刻的文本快照、之后更新过的 Today-Focus、以及公共页生成时刻不是同一时间点。
当前飞书层的四个具体问题
- job 描述还写着 `DailyRecord task digest`,但真实行为已切到 `Today-Focus`。
- `Today-Focus` 只要有一条 focus 就会发,但并不会强制这条任务补齐 `目标 / 现状 / 差距 / AI还能做 / 为何需要你`。
- `待你确认` 为空时,系统现在会老实说“今天没有新的待确认事项”,但没有继续解释“为什么空、是否该自动补位”。
- OpenClaw job state 里的 `lastDelivered=false` 容易误导,因为实际发信发生在脚本内部,不走 job delivery 字段。
GitHub Actions 已停用
远端 `EOMZON/myObsidian` 的 9 条 workflow 当前全部是 `disabled_manually`。仓库里的 `.github/workflows/*.yml` 还在,但已经不是现在的主调度器。
OpenClaw 才是现行控制面
`02:05 public-board`、`09:10 daily-tasks`、`09:20~09:50 periodic review` 都已经在 OpenClaw cron 里。
`todo-board` 已接真实 Obsidian
当前同步到的 source kinds 是:`today-focus`、`todo-inbox`、`daily-top1`、`daily-record`、`monthly-review`、`weekly-review`、`project-seed`。
旧页面仍在制造噪音
`task-execution` 页面现在还停留在 2 月的旧待确认流水,所以它会和 `Today-Focus` 的新口径互相打架。
Target Model
理想统一架构:谁是唯一真相层,谁只是投影
最小正确方案不是让所有页面只剩一个,而是让所有页面都建立在同一份任务主表之上。推荐做法是:
把 Obsidian 多源任务先导出成唯一 `task-state.json`,然后 `Today Focus / Daily / Priority / todo-board / Feishu` 都只消费它的不同切片。
统一之后,页面还可以有很多,但它们不再各自拥有自己的 parser 和状态定义。真正共享的是 `task-state.json`,页面只是各取所需的投影层。
{
"generatedAt": "2026-03-19T04:34:05Z",
"focusDate": "2026-03-19",
"tasks": {
"byId": {
"task_1": {
"id": "task_1",
"title": "确定 E waitlist 现阶段是否退出公开入口",
"status": "doing",
"priority": "high",
"dueDate": "2026-05-03",
"lane": "今日聚焦",
"sourceKind": "obsidian-today-focus",
"sourcePath": "00-LifeOS/INFO/Today-Focus.md",
"humanRequired": true,
"humanRole": "act",
"focusRole": "top1"
}
}
},
"today": {
"top1Id": "task_1",
"focusIds": ["task_1"],
"humanGateIds": []
}
}
Roadmap
推荐收敛顺序:先统一状态,再统一体验
Step 1. 明确唯一真相字段
先定 `status / exec_mode / humanRole / focusRole / sourceKind / sourcePath / evidence` 这些字段的唯一含义,不再允许不同页面各自发明。
Step 2. 提取共享 parser
把 `Today-Focus`、`TODO-Inbox`、`DailyRecord`、review 的解析收成一个共享层,替换 `daily push`、`today-focus page`、`todo-board` 的重复实现。
Step 3. 导出 `task-state.json`
先只做导出,不重写 UI。让 public pages 与 `todo-board` 都能消费同一份读模型,这是收益最高、风险最低的一步。
Step 4. 再收敛页面分工
`Today Focus` 负责今日人类入口,`todo-board` 负责驾驶舱,`Priority` 退成排序参考,`Task Ops` 退成历史执行审计,不再装作今日入口。
不推荐先从 UI 开始。因为只要状态定义没统一,你今天把页面画得再清楚,过几天还是会重新分裂。
只做一件事:先把 `todo-board` 的 Obsidian 聚合结果正式导出为 `docs/public/data/task-state.json`
因为这是你现有系统里“最接近统一状态模型”的一层,而且它已经吸收了 `Today-Focus`、`TODO-Inbox`、review、`DailyRecord Top1`。
先把这份聚合结果变成共享 JSON,再让 `Today Focus / Daily / Priority / Feishu` 去消费它,能最直接地减少“同一任务在不同地方说不同的话”。
- 它能直接解决飞书口径、页面口径、驾驶舱口径三方不一致的问题。
- 它不要求你立刻推翻现有站点和通知,只是先统一真相层导出。
- 它也最适合后续继续拆给子 agent 并行实现。