Skip to content

herdr substrate: session 同一性を workspace label アンカーへ移行(#556 の herdr 5 本赤の解消・完成済み実装の救出 land) - #587

Open
proboscis wants to merge 4 commits into
mainfrom
feat/impl-substrate-herdr-session-identity-anchor-r2-607f0c
Open

herdr substrate: session 同一性を workspace label アンカーへ移行(#556 の herdr 5 本赤の解消・完成済み実装の救出 land)#587
proboscis wants to merge 4 commits into
mainfrom
feat/impl-substrate-herdr-session-identity-anchor-r2-607f0c

Conversation

@proboscis

Copy link
Copy Markdown
Owner

何を直すか

herdr substrate の session 同一性の根拠を、実 agent 起動後に herdr 側の実 agent 検出が上書きしてしまう agent 名札から、上書きされない workspace label アンカーへ移行する。これにより未改変 main で赤の herdr substrate 正典テスト 5 本(#556 の症状 2)が green になる。

Refs #556(正典 hy-gate conformance が未改変 main で赤 — 本 PR は herdr substrate protocol 不一致側の 5 本を解消する)

選定根拠(なぜ workspace label をアンカーにするか)

  • protocol 17(herdr 0.7.5)で agent.start が改形され、名前付き shell pane 生成には使えなくなった。代替の名前登録は pane.report_agentagent.rename 経由だが、実 agent(claude 等)が pane 内で起動すると約 2 秒以内に herdr の実 agent 検出が名札を上書きし、agent.get {target: 旧名}agent_not_found になる(2026-08-01 probe n=3 決定的 — conformance/herdr-physics.md 追補に実測記録を同梱)。
  • つまり名札(agent name)は消される対象であり、session 同一性のアンカーには使えない。workspace label は herdr 側の検出に上書きされず、workspace 消滅(唯一 pane の close)と同時に消える = session lifecycle と一致する。
  • 名札依存への回帰は semgrep guard(tests/semgrep_rules/herdr_agent_name_identity_forbidden.hy)で機械的に禁止し、名札消失後も同一性が保たれることを deftest(test-herdr-identity-survives-agent-name-loss)で pin する。

受入条件との突合(発注 4 項)

  1. 正典ファイル全緑(skip/xfail 退避禁止): packages/doeff-agents/tests/test_sessionhost_substrate_herdr.py = 13 passed(main 0698c74 は 5 failed / 6 passed)。独立検証 3 回(2026-08-10 ×2・2026-08-11 正規形 ×1)。
  2. 名札に依存しない同一性の回帰テスト追加: test-herdr-identity-survives-agent-name-loss + semgrep guard 同梱。
  3. tmux backend の挙動を変えない: 差分 9 files に tmux 面のファイルなし(substrate_herdr / deftests / conformance md / semgrep / adopt 3 行のみ)。
  4. PR 本文に選定根拠と Canonical hy-gate conformance is red on unmodified main in the local env (S11b client hang; herdr substrate protocol mismatch) #556 参照: 本欄。

退行確認

packages/doeff-agents/tests 全量 = 4 failed / 1768 passed / 21 skipped — 赤 4 本は main でも同一の環境依存 e2e(実 agentd / 実 MCP を要求)につき退行なし。

出自(provenance)

本枝は ACP 実装席(4 世代目)が 2026-08-09 に完成させたもの。席は保存の 4 分後に稼働中の誤打ち切りで強制終了され「実装消滅」扱いになっていたが、成果は共有 checkout の ref 空間に残存していた。下調べ席の検証と operator 裁定(2026-08-11)を経て、本 PR はその完成品を無改変で救出 land するもの(コミットは実装席の著作のまま・tip 3c22539)。

proboscis and others added 4 commits July 29, 2026 06:28
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>
…d-g-607f0c) as starting point

refile 先 issue substrate-herdr-session-identity-anchor-r2-607f0c の発注どおり、
PR #569 の workspace.create + pane.report_agent + agent.rename 経路の実装を
出発点として取り込む(捨てない)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…TDD red)

issue substrate-herdr-session-identity-anchor-r2-607f0c(#556 の系譜、PR #569 の refile 先)。

実測前提(probe 2026-08-01 n=3 / 2026-08-09):
- pane 内で実 agent を起動すると ~2 秒で herdr の実 agent 検出が agent 名札を
  上書きし、agent.get {target: session 名} が agent_not_found になる
- workspace label は実 agent 起動後も残存し、workspace.list で解決可能
- herdr は同一 label の workspace 重複をネイティブ拒否しない
- workspace_id は base62 風カウンタで創出順に単調増加(shortlex 比較で順序復元)
- agent 名には invalid_agent_name 制約(小文字開始・[a-z0-9_-]・32 文字以内)が
  あるが workspace label は無制約(60 文字・大文字・記号を実測受理)

TDD red(現行実装での失敗を確認済み):
- test-herdr-identity-survives-agent-name-loss: 名札消失模擬後の
  has-session/session-pane-ids/capture/send/kill 全経路 —
  「has-session must survive agent name-plate loss」で fail
- test-herdr-duplicate-session-rejected(改訂): doeff 側 duplicate 判定 +
  名札消失後の重複素通り検出 + 敗者 workspace 掃除 — agent_name_taken 依存の
  現行実装で fail
- test-herdr-workspace-order-key-shortlex: tie-break 順序鍵 — ImportError で fail

semgrep: doeff-agents-herdr-session-identity-not-agent-name("agent.get" 解決の
恒久禁止、sessionhost + conformance)。既存コード 3 箇所で発火を確認。
enforcement-ledger semgrep_rules 247→248。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
issue substrate-herdr-session-identity-anchor-r2-607f0c(#556 の系譜)。
PR #569 の workspace.create {label cwd env} 経路を出発点に、agent 名簿への
名前登録(pane.report_agent → agent.rename → pane.clear_agent_authority)を
撤去し、生死確認・帰属観測・kill の名前解決を workspace label に束縛替え:

- herdr-workspace-order-key: workspace_id の創出順比較鍵(shortlex —
  base62 風カウンタの単調増加を実測 2026-08-09)
- herdr-label-workspace-ids-io / herdr-workspace-id-io: label → workspace
  解決(TmuxHasSession / TmuxSessionPaneIds / TmuxKillSession が共有)
- herdr-new-session-io: create-then-verify の重複 gate(herdr は label 重複を
  ネイティブ拒否しない — 実測 2026-08-09。TOCTOU 窓を閉じる根拠はコード近傍)
- herdr-kill-session-io: workspace.close(全 pane 破棄 = tmux kill-session
  parity、S19c 型 sibling も取り残さない)
- conformance/harness.py: 帯域外経路(kill / liveness / S19c fault
  injection / adopt fixture)を同アンカーへ移行。create_session_out_of_band
  の protocol 14 形 agent.start 残骸も workspace.create 直行に修正
- herdr-physics.md:「clear_agent_authority 後も名前が残る」の破れ訂正
  (実 agent 起動で ~2 秒後に検出が名札上書き — 実測 2026-08-01 n=3)+
  アンカー移行の追補

テスト: test_sessionhost_substrate_herdr.py 13 passed(TDD red 3 本を含む)。
semgrep doeff-agents-herdr-session-identity-not-agent-name 0 findings。
tmux backend(substrate.hy / tmux.py)は無変更。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant