|
1 | 1 | # Codex Workspace Cron |
2 | 2 |
|
3 | | -Codex workspace の prompt 定期実行は `jobs.yaml` と Kubernetes CronJob で管理する。 |
4 | | -OpenClaw の `jobs.json` と同じく、複数のジョブがそれぞれ schedule と prompt を持つ。 |
| 3 | +Codex workspace の prompt 定期実行は、workspace Pod 内の resident scheduler が管理する。 |
| 4 | +OpenClaw の cron と同じく、複数の job がそれぞれ別の schedule と prompt を持てる。 |
5 | 5 |
|
6 | 6 | ## 仕組み |
7 | 7 |
|
8 | | -- `cron-configmap.yaml` |
9 | | - - `jobs.yaml`: 登録済み cron job の一覧。 |
10 | | - - `run-codex-cron.sh`: `codex exec` を非対話で起動する runner。 |
11 | | - - `prompt-*.md`: 定期実行したい prompt。 |
12 | | -- `cronjob.yaml` |
13 | | - - `spec.schedule`: Kubernetes が実行する schedule。`jobs.yaml` の同名 entry と合わせる。 |
14 | | - - `spec.suspend`: 誤実行防止。初期値は `true`。 |
15 | | - - `CODEX_CRON_JOB_ID`: `jobs.yaml` の job id。 |
16 | | -- 実行ログ |
17 | | - - `/home/boxp/.codex-cron/runs/<job>/<run-id>/events.jsonl` |
18 | | - - `/home/boxp/.codex-cron/runs/<job>/<run-id>/stderr.log` |
19 | | - - `/home/boxp/.codex-cron/runs/<job>/<run-id>/last-message.md` |
20 | | - - `/home/boxp/.codex-cron/runs/<job>/<run-id>/summary.json` |
21 | | - |
22 | | -## 有効化 |
23 | | - |
24 | | -prompt と schedule を確認してから、`jobs.yaml` の対象 job を `enabled: true` にし、対応する CronJob の `suspend` を `false` にする。 |
25 | | - |
26 | | -```yaml |
27 | | -jobs: |
28 | | - - id: workspace-maintenance |
29 | | - enabled: true |
30 | | - schedule: "0 22 * * *" |
| 8 | +- `deployment.yaml` |
| 9 | + - `codex-cron-scheduler` sidecar が `/opt/codex-workspace/cron/scheduler.bb` を常駐実行する。 |
| 10 | + - scheduler と workspace container は同じ home PVC を mount する。 |
| 11 | +- `/home/boxp/.codex-cron/jobs.edn` |
| 12 | + - live job registry。Codex skill から CRUD する。 |
| 13 | +- `/home/boxp/.codex-cron/prompts/*.md` |
| 14 | + - job ごとの prompt。 |
| 15 | +- `/home/boxp/.codex-cron/runs/<job>/<run-id>/` |
| 16 | + - `events.jsonl`, `stderr.log`, `last-message.md`, `summary.edn` を保存する。 |
| 17 | + |
| 18 | +## Registry 例 |
| 19 | + |
| 20 | +```clojure |
| 21 | +{:version 1 |
| 22 | + :jobs [{:id "workspace-maintenance" |
| 23 | + :name "Workspace maintenance" |
| 24 | + :enabled false |
| 25 | + :schedule "0 22 * * *" |
| 26 | + :time-zone "Etc/UTC" |
| 27 | + :prompt-file "prompts/workspace-maintenance.md" |
| 28 | + :workdir "/home/boxp" |
| 29 | + :output-root "/home/boxp/.codex-cron/runs" |
| 30 | + :bypass-approvals true}]} |
31 | 31 | ``` |
32 | 32 |
|
33 | | -```yaml |
34 | | -spec: |
35 | | - suspend: false |
36 | | - schedule: "0 22 * * *" |
37 | | -``` |
| 33 | +## 操作 |
38 | 34 |
|
39 | | -## 手動実行 |
| 35 | +live job は Codex workspace 内の skill helper で操作する。 |
40 | 36 |
|
41 | 37 | ```bash |
42 | | -kubectl create job \ |
43 | | - --from=cronjob/codex-cron-workspace-maintenance \ |
44 | | - codex-cron-workspace-maintenance-manual \ |
45 | | - -n codex-workspace |
| 38 | +bb ~/.codex/skills/codex-workspace-cron/scripts/codex_cron_jobs.bb list |
| 39 | +bb ~/.codex/skills/codex-workspace-cron/scripts/codex_cron_jobs.bb add \ |
| 40 | + --id daily-report \ |
| 41 | + --name "Daily report" \ |
| 42 | + --schedule "0 22 * * *" \ |
| 43 | + --prompt "調査して日本語で報告してください。" |
| 44 | +bb ~/.codex/skills/codex-workspace-cron/scripts/codex_cron_jobs.bb enable daily-report |
46 | 45 | ``` |
47 | 46 |
|
48 | | -## ジョブ追加 |
49 | | - |
50 | | -1. `cron-configmap.yaml` の `jobs.yaml` に job entry を追加する。 |
51 | | -2. `cron-configmap.yaml` に対応する `prompt-<name>.md` を追加する。 |
52 | | -3. `cronjob.yaml` をコピーして CronJob 名、`schedule`、`CODEX_CRON_JOB_ID` を変更する。 |
53 | | -4. `jobs.yaml` の `id/schedule/timeZone` と CronJob の `CODEX_CRON_JOB_ID/schedule/timeZone` を揃える。 |
54 | | -5. 多重実行を避けるため `concurrencyPolicy: Forbid` は維持する。 |
55 | | -6. workspace home PVC を mount するため、workspace Pod と同じ node へ寄せる `podAffinity` は維持する。 |
56 | | - |
57 | 47 | ## OpenClaw との差分 |
58 | 48 |
|
59 | | -OpenClaw は Gateway 内蔵 scheduler が `jobs.json` と `jobs-state.json` を管理する。Codex workspace では Gateway 相当の常駐 scheduler を持たないため、scheduler は Kubernetes CronJob に委譲し、ジョブ登録情報は ConfigMap の `jobs.yaml` に集約する。Runner 補助スクリプトは workspace image に入っている Babashka (`bb`) で動かす。 |
| 49 | +OpenClaw は Gateway 内蔵 scheduler が home 配下の job registry を管理する。 |
| 50 | +Codex workspace では Gateway ではなく Pod sidecar として scheduler を常駐させ、Kubernetes CronJob は個別 schedule の source of truth にしない。 |
0 commit comments