You set up an hourly cron to process files from a stash folder. When the stash is empty, you don’t want noise. So you write: “if the stash is empty, stop silently without sending any message.”
Then the agent posts to Discord: “Stash is empty — only .gitkeep present. Stopping silently.”
Correct observation. Wrong behavior. The model read “stop silently” as a stage direction and performed it out loud.
The Problem
OpenClaw cron jobs run in isolated agent sessions. The job payload is the entire instruction set — there’s no session history, no memory of previous runs, just the message you wrote. When that message says something like “stop silently without sending any message,” the model interprets it as a description of intent to narrate, not a hard constraint on output.
The result: a Discord notification every hour telling you the stash is empty, which is exactly the noise you were trying to avoid.
"message": "Run the clear_stash skill. If the stash is empty, stop silently without sending any message."
Output in Discord:
Stash is empty — only .gitkeep present. Stopping silently.
Why This Happens
“Stop silently” describes a behavior. Models are trained to be helpful and communicative — when they take an action (or decide not to), they tend to confirm it. Telling them to skip confirmation is easy to acknowledge and ignore.
What works instead is framing the constraint as an output format rule, not a behavioral instruction. Models follow output format rules more reliably than they follow meta-instructions about their own communication style.
The Fix
Update the cron job payload in cron/jobs.json to use absolute output language:
"message": "Run the clear_stash skill. Process any files waiting in vault/Stash/. If the stash is empty or the directory does not exist, your output must be completely empty — do not produce any text, do not explain, do not confirm. Only send a message if you actually processed files."
The key shift: “your output must be completely empty” instead of “stop silently.” One is a constraint on the artifact (the response text), the other is a description of a vibe.
Note that this fix lives in the cron payload, not the skill itself. When a user manually invokes /clear_stash, the skill responds normally — the silence constraint only applies in the automated cron context where you control the full prompt.
Key Takeaway
When you need an LLM agent to produce no output under certain conditions, don’t describe the silence — constrain the output. “Stop silently” is a behavioral instruction that models narrate. “Your output must be completely empty” is a format rule they follow. Same intention, very different results.