Clash TUN Doctor
Evidence-first diagnosis and reversible repair for application networking failures behind Clash Verge Rev TUN mode.
When to Use
- An application works without TUN but fails, stalls, or loses media with TUN.
- WeChat text works while image uploads or Moments images fail.
- A rule change makes the symptom worse or the app remains stuck on Loading.
- The subscription says
ipv6: false, but runtime traffic still uses IPv6. - Clash logs contain
no route to host,context deadline exceeded, or an unexpected rule/strategy for the affected process.
Do not use this skill for generic subscription acquisition, node purchasing, or bypassing organizational network policy.
Workflow (MANDATORY)
Step 0: Resolve the skill and Clash data directories
Resolve SKILL_DIR from the installed skill context. For manual execution:
export SKILL_DIR="/path/to/sgc-clash-tun-doctor"
The CLI resolves the Clash Verge Rev data directory in this order:
--data-dirLOVSTUDIO_CLASH_TUN_DOCTOR_DATA_DIR- macOS Clash Verge Rev default under
~/Library/Application Support/
Never hard-code a user's home directory.
Step 1: Diagnose before proposing a rule
Run the read-only command first:
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" diagnose --app wechat
Report concrete evidence from all available layers:
- App-level
config.yamloverrides. - Generated
clash-verge.yamltop-level and DNS IPv6 values. - Runtime
/configs,/rules, and/connectionsthrough Mihomo's Unix socket. - Recent service-log failures for the target application.
Treat screenshots and runtime state as truth. A rule saying DIRECT does not
prove the connection succeeded.
Step 2: Choose the narrowest repair
Use references/troubleshooting.md to map evidence to a repair. For the proven
WeChat pattern, use the built-in repair:
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" fix-wechat
This is a dry run. It previews:
- Direct rules for the WeChat processes and media domains.
- Disabling the app-level IPv6 override that can supersede subscription and extension settings.
- The exact files that would be backed up and changed.
Do not route the whole application through a proxy merely because direct media failed. First check proxy health and IPv6 errors; a proxy timeout can turn one failed image into a fully stuck application.
For a browser site or application with multiple dependency hosts, generate one evidence-backed DIRECT list instead of adding domains one by one:
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" direct-list \
--app miracleplus \
--host apply.miracleplus.com \
--output ./miracleplus-direct.yaml
The command reads active connections and recent rotated service logs, deduplicates hostnames, and includes only:
- Hosts explicitly supplied with
--host. - Hosts previously observed through a non-DIRECT route.
- Hosts already maintained as explicit DIRECT rules.
Hosts observed only through a healthy DIRECT route are reported as ignored instead of bloating the explicit list.
Step 3: Apply only with user authorization
For a DIRECT list, preview first, then persist and hot-load it:
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" direct-list \
--app miracleplus \
--host apply.miracleplus.com \
--apply
This path must merge with existing prepend rules, create a timestamped backup,
update the generated config, hot-load Mihomo through its Unix socket, and verify
every listed host as an exact DOMAIN -> DIRECT runtime rule. Keep Clash Verge
running throughout this rule-only flow.
For the specialized WeChat IPv6 repair, run:
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" fix-wechat --apply
The command must:
- Stop Clash Verge before editing its generated global settings.
- Create a timestamped backup and manifest.
- Set the global IPv6 override to
false. - Prepend persistent WeChat
DIRECTrules in the current profile's rule file. - Restart Clash Verge and verify final/runtime state.
If verification fails, report the backup path and do not claim success.
Step 4: Restart the affected application and verify the user path
Close stale connections or restart the affected application. Re-run diagnosis:
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" diagnose --app wechat --json
For the WeChat IPv6 failure, success requires all of the following:
- Runtime
ipv6isfalse. - WeChat rules resolve to
DIRECT. - New WeChat destinations are IPv4.
- New logs no longer show WeChat
no route to hosterrors. - The user can send an image and load Moments images.
Step 5: Roll back when needed
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" rollback --apply
Rollback restores the newest backup by default. Never delete backups automatically.
CLI Reference
| Command / option | Default | Description |
|---|---|---|
diagnose |
— | Read configuration, runtime state, connections, and logs. |
direct-list |
— | Discover, export, or apply an evidence-backed DIRECT host list. |
fix-wechat |
dry run | Preview or apply the proven WeChat repair. |
rollback |
dry run | Preview or restore the latest repair backup. |
--data-dir PATH |
auto | Clash Verge Rev application data directory. |
--socket PATH |
<data-dir>/mihomo.sock fallback |
Mihomo controller Unix socket; standard /tmp/verge/verge-mihomo.sock is auto-detected. |
--app NAME |
wechat |
Application filter used by diagnosis. |
--host HOST |
— | Seed an exact host in a DIRECT list; repeatable. |
--output PATH |
— | Save a Mihomo classical rule-provider YAML list. |
--log-limit N |
4000 |
Recent lines inspected in each rotated service log. |
--apply |
false | Authorize filesystem changes and restart/restore actions. |
--no-reload |
false | Persist a DIRECT list without runtime hot-load. |
--no-restart |
false | Apply changes without restarting Clash Verge. |
--json |
false | Emit machine-readable diagnosis output. |
Dependencies
Python 3.8+ standard library only.