このブログの作品群 — ブラウザローグライク、リアルタイム音声AI、FirecrackerのmicroVM実験、このサイトのテーマ改修まで — は、すべてClaude Codeとのペア開発で作っている。正直に言うと、人間の私が書いたコードはほぼ0行である。
「AIにコードを書かせた」という話は今更珍しくない。この記事で書きたいのはコード生成の話ではなく、思いつきから本番デプロイまでのループ全体をどう回しているかというプロセスの話だ。直近の作品(ローグライク「風来のダンジョン」)がちょうど良い実例なので、これを軸に工程ごとに書く。
数字を先に出すと、このゲームは2日間でマージ済みPR 11本、コミット41、TypeScript+PHP約3,200行。その2日の中に、ゲーム本体だけでなくCI/CD構築、TypeScript移植、本番デプロイ、グローバルランキングのサーバーAPIまで含まれている。
全体のループ
運用しているループはこうだ。
思いつき
↓ 会話で形にする(仕様書は書かない)
Gitリポジトリ + PR単位の開発
↓ CIが品質を担保(人間は全コードを読まない)
masterマージ → 本番へ自動デプロイ
ポイントは、このループの全工程をClaude Codeが運転すること。人間の仕事は後述するとおり「体験・判断・GO」に絞られる。
工程1: 会話が要件定義になる
このゲームの始まりは、文字通りこの一言だった。
「demoにゲームでも作るか。HTMLの限界を示すようなゲーム。3Dランダムダンジョン探索とか。風来のシレンチックな。」
仕様書は書いていない。Claudeが選択肢(2Dローグライク vs 3D)を出し、「2dにするべ、ローグを作ろう」で方針が決まり、最初のプレイアブルが出てくる。以降の仕様は全部、遊んでみて出てきた要望の積み重ねだ。
「階段は降りるかどうかを選択させよう」
「スコアはゲーセンの格ゲーの3文字英語で」
「99階をラストにして100階でEDを作ろう」
対話ログがそのまま要件定義書になっている。あとから「なぜこの仕様?」となったときも、会話を遡れば意図が残っている。
工程2: フィードバックは「体感」と「スクショ」で投げる
人間からの入力で一番多いのはこの2種類だ。実例を3つ挙げる。
その1: 「。だと動かないから.に変えるか」。日本語IMEがONのままだと足踏みキー(ピリオド)が効かない、という報告。Claudeは「キーの文字ではなく物理キー(e.code)で判定する」実装に変え、IME ONを模した合成イベントでテストまで書いた。報告は一行、修正はPR一本である。
その2: スクショ1枚のバグ報告。階段の確認ダイアログで「降りる」が常に選択されて見える、というスクショを貼っただけ。CSSの静的スタイルが残っていたのが原因で、これもPR一本で終わった。
その3: 「ここまで強くなると戦闘に緊張感が全く無くなるな」。これが一番おもしろい例で、体感の報告が数値検証で裏取りされていく。Claudeの分析は「防御が敵の攻撃力を上回ると全ダメージが1に張り付き、HP511・自然回復ありでは数学的に死ねない」。対策として防御無視の会心・包囲ペナルティ・盾を錆びさせる敵を実装したら、今度は自動プレイの踏破率が0/12に崩壊した。死亡時の装備を出力させると全シードで「盾+0」— 錆の設定値が強化の投資を食い潰していたことが判明し、錆3%まで下げて着地した。「緊張感がない」という感覚的な一言が、シミュレーションの数値調整として決着する。この流れが個人的にはClaude Code開発の醍醐味だと思っている。
工程3: 品質はコードレビューではなくCIで担保する
ここが従来の「AIペアプロ」と一番違う運用かもしれない。私はClaudeの書いたコードをほぼ読んでいない。代わりに、信頼の置き場所をCIに移した。
- 機能・修正は必ずブランチ+PR。PR本文に検証結果を書く
- PR時: ESLint・型チェック・単体テスト・ビルドが走り、結果はChecksタブの右ペインに読めるレポートとして出る
- masterマージ時: 上記に加えて踏破シミュレーションが走る。自動プレイのボットが固定12シードで潜り、「踏破2〜10回・平均到達55階以上」を外れるとデプロイされない
3つ目が肝で、これは「ゲームとして成立しているか」という私の意図そのものを機械化したゲートだ。会心システムのような大改造をしても、ゲートが通るなら壊れていないと見なせる。人間の全数レビューより、意図をコード化したゲートのほうが、少なくとも個人開発ではよほど信頼できる。
CIの組み方自体は別記事に書いた。
工程4: 「検証してから報告」を流儀にする
Claude Codeには「実装したら合成データ・実API・ブラウザ操作でエンドツーエンド検証してから報告する」という流儀を仕込んである。実際、この2日間でClaudeがやった検証はこんな感じだ。
- スマホの誤タップ修正 → モバイル寸法のブラウザを自動操作し、「スライド→選択されない」「タップ→開く」を実際に確かめてから報告
- グローバルランキングAPI → 本番サーバーに対して、正常投稿・不正な名前・偽の踏破フラグ・スコア改ざん(
score: 99999999を送る)を実際にPOSTし、全部弾かれることを確認。検証で入れたテストデータはリセットしてから公開 - デプロイ後 → 本番URLをHTTPで叩き、新コードの反映を確認してから完了報告
「動くはずです」ではなく「動かして確かめた」まで含めて1タスク、という線引きにしている。
工程5: サーバー作業も同じループに乗る
グローバルランキングの追加では、Claude Codeが本番サーバー(Lightsail)にSSHして、PHPの動作確認・データディレクトリの作成・権限設定までやっている。技術選定も「なぜPHP?」と聞いたら「既にApache+PHPが動いているサーバーに1枚置くだけで、常駐プロセスも新しい運用物も増えない最小差分だから」という消去法の回答が返ってきた。
一方で線引きもある。デプロイ用のSSH鍵はサーバーのマスター鍵ではなく、書き込み先を1ディレクトリに制限した専用鍵を作らせた(強制コマンドrrsync付き)。リポジトリ公開前のシークレット監査や、公開そのもののような不可逆な操作は人間が実行する。自動化の範囲と、人間が握るスイッチを分けておくのが長く回すコツだと思う。
で、人間は何をしているのか
工程を並べると、人間の仕事は3つに絞られていることが分かる。
- 体験する — 遊ぶ、触る、スクショを撮る。「緊張感がない」「スライドすると誤選択する」は、実際に触った人間にしか出せない入力だ
- 決める — 優先順位(「これも2番目に優先で」)、方向(「ランキングもグローバル化するか」)、線引き(「誰でも本番にリリースできるのは不味いからPrivateに」)
- GOを出す — マージ、公開、リポジトリのvisibility変更。不可逆な操作の最終判断
コードを書く時間がゼロになった分、触って判断する時間が開発時間の大半になった。これは開発というより編集に近い感覚で、しかし成果物の量は一人時代の比ではない。
運用の鍵: 流儀はCLAUDE.mdに書いておく
最後に実務的な話を。ここまで書いたループが毎回同じように回るのは、Claude Codeの設定ファイル(CLAUDE.md)に流儀を明文化してあるからだ。
- 開発ループの標準(リポジトリ化→PR単位の開発)
- 検証の流儀(E2E検証してから報告、検証用サーバーは別ポート)
- セキュリティの線引き(公開前のシークレット監査、visibility変更は人間が実行)
これを書いてから、セッションをまたいでも「いつもの回し方」が再現されるようになった。プロセスを一度言語化しておけば、あとは毎回の会話が本題(何を作るか)だけで済む。ツールに慣れるとは、たぶんこういうことだ。
関連記事:


コメント