Skip to content

branch/switch/checkout が実gitと乖離:切替系が常に失敗し lane2/3 宛の注文が配達不可能 #37

Description

@yozure420

概要

ゲーム内の 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 statusgit 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 ステップを一度も作らない

実際の注文はすべて createLaneAwarePullOrderPayloadfrontend/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 と挙動が乖離
  • ミス統計(マイページ表示)に理不尽なミスが積まれる

修正案

  1. 切替系(checkout <branch> / switch <branch>)と git branch <name> / git checkout -b <name> は「現在ステップと一致すればステップ進行、一致しなくてもステップ外の自由コマンドとして実行可能」にする(既存の applyLaneSwitchWithoutStepAdvance / 自由作成パスを活かし、厳密一致チェックの早期 return を外す)
  2. git switch -c <name>git checkout -b と同じ扱いで対応する(またはコース1スコープ外として明示的に案内メッセージを出す)
  3. currentStep が null の場合のエラーメッセージを「今は注文がありません」等に修正する
  4. あわせて未使用の resolveRuntimeCommandLogic / LANE_SWITCH_OPTIONS / adjustCheckoutStepsForStartLane の要否を整理する

関連

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions