目的
HERMITはIssue駆動でSuperintendent/Engineerループを回しているが、本番環境(インフラ・アプリケーション)が実際に動作しているかを監視し、異常があれば自動でIssueを起票する仕組みがない。プロジェクトごとに監視対象は異なるため、HERMIT本体には監視ロジックを持たせず、プロジェクト側で定義したコマンドを実行するだけの汎用的な仕組みを追加する。
スコープ
- 対象: HERMIT本体(
internal/配下のMCPツール実装、harness.tomlのスキーマ、CLAUDE.mdのSuperintendent cycle記述)
- 変更してよい範囲: 新規MCPツール
run_health_checks の追加、設定スキーマへの health_checks フィールド追加、CLAUDE.md のSuperintendent cycleへの新ステップ追加、関連テスト
- 既存の
run_requirements_sweep / test_command の実装パターン・コーディングスタイルを踏襲すること
要件
設定
harness.toml(既存の test_command と同じ設定ファイル)に以下を追加できるようにする。
[[health_checks]]
name = "api-health"
command = "curl -sf https://example.com/healthz"
type は command 型のみサポート(http型などは将来拡張、今回は対象外)
health_checks が未設定/空配列のプロジェクトでは何も実行しない(既存プロジェクトへの影響なし)
新規MCPツール: run_health_checks
get_config から health_checks を読み込み、各エントリの command を実行する
- 各チェックの結果を
{name, ok, output}[] の形で返す(ok はコマンドの終了コードが0かどうか)
- コマンド実行にはタイムアウトを設ける(例: 30秒)。タイムアウトした場合は
ok: false とし、outputにその旨を記録する
Superintendentサイクルへの組み込み
CLAUDE.md の Superintendent cycle に新ステップを追加する(run_requirements_sweep の1時間毎チェックと同様に、独立したタイムスタンプで管理)。
- 固定5分間隔で
run_health_checks を呼び出す(前回実行から300秒未満ならスキップ)
- 失敗(
ok: false)したチェックがあれば、まず list_issues で同名チェックを指すopen issueが既に存在するか確認する(例: Issueタイトルに [health-check: <name>] のようなプレフィックスを含める規約とし、それで判定する)
- 既にopenのIssueがあれば、新規起票せずスキップ(コメントも追記しない)
- なければ、
production-incident ラベル付きで新規Issueを起票する。本文にはチェック名・実行コマンド・失敗時の出力・検知時刻を含める
- 次回のチェックでpassに戻った場合、対応するopen issueに「recovered at 」という1回きりのコメントを追記する(close操作は行わない。closeするかどうかは人間 or 通常のIssue解決フローに委ねる)
受け入れ条件
harness.toml に health_checks を定義すると、run_health_checks MCPツールが各コマンドを実行し {name, ok, output}[] を返すことをテストで確認できる
health_checks が未設定のプロジェクトで既存の挙動(Superintendentサイクル)に変化がないことを確認できる
- コマンドが失敗した場合に、同名チェックのopen issueが存在しなければ
production-incident ラベル付きの新規Issueが起票されることをテストで確認できる
- 同名チェックのopen issueが既に存在する場合は新規Issueが起票されない(重複起票防止)ことをテストで確認できる
- 失敗していたチェックが回復した場合、対応するissueに一度だけ「recovered」コメントが追記されることをテストで確認できる(closeはされない)
CLAUDE.md のSuperintendent cycleに新ステップの記述が追加されている
やらないこと
- http型のヘルスチェック(URL + 期待ステータスコード)は対応しない(将来のIssueで扱う)
- 障害継続中の定期的な経過コメント追記は行わない
- 検知したIssueの自動closeは行わない
参考
このIssueの設計方針はチャットでの議論に基づく(既存の run_requirements_sweep / test_command のパターンを踏襲)。
訂正 (2026-07-28): 起票時は設定ファイルを .hermit/config.yaml としていましたが、実際にこのリポジトリで使われている設定ファイルは harness.toml(TOML形式)でした。本文は実装(PR #191)に合わせて harness.toml / [[health_checks]] 表記に修正しています。
目的
HERMITはIssue駆動でSuperintendent/Engineerループを回しているが、本番環境(インフラ・アプリケーション)が実際に動作しているかを監視し、異常があれば自動でIssueを起票する仕組みがない。プロジェクトごとに監視対象は異なるため、HERMIT本体には監視ロジックを持たせず、プロジェクト側で定義したコマンドを実行するだけの汎用的な仕組みを追加する。
スコープ
internal/配下のMCPツール実装、harness.tomlのスキーマ、CLAUDE.mdのSuperintendent cycle記述)run_health_checksの追加、設定スキーマへのhealth_checksフィールド追加、CLAUDE.mdのSuperintendent cycleへの新ステップ追加、関連テストrun_requirements_sweep/test_commandの実装パターン・コーディングスタイルを踏襲すること要件
設定
harness.toml(既存のtest_commandと同じ設定ファイル)に以下を追加できるようにする。typeは command 型のみサポート(http型などは将来拡張、今回は対象外)health_checksが未設定/空配列のプロジェクトでは何も実行しない(既存プロジェクトへの影響なし)新規MCPツール:
run_health_checksget_configからhealth_checksを読み込み、各エントリのcommandを実行する{name, ok, output}[]の形で返す(okはコマンドの終了コードが0かどうか)ok: falseとし、outputにその旨を記録するSuperintendentサイクルへの組み込み
CLAUDE.mdの Superintendent cycle に新ステップを追加する(run_requirements_sweepの1時間毎チェックと同様に、独立したタイムスタンプで管理)。run_health_checksを呼び出す(前回実行から300秒未満ならスキップ)ok: false)したチェックがあれば、まずlist_issuesで同名チェックを指すopen issueが既に存在するか確認する(例: Issueタイトルに[health-check: <name>]のようなプレフィックスを含める規約とし、それで判定する)production-incidentラベル付きで新規Issueを起票する。本文にはチェック名・実行コマンド・失敗時の出力・検知時刻を含める受け入れ条件
harness.tomlにhealth_checksを定義すると、run_health_checksMCPツールが各コマンドを実行し{name, ok, output}[]を返すことをテストで確認できるhealth_checksが未設定のプロジェクトで既存の挙動(Superintendentサイクル)に変化がないことを確認できるproduction-incidentラベル付きの新規Issueが起票されることをテストで確認できるCLAUDE.mdのSuperintendent cycleに新ステップの記述が追加されているやらないこと
参考
このIssueの設計方針はチャットでの議論に基づく(既存の
run_requirements_sweep/test_commandのパターンを踏襲)。訂正 (2026-07-28): 起票時は設定ファイルを
.hermit/config.yamlとしていましたが、実際にこのリポジトリで使われている設定ファイルはharness.toml(TOML形式)でした。本文は実装(PR #191)に合わせてharness.toml/[[health_checks]]表記に修正しています。