#Since swapping from Claude to Codex 5.3. Been having a few issues.
1 messages · Page 1 of 1 (latest)
Yeah — this usually means one of 3 things: session got wedged, model/auth mismatch, or channel policy blocking replies.
Can you run this exact quick sweep and paste output?
openclaw --version
openclaw status --all
openclaw models status
openclaw channels status --probe
openclaw memory status --deep
openclaw logs --follow
Then in chat with your bot, do:
/new- send:
Reply with exactly: OK
If it still “works forever” and never finishes, do one A/B test: switch back to your previous model for that same OK test. If that works, it’s likely model/tool compatibility rather than gateway health.
Also check for these log signatures specifically:
Model "... is not allowed"No API key found for provider ...pairing required/mention required- repeated tool call errors / 4xx / 5xx
Docs runbooks (same flow):
https://docs.openclaw.ai/help/faq#first-60-seconds-if-something-is-broken
https://docs.openclaw.ai/gateway/troubleshooting#no-replies
yeah cant post that all here because it's being blocked
Totally fine — Discord blocks giant dumps all the time.
Can you post just these tiny outputs instead:
openclaw --version
openclaw models status --check; echo "exit=$?"
openclaw agent --message "Reply with exactly OK" --json
Then (filtered log only, ~20 lines):
tail -n 300 "$(ls -t /tmp/openclaw/openclaw-*.log | head -1)" \
| rg -i "error|fail|timeout|pairing|required|mention|blocked|embedding|tool" \
| tail -n 40
Also do this in Discord once:
/new- send:
Reply with exactly OK
If openclaw agent ... --json works but Discord still hangs, it’s likely channel/session policy (not model runtime).
If it fails only after switching to Codex and works on your previous model, that points to model/tool compatibility and we can set a safer fallback path.
here's the logs 6:03:57+00:00 info gateway/channels/discord {"subsystem":"gateway/channels/discord"} discord client initialized as REMOVED (OpenClaw); awaiting gateway readiness
16:09:10+00:00 error [openai-codex] Token refresh failed: 401 {
"error": {
"message": "Your refresh token has already been used to generate a new access token. Please try signing in again.",
"type": "invalid_request_error",
"param": null,
"code": "refresh_token_reused"
}
}
16:09:10+00:00 warn agent/embedded {"subsystem":"agent/embedded"} workspace bootstrap file MEMORY.md is 51712 chars (limit 20000); truncating in injected context (sessionKey=agent:main:discord:channel:REMOVED)
16:09:10+00:00 warn tools {"subsystem":"tools"} tools.profile (coding) allowlist contains unknown entries (code_execution, x_search). These entries are shipped core tools but unavailable in the current runtime/provider/model/config.
16:11:32+00:00 error [openai-codex] Token refresh failed: 401 {
"error": {
"message": "Your refresh token has already been used to generate a new access token. Please try signing in again.",
"type": "invalid_request_error",
"param": null,
"code": "refresh_token_reused"
}
}
16:11:32+00:00 warn agent/embedded {"subsystem":"agent/embedded"} workspace bootstrap file MEMORY.md is 51712 chars (limit 20000); truncating in injected context (sessionKey=agent:main:discord:channel:REMOVED)
Log tail truncated (increase --max-bytes).
Perfect, this log is enough — and it shows the real blocker:
openai-codex Token refresh failed: 401 ... refresh_token_reused
That means your Codex OAuth token is stale/rotated, so runs start and then can’t complete auth.
Fix (on the gateway host)
openclaw models auth login --provider openai-codex --set-default
openclaw gateway restart
openclaw models status
If it still reappears, you likely have two OpenClaw runtimes trying to refresh the same token (common if multiple instances/profiles are active). Make sure only one is running for that profile/state dir.
The other warnings are secondary:
-
unknown entries (code_execution, x_search)
→ remove those from your tool allowlist/profile config (they’re not valid runtime tools in your current setup). -
MEMORY.md is 51712 chars ... truncating
→ not fatal, but it hurts prompt quality. Trim/split MEMORY.md when you can.
So yep: this is not your Gemini embeddings trial anymore — primary issue is Codex OAuth refresh token reuse.
Docs:
https://docs.openclaw.ai/concepts/model-providers#openai-code-codex
https://docs.openclaw.ai/concepts/oauth
POSTING the model s tatus in 3 messages i'll say when it's done
🦞 OpenClaw 2026.3.31 (213a704) — WhatsApp automation without the "please accept our new privacy policy".
Config : ~/.openclaw/openclaw.json
Agent dir : ~/.openclaw/agents/main/agent
Default : openai-codex/gpt-5.4
Fallbacks (7) : anthropic/claude-opus-4-5, anthropic/claude-opus-4-6, anthropic/claude-sonnet-4-6, openai-codex/gpt-5.2, openai-codex/gpt-5.3-codex, openai-codex/gpt-5.1, anthropic/claude-haiku-4-5
Image model : -
Image fallbacks (0): -
Aliases (7) : opus -> anthropic/claude-opus-4-6, sonnet -> anthropic/claude-sonnet-4-6, codex-5.2 -> openai-codex/gpt-5.2, codex-5.3 -> openai-codex/gpt-5.3-codex, codex-5.1 -> openai-codex/gpt-5.1, haiku -> anthropic/claude-haiku-4-5, codex-5.4 -> openai-codex/gpt-5.4
Configured models (8): anthropic/claude-opus-4-5, anthropic/claude-opus-4-6, anthropic/claude-sonnet-4-6, openai-codex/gpt-5.2, openai-codex/gpt-5.3-codex, openai-codex/gpt-5.1, anthropic/claude-haiku-4-5, openai-codex/gpt-5.4
Perfect — keep going, I’ll wait for all 3 and then we’ll diagnose from the full set.
Auth overview
Auth store : ~/.openclaw/agents/main/agent/auth-profiles.json
Shell env : off
Providers w/ OAuth/tokens (2): anthropic (1), openai-codex (2)
- anthropic effective=profiles:~/.openclaw/agents/main/agent/auth-profiles.json | profiles=2 (oauth=0, token=1, api_key=1) | anthropic:default=d...d, anthropic:manual=token:REMVOED
- google effective=profiles:~/.openclaw/agents/main/agent/auth-profiles.json | profiles=1 (oauth=0, token=0, api_key=1) | google:default=REMOVED
- openai-codex effective=profiles:~/.openclaw/agents/main/agent/auth-profiles.json | profiles=2 (oauth=2, token=0, api_key=0) | openai-codex:default=OAuth, openai-codex:REMOVED@REMOVED.COM=OAuth (REMOVED@REMOVED.COM)
Got part 2 âś…
Send the last part when ready and then I’ll give you exact next steps.
OAuth/token status
[openai-codex] Token refresh failed: 401 {
"error": {
"message": "Your refresh token has already been used to generate a new access token. Please try signing in again.",
"type": "invalid_request_error",
"param": null,
"code": "refresh_token_reused"
}
}
- anthropic
- anthropic:manual static
- openai-codex usage: 5h 94% left ⏱2h 9m · Week 91% left ⏱6d 10h
- openai-codex:default ok expires in 0m
- openai-codex:REMOVED@REMOVED.COM (REMOVED@REMOVED.COM) ok expires in 10d
Nice, this confirms it 100%:
- You have 2 Codex OAuth profiles
- One is
expires in 0mand throwingrefresh_token_reused - OpenClaw keeps touching that stale one first
Use the healthy profile (the one showing ~10d) first:
openclaw models auth order get --provider openai-codex
openclaw models auth order set --provider openai-codex openai-codex:<the_profile_id_with_10d_expiry>
openclaw gateway restart
Then in Discord:
/newReply with exactly OK
If you want to clean it up fully after that, re-login Codex once to refresh defaults:
openclaw models auth login --provider openai-codex --set-default
Why this happened: Codex refresh tokens are rotation-based; if another instance/session used the old refresh token, you get refresh_token_reused.
Docs:
https://docs.openclaw.ai/concepts/oauth
https://docs.openclaw.ai/cli/models
can i somehow just remove the bad one?
Yep — but easiest/safest is to not delete, just stop using it.
Best quick fix
openclaw models auth order set --provider openai-codex openai-codex:<good_profile_id>
openclaw gateway restart
If you want to actually remove the bad one
There isn’t a clean models auth remove command right now in current CLI, so it’s manual:
- Backup:
cp ~/.openclaw/agents/main/agent/auth-profiles.json ~/.openclaw/agents/main/agent/auth-profiles.json.bak
- Edit
~/.openclaw/agents/main/agent/auth-profiles.jsonand remove the staleopenai-codexprofile entry. - Restart:
openclaw gateway restart
If you want, paste just the openai-codex section (redacted) and I’ll point to exactly which entry to cut.
openclaw models auth order get --provider openai-codex
🦞 OpenClaw 2026.3.31 (213a704) — Your AI assistant, now without the $3,499 headset.
Agent: main
Provider: openai-codex
Auth file: ~/.openclaw/agents/main/agent/auth-profiles.json
Order override: (none)
Perfect — that means it’s still auto-rotating and hitting the bad profile.
Now pin it to the good one (the one with ~10d expiry from your status):
openclaw models auth order set --provider openai-codex "openai-codex:<your_good_profile_id>"
openclaw models auth order get --provider openai-codex
openclaw gateway restart
Then test in chat with:
/newReply with exactly OK
If it still throws refresh_token_reused, run one fresh login to regenerate clean tokens:
openclaw models auth login --provider openai-codex --set-default
openclaw gateway restart
where do i get the profile id?
From openclaw models status — it’s the text right after openai-codex: on each profile line.
You already showed both:
- bad:
openai-codex:default(expires in 0m) - good:
openai-codex:<email>(expires in ~10d)
Use the one with 10d:
openclaw models auth order set --provider openai-codex "openai-codex:<email>"
If you want to re-list just those lines:
openclaw models status | rg "openai-codex:"
(Discord redacted your email in chat, but in your terminal you’ll see the full profile id.)
this did fix the error...but it's still not executing and it's lying about executing
Got it — good news is we killed the auth bug.
If it still says “working” but doesn’t actually do the action, this is usually tool policy/approval (or model tool-calling quality), not tokens.
Run these 3 and paste:
openclaw config get tools.profile
openclaw config get tools.allow
openclaw config get tools.deny
Then do one test request (something tiny), and immediately run:
tail -n 400 "$(ls -t /tmp/openclaw/openclaw-*.log | head -1)" \
| rg -i "SYSTEM_RUN_DENIED|approval|allowlist|Tool .* not found|not allowed|unknown entries|error" \
| tail -n 60
Your earlier warning about unknown tool entries (code_execution, x_search) is suspicious and can cause exactly this “says it did it / didn’t actually run” behavior.
Quick workaround while we debug: switch back to the Claude model that was working for tool-heavy tasks, and keep Codex for non-tool chat/coding.
Ref: https://docs.openclaw.ai/tools/exec-approvals and https://docs.openclaw.ai/gateway/troubleshooting
🦞 OpenClaw 2026.3.31 (213a704) — If it works, it's automation; if it breaks, it's a "learning opportunity."
coding
robot@clawdbot:~$ openclaw config get tools.allow
🦞 OpenClaw 2026.3.31 (213a704) — I'll butter your workflow like a lobster roll: messy, delicious, effective.
Config path not found: tools.allow
robot@clawdbot:~$ openclaw config get tools.deny
🦞 OpenClaw 2026.3.31 (213a704) — I keep secrets like a vault... unless you print them in debug logs again.
Config path not found: tools.deny
Great, this helps. So right now you’re on tools.profile: coding with no extra allow/deny overrides.
That means the next likely cause is: model is not actually issuing tool calls (it’s narrating instead).
Try this exact debug path:
- In chat:
/verbose on/new- Ask:
Run "echo TOOL_TEST" via exec and return exact stdout only.
- If it still “claims done” without tool output, force a broader tool profile:
openclaw config set tools.profile full
openclaw gateway restart
- Retest the same prompt.
If still broken after that, it’s almost certainly Codex/tool-calling behavior in your setup — and the practical workaround is to switch back to the Claude model for tool-heavy tasks.
(You’re not crazy — auth is fixed now; this is a separate tool-execution layer issue.)
using /new (which maybe you said earlier) seems to have maybe worked..it's running that echo...can now read properly from files... I would have thought that would be fixed on a gateway restart
Yep — exactly. /new fixes session state, while gateway restart only fixes process state.
So if the session history got weird (model swap, stale tool trace, half-broken run), restarting the gateway keeps that same session context. /new gives a fresh session id + clean context, which is why it started behaving.
If it happens again:
/newfor hard reset/compactif you want to keep context but shrink/clean it
Glad you got it running 🎉
If this fixed it, please right-click the solution message → Apps → ✅ Mark Solution so Answer Overflow can index it for others.
the whole sequence helped me fix it
Awesome — glad it’s sorted 🙌
Thanks for sticking through the debugging marathon.
If you haven’t yet, please right-click the best solution message → Apps → ✅ Mark Solution so it gets indexed on Answer Overflow and helps the next person hit by this.
After swapping from Claude to Kodex, do I have to do something so that it picks up all of the memory that we’ve used in the past?
Short answer: usually no extra step — memory is not tied to Claude vs Codex.
What carries over:
- Session history (same chat/session key)
- Workspace memory files (
MEMORY.md,memory/*.md) across model swaps
What can break after provider/model changes is the semantic memory index (embeddings).
If you want to be safe, run:
openclaw memory status --deep
openclaw memory index --force
Then sanity check:
openclaw memory search "some fact you know it should remember"
Also make sure you’re still on the same agent/workspace (memory is per agent/workspace).
So: switching Claude → Codex does not erase memory, but reindexing can help it “see” prior memory reliably if embedding config changed.
Docs: https://docs.openclaw.ai/concepts/memory and https://docs.openclaw.ai/cli/memory
This won’t delete anything right
Correct — it won’t delete your memory files or chat history.
openclaw memory index --force only rebuilds the embedding index (search database).
It does not remove:
MEMORY.mdmemory/*.md- session transcripts
Worst case: search is briefly rebuilding, then comes back with fresher results.
how do i change memroy search from gemini-embedding-001
to ollama
Yep — do this:
- Make sure Ollama has an embedding model:
ollama pull nomic-embed-text
- Switch memory search provider:
openclaw config set agents.defaults.memorySearch.provider ollama
openclaw config set agents.defaults.memorySearch.model nomic-embed-text
openclaw config set agents.defaults.memorySearch.fallback none
- Rebuild memory index:
openclaw memory index --force
openclaw memory status --deep
If Ollama is on another host, also set:
openclaw config set agents.defaults.memorySearch.remote.baseUrl http://<host>:11434
That’s it. This won’t delete your memory files — it just switches embedding backend + reindexes.
Refs: https://docs.openclaw.ai/reference/memory-config and https://docs.openclaw.ai/cli/memory
im using nomic-embed-text:v1.5
Perfect — then set that exact model string:
openclaw config set agents.defaults.memorySearch.provider ollama
openclaw config set agents.defaults.memorySearch.model nomic-embed-text:v1.5
openclaw config set agents.defaults.memorySearch.fallback none
openclaw memory index --force
openclaw memory status --deep
If memory status --deep comes back healthy, you’re fully on Ollama embeddings.
do i need to restart the gateway?
Usually no — that change is hot-reloadable.
So normally just:
openclaw memory index --force
openclaw memory status --deep
If it still shows old provider or weird state, then do a restart as a clean reset:
openclaw gateway restart
CHECK this out Store: ~/.openclaw/memory/designer.sqlite
Workspace: ~/clawd/agents/designer
Embeddings: ready
By source:
memory · 0/0 files · 0 chunks
sessions · 3/2 files · 20 chunks
Vector: ready
Vector dims: 768
Vector path: ~/.npm-global/lib/node_modules/openclaw/node_modules/sqlite-vec-linux-x64/vec0.so
FTS: ready
Embedding cache: enabled (49 entries)
Batch: disabled (failures 0/2)
Issues:
memory directory missing (~/clawd/agents/designer/memory)
17:54:14+00:00 info {"0":"","_meta":{"runtime":"node","runtimeVersion":"25.5.0","hostname":"unknown","name":"openclaw","date":"2026-04-04T17:54:14.226Z","logLevelId":3,"logLevelName":"INFO","path":{"fullFilePath":"file:///home/robot/.npm-global/lib/node_modules/openclaw/dist/subsystem-CJEvHE2o.js:279:46","fileName":"subsystem-CJEvHE2o.js","fileNameWithLine":"subsystem-CJEvHE2o.js:279","fileColumn":"46","fileLine":"279","filePath":"/home/robot/.npm-global/lib/node_modules/openclaw/dist/subsystem-CJEvHE2o.js","filePathWithLine":"/home/robot/.npm-global/lib/node_modules/openclaw/dist/subsystem-CJEvHE2o.js:279","method":"console.log"}},"time":"2026-04-04T12:54:14.226-05:00"}
17:56:03+00:00 warn agent/embedded {"subsystem":"agent/embedded"} workspace bootstrap file MEMORY.md is 51712 chars (limit 20000); truncating in injected context (sessionKey=agent:main:discord:channel:REMOVED)
17:56:03+00:00 warn tools {"subsystem":"tools"} tools.profile (coding) allowlist contains unknown entries (code_execution, x_search). These entries are shipped core tools but unavailable in the current runtime/provider/model/config.
Log tail truncated (increase --max-bytes).
This is super useful — and it explains a lot.
You’ve got two different agent contexts in play:
- Memory status output is for designer (
~/.openclaw/memory/designer.sqlite) - Your live Discord run warning is for main (
sessionKey=agent:main:...)
So you were checking one agent while chatting with another.
What to do next
- Check memory on the same agent you’re actually using in Discord:
openclaw memory status --deep --agent main
- The
designerwarning means it has no memory files yet:
memory directory missing (~/clawd/agents/designer/memory)
- not fatal, just means 0 memory-file chunks there.
MEMORY.md is 51712 chars ... truncating(on main) is important:
- keep
MEMORY.mdlean/curated - move bulk notes into
memory/*.mdand rely onmemory_searchindexing
code_execution, x_searchwarning is noisy but secondary right now.
So: biggest issue now is agent mismatch + oversized MEMORY.md on main.
/.openclawopenclaw memory status --deep --agent mainin
🦞 OpenClaw 2026.3.31 (213a704) — Your AI assistant, now without the $3,499 headset.
│
â—‡
Memory Search (main)
Provider: ollama (requested: ollama)
Model: nomic-embed-text:v1.5
Sources: memory, sessions
Indexed: 219/168 files · 5122 chunks
Dirty: no
Store: ~/.openclaw/memory/main.sqlite
Workspace: ~/clawd
Embeddings: ready
By source:
memory · 114/114 files · 1069 chunks
sessions · 105/54 files · 4053 chunks
Vector: ready
Vector dims: 768
Vector path: ~/.npm-global/lib/node_modules/openclaw/node_modules/sqlite-vec-linux-x64/vec0.so
FTS: ready
Embedding cache: enabled (10495 entries)
Batch: disabled (failures 0/2)
That looks excellent — memory is fully healthy now ✅
- Provider:
ollama - Model:
nomic-embed-text:v1.5 - Embeddings:
ready - Indexed: lots of memory + session chunks
- Dirty:
no
So at this point, memory search is not your bottleneck anymore.
If you still see odd behavior, it’s likely session/model/tool-call flow (not memory).
Only remaining thing from earlier logs worth cleanup is the huge MEMORY.md truncation warning.
If this fixed the memory side for you, please mark the solution message âś… so others can find it on Answer Overflow.
lets fix the other isssue code_execution, x_search
Yep — let’s kill that warning cleanly.
code_execution and x_search are provider-native tool names, not OpenClaw tool ids in your current setup.
So you need to find where they’re listed and replace/remove them.
Run:
rg -n "code_execution|x_search" ~/.openclaw/openclaw.json ~/.openclaw/agents/main/agent/*.json
If found in an allowlist, replace with OpenClaw tool ids:
code_execution→exec(orgroup:runtime)x_search→web_search(orgroup:web)
Then restart once to clear stale warnings:
openclaw gateway restart
If you paste the rg hits, I can give you the exact edit line-by-line.
nothing comes back
Perfect — that means those entries are not in your config.
So that warning is coming from runtime profile composition (provider/tool hint mismatch), not from something you set manually. In practice it’s usually non-fatal noise.
If you want to suppress it, easiest is:
openclaw config set tools.profile full
openclaw gateway restart
If things are executing now, you can also just ignore that warning for the moment.
Your real blockers were the stale Codex auth/session state, which you already fixed.
but my bot sstill isnt executing..telling me it's going to do things but doenst do them
8:04:03+00:00 warn agent/embedded {"subsystem":"agent/embedded"} workspace bootstrap file MEMORY.md is 51712 chars (limit 20000); truncating in injected context (sessionKey=agent:main:discord:channel:removed)
18:04:37+00:00 warn agent/embedded {"subsystem":"agent/embedded"} workspace bootstrap file MEMORY.md is 51712 chars (limit 20000); truncating in injected context (sessionKey=agent:main:discord:channel:removed)
Yep — this warning is likely your smoking gun now.
MEMORY.md is huge (51k), OpenClaw injects only first 20k each run, and that can crowd out tool instructions/context.
So the model “plans” but doesn’t reliably execute.
Try this safe cleanup (no deletion):
mkdir -p ~/clawd/memory
cp ~/clawd/MEMORY.md ~/clawd/memory/MEMORY-backup-$(date +%F).md
cat > ~/clawd/MEMORY.md <<'EOF'
# MEMORY
## Stable preferences
- (keep this file short: key facts + decisions only)
EOF
openclaw memory index --force
openclaw gateway restart
Then in chat:
/new- test:
Run "echo TOOL_TEST" and return stdout only.
If that works, we’ve confirmed oversized MEMORY.md was the main remaining blocker.
Keep long notes in memory/*.md, keep root MEMORY.md compact.
should we compact it or archive it or something? isnt that built in?
Great question — and this is the key distinction:
- Built-in
/compact= compacts the chat session context - It does not automatically shrink/clean your
MEMORY.mdfile
So yes, for MEMORY.md you should manually curate/archive.
Good pattern:
- Keep
MEMORY.mdshort (high-signal, durable facts only) - Move long history/details into
memory/*.md(still searchable viamemory_search)
So “built-in compaction” exists, but it’s for session history, not auto-pruning your root memory file.
my bot was making daily log files but then stopped for some reason....
That can happen, yeah — daily files are not guaranteed every day automatically.
They usually get created when either:
- the model decides to write memory, or
- pre-compaction memory flush runs (near context limits).
If your sessions are shorter / reset often (/new), auto-flush may never trigger.
Also, from earlier logs, you had agent/workspace drift (main vs designer) — so writes may have gone to a different workspace than you expected.
Quick checks:
openclaw config get agents.defaults.workspace
openclaw memory status --deep --agent main
And force-create today’s log once (to verify write path/permissions):
mkdir -p ~/clawd/memory
touch ~/clawd/memory/$(date +%F).md
Then ask the bot explicitly:
“Write this to today’s memory log: …”
So yeah: it didn’t necessarily “break” — auto daily logging is opportunistic, not strict cron-like behavior.
icant image this is causing my issue though..not running commands
You’re right — memory alone probably isn’t the main blocker for command execution.
Let’s do a hard isolation test (2 minutes):
- Run this in terminal:
openclaw agent --message 'Run "echo HI" using exec and return stdout only.' --json
- At the same time, in another terminal:
openclaw logs --follow | rg -i "SYSTEM_RUN_DENIED|approval|allowlist|exec|tool|denied|not found|error"
This tells us exactly which layer is failing:
- If CLI test works → Discord/session-level issue
- If CLI test fails → tool policy/approval/model tool-calling issue
You’re absolutely right to push on this — now we need the exact denial/error line to stop guessing.
what could i run from within discord to run a tool..it's doing exec....but like if i want it to write to openclaw.json or run some python
Great question. In Discord, the easiest way is to give explicit tool instructions and require proof output.
Use this flow:
/new/verbose on- send one of these prompts
Test exec (safe)
Use the exec tool and run: python3 -c "print('TOOL_OK')"
Return only the raw stdout.
If exec fails, return the exact error.
Test file write/read tools (safe)
Use write to create ~/clawd/tool-test.txt with content: TOOL_OK
Then use read to show the file contents.
Inspect config before editing
Use read to show only the current tools.profile value from ~/.openclaw/openclaw.json
Do not change anything yet.
Edit config (controlled)
Use edit to change tools.profile to "full" in ~/.openclaw/openclaw.json.
Show the exact diff before applying.
For Python/scripts, ask it to use exec explicitly and demand raw stdout/stderr.
That prevents “I did it” without proof.
all of these things worked.... why would the bot still not be doing what i ask it to do..when it says it's going to do it
You just proved something important: tools work.
So the problem is now the decision layer (the model choosing to narrate/plan instead of executing).
That happens when requests are high-level, context is noisy, or model/tool-calling is inconsistent in that session.
Make it deterministic (this usually fixes it)
Paste this once in the thread before tasks:
Execution contract:
- For action requests, you must use tools (exec/read/write/edit) and show evidence.
- Never say "done" without proof (stdout, diff, file path, or exit code).
- If blocked, reply with exactly: BLOCKED + reason.
- No future-tense promises ("I will...") without an actual tool result.
Then send tasks in this format: