Heartbeat owner-value loop plan - 2026-06-03 Codex GUI
過去レポートのView/ソース規律バックフィルで生成したView。
現状
memory/heartbeat-guard-state.jsonはconsecutiveNoOwnerValueRuns=118。実行失敗ではなく、lastMessage=HEARTBEAT_OKが積み上がっている。scripts/heartbeat_guard.pyはconsecutiveNoOwnerValueRuns>=2でheartbeat_active_searchを選ぶが、直前が active_search だと通常ローテーション/昇格へ戻る。今日の状態ではheartbeat_dev_scoutが promoted され、長期NO_REPLY自体を深掘りする専用モードになっていなかった。HIMENO_GRILL/HIMENO_EXECUTIVEは人間向け文に変換できるが、build_message()では通常通知しない。これは正しい。ただし長期NO_REPLY時にそれらを優先投入する制御が弱かった。HEARTBEAT_CREATIVE.mdと creative state は成果物を残しているが、通知判断の失敗を「再現ケース -> 評価 -> 小さい修正」に変換する常設の入口がまだ薄い。
外部パターン
- Trace-first improvement loop: tracesを取り、評価/人間フィードバックで濃くして、失敗パターンをevalと次の実装handoffにする。OpenAI CookbookとLangChainが同じ形を推している。
- Harness-first: agentを信じるのではなく、速い検証harnessを作る。Datadogは「agent生成 -> harness検証 -> production telemetry -> feedbackでharness更新」と整理している。
- Observability schema: OpenTelemetry/Langfuseは、agentのtool call/guardrail/eval/latency/costを構造化traceとして残す方向。heartbeatでは
state.stepsだけでなく「なぜ黙ったか/次に何を変えたか」をtyped eventにしたい。 - Alert fatigue control: Datadogは noisy/flappy/predictable alert を見つけ、評価窓、recovery threshold、groupingで通知を減らす。heartbeatでは「黙りすぎ」も「通知しすぎ」も同じ制御対象。
Sources:
- https://developers.openai.com/cookbook/examples/agents_sdk/agent_improvement_loop
- https://www.langchain.com/blog/traces-start-agent-improvement-loop
- https://www.datadoghq.com/blog/ai/harness-first-agents/
- https://opentelemetry.io/blog/2025/ai-agent-observability/
- https://langfuse.com/blog/2024-07-ai-agent-observability-with-langfuse
- https://www.datadoghq.com/blog/best-practices-to-prevent-alert-fatigue/
実装計画
- 最小修正: 長期NO_REPLY時は通常の「最近signalがあるpatrol昇格」を上書きし、
heartbeat_active_search -> himeno_grill_audit -> himeno_executive_audit -> agent_observability_auditを回す。通知は増やさず、探索/判定/観測の角度を変える。 - 次の小実装:
memory/heartbeat-owner-value-events.jsonlを作り、各runのno_owner_value_count,selected_patrol,owner_message_kind,suppression_reason,artifact_pathを1行eventで保存する。 - eval化: 117連続NO_REPLYをfixtureにして、「long streakならdeep-dive patrolを選ぶ」「dev scout promotionがdeep-diveを潰さない」「通知本文がproof-of-lifeなら落とす」を回帰テストにする。
- owner-facing packet: deep-diveが新しい具体的な成果/修復/判断材料を見つけた時だけ、短い1通にする。単なる“長く黙っていた”通知は禁止。
- 承認が必要な範囲: cron設定変更、外部送信先/頻度変更、Telegram/Discordへの実通知テスト、本番OpenClaw config変更。
今回入れた小パッチ
scripts/heartbeat_guard.py:HEARTBEAT_NO_OWNER_VALUE_DEEP_DIVE_THRESHOLD(default 24)を追加。閾値超えでは deep-dive patrol を優先し、promoted dev scout などが長期NO_REPLY調査を潰さないようにした。scripts/test_heartbeat_guard.py: 長期NO_REPLY時に deep-dive patrol が選ばれること、直前と同じpatrolを避けることを追加。
検証
python3 -m py_compile scripts/heartbeat_guard.py scripts/test_heartbeat_guard.pyPYTHONPATH=scripts python3 -m unittest scripts/test_heartbeat_guard.py-> 48 tests OKpython3 scripts/himeno_grill_audit.py --quiet-ok-> HEARTBEAT_OKpython3 scripts/himeno_executive_audit.py --quiet-ok-> HEARTBEAT_OK
残課題
- まだevent log/replay datasetはない。次は
heartbeat-owner-value-events.jsonlと replayテストを足す。 - active_search側の探索テーマ切替はまだ既存lane依存。長期NO_REPLY専用の「何を探しに行くか」候補生成を薄く追加すると強い。
- 通知実験は外部送信なので未実施。