Skip to content

feat(monitoring): add production health checks with auto-issue filing #190

Description

@ytnobody

目的

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.tomlhealth_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]] 表記に修正しています。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions