目的
起動したセッションの行が「未起動」と言う窓を消す。
前提
実機で観測した(2026-08-25、Master が ▶️ を押し AI が画面を確認)。
Claude Lay を起動すると、CLI は --dangerously-load-development-channels の確認プロンプト(Enter to confirm)で止まる。この間、画面はこうなっている——
| 行 |
語 |
ライフサイクル |
実際 |
| Claude Lay |
未起動 |
❌ |
走っている(プロンプト待ち) |
| Claude Lin |
未起動 |
▶️ |
本当に未起動 |
語が情報を運んでいない。 走っているセッションと、起動していないアカウントが、同じ語を出している。区別できるのはボタンだけである。
同じ画面の右にある状態パネルは、同じ瞬間に正しく言っている——
セッション Claude Lay 起動中
開始時刻 18:39
なぜそうなるか
一つの画面に「走っている」の定義が二つある。
| どこ |
判定基準 |
実装 |
| 状態パネル |
プロセスが終了していない |
view.ended === null(renderSessionFacts) |
| 名簿の行 |
部屋の名簿に居る |
row.participant(memberRow) |
memberRow の note の優先順位は上から own → launching → row.participant → failure → view.ended → row.account。この窓では launching は false(ptyId は既に付いている)、row.participant は null(CLI がまだ部屋の websocket に繋いでいない)。したがって最後の row.account まで落ちて「未起動」になる。
パネルは既に「起動中 ↔ 終了」の対でこの語を使っており、この語彙では 起動中 = 走っている であって「起動しかけ」ではない。行がパネルと違う定義を持っていることが欠陥である。
いつからあるか
#82 が入る前からある。あの PR は空だった row.participant の枝を埋めただけで、この経路は触っていない。ただし #82 で行が様子を語り始めた分、矛盾は見えやすくなっている。
窓の長さは CLI の起動時間そのもの。開発用の旗を積んだこの環境では確認プロンプトで止まるため数分続く。旗の無い起動なら数秒で抜ける。窓の長さは環境依存だが、語が二つの状態を同一視すること自体は長さに依らない。
決定
- 語は新設しない。行がパネルの定義に合わせる。 プロセスが終了していない間、行は「起動中」と言う。パネルが既にこの語をこの意味で使っているため、二つ目の語彙を持ち込む理由がない。
❌ は出したままにする。 プロセスは実在し、終了できるべきである。
launching の定義は変えない。 あれは ▶️ の無効化判断にも使われている。note 側に一段足す。
note の優先順位(変更後)
own → launching → row.participant → failure → view が終了していない → view.ended → row.account
↑ ここを足す
row.participant の枝を前に置いたままにするのが要点。在室中の行が何も言わない形(#82)はこれで壊れない。部屋に居ない間だけこの新しい枝に落ちるため、起動直後の窓と、一度入った CLI が接続を失った場合の両方を正しく読める。
制約
対象ファイル
src/main.ts — memberRow の note の優先順位
docs/0-requirements.md
関連
目的
起動したセッションの行が「未起動」と言う窓を消す。
前提
実機で観測した(2026-08-25、Master が
▶️を押し AI が画面を確認)。Claude Lay を起動すると、CLI は
--dangerously-load-development-channelsの確認プロンプト(Enter to confirm)で止まる。この間、画面はこうなっている——語が情報を運んでいない。 走っているセッションと、起動していないアカウントが、同じ語を出している。区別できるのはボタンだけである。
同じ画面の右にある状態パネルは、同じ瞬間に正しく言っている——
なぜそうなるか
一つの画面に「走っている」の定義が二つある。
view.ended === null(renderSessionFacts)row.participant(memberRow)memberRowの note の優先順位は上からown → launching → row.participant → failure → view.ended → row.account。この窓ではlaunchingは false(ptyIdは既に付いている)、row.participantは null(CLI がまだ部屋の websocket に繋いでいない)。したがって最後のrow.accountまで落ちて「未起動」になる。パネルは既に「起動中 ↔ 終了」の対でこの語を使っており、この語彙では 起動中 = 走っている であって「起動しかけ」ではない。行がパネルと違う定義を持っていることが欠陥である。
いつからあるか
#82 が入る前からある。あの PR は空だった
row.participantの枝を埋めただけで、この経路は触っていない。ただし #82 で行が様子を語り始めた分、矛盾は見えやすくなっている。窓の長さは CLI の起動時間そのもの。開発用の旗を積んだこの環境では確認プロンプトで止まるため数分続く。旗の無い起動なら数秒で抜ける。窓の長さは環境依存だが、語が二つの状態を同一視すること自体は長さに依らない。
決定
❌は出したままにする。 プロセスは実在し、終了できるべきである。launchingの定義は変えない。 あれは▶️の無効化判断にも使われている。note 側に一段足す。note の優先順位(変更後)
row.participantの枝を前に置いたままにするのが要点。在室中の行が何も言わない形(#82)はこれで壊れない。部屋に居ない間だけこの新しい枝に落ちるため、起動直後の窓と、一度入った CLI が接続を失った場合の両方を正しく読める。制約
❌を消さない。終了できるものから終了する手を取り上げない(fix(session): a running session becomes unmanageable after the webview reloads #84 が直したのと同じ穴になる)。対象ファイル
src/main.ts—memberRowの note の優先順位docs/0-requirements.md関連