Repository navigation
6 tradeoffs
native ID は初回の実会話で取得するため、起動直後にはまだ再開 ID が無い。ID のためだけのモデルターンや空 thread の事前割当を避け、通常の個別 hook 信頼を利用者に委ねる。未信頼の間は ID を得られないことを診断面で案内する。
対応基準は 0.160.0。project config/hook discovery/会話保存形式への依存を mcp-config::codex と専用補助スクリプトに置く。linked worktree の hook は CLI が root checkout へ解決するため、同じ repository と相対位置を metadata で検証してから追記する。CLI の変更で一致を確認できなければ推測で登録せず拒否する。
キャラクターは信頼済み project の .codex/output-styles から installed Li+ helper v1 で選び、専用 SessionStart handler が全文を一回配送する(#281、選択契約)。Python 3.11 以上、loader 配備、native project と handler 個別の信頼が必要となり、プレビューでもモデル不要の project discovery と helper process が加わる。本文は argv に載らず、長さによる8191文字制約を避けられる。登録・信頼・v1 応答を確認できなければ起動を拒否する。selector も style フォルダーも無い移行前 project は inline 互換を維持し、そこでの二回の prompt discovery と CLI prompt 形式依存、8191文字超の明示拒否を受容する。共通指示と AGENTS/Li+ は保持するが、競合する人格指示の遵守保証は持たない。MCP は部屋の作法だけを持つ。状態の五値(モデル・effort・5h・週間・コンテキスト)は rollout から読み、最初の会話までは表示されない(#283、#286)。
| 決定 | 代償 |
|---|---|
| Claude の親の再開は端末への指示で確かめる(#357、#401) | 指示は会話の一ターンとして記録に残り、まだ止まっていれば試すたびに一つ増える(間は 1 分から 15 分へ広げる)。Claude には Codex の account/rateLimits/read にあたる、会話を使わない問い合わせが無い。答えが無ければ別の原因とみなして打ち直さないので、選択画面に指示が重ならない代わりに、その席は人が端末で見るまで止まったままである。解除予定の分からない停止も、次の拒否が解除予定を名指すまでは自動では試さない。止まったまま起動し直した席の予定は、その親記録の起動前の末尾 4 MiB にある最後の拒否から組み直す(#366)。その範囲より前にしか拒否が無い席は自動では試さない。答えの無かった指示のあとに起動し直した席には、起動直後にもう一度だけ指示を打つ——起動し直すことを人の再試行と同じに扱う。席を占める端末の起動を照合しないため、止まった時と違う起動にも打つ |
| 制限中の投稿を預からない(Claude #401、Codex #403) | 止まっている席の端末にも部屋の発言が打たれ、それぞれが制限エラーのターンを一つずつ起こす。解除後に一通のまとめは渡らず、席は必要ならトピックの記録を read_room_history で読む。預かりと、それを本人だけ迂回する再開の合図の照合が、再起動で合図を捨てる原因になったため外した。Codex の席も、制限中に部屋の発言が来ないことが問題になり外した(Codex は制限中の入力を会話に残し、捨てない) |
| 許可待ちの席に預けた発言はメモリの中だけにある(#346) | 席を閉じたまま起動し直さなかったとき、Pullcept が落ちたときは、預かっていた発言はその席の端末へ届かない。発言はトピックの記録にあり、read_room_history で読める。待ちは数十秒から数分であり、利用上限の受け箱(#312)のようにファイルへ書くほどの長さではない。hook が待ちの終わりを取りこぼせば、次の合図まで預かったままになる |
| Codex の既定を app-server にし、明示した hook 方式を残す(#299) | 新規と設定値の欠落は app-server になる。保存済み false は hook 方式の選択として保つため、起動の道筋は二本残る。起動中の席は変えず、スマホ接続も別の opt-in のままとする。Desktop との共存や登録競合はこの既定変更では解決しない |
| Codex の app-server file mode は共通指示の native discovery を毎回行う(#303) | プレビュー・起動・再開で、キャラ本文の検証に加え、モデルを呼ばない debug prompt-input を二回行う。追加のプロセスと待ち時間を使うが、developerInstructions が利用者の指示を置き換えるため省かない。取得失敗は共通指示を落として進めず止める。各実行の上限は15秒・出力8 MiBである |
| Codex の app-server 方式で、方式をまたいだ再開はキャラが二重に残りうる(#299) | hook 方式で始めた会話を app-server 方式で再開すると(逆も)、前の方式で配った本文が会話の記録に残ったまま、新しい方式の本文が加わる。同じ方式の再開では起きない。記録から前の本文を消す手段が Codex に無いため受容する。気になれば新しいトピックで始める |
| Codex の app-server 方式は行き先の無い起動オプションを拒否する(#299) |
-p/--profile、--search などを持つアカウントは、この方式では起動できない。server・端末・会話のどこに載せるかを決められない物を省いて起動すれば、人が指定した動きと違う席が立つため、省かずに止める |
| Codex の app-server 方式で、アプリが会話の購読者として残る(#299) | 承認の問い合わせは購読者全員に届き、最初の答えが勝つ。アプリは答えずに読み流すので、答えるのは端末である。アプリの接続は席が閉じるまで残り、server は接続一つぶん多く送る |
| Codex の app-server 方式で、server が job object に入るまでの隙間(#299) | server の cmd.exe は作られた直後に job object に入り、その後に起動する子は job を継ぐ。job に入る前に cmd.exe が既に CLI を起動していれば、その CLI は job の外にあり、アプリのプロセスが強制終了されたときに OS に止められない。端末の見張りとアプリの終わりの止め方(木ごとの taskkill)は、job の内外を問わず働く |
| Codex の app-server 方式は空の会話に印を一つ記録する(#299) | 新しい会話の記録の先頭に、キャラの本文の後へ developer の発言一つ(席として開いたこと)が残る。モデルは呼ばず、キャラの口にも言葉を入れないが、会話の記録には残る。turn/start で最初の部屋の発言を打つ方法は、モデル呼び出しがかかり、利用上限の預かり(#294)を迂回するため選ばない |
| Codex の部屋の MCP を起動の行だけで渡す(#297) | 定義は Codex の -c の書式(インラインの TOML 表)に乗り、起動の行は定義のぶん長い。ファイルに書けば短くなるが、そのファイルを -c が丸ごと置き換えていたため、書く利点が無かった。以前の版の欄は起動した有効 cwd のぶんしか消えず、他のフォルダーに残った無効の欄はそこで席が起動するまで残る |
| 単一ベンダー構成 | 常駐エージェントが同一の利用枠を共有する |
| Node サイドカー方式 (b) | プロセスが増える |
| channel の早期採用 | experimental 仕様の変更がアプリへ波及する。#195 で部屋の入力路からは外れ、残るのはアプリ自身の webhook の受信だけである |
| 端末のタブと参加者の行が同じ選択を持つ(#68) | 一つの選択を二つの面が描く。#59 が名簿から外した重複と逆を向く |
| 終了した端末をタブが閉じられるまで残す(#68) | 放置されたタブのぶん、スクロールバックがメモリに残る。#57 は「読んだら消える」でこれを避けていた |
| 再読み込み後の端末を席から繋ぎ直す(#84) | 戻るのは出力・入力・終了だけであり、スクロールバックは戻らない。過去の出力は消えた xterm のインスタンスに在り、他のどこにも無い |
| 「出力中」が端末の出力だけを言う(#82) | 「出力中」と出ても部屋へ発言が来ないことがある。語は部屋への到着を主張していないため受容する(Master、2026-08-24) |
| 「待機」が端末の沈黙だけを言う(#148) | 入力待ちと確認プロンプトでの停止が同じ「待機」に出る。区別には CLI の出力を読む必要があり、#82 の判断を維持するため受容する(Master、2026-09-17)。利用制限だけは #161 が使用率で切り出した |
| 「制限中」が使用率の報告に乗る(#161) | 数字はセッションが動いたときにしか更新されない(#155、決定4)。止まったまま制限にかかった場合、次に動くまで「制限中」は出ない。逆に、制限が解けても次の報告までは立ったままである。hook の経路(#149)はこれを狙って入れたが、一度も発火を観測できなかった(Master、2026-09-18)——観測できない経路を残す側ではなく、遅れて正しくなる側へ倒した |
| 「制限中」にリセット時刻を添えない(#161) |
rate_limits.*.resets_at は届いているのに使わない。名前と note が分け合う桁は 148px 前後であり、決定5 の例の形はそれだけで 102px 前後を取る。残るのは全角 4 文字に足りず、「マスター」が入らない。添えれば ellipsis を持つ名前の側が縮み、色を担っている名前が消える。2 文字の名前なら収まるが、名前の長さで語の形が変わるほうが悪い |
| 「制限中」が再読み込みを越えない(#161) | 報告は届いた時点の画面にしか無く、拾い直した端末は使用率を知らない。パネルの五欄(#155)と同じ形である |
自前の --settings を持つ行にステータスラインが載らない(#155 / #161) |
そのアカウントは五欄が「—」のままであり、「制限中」も出ない。承認(#143)と同じ例外の内側であり、ステータスラインのために --settings の併記の拒否を広げない |
| 起動したセッションで利用者のステータスラインが出ない(#155) |
statusLine はリストではないため上の層が丸ごと勝つ。その人が書いた行は、このアプリから起動したセッションでは出ない。合成するには利用者の設定ファイルを読むことになり、CLI に合わせて保つものが一つ増える。キャラクター(outputStyle)が既に持っている形である |
| Codex の rollout の行の形に依存する(#283) | 五欄の出所は Codex が公開していない会話記録の形であり、2026-10-05 の 0.160.0 の観測だけに基づく。版が変わって読めなくなった欄は「—」になり、止まらないことだけを保証し、読めることは保証しない。Codex はステータスラインのコマンドを持たず、他に五欄の出所が無い |
| Codex の席の「止まった」が rollout の行の形に依存する(#294) | 停止の判定は task_complete の error.codex_error_info が usage_limit_exceeded であることで、2026-10-05 の 0.160.0 の観測だけに基づく。版が変わって読めなくなれば、止まった席は「制限中」にならず、発言は今までどおり打たれ続ける(#294 以前の形に戻るだけで、止まらない)。使用率は止まった席で 99 のまま動かず、代わりにならない |
| app-server に繋がらなければ Codex の席は「制限中」のまま(#294) | 解除の確認は account/rateLimits/read の ordinaryUsageAllowed: true だけである。繋がらない・壊れた答えのあいだ、席は解除後も「制限中」のまま、再開の指示は打たれない。席を起動し直しても、印が残っているので止まった状態から始まる(#312)。プロトコルが使用率と解除時刻からの推測を禁じており、推測で戻して失敗の連鎖を再び起こすより、止まったままの側へ倒した |
| 止まっている Codex の席の印は再起動をまたいで残る(#312、#403) | 印は再起動をまたいで残り、起動した席はそれがあれば止まった状態から始まって、すぐ聞き、解除なら再開の指示を受け取る。印は指示を打つ前に消すため、その間で落ちれば席は指示を受け取りそこなう。逆にすれば同じ指示を二度打ちうる。印は指示を打つかトピックを消すまで残る。指示を打つのは解除を確かめたときに席を占めている起動であり、止まった時と違う起動にも打つ |
| 停止と解除の知らせはその席の端末へ打たない(#294) | 部屋への停止・解除通知自体は本人へ打たない。解除確定後は別の再開の指示を一度打ち、その札に解除通知の既読位置を載せる(#389)。指示に 120 秒応答が無ければ別の原因として部屋に一度だけ知らせ、打ち直さない(#403) |
問い合わせごとに codex app-server を一つ起動する(#294) |
一回 0.5 秒未満のプロセスを、止まっている席についてだけ、多くても 1 分に一度起こす。常駐の接続を持たないため、席ごとのアカウントと環境をそのまま使え、daemon の寿命に依らない |
| Codex の再開した席は最初のターンまで五欄が「—」(#283) | rollout には前回の実行の値が残っているが、起動時点のファイル長から読むため出さない。前回の使用率を今回の値として出せば、解けた制限で「制限中」が立ちうる。Claude Code の席が次の報告まで「—」であるのと同じ形である |
| ステータスラインの JSON の欄名に依存する(#155 / #161) | 五欄の出所は CLI の欄名であり、CLI がどれかを改名すればパネルの一行が消える。5 時間と週次の二つは「制限中」の出所でもあるため、その二つが改名されれば語ごと消える。値そのものが目的である以上この依存は受ける。端末の出力を読まないこと(#82)は動いていない |
| 行に載せられない文字を持つパスではステータスラインを載せない(#155) | インストール先が C:/Program Files (x86)/… のような形であれば、その席の五欄は「—」のままになる。引用で包み直せば cmd.exe の引用の偶奇がもう一度反転し、以後この行に触れるたびに同じ計算をやり直すことになる。行を壊す側(#151)ではなく、載せない側へ倒した |
| 載せられないキャラクター名を宣言と読まない(#154) | 名前が line_safe_text を通らなければ、そのアカウントは既定の人格で立つ。非 ASCII の style 名はこれに当たり、日本語で名付けた output style は選べない。モーダルは保存の前にそう言うが、欄の側で拒否はしない。載せれば cmd.exe の引用の外側にその文字が立ち、行がそこで終わる(#151 の形)——--settings の JSON に載る他の値と同じ集合へ揃えた |
| 起動オプションを欄ごと落とす(#154) | 一つの引数が cmd.exe の反応する文字を持てば、その欄に書かれた他の引数も載らない。--dangerously-skip-permissions を書いていた席は、その起動だけ確認プロンプトの前に止まる。一つの引数だけを落とす形は採らない——フラグは行の次の引数を自分の値として取り、そこに在るのはアプリが載せた引数である |
| 載せられない command で起動を拒否する(#154) |
C:\Program Files (x86)\… のような綴りを command や再開コマンドに持つアカウントは起動できない。引用で包まれた形なら cmd.exe を通る場合があるが、通るかどうかは行の他の引数の " の数で決まり、このアプリはそれを計測していない。壊れた行を走らせる側ではなく、理由を名指して止まる側へ倒した |
| エントリの名前は作ったときのアカウントの名前のまま残る(#200) | 窓で作った mcp アカウントを後で改名しても、mcp-servers.json のキーとアカウントの id は作ったときの名前のままであり、ファイルを手で読む者には古い名前が見える。キーを改名に追随させれば、id(mcp-<エントリの名前>)か、アカウントとエントリの対応のどちらかが動く。id は一度与えたら変えない(#53)ため、キーも動かさない側へ倒した |
| 読み戻した行が宣言色を持たない(#115) | ログは hue を持たないため、トピックを開き直すと過去の発言は名前から導いた色で出る。同じ名前を名乗った二人は一色になる。画面の人の行だけはアカウントの色で出る(#189)。誰も宣言していない色を保存しないことの代償である |
| セッション id の置換子を起動オプションへ書く(#115) |
#156 で外れた。 受け入れていたのは「どのフラグが id を運ぶかは CLI ごとの問いであり、アプリが一つのフラグを持てば claude 以外で外れる」ことだった。代償は書き忘れであり、それが 2026-09-17 に出た(アカウント一つにセッション id が配られていなかった)。答えを種別ごとに持たせれば、アプリはフラグを持ちながら claude 以外で外れない。書く必要が残るのは作法を持たない種別だけである |
| 索引をディレクトリと照合して建て直す(#115) | 遅延生成の安全性がこの照合に乗る。#115 の時点では AppHandle 依存のため cargo test の外に在ったが、#119 が crates/topic-index/ へ出した(「テストの配置」) |
| 死んだセッション id を次の再開の失敗で外す(#127) | 記録の位置は spawn の直後のままであり、会話ができた瞬間をアプリは知らない。会話の無い id は一度は書かれる。外れるのは #131 の事前判定が入って以降は起動の前であり、この行が言う「一回は失敗する」代償は、会話が在るのに CLI が拒む場合だけに縮んだ。判定を名簿の到着で行うため、再開そのものは成った上でサイドカーが部屋へ繋がらないまま終えたセッションも同じ扱いになる。そちらは戻り道を失うが、読み出し(上記「復帰の手段は二段構えである」)は残る |
| 再開の可否を CLI の保存場所で見る(#131) | 判定が claude の保存の形に依存する。CLI が増えれば crates/mcp-config/ の種別ごとの答え(Cli::transcript_path)を書き足すことになる。書き足すまでその種別は「分からない」を返し、記録は残る側へ倒れる——#156 より前は同じ状態が「会話が無い」と読まれ、記録が消えていた。加えて作業ディレクトリの綴りが長い場合、CLI は保存先の名前を切り詰めて自分のハッシュを付ける——その名前はアプリには作れないため、判定を行わずに記録を残したまま再開の線へ入る。そこは #127 の復帰が受け止める |
| トピックを離れてもセッションを止めない(#141) | 走っているセッションの数だけ利用枠を使い続ける。離れたトピックは画面に出ないため、止め忘れに気づく手段が一覧の印だけになる。止めて再開する形は取らない(Master、2026-09-17) |
| webhook の通知を AI セッションの座る部屋すべてへ入れる(#169) | 通知が走るトピックの数だけ、それぞれのログに webhook の発言が残る。反応による利用枠の消費(#32 の騒音の残り半分)も、この形の代償として受け入れる(Master、2026-09-27) |
| #193 より前の通知の行を名前で畳む(#169 / #193) | アカウントを持たない行で webhook と名乗った参加者の発言も畳まれる。#193 より前のログの行はアカウントを持たず、当時と同じに畳むには名前しか無い。#193 以後の行は種別で畳む |
| 畳みの見出しと色を描いた時点の値で残す(#193) |
mcp アカウントを改名したり色を変えたりしても、既に描いた畳みはトピックを描き直すまで前の名前と色のままである |
| 既定のブリッジを絶対パスで書き出す(#172) | ファイルは書いた時点の木の場所を指し続ける。リポジトリを動かしたり、別の作業ツリーから一度起動してその木を消したりすると、エントリは無いスクリプトを指し、サーバは「失敗」になる——アプリのデータディレクトリは識別子ごとに一つであり、どの木から起動しても同じファイルを読む。直すには欄を書き換えるか、ファイルを消して既定を書き出し直させる。起動のたびに探し直す形は採らない。ファイルが言う値とは別の値で走ることになり、画面に出る行と走る行が食い違う |
| MCP サーバの環境変数を平文で持つ(#172) | ファイルを読める者には値が読める。Desktop と同じ形であり、秘密の値はここに置かない前提である |
| MCP サーバの設定は保存しても再起動するまで効かない(#172) | 保存した直後は、画面の欄と走っているサーバが食い違う。画面はその間そう言う |
| 自分の channel を持つセッションへ webhook が二度届く(#169) | セッション自身の github-webhook-mcp の channel と、部屋の通知(#195 からは端末への入力)の両方で同じイベントを受ける。前者はその人の起動の行であり、部屋は外さない |
| 外部の知らせも利用者の発言と同じ区画に届く(#195) | 端末へ打った入力は、API の上では role が何であれ利用者の発言と同じ区画に入る。重みの区別は、札の読み方という AI 側の作法(サイドカーの instructions)に頼る。ヘッドレス(--print / stream-json)へ移れば区画を分けられるが、CLI のラッパーであることを保つ(#195 constraints) |
| 発言を端末の出力を見ずに打つ(#183 / #195) | 確認画面の上に届けば、その画面への入力として読まれうる。端末の状態を知るには CLI の出力を読む必要があり、#82 の判断を維持するため読まない。実機では未観測である |
本文の @名前 を送る時点の部屋の名前で読む(#206) |
書いてから送るまでに改名された参加者の @古い名前 は誰にも当たらず、本文に残って宛先にならない。部屋に居ない参加者の @名前 も同じである。宛先にするつもりのない @名前(人の話をしているだけの文)も、部屋の誰かに当たれば宛先になり本文から消える。候補で選んだ時点で結び付ける形(#204)なら前者は閉じるが、手で打った @名前 が宛先にならない形に戻る(Master 判断、2026-09-28) |
| 打ちかけをキーから読む(#195) | 上矢印で呼び戻した履歴は打ちかけと読めず、発言がその行へ連結されうる。確認への答えのキーは打ちかけと読まれ、次の送信か消去まで発言が待つ。入力欄そのものを知るには CLI の出力を読む必要があり、上と同じ理由で読まない。打ちかけの文字を消してから打つ形は、人の入力を失うため採らない(Master、2026-09-28) |
| 端末を持たない接続へは何も配らない(#195) | このアプリが起動したのではない接続には、発言が一件も届かない。channel が無くなり、押し届ける経路が端末しか無いためである。そうした接続は read_room_history で自分から読む |
| UI の大きさにパネルも従う(#194) | パネルは rem で幅を持つため、UI を大きくすると両脇のパネルが広がり、会話面の幅が減る。狭い窓では会話面がほぼ残らない。梯子の上端を 150% で止め、パネルは畳める(「サイドバーの開閉」)ことで受ける。パネルの幅だけを UI の倍率から外す形は採らない——幅が据え置きで文字だけが大きくなれば、パネルの中の行が切り詰められる |
| 起動途中の席は削除から見えない(#119) | 席は PTY が立つ前に確保されるため(Seat::Starting)、その窓の中に在るセッションには止めるものがまだ無く、削除はそれを終えられない。トピックが消えた後にその起動が完了すれば、セッション id はどのトピックにも属さないまま残る。押す操作が二つ同時に要る幅であり、席のロックと索引のロックを起動をまたいで両方持つ形を避けるほうを採る |