Operating model artifact · autonomy grounded in docs
Ash Autonomy & Initiative
A much more practical account of how autonomy should work in OpenClaw. The key discovery is that heartbeat is not vague magic and not a general background daemon. It is a periodic main-session turn with explicit configuration, cost tradeoffs, and strong potential as a bounded autonomy primitive if used carefully.
1. What heartbeat actually is
A periodic main-session turn
According to the OpenClaw docs, heartbeat runs periodic agent turns in the main session so the model can surface anything that needs attention without spamming. It is not a detached worker process and not a task ledger entry.
Not the same thing as cron
Heartbeat uses approximate recurring cadence, while cron is the exact scheduler. Heartbeat is for routine awareness and context-sensitive monitoring. Cron is for exact timing, isolated execution, and scheduled jobs with task records.
HEARTBEAT.md is read on heartbeat ticks, not on boot
This is the clarification that matters most in practice. The heartbeat file is not operationally “activated” by normal startup. It is read when the heartbeat runner fires on its periodic schedule. The docs describe a default 30-minute cadence, but that should now be treated as a documented default, not a proven live behavior on this install.
Editing the file does nothing until the next heartbeat run
If HEARTBEAT.md changes right now, that does not by itself trigger immediate work. The new content is picked up on the next heartbeat tick, or sooner only if heartbeat is manually woken through the appropriate OpenClaw mechanism.
2. Why heartbeat is relevant to autonomy at all
It creates periodic awareness
Heartbeat gives Ash a recurring chance to look around and decide whether anything actually deserves attention: inboxes, calendar, reminders, unfinished threads, stale memory, or project drift.
It supports silence as well as intervention
The response contract is explicit. If nothing needs attention, the model should return HEARTBEAT_OK. That matters because good initiative is not constant activity. It is selective awareness.
It can batch multiple small checks
The automation docs explicitly position heartbeat as the right fit for routine monitoring like inbox, calendar, and notifications, precisely because several lightweight checks can be bundled into one periodic turn.
It keeps initiative inspectable
Heartbeat behavior can be shaped through config, active hours, delivery rules, and a small HEARTBEAT.md file. That makes the autonomy model legible instead of mystical.
3. The real danger: API burn and accidental noise
Heartbeat runs full agent turns
The docs are blunt about this. Heartbeats are full model calls. If the interval is too short, the prompt is too broad, or the session carries too much history and context, token usage can climb quickly.
This is likely why earlier experiments felt like they were “doing something,” but without enough precision to justify the cost.
The expensive version of heartbeat
- Running too often
- Using full main-session history every time
- Stuffing too much into
HEARTBEAT.md - Using chatty, ambiguous instructions
- Allowing heartbeat to deliver too often instead of mostly staying quiet
4. What the docs say to do instead
isolatedSession: true: this is the biggest cost lever, because it avoids replaying the full conversation history on every heartbeat.lightContext: true: this limits the bootstrap context so heartbeat can focus primarily on HEARTBEAT.md.HEARTBEAT.md tiny: the docs explicitly recommend a short checklist or reminders only.tasks: blocks: only due checks are included, and if nothing is due the heartbeat is skipped entirely.5. The especially important behavior in HEARTBEAT.md
Empty heartbeat files are skipped
If HEARTBEAT.md exists but is effectively empty, OpenClaw skips the heartbeat run to save API calls. That means an empty or near-empty file is a real cost-control mechanism, not just a placeholder.
Due-only tasks can skip nonessential turns
The docs support a structured tasks: block with per-task intervals. Only due tasks are injected, and if none are due, the model call is skipped entirely with reason=no-tasks-due.
An empty file means the scheduler may still tick, but the real run should short-circuit
That distinction matters. The system can still conceptually reach a heartbeat interval boundary, but with an effectively empty heartbeat file it should skip the substantive model work rather than reading a rich checklist and producing a real heartbeat turn.
The file is a conditional input, not a standing daemon prompt
HEARTBEAT.md does not sit there being constantly “watched” in a heavy way. It is better understood as a small instruction file that gets consulted when the heartbeat runner wakes up. If the file is empty or no tasks are due, OpenClaw is designed to skip the expensive part.
Documented default is not the same as proven active runtime
A real-world test was run on this install by adding a quote-delivery instruction into HEARTBEAT.md and waiting across the expected interval window. No delivery appeared, and no satisfying local evidence of heartbeat execution was found. That means the 30-minute default should not be treated as proven live behavior here.
Heartbeat probably needs explicit configuration before it truly exists in practice
The strongest current interpretation is that heartbeat is a real OpenClaw capability, but not one that is actually active on this machine yet. The likely missing piece is an explicit heartbeat configuration block or enablement step. Because configuration edits have been a source of instability before, the plan is to handle that later through the intended terminal configure flow rather than by hand-editing openclaw.json from chat.
6. Heartbeat vs cron, in practical terms
Awareness and lightweight initiative
- Inbox triage every 30 to 60 minutes
- Calendar awareness and upcoming events
- Low-noise reminders to notice drift or stale memory
- Occasional check-ins when something actually matters
Precise timing and isolated jobs
- One-shot reminders
- Daily reports at exact times
- Weekly deep analysis
- Standalone jobs that should not inherit ongoing session context
7. The best first autonomy pattern for Ash
Start with disciplined heartbeat, but only after explicit activation is verified
The strongest path forward is still probably a deliberately conservative heartbeat setup, but the first job now is proving heartbeat is actually enabled in live runtime before designing around it:
isolatedSession: truelightContext: true- active hours
- a small
HEARTBEAT.mdfile - 2 to 4 due-only tasks at most
- delivery that is mostly silent unless something actually matters
Once explicitly enabled and verified, that turns heartbeat into a real bounded autonomy layer: periodic awareness, selective intervention, low noise, and much better control over cost.
8. What this means for initiative in Ash Foundry
Autonomy should be understood as architecture, not vibe
The initiative question is not solved by asking whether Ash should be “more autonomous.” It is solved by choosing the right mechanisms. Heartbeat is one of the most important of those mechanisms because it provides recurring bounded awareness. But the useful version is disciplined, cheap, and inspectable, not theatrical.