# cron-watcher

## 解決什麼問題
定期巡 KBDB（或任何資料源），找到「未處理」的紀錄，每筆觸發一個處理 workflow。
**最常見的 pattern**：mira 就是這樣把河道貼文自動跑 wiki_synthesis。

## 怎麼觸發
不用手動觸發 — 部署後自動每 5 分鐘跑。

cron 解析在 `acr push` 時自動偵測首節點是 `cron` 零件，存進 `WEBHOOKS:cron-idx:` 索引，
`scheduled()` handler 每分鐘 tick 對齊。

## 改成你自己的
- `watch_cron.cron_expr` 改頻率（標準 5 欄 cron 語法）
- `list_unprocessed` 改你的 KBDB query（type / source / tag 等）
- `filter_new.condition` 改你的「未處理」定義
- `trigger_processor.workflow_name` 改你的處理 workflow

## 為什麼用 trigger_workflow 不用 http_request

CF Workers 有 self-fetch 防護：cypher-executor 自打 `cypher.arcrun.dev/*` 或自己的
`arcrun-cypher-executor.*.workers.dev` 都被攔（CF 1042）。

`trigger_workflow` 是 cypher-executor 內建的 orchestration 零件，直接 in-process
call `executeWebhookGraph`，**不走外部 HTTP**，徹底繞掉 self-fetch。

## 學到什麼
- cron + FOREACH + trigger_workflow 三件套
- `{{api_key}}` 從 trigger context 自動帶（cron 觸發時 cypher-executor 自動塞進去）
- `對每個 X >> Y` 中文關係詞（也接受 `FOREACH X`）
- filter 零件用 `condition.op: eq` 配 `tags_json: "[]"` 偵測「無 tag」
