reddit

OpenClaw 4.20: an inventory of 29 essential fixes for serious users

Note: Sections highlighted in blue are research additions for completeness, not present in the original thread.

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.