Codex と OpenCode のセッションを分岐する方法(UI/TUI から、またはスマホから)
適切な時点でセッションを分岐する実践ガイド。メッセージから分岐と最新から分岐の違い、分岐後にコンテキストがどうなるかを解説します。
- CLI
- 0.2.17
- プレビュー ref
- a2c45c8
分岐(フォーク)は、ただの枝分かれです。
元のセッションはそのまま残し、以前の時点から始まる子セッションを作ります。
このガイドは、Codex と OpenCode のセッションを分岐するためのわかりやすい手順です。
- それぞれの UI/TUI から(対応している場合)
- スマホやブラウザーの UI から(Happier はその選択肢の1つ)
正しく選ぶべきなのは、どこから分岐するかだけです。
要点
- 何から枝分かれしたいか決めます:
- 最新から分岐(「今」から枝分かれ)
- メッセージから分岐(もっと前から枝分かれ)
- Codex では:
- 最新のセッション状態からの分岐が確実です
- OpenCode では:
- OpenCode サーバーのバックエンドを使っていれば、サーバーネイティブのメッセージからの分岐が可能です
- デバイスをまたいで一貫した分岐 UI が欲しいなら、Happier は選択肢の1つです。トランスクリプト内に このメッセージから分岐(Fork from this message)があり、子セッションを自動で作ります。
「分岐」の意味(実際のところ)
分岐はコピー&ペーストではありません。
分岐とは:
- 新しいセッション ID
- 祖先のコンテキストがリンクされている
- 分岐点から先は新しいメッセージの流れ
元のセッションは変わりません。
最新から分岐とメッセージから分岐(選び方)
最新から分岐
使うのは:
- 今の方向性が気に入っている
- 別のアプローチを並行して試したいだけ
メッセージから分岐
使うのは:
- 分かれたい正確な瞬間を指せる
- 指示をきれいにやり直したい
方法 A: Codex の中で分岐する
Codex の対応状況は画面によって違いますが、ワークフローはたいてい次のような形です。
- 現在のセッションを分岐する(最新から分岐)
- 分岐したセッションを新しい枝として続ける
Codex で最新から分岐が適切な場面
最新から分岐が向いているのは:
- 別の実装経路を試したい
- 2つのアプローチを比べたい
- リスクのある変更の前に、安全な枝が欲しい
本当はメッセージから分岐したい場面
メッセージから分岐は「巻き戻したい」ときの手段です。
- 指示をきれいにやり直したい
- セッションが脱線し始める前に分かれたい
使っている Codex の画面がメッセージからの分岐に対応していない場合、よくある代替策はリプレイです。
- 新しいセッションを作る
- 元のセッションのように振る舞うのに十分なコンテキストを与える
(だからこそ、よい「分岐の UX」には必ずリプレイの経路があります。)
方法 B: OpenCode の中で分岐する
OpenCode はクライアント/サーバーの構成がしっかりしています。
OpenCode サーバーのバックエンドを使っていれば、サーバーネイティブのメッセージからの分岐が使えることがあります。
OpenCode のシンプルな判断ルール
- 枝分かれしたい正確なメッセージがわかっている → メッセージから分岐
- それ以外 → 最新から分岐
今使っている OpenCode の画面でメッセージからの分岐が使えない場合も、リプレイの代替策が当てはまります。
方法 C: スマホから分岐する(Happier)
スマホ、ブラウザー、デスクトップで一貫した分岐 UI が欲しいなら、Happier は選択肢の1つです。
実装に基づくと、次のようになります。
特定のメッセージから分岐する
これはとても役立つ分岐ですが、多くのツールでは意外と難しくなっています。
Happier では:
- セッションのトランスクリプトを開きます。
- 枝分かれしたいメッセージを探します。
- このメッセージから分岐(Fork from this message)を選びます。
大事な点が2つあります。
- 分岐ボタンは、そのメッセージを分岐点として使える場合にだけ表示されます。
- Happier はシーケンス番号で分岐する(
forkPoint: { type: 'seq', upToSeqInclusive })ので、分岐点が安定します。
知っておきたい小さな UX の工夫
確定済みのユーザーメッセージで分岐すると、Happier は「この指示をきれいにやり直す」として扱います。
- ユーザーメッセージの前で分岐する
- ユーザーメッセージの本文を、子セッションのコンポーザーに編集できる下書きとして戻す
そのため、次のことができます。
- 言い回しを調整する
- 足りなかった制約を1つ加える
- きれいに送り直す
セットアップ全体を書き直す必要はありません。
(実装に基づく説明: resolveForkFromMessageSemantics が restoredDraftText を生成し、それが子セッションの下書きに書き込まれます。)
最新から分岐する(今から枝分かれ)
正確な分岐点にこだわらないなら、最新から分岐も役立ちます。
実際には「今から並行スレッドを始める」手段です。
子セッションでのコンテキストの扱い
分岐後は:
- 祖先のメッセージが読み取り専用のコンテキストとして表示される
- 区切りの行(「…から分岐」)が挿入される
- 区切りの時点で親セッションを開ける
(実装に基づく説明: 祖先のメッセージは injectForkContextRows で注釈が付けられ、区切りの行は ForkDividerRow で描画されます。)
分岐後に表示されるもの
子セッションのトランスクリプトに、Happier は区切りの行を挿入します。
- 「…から分岐」
- 区切りの時点で親セッションを開くボタン付き
内部では、injectForkContextRows が祖先のメッセージに読み取り専用のコンテキストとして注釈を付け、ForkDividerRow が「親を開く」ディープリンクを提供します。
トラブルシューティング
「このメッセージから分岐」ボタンが見当たらない
よくある原因:
- この画面では、セッションやプロバイダーがメッセージからの分岐に対応していない
- 分岐点として使えない種類のメッセージを選んでいる
メッセージから分岐できない場合は、最新から分岐(またはリプレイ/新しいセッション)を使います。
分岐したセッションがコンテキストを失ったように感じる
たいていは、分岐の仕組みが想定より小さい初期コンテキストでのリプレイにフォールバックしたことを意味します。
対処は2つあります。
- もっと前で分岐する(祖先のコンテキストを多く含める)
- 分岐する前に、親セッションでチェックポイントの要約を頼む
新しい枝を作るのではなく、1つの指示をやり直したい
メッセージから分岐と、戻された下書きの組み合わせがまさにそのためのものです。ユーザーメッセージの前で分岐し、戻された下書きを編集して、送り直します。
よくある質問
分岐すると元のセッションは消えますか?
いいえ。分岐は子セッションを作り、元のセッションはそのまま残します。
修正を送るのではなく、分岐すべきなのはいつですか?
修正で方向性全体が変わる場合(またはリスクのあることをしようとしている場合)は分岐します。
ちょっとした補足なら、フォローアップを送るだけで十分です。
よくある間違い
- 分岐が遅すぎる(本当はもっと前の分岐点が欲しかった)
- メッセージから分岐が必要なのに最新から分岐を使う
- 何が変わったかをチームメイトに伝えずに分岐の判断を広める