Date: 2026-06-08 - Scope: PR #41, P009 tasks #38, #39, and #40.
P009 supervised runner user summary
PR #41 changes OpenClaw automation from "a prompt was triggered, assume it is running" to "a worker is only active after a run record shows it started, heartbeated, and has a recovery path." For a Telegram user, the practical change is that obot can now run small PM/Development checks and report concrete run ids, states, heartbeats, transcripts, artifacts, and failures instead of vague status.
Before PR #41
- Cron or Telegram could trigger work, but startup failures were easy to miss.
- A task could be described as active without durable liveness evidence.
- Stalled workers required manual follow-up to discover.
- PM and Development handoffs were documented, but not yet proven by a supervised PM to Dev to PR cycle.
After PR #41
- Every supervised run gets a JSON record under
.codex-runs/. - Runs move through
triggered,started,completed, orfailed. - Heartbeat, deadline, transcript, artifact, failure reason, and recovery note are captured.
- Telegram smoke tests prove OpenClaw can invoke and summarize the runner.
What changed for the operator
| Workflow | What you can ask now | What obot should report back |
|---|---|---|
| Runner smoke test | Run the runner self-test from Telegram/OpenClaw. | Branch, command status, run id, state, heartbeat timestamp, and transcript path. |
| Failure-injection test | Run the watchdog failure test. | Both synthetic failures marked failed, reasons shown, alert length under 500 chars, repeat alert suppressed. |
| Real watchdog check | Check local run records with check --mark-failed --json. |
Number of records checked, number newly failed, and any alert strings. |
| PM to Development acceptance | Run a PM audit, then a docs-only Development handoff, with PR evidence. | PM audit run record, Development run record, PR link, issue comment artifact, and post-artifact Telegram summary. |
New public script
scripts/run_codex_cycle.py is the thin runner. It starts one worker command, writes a run record, heartbeats while the worker is alive, captures output in a transcript, and records completion or failure.
It is not a scheduler, queue, agent company, or Paperclip replacement. It is the minimum execution proof layer.
New watchdog behavior
The same script has check mode. It detects records that were triggered but never started, or started records that passed their deadline or stopped heartbeating.
With --mark-failed, it writes state=failed, failure_reason, and a concise alert.
New safety guidance
The README now documents that run records and transcripts are local/private artifacts and that Telegram integrations must use allowlisted runner actions.
The important rule: do not forward arbitrary chat text into --command.
How this enables more automation through Telegram/OpenClaw
The runner gives OpenClaw a small, observable execution primitive. Telegram can ask obot to run a bounded action, and obot can answer with a durable state record instead of a guess. That makes higher-level automation safer because each step has a machine-checkable result.
| Automation capability | Enabled by | Why it matters |
|---|---|---|
| Reliable status replies | Run id, state, heartbeat, transcript path. | Jeremy can ask "what happened?" and get evidence, not a narrative. |
| Stall detection | check --mark-failed and deadline/heartbeat logic. |
OpenClaw can surface a failed worker without waiting for manual discovery. |
| PM gating before Development | Supervised PM audit run p009-40-pm-audit-r2. |
Development starts only after a PM artifact exists and reports no error-level blockers. |
| Docs-only Development handoff | Supervised Development run p009-40-dev-docs-pr. |
OpenClaw can prove a safe Development task produced a PR artifact without merging. |
| Review-gated autonomy | PR #41 stays unmerged until human review. | Automation can prepare evidence and code, while final merge authority stays with Jeremy. |
Evidence already collected
- Passed #38 local runner dry run.
- Passed #38 Telegram/OpenClaw runner smoke test.
- Passed #39 local failure-injection test.
- Passed #39 Telegram/OpenClaw failure-injection test.
- Passed #40 PM audit and docs-only Development PR cycle.
What has not changed
- No automatic merges.
- No Paperclip installation.
- No cron
agentTurnexecutor path. - No broad Telegram shell access.
- No public commit of local transcripts or run records.
End-user command model
For now, Telegram/OpenClaw should expose narrow commands that map to known runner actions:
self-test- prove the runner can complete a successful supervised command.failure-test- prove failure records and alerts work.status- inspect existing run records.check --mark-failed- detect stale or never-started runs and produce at most one alert per failed transition.
Future PM or Development jobs should come from reviewed local templates or explicit operator-reviewed commands. Telegram should not become a general shell.
Recommended next step
Review gate PR #41 should be reviewed and merged as the P009 runner baseline. After merge, the next automation work should wire OpenClaw/Telegram to the allowlisted runner actions and then run future PM to Development cycles from main.