ワークフロー&基本ツール · daymade/claude-code-skills

macos-watchdog

macOS launchd ウォッチドッグの設計、デプロイ、および統制を行います。再発する問題を検知して自動修復する LaunchAgents/LaunchDaemons を管理します。macOS 上で永続的なバックグラウンドモニター/デーモン/エージェントを作成または編集する場合、launchd plist を作成する場合、自己修復スクリプトを定期実行する場合、あるいはウォッチドッグ自体が妨害(ユーザーが終了したアプリの再起動、通知の連打、修復不能なネットワーク上での頻繁な修復ラダーの再実行、クラッシュループやフォークストーム、暴走再起動によるシステムへの過負荷)を引き起こしている場合に使用します。また、停止・無効化のセマンティクス(bootout 対 bootstrap 対 disable 対 unload)、自己修復処理へのクールダウン/バックオフ/通知スロットリングの追加、前提状態へのモニターのライフサイクルバインド、既存 LaunchAgents の監査にも適しています。中文トリガー:launchd 守护进程、常驻任务、开机自启、后台监控、定时自愈脚本。KeepAlive/ThrottleInterval/domains/logging、前提自己チェック、自動クールダウン、アラート階層化、バッチスロットリングを網羅しています。

L4 高権限 · 段階的認可と監査V1 コミット固定コマンド実行ファイル書き込みDual-pass Audit
Author daymadeGitHub daymade/claude-code-skills ↗Stars 1385License MIT(仓库根 LICENSE,Copyright (c) 2025 daymade;GitHub API spdx MIT)Commit d5c4678cb5
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

設計思想:ウォッチドッグのライフサイクルを premise state(前提状態)にバインドします。存在理由が消滅した場合(Wi-Fi 切断、ユーザーによる対象アプリの終了、前提条件の喪失)、手動で disable されるのを待つのではなく、自発的に stand down する必要があります。本スキルの根本理念は「ウォッチドッグ自身を新たな障害にしないこと」です。

daymade-macos/macos-watchdog/SKILL.md
**a watchdog's lifecycle is bound to its premise state**. When the condition it exists to fix cannot be fixed by it (broken WiFi, user quit the target app, prerequisite state gone), the watchdog must stand down *by itself*
これはスキル全体の主軸です。デプロイ手順は外枠に過ぎず、「quiet-watchdog contract」の4箇条(前提自己チェック/修復優先かつ N 回試行後にのみエスカレーション/段階的自動クールダウン/ユーザーが意図的に終了したアプリを復活させない)こそが妨害を防ぐ中核です。

デプロイ機構は launchd のネイティブツールを採用:assets/launchagent.template.plist をベースとし、new-launchagent.sh が冪等なインストールを実行します(label/interval/program の検証 → 読み込み済みなら bootout → plist 書き込み → plutil -lint → launchctl bootstrap → launchctl print による検証)。

daymade-macos/macos-watchdog/scripts/new-launchagent.sh
plutil -lint "$tmp_plist" >/dev/null || { echo "Generated plist failed plutil -lint" >&2; rm -f "$tmp_plist"; exit 1; }
interval < 30 秒は即座に拒否されます(クラッシュループ領域)。program は実行可能な絶対パスが必須、label は reverse-DNS 形式が必須です。--system は sudo 経由で /Library/LaunchDaemons + system ドメインに書き込みます(root デーモンのログはユーザーホームに配置不可)。

クールダウンロジックは ThrottleInterval ではなくアプリケーション層で実装:watchdog-cooldown.sh を source することで paused_any/record_exhausted/clear_exhausted/cmd_pause/cmd_resume を提供し、state ファイルに連続 exhausted 回数を記録して段階的(デフォルト 1800/7200/21600 秒 = 30分→2時間→6時間)にバックオフして沈黙します。

daymade-macos/macos-watchdog/scripts/watchdog-cooldown.sh
space-separated escalating tiers, seconds. Default "1800 7200 21600"
ThrottleInterval では不十分な理由をドキュメントで説明:プロセス再起動の頻度抑制に過ぎず、バックオフのない固定遅延であり、「exit 0 で終了しつつログを連打する」ジョブには効果がありません。スパムがアプリケーション層で起きる以上、沈黙処理もアプリケーション層で行う必要があります。

停止セマンティクスにおける非推奨トラップの明確化:Ventura 以降の unload は、plist が残っており RunAtLoad があるとジョブが復活してしまいます。そのため、bootstrap/bootout(現代の推奨ペア)と disable/enable(ログインを跨いで停止を維持)を使用する必要があります。

daymade-macos/macos-watchdog/SKILL.md
**Never `launchctl unload`**: deprecated, and on Ventura+ the job re-loads via `RunAtLoad` when the plist stays in place — the "disabled" watchdog fires again
該当セクションのコマンド一覧では、bootout(即時停止)/disable(ログインを跨いだ停止)/bootout→edit→bootstrap(plist 変更後の再ロード)という3つの意図に応じた正確なコマンドを提示します。

再起動防止ゲート:修復処理で URL スキーム、open -a、または GUI アプリの再起動を用いる場合、事前にプロセス生存チェックを行い、-g(フォアグラウンドを奪わない)を付与する必要があります。これを行わないと、ウォッチドッグが「ユーザーが終了させたのに勝手に再起動する」迷惑な挙動を示します。

daymade-macos/macos-watchdog/SKILL.md
Gate every such action: check the target process is alive before invoking its scheme, and pass `-g` so a legitimate action never pops a window. If the user quit the app mid-remediation, abort the ladder
cleanup trap も同じゲートを遵守する必要があります。そうでないと、「終了時に接続を確保する」というフェイルセーフ処理が意図せずアプリを復活させる原因になります。

2コア機能

01新規ウォッチドッグの全工程デプロイ(LaunchAgents vs LaunchDaemons の配置選定、plist テンプレート、読み込み/再読み込み/ログ/冪等性)
02quiet-watchdog 4箇条コントラクトの審査(既存ウォッチドッグの迷惑な挙動[スパム/勝手な再起動/空回り/画面のログ埋め]の診断)
03冪等インストーラー new-launchagent.sh(bootout-if-loaded → plist 書き込み → bootstrap → launchctl print 検証)
04アプリケーション層での段階的クールダウン/手動一時停止(watchdog-cooldown.sh ステートマシン)
05停止/無効化セマンティクスの正確な対照表(bootout / disable / enable / unload の落とし穴)
06トラブルシューティング早見表(勝手な再起動/ログ連打/偽の正常状態/bootout が効かない/サイレント失敗/TCC インタプリタの不一致)
07一括処理タスクのデフォルト流量制限ルール(スロットリングのないループによる暴走プロセスの防止)

3外部依存関係

KindDependency / Endpoint
clilaunchctl(bootstrap/bootout/kickstart/print/list/disable/enable)
cliplutil(plist lint 校验)
clisudo(--system 路径:/Library/LaunchDaemons + system 域 bootstrap)
cliopen / log show / id -u(GUI 域引导、launchd 日志排查)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: scripts/new-launchagent.sh(インストールフェーズ: bootout/plist 書き込み/bootstrap)
  • 本地工作目录: ファイルの読み書きおよび成果物の出力: ~/Library/LaunchAgents/<label>.plist(または sudo /Library/LaunchDaemons/<label>.
監査ノート: ローカルの launchd 自動化スキルです。外部ネットワークへの送信やクレデンシャルの読み取りは行いません(テンプレートには plist が全体に読み取り可能であるため秘密情報を記述しないよう明記されています)。判定が「イエロー」である理由は、実行可能スクリプトを**永続的なバックグラウンドジョブ**(LaunchAgents/LaunchDaemons)としてインストールする設計目的に起因します。--system パスは sudo 経由で /Library/LaunchDaemons に書き込み、system ドメインに bootstrap するため、信頼されたスクリプトがユーザーまたは root 権限で定期的に常駐実行されるシステムレベルの永続的変更面を構成します。また、本スキルに基づいてモデルが生成するウォッチドッグスクリプトの内容自体は、スキル自体によって厳密に制約されません(4箇条の規律と入力検証によって間接的に制約されるのみです)。外部送信やクレデンシャルアクセスがないため「オレンジ」には至りませんが、通常のローカルファイル読み書きを超えた永続的な root レベルの実行面を扱うため、「ブルー」より高い「イエロー」と判定されます。

5二重目の独立検証

  • [ok] 四条款契约与真实事故绑定 — SKILL.md 每条 clause 后都带真实案例('Real case: a recovery watcher kept firing for 2h after its premise resolved'、'unthrottled test replay forked 1,041 processes/sec for 7 minutes' 等);war stories 在 references/quiet-watchdog-patterns.md。
  • [ok] new-launchagent.sh 校验与安装流程 — label reverse-DNS 校验、interval 整数且 ≥30、program -f/-x 绝对路径、tmp plist + plutil -lint、bootout-if-loaded、launchctl bootstrap + print 验证,全部逐字在源码。
  • [ok] cool-down 状态机(1800/7200/21600 阶梯) — watchdog-cooldown.sh 常量与文档默认一致;state 文件 pause/autopause/exhausted.state;提供 cmd_pause/cmd_resume/record_exhausted/clear_exhausted/paused_any。
  • [ok] unload 陷阱与 bootstrap/bootout 语义 — SKILL.md 'Never `launchctl unload`' + Ventura+ RunAtLoad 复活机制说明 + bootout/disable 命令表,与脚本实现一致。
  • [ok] 运行路径无网络(安全结论基础) — 全目录运行代码无 curl/wget/http 调用;唯一 curl 出现在 evals/iteration-1 fixture broken-heal.sh(评测反例夹具),已在 internal_assets/风险注记中说明非运行路径。
  • [ok] 无凭证读取 + plist 密钥警告 — plist 模板 'Never put secrets here; the plist is world-readable.';脚本无 token/API key 处理。
  • [ok] 元数据(commit/license/stars) — 本地 HEAD == pin d5c4678cb5d4fd6acc9c922690df035dbd33d247;GitHub API:MIT、stars 1385(2026-09-09 实采)、pushed_at 2026-09-09T12:33:29Z。

6結論

  • 「ウォッチドッグ自体が新たな障害になり得る」ことを深く理解:自己修復処理の異常(勝手な再起動、スパム、空回り、フォークストーム)を一級の問題として扱います。
  • アプリケーション層のクールダウンと前提自己チェックという実践的なエンジニアリングパターン:ThrottleInterval では防げないアプリ層のスパムを、state ファイルと段階的バックオフで解決します。
  • インシデント駆動の実戦知見:すべての規律に実際の事例と観測データ(例:94分間の観測に基づく N=2 サイクル)が付随しており、机上の空論ではありません。
  • 組み込みの冪等性と検証:new-launchagent.sh による再実行の収束、plutil -lint、bootstrap 後の print 検証により、デプロイが破綻するのを防ぎます。
  • 再起動防止やバッチ流量制限などの「副作用抑制ルール」を明示的なゲートとデフォルトパラメータとして定義し、ウォッチドッグで最もありがちな2大公害を遮断します。
  • 最適な用途: macOS 上で「定期検知+自動修復」を要する常駐監視シナリオに最適です。ネットワーク、プロキシ、設定のロールバック、サービスの死活監視ウォッチドッグの新規構築・運用、および既存のウォッチドッグが迷惑動作(アプリの勝手な再起動、通知の連打、空回りによるシステム過負荷)を起こしている場合の診断・修復に適しています。自身でスクリプトの作成・レビューができ、launchd のドメインモデルを理解しているエンジニア層のユーザー向けです。
    不向きな用途: 1回限りの修復(常駐を必要としない)シナリオには不向きです。スクリプトの作成・監査能力がないまま root デーモンをデプロイしようとするユーザーには不向きです。macOS 以外のプラットフォームには対応していません。「インストールしたら放置したい」と考えるユーザーには不向きです(本スキルの本質は、まさにウォッチドッグ自身を監視することにあります)。
    Install Agent-Ready
    ① Verified Mirror 2026-09-09
    Option A · Direct DownloadDownload macos-watchdog.tar.gz
    sha256: 84c303ee98ee57c6…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit d5c4678cb5.