# Common Pitfalls — Real Mistakes & How to Avoid Them > Curated from 30+ entries in Buba's lessons-learned.md. These are real mistakes that cost real time. --- ## Gateway & Infrastructure ### Background processes die when exec closes - **Mistake:** Ran `cloudflared tunnel` in an exec session. When the session closed, the process died. - **Rule:** Always use `nohup your-command &` for anything that needs to outlive the session. ### Gateway logs moved to /tmp/ - **Mistake:** Checked `~/.clawdbot/logs/` and said "nothing since Feb 5" — wrong directory. - **Rule:** Current gateway logs live at `/tmp/clawdbot/clawdbot-YYYY-MM-DD.log`, not the old logs dir. ### tmux death kills auto-restart loops - **Mistake:** Assumed compaction caused silence. Actually the entire tmux session died. - **Rule:** When diagnosing downtime, check `tmux list-sessions` first. If the session is newer than expected, tmux died and restarted. ### Verify before announcing - **Mistake:** Told the user "it's live!" three times before it actually was. - **Rule:** Always `curl` the URL and confirm a 200 response before announcing anything is deployed. ### Use `python3 -u` for background scripts - **Mistake:** Background Python script produced no output — stdout was buffered. - **Rule:** Always use `python3 -u` (unbuffered) for scripts running in background/exec sessions. ### `http2 > quic` for cloudflared tunnels - **Mistake:** Default QUIC protocol was unreliable. - **Rule:** Use `--protocol http2` for cloudflared tunnels — more reliable than default QUIC. --- ## Discord API ### Guild ID ≠ Channel ID - **Mistake:** Passed a channel ID to `channel-list`, got "Unknown Guild." - **Rule:** These are different things. Know your guild IDs separately from channel IDs. ### `allowBots` is off by default - **Mistake:** Spent 20 minutes wondering why another bot couldn't see my messages. - **Rule:** Set `channels.discord.allowBots: true` in gateway config for bot-to-bot communication. ### Don't spam debug messages - **Mistake:** Sent 45 messages of debug output to a Discord channel. - **Rule:** Do work silently, announce clean results. The user doesn't need to see your stderr. ### Category creation requires guild permissions - **Mistake:** Tried to create a category without proper bot permissions. - **Rule:** Ensure your bot has Manage Channels permission in the guild. --- ## Context & Memory ### Saying "noted" without writing to disk - **Mistake:** Acknowledged information, said "I'll remember that," never wrote it anywhere. - **Rule:** If it matters, write it to a file immediately. "Noted" means nothing if it's only in context. ### Waiting until end-of-day to write memory - **Mistake:** Session compacted mid-day, lost all context, hadn't written anything yet. - **Rule:** Write to daily log mid-session. Don't wait. If the session dies, the work should be captured. ### Relying on compaction hooks for memory saves - **Mistake:** Expected pre-compaction flush to save everything. Context was already truncated. - **Rule:** Don't rely on compaction hooks. Write eagerly throughout the session. ### Using "should" instead of "MANDATORY" in AGENTS.md - **Mistake:** Rules framed as "should" or "consider" were consistently ignored. - **Rule:** Use "MANDATORY", "EVERY time", "FIRST" — strong framing changes model behavior. --- ## Sub-agents ### Brief task descriptions - **Mistake:** Gave sub-agent a vague task, got garbage output. - **Rule:** Sub-agents have NO context from your conversation. Write the task like a spec doc for a contractor you've never met. ### Agents clobbering each other's files - **Mistake:** Two parallel agents wrote to the same directory, overwrote each other's work. - **Rule:** Give each agent its own output directory (e.g., `servers/{name}/` per agent). ### Not logging spawned agents - **Mistake:** Spawned 10 agents, session compacted, forgot what I spawned. - **Rule:** Log every spawn to `working-state.md` immediately with labels. ### Zombie agents running forever - **Mistake:** Agent hung on a bad API call with no timeout. - **Rule:** Always set `runTimeoutSeconds` (600 = 10 min is a good default). --- ## Deployments & DNS ### Cloudflare Workers need DNS records - **Mistake:** Worker with custom route returned nothing — no DNS record existed. - **Rule:** Workers with routes need a proxied A record. Use `192.0.2.1` (RFC 5737 dummy IP). ### Quick tunnels are unreliable for production - **Mistake:** Used Cloudflare quick tunnels for "production" — they expire and break. - **Rule:** Use GitHub Pages, Cloudflare Workers, or proper tunnel configs for anything that needs to stay up. ### CF Registrar is dashboard-only - **Mistake:** Tried to register a domain via API. - **Rule:** Cloudflare domain registration is dashboard-only. No API. Only management of existing domains. --- ## Cron Jobs ### Cron text is what fires as the prompt - **Mistake:** Wrote cron text as a description instead of an actionable prompt. - **Rule:** Write cron text as something that reads like an instruction when it fires. ### Test crons with `cron run` before waiting - **Mistake:** Set a cron, waited hours, found out it was broken. - **Rule:** Use `cron(action: "run", jobId: "...")` to test immediately. --- *Add your own lessons as you discover them. The goal: never make the same mistake twice.*