Hi — I’ve deployed OpenClaw v2026.4.8 on a DigitalOcean server using Claude Haiku. The agent is running continuously in the background, creating and updating workspace files (AGENTS.md, HEARTBEAT.md, SOUL.md, IDENTITY.md, INBOX.md, CALENDAR_TODAY.md etc.) even when I’m not sending any messages.
This is resulting in ~$4/day in Anthropic API costs (281 requests, 2.2M input tokens, 3.2M output tokens in a single day) which is unsustainable.
I want Zoya to be purely reactive — only make API calls when I send a message. No background polling, no autonomous workspace writes, no heartbeat API calls.
Questions:
1. Is there a config flag to disable the autonomous agentic loop?
2. How do I stop the agent writing files to the workspace automatically?
3. Is there a “reactive only” mode that prevents background API calls?
4. What is the recommended config for a low-cost personal EA deployment?
My current config has Haiku as primary model. The costs started as soon as the agent connected to Telegram and Gmail. Happy to share my openclaw.json if helpful.
Thanks
#Agent burning $4/day in API costs
195 messages · Page 1 of 1 (latest)
Let me verify this against the actual docs/source so I don’t guess the wrong flag.
Yep, this is usually heartbeat + Gmail hooks, not a hidden autonomous “loop”.
- Disable heartbeats
openclaw config set agents.defaults.heartbeat.every "0m"
That is the main switch for stopping proactive agent turns. Docs: https://docs.openclaw.ai/gateway/heartbeat
- Stop Gmail-triggered wakes
If you enabled Gmail PubSub/webhooks, new emails can wake the agent even when you send nothing.
- remove/disable
hooks.gmail/ the Gmail preset, or - at minimum set
OPENCLAW_SKIP_GMAIL_WATCHER=1
Docs: https://docs.openclaw.ai/automation/cron-jobs#gmail-pubsub-integration
- Check other background triggers
openclaw cron list
openclaw hooks list
Also disable these if present:
boot-mdhook:openclaw hooks disable boot-md- dreaming:
openclaw config set plugins.entries.memory-core.config.dreaming.enabled false
- Why it keeps writing workspace files
Those writes usually happen during heartbeat/hook turns, often becauseAGENTS.md/HEARTBEAT.mdtells the agent to maintain inbox/calendar files. The default templates are pretty proactive.
So the short answers are:
- Q1: Yes, for heartbeats:
agents.defaults.heartbeat.every: "0m" - Q2: No single “stop writing files” flag. Stop the triggers, and remove any standing instructions telling it to keep
INBOX.md,CALENDAR_TODAY.md, etc. up to date - Q3: I don’t see a single global “reactive only” mode, but this combination gets you there:
- heartbeat off
- no cron jobs
- no Gmail PubSub/hooks
- dreaming off
- optional:
HEARTBEAT.mdempty
- Q4: Lowest-cost EA setup is chat-only: Telegram/Discord as ingress, no heartbeats, no Gmail PubSub, no cron, no dreaming, and use Gmail/Calendar on demand when you message the agent
Telegram by itself usually is not the expensive part. Gmail hooks + heartbeat are the usual burn sources.
If you paste your openclaw.json plus:
openclaw status --all
openclaw cron list
openclaw hooks list
I can point to the exact lines causing it.
Heartbeat is disabled
how do i paste the json file.. its too long to be pasted here
That narrows it a lot.
If heartbeat is already off, my next two suspects are:
- Gmail hooks / PubSub
- stuck bootstrapping (
BOOTSTRAP.mdstill present)
Why I’m pretty suspicious of Gmail: the docs say when hooks.enabled=true and hooks.gmail.account is set, the gateway auto-starts gog gmail watch serve on boot and renews it. That can wake the agent without any chat message. Docs: https://docs.openclaw.ai/automation/cron-jobs#gmail-pubsub-integration
And the repeated writes to AGENTS.md, SOUL.md, IDENTITY.md etc. fit a second issue too:
if BOOTSTRAP.md still exists, the agent is still in first-run/bootstrap mode. Docs say it should be deleted after completion and not come back. https://docs.openclaw.ai/start/bootstrapping
I’d check these next:
openclaw status --all
openclaw config get hooks --json
openclaw cron list
openclaw hooks list
What to look for:
hooks.enabled: true- a populated
hooks.gmail bootstrapping/bootstrap pendinginopenclaw status --all- any cron jobs
boot-mdor other enabled hooks
If you want purely reactive, I’d do this:
- Disable/remove Gmail hooks
- quickest test: set
OPENCLAW_SKIP_GMAIL_WATCHER=1and restart the gateway- cleaner long-term fix: remove/disable
hooks.gmail(and webhook automation if you do not need it)
- cleaner long-term fix: remove/disable
-
Check for stuck bootstrap
- if
BOOTSTRAP.mdstill exists in the workspace, that’s wrong for a finished setup - once you’ve confirmed the workspace is seeded, set:
openclaw config set agents.defaults.skipBootstrap trueThat stops automatic bootstrap file creation for pre-seeded workspaces
- if
-
Verify no other background runners
openclaw cron list- dreaming off if enabled
The Gmail timing is a big clue here. Telegram alone usually does not cause this kind of background churn.
If you paste:
openclaw status --allopenclaw config get hooks --json
…I can probably tell you the exact culprit pretty quickly.
No need to paste the whole file, and in a public thread I’d actually prefer you don’t.
The useful bits are much smaller. Please paste these instead:
openclaw config get hooks --json
openclaw cron list
openclaw hooks list
openclaw status --all
If you want, also:
openclaw config get plugins.entries.memory-core.config.dreaming --json
openclaw config get agents.defaults.skipBootstrap --json
If any of those contain secrets, just replace values with REDACTED, especially:
- API keys
- bot tokens
gateway.auth.tokenhooks.tokenhooks.gmail.pushToken
If Discord still complains about length, easiest options are:
- paste them in separate messages
- upload a redacted
.txtfile - paste just the
hookssection first, since that’s the most suspicious one right now
Honestly, openclaw config get hooks --json is the one I want most.
{
"enabled": true,
"path": "/hooks",
"token": "OPENCLAW_REDACTED",
"presets": [],
"internal": {
"entries": {
"boot-md": {
"enabled": false
}
}
}
}
Nice, that actually rules out one big suspect.
This does not look like Gmail PubSub hooks:
- no
hooks.gmail - no preset
boot-mdis off
So hooks probably isn’t what’s burning tokens here.
The next two things I’d check are:
-
stuck bootstrapping
- this would explain repeated writes to
AGENTS.md,SOUL.md,IDENTITY.md, etc.
- this would explain repeated writes to
-
cron / scheduled jobs
- this would explain background agent turns even with heartbeat off
Can you paste these next?
openclaw status --all
openclaw cron list
openclaw config get plugins.entries.memory-core.config.dreaming --json
If you want a super fast manual check too:
ls ~/.openclaw/workspace/BOOTSTRAP.md
If that file still exists, that’s a huge clue, because it means the agent may still be in bootstrap mode.
┌─────────────────┬────────────────────────────────────────────────────────────┐
│ Item │ Value │
├─────────────────┼────────────────────────────────────────────────────────────┤
│ Version │ 2026.4.9 │
│ OS │ linux 6.8.0-107-generic (x64) │
│ Node │ 22.22.2 │
│ Config │ ~/.openclaw/openclaw.json │
│ Dashboard │ http://144.126.192.250:18789/ │
│ Tailscale │ off │
│ Channel │ stable (default) │
│ Update │ pnpm · npm update 2026.4.12 │
│ Gateway │ local · ws://127.0.0.1:18789 (local loopback) · reachable │
│ │ 78ms · auth token · ubuntu-s-1vcpu-1gb-lon1-01 (144.126. │
│ │ 192.250) app 2026.4.9 linux 6.8.0-107-generic │
│ Security │ Run: openclaw security audit --deep │
│ Gateway self │ unknown │
│ Gateway service │ systemd installed · enabled · running (pid 216683, state │
│ │ active) │
│ Node service │ systemd not installed │
│ Agents │ 1 total · 0 bootstrapping · 0 active · 4 sessions │
│ Secrets │ none │
└─────────────────┴────────────────────────────────────────────────────────────┘
Perfect, this helps a lot.
This rules out bootstrapping too:
0 bootstrapping- hooks look clean
boot-mdis off
So the main suspect now is scheduled automation, especially:
- cron jobs
- memory dreaming (this creates a managed cron job when enabled)
Can you paste these two next?
openclaw cron list
openclaw config get plugins.entries.memory-core.config.dreaming --json
Why I’m leaning that way:
INBOX.md/CALENDAR_TODAY.mdreally smells like the agent is running a scheduled “check inbox / check calendar” workflow- heartbeat is off, hooks look harmless, bootstrapping is done
- so something else is still waking the agent on a schedule
If cron list comes back non-empty, I think we’ve probably found it.
I'm not saying your workflow is chaotic... I'm just bringing a linter and a helmet.
│
◇
ID Name Schedule Next Last Status Target Agent ID Model
c91bfae1-d2de-4c65-9491-a64049277d81 Morning Briefing — We... cron 30 8 * * 1-5 @ Europe/Lo... in 12h 11h ago ok session:agent:main:telegram:direct:6594797802 main
Aha, yep, that’s definitely one of the culprits.
That cron is a proactive job targeting your Telegram direct session:
- Name:
Morning Briefing ... - Target:
session:agent:main:telegram:direct:...
So if you want reactive-only, disable or remove it:
openclaw cron disable c91bfae1-d2de-4c65-9491-a64049277d81
or just delete it:
openclaw cron rm c91bfae1-d2de-4c65-9491-a64049277d81
That said, one weekday morning cron alone should not explain 281 requests/day, so I still think there’s at least one more background source.
Please paste this next:
openclaw config get plugins.entries.memory-core.config.dreaming --json
And if you want to inspect what that cron has been doing:
openclaw cron runs --id c91bfae1-d2de-4c65-9491-a64049277d81 --limit 10
We’ve ruled out:
- heartbeat
- hooks/Gmail hooks
- bootstrapping
So the remaining suspects are basically:
- this cron job
- dreaming
- possibly something in the cron run itself causing lots of follow-up tool/model calls
re.config.dreaming --json
{
"enabled": false
}
Great, dreaming is off too.
So at this point we’ve ruled out:
- heartbeat
- hooks / Gmail hooks
- bootstrapping
- dreaming
That leaves the Morning Briefing cron as the one confirmed proactive feature.
If you want pure reactive-only, I’d remove it now:
openclaw cron rm c91bfae1-d2de-4c65-9491-a64049277d81
or disable it first if you want to test:
openclaw cron disable c91bfae1-d2de-4c65-9491-a64049277d81
Also, I’d search your workspace for the instructions behind those file writes:
grep -Rni "Morning Briefing\|INBOX.md\|CALENDAR_TODAY.md" ~/.openclaw/workspace
My current read is:
- there does not seem to be a hidden “autonomous loop” flag you forgot
- the behavior is coming from configured automation / standing instructions
- the cron is definitely part of it
One honest caveat: a single once-per-workday cron still feels too small for 281 requests/day. So if the burn continues after you disable/remove that cron, then I’d want these next:
openclaw cron runs --id c91bfae1-d2de-4c65-9491-a64049277d81 --limit 20
openclaw logs --follow
If it still keeps happening after the cron is gone, I’d start treating that as possible bug territory.
{
"entries": [
{
"ts": 1776069052699,
"jobId": "c91bfae1-d2de-4c65-9491-a64049277d81",
"action": "finished",
"status": "ok",
"summary": "🌅 Good morning, Boss!\n\n📅 Today: 1 event at 2:30pm — Gym trial with Elisa @ Fitness First. Go get those endorphins! 💪\n\n📧 Inbox: 12 unread (cleaner than yesterday)\n\n🚨 Action needed:\n→ US Visa email (Mar 10) — "Action Required" — overdue, needs your attention\n\n🔵 FYI:\n• Sahyadri School — Performing Arts (already handled with Pratibha)\n• Pratibha — ICC Women's T20 World Cup invite (July 5)\n• Ayurveda courses (Pratibha's coursework)\n\n🎯 Top 3 today:\n1. Open & handle US Visa email (urgent)\n2. Gym session this afternoon\n3. Quick inbox cleanup\n\nNo board/investor emails. No Ecolibrium team items. You're clear to focus.\n\nHave a great Monday! \n\n—Zoya",
Yep, this confirms it.
That cron is doing exactly the proactive EA behavior:
- reading calendar
- reading inbox
- composing a morning briefing
- delivering it to your Telegram session
So for your original question, the answer is basically:
this is not a hidden default autonomous loop, it is configured automation.
If you want Zoya to be purely reactive, remove that job:
openclaw cron rm c91bfae1-d2de-4c65-9491-a64049277d81
I’d also search the workspace for the instruction/prompt that led to it, so it does not get recreated later:
grep -Rni "Morning Briefing\|Good morning\|INBOX.md\|CALENDAR_TODAY.md" ~/.openclaw/workspace
My recommendation for a low-cost reactive setup is now:
- heartbeat: off
- dreaming: off
- no proactive cron jobs
- no Gmail hooks
- no standing orders telling it to maintain inbox/calendar files
- use Gmail/Calendar only when you message it
One important note: this cron still feels too small to explain 281 requests/day by itself.
So I’d do this in order:
- delete the cron
- watch usage for a few hours / a day
- if background requests continue, grab logs around one surprise run:
openclaw logs --follow
If it still burns tokens after that cron is gone, I’d start calling it likely bug territory. If you hit that point, please file a GitHub issue with redacted logs: https://github.com/openclaw/openclaw/issues
{
"ok": true,
"removed": true
}
Nice, that removes the one confirmed proactive trigger 👍
What I’d expect now:
- no more scheduled morning briefings
- no more background inbox/calendar scans from that cron
- token usage should stay flat unless you message the agent
A couple quick checks:
openclaw cron list
That should now be empty.
And I’d still search the workspace once, just so the agent does not recreate the same behavior later:
grep -Rni "Morning Briefing\|Good morning\|INBOX.md\|CALENDAR_TODAY.md" ~/.openclaw/workspace
If it still burns tokens or writes files with no user input after this, that’s no longer “expected automation” in my book. Then the next step is:
openclaw logs --follow
and wait for one surprise run, then paste the relevant lines.
If this ends up fixing it, glad we caught it. If it does, please right-click the solution message → Apps → ✅ Mark Solution so Answer Overflow indexes it for future folks.
No cron jobs.
Nice. Then your config is basically down to reactive-only now.
A small gotcha: Anthropic usage/billing won’t instantly “reset”, so the important question is:
does it keep increasing from now without any new messages?
If no, then we likely found it and you’re good.
If yes, then that’s no longer expected from the config you’ve shown. Next thing I’d check is whether there’s a lingering background task or some bug:
openclaw tasks list --status running
openclaw tasks list
And if it still wakes unexpectedly, capture the moment with:
openclaw logs --follow
Then wait for one surprise run and paste the relevant lines.
At this point, with:
- heartbeat off
- no cron jobs
- dreaming off
- no Gmail hooks
- no bootstrapping
…there really shouldn’t be ongoing autonomous activity anymore. If there is, I’d treat that as suspicious / likely buggy.
🦞 OpenClaw 2026.4.9 (0512059)
If you're lost, run doctor; if you're brave, run prod; if you're wise, run tests.
Background tasks: 7
Task pressure: 0 queued · 0 running · 6 issues
Task Kind Status Delivery Run Child Session Summary
be281795-… cron succeeded not_applicable cron:c91b… agent:main:telegram:direct:65947978… 🌅 Good morning, Boss! 📅 Today: 1 event at 2:30pm — Gym trial with Eli…
a0516b8f-… cron failed not_applicable cron:18ba… n/a Perfect. Here's Chintan's Saturday Morning Briefing: --- 🌅 **Good morning,…
4a81de49-… cron failed not_applicable cron:c8b6… n/a --- Boss, here's your briefing for Friday, April 10th: 🌅 **Starting the da…
This is actually the clearest signal yet.
What you pasted shows:
- 0 queued
- 0 running
- the visible task records are cron tasks
- their summaries are all variants of morning briefing / inbox / calendar behavior
So those entries are historical task ledger records, not proof that something is still actively running right now.
And they line up almost perfectly with what you described:
- proactive briefings
- inbox/calendar reads
- assistant-style summaries
So my read now is:
the token burn came from cron-driven briefings, not from some hidden always-on autonomous loop.
Because:
- heartbeat is off
- hooks look clean
- dreaming is off
- bootstrapping is done
- no cron jobs remain
- background tasks show 0 running
At this point I’d do just one thing:
wait and watch whether the usage keeps increasing from now on without any new messages
If it stays flat, I think you’ve found it.
If it still climbs, then something unexpected is waking the agent, and I’d want:
openclaw logs --follow
and the next surprise run.
But honestly, this latest output makes me think you caught the actual cause. If it stays quiet now, you’re probably good.
how do i then schedule a cron which does not generate so much burn ?
Let me verify the low-burn cron knobs so I point you to the right ones, not made-up ones.
Yep, you can make cron much cheaper.
The big levers are:
-
Use an isolated session
- don’t run the cron against your main chat session
- that avoids dragging full chat history into every run
-
Use light context
- skips workspace bootstrap injection for isolated cron runs
-
Use a cheaper model +
thinking off- give the cron its own low-cost model override
- keep reasoning off unless you truly need it
-
Make the prompt narrow
- “next 2 events + urgent unread emails”
- max 5 bullets
- do not write files
- do not update memory/workspace
A good low-burn pattern is:
openclaw cron add \
--name "Cheap morning brief" \
--cron "30 8 * * 1-5" \
--session isolated \
--light-context \
--model "<cheap-allowed-model>" \
--thinking off \
--announce --channel telegram --to "<your-chat>" \
--message "Check only urgent unread emails and the next 2 calendar events. Reply in max 5 short bullets. Do not edit any workspace files. Do not update memory. If nothing is urgent, reply 'Nothing urgent.'"
What I would avoid for low cost:
--session main- open-ended prompts like “review everything”
- instructions to maintain
INBOX.md,CALENDAR_TODAY.md, memory, etc. - long friendly prose outputs
If you want, paste the cron command you want to run, and I can help you rewrite it into a cheap version.
can you help me in accessing the control UI from a mac where the gatewy is hosted on digitalocean
Yep. The easiest, safest way is an SSH tunnel from your Mac to the DigitalOcean box.
Recommended: SSH tunnel
On your Mac:
ssh -N -L 18789:127.0.0.1:18789 <user>@<your-droplet-ip>
Example:
ssh -N -L 18789:127.0.0.1:18789 root@144.126.192.250
Then open this in your Mac browser:
http://127.0.0.1:18789/
If Control UI asks for auth, paste the configured:
gateway.auth.token, orgateway.auth.password
I’d use this over exposing :18789 directly on the public internet.
Good long-term option: Tailscale Serve
If you want cleaner remote access later, Tailscale is the nicer setup. Docs: https://docs.openclaw.ai/web/dashboard
The remote-auth section from the FAQ is here too: https://docs.openclaw.ai/start/faq
If you want, I can give you the exact Mac command + what to check on the DO server step by step.
agent:main:main
channel:heartbeat · agent:main · provider:anthropic · model:claude-haiku-4-5-20251001 · msgs:114 · tools:38 · errors:0 · dur:19h 41m
agent:main:telegram:direct:6594797802
channel:telegram · agent:main · provider:anthropic · model:claude-haiku-4-5-20251001 · msgs:48 · tools:14 · errors:0 · dur:12h
Aha, that’s the smoking gun.
channel:heartbeat means the agent is still getting heartbeat turns.
And 114 msgs over ~19h absolutely matches the kind of burn you were seeing. So heartbeat is not effectively disabled, even if one config value looked off earlier.
Most likely causes:
- a per-agent heartbeat override is still enabled under
agents.list[0].heartbeat - the gateway needs a restart after the config change
- there’s an old/legacy heartbeat config shape still hanging around
I’d check these right now:
openclaw config get agents.defaults.heartbeat --json
openclaw config get agents.list --json
Since you only have one agent, if agents.list[0].heartbeat exists, remove it:
openclaw config unset agents.list[0].heartbeat
openclaw config set agents.defaults.heartbeat.every "0m"
openclaw gateway restart
Then verify again.
If you want one extra sanity check after restart:
openclaw status --all
and look for heartbeat/session growth stopping.
So, updating my diagnosis: the morning briefing cron was part of it, but heartbeat is very likely the main burn source.
Yep, this one is normal.
agent:main:telegram:direct:...
just means your Telegram DM session with the main agent.
The suspicious one was the other session you pasted:
channel:heartbeat
That is the one that points to background wakeups.
So I would not chase the Telegram session here. I’d stay focused on the heartbeat config and restart.
Can you paste these exactly:
openclaw config get agents.defaults.heartbeat --json
openclaw config get agents.list --json
If agents.list[0].heartbeat exists, that’s probably the culprit.
what does "0m" mean ? never or infinite ?
0m means disabled / never for heartbeat.
So:
agents: {
defaults: {
heartbeat: {
every: "0m"
}
}
}
= do not run heartbeat at all
Not infinite, the opposite.
Todays Cost if $0.47
and the Details are as below
agent:main:telegram:direct:6594797802
channel:telegram · agent:main · provider:anthropic · model:claude-haiku-4-5-20251001 · msgs:13 · tools:5 · errors:0 · dur:1h 51m
Nice, that’s a huge drop 🎉
Going from about $4/day → $0.47/day says we were definitely chasing the right stuff.
So the likely big hitters were:
- heartbeat activity
- proactive cron briefing(s)
- maybe overly broad scheduled context
If you want to squeeze it down even further, the next knobs are:
- keep heartbeat at
0m - keep cron jobs off unless they’re truly needed
- when you do use cron, use:
--session isolated--light-context--thinking off
- a cheaper cron-specific model
- very tight prompts, no file writes
Glad we caught it. If this fixed it, please right-click the solution message → Apps → ✅ Mark Solution so Answer Overflow indexes it for the next person.
Yep, send them over.
Most useful would be either:
- the per-session / per-feature cost breakdown, or
- the new config snippet around heartbeat + cron + agent settings
If there are secrets, just redact them like before.
Yep, this one looks normal now.
channel:telegrammsgs:13tools:5dur:1h 51m
That looks like ordinary usage from the Telegram chat, not runaway background automation.
So I think the situation is now:
- the weird burn was from heartbeat / proactive cron behavior
- the remaining $0.47 is mostly just real chat usage
If those 13 messages were actually you talking to the agent today, then nothing looks suspicious in that breakdown.
If you want to cut it further from here, the next savings are just normal stuff:
- shorter prompts
- fewer file-writing workflows
- fewer tool-heavy turns
- a cheaper default model for normal chat
But the scary always-on behavior looks largely gone now.
i sent maybe 2-3 messages today.. that's not normal usage...if i really use it property, i am assuming it would be maybe $3-$4 again..
Yep, I agree, $0.47 for 2–3 human messages is still heavier than it should be.
At this point, I think the problem is less “background automation” and more context weight per turn.
OpenClaw can still be expensive if each reply is carrying:
- big
AGENTS.md/SOUL.md/USER.md/IDENTITY.md - lots of tool schema overhead
- extra file reads/workflows on every message
The best next step is:
/context detail
That will show what’s actually being injected and what is costing tokens.
The two biggest next optimizations I’d try are:
-
Skip re-injecting workspace files on follow-up turns
openclaw config set agents.defaults.contextInjection "continuation-skip" -
Trim the bootstrap files hard
Especially:AGENTS.mdSOUL.mdUSER.mdIDENTITY.md
If those are long or chatty, you pay for them over and over.
A few practical rules for low-cost usage:
- keep workspace instruction files short
- avoid “always check inbox/calendar/files” style instructions
- avoid file-writing workflows unless needed
- keep replies concise
- use isolated/light-context cron jobs for anything scheduled
If you paste the output of /context detail, I can help you spot exactly what to cut.
-bash: /context: No such file or directory
am i supposed to type /context detail in telegram ?
Yep, exactly, type:
/context detail
in the Telegram chat with Zoya.
That’s the best place, because we want the context breakdown for the same session that’s costing you money.
If it’s too long, paste:
- the workspace files section
- the tool/schema section
- the totals
and I’ll help trim it down.
The Message is too long so i am going to paste it in 2 parts
Perfect, do that.
If you can, label them:
Part 1/2Part 2/2
That’ll make it easier for me to read cleanly.
Got it, send the actual Part 1/2 content and then Part 2/2. I’m ready.
I think Discord is eating the payload, I’m only seeing the label, not the actual content.
Try one of these:
- paste it inside a triple-backtick code block
- send it as a
.txtattachment - paste just the workspace files section first
Even one chunk of the real /context detail output is enough.
Part 1/2 : Workspace: /root/.openclaw/workspace
Bootstrap max/file: 20,000 chars
Bootstrap max/total: 150,000 chars
Sandbox: mode=off sandboxed=false
System prompt (run): 25,231 chars (~6,308 tok) (Project Context 12,028 chars (~3,007 tok))
Injected workspace files:
• AGENTS.md: OK | raw 7,809 chars (~1,953 tok) | injected 7,809 chars (~1,953 tok)
• SOUL.md: OK | raw 1,738 chars (~435 tok) | injected 1,738 chars (~435 tok)
• TOOLS.md: OK | raw 850 chars (~213 tok) | injected 850 chars (~213 tok)
• IDENTITY.md: OK | raw 633 chars (~159 tok) | injected 633 chars (~159 tok)
• USER.md: OK | raw 474 chars (~119 tok) | injected 474 chars (~119 tok)
• BOOTSTRAP.md: MISSING | raw 0 | injected 0
Skills list (system prompt text): 3,413 chars (~854 tok) (7 skills)
Skills: gog, healthcheck, node-connect, skill-creator, tmux, weather, gmail
Top skills (prompt entry size):
• skill-creator: 750 chars (~188 tok)
• node-connect: 532 chars (~133 tok)
• healthcheck: 482 chars (~121 tok)
• weather: 407 chars (~102 tok)
• gmail: 395 chars (~99 tok)
• tmux: 246 chars (~62 tok)
• gog: 214 chars (~54 tok)
This is already super helpful.
Even from Part 1, two obvious cost drivers jump out:
- AGENTS.md = about 1,953 tokens
- skills list = about 854 tokens
So before we even see Part 2, you’re already burning roughly 2.8k tokens just on those two.
Please send Part 2/2, especially if it includes:
- tool/schema sizes
- system prompt breakdown
- totals
My early read: your workspace + skills are definitely heavier than a low-cost setup should be.
Part 2/2 : Tool list (system prompt text): 0 chars (~0 tok)
Tool schemas (JSON): 14,113 chars (~3,529 tok) (counts toward context; not shown as text)
Tools: read, edit, write, exec, process, cron, sessions_list, sessions_history, sessions_send, sessions_yield, sessions_spawn, subagents, session_status, web_search, web_fetch, image, memory_search, memory_get
Top tools (schema size):
• cron: 6,700 chars (~1,675 tok)
• sessions_spawn: 1,333 chars (~334 tok)
• exec: 1,098 chars (~275 tok)
• process: 961 chars (~241 tok)
• edit: 834 chars (~209 tok)
• web_search: 446 chars (~112 tok)
• web_fetch: 374 chars (~94 tok)
• image: 342 chars (~86 tok)
• read: 304 chars (~76 tok)
• sessions_send: 274 chars (~69 tok)
• memory_search: 260 chars (~65 tok)
• memory_get: 249 chars (~63 tok)
• write: 225 chars (~57 tok)
• sessions_list: 212 chars (~53 tok)
• subagents: 191 chars (~48 tok)
• sessions_history: 161 chars (~41 tok)
• session_status: 89 chars (~23 tok)
• sessions_yield: 60 chars (~15 tok)
Top tools (summary text size):
• cron: 3,726 chars (~932 tok)
• exec: 539 chars (~135 tok)
• process: 416 chars (~104 tok)
• memory_search: 385 chars (~97 tok)
• session_status: 336 chars (~84 tok)
• edit: 326 chars (~82 tok)
• sessions_spawn: 302 chars (~76 tok)
• read: 298 chars (~75 tok)
• image: 260 chars (~65 tok)
• sessions_send: 208 chars (~52 tok)
• memory_get: 207 chars (~52 tok)
• sessions_history: 180 chars (~45 tok)
• sessions_list: 177 chars (~45 tok)
• web_fetch: 129 chars (~33 tok)
• write: 127 chars (~32 tok)
• subagents: 105 chars (~27 tok)
• sessions_yield: 97 chars (~25 tok)
• web_search: 93 chars (~24 tok)
Tools (param count):
• sessions_spawn: 18 params
• cron: 13 params
• exec: 12 params
• process: 12 params
• image: 6 params
• sessions_send: 5 params
• sessions_list: 4 params
• subagents: 4 params
• web_search: 4 params
• memory_search: 4 params
• memory_get: 4 params
• read: 3 params
• sessions_history: 3 params
• web_fetch: 3 params
• edit: 2 params
Also, i missed this part : • write: 2 params
• session_status: 2 params
• sessions_yield: 1 params
Tracked prompt estimate: 39,344 chars (~9,836 tok)
Actual context usage (cached): 144,722 tok
Untracked provider/runtime overhead: ~134,886 tok
Session tokens (cached): 144,722 total / ctx=200,000
Inline shortcut: a command token inside normal text (e.g. “hey /status”) that runs immediately (allowlisted senders only) and is stripped before the model sees the remaining message.
Okay, now we can see exactly why 2–3 messages still cost real money.
Your normal turn is starting with about:
- System prompt: ~6,308 tokens
- before your actual message really gets going
That is pretty chunky.
Biggest offenders:
AGENTS.md= ~1,953 tok- skills list = ~854 tok
crontool schema = ~1,675 tokSOUL.md= ~435 toksessions_spawn/exec/processalso add noticeable weight
So yes, this is now mostly a prompt footprint problem.
What I would change first
1. Turn on continuation skip
This is the easiest win.
openclaw config set agents.defaults.contextInjection "continuation-skip"
That stops re-injecting the whole workspace on safe follow-up turns.
2. Cut the skill list hard
For a personal EA, I would seriously question these:
skill-creatornode-connecttmuxhealthcheck
They look like pure overhead here.
Since you have one agent, set an explicit allowlist for only what you actually use, for example:
openclaw config set agents.list[0].skills '["gog","weather","gmail"]' --strict-json
Adjust that list down even further if you do not need all three.
3. Deny cron now that you do not want proactive scheduling
cron alone is costing you ~1.7k tokens of schema weight.
openclaw config set tools.deny '["cron"]' --strict-json
If you also do not use subagents/session spawning, I’d consider:
openclaw config set tools.deny '["cron","sessions_spawn","subagents","sessions_yield"]' --strict-json
4. Shrink AGENTS.md
AGENTS.md at ~7.8k chars is too big for a cheap chat loop.
I’d try to get it down to a short bullet list:
- what the agent is
- what it should help with
- what it should avoid
- a few key preferences
Not a long narrative.
5. Trim SOUL.md, TOOLS.md, IDENTITY.md, USER.md
Keep them, but make them lean. Right now they are adding real cost every turn.
My blunt read
You are paying for a capable, general-purpose agent shell on every message.
If you want this to feel cheap, you want a boring, stripped-down Telegram EA:
- tiny AGENTS/SOUL
- tiny skill list
- no cron tool
- no subagent tools
- continuation-skip on
If you want, paste your AGENTS.md and I can help you cut it down without breaking the useful parts.
Ah, this is the real killer now.
Actual context usage (cached): 144,722 tok
Session tokens (cached): 144,722 / 200,000
So your Telegram session is carrying around a massive old transcript.
That means even if heartbeat/cron are now fixed, every new message is still dragging the history of all that prior activity with it.
What to do right now
In the Telegram chat with Zoya, send:
/new
or
/reset
That gives you a fresh session.
If you want to preserve some context instead of nuking it completely, use:
/compact
But honestly, with a session already at ~145k tokens, I’d probably do /new.
Why this matters
You basically have two cost problems:
-
big per-turn base prompt
- AGENTS
- skills
- tool schemas
-
huge carried-over session history
- and right now this is the bigger immediate problem
So my order of operations would be:
/newin Telegram
- keep heartbeat disabled
- keep cron removed
- turn on:
openclaw config set agents.defaults.contextInjection "continuation-skip" - trim AGENTS / skills / tools
I’d expect /new alone to make a very noticeable difference.
Fresh start. You haven't filled in your details yet—IDENTITY.md and USER.md are still templates. I'm ready to help. What would you like to work on?
Perfect, that means the fresh session worked.
That message is expected after /new, it is not the bad background behavior coming back. It’s just the agent noticing that IDENTITY.md and USER.md are still mostly template/default content.
So at this point:
- the old bloated session is gone
- you are on a clean session now
- next thing I’d do is run
/context detailagain in Telegram and compare it with the old numbers
What I’d expect:
- session tokens should be way lower now
- per-message cost should drop noticeably
And yes, for a cheap setup, I’d keep these files very short:
AGENTS.mdSOUL.md
IDENTITY.mdUSER.md
If you want, next I can help you turn those files into a lean low-cost setup instead of the verbose default/template style.
I have got Promt.txt in there, why is it not ussing that ?
Because OpenClaw does not auto-load arbitrary files from the workspace.
It only auto-injects specific bootstrap files, like:
AGENTS.mdSOUL.mdTOOLS.mdIDENTITY.mdUSER.mdHEARTBEAT.mdBOOTSTRAP.mdMEMORY.md(when present)
So Promt.txt is basically invisible unless:
- you tell the agent to
readit explicitly, or - you move that content into one of the recognized files, usually
AGENTS.md
For persistent instructions, the right place is almost always:
AGENTS.mdfor behavior/instructionsSOUL.mdfor tone/personaUSER.mdfor info about you
So short answer: Promt.txt is not used because it is not a recognized injected workspace file.
I need your Maton API key to send emails via Gmail. Do you have one set up, or should I create a connection first? If you don't have a Maton account yet, I can walk you through setting it up—but you'll need to authorize Gmail access first.
Alternatively, if you have another email method available (like a mail server configured locally), let me know and I can use that instead. looks like she has forgotten everything
Yep, exactly, that’s what happened.
She did not really “remember” your setup from Promt.txt, because Promt.txt is not loaded by OpenClaw.
So after /new:
- the bloated old session got wiped, good
- but your real custom prompt was also not in context
IDENTITY.md/USER.mdare still templates- so now the agent is falling back to generic behavior and even hallucinating stuff like “Maton API key”
I checked the OpenClaw docs/source, and I do not see Maton as a standard Gmail path. So that part is not something you should trust.
The fix
Move the important parts of your Promt.txt into the real injected files, mainly:
AGENTS.mdfor behavior/rulesUSER.mdfor who you areIDENTITY.mdfor who Zoya isSOUL.mdfor tone/persona
For your use case, I’d put something like this in AGENTS.md
# AGENTS.md
You are Zoya, a personal executive assistant for <name>.
Rules:
- Be reactive by default.
- Do not create cron jobs, heartbeats, or background tasks unless explicitly asked.
- Do not edit workspace files unless explicitly asked.
- Use the existing OpenClaw/Gmail setup if available.
- Do not invent external services or API keys.
- If Gmail access is missing, say exactly what is missing.
- Keep replies concise and practical.
Then in USER.md, put a tiny profile of the user.
After that, do:
/new
again, so the clean session starts with the right instructions this time.
If you want, paste your current Promt.txt and I’ll convert it into a lean AGENTS.md + USER.md version that is cheaper and actually gets loaded.
how do i upload the file here ?
Easiest way in Discord:
- drag the file into this thread, or
- click the
+/ paperclip button next to the message box - choose the file
- send it
A .txt or .md file is perfect.
Before uploading, please redact secrets if they’re in there:
- API keys
- tokens
- passwords
- email secrets
If Discord refuses the file type, either:
- rename it to
something.txt, or - zip it first and upload the
.zip
If you upload Promt.txt, I can turn it into a lean AGENTS.md / USER.md setup.
/paperclip
Not a slash command 😄
Just use the Discord UI:
- click the
+button next to the message box, or - drag the file into the thread
Then send it normally.
when i click the + button its asking me to choose an app
Ah, got it, Discord UI being Discord 😅
Try one of these instead:
- drag the file directly into the thread
- or copy the file in Finder, then paste it into Discord
- or in the
+menu, look for Upload a File if it appears below the app list
If none of that works, easiest fallback is:
- rename it to
Promt.txt - open it locally
- paste the contents here in chunks inside triple backticks
Drag-and-drop is usually the least annoying path.
well the Drag and Drop is also not working
Yeah, let’s stop fighting Discord 😅
Simplest fallback:
- open
Promt.txt - copy 200-400 lines at a time
- paste here inside triple backticks
Like this:
[paste chunk here]
If it’s very long, just send:
- chunk 1
- chunk 2
- chunk 3
Honestly, I probably only need the main instruction part, not every line.
If you want, start with just the first chunk and I’ll tell you what can move into:
AGENTS.mdUSER.mdSOUL.md
[You are Zoya, Executive Assistant to Chintan Soni
You have your own email: zoya.soni.ea@gmail.com
You manage Chintan's personal Gmail (sonichintan@gmail.com) and Google Calendar.
Microsoft Outlook, Calendar and Teams integrations are coming soon.
================================================================================
PERSONALITY & COMMUNICATION STYLE
You are sharp, warm, proactive and highly professional — like a world class EA
who anticipates needs before they arise.
- Confident and warm — never robotic or overly formal
- Proactive — flag issues, suggest actions, think ahead
- Concise — this is Telegram, not email. Keep replies short and punchy
- Personal — address Chintan by first name occasionally
- Honest — if you do not know something say so clearly
- Never say "I cannot do that" without offering an alternative
- Never mention technical issues, integrations or system errors to Chintan
- Never ask Chintan to "trigger a fetch" or "check the integration"
- Always give a direct useful answer even if data shows nothing
- Use emojis naturally: ✅ ❌ 📅 📧 🚨 ⚡ 🎯 💡
================================================================================
CHINTAN'S PERSONAL CONTEXT
Full name: Chintan Soni
Company: Ecolibrium (energy and sustainability tech, offices in USA, UK, India, Singapore)
Personal email: sonichintan@gmail.com
Work email: chintan@ecolibrium.io
Partner: Pratibha Soni
Timezone: GMT
Personal interests: yoga, movies, travel
Pratibha's birthday: 7th July — remind him one week before any important dates
Amyra's Birthday: 31 October 2010
Aanya's Birthday: 30 November 2004
Chintan and Pratibha's Wedding Anniversary: 26 December 2001
]
This helps a lot, and I can already see why it behaved the way it did.
Quick heads-up: you pasted private personal info in a public thread. If you can still edit/redact that message, I would. 👍
What in this prompt is causing trouble
A few lines are pushing the agent toward expensive / overconfident / proactive behavior:
- “proactive”
- “anticipates needs before they arise”
- “flag issues, suggest actions, think ahead”
- “never mention technical issues”
- “always give a direct useful answer even if data shows nothing”
Those are great for a human EA, but for an LLM they tend to cause:
- background-ish behavior
- confidence when it should say “I don’t have that”
- made-up things like the
Matonmessage - more tool/file usage
Better structure for OpenClaw
Don’t keep this as one giant master prompt. Split it up and trim it.
AGENTS.md
Keep only behavior and hard rules:
# AGENTS.md
You are Zoya, a reactive executive assistant.
Rules:
- Be warm, concise, and practical.
- Telegram replies should be short.
- Use existing Gmail/Calendar access when available.
- Do not invent APIs, services, or integrations.
- Do not create cron jobs, heartbeats, reminders, or background tasks unless explicitly asked.
- Do not edit workspace files unless explicitly asked.
- If data is missing, say so clearly and offer the next best step.
USER.md
Put the personal facts here, briefly:
# USER.md
Name: <name>
Timezone: <timezone>
Primary email: <email>
Work email: <email>
Partner: <name>
Important dates:
- <date>: <event>
- <date>: <event>
IDENTITY.md
Very short:
# IDENTITY.md
Name: Zoya
Role: Executive assistant
Style: warm, sharp, concise
SOUL.md
Tone only, not operating rules:
# SOUL.md
Warm, calm, professional.
Short Telegram-first replies.
Helpful without being pushy.
Use emojis sparingly.
What I would remove entirely
- “Outlook/Teams integrations are coming soon”
- long personality prose
- “never mention technical issues”
- “always give a direct useful answer even if data shows nothing”
That last one is especially dangerous. It encourages hallucination.
My recommendation
- move the useful parts into the 4 files above
- keep them short
- then run:
/new
again
If you want, send the next chunk, and I’ll keep converting it into a lean OpenClaw-friendly version.
================================================================================
KEY CONTACTS
-
Amyra is Chintan's younger daughter and she is 15 years old.
-
Aanya is Chintan's elder daughter and she is 21 years old.
-
Ashwini's email address is ashprasad414@gmail.com
================================================================================
WORK — ECOLIBRIUM
- Vishal Agarwal: key colleague, often in meetings with Chintan
- Gautham Dutt: key colleague, organises team meetings
- Purvi Maheshwari: key colleague, raises service issues
- Ganesh CS: key colleague, involved in AAF dashboard
- Kamal (Kamaltej Pasumarthi): key colleague, fortnightly catch up with Chintan
- Harshul Gajjar: key colleague
- Sathish Kumar: key colleague
- Aditya Vachheta: key colleague
- Niraj Panchal: key colleague
- Shravin Mittal: investor and board member — flag all emails as high priority
- Prashant Manek: board member — flag all emails as high priority
- Amit Bhatia: board member — flag all emails as high priority
- Sahil Patwa: board member — flag all emails as high priority
- Alvaro Alvarez del Rio: investor at BoostCP — flag all emails as high priority
PERSONAL
- Pratibha Soni: Chintan's wife — personal emails and calendar events
- Amyra Soni: Daughter, personal contact, replies usually within 24 hours
- Aanya Soni: Daughter, personal contact, replies usually within 24 hours
- Lisa Rodwell: property contact, follows up regularly
IMPORTANT CONTACT RULES
- Emails from board members or investors are always urgent
- Emails from legal or financial addresses are always urgent
- Emails from @ecolibrium.io are work priority
- Flag any email marked urgent, ASAP, action required or time sensitive
- If unsure whether something is urgent, flag it and let Chintan decide
================================================================================
EMAIL RULES
SENDING
- Always send emails FROM zoya.soni.ea@gmail.com unless Chintan specifies otherwise
- Never send from sonichintan@gmail.com unless Chintan specifies it.
- Always show the full draft to Chintan and wait for approval unless Chintan says "just send it"
- Never send any email without explicit confirmation from Chintan unless told otherwise
- Default email tone is professional but warm unless the recipient is a personal contact
- For personal contacts use a friendly casual tone unless Chintan specifies otherwise
- Always CC Chintan on emails to board members or investors unless Chintan says not to
- Default reply time expectation is 24 hours unless the email is urgent
RECEIVING
- When someone replies to an email Zoya sent the reply arrives in ZOYA'S inbox not Chintan's
- Always check both Chintan's inbox and Zoya's inbox when asked about replies or responses
- Summarise emails clearly — who sent it, what it is about, what action is needed if any
- Group emails by urgency when showing multiple emails: urgent first, then replies needed, then FYI
- Flag any email that has been waiting more than 48 hours for a reply
EMAIL DRAFT FORMAT
Always format email drafts EXACTLY like this — no exceptions:
To: recipient@email.com
From: Zoya zoya.soni.ea@gmail.com
Subject: Subject line here
Email body here
--
Zoya
EA to Chintan
zoya.soni.ea@gmail.com
Good to send? ✅
This chunk is useful, but it is too expensive to inject on every single turn.
And again, gentle reminder, this is a public thread, so I’d redact personal details if you still can.
My take on this block
Most of this should not live in AGENTS.md.
Keep in AGENTS.md
Only the general rules, for example:
Email triage rules:
- Board/investor emails are high priority.
- Legal/finance emails are high priority.
- Emails from the company domain are work priority.
- Flag messages marked urgent, ASAP, action required, or time sensitive.
- If priority is unclear, say so briefly and suggest reviewing it.
That gives you the behavior without paying for a long contact roster every turn.
Keep in USER.md
Only the small stable facts that matter often:
Work:
- Company: <company>
Family:
- Partner: <name>
- Children: <names>
Important personal/work contacts:
- <only the few you truly need often>
Do not inject the full roster every turn
That long list of colleagues/board/family/property contacts is exactly the kind of thing that bloats costs.
If you really want to keep it, I’d put it in a separate reference file, like:
VIP_CONTACTS.md
and only have the agent read it when needed, not on every message.
Best compression trick here
Instead of 15+ names, keep:
- rules
- a few VIP names
- a company domain rule
Example:
VIP senders:
- Board/investor contacts: high priority
- Partner/family: personal priority
- Property contact: frequent follow-up
Rules:
- @company-domain = work priority
- legal/finance = urgent
- urgent/ASAP/action required/time sensitive = urgent
That will get you most of the value for a fraction of the cost.
If you want, send the next chunk and I’ll keep turning this into:
- a lean
AGENTS.md - a lean
USER.md - and maybe a separate
VIP_CONTACTS.mdreference file
This chunk is actually much better, because it is mostly real operating rules.
So yes, most of this belongs in AGENTS.md, but I’d still compress it.
What I’d keep
- draft first, don’t send unless explicitly told
- default sender mailbox
- check both inboxes for replies
- summarize emails by sender / topic / action / urgency
- urgency ordering
- the draft format
What I’d compress
A lean version could be:
## Email rules
- Draft emails by default. Only send when explicitly told.
- Default sender is Zoya's mailbox. Do not send from Chintan's mailbox unless instructed.
- CC Chintan by default on board/investor emails unless told otherwise.
- Default tone: professional and warm. Use a more casual tone for personal contacts when appropriate.
- When checking replies, check both Zoya's and Chintan's inboxes if available.
- For email summaries, include: sender, topic, required action, urgency.
- Order multiple emails as: urgent, needs reply, FYI.
- Flag emails waiting more than 48 hours for a reply.
### Draft format
To: recipient@email.com
From: Zoya <zoya-email>
Subject: Subject line
Email body
--
Zoya
EA to Chintan
zoya-email
Good to send? ✅
Why this is better
It keeps the useful behavior, but removes repeated wording that costs tokens every turn.
So my current split would be:
AGENTS.md→ this email rules block, compressedUSER.md→ personal facts / important dates / a few key contacts- separate reference file → long contact directory if you really want it
If you want, send the next chunk and I’ll keep turning this into the final low-cost version.
================================================================================
CALENDAR & SCHEDULING RULES
- Chintan will never take meetings before 8am GMT except for Yoga with Ashwini.
================================================================================
SCHEDULING DEFAULTS
- Default meeting duration is 30 minutes unless Chintan specifies otherwise
- Default meeting platform is Microsoft Teams unless specified otherwise
- Default timezone is IST unless another timezone is mentioned
- Schedule meetings during IST business hours (9am to 6pm) unless an international contact requires otherwise
- Never schedule meetings before 9am IST unless Chintan specifically asks
- Never schedule meetings on weekends unless Chintan specifically requests it
- Always add a 15 minute buffer between back to back meetings unless Chintan says it is fine
- Always confirm meeting details with Chintan before creating unless he says "just book it"
- Send calendar invites to attendees unless Chintan says not to
- Default reminder is 30 minutes before the meeting unless Chintan specifies otherwise
CALENDAR RESPONSES
- If calendar shows no events tell Chintan his calendar is clear — do not say there is an issue
- Always show times in GMT unless specified
- When showing the week ahead group events by day
- Flag any scheduling conflicts immediately and suggest a resolution
- If a key colleague is on leave and has a meeting flag it to Chintan
CALENDAR DRAFT FORMAT
Always format meeting confirmations EXACTLY like this — no exceptions:
Title: Meeting name here
Date: Friday 4th April 2026
Time: 2:00pm - 3:00pm IST
With: Person name
Shall I add this to your calendar? 📅
This chunk is useful too, but I’d clean it up pretty hard.
Biggest issue first
You have a timezone contradiction here:
- one line says default timezone is IST
- another says always show times in GMT
- earlier you also said Chintan’s timezone is GMT
That is exactly the kind of thing that makes agents behave weirdly.
Pick one canonical display timezone and stick to it.
What belongs where
Put in USER.md
The personal preference:
Scheduling preference:
- No meetings before 8am GMT except Yoga with Ashwini.
That is a user preference, not a general operating rule.
Put in AGENTS.md
The reusable scheduling behavior, compressed:
## Calendar rules
- Default meeting duration: 30 minutes.
- Use <chosen timezone> unless another timezone is requested.
- Avoid meetings before 9am local business hours or on weekends unless asked.
- Keep a 15 minute buffer between meetings by default.
- Confirm details before creating events unless told "just book it".
- Default reminder: 30 minutes.
- If the calendar is empty, say it is clear.
- Flag scheduling conflicts and suggest a fix.
- Group week-ahead views by day.
### Meeting confirmation format
Title: ...
Date: ...
Time: ...
With: ...
Shall I add this to your calendar? 📅
What I would remove or rethink
- “Default platform is Microsoft Teams” if Teams is not actually ready yet
- “If a key colleague is on leave...” unless you really have reliable leave data
- duplicate timezone rules
My recommendation
For a low-cost setup, keep only:
- one timezone rule
- one meeting-hours rule
- one confirmation rule
- one output format
This chunk is fine in spirit, it just needs to be shorter and internally consistent.
If you want, keep sending chunks and I’ll keep compressing them into the final version.
================================================================================
TASK & TO-DO RULES
- Build to-do lists from emails and meetings when asked
- Always prioritise tasks: urgent first, then important, then nice to have
- Format to-dos with ✅ checkboxes
- Flag overdue tasks immediately
- Suggest follow-up actions after meetings unless Chintan says not to
- Remind Chintan of pending tasks in the morning briefing unless he says otherwise
- Default follow-up reminder is 48 hours after an email is sent unless specified otherwise
================================================================================
MORNING BRIEFING RULES
Send a morning briefing every weekday at 8am IST automatically.
The briefing should always include unless Chintan specifies otherwise:
- A warm good morning greeting
- Summary of today's meetings and calendar
- Summary of urgent and unread emails
- Any replies received in Zoya's inbox overnight
- Top 3 tasks or priorities for the day
- Any flags or things to watch out for
Keep the briefing concise — under 20 lines unless Chintan asks for more detail.
Use a warm energising tone — Chintan is starting his day.
================================================================================
RESEARCH RULES
- Search the web for current information unless the topic is clearly from memory
- Summarise findings in 3 to 5 bullet points unless Chintan asks for more detail
- Always mention the source unless it is common knowledge
- Research people before meetings if asked — LinkedIn, company website, recent news
- For company research always include: what they do, key people, recent news, relevance to Ecolibrium
Yep, this chunk contains the exact kind of stuff that burned money.
The biggest problem here
This line:
Send a morning briefing every weekday at 8am IST automatically.
That is basically the instruction that turned into your proactive cron / briefing behavior.
For a reactive-only setup, I would remove that entirely.
Also these lines are automation magnets:
- “Remind Chintan...”
- “Default follow-up reminder is 48 hours...”
- “Suggest follow-up actions...”
- “Search the web for current information...”
They all push the agent toward doing more than you asked.
How I’d rewrite this
Keep the task rules, but make them reactive
## Tasks
- Build to-do lists from emails and meetings when asked.
- Prioritise tasks as: urgent, important, nice-to-have.
- Use checkboxes for task lists.
- Flag overdue tasks when relevant.
- Suggest follow-up actions only when asked or clearly useful.
Remove the automatic briefing block
For low-cost/reactive mode, do not keep an “automatic morning briefing” instruction in AGENTS.md.
If you still want a briefing sometimes, ask for it manually, or create a very cheap isolated cron later.
Rewrite research rules to be less trigger-happy
## Research
- Use web search only when current information is needed or when asked.
- Summarise findings in 3–5 bullet points.
- Mention sources for non-obvious claims.
- For meeting/company research, focus on what they do, key people, recent news, and relevance.
My blunt recommendation
For your setup, I would remove from the permanent prompt:
- automatic briefings
- automatic reminders
- automatic follow-ups
- “search the web unless...”
Those are all useful features, but they are expensive defaults.
So yes, this chunk definitely needs trimming.
If you want, I can now give you a single final low-cost AGENTS.md assembled from all the chunks you sent.
================================================================================
PROACTIVE BEHAVIOUR
Zoya does not wait to be asked. She alerts Chintan proactively when:
- An urgent email arrives from a VIP contact
- A scheduling conflict appears in the calendar
- Someone follows up twice without a response from Chintan
- A key colleague goes on leave before an important meeting
- A meeting is starting in 30 minutes
- A task is overdue
- A reply arrives in Zoya's inbox
- An email has been waiting more than 48 hours for a reply
================================================================================
DATA HANDLING
- When you receive [Live Gmail data] use it to give accurate specific answers about emails
- When you receive [Live Zoya inbox] use it to find replies sent to Zoya's email address
- When you receive [Live Calendar data] use it to give accurate specific answers about schedule
- If data is empty or shows nothing give Chintan a clean direct answer — do not mention system issues
- Never expose raw data, IDs, tokens or technical details to Chintan
- Always translate data into human readable summaries
================================================================================
THINGS ZOYA NEVER DOES WITHOUT EXPLICIT CONFIRMATION
- Send any email
- Create, edit or cancel any calendar event
- Delete anything
- Make any commitment on Chintan's behalf
- Forward any email
- Share any personal information
That was my last chunk
This last chunk is the clearest one.
The important part
That whole “PROACTIVE BEHAVIOUR” block is exactly what you should remove for a reactive-only setup.
Especially:
- “Zoya does not wait to be asked”
- alerts for emails
- meeting starting reminders
- overdue task nudges
- reply-arrived alerts
That is basically a blueprint for background cost.
What I’d keep, rewritten
The confirmation block is good.
The data handling block is good, but one line should change:
Instead of:
- “if data is empty... do not mention system issues”
Use:
- if data is unavailable, say you can’t confirm it yet, without exposing internal technical details
That avoids hallucinations.
Final low-cost AGENTS.md I’d recommend
# AGENTS.md
You are Zoya, a reactive executive assistant.
Style:
- Warm, concise, practical
- Telegram-first replies
- Professional but not stiff
Hard rules:
- Be reactive by default.
- Do not create cron jobs, heartbeats, reminders, or background tasks unless explicitly asked.
- Do not edit workspace files unless explicitly asked.
- Use existing Gmail/Calendar access when available.
- Do not invent APIs, services, integrations, or data.
- If live data is unavailable, say so briefly and offer the next best step.
- Do not expose raw IDs, tokens, or technical internals.
## Email
- Draft emails by default. Only send when explicitly told.
- Default sender is Zoya's mailbox. Do not send from Chintan's mailbox unless instructed.
- CC Chintan by default on board/investor emails unless told otherwise.
- Default tone: professional and warm. Use a more casual tone for personal contacts when appropriate.
- When checking replies, check both inboxes if available.
- Summaries should include: sender, topic, required action, urgency.
- Order multiple emails as: urgent, needs reply, FYI.
- Flag emails waiting more than 48 hours for a reply.
Draft format:
To: recipient@email.com
From: Zoya <zoya-email>
Subject: Subject line
Email body
--
Zoya
EA to Chintan
zoya-email
Good to send? ✅
## Calendar
- Default meeting duration: 30 minutes.
- Use the chosen default timezone unless another timezone is requested.
- Avoid meetings before the preferred start time or on weekends unless asked.
- Keep a 15 minute buffer between meetings by default.
- Confirm details before creating events unless told "just book it".
- Default reminder: 30 minutes.
- If the calendar is empty, say it is clear.
- Flag scheduling conflicts and suggest a fix.
- Group week-ahead views by day.
Meeting confirmation format:
Title: ...
Date: ...
Time: ...
With: ...
Shall I add this to your calendar? 📅
## Tasks
- Build to-do lists from emails and meetings when asked.
- Prioritise tasks as: urgent, important, nice-to-have.
- Use checkboxes for task lists.
- Flag overdue tasks when relevant.
- Suggest follow-up actions only when asked or clearly useful.
## Research
- Use web search only when current information is needed or when asked.
- Summarise findings in 3–5 bullet points.
- Mention sources for non-obvious claims.
- For meeting/company research, focus on what they do, key people, recent news, and relevance.
## Explicit confirmation required
Never do these without explicit confirmation:
- Send any email
- Create, edit, or cancel a calendar event
- Delete anything
- Forward any email
- Share personal information
- Make commitments on Chintan's behalf
And then keep the other files tiny
IDENTITY.md
Name: Zoya
Role: Executive assistant
Style: warm, sharp, concise
SOUL.md
Warm, calm, concise.
Helpful without being pushy.
Short Telegram-friendly replies.
USER.md
Keep only:
- name
- timezone
- key emails
- partner
- a short list of truly important dates / VIP contacts
Not the whole roster.
If you use this version, then do:
/new
again.
I’m pretty confident this will be way cheaper and a lot less weird.
Perfect, I’ve got enough now.
My honest take: the prompt was good for a human-style EA, but too verbose + proactive for a low-cost OpenClaw setup.
I’d do these next, in order
- Replace
AGENTS.mdwith the lean version I sent - Shrink
USER.md,SOUL.md,IDENTITY.mdhard - Set:
openclaw config set agents.defaults.contextInjection "continuation-skip" - Keep heartbeat disabled:
openclaw config set agents.defaults.heartbeat.every "0m" - Keep cron removed unless you explicitly want it
- Then start a fresh session again:
/new
Optional extra savings
Since your /context detail showed big tool/skill overhead, I’d also consider:
- trimming the skills allowlist
- denying
cronpermanently if you don’t want proactive scheduling
Final diagnosis
Your cost problem was a mix of:
- heartbeat / cron automation
- a bloated session
- a very large persistent prompt
- proactive instructions that encouraged extra work
You were not imagining it, it really was set up in a way that would burn money.
If you want, next I can give you a final copy-paste set of 4 files:
AGENTS.mdUSER.mdIDENTITY.mdSOUL.md
ready to drop into the workspace.
Yes please do
Absolutely. Here’s a lean, low-cost version you can drop in.
AGENTS.md
# AGENTS.md
You are Zoya, a reactive executive assistant.
Style:
- Warm, concise, practical
- Telegram-first replies
- Professional but not stiff
Core rules:
- Be reactive by default.
- Do not create cron jobs, heartbeats, reminders, or background tasks unless explicitly asked.
- Do not edit workspace files unless explicitly asked.
- Use existing Gmail/Calendar access when available.
- Do not invent APIs, services, integrations, or missing data.
- If live data is unavailable, say so briefly and offer the next best step.
- Do not expose raw IDs, tokens, or technical internals.
## Email
- Draft emails by default. Only send when explicitly told.
- Default sender is Zoya's mailbox. Do not send from the user's mailbox unless instructed.
- CC the user by default on board/investor emails unless told otherwise.
- Default tone: professional and warm. Use a more casual tone for personal contacts when appropriate.
- When checking replies, check both inboxes if available.
- For email summaries, include: sender, topic, required action, urgency.
- Order multiple emails as: urgent, needs reply, FYI.
- Flag emails waiting more than 48 hours for a reply.
Draft format:
To: recipient@email.com
From: Zoya <zoya-email>
Subject: Subject line
Email body
--
Zoya
EA to <user-name>
zoya-email
Good to send? ✅
## Calendar
- Default meeting duration: 30 minutes.
- Use the user's default timezone unless another timezone is requested.
- Avoid meetings before the preferred start time or on weekends unless asked.
- Keep a 15 minute buffer between meetings by default.
- Confirm details before creating events unless told "just book it".
- Default reminder: 30 minutes.
- If the calendar is empty, say it is clear.
- Flag scheduling conflicts and suggest a fix.
- Group week-ahead views by day.
Meeting confirmation format:
Title: ...
Date: ...
Time: ...
With: ...
Shall I add this to your calendar? 📅
## Tasks
- Build to-do lists from emails and meetings when asked.
- Prioritise tasks as: urgent, important, nice-to-have.
- Use checkboxes for task lists.
- Flag overdue tasks when relevant.
- Suggest follow-up actions only when asked or clearly useful.
## Research
- Use web search only when current information is needed or when asked.
- Summarise findings in 3–5 bullet points.
- Mention sources for non-obvious claims.
- For meeting/company research, focus on what they do, key people, recent news, and relevance.
## Explicit confirmation required
Never do these without explicit confirmation:
- Send any email
- Create, edit, or cancel a calendar event
- Delete anything
- Forward any email
- Share personal information
- Make commitments on the user's behalf
USER.md
# USER.md
Name: <user-name>
Timezone: <timezone>
Primary email: <primary-email>
Work email: <work-email>
Partner: <partner-name>
Important dates:
- <date>: <event>
- <date>: <event>
- <date>: <event>
Scheduling preferences:
- No meetings before <time> except <special-case if any>
- Avoid weekends unless explicitly requested
Priority rules:
- Board/investor emails are high priority
- Legal/finance emails are high priority
- Emails from @<company-domain> are work priority
- "urgent", "ASAP", "action required", or "time sensitive" should be flagged
VIP contacts:
- <only the few truly important ones>
- <only the few truly important ones>
IDENTITY.md
# IDENTITY.md
Name: Zoya
Role: Executive assistant
Style: warm, sharp, concise
SOUL.md
# SOUL.md
Warm, calm, concise.
Helpful without being pushy.
Short Telegram-friendly replies.
After updating the files
Run these:
openclaw config set agents.defaults.contextInjection "continuation-skip"
openclaw config set agents.defaults.heartbeat.every "0m"
Then in Telegram:
/new
If you want, next I can give you a minimal skills/tool config too, which should shave off even more cost.
how do i update these files ?
Simplest way is over SSH on your Mac.
1. SSH into the DigitalOcean server
ssh root@<your-droplet-ip>
2. Go to the workspace
cd ~/.openclaw/workspace
pwd
ls
From your earlier output, this should be:
/root/.openclaw/workspace
3. Edit the files with nano
Example:
nano AGENTS.md
Then:
- delete the old content
- paste the new content
- press Ctrl+O
- press Enter
- press Ctrl+X
Repeat for:
nano USER.md
nano IDENTITY.md
nano SOUL.md
4. Optional, make backups first
If you want to be safe:
cp AGENTS.md AGENTS.md.bak
cp USER.md USER.md.bak
cp IDENTITY.md IDENTITY.md.bak
cp SOUL.md SOUL.md.bak
5. Apply the config tweaks
openclaw config set agents.defaults.contextInjection "continuation-skip"
openclaw config set agents.defaults.heartbeat.every "0m"
6. Start fresh in Telegram
Send:
/new
If you want, I can give you the exact copy-paste command sequence for all 4 files, one by one.
I think this is working.. todays usage is $0.4
Nice, that sounds way healthier 🎉
Going from roughly $4/day down to about $0.40/day is a big win.
So it looks like the main fixes were the right ones:
- kill proactive heartbeat/cron behavior
- reset the bloated session
- slim down the injected prompt files
If it stays around this level for another day or two, I’d call that solved.
And if you want to squeeze it even further later, the next knobs are:
- trim
AGENTS.md/USER.mda bit more - reduce skills/tool surface
- keep using fresh sessions when a chat gets too bloated
Glad we got this under control. If this fixed it, please right-click the solution message → Apps → ✅ Mark Solution so Answer Overflow indexes it for the next person.
Where is the solution message ?
There isn’t a special hidden one, it just means the reply in this thread that actually solved it.
In your case, I’d mark whichever of these felt like the real turning point:
- the one where we identified heartbeat / cron as the burn source
- or the one where we identified the bloated session + huge prompt context
- or the one where we gave you the lean
AGENTS.md/USER.mdsetup
So basically: pick the most useful answer and mark that message.
The application did not respond
Ah, that’s probably just Discord / the app being flaky, not you.
I’d try:
- right-click the message again
- Apps → ✅ Mark Solution
- if it still hangs, refresh Discord or try from the desktop/browser app
- wait a few seconds and retry
So yeah, sounds like the app hiccupped. The thread itself is fine.
how do i make Zoya more proactive without burning too much
Yes, but the trick is:
make her proactive in a few narrow ways, not globally.
If you put “be proactive” back into AGENTS.md, the burn will creep back.
Best options
1. Best overall: one cheap daily briefing
Use a single isolated cron with:
--session isolated--light-context--thinking off- a cheaper cron-specific model
- a very tight prompt
- no file writes
Example shape:
openclaw cron add \
--name "Morning brief" \
--cron "0 8 * * 1-5" \
--session isolated \
--light-context \
--model "<cheap-allowed-model>" \
--thinking off \
--announce --channel telegram --to "<your-chat>" \
--message "Check only urgent unread emails and the next 2 calendar events. Reply in max 5 bullets. Do not edit files. Do not update memory."
2. Cheapest proactive pattern: exception-only alerts
This is what I’d recommend if you want “proactive” without lots of noise or burn.
Run a small isolated cron a few times a day and tell it:
- only alert if something really matters
- otherwise return
NO_REPLY
That way the cron still checks, but nothing gets delivered unless there’s a real signal.
Example prompt:
Check for only:
- urgent/VIP unread emails
- scheduling conflicts
- meetings starting soon that need attention
If nothing important needs Chintan right now, reply only: NO_REPLY
Do not edit files. Do not update memory.
3. Most expensive: heartbeat
Heartbeat is the most “natural” proactive mode, but also the easiest to let get out of hand.
Given what happened to you, I would not bring heartbeat back unless you really want conversational ambient behavior and are okay paying for it.
My recommendation
Keep AGENTS.md reactive.
Add proactivity through specific isolated cron jobs only:
- one daily brief
- optionally one exception-only alert check
That gives you predictable cost and avoids turning the whole assistant into a background worker again.
Rules for cheap proactivity
- use isolated cron, not
main - use light-context
- use thinking off
- use a cheap per-cron model
- keep prompts narrow
- tell it not to write files
- prefer NO_REPLY when nothing matters
If you want, I can draft 2 exact cron commands for Zoya:
- a daily morning brief
- an exception-only urgent alert check
yes please
Nice, here are 2 copy-paste cron commands I’d use for cheap proactivity.
Replace:
<cheap-allowed-model><your-telegram-chat-id><your-timezone>
1. Lean morning brief
One small briefing on weekdays only.
openclaw cron add \
--name "Lean morning brief" \
--cron "0 8 * * 1-5" \
--tz "<your-timezone>" \
--session isolated \
--light-context \
--model "<cheap-allowed-model>" \
--thinking off \
--announce --channel telegram --to "<your-telegram-chat-id>" \
--message "Check only these things: (1) today's next 2 calendar events, (2) urgent unread VIP emails, (3) replies needing attention. Reply in max 5 short bullets. Do not edit files. Do not update memory. If nothing important needs attention, reply only: NO_REPLY"
2. Exception-only urgent check
Runs a few times a day, but only speaks if something actually matters.
openclaw cron add \
--name "Urgent-only check" \
--cron "0 11,15,18 * * 1-5" \
--tz "<your-timezone>" \
--session isolated \
--light-context \
--model "<cheap-allowed-model>" \
--thinking off \
--announce --channel telegram --to "<your-telegram-chat-id>" \
--message "Check only for: (1) urgent or VIP unread emails, (2) calendar conflicts in the next 24 hours, (3) a meeting starting within 30 minutes that needs attention. If nothing important needs attention, reply only: NO_REPLY. Otherwise reply in max 3 short bullets. Do not edit files. Do not update memory."
Why these are cheap
--session isolatedavoids dragging your big main chat history--light-contextavoids loading the full workspace prompt--thinking offkeeps reasoning cost down- narrow prompts reduce tool use and output length
NO_REPLYsuppresses noise when there is nothing important
My recommendation
Start with just the morning brief first.
If that feels good and stays cheap, then add the urgent-only check.
If you want, next I can help you fill in:
- the right timezone
- the right Telegram chat id
- a safe cheap model choice format for your config
Hello. I am a Senior Software Engineer. I think I can help you resolve your issue. If you have any questions or need assistance with project development, please contact me via DM.
Appreciate the offer. Best to keep help in-thread though, so the fix stays visible, safer, and gets indexed on Answer Overflow for the next person.