From a00c7dd57aa8c4c66cb92ca0c4c57d5b01c4bc4f Mon Sep 17 00:00:00 2001 From: Rererr <44668651+Rererr@users.noreply.github.com> Date: Sat, 8 Aug 2026 14:10:49 +0900 Subject: [PATCH 1/2] =?UTF-8?q?docs:=20ADR-0060=20=E3=82=92=E5=AE=9F=20Pro?= =?UTF-8?q?vider=20=E3=81=A7=E7=96=8E=E9=80=9A=E3=81=97=E3=80=81=E5=AE=9F?= =?UTF-8?q?=E6=B8=AC=E3=82=92=E8=A8=98=E9=8C=B2=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fake アダプタで固定していたものを、実 claude-code / codex で1度通した。 Decision 3 の規範が効いて道具箱でなく宣言が返り、指名された子だけが named_provider を持ち provider.selected も codex になることを確認した。 GUI は経路を追うに留める。画面は見ていないので見たとは書かない。 併せて Consequences の「チップに出る」が古い記述であることを直す (GUI ADR-0014 が常時チップを廃止済み)。 Co-Authored-By: Claude Opus 5 Signed-off-by: Rererr <44668651+Rererr@users.noreply.github.com> --- README.md | 2 +- .../ADR-0060-the-executor-can-be-named.md | 54 +++++++++++++++---- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 5dbd98a..ab08319 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ tomobit # 相棒ビュー → そのまま対話へ。単発なら `tom - [ADR-0059](docs/decisions/ADR-0059-admission-is-counted-by-the-machine.md) — 弁は、食い合う側に置く(`parallelWidthCap` は `runGroupParallel` ごとに作られる**群ローカルの弁**で、GUI 4窓 × 3本=**1つの GUI で 12本**の Provider CLI が立ちうる。2つ目の GUI・端末は数にも入らない / 食い合う相手はアカウントの窓なのに、**上限だけがプロセスローカルに置かれている** / D1 財布を2つに分ける=**席**〈1作業系列に1つ・拒まない〉と**プール**〈並走ぶんだけ・取れなければ待つ〉=人が頼んだ1本は決して止めず、tomobit が自分で増やした分だけを絞る〈起草中の単一財布案は所有者の指摘で崩れた〉・キーはアカウント〈`claude_config_dir` が違えば別〉 / D2 待ちは失敗でも経験でもない=Provider の実行時間に混ぜない・台帳に載せない / D3 数は言う、判断はしない=残量観測〈ADR-0044/0049〉は入場制御に**繋がない** / D4 プールは 2・kill switch `provider_admission`〈nil = ON〉、「実測してから決める」は非決定的な量なので採らない / 却下: 残量連動の動的プール、並走の単位を窓にする、プロセス内セマフォ。**Rejected(2026-08-08 所有者裁定)— 穴は数えたが被害は観測されておらず、根拠は掛け算だけだった。手動では同等以上〈端末6つ・claude-codeからcodex・Ghosttyの複数窓〉が日常的に立っており、tomobit経由だけを絞るほうに理由が要る。ADR-0056 で「信じる」に倒したものを別の口から減らすことにもなる。唯一の擁護材料〈瞬間密度〉は `quota_observe` の受動観測で窓を焼かずに測れた=測れるものを測れないことにしていた。本文は起草時のまま残す — 逼迫が実測された日の出発点にする**) -- [ADR-0060](docs/decisions/ADR-0060-the-executor-can-be-named.md) — 采配は Provider のもの(所有者の「codex でも並列で実行して欲しい」に対し、claude-code が **Bash で codex CLI を起動して**満たした実測 — 台帳には `claude-code` の成果としてだけ残る / 責めるべき相手はいない=分割プロトコルに「誰にやらせるか」を書く場所が無く、**ADR-0054 は席の名前を決めてそこを空席のまま置いた** / D1 判断は運ばない、しかし指示は運ぶ〈tomobit が自然文を解釈して切り替えるのは ADR-0011 違反・Provider が宣言し tomobit が写すのは既存の作法〉 / D2 群の要素を文字列 または `{"do":…,"provider":…}` に拡張〈文字列は今日どおり親を継承=既定は不変・未知の Provider 名はその子だけ親継承に落として警告・`human` の指名は受理しない〉 / D3 プロトコル文に2行〈名指しされたら宣言で表せ/自分で別の CLI を起動するな〉 / D4 指名は記帳する=選択バイアスがあるので抽選の標本と後から分離できる形で残す / 却下: 道具箱からの剥奪〈`curl` も MCP も塞げない — 塞いだつもりになるほうが危ない〉、duel をユーザーから呼べるようにする〈判定の形が噛み合わない〉。ADR-0054 D1 改版。Accepted・**実装済み**〈記帳先は `task.started` の `named_provider`=アダプタが出す `provider.selected` を書き換えないため・宣言された名だけを残し親継承に落ちた子はキーを持たない・親が human のときも指名を受理しない〈ADRの穴を実装時に埋めた〉・プロトコル文の例は文字列のままで対の形は規範行の中で示す〉。**残った宿題: GUI と実 Provider での疎通は未確認**) +- [ADR-0060](docs/decisions/ADR-0060-the-executor-can-be-named.md) — 采配は Provider のもの(所有者の「codex でも並列で実行して欲しい」に対し、claude-code が **Bash で codex CLI を起動して**満たした実測 — 台帳には `claude-code` の成果としてだけ残る / 責めるべき相手はいない=分割プロトコルに「誰にやらせるか」を書く場所が無く、**ADR-0054 は席の名前を決めてそこを空席のまま置いた** / D1 判断は運ばない、しかし指示は運ぶ〈tomobit が自然文を解釈して切り替えるのは ADR-0011 違反・Provider が宣言し tomobit が写すのは既存の作法〉 / D2 群の要素を文字列 または `{"do":…,"provider":…}` に拡張〈文字列は今日どおり親を継承=既定は不変・未知の Provider 名はその子だけ親継承に落として警告・`human` の指名は受理しない〉 / D3 プロトコル文に2行〈名指しされたら宣言で表せ/自分で別の CLI を起動するな〉 / D4 指名は記帳する=選択バイアスがあるので抽選の標本と後から分離できる形で残す / 却下: 道具箱からの剥奪〈`curl` も MCP も塞げない — 塞いだつもりになるほうが危ない〉、duel をユーザーから呼べるようにする〈判定の形が噛み合わない〉。ADR-0054 D1 改版。Accepted・**実装済み**〈記帳先は `task.started` の `named_provider`=アダプタが出す `provider.selected` を書き換えないため・宣言された名だけを残し親継承に落ちた子はキーを持たない・親が human のときも指名を受理しない〈ADRの穴を実装時に埋めた〉・プロトコル文の例は文字列のままで対の形は規範行の中で示す〉。**実測(2026-08-08・計 $0.50): 実 claude-code が道具箱でなく対の形で宣言し、`[1:claude-code]`と`[2:codex]`が並走。指名された子だけが `named_provider` を持ち `provider.selected` も codex になった=台帳が真実を語るようになった。codex の子は `cost_usd` を持たない〈ADR-0028 の既知の非対称〉**。**残った宿題: GUI の画面目視と、子ごとに相手が違う場合を固定する GUI 側テスト**〈Consequences の「チップに出る」は記述が古い — GUI ADR-0014 が常時チップを廃止済みで、現在はメタ1行〉) ## 貢献 / セキュリティ diff --git a/docs/decisions/ADR-0060-the-executor-can-be-named.md b/docs/decisions/ADR-0060-the-executor-can-be-named.md index e08a855..4f6e760 100644 --- a/docs/decisions/ADR-0060-the-executor-can-be-named.md +++ b/docs/decisions/ADR-0060-the-executor-can-be-named.md @@ -1,8 +1,9 @@ # ADR-0060: 采配は Provider のもの — 実行者を宣言できるようにする - Status: **Accepted**(2026-07-30 起票・2026-08-08 所有者承諾・実装済み。 - Decision 1〜4 をそのまま実装。ADRが決めていなかった点と、実装時に確かめた・ - 確かめていないことは下記「実装の記録」) + 同日、実 claude-code / codex で**両経路の疎通を確認**〈下記「実測」〉。 + Decision 1〜4 をそのまま実装。ADRが決めていなかった点は「実装の記録」。 + **残る未確認は GUI の画面目視だけ**) - Date: 2026-07-30 - 改版: ADR-0054 D1 - 関連: [ADR-0054](ADR-0054-a-child-is-the-breakdown.md)(子は親の相手で走る — @@ -178,14 +179,49 @@ kill switch。どれも**その子だけ親継承+理由を表示**で、提 別 Provider の子が同じツリーを踏む経路が最初から無い。ADR-0026 が duel で指摘した 同型の問題は、隔離が sid で切られている限りここでは再発しない。 -**GUI は実機で見ていない。** Consequences は「`subtaskWiring` が子ごとになれば -チップにそのまま出る(実装時に確認する)」と書いた。コード上は子の相手の名前を -`newView` と `splitSink` へ渡すようにしたが、**実際の GUI では確認していない**。 -確かめていないものを確かめたとは書かない。 +--- + +## 実測(2026-08-08・claude-code 2.1.224 / codex-cli 0.147.0・計 $0.50) + +隔離した台帳(`--db`)と一時リポジトリで、`do` と `chat --view ndjson` の両経路を +1回ずつ流した。プロンプトは「2つの独立した作業を分割提案してほしい。**(2) は codex に +実行させてほしい**」。 + +**Decision 3 は効いた。** claude-code は道具箱へ手を伸ばさず、対の形で宣言した: + +```json +{"tomobit_split": [["hello.txt を作り hello と書く", {"do": "world.txt を作り world と書く", "provider": "codex"}]]} +``` + +**台帳が真実を語るようになった** — 本ADRの目的そのものである: + +| 子 | `named_provider` | `provider.selected` | +|---|---|---| +| hello.txt(継承) | キー無し | claude-code | +| world.txt(指名) | `codex` | **codex** | + +端末には `[1:claude-code]` と `[2:codex]` が並走で並び、両方のファイルが実際に作られた。 + +**view には子ごとの相手が乗る**(GUI へ届くデータ。`chat --view ndjson` の実出力): + +```json +{"name":"codex","sub":2,"sub_total":2,"type":"provider"} +{"n":1,"provider":"codex","sub":2,"sub_total":2,"type":"turn.started"} +``` + +**費用の非対称も予告どおり。** codex の子は `cost_usd` を持たない(ADR-0028 が記録した +既知の非対称)。概算が作り話の金額を出さない規律は、指名経由でもそのまま効く。 + +### GUI — 経路は追えたが、画面は見ていない + +Consequences の「チップにそのまま出る」は**記述が古い**。GUI [ADR-0014](https://github.com/Rererr/tomobit-gui/blob/main/docs/decisions/ADR-0014-speech-and-work-are-separated.md) が常時チップ +(`chat-turn-provider-chip`)を廃止しており、現在の provider 名は終わったターンの +**メタ1行**に出る(走行中は GUI ADR-0008 の帯が言う)。 -**実 Provider での疎通も未実施。** テストは fake アダプタで、指名された子が別の -アダプタで走ること・記帳が分離できることまでを固定している。実際の codex を指名して -端から端まで走らせる確認は、まだしていない。 +経路は追えた: `viewFold` が `turn.started` の `provider` を `sub` ごとの枠へ保持し、 +`TurnMeta` がそれをラベルに含める。**ただし実際の画面は見ていない。** +また GUI 側のテストは子の枠が `sub` を持つことは固定しているが、**子ごとに相手が違う +場合を固定していない**(既存の例はどれも同じ provider で、本ADR以前はそれが正しかった)。 --- From faa9dcf2c3bf9718b3432cfd175195dbb317f6c5 Mon Sep 17 00:00:00 2001 From: Rererr <44668651+Rererr@users.noreply.github.com> Date: Sat, 8 Aug 2026 14:17:23 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20=E6=9E=A0=E3=81=94=E3=81=A8?= =?UTF-8?q?=E3=81=AE=E7=9B=B8=E6=89=8B=E3=82=92=E5=9B=BA=E5=AE=9A=E3=81=99?= =?UTF-8?q?=E3=82=8B=E6=A4=9C=E6=9F=BB=E3=82=92=20GUI=20=E3=81=B8=E8=B6=B3?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=81=93=E3=81=A8=E3=82=92=E8=A8=98=E9=8C=B2?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 残る未確認を画面の目視だけに絞る。GUI 側は子の枠が sub を持つことしか 見ておらず、本ADR以前は全子が同じ相手だったのでそれで足りていた。 Co-Authored-By: Claude Opus 5 Signed-off-by: Rererr <44668651+Rererr@users.noreply.github.com> --- README.md | 2 +- docs/decisions/ADR-0060-the-executor-can-be-named.md | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ab08319..a48e90c 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ tomobit # 相棒ビュー → そのまま対話へ。単発なら `tom - [ADR-0059](docs/decisions/ADR-0059-admission-is-counted-by-the-machine.md) — 弁は、食い合う側に置く(`parallelWidthCap` は `runGroupParallel` ごとに作られる**群ローカルの弁**で、GUI 4窓 × 3本=**1つの GUI で 12本**の Provider CLI が立ちうる。2つ目の GUI・端末は数にも入らない / 食い合う相手はアカウントの窓なのに、**上限だけがプロセスローカルに置かれている** / D1 財布を2つに分ける=**席**〈1作業系列に1つ・拒まない〉と**プール**〈並走ぶんだけ・取れなければ待つ〉=人が頼んだ1本は決して止めず、tomobit が自分で増やした分だけを絞る〈起草中の単一財布案は所有者の指摘で崩れた〉・キーはアカウント〈`claude_config_dir` が違えば別〉 / D2 待ちは失敗でも経験でもない=Provider の実行時間に混ぜない・台帳に載せない / D3 数は言う、判断はしない=残量観測〈ADR-0044/0049〉は入場制御に**繋がない** / D4 プールは 2・kill switch `provider_admission`〈nil = ON〉、「実測してから決める」は非決定的な量なので採らない / 却下: 残量連動の動的プール、並走の単位を窓にする、プロセス内セマフォ。**Rejected(2026-08-08 所有者裁定)— 穴は数えたが被害は観測されておらず、根拠は掛け算だけだった。手動では同等以上〈端末6つ・claude-codeからcodex・Ghosttyの複数窓〉が日常的に立っており、tomobit経由だけを絞るほうに理由が要る。ADR-0056 で「信じる」に倒したものを別の口から減らすことにもなる。唯一の擁護材料〈瞬間密度〉は `quota_observe` の受動観測で窓を焼かずに測れた=測れるものを測れないことにしていた。本文は起草時のまま残す — 逼迫が実測された日の出発点にする**) -- [ADR-0060](docs/decisions/ADR-0060-the-executor-can-be-named.md) — 采配は Provider のもの(所有者の「codex でも並列で実行して欲しい」に対し、claude-code が **Bash で codex CLI を起動して**満たした実測 — 台帳には `claude-code` の成果としてだけ残る / 責めるべき相手はいない=分割プロトコルに「誰にやらせるか」を書く場所が無く、**ADR-0054 は席の名前を決めてそこを空席のまま置いた** / D1 判断は運ばない、しかし指示は運ぶ〈tomobit が自然文を解釈して切り替えるのは ADR-0011 違反・Provider が宣言し tomobit が写すのは既存の作法〉 / D2 群の要素を文字列 または `{"do":…,"provider":…}` に拡張〈文字列は今日どおり親を継承=既定は不変・未知の Provider 名はその子だけ親継承に落として警告・`human` の指名は受理しない〉 / D3 プロトコル文に2行〈名指しされたら宣言で表せ/自分で別の CLI を起動するな〉 / D4 指名は記帳する=選択バイアスがあるので抽選の標本と後から分離できる形で残す / 却下: 道具箱からの剥奪〈`curl` も MCP も塞げない — 塞いだつもりになるほうが危ない〉、duel をユーザーから呼べるようにする〈判定の形が噛み合わない〉。ADR-0054 D1 改版。Accepted・**実装済み**〈記帳先は `task.started` の `named_provider`=アダプタが出す `provider.selected` を書き換えないため・宣言された名だけを残し親継承に落ちた子はキーを持たない・親が human のときも指名を受理しない〈ADRの穴を実装時に埋めた〉・プロトコル文の例は文字列のままで対の形は規範行の中で示す〉。**実測(2026-08-08・計 $0.50): 実 claude-code が道具箱でなく対の形で宣言し、`[1:claude-code]`と`[2:codex]`が並走。指名された子だけが `named_provider` を持ち `provider.selected` も codex になった=台帳が真実を語るようになった。codex の子は `cost_usd` を持たない〈ADR-0028 の既知の非対称〉**。**残った宿題: GUI の画面目視と、子ごとに相手が違う場合を固定する GUI 側テスト**〈Consequences の「チップに出る」は記述が古い — GUI ADR-0014 が常時チップを廃止済みで、現在はメタ1行〉) +- [ADR-0060](docs/decisions/ADR-0060-the-executor-can-be-named.md) — 采配は Provider のもの(所有者の「codex でも並列で実行して欲しい」に対し、claude-code が **Bash で codex CLI を起動して**満たした実測 — 台帳には `claude-code` の成果としてだけ残る / 責めるべき相手はいない=分割プロトコルに「誰にやらせるか」を書く場所が無く、**ADR-0054 は席の名前を決めてそこを空席のまま置いた** / D1 判断は運ばない、しかし指示は運ぶ〈tomobit が自然文を解釈して切り替えるのは ADR-0011 違反・Provider が宣言し tomobit が写すのは既存の作法〉 / D2 群の要素を文字列 または `{"do":…,"provider":…}` に拡張〈文字列は今日どおり親を継承=既定は不変・未知の Provider 名はその子だけ親継承に落として警告・`human` の指名は受理しない〉 / D3 プロトコル文に2行〈名指しされたら宣言で表せ/自分で別の CLI を起動するな〉 / D4 指名は記帳する=選択バイアスがあるので抽選の標本と後から分離できる形で残す / 却下: 道具箱からの剥奪〈`curl` も MCP も塞げない — 塞いだつもりになるほうが危ない〉、duel をユーザーから呼べるようにする〈判定の形が噛み合わない〉。ADR-0054 D1 改版。Accepted・**実装済み**〈記帳先は `task.started` の `named_provider`=アダプタが出す `provider.selected` を書き換えないため・宣言された名だけを残し親継承に落ちた子はキーを持たない・親が human のときも指名を受理しない〈ADRの穴を実装時に埋めた〉・プロトコル文の例は文字列のままで対の形は規範行の中で示す〉。**実測(2026-08-08・計 $0.50): 実 claude-code が道具箱でなく対の形で宣言し、`[1:claude-code]`と`[2:codex]`が並走。指名された子だけが `named_provider` を持ち `provider.selected` も codex になった=台帳が真実を語るようになった。codex の子は `cost_usd` を持たない〈ADR-0028 の既知の非対称〉**。枠ごとに相手が違う場合を固定する検査は GUI 側へ足した〈本ADR以前の挙動を注入するとその1本だけが落ちる〉。**残った宿題: GUI の画面目視だけ**〈Consequences の「チップに出る」は記述が古い — GUI ADR-0014 が常時チップを廃止済みで、現在はメタ1行〉) ## 貢献 / セキュリティ diff --git a/docs/decisions/ADR-0060-the-executor-can-be-named.md b/docs/decisions/ADR-0060-the-executor-can-be-named.md index 4f6e760..f6d8d58 100644 --- a/docs/decisions/ADR-0060-the-executor-can-be-named.md +++ b/docs/decisions/ADR-0060-the-executor-can-be-named.md @@ -220,8 +220,12 @@ Consequences の「チップにそのまま出る」は**記述が古い**。GUI 経路は追えた: `viewFold` が `turn.started` の `provider` を `sub` ごとの枠へ保持し、 `TurnMeta` がそれをラベルに含める。**ただし実際の画面は見ていない。** -また GUI 側のテストは子の枠が `sub` を持つことは固定しているが、**子ごとに相手が違う -場合を固定していない**(既存の例はどれも同じ provider で、本ADR以前はそれが正しかった)。 + +GUI 側のテストは子の枠が `sub` を持つことしか固定していなかった(既存の例はどれも +同じ provider で、本ADR以前はそれが正しかった)ので、**枠ごとに相手が違う場合を +固定する検査を GUI へ足した**(tomobit-gui `viewFold.test.ts`)。本ADR以前の挙動 +——全子が親の相手を名乗る——を注入すると、その1本だけが落ちて他は落ちない。 +**残る未確認は画面の目視だけである。** ---