Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 側へ足した〈本ADR以前の挙動を注入するとその1本だけが落ちる〉。**残った宿題: GUI の画面目視だけ**〈Consequences の「チップに出る」は記述が古い — GUI ADR-0014 が常時チップを廃止済みで、現在はメタ1行〉)

## 貢献 / セキュリティ

Expand Down
58 changes: 49 additions & 9 deletions docs/decisions/ADR-0060-the-executor-can-be-named.md
Original file line number Diff line number Diff line change
@@ -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)(子は親の相手で走る —
Expand Down Expand Up @@ -178,14 +179,53 @@ 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 の帯が言う)。

経路は追えた: `viewFold` が `turn.started` の `provider` を `sub` ごとの枠へ保持し、
`TurnMeta` がそれをラベルに含める。**ただし実際の画面は見ていない。**

**実 Provider での疎通も未実施。** テストは fake アダプタで、指名された子が別の
アダプタで走ること・記帳が分離できることまでを固定している。実際の codex を指名して
端から端まで走らせる確認は、まだしていない。
GUI 側のテストは子の枠が `sub` を持つことしか固定していなかった(既存の例はどれも
同じ provider で、本ADR以前はそれが正しかった)ので、**枠ごとに相手が違う場合を
固定する検査を GUI へ足した**(tomobit-gui `viewFold.test.ts`)。本ADR以前の挙動
——全子が親の相手を名乗る——を注入すると、その1本だけが落ちて他は落ちない。
**残る未確認は画面の目視だけである。**

---

Expand Down
Loading