feat(watcher): assigned のまま沈黙したタスクを時間起点で検知する - #3
Open
sousuke0422 wants to merge 2 commits into
Open
Conversation
lib/stale_task_detect.sh に純粋判定・失敗経路表を置き、watcher_supervisor から 60秒 tick で stale_task_scan を呼ぶ。L0 死署名・L1 30分沈黙・L2 90分再通知。 Co-authored-by: Cursor <cursoragent@cursor.com> Assisted-by: multi-agent-shogun-aki-tweak
Detect assigned tasks with absent panes (busy_rc=2) after 2min as L_pane. When agent registry is missing/unreadable/empty, scan all agents instead of silently skipping (fail-closed sixth layer). Assisted-by: multi-agent-shogun-aki-tweak
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
タスクが assigned のまま進まなくなった状態を、watcher が時間を起点に検知する。
背景
エージェントの CLI が落ちても、これまでは誰も気づかなかった。
既存の escalation は inbox の未読を起点に動く。
未読が無いまま session が死ぬと、何も発火しない。
そして
assignedは「振った」ことしか意味しないのに、状態としては「進んでいる」ように読めてしまう。この型で時間を失ったのは三度目になる。
足軽3 の CLI 落ちに 18 時間、cmd_599 の報告停滞に 18 時間、そして今回は 8 時間。
今回の直接の原因は、ペインに
Error: Unable to reach the model providerが出たまま復帰しなかったことだった。設計
判定は
lib/stale_task_detect.shに純粋な関数として置いた。tmux にも inbox にも依存しないため、単体テストで固定できる。
検知は四段になっている。
L0 は死署名の照合で、assigned から 2 分以上経過していることが条件。
既知の障害文字列がペインに出ていれば通知する。
L1 は沈黙の検知で、閾値は 30 分。
最終活動が窓の外にあれば通知する。
L2 は 90 分での再通知にあたる。
L_pane はペインが存在しない場合で、assigned から 2 分以上経過していれば通知する。
死署名は要らない。
通知先はエージェントによって変わる。
家老が対象のときは将軍へ送る。
そうでなければ家老へ送る。
家老自身が沈黙したときに誰も気づかない状態を避けるため。
自動での振り直しは行わない。
同じ枝を二人が握る事故の入口になるため、判断は家老に残している。
L0 は補助であり、本命は L1 になる
死署名の一覧は、既知の文字列を当てはめているだけにすぎない。
Unable to reach the model providerは今回たまたま観測できた一つでしかなく、新しい壊れ方は一覧に無い文字列を出す。つまり L0 は原理的に取りこぼす。
沈黙の検知である L1 だけが、壊れ方を問わずに網をかけられる。
L0 は速さのための補助という位置づけになる。
この整理は
lib/stale_task_detect.sh冒頭の失敗経路表にも書いた。検知しない側へ倒れる経路を三つ塞いだ
この種の仕組みは、放っておくと「何も通知しない」側へ倒れる。
実装の途中で三つ見つかり、いずれも塞いだ。
一つ目は L1 のスキップ条件になる。
当初の案では「assigned 以降に report が存在すればスキップ」としていた。
これは一度でも報告したタスクが以後は永久に免除されることを意味する。
実装では、最終活動が直近 30 分以内にあるかどうかで判断している。
二つ目はペインが存在しない場合になる。
当初は busy と同じ扱いで黙殺していた。
だが
assignedでありながらペインが無い状態は、起動していないエージェントではありえない。ペインが消えたということなので、通知すべき状態にあたる。
L_pane はこのために足した。
三つ目は対象エージェントの絞り込みになる。
registry で対象を絞ると、registry 自身が壊れたときに網ごと消える。
registry が無い、読めない、空のいずれかであれば、全エージェントを見る側へ倒している。
騒がしい側へ倒すのが正しい。
三つとも失敗経路の表に行として残した。
検証
今回のペインに実際に出ていた文字列をそのまま検知器へ流し、L0 が発火することを確認した。
署名を含まない文字列では発火しないことも合わせて確認している。
L_pane については、
assignedかつペイン不在で発火すること、idleかつペイン不在では発火しないこと、assignedかつ busy では発火しないことを試験に入れた。その他、L1 のスキップが recency で判断されていること、家老と足軽で通知先が分かれること、同一の組み合わせで二度通知しないこと、90 分で L2 が出ること、registry が空なら全 9 エージェントへ倒れることを確認している。
bats で 14 件、いずれも通過している。
レビューしてほしい点
閾値の 2 分、30 分、90 分が妥当か。
長い CI 待ちや大きなビルドの最中でも、ペインが busy であればスキップされる想定になっている。
L_pane の閾値が現在は L0 の定数を流用している。
どちらも 2 分でよいと考えているが、将来分ける余地は残る。
Assisted-by: multi-agent-shogun-aki-tweak