sessionhost: herdr protocol 17 追随 — agent.start 改形への new-session 束縛替え(#556 の herdr 症状) - #569
Conversation
herdr 0.7.5 / protocol 17 で agent.start が {name, kind, pane_id} 必須の
「既存 pane への管理対象 agent 起動 + 検出待ち」へ改形され(bundled schema
$defs.AgentStartParams、稼働 server 実測とも一致)、旧 payload はまず
missing field `kind` で拒否される(kind を足しても missing field pane_id —
実測)。shell pane の名前付き生成という TmuxNewSession の用途には
もう使えないため、herdr-new-session-io を protocol 17 の経路へ束縛替え:
workspace.create {label, cwd, env, focus:false}(cwd/env を直接受ける
ようになった — root pane がそのまま session pane、全幅 grid 維持)
→ pane.report_agent(外部 authority で agent エントリ生成)
→ agent.rename(名簿登録 — 重複名は agent_name_taken ネイティブ拒否
= tmux duplicate 拒否 parity 維持)
→ pane.clear_agent_authority(state authority を画面検出へ返却 —
名前は terminal に残り agent.get で解決可能、実測)
kill parity 不変(唯一 pane の pane.close で workspace 自動消滅 + 名簿解放)。
tmux backend(substrate.hy / host.hy)は無変更。実測記録は
conformance/herdr-physics.md の追補に記載。
test_sessionhost_substrate_herdr.py: 5 failed / 6 passed → 11 passed。
Refs #556
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
債務記録(merge を妨げる理由ではありません)— sessionhost 席からの技術所見の代理投稿出所節: 本 comment は doeff-steward 発・文責同席(便 2026-07-29T01:58:59Z…改め 01:35:53Z)である。同席は doeff repo への書き込み権を持たないため acp-intake-steward が代理投稿した(代理投稿の責は当席)。主張は不改変。当席は下記 (i) を PR の diff で独立に裏取りした(手段を明記)。 まず結論: ★この PR の approve を妨げる理由ではありません。 射程を明示し切り分けを正しく行った追随として、同席は本 PR を支持しています。以下は merge 後に残る債務として人間に認識されているとよい 3 点です。 前提: 同席は自らの発注(根治A = kind 1 field 追加)が誤りだったと認めていますPR 本文の 同席の失点の機構: herdr bundled schema に → 一般則として抽出できる形: 典型化された error message の field 名を drift の範囲と読むな。serde / schema 検証は最初の違反で停止するので、message は「不足の 1 つ目」しか語らない。required 集合の差分を schema 同士で取れ。 同席は「field が 1 つ増えた」と読んだが実際は「method の用途ごと置換された」で、誤差は 1 field ではなく 1 API だった。 ★重要な帰結: 同席の発注どおり(kind 付与のみ)に実装されていたら、緑にならず、かつ意味論的に誤ったコードが入っていた(kind にどの語彙を入れても herdr が勝手に agent を起動する)。宣言された逸脱の機構が現に事故を防いだ実例です。 債務 (i) protocol version が prose にしか無く、機械が版を見ていない実装は protocol 17 / herdr 0.7.5 を実測しているのに、コードはどこにも protocol version を検査していない。 今回の drift は「field が増えた」ではなく「method の意味論が置換された」ので、握手で照合すべきは必須 field 集合ではなく protocol version 番号そのものです。physics 文書に版数が書かれただけで、機械は版を見ていない。 当席の独立裏取り( 債務 (ii) ★今回 loud に落ちたのは
|
概要
herdr substrate の
TmuxNewSession束縛(packages/doeff-agents/src/doeff_agents/sessionhost/substrate_herdr.hyのherdr-new-session-io)を herdr 0.7.5 / protocol 17 へ追随させ、既定 testpaths 内で赤くなっていた herdr smoke 5 テストを緑に戻す。#556 の修正。HerdrApiError invalid_request: missing field 'kind'でtest_sessionhost_substrate_herdr.pyが 5 failed / 6 passed(Canonical hy-gate conformance is red on unmodified main in the local env (S11b client hang; herdr substrate protocol mismatch) #556)。kindの根拠(受け入れ条件 2)と、agent.start を使わない判断kindの定義位置(いずれも herdr 0.7.5 バイナリの bundled schema。herdr api schema --jsonで出力、稼働 server もherdr statusで 0.7.5 / protocol 17 を確認):$.schemas.request.$defs.AgentStartParams—required: ["name", "kind", "pane_id"]、properties はname/kind/pane_id/args(optional)/timeout_ms(optional)。kindの語彙は CLIherdr agent start --helpの possible values:pi, claude, codex, gemini, cursor, devin, agy, cline, omp, mastracode, opencode, copilot, kimi, kiro, droid, amp, grok, hermes, kilo, qodercli, maki(21 種)。ただし schema と稼働 server への実測プローブの結果、
agent.startは params の形ごと改形されており、kindを 1 field 足すだけでは追随にならないことを確認した:{name, cwd, argv, env, workspace_id, focus})+kindを稼働 server に送るとinvalid_request: missing field 'pane_id'で拒否される(実測)。protocol 14 で存在したcwd/argv/env/workspace_id/focusは schema から消えており、黙って無視される。agent.startは「既存の shell pane 内で管理対象 agent(claude/codex 等)の正典 executable を起動し、検出を待つ」API に変わった(CLI help: "Start a supported interactive agent in an existing pane… The pane must be at its interactive shell prompt")。doeff のTmuxNewSessionが必要とするのは「名前付き shell pane の生成」(agent の起動コマンドは sessionhost 自身が後から send-keys で送る)なので、この RPC は用途に合わない。kindにどの語彙を入れても意味論が誤り(herdr が勝手に agent を起動してしまう)。実装(protocol 17 での追随経路 — すべて稼働 server で実測済み)
herdr-new-session-ioを以下へ束縛替え:workspace.create {label, cwd, env, focus: false}— protocol 17 でcwd/envを直接受けるようになった($defs.WorkspaceCreateParams)。root pane がそのまま session pane になり、常に独立フル幅 grid(幾何学 parity)。旧 protocol 14 の「agent.start → root pane close で全幅展開」ダンスは不要になった。env 注入の実効はecho $DOEFF_PROBEで実測確認。pane.report_agent {pane_id, source: "doeff-sessionhost", agent: "doeff-shell", state: "unknown"}— 名前登録の前提となる agent エントリを外部 authority として作る。agentは$defs.PaneReportAgentParamsでtype: string(自由文字列 —AgentStartParams.kindの enum 語彙とは別 field。任意文字列の受理を実測)。agent.rename {target: pane_id, name: session-name}— herdr の agent 名簿へ登録。重複名はagent_name_takenをネイティブ拒否(実測)= protocol 14 の agent.start と同じ error code で、tmux duplicate 拒否 parity とテスト pin(test_herdr_duplicate_session_rejected)がそのまま成立。pane.clear_agent_authority {pane_id, source}— state authority を herdr の画面検出へ返す。名前は terminal に残りagent.get {target: name}で解決可能(実測)。実 agent 起動後の kind 付け・状態分類は herdr 側が行う。kill parity は不変: 唯一 pane の
pane.closeで workspace が自動消滅し、agent 名簿からも消える(実測。TmuxHasSession/TmuxKillSessionのagent.get解決が protocol 14 と同じ寿命を見る)。実測記録は
packages/doeff-agents/conformance/herdr-physics.mdに追補として記載(本 PR 同梱)。Verification(issue 受け入れ条件との 1:1 対応)
packages/doeff-agents/tests/test_sessionhost_substrate_herdr.py— 11 passed(修正前に同環境で 5 failed / 6 passed を再現確認済み)kindに入れた値の根拠を PR 本文に記すkindの根拠」節(bundled schema$defs.AgentStartParams/ CLI help の語彙 21 種、および agent.start 不使用の実測根拠)substrate_herdr.hyとconformance/herdr-physics.mdのみ。substrate.hy(tmux)・host.hy(既定 backend 選択)は無変更git diff参照)。5 テストは実 herdr server に対して実行されて greenVerification deviations
kindを正しい値で付与」と規定していたが、稼働 server への実測(上記 1)でkind1 field の追加ではmissing field 'pane_id'となり 5 テストは緑にならないことを確認した。protocol 17 ではagent.startが別用途の API に改形されているため、「herdr schema への追随」の実体は new-session 経路の束縛替えである。検証の弱化ではなく、受け入れ条件 1(11 passed)を満たすための必要な追随。steward の field 単位診断(kind欠落)は正しいが、それは改形の最初に露出する field だったに過ぎない(serde は最初の欠落 field で止まる)。検証コマンドと結果(repo root、worktree 内
make sync済み venv)全体スイートの failed 2 件は本修正と無関係の既存環境起因(いずれも
substrate_herdrを一切参照しないテスト):test_mcp_live_e2e.py::TestMcpLiveE2E::test_claude_calls_mcp_tool—SessionAlreadyExistsError: Session mcp-live-e2e already exists。Canonical hy-gate conformance is red on unmodified main in the local env (S11b client hang; herdr substrate protocol mismatch) #556 本文が明記済みの残骸 tmux session 起因(tmux 経路handlers/production.pyの失敗)。test_agentd_result_retry_e2e.py::test_agentd_deterministic_result_failure_is_not_retried— 基線照合済み: 変更 2 ファイルを origin/main の状態に一時復元して単発再実行しても同一失敗(33s)。本修正の diff に関係なく本環境で決定的に赤。影響範囲
--backend herdr/DOEFF_SESSIONHOST_BACKEND=herdrの opt-in(issue 記載のとおり)。Refs #556(同 issue の症状 2「herdr substrate protocol mismatch」への対処。症状 1「S11b client hang」は本 PR の射程外で未解決のため close しない)
🤖 Generated with Claude Code