Choose the right intention tier
Put aspirations in
MEMORY.md, a project note, or another maintained Markdown file with an explicit review date. They are neither clock jobs nor event triggers.
Create an event-based intent
Standing intents are owner-directed memory. Only command owners recognized bycommands.ownerAllowFrom can see or use the intent tool to create, list, or
cancel them; other senders do not receive that tool.
Ask the agent to create the intent and name the event clearly:
intent tool with a description and trigger keywords. It can also narrow the intent to one conversation channel identifier or sender identifier, set an expiry, reduce or increase the fire budget, or change the cooldown.
Defaults are intentionally conservative:
- cooldown: 24 hours
- maximum fires: 3
- expiry: 90 days
How matching works
On an eligible user turn, OpenClaw performs a deterministic FTS keyword prefilter over armed intents. A candidate fires only when every term in at least one configured trigger entry appears in the turn. OpenClaw also rechecks channel scope, sender scope, expiry, cooldown, and fire budget against the authoritative SQLite rows in one synchronous transaction. Matching scans at most 256 scoped FTS candidates per turn so a noisy trigger set cannot stall the reply path. No model call occurs in the matching path. On a hit, the main reply receives a bounded hidden context block:fire_count, records last_fired_at, and moves the intent through its explicit lifecycle. A fired intent becomes armed again only after its cooldown. It becomes done when its fire budget is exhausted and expired when its expiry passes. Expiry and cooldown maintenance also piggyback on existing heartbeat and cron reply hooks; OpenClaw does not add another timer subsystem.
TriggerBench finds that prospective recall decays as context grows and can drift into an always-remind heuristic (arXiv:2606.23459). Structural matching and fire budgets keep recall independent of conversational context while bounding false alarms.
List and cancel
Ask the agent to list standing intents when you want to inspect their status, scope, expiry, or fire count. Cancellation is always explicit. Ask the agent to cancel a specific intent; the stored row moves tocancelled and can no longer fire. OpenClaw never infers cancellation from ordinary conversation. ProEvent reports that proactive systems frequently overact and struggle with event cancellation (arXiv:2607.17701), so cancellation is durable state rather than a model judgment.
Lifecycle states
Standing intents live in
agents/<agentId>/agent/openclaw-agent.sqlite. They add no configuration keys and create no sidecar files.