Purpose: This document helps you diagnose and fix common problems with the Mesha operator, the mesh network, the local server, and agent behavior.
Use the section headers to jump to the area where you are seeing issues.
Each problem uses this structure:
- Problem: What you are observing
- Symptoms: Specific signs that match this problem
- Diagnosis: How to confirm the cause
- Fix: What to do
Problem: A node that should be online is not responding.
Symptoms:
- The operator says "node not found" or "no response from node"
mesh-readonlyshows the node as missing from topology- Users at that site report no connectivity
Diagnosis:
# From a host on the local network, try to ping the node
ping <node-ip>
# Try SSH
ssh root@<node-ip>
# Check if the node appears in mesh routing tables from a neighbor
ssh root@<neighbor-node-ip>
ubus call network.interface dump
batctl n # if using batman-advCheck the operator's inventory:
grep -A5 "<node-name>" inventories/mesh-nodes.yamlFix:
- If the node does not respond to ping: power issue is most likely. Check the physical power supply and cables at the site.
- If the node responds to ping but not SSH: check SSH keys or firewall rules.
- If the node is reachable but not in the mesh routing table: it may have lost its mesh interface. Reboot it (with approval) and check
logreadafter. - If the node was recently reconfigured: compare its config to
desired-state/mesh/node-overrides/and check for drift.
Problem: A link exists but is unstable or has high packet loss.
Symptoms:
mesh-readonlyreports poor link quality scores- Users experience slow or dropping connections
- The operator flags this as a weak link in summaries
Diagnosis:
# On one of the affected nodes
ssh root@<node-ip>
# Check signal and noise for the wireless interface
iwinfo <interface> info
iwinfo <interface> scan
# Check link quality in batman-adv
batctl o # originators table
batctl l # local translation table
# Check if there is packet loss
ping -c 20 <neighbor-ip>Fix:
- Low signal / high noise: physical obstruction (new building, vegetation) or antenna misalignment. Walk the line of sight and check physically.
- Interference or congestion: try a different channel. Update
lime-communitychannel settings and roll out withmesh-rolloutskill (requires approval). - Asymmetric link (one side sees the other, the other does not): may be a power issue on one radio, or one antenna is damaged. Check both nodes.
- Flapping (on and off repeatedly): check power stability at both ends. Voltage fluctuations cause radio resets.
Problem: A node's running config does not match the community desired state.
Symptoms:
mesh-readonlydiff report shows differences- The operator says "this node differs from the community standard"
- The node was manually configured by someone outside the normal workflow
Diagnosis:
# Review the desired state
cat desired-state/mesh/community-profile/lime-community
cat desired-state/mesh/node-overrides/<node-name>.yaml # if it exists
# Pull the live config from the node
ssh root@<node-ip> "uci show lime-node"
ssh root@<node-ip> "cat /etc/config/lime-community"Compare the two manually or use the operator's diff skill.
Fix:
- If the drift was intentional (a node-level override): document it in
desired-state/mesh/node-overrides/so it is no longer flagged. - If the drift was unintentional (manual edit): use
mesh-rolloutto restore the node to the desired state. Requires approval. - If the cause is unknown: use
knowledge-curatorto write a note in the node's record before making changes.
Problem: The mesh is up internally but has no internet access or no uplink.
Symptoms:
- Nodes can reach each other but not external addresses
- The operator reports gateway as unreachable
- DNS lookups fail
Diagnosis:
# On the gateway node
ssh root@<gateway-ip>
ping 8.8.8.8 # test internet
ping <ISP-gateway-ip> # test ISP uplink
ip route # check default route
logread | tail -50 # check recent logsFix:
- ISP uplink is down: contact ISP or check physical connection to the ISP equipment (modem, fiber ONT). This is outside the mesh — the mesh itself is fine.
- Gateway node is up but route is missing: reboot the gateway (with approval) or restore the WAN interface config.
- Wrong gateway in routing: check that the correct node is configured as gateway in
desired-state/mesh/community-profile/and that other nodes have not elected a different gateway.
Problem: A service that should be running is not accessible on its local domain.
Symptoms:
- Browser shows "connection refused" or "site not found" on the local domain
- The operator's
server-readonlyhealth check fails for this service - Users report the service is down
Diagnosis:
# Check if the container or service process is running
docker ps | grep <service-name>
systemctl status <service-name>
# Check if the port is listening
ss -tlnp | grep <port>
# Test the service directly (bypass reverse proxy)
curl http://localhost:<port>/
# Check the reverse proxy
nginx -t # if using Nginx
systemctl status nginx
# Check local DNS
grep <local-domain> /etc/hosts
nslookup <local-domain> localhostFix:
- Service is not running: start it with
docker start <name>orsystemctl start <name>. Check logs first:docker logs <name>orjournalctl -u <name>. - Service is running but port is wrong: check the service's port mapping in its compose file or unit file. Update
desired-state/server/service-catalog.yamlif the port changed. - Reverse proxy is not routing correctly: check the proxy config in
desired-state/server/reverse-proxy.yamland compare to the actual Nginx/Caddy config. Useserver-servicesskill to sync it (requires approval). - Local domain not resolving: check
/etc/hostsor local DNS. The entry may be missing. Add it via theserver-servicesskill.
Problem: The local server is running out of disk space.
Symptoms:
server-readonlyreports disk usage above 80% or 90%- Services start failing with "no space left on device" errors
- Logs stop writing
Diagnosis:
# Check disk usage by filesystem
df -h
# Find what is using space
du -sh /var/lib/docker/* # Docker images and volumes
du -sh /var/log/* # Logs
du -sh /home/* # User data
du -sh /opt/* # Installed servicesFix:
- Docker taking up space: run
docker system pruneto remove unused images and stopped containers. Check with the operator before doing this — some containers may be intentionally stopped but needed. - Logs growing too large: check log rotation settings in
/etc/logrotate.d/. Rotate manually:logrotate -f /etc/logrotate.conf. - Service data growing: check backup policy in
desired-state/server/backup-policy.yaml. Data may need to be archived or pruned. Do not delete data without understanding what it is. - Run disk cleanup through the operator: ask the operator "the server disk is almost full, what should I do?" to get a guided, safe cleanup plan.
Problem: The service is running and reachable by IP, but the local domain does not work.
Symptoms:
http://localhost:<port>workshttp://<service>.localorhttp://<service>.communitydoes not work
Diagnosis:
# Test DNS resolution
nslookup <local-domain>
ping <local-domain>
# Check /etc/hosts
grep <local-domain> /etc/hosts
# Check reverse proxy config
cat /etc/nginx/sites-enabled/<service>Fix:
- Add the domain to
/etc/hostson the affected machine:127.0.0.1 <local-domain>(or the server's LAN IP if configuring on a client machine). - If you are using a local DNS server, add the record there.
- Verify the reverse proxy has a server block for the domain.
- Use the
server-servicesskill to set up the local domain properly and record it indesired-state/server/domains.yaml.
Problem: SSH connection is refused or times out.
Symptoms:
ssh: connect to host <ip> port 22: Connection refusedssh: connect to host <ip> port 22: Connection timed out- Password prompt appears but authentication fails
Diagnosis:
# Test if the host is reachable at all
ping <ip>
# Test if the SSH port is open
nc -zv <ip> 22
# Try verbose SSH to see where it fails
ssh -v root@<ip>Fix:
- Host is not reachable (ping fails): network connectivity issue. Check that you are on the right network (LAN, mesh, Tailscale). See Section 1.1 if it is a mesh node.
- Port 22 is closed: SSH may be disabled or on a non-standard port. Check the node's firewall config or the server's SSH daemon settings.
- Authentication fails with key: the key is not in
authorized_keyson the target. You may need physical access to add your key. Check~/.ssh/authorized_keyson the target host. - Authentication fails with password: the password may have changed, or password authentication may be disabled. Use key-based auth.
Problem: Messages sent to the bot are not receiving responses.
Symptoms:
- Messages to the WhatsApp/Telegram bot go unanswered
- The channel was working before but stopped
- Some channels work but others do not
Diagnosis:
# Check if OpenClaw is running
openclaw status
# Check the channel adapter logs
openclaw logs --channel <channel-name>
# Check network access from the ops host
curl https://api.telegram.org/bot<token>/getMe # Telegram exampleFix:
- OpenClaw is not running: restart it:
openclaw gateway --forceor the appropriate service command. - Channel token expired or revoked: regenerate the bot token in the channel's admin interface and update it in the local secrets store. Never commit tokens to the repo.
- The ops host lost internet: if the channel requires internet (e.g., Telegram), the ops host needs network access. Check the host's network.
- The channel is in an untrusted/sandboxed mode: if the message was sent from a public group, the operator may be intentionally not responding to write requests. This is expected behavior.
Problem: The frontdesk agent is handling requests itself or sending them to the wrong specialist.
Symptoms:
- Mesh questions are answered by the server planner
- The response is generic and not specialized
- The operator says "I can't handle that" for requests it should handle
Diagnosis:
Look at the routing logic in skills/community-ops-frontdesk/SKILL.md. Check whether the keywords or intent patterns for this type of request are defined.
Fix:
- Review
AGENTS.mdto ensure agent boundaries are described correctly. - Update the routing logic in
skills/community-ops-frontdesk/SKILL.mdto add or fix the intent classification for this type of request. - If using OpenClaw's multi-agent routing, check that agent names in the skill file match the agent names defined in
AGENTS.md.
Problem: The operator is performing write operations without requesting explicit approval.
Symptoms:
- Infrastructure changes happen without a confirmation step
- The operator says "done" without asking first
- A Class C or D operation ran from an untrusted channel
Diagnosis:
Check the relevant skill file (e.g., skills/mesh-rollout/SKILL.md) and verify that approval gates are defined. Check TOOLS.md for the write permission constraints.
Fix:
- This is a critical safety issue. Stop the operator and review the skill file immediately.
- Add or restore the approval gate in the skill's execution logic.
- Review
TOOLS.mdand ensure write tools require theapproval_required: trueconstraint. - Check
AGENTS.mdto confirm that the executor agents are not reachable directly from public channels. - Log the incident in
logs/and theknowledge-curatorskill.
Problem: The operator says it cannot find a node, site, or service that exists.
Symptoms:
- "I don't have information about that node"
- Topology maps are empty
- Site names are not recognized
Diagnosis:
# Check that inventory files exist and have content
cat inventories/mesh-nodes.yaml
cat inventories/sites.yaml
cat inventories/local-services.yamlFix:
- If files are empty or missing, they need to be populated. Use the
knowledge-curatorskill or fill them in manually following the YAML format in each file. - If the data is there but not being read, check whether OpenClaw is configured to use the correct workspace directory.
- Confirm the workspace path in OpenClaw matches the
mesharepo path:openclaw config get agents.defaults.workspace.
Problem: The operator is responding in a language the user does not understand, or using technical jargon.
Symptoms:
- Responses are in English but the community uses Portuguese (or another language)
- Explanations are full of network terminology
- Voice summaries are too long or too complex
Diagnosis:
Check SOUL.md for the community's preferred language and tone settings. Check the voice-friendly-response skill.
Fix:
- Update
SOUL.mdwith the correct default language and communication style for the community. - The
voice-friendly-responseskill should be called for outputs that go to voice or low-literacy contexts. Check that the frontdesk is invoking it correctly. - Ask the operator directly: "explain that in simple Portuguese" — this should trigger the voice-friendly response skill.
Problem: npm install -g @openclaw/cli fails with an error.
Common errors and fixes:
| Error | Fix |
|---|---|
EACCES: permission denied |
Use sudo or configure npm to use a user-writable prefix: npm config set prefix ~/.npm-global |
ENOENT: no such file |
Node.js may not be installed. Run node --version and reinstall if needed |
unsupported engine |
Your Node.js version is too old. Install Node 22+ |
| Network timeout | Check internet connection. Try npm install -g @openclaw/cli --prefer-offline if you have a cached version |
Problem: scripts/doctor.sh reports that required files or directories are missing.
Fix:
- Check that the workspace repo was cloned correctly:
git statusandlsinside the repo. - If inventory files are missing, create empty stubs:
touch inventories/mesh-nodes.yaml. - If desired-state files are missing, copy from the template or create them following the format in
BOOTSTRAP.md. - Run the doctor again after each fix.
Problem: On Windows with WSL2, the network tools cannot reach the local LAN.
Symptoms:
- Can ping internet but not LAN devices from WSL2
- SSH to LAN hosts fails
ping 192.168.x.xtimes out
Diagnosis: WSL2 uses a virtual network adapter by default. Your LAN devices may not be directly reachable.
Fix:
- Check your WSL2 IP:
ip addr show eth0 - Try adding a route to your LAN subnet from WSL2.
- For full LAN access, use Tailscale — install it on both the WSL2 host and the target machines.
- Alternatively, configure WSL2 to use a bridged network adapter (this requires editing WSL2 config files — see Microsoft's WSL2 documentation for your Windows version).
Use this checklist when something is broken and you are not sure where to start:
- Is the ops host powered on and connected to the network?
- Is OpenClaw running? (
openclaw status) - Is the workspace configured? (
openclaw config get agents.defaults.workspace) - Are the inventory files populated? (
ls inventories/) - Can you SSH into the affected node or server? (
ssh root@<ip>) - Is the affected node reachable on the network? (
ping <ip>) - Do the logs show any errors? (
openclaw logs,docker logs,journalctl) - Has anything changed recently? (check
logs/for recent approved actions) - Is this a known issue? (search
docs/andinventories/)
If you cannot resolve the issue, record it in the knowledge-curator skill so it becomes part of the project's known issues documentation.