--- name: watchdog-discord-route description: Install, reset, verify, or operate the OpenClaw watchdog-b owner-facing Discord route. Use when setting up or repairing watchdog-b -> owner-report -> Discord delivery, cleaning old watchdog test residue, enabling the systemd --user timer, running end-to-end verification, or adjusting the Discord-facing notification path/target/template. --- # Watchdog Discord Route Use this skill when the task is about the **watchdog-b owner-facing notification path to Discord**. This skill covers four recurring jobs: 1. **Reset / clean** old watchdog test residue without deleting live audit assets. 2. **Verify** the end-to-end path from watchdog-b to Discord. 3. **Install / enable** the live watchdog schedule. 4. **Repair / adjust** the Discord-facing route, target, or message format. ## What the current canonical path is Preferred owner-facing path: `watchdog-b -> notify_watchdog_b.py -> owner_report_producer.py -> owner_report_driver.py -> OpenClaw Discord send -> sent archive` For watchdog-b single-shot owner-facing delivery, prefer the **direct Discord driver path** over relying on the generic wrapper watchdog destination semantics. Current default Discord target in this workspace is a validated example, but the portable skill should treat target as host-local configuration. For portable installs, set: - `WATCHDOG_B_OWNER_REPORT_TARGET=channel:REPLACE_ME` ## Bundled skill resources This skill now carries a portable bundle under its own directory. Prefer these bundled files first when adapting or reusing on another host: ### scripts/ - `scripts/check_openclaw_state.sh` - `scripts/notify_watchdog_b.py` - `scripts/run_watchdog_b.sh` - `scripts/verify_watchdog_b_e2e.sh` - `scripts/owner_report_consumer.py` - `scripts/owner_report_producer.py` - `scripts/owner_report_driver.py` - `scripts/install_watchdog_bundle.sh` - `scripts/bootstrap_watchdog_bundle.sh` - `scripts/openclaw-watchdog-b.service` - `scripts/openclaw-watchdog-b.timer` - `scripts/openclaw_runtime_probe.py` - `scripts/watchdog-b.env.example` ### references/ - `references/watchdog-b-readme.md` - `references/owner-reporting-system.md` - `references/owner-report-operator-manual.md` If working in this workspace, you may still inspect the live workspace files too, but the bundled skill files are the portable baseline. ## When resetting / cleaning Before touching anything, inventory: - `state/watchdog-b/` - `state/watchdog-b-test-*` - `state/watchdog-b-verify-e2e/` - `state/archive/` - `~/.clawteam/owner-reports/pending/` - `~/.clawteam/owner-reports/sent/` - user crontab entries related to owner-report/watchdog - `~/.config/systemd/user/openclaw-watchdog-b.*` Rules: - **Do not delete** `~/.clawteam/owner-reports/sent/` history unless explicitly asked. - **Do not delete** live `state/watchdog-b/notify-state.json` unless the user explicitly wants a hard reset. - Prefer **archiving** old `state/watchdog-b-test-*` into `state/archive//`. - Distinguish clearly between: - live state - old test residue - repo templates - live installed units ## When doing end-to-end verification Default verification script: - bundled: `scripts/verify_watchdog_b_e2e.sh` - workspace live path: `scripts/watchdog-b/verify_watchdog_b_e2e.sh` This should be treated as the **single-source verification path** unless there is a specific reason to bypass it. Minimum success evidence: - Discord send success with a new message id - pending report created then moved to sent - sent file exists under `~/.clawteam/owner-reports/sent/` - verification artifacts under `state/watchdog-b-verify-e2e//` Useful artifacts: - `verify.log` - `run-output.txt` - `queue-before.txt` - `queue-after.txt` - `sent-head.txt` - `state/notify-state.json` Do not claim human-visible success unless either: - the user confirms visibility, or - you can read back the message from the exact Discord channel and match the message id/content. ## When installing the live schedule Preferred scheduler: **systemd --user timer**. Before claiming a host is ready, prefer to run the bundled bootstrap checker first: - `scripts/bootstrap_watchdog_bundle.sh` When installing or refreshing the portable bundle into live paths, prefer the bundled installer: - `scripts/install_watchdog_bundle.sh --install-env-example` Use bootstrap when you need a quick host-readiness answer without changing the host. Use install when you need to copy the bundled scripts/service/timer/env example into the live workspace and user config paths. Use it when: - `systemd --user` is available - linger/user services are supported - you want journal/status/list-timers visibility Live install paths: - `~/.config/systemd/user/openclaw-watchdog-b.service` - `~/.config/systemd/user/openclaw-watchdog-b.timer` - `~/.config/openclaw/watchdog-b.env` Portable install sources carried by this skill: - `scripts/check_openclaw_state.sh` - `scripts/run_watchdog_b.sh` - `scripts/notify_watchdog_b.py` - `scripts/owner_report_consumer.py` - `scripts/owner_report_producer.py` - `scripts/owner_report_driver.py` - `scripts/install_watchdog_bundle.sh` - `scripts/bootstrap_watchdog_bundle.sh` - `scripts/openclaw-watchdog-b.service` - `scripts/openclaw-watchdog-b.timer` - `scripts/openclaw_runtime_probe.py` - `scripts/watchdog-b.env.example` Expected environment for live route: - `WATCHDOG_B_NOTIFY_DRY_RUN=0` - `WATCHDOG_B_RUNNING_REPORT_MODE=enqueue-and-drain` - `WATCHDOG_B_OWNER_DELIVERY_MODE=direct-discord` - `WATCHDOG_B_OWNER_REPORT_CHANNEL=discord` - `WATCHDOG_B_OWNER_REPORT_TARGET=channel:REPLACE_ME` - optional: `WATCHDOG_B_MAIN_AGENT_ID=` Minimum installation verification: - `systemctl --user daemon-reload` - `systemctl --user enable --now openclaw-watchdog-b.timer` - `systemctl --user start openclaw-watchdog-b.service` - `systemctl --user status openclaw-watchdog-b.timer --no-pager` - `systemctl --user status openclaw-watchdog-b.service --no-pager` - `systemctl --user list-timers --all | rg openclaw-watchdog-b` - `journalctl --user -u openclaw-watchdog-b.service -n 50 --no-pager` ## When repairing Discord delivery Check these in order: 1. Is the target channel correct? - Validate the host-local configured form such as `channel:` 2. Is the send path using direct driver delivery or the generic wrapper? - For watchdog-b owner-facing single-shot delivery, prefer direct driver delivery. 3. If stalled/idle tries to nudge a main agent, is `WATCHDOG_B_MAIN_AGENT_ID` set to a valid agent id on that host? - If not, leave it unset so main-agent nudge is skipped instead of failing on `Unknown agent id`. 4. Does the message actually appear in channel readback? 5. Is the message merely transport-accepted, or human-visible? Be precise in language: - "transport accepted" = send returned success / message id - "channel-readable" = message appears in channel readback - "human-confirmed" = Eric says he saw it Do not collapse these into one claim. ## Message formatting preference Eric reported that visible does not necessarily mean prominent. When adjusting Discord-facing watchdog messages, prefer: - short first line - conclusion first - minimize raw diagnostic fields in the user-facing body - keep machine/audit detail in artifacts, not in the first visible lines Preferred shape: - `🔔 WATCHDOG|<結論>` - `任務:...` - `結論:...` - `你現在不用做事` or `需要你介入:...` ## Suggested execution pattern For most tasks in this skill: 1. Inventory live state and installed schedule. 2. Decide whether the task is: - reset/cleanup - route repair - schedule install - e2e verify - portability / migration 3. Preserve audit assets. 4. Prefer the bundled skill scripts as the reusable baseline. 5. Use direct driver Discord route for owner-facing verification. 6. Attach evidence paths and exact commands before claiming success. ## Portability note This skill is now suitable to copy to another OpenClaw workspace, but portability still depends on the target host having: - a working OpenClaw install - Discord routing available - a valid destination channel/target configured in `watchdog-b.env` - systemd --user if live scheduling is desired When moving to another host, recommended order is: 1. Run `scripts/install_watchdog_bundle.sh --install-env-example` to populate live paths from the bundled copies. 2. If `~/.config/openclaw/watchdog-b.env` does not exist, create it from the example: - `mkdir -p ~/.config/openclaw` - `cp ~/.config/openclaw/watchdog-b.env.example ~/.config/openclaw/watchdog-b.env` 3. Edit `~/.config/openclaw/watchdog-b.env` and set at least: - `WATCHDOG_B_OWNER_REPORT_TARGET=channel:YOUR_DISCORD_CHANNEL_ID` 4. Run `scripts/bootstrap_watchdog_bundle.sh`. 5. Bootstrap should now validate the installed live bundle under `scripts/watchdog-b/` and should not require a separate `owner-reporting-system/` live tree. 6. Re-run bootstrap until it passes, then enable/start systemd --user units. When moving to another host, runtime detection now follows this order: 1. explicit env overrides: `WATCHDOG_B_NODE_BIN`, `WATCHDOG_B_OPENCLAW_MJS`, `WATCHDOG_B_OPENCLAW_ENTRY` 2. PATH discovery: `node`, then `openclaw`-adjacent install roots 3. common install roots scan: nvm, pnpm global, npm-global, `/usr/local`, `/usr`, and Volta-style locations 4. hard failure with a message telling the operator which env vars to set manually So on most hosts you should only need to update: - `WATCHDOG_B_OWNER_REPORT_TARGET` - `WATCHDOG_B_WORKSPACE` if the workspace is not the default `~/.openclaw/workspace` Only set `WATCHDOG_B_NODE_BIN` / `WATCHDOG_B_OPENCLAW_ENTRY` / `WATCHDOG_B_OPENCLAW_MJS` when auto-detection fails or you intentionally want to pin a non-default runtime. If another agent reports that `~/.config/openclaw/watchdog-b.env` does not exist, the correct response is to create it from `watchdog-b.env.example` before expecting bootstrap to pass. ## Success checklist Do not say done unless you have all applicable evidence: - changed file paths - exact command(s) run - status output or send result - sent archive path when queue/driver is involved - channel/message evidence when claiming delivery - rollback instructions when you changed live scheduling