Try the app

あそびば
Enjoyed this article?
Support y hirock (ひろっきー)
Translation pending
バイブコーディングで作るゲーム集アプリを、Claude Code の当番が 3 分おきに issue → PR → マージまで回す体制。数字・仕組み・失敗と対策を具体的に。
Try the app

あそびば
Enjoyed this article?
Support y hirock (ひろっきー)
将棋・麻雀・トランプ・パズルなど 25 本のゲームを 1 本にまとめた iPhone アプリ「あそびば」を個人で作っています。この記事は、その開発を Claude Code に「社長」として任せ、人間は「会長」として決裁と QA だけをする体制の中身を、エンジニア向けに具体的に書いたものです。
最初に正直に書いておきます。このアプリはバイブコーディングで作っています。 人間はコードをほぼ書いていません。Swift のコード、テスト、CI の設定、運用スクリプトのほとんどは AI が書き、AI がマージしています。
品質はテスト・CI・別の AI による検証・人間の QA で担保していますが、完璧ではありません。リリース後に見つかる不具合もありますし、後述するように運用の事故も何度も起きています。「AI に任せれば全部うまくいく」という話ではなく、うまくいかなかった所をどう仕組みで塞いできたかの記録として読んでください。
最初のコミットは 2026-06-17、初回リリースは 6 月 25 日です。AI を社長にする体制は 8 月 10 日に始めました。
月コミット数(全ブランチ)main へのマージ(first-parent)6 月72207 月508 月585719 月2,19315410 月(15 日まで)1,070110
7 月はほぼ止まっていて、体制を切り替えた 8 月から急に伸びています。手が足りなかったのは「書く速さ」ではなく「止まらずに回し続けること」だった、というのが一番の実感です。
役割の分担は文書(docs/ai-company.md)に「憲章」として書いてあります。人間の関所は 3 つです。
ai:proposed で起票した issue に、人間が ai:approved ラベルを付ける。これが「ハンコ」PR のマージは会長の仕事から外しています。全リスク階層で AI がマージし、UX の品質は 2 の確認で担保する、という決め方です。お金・外部サービス・審査・広告方針などは「ハンコ事項」として AI が勝手に決められません。
AI 側は「社長」(対話セッションの Claude Code)の下に部署があり、実体はサブエージェントと定期実行スクリプトです。モデルは難易度で使い分けています。
役割実体モデル開発当番Scripts/ai-duty.sh(launchd・3 分おき)既定 Opus、model:fable ラベルの issue だけ Fable監査当番毎朝 5 時に前日のマージを読み直すFable経営企画室6 時間おきに issue 在庫の分析・起票Opus検証(verifier)書いた本人以外が diff とテストを確かめる実装者と同格以上調査・文言など社長が都度起動するサブエージェント簡単なものは Sonnet
開発の中心は Scripts/ai-duty.sh です。macOS の launchd が 3 分おき(StartInterval 180)に起動し、仕事があるときだけ claude -p を立ち上げます。仕事が無ければ AI は起動しないので、トークンも使いません。
1 回の流れはこうです。
gh を叩き、「承認済みで未着手の issue」「未解決の CodeRabbit スレッド」「レビュー未着の PR」などを探すmkdir で原子的に確保する(中に PID を書く)ai:in-progress を付けるrelease/vX.Y.Z から branch → 実装 → 触った範囲だけ swift test --filterrisk:logic / risk:ui / risk:sensitive のどれかを付け、受け入れ条件との対応表、UI 変更ならスクショを添えるswift test とアプリのビルド(xcodegen generate から)当番は 2 スロットで最大 2 体が同時に動きます。全体の仕事(PR の消化・孤児回収・出荷準備・通知)はスロット 1 だけが担当し、スロット 2 は issue 1 件の着手と自分の PR のマージだけ。CPU 同士を何百局も対局させる計測のような重い issue(duty:heavy)は Mac を何時間もふさぐので、手元の当番では拾わず、クラウドのセッションで実装して PR にします。クラウドの実行環境は Linux なので SwiftUI がビルドできず、純ロジックだけ手元で確かめ、全体は CI の macOS ジョブに任せています。
実測では、PR 作成からマージまで平均 21 分、うち CI が約 10 分でした。
AI がマージまでやる以上、「AI の注意力」に頼らない歯止めを機械側に置いています。
release/vX.Y.Z 向け。main は「公開済みの集合」で、docs/ Scripts/ .github/ だけ直接入れてよい。アプリコードを main に向けた PR は CI で落とすrisk:* が無ければ CI を赤にするgh の薄いラッパーを置き、信頼アカウント以外が書いた本文は AI に読ませる前に機械的に伏せる。ラッパーが効いていることを起動前に実測できなければ、当番は起動しないai:approved は「最新のラベル操作が信頼アカウントによる付与」のときだけ有効とする次の版の統合先として release/vX.Y.Z を作り、開発 PR はすべてそこに積みます。マイルストーンの残作業が 0 になると当番が「出荷準備」を検知し、版数を上げる PR(専用スクリプトだけが作る)を出して、会長に確認を依頼します。TestFlight へのアップロードは社長が fastlane beta で行い、署名は App Store Connect の API キーで済ませます。公開されたら release/vX.Y.Z を main に取り込み、タグを打ちます。
数字は毎朝、App Store Connect の API と GA4 から取り、スプレッドシートに日次の表とグラフを自動で書き出しています。これも launchd のジョブです。
ルールは「同じ注意を 2 回したら、次は人の注意ではなく機械で止める」です。代表的なものを挙げます。
1. 保留したのに 17 分後にマージされた社長が PR に「マージ保留」とコメントし、issue の ai:approved も外したのに、当番は気づかずマージしました。自然文のお願いは機械には届きません。→ ai:hold ラベルを新設し、gh ラッパーが gh pr merge そのものを拒否するようにしました(PR 本文の Closes #N から issue までたどって確認)。
2. 「Closes #N の束2」で issue が勝手に閉じたrelease 向けの PR では GitHub 標準の自動クローズが効かないので、Closes #N を正規表現で拾って閉じるワークフローを自前で持っています。大きな issue を 5 つの「束」に分けて順に PR を出していたところ、2 本目の本文の「Closes #N の束2(盤)」に正規表現が一致して issue が閉じ、当番の着手候補から消えました。本文には「この PR では閉じません(Refs)」と書いてあったのに、です。→ issue を開き直し、途中の PR は Refs、最後の束の PR だけ Closes に統一しました。
3. ハンコが 2 週間沈んだ決裁待ち(ringi:pending)の issue に会長がハンコだけ押すと、当番はコメントしか見ていなかったため、どの検知にも掛かりませんでした。→ ラベルのタイムラインを見て「ハンコが稟議の記録より後なら起こす」検知を追加。判定は純粋関数に切り出してシェルのテストで発火と停止の両方を確かめています。
4. 7 本並列実装で登録ファイルが衝突した新ゲーム 7 本を同時に並列で実装したところ、全員がゲーム登録ファイル(App/AppGameServices.swift)・Package.swift・project.yml に追記し、release を取り込み直すたびにコンフリクトを解く羽目になりました。→ 共有ファイルは「追加分だけ」触り、必須でない一覧テストは触らない、を PR の作法にしました。
5. DeviceHub を終了したら会長のシミュレータまで落ちたXcode 27 で Simulator.app が無くなり DeviceHub.app に変わりました。サブエージェントが自分の確認を終えて DeviceHub を終了したところ、会長が QA に使っていたシミュレータも巻き込んで落ちました。→ シミュレータは名前ではなく UDID で指定し、片付けは simctl shutdown を UDID 指定で行う。当番は「自分が起動した記録」があるものだけを落とします。
6. 破壊的コマンドと git stash並列エージェントの 1 体が計測のために git stash を実行し、他のエージェントの書き込みと衝突して作業が消えました。→ Claude Code の PreToolUse hook で rm -rf・git reset --hard・force push などを決定論的にブロックし、同じ worktree での並列編集は禁止、git 操作はサブエージェントに禁止と明示しています。
7. 権限の自動チェックで止まるブランチ保護を API で設定するとき、ヒアドキュメントで JSON を渡す書き方が自動の権限チェックに拒否されました。→ 安全装置を外すのではなく、gh api -f/-F のフラグ形式に書き換えて通すことにし、その形をメモに残しました。
8. 「クラウドで」が黙ってローカルだった重い計測をクラウドに出したつもりが、実際は手元の Mac で 5 本並列に走り、ロードアベレージが 49 まで上がりました。確認せずに「クラウドで動いています」と報告したのが一番の失敗です。→ 起動直後に実行場所を ps / uptime で確かめてから報告する、をルールにしました。
AI に任せるほど、人間の仕事は「どちらに進むかを決めること」と「実際に遊んで面白いか確かめること」に絞られていきました。逆に、決めたことを文書に残さないと AI は次の会話で忘れるので、docs/ と issue が会社の記憶そのものになっています。完成した仕組みではなく、毎週どこかが壊れて、そのたびに 1 行ずつルールとテストを足している途中の仕組みです。
そんなふうにして作っている「あそびば」は、通信なし・登録なしで遊べる無料のゲーム集です。気になった方は App Store で「あそびば」を探して、AI と人間の二人三脚の成果を遊んでみてください。
App Store:あそびば:麻雀 ポーカー ナンプレ 囲碁 トランプ ゲーム