OpenClaw 5.28: Codex Plugin Broken After Upgrade — Fix with Symlink Shim

Upgrading OpenClaw from 5.12 to 5.28 can silently break the Codex plugin. After the upgrade, all agent calls hang at Waiting for agent reply, cron jobs time out at exactly 121 seconds with model-call-started, and the fallback chain doesn't kick in fast enough. The gateway starts clean, OAuth is valid, and Codex shows as installed and enabled — but every binary spawn attempt fails with a silent ENOENT.
Root Cause: Path Mismatch
The 5.28 Codex plugin harness expects the binary at:
vendor/x86_64-unknown-linux-musl/codex/codexBut the package ships the binary at:
vendor/x86_64-unknown-linux-musl/bin/codexThe plugin never finds the binary, so every spawn attempt hangs.
Fix: Create a Symlink Shim
Set the Codex extension directory and symlink the binary:
CODEX_DIR="/home/clawbot/.openclaw/extensions/codex/node_modules/@openai/codex-linux-x64/vendor/x86_64-unknown-linux-musl"
sudo mkdir -p "$CODEX_DIR/codex"
sudo ln -sf "$CODEX_DIR/bin/codex" "$CODEX_DIR/codex/codex"
sudo chown -h clawbot:clawbot "$CODEX_DIR/codex/codex"
sudo systemctl restart openclawAfter restart, agent calls should resume normally.
Important Caveats
- Reinstall or force-update of the Codex plugin wipes the extensions directory, so you must recreate the symlink after each reinstall.
- If your systemd service uses an
ExecStartPostchmod on the Codex binary, update that path tobin/codexas well.
This was reproduced on Ubuntu 24.04, npm install, systemd service. Hopefully this saves you a few hours of debugging.
📖 Read the full source: r/openclaw
👀 See Also

The Hitchhiker's Guide to Agentic AI — Full Overview
A comprehensive Reddit post covering how LLMs work, RL for LLMs, reasoning, evaluation, agentic memory (RAG), and multi-agent systems, with a link to the full paper.

Automating OAuth Token Refresh for Bots Using Claude Code
A Reddit user shares a method to prevent OAuth token expiration by configuring Claude Code to automatically refresh tokens every 8 hours, keeping bots running continuously without manual intervention.

Slash Claude costs 60x by offloading mechanical tasks to DeepSeek V4 Flash via MCP
A Reddit user cut Claude API spend 60x by routing file classification, JSON reformatting, and field extraction to DeepSeek V4 Flash via a simple MCP tool and a CLAUDE.md deny-list rule.

OpenClaw Sub-agents: Don't Treat a Reply as a Completion Receipt
OpenClaw's sessions_spawn is non-blocking — it returns a runId when work is accepted, not complete. A parent can prematurely report success while a child is still running, failed, or lost.