概要
ゲーム内の git branch / git switch / git checkout について、実際の git コマンドとの整合性を調査した。
設計上のセマンティクス(branch は作るだけで移動しない、checkout -b は作って移動する、存在しないブランチには切替できない)は実 git と正しく整合しているが、#36 と同じ「現在ステップとの厳密一致チェック」により切替系コマンドが一切成功せず、結果として lane2/lane3 宛の注文は配達不可能(誤配達 -50点が確定) になっている。
※ 実ロジック(executeGameCommand / createLaneAwarePullOrderPayload)を直接呼ぶ検証スクリプトで確認済み。
実 git との整合性一覧
| コマンド |
実際の git |
ゲーム内の実挙動(検証済み) |
整合性 |
git branch(一覧) |
いつでも一覧表示 |
いつでも一覧表示できる |
✅ |
git branch <name> |
いつでも作成・切替はしない |
来客イベント注文の時だけ成功(切替しない点は正しい) |
⚠️ 部分的 |
git checkout <branch> |
既存ブランチへ切替 |
常に拒否+ミス記録 |
❌ |
git switch <branch> |
既存ブランチへ切替 |
常に拒否+ミス記録 |
❌ |
git checkout -b <name> |
作成して切替 |
常に拒否+ミス記録 |
❌ |
git switch -c <name> |
作成して切替 |
「❌ -c は存在しません」(-c ごとブランチ名として解釈) |
❌ |
| 存在しないブランチへの切替 |
エラー |
「❌ ○○ は存在しません」 |
✅ |
| 既存名で再作成 |
fatal エラー |
「既に存在します」(コード上は正しいが到達しにくい) |
✅(意図) |
検証結果(抜粋)
レーン2つ(main, akamaru-42)・lane2 宛の注文(ステップ: git status → git add ネギ → git commit -m "...")を受け、ラーメンが lane1 にスポーンした状態:
入力: git checkout akamaru-42 → ❌ 今は「git status」の番です(ミス記録)
入力: git switch akamaru-42 → ❌ 今は「git status」の番です(ミス記録)
入力: git checkout lane2 → ❌ 今は「git status」の番です(ミス記録)
入力: git checkout -b newlane → ❌ 今は「git status」の番です(ミス記録)
入力: git switch -c newlane → ❌ -c newlane は存在しません。
(git status 消化後)
入力: git checkout akamaru-42 → ❌ 今は「git add ネギ」の番です(ミス記録)
→ どのタイミングでも切替できず、lane2 宛の注文は誤配達確定。
原因
1. 注文生成が checkout/switch ステップを一度も作らない
実際の注文はすべて createLaneAwarePullOrderPayload(frontend/src/game/commandLogic.ts L313〜)で生成されるが、setup ステップは lane2=git status、lane3=git log --oneline のみで、切替コマンドを期待するステップが存在しない。
一方 handleGameCommand.ts の switch/checkout ハンドラ(L336)・git checkout -b ハンドラ(L274)・git branch <name> ハンドラ(L386)は、現在ステップの expectedInputs と一致しない入力を無条件で拒否する。期待されることがないコマンドは永遠に成功しない。
2. ステップ外実行のフォールバックがデッドコード化
本来「ステップ進行なしでレーンだけ切り替える」ための applyLaneSwitchWithoutStepAdvance(L354・L311 から呼ばれる側)や、git branch <name> の自由作成パス(L420)が実装されているのに、直前の厳密一致チェックの早期 return により到達不能。同様に gameEngine の adjustCheckoutStepsForStartLane、commandLogic の LANE_SWITCH_OPTIONS / resolveRuntimeCommandLogic 一式も未使用。
混入コミットは #36 と同じ c592e67(GmStartの仕様を変更)。
3. git switch -c 未対応
/^git (switch|checkout) (.+)$/i に -c <name> ごと吸われ、「-c <name> というブランチは存在しない」と解釈される。実 git では作成+切替。なお git switch はコース1ヘルプ(seed.py)に載っていないがコードは部分対応しており、扱いを決める必要がある。
4. メッセージ品質
ラーメン不在時・ワークフロー完了後に git branch <name> を打つと currentStep が null のため「❌ 今は**「」**の番です」と空の鉤括弧が表示される。
影響
- lane2/lane3 宛の注文が プレイヤーに回避手段のないまま誤配達(-50点)確定
- ヘルプ(
backend/seed.py L40-42)で教えている git branch <name> / git checkout <branch> / git checkout -b <branch> が実質使えず、学習ゲームとして実 git と挙動が乖離
- ミス統計(マイページ表示)に理不尽なミスが積まれる
修正案
- 切替系(
checkout <branch> / switch <branch>)と git branch <name> / git checkout -b <name> は「現在ステップと一致すればステップ進行、一致しなくてもステップ外の自由コマンドとして実行可能」にする(既存の applyLaneSwitchWithoutStepAdvance / 自由作成パスを活かし、厳密一致チェックの早期 return を外す)
git switch -c <name> を git checkout -b と同じ扱いで対応する(またはコース1スコープ外として明示的に案内メッセージを出す)
currentStep が null の場合のエラーメッセージを「今は注文がありません」等に修正する
- あわせて未使用の
resolveRuntimeCommandLogic / LANE_SWITCH_OPTIONS / adjustCheckoutStepsForStartLane の要否を整理する
関連
概要
ゲーム内の
git branch/git switch/git checkoutについて、実際の git コマンドとの整合性を調査した。設計上のセマンティクス(branch は作るだけで移動しない、checkout -b は作って移動する、存在しないブランチには切替できない)は実 git と正しく整合しているが、#36 と同じ「現在ステップとの厳密一致チェック」により切替系コマンドが一切成功せず、結果として lane2/lane3 宛の注文は配達不可能(誤配達 -50点が確定) になっている。
※ 実ロジック(
executeGameCommand/createLaneAwarePullOrderPayload)を直接呼ぶ検証スクリプトで確認済み。実 git との整合性一覧
git branch(一覧)git branch <name>git checkout <branch>git switch <branch>git checkout -b <name>git switch -c <name>-cごとブランチ名として解釈)検証結果(抜粋)
レーン2つ(main, akamaru-42)・lane2 宛の注文(ステップ:
git status→git add ネギ→git commit -m "...")を受け、ラーメンが lane1 にスポーンした状態:→ どのタイミングでも切替できず、lane2 宛の注文は誤配達確定。
原因
1. 注文生成が checkout/switch ステップを一度も作らない
実際の注文はすべて
createLaneAwarePullOrderPayload(frontend/src/game/commandLogic.tsL313〜)で生成されるが、setup ステップは lane2=git status、lane3=git log --onelineのみで、切替コマンドを期待するステップが存在しない。一方
handleGameCommand.tsの switch/checkout ハンドラ(L336)・git checkout -bハンドラ(L274)・git branch <name>ハンドラ(L386)は、現在ステップのexpectedInputsと一致しない入力を無条件で拒否する。期待されることがないコマンドは永遠に成功しない。2. ステップ外実行のフォールバックがデッドコード化
本来「ステップ進行なしでレーンだけ切り替える」ための
applyLaneSwitchWithoutStepAdvance(L354・L311 から呼ばれる側)や、git branch <name>の自由作成パス(L420)が実装されているのに、直前の厳密一致チェックの早期 return により到達不能。同様に gameEngine のadjustCheckoutStepsForStartLane、commandLogic のLANE_SWITCH_OPTIONS/resolveRuntimeCommandLogic一式も未使用。混入コミットは #36 と同じ
c592e67(GmStartの仕様を変更)。3.
git switch -c未対応/^git (switch|checkout) (.+)$/iに-c <name>ごと吸われ、「-c <name>というブランチは存在しない」と解釈される。実 git では作成+切替。なおgit switchはコース1ヘルプ(seed.py)に載っていないがコードは部分対応しており、扱いを決める必要がある。4. メッセージ品質
ラーメン不在時・ワークフロー完了後に
git branch <name>を打つとcurrentStepが null のため「❌ 今は**「」**の番です」と空の鉤括弧が表示される。影響
backend/seed.pyL40-42)で教えているgit branch <name>/git checkout <branch>/git checkout -b <branch>が実質使えず、学習ゲームとして実 git と挙動が乖離修正案
checkout <branch>/switch <branch>)とgit branch <name>/git checkout -b <name>は「現在ステップと一致すればステップ進行、一致しなくてもステップ外の自由コマンドとして実行可能」にする(既存のapplyLaneSwitchWithoutStepAdvance/ 自由作成パスを活かし、厳密一致チェックの早期 return を外す)git switch -c <name>をgit checkout -bと同じ扱いで対応する(またはコース1スコープ外として明示的に案内メッセージを出す)currentStepが null の場合のエラーメッセージを「今は注文がありません」等に修正するresolveRuntimeCommandLogic/LANE_SWITCH_OPTIONS/adjustCheckoutStepsForStartLaneの要否を整理する関連
c592e67が共通の原因)fix/add-and-branchNameブランチで ゲーム内で git add が実質使えない(git add . が常に失敗 / 全角スペースで具材が乗らない) #36 とあわせて対応予定