OpenClaw 4.20: an inventory of 29 essential fixes for serious users
OpenClaw 4.20: an inventory of 29 essential fixes for serious users
A Reddit user lists every manual fix they had to apply after upgrading. Some of them, they claim, reappeared upstream.
If you think upgrading to OpenClaw 4.20 is painless, you’re probably not using it hard enough. u/Marcelovc, an active contributor on r/openclaw, published a provocatively titled post - “This sucks from Openclaw founder but read this if you want to update to 4.20” - listing 29 fixes required to make version 4.20 work as intended.
The context is explosive: Marcelovc claims they reported several bugs on GitHub and got banned. To make matters worse, some of their fixes allegedly reappeared upstream in very similar form. “So apparently the bugs were real. The person reporting them was just the problem, I guess,” they quip with bitter sarcasm.
What is OpenClaw? OpenClaw is an open-source personal AI assistant (363K+ GitHub stars) that functions as a runtime for AI agents on any OS and platform. Version 4.20, released April 21, 2026, is a minor release including wizard onboarding improvements, tiered model pricing support, cron state split into jobs-state.json, and various fixes including compaction notices and Moonshot/Kimi K2.6 as default. The gateway is the central process managing sessions, bindings, and message routing across channels (Telegram, Discord, etc.). ACP (Agent Client Protocol) is the protocol allowing external agents (Codex, Claude Code, Kimi) to connect to the OpenClaw runtime as bound sessions, maintaining state and identity across restarts.
The post is a survival checklist for anyone with non-trivial setups: custom patches, ACP agents, Discord bindings, Codex/Claude/Kimi, systemd, hooks, cron. “Do not update and assume everything survived. Check your install,” they warn.
The 29 fixes, one by one
1. Gateway restart session drain
Problem: Gateway restart dropped sessions and bindings.
File: dist/gateway-cli-Dk7XTZhh.js, systemd unit
Solution: Add SIGTERM drain, use KillMode=mixed in the service unit.
2. ACP binding identity/state preservation
Problem: Identity and state lost across ACP sessions.
File: dist/persistent-bindings.lifecycle-C16AQhEC.js
Solution: Persist identity/state across the binding lifecycle.
3. Dirty shutdown AgentDisconnectedError crash
Problem: Crash on dirty shutdown with AgentDisconnectedError.
File: dist/unhandled-rejections-C1EdNFPd.js
Solution: Suppress the error before exit.
4. Multi-edit mismatch hint loop
Problem: No hints for multi-edit failures, infinite loop.
File: dist/bash-tools-UuDLD4ZI.js
Solution: Extend mismatch detection.
5. Compound bash preflight bypass
Problem: Compound commands like a && b bypassed preflight checks.
File: dist/bash-tools-UuDLD4ZI.js
Solution: Validate each subcommand independently.
6. pkill self-match SIGKILL loop
Problem: Runtime self-killed in a loop via pkill.
File: dist/bash-tools.exec-runtime-DhvVA1iE.js
Solution: Use fuser -k <port>/tcp, harden exit handling.
7. ACP manager metadata corruption
Problem: ACP binding metadata corruption.
File: dist/manager-ZiizW_Kh.js
Solution: Apply lifecycle preservation logic.
8. Model display name in runtime
Problem: Raw model IDs displayed instead of readable names.
File: dist/selection-D0BzPQwl.js
Solution: Inject model.name in the selection UI.
9. Codex initialize timeout
Problem: Infinite hang on Codex initialization.
File: dist/extensions/codex/harness-BIlt4BEY.js
Solution: Set a default timeout of 60 seconds.
10. Kimi thinking payload rejection
Problem: Moonshot API rejected requests with the thinking field.
File: dist/stream-CZiIS_E8.js
Solution: Remove the thinking key entirely from the payload.
11. OAuth refresh token warning
Problem: False token expiry warnings.
File: dist/auth-health-BgWiv8uG.js
Solution: Respect refresh_token in health check logic.
12. Plugin loader warning noise
Problem: Repeated noisy warnings from the plugin loader.
File: dist/loader-B9Yrel7b.js
Solution: Treat installs as trusted source.
13. Inline media path attachment
Problem: Files not attached in replies with inline media paths.
File: dist/reply-media-paths.runtime-Q57v1N2E.js
Solution: Detect, validate, and stage files found in paths.
14. ACP stream buffering delay
Problem: Delayed streaming in ACP sessions.
File: openclaw.json
Solution: Set deliveryMode = "live" in config.
15. Startup context memory bleed
Problem: Uncontrolled memory growth from startup context.
File: openclaw.json
Solution: Disable startup context.
16. Long session compaction too aggressive
Problem: Constant, overly aggressive compaction in long sessions.
File: openclaw.json
Solution: Increase context tokens to 400k.
Compaction is the process by which OpenClaw compresses conversation history when the context window fills up. In 4.20, the team added opt-in start and completion notifications during compaction (PR #67830), but the user reports that the activation threshold remains too low for long sessions, causing constant compaction that degrades conversation quality.
17. ACP long-turn timeout
Problem: 30-minute limit on long turns.
File: openclaw.json
Solution: Increase to 3600 seconds (1 hour).
18. Kimi streaming tool arguments missing
Problem: Empty tool arguments during Kimi streaming.
File: openclaw.json
Solution: Switch to anthropic-messages format.
19. Codex fallback cascade
Problem: Incorrect fallback models in the Codex cascade.
File: openclaw.json
Solution: Set fallbacks to [] (empty array).
20. Stale runtime state cleanup
Problem: Accumulated stale state in the runtime.
File: crontab
Solution: Add periodic cleanup jobs.
21. Unbounded foreground bash protection
Problem: Unbounded foreground bash executions, potential hangs.
File: hooks/bash-bounded-contract-pretooluse.*
Solution: Enforce bounded execution with timeout.
22. Gateway systemd restart semantics
Problem: Inconsistencies in gateway restart via systemd.
File: systemd drop-ins
Solution: Add proper overrides in the drop-in directory.
23. Contaminated startup session cleanup
Problem: Cross-project session leaks at startup.
File: invalidate-contaminated-startup-sessions.mjs
Solution: Rotate sessions on boot.
24. Claude ACP vendor runtime workarounds
Problem: Upstream bugs in Claude vendor code for ACP.
File: Vendor files
Solution: Patch with OPENCLAW_* markers for traceability.
25. Claude SDK injected system reminders
Problem: Unwanted system reminders injected by the Claude SDK.
File: SDK install
Solution: Neutralize reminder blocks.
26. Claude CLI injected system reminders
Problem: Same reminder issue at the CLI level.
File: /usr/lib/claude-code/...
Solution: Patch the CLI binary.
27. Gemini tool/thinking drift
Problem: Behavioral drift in tool use and thinking with Gemini.
File: pi-ai extensions
Solution: Reapply hotfix after every update.
28. Claude CLI ACP runtime healing
Problem: Claude CLI runtime crashes in ACP context.
File: extensions/claude-cli-runtime-heal/
Solution: Use the heal daemon for auto-recovery.
29. ACP runtime heal + binding persistence
Problem: Missing persistence layer for ACP binding healing.
File: extensions/lossless-claw@0.2.5
Solution: Install the lossless-claw extension.
Community reactions
The post sparked debate. u/Flimsy_Exercise_1561, identifying as a developer, replied bluntly: “If you patch files in dist/, they will disappear with the next release. You have to patch the source code, rebuild, then check whether it works. If you weren’t able to get your changes in, they either suck, descriptions suck, or the changes are not that important in the eyes of the maintainers.”
u/ArchiDevil was even more direct: “If these are ‘bugs’ you had reported to GitHub, that not surprising that you’ve been banned.”
The best punchline comes from u/Odd-Energy71, who added an ironic fix #30: “Rug pull. Problem: References Openclaw founder. Path: Title. Solution: wut?”
And u/Correct_Support_2444, on the version number: “Dude, it’s a 4.20 release. It’s probably a damned inside joke. It’s well baked.”
For context, release 4.20 did come out on April 21, 2026, and the version number spawned the usual “4/20” jokes in the community. The official changelog focuses on UX improvements to the wizard, tiered model pricing, Kimi K2.6 as default, cron state split, and minor fixes. None of the 29 issues Marcelovc listed appear in the official changelog, which fuels the tension between power users and the release process.
The post-upgrade audit
Marcelovc suggests a prompt to verify your installation against the inventory:
Audit my actual install against this fixes inventory (check above). Search by affected subsystem, config key, runtime behavior, and file path.
And an inspection checklist:
- Installed
dist/files openclaw.json- Systemd units/drop-ins
- Hooks
- Cron jobs
- Logs
- Backups
- Local extensions
The closing line is final:
If your OpenClaw setup is small, maybe this is overkill.
If you run it seriously, it is not.