要約
agentd の result 強制徴収(AGENTD RESULT CONTRACT solicitation)が、Monitor / background task 待ちで turn を終えた agent を「report_result を忘れて終了した」と誤認し、「report_result のみを今すぐ呼べ・他の行動禁止」を強制する。agent は作業未完了のまま schema を満たす result を捏造せざるを得ず、下流(ACP hypha merge lane)で矛盾形 result(merged=false + failureKind="none" + validationPassed=true)として観測された。
実測(2026-07-25 15:42-15:46Z、inv_wi_8d28017a447c44c4_a1 / agentd session agent_inv_wi_8d28017a447c44c4_a1)
merge agent(claude runtime、sonnet-5)が proboscis-ema PR #610 の検証中:
- 新規 workspace の
uv sync bootstrap で ruff check が長時間化 → agent は Bash background + Monitor(until-loop)で完了待ちに切替え、turn を終了(Claude Code の Monitor は「turn を終えて完了時に re-invoke」が正常動作)。
- agentd が turn 終了を検知し solicitation を注入: "AGENTD RESULT CONTRACT: your turn ended without a report_result call. Call the report_result MCP tool now with a payload that satisfies the declared result schema. Do only that — no other actions"。
- agent は「他の行動禁止」下で merge 未実行のまま report を強制され、
{"merged": false, "failureKind": "none", "validationPassed": true, "summary": "Validated PR #610."} を返した(検証は通っていたので validation_failed は嘘、merge は未実行なので merged=true も嘘、中断の語彙が enum に無い)。
- 下流の ACP merge queue はこの矛盾形 result で先頭が >12h 無音 wedge した(ACP 側の routing 穴は ACP repo の ADR 0031 R8-R10 / commit 7148b4a7 で修理済み。ACP 側 schema にも if/then の矛盾形拒否を追加済み)。
transcript 上で result_solicitations_used=1, prompt_unblock_attempts=1。同型の premature 徴収は再現性がある(fresh workspace の bootstrap 遅延 + background 待ちの組合せで必ず窓が開く)。
根本原因
solicitation の発火条件が「turn が report_result 無しで終わった」だけで、agent 側に未完了の background 作業(Monitor / background Bash)が残っているかを見ていない。ADR-002/003 S5(launch 盲窓 → await_monitor_ack)と同族の、turn 終端側の盲窓。
修理候補(いずれか、または組合せ)
- 待ち検知: turn 終了時に session に pending な Monitor / background task がある場合は solicitation を保留し、re-invoke(background 完了通知)まで待つ(S5 の await_monitor_ack と対称の終端版)。
- 再開許可: solicitation の文面から「Do only that — no other actions」を緩め、「作業が未完了なら再開して完了後に report せよ」を許す。
- 中断の語彙: result schema 契約に「incomplete / interrupted」の自己申告を用意し、強制徴収時の honest な出口を作る(ACP 側は agent_error を推奨語彙として受ける準備済み)。
参照
- ACP 側の incident 登記: agent-control-plane
docs/adr/defadr_0031_hypha_structural_ownership_and_single_classifier.hy R8-R10 増補(2026-07-26)
- agentd adoption guard は正しく機能した(消費済み identity の再鋳造拒否)— 本 issue は solicitation 側のみ
要約
agentd の result 強制徴収(AGENTD RESULT CONTRACT solicitation)が、Monitor / background task 待ちで turn を終えた agent を「report_result を忘れて終了した」と誤認し、「report_result のみを今すぐ呼べ・他の行動禁止」を強制する。agent は作業未完了のまま schema を満たす result を捏造せざるを得ず、下流(ACP hypha merge lane)で矛盾形 result(
merged=false + failureKind="none" + validationPassed=true)として観測された。実測(2026-07-25 15:42-15:46Z、inv_wi_8d28017a447c44c4_a1 / agentd session agent_inv_wi_8d28017a447c44c4_a1)
merge agent(claude runtime、sonnet-5)が proboscis-ema PR #610 の検証中:
uv syncbootstrap で ruff check が長時間化 → agent は Bash background + Monitor(until-loop)で完了待ちに切替え、turn を終了(Claude Code の Monitor は「turn を終えて完了時に re-invoke」が正常動作)。{"merged": false, "failureKind": "none", "validationPassed": true, "summary": "Validated PR #610."}を返した(検証は通っていたので validation_failed は嘘、merge は未実行なので merged=true も嘘、中断の語彙が enum に無い)。transcript 上で
result_solicitations_used=1, prompt_unblock_attempts=1。同型の premature 徴収は再現性がある(fresh workspace の bootstrap 遅延 + background 待ちの組合せで必ず窓が開く)。根本原因
solicitation の発火条件が「turn が report_result 無しで終わった」だけで、agent 側に未完了の background 作業(Monitor / background Bash)が残っているかを見ていない。ADR-002/003 S5(launch 盲窓 → await_monitor_ack)と同族の、turn 終端側の盲窓。
修理候補(いずれか、または組合せ)
参照
docs/adr/defadr_0031_hypha_structural_ownership_and_single_classifier.hyR8-R10 増補(2026-07-26)