人が触る3か所
Issueを書く
型に沿って、背景、やること、受け入れ条件を書きます。受け入れ条件は、読んだ人によって結果が変わらない形にします。AIも同じ文を読むからです。
ラベルで承認する
ラベルai::approvedを付けた時点が、AIに任せてよいという承認です。付いていないIssueを、AIは拾いません。
MRを読んでマージする
差分を受け入れ条件と突き合わせ、mainに入れるかを人が決めます。マージのボタンは、パイプラインが通ったMRにしか出ません。
その間の実装、テスト、レビューの前さばきは、AIとパイプラインが受け持ちます。昼は10分おき、夜は22時のスケジュールで動き、流れはどちらも同じです。Issueを夕方までに承認しておけば、夜のうちにMRができ、朝の人はMRを読むだけで済みます。
1本のIssueがmainに入るまで
2026年10月2日の試走で、Issue #30が通った道です。書いた人をAさんとして追います。再生を押すと札が箱から箱へ移り、その場で動いた仕組みが吹き出しで話す作りです。下の段を押すと、その段へ飛べます。
- Aさんが、型
ai-taskでIssueを書きます。受け入れ条件は、テストのファイル名、確かめる呼び出しと結果、パイプラインが緑、変えるのはテスト1本だけ、の4行です。Aさんwarehouse_name('')が「不明」を返すことを、テストで固定したい。 - Aさんがラベル
ai::approvedを付けました。ここが人の承認で、付けるまでAIは何もしません。Aさん受け入れ条件まで書けたので、AIに任せます。 - 講師がmainで、変数
AI_CYCLEをonにしてパイプラインを動かします。研修の当日は、スケジュールが10分おきに同じことをします。GitLabAIのサイクル用に、パイプライン#89を作りました。 ai_pickが、承認済みで未着手のIssueを探します。見つけた3本にai::runningを付け、1本に1つのジョブを並べた子パイプラインを作りました。ai_pickのログ承認済みで未着手の Issue: 3 本- Runnerが、子パイプラインの3つのジョブを同時に動かします。Runnerは研修用のEC2の上にあり、8本まで同時に動かせる設定です。Runnerimplement-issue-30、31、32を並べて動かします。
- ジョブはラベルを確かめ直してから、Claudeに実装させます。Claudeが使えるのは、ファイルの読み書きと
php、git add、git commitだけです。implement-issue-30のログターン 7 / 費用 0.13 ドル / 終わり方 success - ジョブのスクリプトがpushしてMRを作り、Issueにコメントを付けます。Claudeにはpushの権限を渡していないので、ここはスクリプトだけの仕事です。ai-cycle-bot@AさんAIの実装サイクルがMRを出しました。
- MRのパイプラインが走ります。構文、ルール、テスト、AIレビューに加え、AIのMRでだけ
ai_scopeも動きました。ai_scopeのログOK 触ってはいけない場所は変えていません。大きさも目安の中です。 - Aさんが差分を開き、受け入れ条件と突き合わせます。変わったファイルは
tests/phpunit/WarehouseNameEmptyTest.phpの1本で、14行でした。Aさんテストが1本だけで、受け入れ条件のとおりです。 - 講師がマージします。MRの説明の
Closes #30によって、Issueは自動で閉じました。GitLab!13をmainに入れ、Issue #30を閉じました。
試走の記録
10月2日に、書き方の違う3本のIssueを1回の起動で流しました。3本は同時に動き、どれも1分前後で終わっています。
| Issue | 書き方 | 結果 | 時間 | ターンと費用 |
|---|---|---|---|---|
| #30 | 受け入れ条件を4行で書いた | 通るMR !13ができ、人が読んでマージ | 61秒 | 7ターン、0.13ドル |
| #31 | 受け入れ条件は「見やすくなっている」の1行だけ | 止まる実装せずに、質問を4つ返した | 63秒 | 5ターン、0.07ドル |
| #32 | 「決まっていないこと」に1行を書いた | 止まるClaudeを呼ぶ前に、ジョブが止めた | 48秒 | 0ターン、0ドル |
上限は1本あたり30ターンと25分です。9月30日の試走では、状態コードを1つにまとめる広めのIssueが、約20ターンと0.55ドルでコミットまで進みました。
パイプラインの3種類
MRのパイプライン
受講者やAIがpushしたとき、MRを作ったときに走ります。所要は1〜2分で、受講者のMRでは7つ、AIのMRでは8つのジョブが並びます。
サイクルのパイプライン
スケジュールか、mainで変数AI_CYCLE=onを付けたNew pipelineで走ります。コードの検査のジョブは動きません。
mainのパイプライン
マージのあとに走り、mainが緑のままかを確かめます。AIレビューは動きません。
