Skip to content

SessionHost launch 容量ガードの母数を launch 所有行に絞る(ADR-DOE-AGENTS-004 一括出荷) - #591

Merged
proboscis merged 2 commits into
mainfrom
wt/launch-capacity-counts-launch-owned-rows
Aug 16, 2026
Merged

SessionHost launch 容量ガードの母数を launch 所有行に絞る(ADR-DOE-AGENTS-004 一括出荷)#591
proboscis merged 2 commits into
mainfrom
wt/launch-capacity-counts-launch-owned-rows

Conversation

@proboscis

Copy link
Copy Markdown
Owner

SessionHost launch 容量ガードの母数を launch 所有行に絞る(ADR-DOE-AGENTS-004 一括出荷)

根因と根治

対話席用 SessionHost の台帳(agentd-herdr.sqlite)は active 全 32 行が adopted=1・lifecycle=interactive で、launch の入場検査(launch.hy の max_running 判定)が「active 状態の全行」を数えるため 32 ≥ 上限 10 で session.launch が恒久 100% 拒否になっていた(波 1-S1 席の read-only 実測 2026-08-17・会話 ac0301fa-228a-41ad-ae89-2122aec051f8)。

根因は母数の型違い: adopt(session.adopt)は観測の登記であって容量の消費ではない(ADR-DOE-AGENTS-007 R2 — SessionHost はその substrate を作っておらず、鏡原則で刈りもしない)。adopted/interactive 行には終端遷移の書き手が居らず(条文 interactive-rows-are-never-reaped が正しく禁止)active 数は単調増加するため、上限値をいくら上げても再発する。

根治 = 母数の述語を「launch 所有の行 = active ∧ 非 adopted」へ。述語は policy 所有の純関数 counts-toward-launch-capacity(policy.hyreap-exempt と同じ家)に単一実装し、launch.hy の入場検査がそれを使う。lifecycle では絞らない: launch 起点の行は interactive でも substrate を実際に消費するので数える(絞るのは所有であって寿命ではない)。

法・反例・テスト・実装の一括出荷:

  • 法: ADR-DOE-AGENTS-004 に law capacity-counts-only-launch-owned-rows を追加(実測 fact + 反例 5 本)
  • enforcement: 同 ADR に deftest test-adr-doe-agents-004-capacity-denominator-is-launch-owned(所有×寿命の 4 象限を pin)
  • enforcement 台帳(docs/adr/enforcement-ledger.json): adr_laws 81→82・adr_deftest_enforcements 35→36

core doeff/ API への影響

なし。変更は packages/doeff-agents(sessionhost)と docs/adr のみ。wire・effect 語彙・schema に変更なし。拒否文言の先頭逐語 max running agent sessions reached は ACP Scheduler の throttle 分類(infix 照合 — 席を解放して再試行)が消費する凍結面のため verbatim 保持(law の反例にも明文)。

Verification(発注書の負例との 1:1 対応)

発注書の Verification 項目 出荷したテスト
adopted 行が何行あっても launch 所有の空き容量が正しく判定される packages/doeff-agents/tests/sessionhost_launch_deftests.hy::test-launch-capacity-ignores-adopted-rows(adopted 12 行 > 上限 10 + owned 1 行で launch 成功 — 実測 32 ≥ 10 の再現形。red 確認済み: 旧実装で 13/10 拒否)
launch 所有の行が上限に達した時は従来どおり拒否される packages/doeff-agents/tests/sessionhost_launch_deftests.hy::test-launch-capacity-counts-launch-owned-rows(owned 2 行 / 上限 2 で拒否。ACP が消費する先頭逐語と、分子が launch 所有数(2/2、5/2 でない)であることも pin)
interactive 行は本便の後も刈られない docs/adr/defadr_doeff_agents_007_koine_session_surface.hy::test-adr-doe-agents-007-reap-exemption-covers-interactive-and-adopted(既存 — 本便後も green を確認済み。本便は reap 経路に一切触れない)+ test-launch-capacity-ignores-adopted-rows 内で容量判定が adopted 行の status を変えないことを assert
母数の述語の条文化(adopt = 観測 ≠ 容量消費) docs/adr/defadr_doeff_agents_004_effects_session_host.hy::test-adr-doe-agents-004-capacity-denominator-is-launch-owned(所有×寿命 4 象限。red 確認済み: 述語不在の ImportError)

Verification deviations

  • semgrep rule は追加しない: 旧形(active 全行の len を上限と比較)は構文でなく意味論の違反で、汎用 semgrep パターンは launch.hy の局所形への過適合になる。代わりに述語を policy 所有の単一実装に集約し、defadr law + enforcement deftest(所有×寿命 4 象限)で regression を守る。
  • 実測 32 行断面での e2e は含まない: 本便は直接束縛 deftest(fake substrate)で母数の意味論を pin する。実 DB(agentd-herdr.sqlite)での回復確認は着地後の運用検証(発注元 agora-platform-lead の帯)。

実行した検証コマンド

  • uv run pytest packages/doeff-agents/tests/test_sessionhost_launch.py — 32 passed(新規 2 本含む。red → green の順で実施)
  • uv run pytest docs/adr/defadr_doeff_agents_004_effects_session_host.hy -k capacity_denominator — 1 passed(red 確認済み)
  • uv run pytest docs/adr/defadr_doeff_agents_007_koine_session_surface.hy -k reap_exemption — 1 passed(不変)
  • uv run pytest tests/test_enforcement_ledger.py — 1 passed(台帳追随)
  • 近傍 regression: test_sessionhost_policy.py / test_sessionhost_resume.py / test_sessionhost_host.py / test_sessionhost_store.py — passed
  • semgrep(.semgrep.yaml)変更ファイル + docs — 0 findings

既知の main 由来 red(本便と無関係・報告済み)

tests/test_sessionhost_resume_cross_binding.py の 6 件が main(53d19c6)素の断面で red(paste-not-consumed — 準備完了門 #587/#589 と cross-binding deftests の合成界の不整合と推定)。本便の変更を stash した状態で再現することを確認済み。

突合(発注書の義務 2 点)

  1. 波 1-S1(adopt の会話別 3 分岐 — 下地再利用で新行が増える)と突合済み: S1 は adopted 行を増やす向きで、本便(adopted を母数から除外)と整合。着地順は S1 が先(integration-lead の暫定采配)— 本 PR は S1 着地後に rebase して着地する(enforcement-ledger.json の数値衝突は rebase 時に再計算)。
  2. 波 1-S2 設計席(s-789abbc5fe)と述語を相互確認済み: S2 の登録経路は session.adopt のみで launch 面を使わず、定期登録の行は容量に混ざらない。

Follow-up

  • S1 着地後の rebase(enforcement-ledger.json の数値再計算)
  • 着地後、実 DB(agentd-herdr.sqlite・32 行断面)で session.launch の回復を発注元が確認
  • main 由来 red(resume_cross_binding 6 件)の修理は別便(integration-lead へ報告済み)

🤖 Generated with Claude Code

proboscis and others added 2 commits August 17, 2026 04:00
…OE-AGENTS-004 law 追加

launch の入場検査が active 全行を数える現行実装に対する失敗テスト
(adopted 12 行 + owned 1 行・上限 10 で 13/10 拒否になる形 — 実測
32 ≥ 10 の再現)と、条文 capacity-counts-only-launch-owned-rows
(law + enforcement deftest)・enforcement 台帳の追随を先行 commit
する(TDD red — 実装は次 commit)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
adopt = 観測の登記であって容量の消費ではない(ADR-007 R2)。adopted 行は
終端遷移の書き手を持たず単調増加するため、active 全行の母数は launch の
恒久 100% 拒否になる(2026-08-17 実測 32 ≥ 10 — 上限値の調整では再発する)。
母数の述語 counts-toward-launch-capacity を policy 所有の純関数として
単一実装し(reap-exempt と同じ家)、launch admission がそれで絞る。
拒否文言の先頭逐語(ACP Scheduler の throttle 分類が infix 照合する
凍結面)は保持。ADR-DOE-AGENTS-004 capacity-counts-only-launch-owned-rows
の実装面。テストは前 commit の red 2 本 + ADR enforcement deftest が green。

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