# 実装状況 ## Codex の席の預かりを外す(#403、2026-10-12) Codex の席が利用上限で止まっている間も、部屋の発言を預からずその席の端末へ打つようにした(#401 で Claude の席から外したのと揃えた)。制限中に打った入力は、Codex が会話に user の発言として残してターンを利用上限で終える——捨てない(2026-10-12、ローカルの rollout で確認)。解除の確認(`account/rateLimits/read`)と止まったときの部屋への知らせは今までどおりである。解除を確かめたら、席を占めている起動が再開の指示(#389)を一度だけ打ち、まとめは付けない。打った後にターンが始まるか終われば応答とし、利用上限で終われば新しい停止として次の解除でもう一度打つ。どちらも 120 秒無ければ部屋へ一度だけ「端末を見てください」と知らせて打ち直さず、その席が後でターンを正常に終えたら戻ったことを一度だけ知らせる。受け箱は「止まっている印」だけになった(id を持たない)。預かり(`CodexLimits::hold`)、受け箱からのまとめ(`digest`・`mailbox`)、預かった発言での問い合わせの繰り上げ(#377 の `HELD_GAP`)、`limit_recovery`、許可待ちの列から利用上限の預かりへ移す経路(`to-limit`)は無くなった(「[Codex の席が利用上限で止まったとき](3-accounts.md#codex-の席が利用上限で止まったとき294)」)。 **確かめた範囲:** `crates/mcp-config/src/codex/limit.rs` のテストが、止まり・問い合わせの予定・解除の確認、再開の指示への応答(ターン・利用上限・120 秒の無応答)、知らせが預かりを言わないこと、印のファイルの読み書き(#403 前の id 付きのファイルを同じ印として読むこと)を確かめる。`status.rs` のテストがターンの始まりを一度だけ渡すこと、`prompt_hold.rs` のテストが再開の指示を許可待ちの後に打ち、別の起動へ持ち越さないことを確かめる。`src-tauri` のコンパイルは通っている。 **未確認(実機では確かめていない):** 止まっている Codex の席に部屋の発言が打たれ、そのターンが利用上限で終わっても部屋への停止の知らせが重ならないこと。解除後に再開の指示が一度だけ打たれ、席が作業を再開すること。止まったまま起動し直した席に、解除後に指示が打たれること。ログイン切れなどで止まった席に「別の原因」の知らせが一度だけ出ること。 ## Claude の親の自動再開を簡素にし、預かりを外す(#401、2026-10-12) Claude の親が利用上限で止まっている間も、部屋の発言を預からずその席の端末へ打つようにした。解除予定時刻の 30 秒後には、その時刻に席を占めている端末へ「再開して」の指示を一度打つ。止まった時の起動との照合(topic・account・nonce・PTY)と、合図を部屋の通知として本人だけ預かりを迂回させる経路(#399 / #400)は取り除いた。端末がいなければ打たず、親記録の答えられていない拒否を印として、次の起動で打つ。打った後に制限エラーなら打ち直し、どちらの答えも無ければ別の原因として部屋へ一度だけ知らせて打ち直さず、その席が後で正常に応答したら戻ったことを一度だけ知らせる。止まったときの知らせは今までどおり出す。判断ごとに `logs\claude-resume.log` へ一行書く(「[解除予定時刻に親の再開を試す](3-accounts.md#解除予定時刻に親の再開を試す357)」)。Claude の受け箱(`*.claude-mailboxes.json`)と解除後のまとめ・再開入力(#389 の Claude 側)は無くなった。 **確かめた範囲:** `crates/mcp-config/src/claude_resume.rs` のテストが、解除予定の 30 秒後に一度だけ打つこと、解除予定が分からなければ打たないこと、指示より前の拒否を答えに数えないこと、指示の後の拒否で次の時刻を決めて打ち直しの印を付けること、答えが無ければ「別の原因」を一度だけ返して以後打たないこと、「別の原因」を知らせた席だけが、その席の正常な応答で一度だけ戻った知らせを受けること(`Stalled`)、次の拒否でまた始まること、回復で予定が消えること、起動時に読み直した印で起動直後か解除予定に一度だけ打つこと、指示の文面、記録の一行の形を確かめる。`claude_notice.rs` のテストが、止まったときの知らせが解除予定を言い、どの知らせも預かりを言わないこと、打つときと別の原因のときの文面を確かめる。`prompt_hold.rs` と `limit_recovery.rs` の利用上限の預かりのテストは Codex の預かりで確かめるようにした。`src-tauri` のコンパイルは通っている。 **未確認(実機では確かめていない):** 止まっている Claude の席へ、解除予定時刻の 30 秒後に指示が一度だけ打たれ、送信されて再開すること。制限中に Pullcept を起動し直した席に、起動直後か解除予定時刻に指示が打たれること。端末を閉じていた席を後で開いたときに打たれること。ログイン切れや選択画面で止まった席に「別の原因」の知らせが一度だけ出て、打ち直さないこと。その席を直した後に「再開しました」の知らせが一度だけ出ること。`claude-resume.log` に各判断の行が残ること。2026-10-11 11:50 の Lin の停止の原因は未解明のままで、次に起きたときにこの記録で切り分ける。 ## 席が自分の利用上限を読む(#364、2026-10-10) 部屋の MCP サーバに読むだけの道具 `my_usage` を足した。呼んだ席自身の 5 時間の枠と週の枠の使用率とリセット時刻、その値をアプリが受け取った時刻を返す(「[席が自分の利用上限を読む](1-room.md#席が自分の利用上限を読む364)」)。値はアプリがパネル用に持っているもので、受け取った時刻はこのために足した。ほかの席の分は返さない。サイドカーと部屋の `protocol` は 10 に上げた。 **確かめた範囲:** `crates/mcp-config/src/usage.rs` のテストが、席(トピック, アカウント)ごとに自分の値だけを引くこと、新しい報告が丸ごと置き換えること、値の無い窓をキーごと省き 0 にしないこと、何も届いていない席の答えが受け取った時刻を持たないこと、トピックを消すとその値も消えることを確かめる。`codex/status.rs` のテストが、Codex の席の rollout で枠の値を読んだことを、値が変わらなくても一度だけ知らせ、別の枠の値では知らせないことを確かめる。`sidecar/test/round-trip.test.mjs` が、道具の一覧と説明、`usage` フレームがどの席も名指さないこと、ほかの読み出しへの答えで決まらないこと、床に何も載せないこと、返す文(窓ごとの一行とリセットの現地時刻、`not reported`、受け取った時刻と何分前か)、まだ届いていないときの答え、部屋が `error` を返したときの失敗を確かめる。`src-tauri` のコンパイルは通っている。 **未確認(実機では確かめていない):** Claude Code の席と Codex の席が実際に `my_usage` を呼び、パネルと同じ数字と、最後の報告の時刻が返ること。Claude Code の席で呼ぶときに許可の確認が出るか。席が上限の近さを見て、作業を区切ったり部屋に引き継ぎを頼んだりするか。 ## 入力欄をコードを書けるエディターにする(#354、2026-10-10) 入力欄のテキストエリアを、エディターの部品(Tiptap と lowlight)に置き換えた。`` ``` `` を打つとその行がコードの枠になり、枠の左上の言語ボタン(最初は自動判定、検索して選べる)で言語を選べ、打っているあいだも色分けされる。送った後の発言の枠も同じ色で描く。キー操作は Codex に合わせた——Enter はいつでも送信(変換中は除く)、Shift+Enter は改行、下矢印で枠を抜け、上矢印で枠へ戻り、枠の最後の空の行の Backspace で行を枠の外へ出し、空の枠の Backspace で枠を消す。#353 の「空の行の Enter で枠を抜ける」は取り除いた。送る中身は今までと同じ Markdown の文字列である(「[入力欄はコードを書けるエディターである](2-screen.md#入力欄はコードを書けるエディターである354)」)。使うライブラリの著作権表示とライセンス本文は `THIRD-PARTY-NOTICES.txt` にまとめ、インストーラーに同梱する。 **確かめた範囲:** `sidecar/test/composer.test.mjs` が `src/composer.ts` をページなしで読み込み、エディターの中身と送る文字列の行き来(行と枠、言語名、自動のときの裸の `` ``` ``、空の行、コードに `` ``` `` の行があるときに長いフェンスで囲むこと、読み戻して同じ文字列になること)、貼り付け(枠の外では枠と空の行を保って入り、枠の中ではそのまま入る)、コピーの文字列、Shift+Enter・下矢印・上矢印・Backspace のそれぞれの動きと、動かない場面を、エディターがキーに結んでいるコマンドそのもので確かめる。`sidecar/test/code-fence.test.mjs` は枠の判定を `src/composer.ts` から読み、`添付:` の読み分けを `src/main.ts` から取り出して確かめる。`sidecar/test/third-party-notices.test.mjs` が、`THIRD-PARTY-NOTICES.txt` がロックファイルの版と各パッケージの LICENSE から作った内容と一致すること、`src/composer.ts` が読み込むパッケージがすべて一覧の起点と依存にあること、インストーラーの同梱物にあることを確かめる。画面の型検査とビルドは通っている。Vite の開発サーバーを Chrome で開き(Tauri なし)、`` ``` `` で枠になること、色分けと自動判定の表示、Shift+Enter、下矢印で枠を抜けて上矢印で戻ること、最後の空の行の Backspace、空の枠の Backspace、先頭の枠の上矢印、言語ボタンの一覧の検索と選択で色分けが変わること、Enter で送ろうとして(Tauri が無いため失敗して)本文が言語ごと戻ることを操作して見た。 **未確認(実機では確かめていない):** Pullcept の画面(WebView2)での一通りの操作。とくに日本語入力——枠の外と枠の中での変換、変換を確定する Enter で送られないこと、枠の中で変換中に色分けが描き直されても変換が崩れないこと。宛先の候補(`@`)が枠の外と中で開き、名前が入ること。画像の貼り付けとファイルのドロップ。送れなかったときと床に拒まれたときに本文が戻ること。文字サイズを変えたとき。ダークテーマでの色の読みやすさ。長いコード(数千行)を貼ったときの重さ。インストーラーに `THIRD-PARTY-NOTICES.txt` と `NOTICE.txt` が入ること(`tauri build` は走らせていない)。 ## コードの枠の言語名と、Enter で枠を抜けること(#352、2026-10-09) 入力欄の Enter で枠を抜ける動きは #354 で取り除いた。 開く `` ``` `` の後ろが一語の言語名(英数字と `-` `_` `+` `.` `#`)のときだけ言語名として札にし、それ以外の文は枠の一行目の中身として描くようにした。入力欄では、閉じていない枠の中の空の行で Enter を押すと、その行が閉じる `` ``` `` になって枠を抜け、次の Enter で送れるようにした(「[三つのバッククォートで囲んだ部分はコードの枠で出る](2-screen.md#三つのバッククォートで囲んだ部分はコードの枠で出る348)」)。送る本文は打ったとおり(自動で入った `` ``` `` を含む)である。 **確かめた範囲:** `sidecar/test/code-fence.test.mjs` が、`src/main.ts` の関数を取り出して、言語名とみなす語(`ts`・`c++`・`c#`・`objective-c` など、前後の空白)と、そうでない文(`` ```あ。。。 ``・`` ```python title ``・記号の混じった語・CRLF)が一行目の中身になること、そのような枠も同じ行で閉じ、Enter が改行になり、`添付:` をコードのまま残すこと、空の行(空白だけの行を含む)での Enter が閉じる `` ``` ``(開いたときと同じ数のバッククォート)と改行に置き換わり、カーソルが枠の外に出て次の Enter で送ること、文字のある行・開く行・下で閉じている枠・枠の外ではその書き換えをしないことを確かめる。画面の型検査とビルドは通っている。 **未確認(実機では確かめていない):** Pullcept の画面(WebView2)で、`` ```あ。。。 `` の発言が「あ。。。」を一行目にした枠で出ること。入力欄で、閉じていない枠の空の行での Enter が `` ``` `` を入れて枠を抜け、後ろの枠の層がすぐ描き直され、次の Enter で送れること。日本語入力の変換を確定する Enter では書き換えが起きないこと。書き換えの後の Ctrl+Z(元に戻す)の振る舞い——`setRangeText` は WebView2 の元に戻す履歴に載らない場合がある。 ## 三つのバッククォートで囲んだ部分をコードの枠で出す(#348、2026-10-09) 入力欄の部分(後ろの層の枠・等幅の書体・枠の中の Enter)は #354 でエディターに置き換えた。 発言の本文で `` ``` `` で囲んだ部分を等幅の文字の枠で描き、入力欄では `` ``` `` で囲んだ行に枠を敷き、枠がある間は入力欄全体を等幅の書体にするようにした(Master 判断、案 B)。開いた `` ``` `` の中では Enter が改行になる(「[三つのバッククォートで囲んだ部分はコードの枠で出る](2-screen.md#三つのバッククォートで囲んだ部分はコードの枠で出る348)」)。送る本文・部屋の記録・端末へ打つ文字は変えていない。 **確かめた範囲:** `sidecar/test/code-fence.test.mjs` が、`src/main.ts` の関数を取り出して、枠の始まりと終わりの判定(文の途中や一行の中の `` ``` `` を枠にしないこと、開いたより少ないバッククォートでは閉じないこと、閉じていない枠が最後まで続くこと、言語名がコードに入らないこと、CRLF)、Enter が改行になる位置(カーソルより前だけでなく本文全体で決め、`` ``` suffix `` の行では枠が開いたままであること)、閉じていない枠の中の `添付:` の段がコードのまま残り、枠の外の段は今までどおり添付になることを確かめる。枠の外の文は #349 の `linkifyText` を通り、枠の中は通らない。画面の型検査とビルドは通っている。ヘッドレスの Chrome で、styles.css と同じ関数で描いた発言と入力欄をライトとダークの両方で写し、枠の位置がテキストエリアの行と重なること(スクロールバーが出てスクロールした状態を含む)、自分の吹き出しが長いコードの行で部屋の幅を超えないこと、枠のある入力欄が等幅になり枠と行が揃うことを見た。 **未確認(実機では確かめていない):** Pullcept の画面(WebView2)で、枠を打った瞬間と消した瞬間に入力欄の書体が切り替わること、入力欄の枠がテキストエリアの行と重なり続けること——とくに日本語入力の変換中、宛先の候補で名前を入れた後、文字サイズを変えた後、入力欄の高さを手で変えた後。開いた `` ``` `` の中の Enter が改行になり、閉じた後の Enter で送れること。 ## 解除予定時刻に Claude の親の再開を試す(#357、2026-10-10) 利用上限で止まった Claude の親の席へ、解除予定時刻の 30 秒後に Pullcept が再開の合図を一回打つようにした(「[解除予定時刻に親の再開を試す](3-accounts.md#解除予定時刻に親の再開を試す357)」)。正常な親応答を読めば「再開しました」と知らせて預かった発言のまとめを渡し、また拒否を読めば「まだ制限中」と次の時刻を知らせて打ち直す。 **確かめた範囲:** `crates/mcp-config/src/claude_resume.rs` のテストが、解除予定の 30 秒後に一回だけ打つこと、解除予定が分からなければ打たないこと、合図より前の拒否を答えに数えないこと、合図の後の拒否で次の時刻を決めること(1 分を下回らず、15 分で頭打ち、先の解除予定ならその時刻)、答えが無ければ自動の試行を止め、次の拒否でまた始まること、回復で予定が消えること、合図が一行で作業を求めないこと、会話の記録の行を #342 の保留で読んだとき、合図を打つことや予定時刻では保留が外れず、席の正常な答えでだけ外れることを確かめる。`claude_notice.rs` のテストが、停止・再開・まだ制限中・応答なしの文面と、末尾の `(返信不要)` を本文に重ねないことを、`crates/room-floor` のテストが、本文の途中の全角括弧があっても `(返信不要)` が一度だけ付くことを確かめる。`src-tauri` のコンパイルは通っている。 **未確認(実機では確かめていない):** 止まっている Claude の席へ、解除予定時刻の 30 秒後に合図が一回だけ打たれ、送信されること。まだ止まっている席で、合図への拒否が会話の記録に書かれ、「まだ制限中」の知らせが出ること(合図に拒否が書かれることは #342 の 15:03 の拒否から見込んでいるが、合図そのものでは確かめていない)。戻った席が合図に一言だけ答え、作業を始めず部屋へも書かないこと。「再開しました」の後にまとめが一度だけ届くこと。 ## 許可待ちの席に投稿を預ける(#346、2026-10-09) Claude Code の席が許可の画面で止まっている間、部屋の発言をその席の端末へ打たずに預け、待ちが終わってから一度だけ打つようにした(「[許可待ちの席には投稿を打ち込まない](2-screen.md#許可待ちの席には投稿を打ち込まない346)」)。あわせて、部屋が待った許可の要求ごとに、どう終わったかを `logs\permission-requests.log` へ一行ずつ書くようにした。押したボタンには、画面がクリックから読んだ押し方(マウスかキーか)を添える。 **確かめた範囲:** `crates/mcp-config/src/prompt_hold.rs` のテストが、待っていない席にはすぐ打つこと、待っている席の発言を預かり、待ちの後に届いた順で一度だけ渡すこと、待ちが終わってから渡し始めるまでと渡している途中に来た発言が前の発言を追い越さないこと、渡している途中に待ちが始まれば止まり残りが待つこと、渡しは一度に一つであること、端末が受け付けなかった発言を先頭へ戻して失わないこと、起動し直しで持ち越すこと、許可待ちと利用上限の重なり(待ちの途中で上限が始まり、待ちの終わりにまだ止まっている席では打たずに利用上限の預かりへ移し、解除で一度だけ渡ること。上限の後に待った席では列が何も持たないこと。待ちの間に来た解除のまとめを預かって待ちの後に打つこと。まとめは後の上限でも利用上限の預かりへ戻さないこと)を確かめる。`hook_activity.rs` のテストが、本体とサブエージェントのどちらの待ちでも `any_waiting` になり、それぞれの終わり方で外れることを確かめる。`permission_prompt.rs` のテストが、記録の一行の形(押し方の読み方、ほかで片付いたときの合図、一行に収まること)を確かめる。`src-tauri` のコンパイルと画面の型検査は通っている。 **未確認(実機では確かめていない):** 手動モードの席が許可の画面で止まっている間に部屋で発言しても、カードが閉じず、端末の画面も選ばれないこと。端末かカードで答えた後、預かった発言が届いた順に一度だけ打たれること。待ちの終わりから渡し始めるまでの 1.5 秒で、続けて出る許可(並列のツール)に打ち込まずに済むこと。hook が待ちの終わりを取りこぼしたとき(終わりの合図が来ない待ち)は、次の合図まで発言が預かったままになる。2026-10-09 の三回の allow(19:16:08・19:21:55・19:23:04、いずれも `say_to_room`)がどう押されたかは、この版の記録で次に起きたときに確かめる。 ## 部屋から許可に答える(#336、2026-10-09) Claude Code の席が許可の画面で止まったとき、部屋にカードを出し、画面の人が 拒否 / 常に許可 / 一度だけ許可 を返せるようにした(「[許可の確認に部屋から答える](2-screen.md#許可の確認に部屋から答える336)」)。`PermissionRequest` の hook を最長 180 秒開けたまま待ち、この hook だけ timeout を 190 秒にした。Codex の席の承認は対象外。 **確かめた範囲:** 答えの形(`hookSpecificOutput.decision` の `behavior`・`message`・`updatedPermissions`)、`permission_suggestions` を `updatedPermissions` としてそのまま返せること、`PermissionRequest` に `tool_use_id` が無く `mcp_server` が付くこと、http hook の timeout の既定が 600 秒で、時間切れの出力は捨てられ、接続の失敗は止めないエラーであることは、公式 docs `code.claude.com/docs/en/hooks`(2026-10-08 に読んだ)で照合した。hook を待たせている間も端末の許可の画面が出ることは、2026-10-08 23:01 の実機で確かめた(#336)。`crates/mcp-config/src/permission_prompt.rs` のテストが、Bash の要求の中身と 常に許可 の規則、MCP のツール名の分け方(サーバ名に `__` を含む場合も)、サブエージェントの要求、読めない本文・別の出来事の本文にカードを出さないこと、長い値と多い項目の切り方、制御文字の落とし方、`addRules`・`allow` 以外の提案を 常に許可 にしないこと、三つの答えの形、待つ時間が hook の timeout より短く 600 秒より短いこと、を確かめる。`lib.rs` のテストが `PermissionRequest` だけ timeout 190、ほかは 5 であることを、`hook_activity.rs` のテストが待ちを続ける条件(`Activity::waiting`)を確かめる。 **未確認(実機では確かめていない):** 実機でカードが出て、三つのボタンがそれぞれ効くこと(常に許可で規則が書き込まれ、次から聞かれないこと)。端末で先に答えたとき、まだ動いている hook を CLI がどう扱うか(打ち切って接続を閉じるのか、待ち続けるのか、後から来た答えを捨てるのか)——アプリは答えのキーを見たらすぐ `{}` を返すので、待ち続ける場合も止まらないはずだが、確かめていない。CLI が要求を送り終えた後に接続の片側を閉じないこと(閉じると、アプリはそれを「CLI が待つのをやめた」と読み、カードがすぐ終わる)。並列のツールの許可で、別のツールの `PreToolUse` が先に来てカードが早く終わることがあるか。背景のサブエージェントの許可でカードが出ること。 ## Claude Code の席の様子(#331、2026-10-08) Claude Code の席について、起動の `--settings` に載せた http 型の hook(`PreToolUse`・`PostToolUse`・`PostToolUseFailure`・`PermissionRequest`・`SubagentStart`・`SubagentStop`・`Stop`・`UserPromptSubmit`)から、「許可待ち」「ツール」「委任中」(サブエージェント)を参加者パネルの札と会話面の下の一行に出すようにした(「[Claude Code の席は hook で様子を言う](2-screen.md#claude-code-の席は-hook-で様子を言う331)」、「[Claude Code の席は自分の様子を hook で知らせる](3-accounts.md#claude-code-の席は自分の様子を-hook-で知らせる331)」)。#325 の試しの記録(`logs\hook-probe.log`)はこれに置き換えて外した。 **確かめた範囲:** hook の本文の欄の名前(`hook_event_name`・`tool_use_id`・`tool_name`・`agent_id`・`agent_type`、`PermissionRequest` に `tool_use_id` が無いこと、`Stop` の `background_tasks[].type`)は公式 docs `code.claude.com/docs/en/hooks` と `sub-agents`(2026-10-08 に読んだ)で照合した。`--settings` 経由の http hook が実機の席から届くことは、#325 で `PreToolUse` について確かめた(2026-10-08)。読み方は `crates/mcp-config/src/hook_activity.rs` のテストが、hook の本文を与えて出る語を確かめる——ツールの名前を出し引数を出さないこと、並列のツールの集合、許可待ちがツールに勝ちそのツールの終わりで消えること、拒否されたツールが次の呼び出しで待ちと一緒に消えること、`Stop`・`UserPromptSubmit` での片付け(本文が読めない場合も)、切れた `PostToolUse` / `PostToolUseFailure` で動いているツールと待ちが全部消えること、ほかの出来事の切れた本文を数えないこと、パスと違う出来事の本文を読まないこと、サブエージェントの始まりと終わり・その中のツールが本体のツールにならないこと・`Agent` ツールを数えないこと、内部のエージェントを数えないこと、サブエージェントの許可待ち、`background_tasks` にサブエージェントがある間は `Stop` でも消さないこと、事象の形が Codex の席と同じであること、本体の許可待ちが答えのキー(Enter・Esc・数字・`y` / `n`)で閉じ、待っていたツールも外れて「ツール」と言わないこと、矢印・フォーカスの報告・貼り付け・ほかの文字では閉じないこと、サブエージェントの待ちはキーで閉じないこと。 **未確認(実機では確かめていない):** 実機の席で、ツール・許可待ち・サブエージェントの札が出て、終わると消えること(issue の完了の条件)。とくに、`SubagentStart` / `SubagentStop` が届くこと(#325 では `SubagentStart` の到着をまだ見ていない)、背景のサブエージェントが走っている間の `Stop` の `background_tasks` に `type: "subagent"` が載ること、許可を拒否した後の流れ、並列のツールの一つが許可を待つ間に別のツールの `PreToolUse` が来るかどうか(来れば、待ちと待っているツールが早く消える)、hook を八つに増やしたことでツールごとに返事を待つ時間が目に見えるかどうか。Claude Code の許可の画面に答えるキーが本当に Enter・Esc・数字・`y` / `n` で足りるか、許可した後の札が「許可待ち」から「出力中」または「待機」に替わること。 ## Codex CLI の検証範囲(#272、2026-10-04) `codex_cli` の保存・種別選択・起動/再開・起動の行での MCP 定義(#297 からファイルには書かない)・初回 ID 通知を実装した。Claude の argv 回帰、設定と hook の保持、秘密の非表示、起動/アカウント/トピック照合、履歴消失と I/O 不明の区別、複数登録の排他は crate/sidecar テストが持つ。 **実 CLI/実モデルで確認した範囲:** Windows の隔離 Codex CLI 0.160.0 と専用 CODEX_HOME で、通常の folder trust と専用 handler の個別信頼を操作した。実会話の callback が root native UUID を返し、改行を含む札と応答中の追加入力を受けた。停止後に同じ UUID を明示 resume し、前の合言葉を保持したまま read_room_history と say_to_room を呼び、当時の MCP 追加キャラクター指示 `TESTCHAR:` を付けて応答した(この旧経路は #276 で撤去)。HTTP callback と WebSocket の相手は fixture であり、Pullcept 本体の listener ではない。 **追加モデル呼出しなしで確認した範囲:** standalone、独立 Git root、nested cwd、別 Git root への --cd、profile ファイルの markers を adapter 経由の native config/read で確認した。これは dotted profile 名の runtime 受理を示すものではなく、0.160.0 の runtime はその名前を拒否する。独立 root と linked root/nested は、通常の folder trust 後に hooks/list で対応する project handler を列挙した。linked worktree の local config layer と hook scope は異なり、正式に対応する root checkout へ登録することで一致した。独立 root の handler は個別信頼後の trusted、linked nested の新 handler は untrusted として列挙され、自動信頼していない。 **#276 のモデル不要実測:** 隔離0.160.0と一時 CODEX_HOME で、指示なしの sentinel 判定、global/plain-name profile-v2/未信頼 project 除外/信頼済み project 優先、--cd と手動 -c の優先、Lin/Lay の一つだけと共通原文の保持、設定原本のバイト保持を確認した。patched portable-pty の ConPTY → cmd /C call → native exe/空白入り .cmd で、日本語・CRLF・引用符・%PATH%・&|()・バックスラッシュ・絵文字が実 developer input_text と完全一致した。thread/turn は作らずモデルを呼んでいない。選択後の実モデル遵守は未検証であり、旧 MCP 指示の実会話証拠とは区別する。 **未確認:** Codex アカウント作成から停止・再開までの Pullcept 実 GUI/実 listener 操作、Claude と Codex の実アプリ内同時往復、人間の打ちかけ時の保留/解放を Codex の実 GUI で通す操作。打ちかけの判定と改行・送信キーの分離は既存 terminal-input テスト、保留列は共通 PTY 実装に依存する。fixture の結果を実 GUI の確認へ読み替えない。 ## Codex の app-server 方式の検証範囲(#299、2026-10-06、2026-10-17 更新) アカウントごとの切り替え「app-server 方式」を実装した(「[Codex の席を app-server 経由で起動する](3-accounts.md#codex-の席を-app-server-経由で起動する299)」)。2026-10-06 時点では既定は切(hook 方式)だった。2026-10-17 に新規と設定値の欠落を app-server 方式へ変更し、明示保存された false は維持する。起動オプションの振り分け、hook を止める `-c` の組み立てと拒否、`hooks/list` の照合、`thread/start`・`thread/resume`・`thread/inject_items` の引数、答えの照合、端末の行は `crates/mcp-config`(`codex::app_server`)のテスト、本文の取り出しと照合は sidecar のテストが持つ。 **モデルを呼ばずに確かめた範囲(2026-10-06、Codex CLI 0.160.1、隔離 CODEX_HOME):** Li+ の `codex-output-style.py` の写しと、Li+ の hook 三つ(cold-start・output style・Trigger Check Gate に見立てた物)を信頼した試しの project で、次を実測した。 - `codex-style.mjs` の `body` が、helper の `hook` から選んだキャラの本文と、止める hook の鍵一つを返した。 - Pullcept が組み立てた server の行(`--yolo -c model_reasoning_effort=low -m gpt-5.2` を含む)で server が立ち、`listening on:` から港を読めた。トークンの無い接続と違うトークンの接続は HTTP 401 で拒まれ、正しいトークンで繋がった。行にトークンの値は無かった。 - その server の `hooks/list` で、output style の hook だけが `enabled: false`、他の二つは `enabled: true` のまま、三つとも信頼済みのままだった。 - `thread/start` の答えが model `gpt-5.2`・承認 `never`・sandbox `dangerFullAccess`・effort `low` だった。 - `thread/inject_items` の後、rollout の先頭の developer の発言がキャラの本文であり、既定のキャラの本文は rollout のどこにも無かった。 - 端末の行(`resume --remote … --remote-auth-token-env PULLCEPT_CODEX_REMOTE_TOKEN --no-alt-screen`)で本物の TUI が server に繋がった。隔離 CODEX_HOME には認証が無いため、TUI はログインの画面で止まった。会話の画面まで進むことは、認証のある環境での確認に残る。環境変数が無ければ TUI は起動せず、違うトークンでは 401 で繋がらなかった。 - 作った会話は `thread/delete` で消し、server の木を止めた後にプロセスが残っていないことを確かめた。 **実機確認と既定変更(2026-10-17):** #423 / #427 / #429 適用後、本番 Luna が元の会話を app-server 方式で再開し、部屋へ応答した。履歴 DB の起動確認は [#426 の記録](https://github.com/Liplus-Project/pullcept/issues/426#issuecomment-6215263382) にある。同日、マスターがスマホから同じ会話へ投稿し、Luna が受信して部屋へ返信したため、#299 の既定切り替えの判断待ちは解消した。この PR の検証は設定互換と画面・プレビュー経路の回帰試験であり、実行中の席の再起動やリモート登録は行っていない。 **残る確認範囲:** 新規席の最初の応答、五欄(#283)、利用上限の回復、`--no-alt-screen`(#295)、部屋 MCP(#298)の全 GUI 組合せを、この変更で再検証したとは扱わない。Desktop との共存と登録競合も別の課題として残る。 ## Codex の app-server の席の待機(#329、2026-10-08) app-server 方式の Codex の席で、スレッドが idle と分かっているときは、端末に文字が届いていても札を「待機」(利用上限なら「制限中」)にした。何もしていない Luna の席が「出力中」のまま消えなかったためである(Master、2026-10-08)。`seat-activity` の事象に `thread_status`(`idle`/`active`/null)を足し、画面は接続中で idle のときだけ端末の合図を見ない。`thread_status` は、起動・再開の答えの `thread.status` も、ターンの前の `thread/status/changed` の idle も、受け取ったときにそのまま送る(#368、2026-10-10。それまでは、ターンがこの接続に届くと示す知らせを一度受け取るまで null としていた)。active で語が無いとき、様子をまだ受け取っていないとき、切断(「様子不明」)は今までどおりである(「[走っているアカウントが何をしているか](2-screen.md#走っているアカウントが何をしているか)」)。hook 方式の Codex の席と Claude Code の席は変えていない。 **確かめた範囲:** `crates/mcp-config/src/codex/activity.rs` のテストが、起動・再開の答えの idle と active をすぐに送ること、ターンの前の idle の知らせで idle になること、起動の idle の後に `turn/started` で active、`turn/completed` で idle になること、語の無い active のターン、様子の知らせを受けていない席が null のままであること、ターンの終わりで idle になること、`systemError`・`notLoaded`・スレッドの終わりで null に戻ること、切断で null と `connected: false` になること、別のスレッドのターンで動かないこと、記録の一行が method 名と状態だけを持つことを確かめる。画面の順は `src/main.ts` の `activityNote` にある。 **記録:** 席の接続に届いた知らせごとに、method 名とスレッドの状態(`params.status.type`、無ければ `-`)、席(トピック id・アカウント id)、UTC 時刻を `logs/codex-activity-probe.log` に一行ずつ追記する。本文・コマンド・引数・文章は書かない(形は「[Codex の席は自分の様子を app-server の知らせで知らせる](3-accounts.md#codex-の席は自分の様子を-app-server-の知らせで知らせる326)」)。 **確かめた(2026-10-10、#368):** 端末(`--remote` の TUI)が始めたターンの知らせが、アプリの接続にも届くこと(#326 から持ち越した仮説)。`codex-activity-probe.log` で、Luna の端末に打ち込んだ文字で始まったターンが、12:39:03Z に `turn/started` としてアプリの接続に届いている。それまでは届くかが分からないとして起動の答えの idle を信じなかったため、12:28:40Z に席を起動し直した後、12:28:41Z に idle の知らせが来ていても、そのターンまで札は「出力中」のままだった(Master「Lunaが出力中で10分以上たってる?」2026-10-10)。そこで、起動・再開の答えとターンの前の idle をそのまま送るようにした。TUI の描き直しが端末を黙らせない、という見立ては仮説のままである。 ## Codex の app-server の席の様子(#326、2026-10-08) app-server 方式の Codex の席について、席の server がアプリへ送る知らせから「許可待ち」「答え待ち」と、いま動いている仕事の種類(実行中・編集中・ツール・検索中・要約中・画像生成・画像参照)を参加者パネルの札と会話面の下の一行に出すようにした(「[走っているアカウントが何をしているか](2-screen.md#走っているアカウントが何をしているか)」、「[Codex の席は自分の様子を app-server の知らせで知らせる](3-accounts.md#codex-の席は自分の様子を-app-server-の知らせで知らせる326)」)。hook 方式の Codex の席と Claude Code の席は今の語のままである。 **確かめた範囲:** 知らせの名前と形は、インストール済みの Codex CLI 0.160.1 が生成したスキーマ(`codex app-server generate-json-schema` の通常版と `--experimental` 版)で照合した(`thread/status/changed` の `activeFlags`、`item/started` / `item/completed` の `item.type`、`turn/started` / `turn/completed`、`thread/closed`、`thread/start` / `thread/resume` の答えの `thread.status`)。読み方は `crates/mcp-config/src/codex/activity.rs` のテストが、知らせの JSON を与えて出る語を確かめる——許可の flag が先に始まった item に勝つこと、並列の item、ターン終了と idle での消去、待機中の切断と仕事の途中の切断の両方で `connected: false` の事象が送られること(画面はそれを「様子不明」と出し、「待機」に戻さない)、スレッドが決まる前に届いた知らせを失わないこと、別のスレッドの知らせを読まないこと、コマンドの本文や引数を出さないこと。 **未確認(実際の席では確かめていない):** 実際の席で知らせが届く順序と間合い。特に、`item/started` から許可の flag が立つまでの間に「実行中」が一瞬出るかどうか、端末(`--remote` の TUI)が始めたターンの知らせが、別のクライアントであるアプリに実際に届くこと(仕様とスキーマでは届く形だが、配信は実測していない)、サブエージェントのスレッドの知らせがアプリに届くかどうか。モデルを呼ばず、稼働中の席へ RPC もしていない。 ## Codex の席への部屋の一文(#301、2026-10-06) 部屋の一文(`room_system_prompt`)を種別に依らない一つの本文にし、部屋の詳しい作法の在り処(部屋の MCP サーバの instructions)を指す一文を足した。Claude の席は従来どおり `--append-system-prompt` で、app-server 方式の Codex の席は `developerInstructions` のキャラの本文の後で、`thread/start` と毎回の `thread/resume` に受け取る(「[席は部屋の道具の名を起動時に受け取る](3-accounts.md#席は部屋の道具の名を起動時に受け取る)」)。hook 方式の Codex の席には渡さない(同じ節に理由)。本文が両方の種別で同じであること、行に載せられる文字だけであること、長さ、キャラの本文が先頭にそのまま残ること、開始と再開で同じ合成になることは `crates/mcp-config` のテストが持つ。 **2026-10-08 時点の未確認範囲(後続の再開・返信の確認は上の #299 の 2026-10-17 記録を参照):** 実モデルの一往復。app-server 方式の Codex の席が、新しく起動した直後の最初の部屋の発言に `say_to_room` で答えること、MCP の instructions が届いた後にその作法に従うこと。Claude の席で一文が変わった後の振る舞いも実機では見ていない。この変更では Codex の app-server を起動しておらず、合成した本文が rollout の developer の発言に載ることは #299 の実測(キャラの本文が載った)からの導出である。 ## キャラクターの本文の欄(#100、2026-10-06) アカウントの窓の「キャラクター」の項目に、キャラのファイルの本文の欄とフルパスを置いた(「[キャラクターの本文はアカウントの窓で直す](3-accounts.md#キャラクターの本文はアカウントの窓で直す100)」)。場所の組み立て、名前の検査、作業ディレクトリの外へ出る junction の拒否と中の junction の書き通し、新規作成とフォルダーの作成、空の本文で作らないこと、変わらない本文を書かないこと、開いた後の変更を上書きしないこと、改行と BOM の保持、128 KiB の上限、UTF-8 でないファイルの拒否、frontmatter の `name:` の読み、同じファイルを着る他のアカウントの判定は `crates/character-file` のテストが持つ。 **未確認(実機):** - [ ] Claude Code のアカウントで既存のキャラを開いて直し、決定した後の次の起動でその本文が効くこと。 - [ ] Codex CLI のアカウントで同じこと(hook 方式と app-server 方式の両方)。 - [ ] まだ無い名前で新規作成し(`output-styles` が無い作業ディレクトリを含む)、次の起動でそのキャラが立つこと。 - [ ] 種別・作業ディレクトリ・キャラクターを変えたときの読み直しと、保存していない変更があるときの「読み直す」の表示を画面で見ること。 - [ ] 同じファイルを着る別のアカウントがあるときに名前が出て、二度目の決定で保存されること。 - [ ] 長い本文で欄が中でスクロールし、狭い窓でも崩れないこと。 ## 実装済み - Tauri 2 による Windows デスクトップアプリの基盤 - Rust の PTY コマンド(起動 / 入力 / リサイズ / 終了) - アカウント設定とセッションデータの JSON 永続化 - MCP サーバ(Node サイドカー、`sidecar/`。#195 から channel を宣言しない) - 部屋ソケット(Rust、`127.0.0.1` 任意ポート、Bearer トークン必須) - サーバの `.mcp.json` 登録(既存内容はマージして保持、登録鍵はアカウントと部屋の組ごと、前回起動のエントリは掃除)と、成立条件を満たす CLI 起動フラグの適用 - 部屋の作法(`instructions`)の初版 - 発言の宛先(部屋 → `post.to` → 端末へ打つ札の `to`、送信は `say_to_room` の `to`。#204 から名前の並びで、複数の宛先を持てる)と、それを判定材料として名指しする `instructions` - 順番の作法(先に届いた答えを読んでから決める、送信直前の読み直し。#273 から `say_to_room` の説明に置く。protocol もツールも増やしていない) - 作法の長さ(#273。名前を差し込んだ `instructions` を 1024 字以内に収めること——#333 で 1792 字に改めた——、道具を呼ぶときにだけ要る作法を `say_to_room` / `read_room_history` とその引数の説明へ移したこと、足した三つの作法——誰の担当でもない仕事は名乗って返事を待つ、ターミナルにしか出ない物は場所を書く、本文に自分の名前を付けない) - 作法の英語化(#333。`instructions` と道具の説明を英語にし、部屋の発言は日本語で書くことを作法に明記。合計トークンを o200k_base で 1240 → 1026 に減らした) - 作法の短い書き直し(#337。`instructions` と道具・引数の説明を、逐語訳から AI 向けの短い書き方——文の断片、`=` や `->`、どのモデルにも通じる語と記号——に改めた。規則は落とさず足さない。合計トークンを o200k_base で 1026 → 833 に減らした) - 床(`say_to_room` の `last_seen` と `post_result`、既存ロック内での判定と刻印、見落としがあるときの拒否と返却。ツールは 1 本のまま。配達の返答に載せる自分の発言の `message_id`(#267)、拒否された発言を一つだけ持つ下書きと `content` を省いた出し直し(#268)) - 拒否が返した発言の描画(画面。`message_id` による重複除去、返ってきた最新への透かしの前進、発言に載せて運ぶ宣言色、描いた分だけを述べる状況表示) - 部屋のログ(`logs/main/{トピック}.jsonl` への追記、床の判定と同じロック内での書き込み、保存する六欄(`account` は #193)、`hue` と `own` を持ち込まない写像、追記の失敗の画面への通知、トピックを指定する読み出しコマンド、参加者への再配信をしないこと) - トピック(手動の区切り、起動時の新規トピックと遅延生成、索引とディレクトリの照合、最初の発言からの命名とその場での変更、既存 `logs/main.jsonl` の移行) - トピックごとの部屋(#141。部屋ごとの床と席と配送とログと読み出し、`hello` の `room`、トピックを離れても止めないセッション、(トピック, アカウント)を鍵にする席の台帳と端末と再読み込みの引き取り、トピックの切り替えに追随する端末・タブ・セッションの値・名簿、一覧の走っている印、id を配らない起動でもトピックを実体化すること) - トピックの削除(行の `❌`、確認のダイアログ、ファイルと索引の項目の両方の削除、そのトピックで走っているセッションの終了、開いているトピックを消したときの新しいトピックへの移動、題の無い行も消せること) - トピックの再開(アカウントの再開コマンド、`{session_id}` の置換、トピックへのセッション id の記録、再開の前に会話が実在するかを見ること、実在しない記録のその場での取り消し、再開できない席の新規着席、名簿に現れないまま終えた再開の記録の取り消し、いずれも状態行での通知) - 参加者からの読み出し(サイドカーの `read_room_history`、`history` / `history_result` フレーム、pull のみ、ページと `before` の巻き戻し) - 席が自分の利用上限を読む道具(#364。サイドカーの `my_usage`、`usage` / `usage_result` フレーム、呼んだ席自身の分だけ、5 時間と週の使用率とリセット時刻と受け取った時刻、値の無い窓は「無い」、Codex の席で承認を求めないこと) - 文脈を持たないまま着いた席への通知(起動時の `PULLCEPT_UNSEEN_HISTORY`、サイドカーの「前を見る」の分岐、再開しなかった席という境界、件数を持たないこと、代理で呼ばないこと) - トピックの一覧(会話面の左の列、新しい順、一覧の外に固定の「新規」(#225 から見出しの横の +)と索引に無い現在のトピックでのその選択状態、選択による部屋への読み戻し、参加者パネルと対の寸法、名前から導く色) - 参加者モデル(統一 `post` フレーム、発言者以外の全セッションへの配送、接続同一性による自分の発言の抑止と名簿の同一性、人間を含む名簿) - アカウント(作成・編集・削除、種別、名前と色と作業ディレクトリと起動オプション、リストでのオフライン表示、一つのアカウントは一つの部屋に一席まで、`config.json` からの移行) - 種別が持つ CLI の作法(#156 / #147。`admin` / `Claude Code` / `Codex CLI` / `CLI(汎用)` の CLI 作法(`mcp` の宣言は #193)、種別ごとのセッション id の渡し方・再開の一行(起動オプションを後ろに載せ、`--session-id` は載せない。#167)・`--settings` の報告・会話の在り処・部屋の道具の名乗り、その人が足すものだけを書く起動オプションの欄、汎用の種別では出さないステータスラインと名乗り、起動コマンドから見分ける既存アカウントの移行と再開コマンド・`--session-id` の扱い) - アカウントのキャラクター(output style の `name:` を持つ欄、起動時の `--settings` による選択、ファイルを書き出さない形、起動オプションの `--settings` との併記の拒否、宣言しないアカウントは既定のまま) - アカウントの環境変数(#163。`名前=値` を一行ずつ書く一つの欄、DPAPI による値の暗号化、`CommandBuilder::env` による受け渡し、命令文とプレビューに載せないこと、先頭と末尾だけの表示、出たままの行が元の値を保つこと、値を囲む引用符の除去と片側だけの引用符の拒否、隠し表示を書き換えた値の拒否(#165)、アプリ自身が設定する名前の拒否、復号できない値での起動の拒否) - 他のアカウントの部屋サーバを起動しないこと(`--settings` の `disabledMcpjsonServers`、名指しの出所は `.mcp.json` の実物、止めるものが無ければ素通し) - 起動したアカウントと登録のアカウントが違うサイドカーは部屋に入らないこと(#208。起動した CLI のプロセスに載せる `PULLCEPT_LAUNCHED_AS`、サイドカーでの `PULLCEPT_ACCOUNT_ID` との突き合わせ、断ったサイドカーは道具も作法も出さず stderr に理由を残すこと、アプリが起動していない CLI が読んだ登録も入らないこと、アカウントの環境変数の欄での名前の拒否) - 起動した CLI のプロセスに載せる部屋 id(#264。`PULLCEPT_ROOM_ID`、登録の `env` と同じ名前と値、アカウントの環境変数の欄での名前の拒否) - セッションの様子の報告(#155 / #152。起動する行の `statusLine`、`sidecar/src/status.mjs` が JSON をそのまま `/hooks/status/<トピック>/<アカウント>` へ送り端末へ 1 行返す形、アドレスが名指す席、`cmd.exe` が反応する文字を載せないこと、環境から解決するトークン、行に載せる語の文字集合の判定と通らないときの不掲載、パネルのモデル・エフォート・5 時間・週次・コンテキストの五欄、欠けた値の「—」、動いたときだけの更新) - Codex CLI の席の利用上限(#294、「[Codex の席が利用上限で止まったとき](3-accounts.md#codex-の席が利用上限で止まったとき294)」。rollout の `task_complete` の `usage_limit_exceeded` で止まりを読むこと、パネルの「制限中」を使用率でなくその判定から出すこと(`session-stats` の `limited`)、止まった時点で一度 app-server に解除予定を聞き部屋へ `Pullcept`/`app` で一通知らせること、止まっている間その席の端末へ部屋の発言を打たず預かること(#403 で外した)、止まっている席だけを解除予定の 30 秒後から間を空けて `account/rateLimits/read` で聞くこと、`ordinaryUsageAllowed: true` だけを解除とし繋がらなければ止まったままにすること、解除で部屋へ一通・席へ要約の一通(席宛ての発言だけ本文付き)を打つこと(#403 で再開の指示だけにした)、止まっている席の受け箱(#312。#403 で止まっている印だけにした。預かった発言の id の並びを預かるたびにトピックの記録の隣のファイルへ書き足すこと、起動した席は受け箱があれば止まった状態から始まり、rollout を待たずにすぐ問い合わせ、「制限中」を一度送ること、解除のときに受け箱の id の発言を記録から読んで件数とまとめにし、受け箱を消すこと、席を閉じていたあいだの発言は入れないこと、トピックを消せば受け箱も消えること。#310 の記録からの数え直しはこれに置き換えた)、問い合わせを `codex app-server` の stdio で行うこと、Claude Code の席を変えないこと) - Codex CLI の席の五欄(#283、「[Codex の席は自分の様子を rollout で知らせる](3-accounts.md#codex-の席は自分の様子を-rollout-で知らせる283)」。rollout の `turn_context` と `token_count` の行から読むこと、Claude Code の席と同じ `session-stats` で画面へ渡すこと、末尾の追記分だけを読むこと、壊れた行・知らない行・欠けた欄・長すぎる行で止まらず読めない欄を「—」のままにすること、窓の長さによる 5 時間と週次の見分けと `codex` 以外の枠を採らないこと、再開では起動時点のファイル長から読むこと、新規起動で id とファイルの出現を待って探し直すこと) - Codex CLI の席の代替画面を使わない起動(#293、「[Codex CLI の起動と再開](3-accounts.md#codex-cli-の起動と再開272)」。新規起動と再開の行の末尾に `--no-alt-screen` を足すこと、起動オプションが `--no-alt-screen` または鍵 `tui.alternate_screen` の `-c` / `--config` を持つときは足さないこと、`Claude Code` の行は変えないこと) - Codex CLI の部屋の MCP を起動の行だけで渡すこと(#297、「[Codex CLI の起動と再開](3-accounts.md#codex-cli-の起動と再開272)」。`.codex/config.toml` に書かないこと、有効 cwd に `.codex` フォルダーを用意すること、以前の版が書いたアプリの欄を起動時に消し他の欄・キー・コメントを残すこと、行に他の席の名前を載せないこと、Claude の席の `.mcp.json` を変えないこと) - 使用率から出す「制限中」(#161。5 時間または週次の使用率が 100% 以上、`>=` 判定、報告が下がれば自動で消えること、「考え中…」「出力中」への譲り。#149 / #151 / #153 の `StopFailure` hook の経路は撤去済み) - 人が書いた値の起動の行への載せ方(#154。キャラクター・起動オプション・command の三経路、`line_safe_text` と `console_safe` の使い分け、載せられない値を載せずに起動すること、command と再開コマンドだけは起動の拒否、起動オプションは欄ごと落ちること、モーダルが保存の前に出す知らせ) - 参加の時点の名乗り(人間側。種別 `admin` のアカウントの名前と色) - 宣言色(`hello` の `hue` / `room_join` の `hue`。宣言 > 自分の accent > 名前からの導出) - 部屋が運ぶアカウント id(`hello` / `room_join` の `account_id`、`Participant.account`。任意であり、判定には使わない) - チャットルーム UI(メッセージ一覧、発言者表示、入力欄、入力欄の `@` で参加者から選ぶ宛先。#204 から複数可) - 会話面の文字サイズ(`#room` と入力欄の本文(`#input`、#354 まではテキストエリア)、参加者パネルの丸印(#260)、離散の梯子と上下限、`localStorage` 保持、`Ctrl` + `=` / `-` / `0` と設定メニューのピッカー、既定は現状維持) - 参加者パネル(一つのリスト、種別ごとのグループと件数、参加者ごとの色、オフラインの薄い表示、部屋ソケット、セッションの生死と終了コード、索引が記録するセッション ID とそのコピー、接続方法・起動コマンド・作業ディレクトリ・開始時刻・ウィンドウ、セッション自身が知らせるモデル・エフォート・5 時間・週次・コンテキスト、走っているアカウントが何をしているか) - 5 時間・週次のリセット(#306、#320、「[セッションは自分の様子をステータスラインで知らせる](3-accounts.md#セッションは自分の様子をステータスラインで知らせる)」。Claude Code の席はステータスラインの `rate_limits.five_hour.resets_at` / `seven_day.resets_at`、Codex の席は rollout の同じ窓の `resets_at` から読むこと、行をパネルの全幅に広げ、1 行目の左に名前、右に文言と % を並べ、2 行目にバーを全幅で出すこと(Claude デスクトップと同じ並び。コンテキストの行も同じ並び)、5 時間は「4時間10分後にリセット」の形、週次は「2:00 (月) にリセット」の形(曜日つきの現地時刻)で出すこと、分の切り上げと 1 日以上での分の省略、分が変わるたびの書き直し、幅が足りないときは文言が「…」で縮み % は縮まないこと、リセット時刻を過ぎたら消すこと、届いていない窓と「—」の行には出さないこと、「制限中」の札を変えないこと) - アカウントのモーダル(作成・編集・削除、決定と取消、2 クリックの削除、走る行の表示、#304 から横のメニューで分けた項目) - アカウントごとの端末(リストの行で選ぶ、行からの終了、切り替えで残るスクロールバック) - 画面の再読み込みに耐えるセッション(席の台帳が起動の記録を持ち、画面が席を見て端末を購読し直す。スクロールバックは戻らず、繋ぎ直した端末は切れた位置を 1 行書いてから開く) - 行の操作の記号表示(開始 ▶ と同じ列に替わって出る終了 ■(#239、#241 から開始と同じ色) / メニュー `⋯`、#221 から絵文字ではなく線画、語は `aria-label` と `title`、幅を固定した列)と、終了の確認ダイアログ(webview 内の ``、取消に焦点、Escape は取消) - 行のメニュー(#224。行の右クリックと `⋯` で開く同じメニュー、端末を開く・編集・色を変える・区切り線の下の開始(#239、#241 で先頭から移した)または危険色の終了、使えない項目を出さないこと(開始と終了は行えない方を出さない)、面を開く「端末を開く」、モーダルを「色」の欄で開く「色を変える」、矢印・`Home` / `End`・`Escape` の操作、外を押す・パネルのスクロール・窓の変化で閉じること) - アプリの終了時のセッションの後始末(走っているセッションがあれば確認のダイアログ、承認で一括終了してから閉じる、取消で閉じない、走っているものが無ければ確認を出さずに閉じる) - サイドバーの開閉(ヘッダ左右のボタン、同じ図形を CSS で裏返した鏡像のアイコン、幅 0 で畳む形、`config.json` への保持、`Ctrl+B` は左の面のみ、端末に焦点がある間はキーを端末へ渡す) - 診断面(アカウントごとの CLI の端末表示と入力) - 診断面のヘッダ(窓の名前「端末」、開いている端末のタブ、行との連動、面を畳む `✕`)と、面全体の角丸・一つの地・詰めた枠の余白。終了した端末はタブの `✕` で捨てる - 発言の端末への入力(#183 / #195。`deliver()` の後段で、起動の台帳から引いた発言者以外の各セッションの端末へ一行目の札と本文を打ち、間を置いて `\r` を別に送ること、札の `role`(画面のコマンドだけが `admin`、通知は `mcp`、アプリ自身の知らせは `app`(#294)、ソケットは名乗ったアカウントの種別で `admin` と `mcp` は `unknown`)、部屋から `post` フレームを送らないこと、送信キーを持たない本文、一本の列で順に打つこと、端末ペインのキーから打ちかけを読み保留した発言を届いた順に打つこと、札と `role` の重みと二行目以降の札の形を本文と読むことを述べる作法、サイドカーの channel の宣言と起動の行の `--dangerously-load-development-channels` を外したこと) - webhook の通知(#169。同梱の `github-webhook-mcp` ブリッジをアプリ自身の MCP クライアントとして起動、標準入力の終わりで終わる起動形、イベントが届くまで道具を呼ばない待ち受け、AI セッションの座る部屋すべてへの一件ずつの `post`、席を取らない発言者(#193 からはサーバの `mcp` アカウント)、床が問わないこと、座る部屋が無いときに出さないこと、イベントに印を付けないこと(#180)、連なりを一つにまとめて畳む表示) - 書き手の署名(#270 / #269。GitHub に本文つきで書くときに最終行へ `— <名前>` を置くよう言う作法の一項と、署名の無い書き込みの扱い、本文を今書いた種類と action の通知だけを `get_event` で読み直すこと、署名を読めた通知の先頭の `署名: <名前>`、読めないときの目印の無い通知、5 秒で区切る読み待ちと届いた順を保つこと、`mark_processed` しないこと) - 既読を促す一行(#410。部屋に流すすべての通知に `If this is your own operation, mark it processed now: event_id=` を URL の行の直前、URL が無ければ末尾に一度だけ付けること。署名の行は先頭のまま) - ローカル MCP サーバを種別 `mcp` のアカウントとして持つこと(#193。エントリごとのアカウントの作成とその id、`config.json` の `server` による対応、サーバのアカウントとしての通知の発言、発言とログが運ぶアカウント、種別による畳みと #193 より前の行の名前による畳み、パネルの `MCP` の見出しと行の語、サーバの節のアカウントの窓への移動、決定でのサーバの欄の保存、エントリが在る間の削除の拒否、起動の拒否、項目の無い設定メニュー) - フォームから作る `mcp` アカウント(#200。作成時にだけ出る種別 `MCP サーバ`、作成の窓のサーバの欄、決定でのエントリの書き込みとアカウントの保存とサーバの起動、アカウントの名前から決めて使われている名前と id を避けるエントリの名前、削除でのエントリの取り外しとサーバの停止と持っていた状態の破棄、作成後に種別を変えられないこと) - 設定メニューの表示の項目(#194 / #66。会話の文字サイズ・端末の文字サイズ・UI の大きさの三つのピッカー、画面上の寸法の操作はここだけであること(#209 でヘッダの二つを外した)、キーで変えた会話の値がピッカーに出ること、変えた時点で効くこと、`:root` の `--ui-scale` と `font-size` による UI の大きさ、会話面の寸法の割り戻し、`80%`〜`150%` の梯子、`localStorage`(`pullcept.ui-scale`)保持、既定は現状維持) - 設定メニューとローカル MCP サーバ(#172。タイトルバーの「設定」と同一 webview 内のダイアログ、`mcp-servers.json` の Desktop の形、ファイルが無いときの既定の書き出し、起動時の全サーバの起動、一覧と実行状態、コマンド・引数・環境変数の編集と保存(他の欄とエントリを残す書き込み)、ファイルから読み直す再起動、再起動で効くことの表示、標準エラーとアプリ自身の行を持つサーバごとのログ、設定ファイルを開くリンク) - 画面の人の発言の右寄せ(#185。画面の名前との一致による判定、ライブと読み戻しと拒否が返した発言に共通の規則、通知の畳みは左のまま。色の線と見出しの右寄せは #225 で丸印も名前も持たない吹き出しに代わった) - 画面の人の発言の背景色(#187。発言者の色 `--speaker` をページ背景に薄く混ぜた吹き出し。ライトとダークの両方で本文の文字色が読める明度に留め、ライブと読み戻しで同じ色。AI と webhook の行は背景なしのまま) - ゴーストボタン(#221。画面のボタンを枠も塗りも無い線画のアイコンにし、カーソルの下でだけ `--hover` の塗りを出す形、名前とキーのツールチップ、選択を `--selected` の塗りで言う形、塗るのは送信だけであること、欄とダイアログの語のボタンは枠を残すこと、線画を `src/main.ts` の一か所に持つこと) - 入力欄の囲み(#222。本文と操作列を一つの角丸の箱に収める形、枠を箱が持ち焦点で `--accent` に変わること、左のゴーストボタンと右の塗りの送信、`@` を打つだけの宛先のボタン、添付のボタンの置き場所(#223 で埋まった)、一行に収めて末尾から落とすキーの案内、placeholder から案内を外したこと) - 添付(#223。添付のボタン・入力欄へのドロップ・文字を持たないクリップボードの `Ctrl+V` の三つの入口、本文の上に並ぶ名前の札と `✕`、送るときにトピックの下へ保存すること、ドロップしたファイルの写し、本文の後ろの `添付:` とパスの行、保存の失敗と床の拒否で札が戻ること、送り直しで保存し直さないこと、届く名前の整え方と同じ名前の番号付け、トピックの削除で添付も消えること) - 会話面・トピックの一覧・参加者パネルの見た目(#225。発言の色線に代わる頭文字の丸印、広げた行間、日の区切り線と時刻だけの行、続けて送った自分の発言の一塊と最後の一つだけの時刻、タイトルバーの開いているトピック名と人数、見出し横の + になった「新規」、ホバーと焦点の間だけの `✕`、今日 / 9月28日 の短い日付、状態の札と `--ok`、数と棒の使用率、「詳細」に畳んだ起動の値と待ち受けていないときの見出しの危険色) - 設定・添付・送信の線画(#234。タイトルバーの「設定」の歯車・斜めのクリップ・紙飛行機、Tabler Icons の三つを 16 の格子へ写した形、`NOTICE.txt` のライセンス表記) - 最新の発言へ戻るボタン(#243。一番下から 40px より上を読んでいる間だけ出ること、新しい発言の追従と同じ判定、押すと一番下へ移って消えること、会話面の下端の中央に浮かせて会話面と入力欄の高さを変えない形、地と枠と影を持つ丸いボタン、Tabler Icons の `chevron-down` を 16 の格子へ写した線画、語は `aria-label` と `title`) - アカウントの画像(#236。アカウントの窓の「画像」の欄と「選ぶ」「外す」、画面の側で中央を正方形に切り抜き 128×128 の PNG にすること、png・jpeg・webp・gif を読むこと、決定まで書かないこと、`avatars/` に id をファイル名にして置くこと、`config.json` の `avatar` の有無だけの欄、発言の行と通知の畳みの丸印に行のアカウント id で引いて出すこと、読めない画像は黙って頭文字に戻すこと、アカウントの削除で画像も消すこと) - 参加者パネルの丸印(#253。行の名前の前の点を会話面と同じ関数で描く丸印に置き換えること、席が宣言したアカウント・居ない行ではリストのアカウントで画像を引くこと、ゲストは頭文字、`mcp` は通知の畳みと同じ丸印、オフラインの行は名前と同じだけ薄くすること、直径を `rem` で取り UI の倍率に連れること(#253 ではおよそ 1.4rem、#258 で 2.31rem・頭文字 1.2375rem。#260 で会話面の文字サイズの 2.31 倍・頭文字 1.2375 倍に移し、会話面の丸印の 1/1.15 をどの設定でも保つ)、画像は会話面と同じ一度読んだものを使うこと) - 画面の人の色のその場での反映(#189。画面の人の行が指す部屋の一つの値、アカウントの保存と起動時にその値を書くこと、読み戻した行もアカウントの色で出ること、この後の発言は席の宣言し直しで新しい色になること) - アプリのアイコン(#246。透明地に青 `#1e9be8` の吹き出しと白い三つの点、元にする `src-tauri/app-icon.svg` とその根の `color` の一か所にある色、`tauri icon` で作る `src-tauri/icons/` の全部、`bundle.icon` が指す名前を変えないこと、PNG と `icon.ico` の透明地) - 窓の題を残すこと(#246、#248。題は `Pullcept` で、タスクバーのサムネイルと Alt+Tab が読む。#248 の `WTNCA_NODRAWCAPTION` で最上部の文字だけを描かせない処理は、標準の枠が無くなった #252 で外した) - タイトルバーを窓の最上段にすること(#252。`decorations: false` で標準の枠を外すこと、帯の高さを変えないこと、地を `--surface` にすること、左端の `src-tauri/app-icon.svg` のアイコン、右端の最小化・最大化(元に戻す)・閉じるの線画のボタンとカーソルの下で赤くなる閉じる、窓の大きさが変わるたびに問い直す最大化の名前と絵、`data-tauri-drag-region="deep"` で帯を掴んで動かすこととダブルクリックの最大化、閉じるが `close` で今の終了の問いを通ること、`core:window:allow-close`・`allow-minimize`・`allow-toggle-maximize`・`allow-start-dragging` の権限、`windows` クレートの依存を外したこと) - アプリ自身の発言の丸印(#340、「[会話面の見た目](2-screen.md#会話面の見た目225)」。部屋が `app_origin` から刻む `from_app` の印を `RoomMessage`・拒否が返す発言・ログの行に載せること、ログと拒否では `true` のときだけ書くこと、その印で丸印に `src-tauri/app-icon.svg` を余白付きで出すこと、名前 `Pullcept` では決めないこと) - Windows CI(`npm ci` と Rust コンパイル確認)、Release 公開時の CD ## 実機で確認済み 確かめた者と日付を項目ごとに残す。**Master が画面を見て確かめたものと、AI が操作して確かめたものは分けて書く。** 前者は使う側にそう見えたことであり、後者は操作した側が経路を辿れたことである。同じ機能でも証拠の種類が違うため、混ぜると何が確かめられたのかが読めなくなる。分ける軸は操作した者と画面を読んだ者の組み合わせであり、この二つに尽きるとは限らない——一方が操作し他方が読んだ場合は、そのまま第三の見出しとして立てる。上の「実装済み」に載っていることは、この節に載る条件ではない——実装されていることと、実機でそう動いたことは別である。 ### 2026-08-21 確かめた者は記録に残っていない。この分け方は 2026-08-24 から始めたものであり、遡って当てはめない。 - **1 往復が成立した。** 部屋の入力欄からの発言が channel notification としてセッションへ届き、セッションが `say_to_room` を呼び返し、その内容が部屋のメッセージ一覧へ並んだ。CLI 側へ追加入力は与えていない。 - **channel サーバを 2 つ同時に読み込んだ状態で成立した。** 部屋のサイドカー(`pullcept-room`)と `github-webhook-mcp` の双方が同一セッションで機能した。#90 の premise は `--channels` 併記による二重登録の失敗のみを確定させており、複数の channel サーバを同時に有効化できることはここで初めて実測された。 未計測: 往復の所要時間。成立の可否のみを確認しており、秒数は取っていない。参考値として #90 の実測では push から返信 tool 呼び出しまで約 10 秒(モデル思考時間込み)。 ### 2026-08-24(Master が画面で確認) - **床を入れた後の同時発話(#47)。** 2 セッションでの実機観測。**未実装節の最も古い未計測項目がこれで閉じる。** 2026-08-22 の実測(互いの発言を受け取らない / どちらも `Claude Code` を名乗る)は #39 と #40 の修正前、2026-08-23 の二重応答は床の実装前のものであり、修正後の再計測がここまで済んでいなかった(「[床](1-room.md#床同時発話の順序付け)」)。 - **「考え中…」が出た。** 会話の途中で、走っている行の note として現れた(「[走っているアカウントが何をしているか](2-screen.md#走っているアカウントが何をしているか)」)。 - **「出力中」が CLI 内部の動きを映していた。** 語が指しているのは端末に届くバイトであり、そのとおりに出た。部屋へ発言が来ることまでは言わない——それは受容したトレードオフであり、[同節](6-tradeoffs.md#受容したトレードオフ)に書いてある。 - **操作の地色(#75)。** タイトルバー・入力欄・参加者の行・端末ヘッダ・アカウントのモーダルの操作と、選択中の端末タブが窓の地色で出ている(「[二つの地色](2-screen.md#二つの地色)」)。 - **端末の下辺の帯(#77)。** `.xterm-viewport` を描画から外した後の見た目。黒い帯とネイティブのスクロールバーの矢印が WebView2 上で消えている(「[診断面](2-screen.md#診断面)」)。 - **参加者パネルの見出しの語(#78)。** 見出しが「アカウント」で出ている(「[参加者パネル](2-screen.md#参加者パネル)」)。 - **診断面のヘッダの三点(#68 の実機指示)。** ヘッダに色を敷かないこと、窓の名前が「端末」であること、枠と端末の間の余白が詰まっていること。指示が戻ったのと同じ日に、反映後の見た目まで確認している(「[診断面](2-screen.md#診断面)」)。 ### 2026-08-24(AI が操作して確認) - **「出力中」と沈黙 1 秒での消失(#82)。** `/status` の出力中に現れ、**約 1 秒の沈黙で消えた。** - **再読み込み後の引き取り(#84)。** `Ctrl+R` で再読み込みし、状態行に「〈名前〉 の端末に繋ぎ直しました。再読み込みより前の出力は残っていません。」が出て、行に `❌` が戻った。**端末の 1 行目の告知は読めなかった**——訂正は「[画面の再読み込みに耐える](3-accounts.md#画面の再読み込みに耐える)」に書いた。 - **終了の確認ダイアログ(#71)。** Escape で取消し、セッションは生き残った。`終了` で終了した。取消ボタン自身は押していない(下記「未実装」)。 - **終了したタブの `✕`(#68)。** 押すと端末が捨てられ、席が解放されて行が `▶️` へ戻った。 この日の操作では不具合も見つかっている(#89、その後修正済み)。修正後の窓は 2026-08-25 に入口から出口まで実機で辿られており(下記)、この日の記録が残していた欠けはそこで埋まっている。**ただしこの領域を計り終えたとは読まないこと**——窓の長さは取っておらず、一度部屋に入った後に接続を失う経路は通っていない。下記「未実装」を見る。 ### 2026-08-25(Master が操作、AI が画面を確認) 上の二つのどちらでもない組み合わせである。押したのは Master——使う側が実際に辿った経路であり——、その画面を AI が直接読んでいるため、ここに入っているのは伝聞ではなく画面の literal である。証拠の種類が違うので行を分ける。 - **起動から部屋に入るまでの行の語(#89)。** `▶️` を押し、CLI が `--dangerously-load-development-channels` の確認プロンプト(`Enter to confirm`)で止まっている間、Claude Lay の行は note が「起動中」、ライフサイクルの列が `❌` であった。同じ瞬間、Claude Lin の行は note が「未起動」、ライフサイクルの列が `▶️` である。**走っているセッションと起動していないアカウントが、実機で別の語を出している**——#89 が直そうとしていたのは、この二つが同じ「未起動」を出し、区別がボタンの側にしか残っていない状態であった。`❌` が同じ行に並んでいることも同時に見えており、語を入れ替えて終了の手段を落とす形にはなっていない。 - **行と状態パネルが同じ瞬間に同じ語を出していた。** 状態パネルは「セッション Claude Lay 起動中」「開始時刻 18:54」である。#89 の修正は、一つの画面に「走っている」の定義を二つ持たない形へ行をパネルへ合わせるものであり(「[参加者パネル](2-screen.md#参加者パネル)」)、その趣旨が二面の語の一致として実機に出ている。行が独立に正しい語を出したことではなく、二面が食い違わなくなったことがここでの観測である。 未計測: この観察には部屋に入った後の側が入っていない。観測の時点で端末はまだ確認プロンプトで待っており、セッションは部屋の名簿に現れていないためである。その先は同日の AI の操作で辿っている(下記)。語が出るまでの時間と窓の長さは、どちらの観察でも取っていない。 ### 2026-08-25(AI が操作して確認) - **起動から部屋に入るまでの行の語の三段階(#89)。** 同一セッションで連続して見ている。押す前、Claude Lay の行は note が「未起動」、点は輪郭、行は薄く、ボタンは `▶️` であった。`▶️` を押した直後、note は「起動中」、ボタンは `❌` へ変わり、状態パネルは「セッション Claude Lay 起動中」「開始時刻 18:56」、端末は `--dangerously-load-development-channels` の確認プロンプトで止まっている。確認プロンプトに `Enter` を返して CLI が部屋に入った後、**note は消えた**——点は塗りへ変わり、行の薄さも取れ、ボタンは `❌` のままである。状態パネルは「Claude Lay 起動中」のままであった。 - **在室中の行が何も言わない形は壊れていない(#82)。** 上の段階 3 がそれである。#89 は行の判定を状態パネルへ合わせる修正であり、語を増やした分だけ在室中の行が黙らなくなる余地があった。名簿に現れた時点で note が消えるため、走っている間の様子だけが同じ場所に出る形(「[走っているアカウントが何をしているか](2-screen.md#走っているアカウントが何をしているか)」)はこの経路で保たれている。 - **起動していない行は三段階を通して動かない。** 段階 2 と 3 のいずれでも、Claude Lin の行は「未起動」と `▶️` のままであった(拡大して確認)。窓の間だけ二つの行が別の語を出すのではなく、片方が遷移していく間もう片方が据え置かれることまで見えている。 - **行の `❌` でプロセスの木が落ちる(#85 関連)。** セッションを起こして行の `❌` で終了し、プロセスの一覧を PID で確認している。`pullcept (14044)` の下にいた `cmd.exe (28792)` と、そのさらに下の `claude.exe (11380)` が、いずれも終了後には消えていた。**孤児の有無を画面ではなくプロセスの一覧で見た観測はこれが最初である**——画面の側は席が空いたことしか言えず、#85 が閉じようとしているのは画面から見えなくなった後のプロセスだからである。落ちる仕組みは `TerminateProcess` ではなく、PTY の項目が捨てられて master が閉じ、ConPTY に繋がったプロセスが道連れになる経路である(「[アプリの終了](2-screen.md#アプリの終了)」)。 未計測: 語が出るまでの時間と窓の長さ。三段階の順序と各段階の見え方だけを確認しており、秒数は取っていない。一度部屋に入った CLI が接続を失った場合に note が「起動中」へ戻るかも、この経路を通っていないため見ていない。 未計測: **アプリの終了の一括 kill の経路そのものは通っていない。** 上で確認したのは行の `❌` の経路であり、一括の側が同じ結果になることはコードの読みによる推論である——どちらも PTY の項目を捨てる形を通るため同じ drop に落ちる、という導出であって、実機で見た値ではない。確認のダイアログも実機では出していない。**この二つは翌 2026-08-26 に通している**(下記)——この段落はその日までの状態の記録である。 ### 2026-08-26(AI が操作して確認) - **`cmd.exe /C` を経由して `--settings` の JSON 文字列が引数のまま届く(#99、「[アカウントはキャラクターを持つ](3-accounts.md#アカウントはキャラクターを持つ)」)。** 実際に走った行は `cmd.exe /C claude --dangerously-load-development-channels server:pullcept-room-… --settings "{\"outputStyle\":\"character_Lin\"}"` であり、子の `claude.exe` が受け取っている引数も同一であった。**引用符を含む引数がこの一段を素通りすることは、それまでコードの読みによる推論であった**——Windows でこのアプリが挟む一段であり、ここで壊れればキャラクターの欄は実機で効かない。 - **共有した作業ディレクトリで、宣言したキャラクターの人格が立った(#99)。** 共有ディレクトリ `C:\Users\smile\Claude` から `character_Lin` を宣言したアカウントを起動し、そのセッションが Lin として発話している(端末の出力に `Lin:` の名乗りと口調)。欄の編集と保存、走る行の表示への反映も同日に確認した。 - **後から起動したセッションが、先行の登録を名指して止めている(#103、「[セッションは自分以外の部屋の登録を起動しない](3-accounts.md#セッションは自分以外の部屋の登録を起動しない)」)。** 共有ディレクトリで Claude Lay → Claude Lin の順に起動している。`claude.exe 8904`(Lay、先)の `--settings` は `{"outputStyle":"character_Lay"}` のみ、`claude.exe 7096`(Lin、後)の `--settings` は `{"disabledMcpjsonServers":["pullcept-room-2d8f9a1a-…"],"outputStyle":"character_Lin"}` であった。先発の側に名指しが無いのは止める相手が居ないためであり、前回起動の登録は死んだアドレスを持つため名指しの対象に入らない(「[`.mcp.json` の登録単位](3-accounts.md#mcpjson-の登録単位)」の掃除と同じ述語である)。 - **部屋型サイドカーの本数が 1 本落ちた(#103)。** 各セッション 2 本である。修正前は Lin 側が 3 本であり、**余計な 1 本が消えた**。残る 2 本目は `pullcept-room` 接頭辞ではない古い登録であり、名指しの対象外である——死んだアドレス宛のため部屋には入らない。 - **名簿の重複が消えた(#103)。** AI は 2 行であり、Lay と Lin が一人ずつである。同じ参加者が二人現れる状態(「[セッションは自分以外の部屋の登録を起動しない](3-accounts.md#セッションは自分以外の部屋の登録を起動しない)」)が、この経路で閉じている。 - **止める一覧を持つ側の部屋の往復が生きている(#103)。** マスターから Claude Lin へ投げ、返答が届いた。自分の部屋の登録まで止めてしまえば沈黙として現れる経路であり、本数と名簿とは別の軸として確認した。 - **アプリの終了の確認ダイアログが出た(#85、「[アプリの終了](2-screen.md#アプリの終了)」)。** #97 の修正を実機で確認した操作の中で辿っている。走っているセッションがある状態でウィンドウを閉じ、`Claude Lay のセッションが走っています。…` が出た。 - **取消でアプリもセッションも残った(#85)。** ウィンドウは在り、当該セッションは「起動中」のままであった。 - **承認した後に CLI のプロセスが残っていない(#85)。** `pullcept (24408)` → `cmd.exe (28032)` → `claude.exe (6408)` の三つとも消えたことを PID で確認した。**一括の側を実機で通したのはこれが最初である**——2026-08-25 に PID で見たのは行の `❌` の経路であり、一括が同じ drop に落ちることはコードの読みによる推論であった(上記)。ここで取ったのは推論ではなく実機の値である。 - **走っているセッションが無ければ確認は出ず、そのまま閉じた(#85)。** 未計測: 先に起動した側(Lay)が Lay の人格で発話するところは見ていない。この側について確認したのは、走る行に `character_Lay` の `--settings` が載っていることと、名簿に Lay が一人現れることまでである。共有したディレクトリで 2 アカウントがそれぞれの人格で立つことのうち、発話まで辿ったのは後発の Lin の側だけである。 ### 2026-08-27(AI が操作して確認) - **締め出しを起こしていたのは webview の再読み込みであった(#108、#84)。** PC のスリープから復帰した直後、部屋は空であった。状態行は「Claude Lay、Claude Lin の端末に繋ぎ直しました。再読み込みより前の出力は残っていません。」であり、席の引き取り(「[画面の再読み込みに耐える](3-accounts.md#画面の再読み込みに耐える)」)が走ったことをアプリ自身が言っている。「[床](1-room.md#床同時発話の順序付け)」が描けない原因として並べた二つ——スリープと webview の再読み込み——のうち、実機で当たったのは後者である。 - **拒否が返した発言がその場で描かれた(#108)。** 一通目の投稿が拒否され、取りこぼしていた 2 件が部屋に並んだ。状態行は「送っていません。書いている間に届いた発言 2 件を下へ描きました(Claude Lay、Claude Lin)。読んでから送るか決めてください。」であり、**述べている件数は画面に並んだ行数と一致している。** 入力欄の本文も保持されていた。 - **描かれた行が宣言した色で出た(#108)。** 当該の 2 アカウントはいずれも `hue` に `250.0` を宣言しており、二行とも同じ青で並んだ。拒否が色を運ばず名前から引き直す形であれば、名前の違う二人は別々の色になる——「[床](1-room.md#床同時発話の順序付け)」の「色は発言に載せて運ぶ」が、ここで実機の値になった。 - **読み直した後の二通目が通った(#108)。** 部屋にマスターの発言が載り、Claude Lin が返答した。**描けなかった → 透かしが進まない → 拒否される → 描く機会が来ない**(「[床](1-room.md#床同時発話の順序付け)」)の閉路から、他の参加者の新しい発言を待たずに抜けている。 未計測: 保持窓(512 件)から溢れた場合の挙動。この日の取りこぼしは 2 件であり、溢れる経路は通っていない。 ### 2026-08-28(AI が操作して確認) `main`(`97920a0`)を焼いて操作している(#118、#122、「[サイドバーの開閉](2-screen.md#サイドバーの開閉)」)。 - **`panels` 欄を持たない既存設定がそのまま読めた(#118)。** 当時の `config.json` はアカウント 3 件のみを持ち、`panels` を持っていなかった。起動すると両方の面が開いた状態で出て、アカウント 3 件も残っている。**この欄を持たない設定は両方とも開いた状態として読む**(「[サイドバーの開閉](2-screen.md#サイドバーの開閉)」)が、`#[serde(default)]` の移行経路として実機の値になった。 - **アイコンが鏡像で出た(#118)。** 縦線の入った角丸の四角であり、左のボタンは縦線が左、右のボタンは縦線が右である。高さは文字サイズの `