Troubleshooting
Common problems and their solutions, collected from operational experience.
Beads CLI Issues
bd ready returns nothing but work exists
Symptom: bd list --status=open shows beads, but bd ready is empty.
Cause: All open beads have unresolved blockers.
Fix:
bd blocked # See what's blocking what
bd dep tree <id> # Inspect dependency chain
bd close <blocker-id> # Close completed blockers
Staleness errors after git pull
Symptom: bd reports stale data after pulling changes.
Fix:
bd import --force -i .beads/issues.jsonl
Dolt database corruption
Symptom: bd commands fail with database errors.
Cause: Usually concurrent access (Dolt is not concurrent-safe).
Fix:
# If JSONL is the source of truth, wipe and reimport
rm -rf .beads/dolt
bd import -i .beads/issues.jsonl
bd import does INSERT, not UPSERT. Always wipe the Dolt directory before reimporting to avoid duplicate key errors.
bd show --json returns an array
This is expected behavior — bd show --json always returns an array, even for a single ID. Parse accordingly:
bd show <id> --json | jq '.[0]'
Labels missing from bd ready --json output
Known behavior: bd ready --json does not include the labels field. Use bd show <id> --json or bd list --json to get labels.
Also note: beads without labels omit the labels key entirely — check for a missing key, not an empty array.
Agent & Container Issues
OpenClaw gateway dies after agent deletion
Symptom: Gateway stops but systemd doesn't restart it.
Cause: openclaw agents delete triggers a config reload. Gateway exits cleanly (code 0), but Restart=on-failure only triggers on non-zero exits.
Fix:
ssh mimas sudo systemctl start openclaw-gateway
Prevention: Always check gateway status after deleting agents.
Container permission denied (SELinux)
Symptom: Rootless Podman containers get permission denied on bind-mounted directories despite correct Unix permissions.
Cause: SELinux on Fedora requires container file context labels.
Fix:
chcon -Rt container_file_t /path/to/workspace
Agent can't push to GitHub
Symptom: git push fails inside agent container.
Cause: Git auth relies on a bind-mounted env file at /etc/openclaw/env. If mounted at the wrong path, gh-wrapper.sh can't find credentials.
Fix: Verify the bind mount destination matches /etc/openclaw/env (not /home/openclaw/.openclaw/env).
Rootless Podman containers invisible to other users
Symptom: podman ps shows no containers, but agents are running.
Cause: Rootless Podman containers are user-scoped. User A cannot see User B's containers.
Fix: Run podman ps as the user who owns the containers (typically openclaw):
sudo -u openclaw podman ps
Infrastructure Issues
ICU library mismatch breaks bd
Symptom: bd crashes with ICU-related errors after an OS upgrade.
Cause: dnf upgrade on Fedora may update ICU libraries that bd was linked against.
Fix: Reinstall the bd binary from the latest release.
SSH subprocess hangs in Ludus CLI
Symptom: Ludus CLI commands that use SSH hang indefinitely.
Cause: subprocess.run without stdin=subprocess.DEVNULL inherits stdin. Rich (used by Typer) sets stdin to non-blocking, causing SSH to wait.
Fix: This is fixed in the Ludus CLI. If you encounter it in custom scripts, always pass stdin=subprocess.DEVNULL for non-interactive SSH calls.
run_as_openclaw doesn't source environment
Symptom: Commands run via run_as_openclaw can't access GH_TOKEN and similar env vars.
Cause: run_as_openclaw does not source /etc/openclaw/env.
Fix: Pass env vars explicitly or source the env file in the command:
source /etc/openclaw/env && gh repo clone ...
bd import doesn't preserve labels
Symptom: Labels are missing after importing from JSONL.
Cause: Known bug in bd v0.55.4 — bd import does not restore labels from JSONL.
Fix: Apply labels manually after import. The intercom-init.sh script has a post-import bd label add workaround. See PR #1966 for the upstream fix.
bd sync deprecated
Symptom: bd sync command fails or behaves unexpectedly.
Cause: Deprecated since bd v0.55+.
Fix: Use bd export + git push (JSONL) or bd dolt push/pull (Dolt-native) instead.
bd export writes nothing in sandbox mode
Symptom: bd export completes successfully but produces an empty file.
Cause: Sandbox auto-detection (--no-auto-flush) causes export to write nothing without an explicit output path.
Fix:
bd export -o .beads/issues.jsonl
Shell Scripting Pitfalls
set -e aborts on list processing
Problem: With set -e, one bad bead ID in a loop aborts all processing.
Fix: Use || warn per-item instead of relying on set -e:
for id in $ids; do
bd show "$id" --json || echo "WARN: failed to show $id"
done
((i++)) fails with set -e
Problem: When i=0, the old value (0 = falsy) returns exit code 1, triggering set -e.
Fix: Use i=$((i + 1)) instead.
BEADS_DIR not available in piped commands
Problem: BEADS_DIR=x cmd1 | cmd2 only sets the variable for cmd1, not cmd2.
Fix: Export the variable first:
export BEADS_DIR=/path/to/.beads
cmd1 | cmd2
Tabula Issues
Build fails with broken links
Symptom: npm run build fails with a broken links error.
Cause: Tabula uses onBrokenLinks: 'throw' — any internal or external link that doesn't resolve fails the build.
Fix: Check the error message for the specific broken link. Fix the path or URL.
Mermaid diagrams don't render
Symptom: Mermaid code blocks show as raw text.
Cause: Missing @docusaurus/theme-mermaid package or markdown.mermaid: true not set in config.
Fix:
npm install @docusaurus/theme-mermaid
Then verify docusaurus.config.ts has:
markdown: { mermaid: true },
themes: ['@docusaurus/theme-mermaid'],
OpenClaw Gateway & Queue
Agent dispatch blocks cron jobs
Symptom: Cron jobs that dispatch messages to agents take minutes to complete instead of seconds.
Cause: openclaw agent CLI is blocking — it waits for the agent run to finish before returning.
Fix: Use gateway call chat.send instead — it's non-blocking (~4s), returns immediately with {"runId": "...", "status": "started"}:
openclaw gateway call chat.send --params '{
"sessionKey": "agent:<name>:main",
"message": "...",
"idempotencyKey": "<unique>"
}'
Messages don't reach the agent
Symptom: chat.send succeeds but the agent never processes the message.
Cause: Session key mismatch. --agent <id> targets agent:<id>:main, but --session-id <custom> maps to a different internal key.
Fix: Always use the canonical session key format: agent:<name>:main.
Queued messages lost between CLI and API
Symptom: Messages queued via chat.send while openclaw agent CLI holds a session don't get processed.
Cause: Known issue on v2026.3.24 — CLI→API queue interaction is broken. Followup messages don't auto-drain after a CLI run ends.
Fix: Use chat.send (API) for all fire-and-forget dispatches. Reserve openclaw agent CLI only for interactive use where you need the response synchronously.
Don't run openclaw agent --local and gateway call chat.send targeting the same session in parallel — file-lock timeout (10s) can lose messages. Both callers must go through the same gateway process.
Test VM Issues
E2E tests interfere with production cron
Symptom: E2E test results are inconsistent or have extra beads.
Cause: Running E2E tests on production (mimas) — the bridge cron creates beads in parallel with test bridge runs.
Fix: Always use the isolated test VM:
LUDUS_HOST=mimas-test uv run pytest tests/e2e/ -v
GitHub API propagation delay
Symptom: Bridge sees empty issues list immediately after creating an issue.
Cause: GitHub API needs ~3s propagation after issue/PR creation.
Fix: Add time.sleep(3) between creation and bridge run in E2E tests.
GitHub App bots can't post REQUEST_CHANGES reviews
Symptom: Review creation fails when using REQUEST_CHANGES event type.
Cause: GitHub App bots are restricted to COMMENT and APPROVE review types.
Fix: Use COMMENT event type for review feedback in E2E tests and bot workflows.