共通の準備

AIカスタム研修 / 両日で使う環境・進め方・用語

2日間の演習に共通する環境、ブランチの付け方、記録の書き方、用語をまとめたページです。Day1 の最初に一度目を通し、あとは迷ったときに戻ってきてください。

演習環境の全体像

2日間の演習は、Claude Desktop、VSCode、GitLab の演習リポジトリ、GitLab CI の4か所を行き来します。指示を出すのが Claude Desktop、書かれたものを読んで直すのが VSCode、変更を出して機械に判定させるのが GitLab と CI です。

資料に出てくる D2 は貴社の PowerShell 版ハーネス、smart3pm は貴社の bash 版ハーネスの呼び名です。

人、Claude Desktop、VSCode、手元のフォルダ、GitLab、GitLab CI の6つを矢印でつないだ図。Claude Desktop の箱の中に入力欄と統合ターミナルの2つが入っている
2日間で行き来する場所の全体像です。Claude Desktop の箱が入れ子になっているのは、統合ターミナルがその中にあるためで、コマンドを打つときに別のアプリを開く必要はありません。矢印が CI から MR へ戻るところまでで1周し、その1周が演習1本にあたります。人の箱に書いた3つだけは、最後まで機械へ渡しません。
登場人物やること出てくる場面
受講者Issue の粒度を決め、指摘を採るか採らないかを決め、マージを承認します。2日間で人に残すのはこの3つです全演習
Claude Desktopプロジェクトを開いて指示を受け、コードと設定ファイルを書きます。統合ターミナルと worktree の操作も中にあります全演習
VSCode書かれたものを読み、手で直し、ソース管理ペインでコミットと同期を行います全演習
GitLabブランチ、MR、差分、パイプラインの結果を Web 画面で見せますハンズオン1 から3
GitLab CIlint / test / review / gate を全員の変更に同じ基準で当てますハンズオン1 から3
各自の PC Claude Desktop VSCode(編集とコミット) hooks = 手元の速報 PHP と Docker は入れません 同期 GitLab dl-training-app Issue #1 〜 #5 ブランチ ex/p3-yamada MR main へ合流 main へ直接は出せません。合流は MR だけです。 パイプラインが動く CI(合流前の最終判定) lint lint-phpdev lint-phpver 2つの版で php -l test test test-phpunit PHPUnit + PostgreSQL review ai_review 読むだけ。落としません findings.json を残す gate ai_gate P0/P1 があれば赤 初期は allow_failure 5段目 implement の nightly_implement は手動ジョブ 押さない限り走りません。ハンズオン3で使います MR へ返る ai_review が MR にノートを1本置きます。採否は決めません。 ai_gate が GATE_LEVEL 以上の指摘を数え、あればパイプラインを止めます。 MR へ 夜間ループ pipeline schedule → nightly_implement → ブランチ nightly/issue-4 → MR 自動で進むのは MR の手前まで。マージは人が判断します。
上段が手元と GitLab、中段が MR を出したときに動く CI のジョブです。中段右下の破線が5段目の implement で、手動でしか動きません。右端の点線は、CI の結果が MR へ戻ってくる経路を示します。最下段の夜間ループはハンズオン3で扱います。

図に出てくる語のうち、3つだけ先に押さえてください。MR(Merge Request)は、自分のブランチを main に合流させる申請です。ai_review は MR の差分を AI に読ませ、指摘をコメントとして置くジョブです。ai_gate は、その指摘に重大なものがあればパイプラインを落とすジョブです。残りの語は末尾の用語集にあります。

この図で押さえる4点
  • 手元で書いた変更は、ブランチと MR を経由してしか main に入らない
  • 自動で走る CI は lint / test / review / gate の4段6本。5段目の implement は手動で、ハンズオン3まで押さない
  • 指摘を出す ai_review と、落とす ai_gate は別のジョブになっている
  • 夜間ループが自動で進めるのは MR を作るところまでで、マージは人が押す
演習1本の8コマを左から並べた図。Issue を読むから指摘の採否を書くまでが横一列で、CI が判定するコマだけ塗りが濃い
プチ演習もハンズオンも、この8コマを1周します。塗りが濃いコマだけが機械の判定で、残りは人が手を動かす場所です。上から刺さる2本の矢印がフックの割り込む位置で、Claude Desktop が書く直前と直後にあたります。右端の採否は、どの演習でも機械へ渡しません。
手元の作業ツリー、GitLab のリポジトリ、配布物 ZIP の3つの箱を並べ、同期される範囲と手元に残る範囲を矢印で分けた図
演習中に触るファイルが、どの箱に属するかの一覧です。左の箱は上下2段に分かれていて、上段だけが同期され、下段の差分ファイルや findings-*.json は手元に残ります。下の配布物 ZIP は研修後に自社へ持ち帰るもので、リポジトリには入りません。測った数字と自分の判断が ZIP 側にあるのは、研修環境から切り離しても読める形にしておくためです。
手元のフックと CI に同じ検査を置く理由

手元のフックと CI は、同じことを別の速さでやっています。フックは書いたその瞬間に止めるので気づくのが速く、CI は全員の変更に同じ基準で当たるので取りこぼしません。片方だけにすると、速いが人によって基準が違う状態か、正確だが直すのが翌日になる状態のどちらかになります。

同じコミットに2本のパイプラインが並ぶ仕組み

同じコミットに対して、変更を出したときに走るブランチ用と、MR がある間だけ走る MR 用の2本が別々に動きます。MR の Pipelines タブでは branchmerge request のラベルで見分けます。

同じコミットに対して走る2本のパイプラインの図。上段がブランチ用の lint と test、下段が MR 用の ai_review と ai_gate
上段がブランチ用の lint と test、下段が MR 用の ai_review と ai_gate です。上段右端の nightly_implement は手動なので、ハンズオン3まで押しません。
Tips:自社のプロジェクトは、AI ツールが動く場所もコードの置き場所もランタイムの版も研修環境とは違います。配布物の 50_環境別のフック設計/環境別のフック設計.md に、環境が違うときのフックの組み方をまとめています。プチ演習3 とプチ演習6 で該当箇所に触れます。

各演習の読み方

プチ演習8本とハンズオン3本は、同じ6つの見出しで書いてあります。先に「目的」と「達成状態」を読んで、何ができれば終わりかを決めてから手順に入ってください。

見出し書いてあること
目的この演習で何ができるようになるか。作業の説明ではなく、身に付くことが書いてあります
準備始める前にそろっている状態。開いておく画面、いるファイル、前の演習の成果物です
手順番号付きの操作。1項目1操作で、画面の名前とボタンの名前が入ります
達成状態できたと自分で判定できる形。講師に聞かずに終わりを決められます
解説と補足なぜこうするか、背景、別のやり方。折りたたみの中にあります
影響範囲この変更が何に効くか。壊れるとしたら何が壊れるか。自社に写すときの置き場所です

手順の文には、どこで操作するかを書いています。書き方と画面の対応は次のとおりです。

手順の書き方操作する場所
「Claude Desktop に」「次を送る」Claude Desktop の入力欄。文章をそのまま貼り付けて送ります
/rewind」のようにスラッシュで始まるものClaude Desktop の入力欄
「ターミナルで」Claude Desktop の統合ターミナル。右上の >_ アイコン、または Ctrl+バッククォートで開きます。WSL セッションで作業している方は統合ターミナルが使えないので、Windows Terminal で WSL を開き、リポジトリのルートへ移動してから同じコマンドを打ちます。その場合、フックのテストランナーは bash 版(run_cases.sh)です
「VSCode で開く」左のエクスプローラーでファイルをクリックします。見えないときは 表示 > エクスプローラー です
「ソース管理ペインで」VSCode の左サイドバーにある枝分かれのアイコン。コミットと同期はここです。SourceTree などの Git クライアントやコマンドで進める方は、下の対応表で読み替えてください
「ブラウザで」GitLab の画面。事前セットアップでログインした https://gitlab-09291006aidev.give-app.net です

Git の操作は VSCode のソース管理ペインで書いています。普段 SourceTree などの Git クライアントを使っている方、コマンドで進めたい方は、次の対応で読み替えてください。手順に出てくる操作はこの6種類だけです。

手順の操作VSCode のソース管理ペインコマンドSourceTree
変更されたファイルを見る変更の一覧git status左の「作業コピー」の一覧
ファイルをステージするファイル名の横の +git add <ファイル>ファイルにチェックを付ける
行を選んでステージする差分で行を選び「選択範囲をステージ」git add -p <ファイル>差分で行を選び「選択した行をステージ」
コミットするメッセージを書いて「コミット」git commit -m "メッセージ"メッセージを書いて「コミット」
push する「変更の同期」または「ブランチの発行」git push -u origin <ブランチ>「プッシュ」
main を最新にする「…」メニューの「プル」git pull「プル」
ブランチを作る左下のブランチ名から「新しいブランチの作成」git switch -c <ブランチ>「ブランチ」
初回の確認について AI がファイルを書き換えたりコマンドを実行したりする直前に、実行してよいかの選択肢が出ます。演習では、その1回だけを許可する側の選択肢を選んでください。同じコマンドを以後確認なしで通す選択肢や、確認を出さないモードへ切り替える選択肢を選ぶと、プチ演習2 と3 で「止まる」ことを見る演習の結果が変わります。パーミッションモードの選び方は、このページの共通の進め方 STEP 1「Claude Desktop の基本動作」にあります。
確認が出ないモード
Claude Desktop のモードのメニュー。自動、手動、編集を受け入れる、プラン の4つと、権限をバイパス の行が並んでいる
入力欄の下のモード名を押すと開くメニューです。自動 では確認が出ないため、演習中は 手動 になっていることを確かめてください。新しいセッションを開いたときと、ハンズオン1 でワークツリーに移ったときは、送る前に一度見直します。
Mac をお使いの方の読み替え

Claude Desktop と VSCode の操作は Windows と同じです。ターミナルで打つコマンドだけ、PowerShell をターミナル(zsh)に読み替えてください。.ps1 で終わるスクリプトは同じ名前の .sh、パスの \/ になります。git のコマンドはどちらも同じです。フックの登録は、"command": "powershell.exe"args の組を "command": "bash""args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/<名前>.sh"] に差し替えます。bash 版のフックは jq を使います。

手順の中に Mac 向けとして書いた bash ... の行は、Windows では打たないでください。既定の設定で入れた Git for Windows では、PowerShell から bash が見つからないか、WSL の bash が起動して別の環境で走ります。Windows の方は、並べて書いてある PowerShell 版の行だけを使います。

共通の進め方

11本の演習は、この5つの操作の上に乗ります。プチ演習1から6で使うのは STEP 1 から STEP 3 までで、手元の設定を足してコミットするところまでです。プチ演習7と8はコミットもしないので、この5つの操作は出てきません。MR とパイプラインが出てくるのはハンズオンです。各カードの [Nmin] は当日の目安です。

先に決めておくこと このガイドの例では GitLab のユーザー名を yamada としています。ご自身の演習では、社用メールアドレスの「@ より前」をそのまま使ってください。ブランチ名に使うのは同じ文字列です。
STEP 1

Claude Desktop の基本動作

[4min]

研修では Claude Desktop を使います。演習の手順で「Claude Desktop に送る」と書いてあるところは、すべてこの4つの動作の組み合わせです。各演習ではこの節を前提にして、送る文章と見るところだけを書きます。

  • 1プロジェクトフォルダを選びます。新しいセッションを始めると、入力欄の上の行で環境、プロジェクトフォルダ、ブランチを選べます。プロジェクトフォルダに演習リポジトリ dl-training-app のフォルダを指定します。
  • 2パーミッションモードを 手動 にします。入力欄の下の行の左にあるモード名を押して選びます。新しいセッションを開いたときは、送る前にここを一度見てください。
  • 3指示を出します。入力欄に日本語の文章を貼り付けて送ります。ファイル名は文章の中にそのまま書いて構いません。
  • 4結果を見ます。書き換えたファイルの名前と差分が返信の中に並びます。実行前に確認が出たら、その1回を許可する側の選択肢を選びます。書かれた中身は VSCode で開いて自分の目で確かめてください。

パーミッションモードは画面の表示で 自動 / 手動 / 編集を受け入れる / プラン の4つです。自動 では確認が出ないため、プチ演習2 と3 の「止まる」ことを見る演習が成立しません。2日間は 手動 のまま進めてください。プチ演習2 の手順4 だけ、確認の出方を見るために一時的に 編集を受け入れる に切り替えます。

設定を書き換えたら開き直してください。 .claude/settings.json とフックはセッションの開始時に読まれます。書き換えたあとは、セッションを開き直して初めて新しい設定で動きます。プチ演習1 から3 は、この開き直しを毎回はさみます。同じ設定ファイルは Claude Desktop と CLI の両方が読むので、どちらで書いても効きます。
Claude Desktop で新しいセッションを始める前の入力欄。ローカル、dl-training-app、ブランチ ai/issue-2 とワークツリーの選択、下の行に 手動 のモードとモデル名
新しいセッションを始める前の入力欄です。上の行が環境、プロジェクトフォルダ、ブランチとワークツリー、下の行の左がパーミッションモード、右がモデルと effort の表示です。画面は撮影時点のもので、モデル名はいまは Opus 5.5 と出ます
この Step が終わった状態
  • プロジェクトフォルダが dl-training-app になっている
  • パーミッションモードが 手動 になっている
補足

CLI の位置づけ

研修では Claude Desktop を使います。同じことは CLI でもできるので、すでにターミナルで使っている方はそちらで進めていただいて構いません。設定ファイルは両方が同じものを読むため、.claude/settings.json の権限もフックも CLAUDE.md も、どちらで書いても効きます。演習の達成状態はどちらでも同じです。

腰を据えて使い込む段階に入ると、CLI のほうが自動化に載せやすくなります。差は1つで、対話画面を開かずに1回だけ走らせる形(claude -p)が CLI にしかありません。この形が取れると、出力をそのままファイルに残して CI のジョブや夜間のスケジュール実行に組み込めます。ハンズオン3 の夜間ループが、その実物です。

STEP 2

ブランチ名の形

[3min]

演習で作るブランチは ex/<演習番号>-<ユーザー名> です。演習番号は、プチ演習が p1 から p4、ハンズオンが h2h3 です。プチ演習5 は ex/p4- のブランチのまま、プチ演習6 はハンズオン2 の ex/h2- のブランチのまま進めます。プチ演習3なら ex/p3-yamada、ハンズオン2なら ex/h2-yamada になります。切り替えの操作は STEP 3 のソース管理ペインで行います。

ハンズオン1だけは例外です。Claude Desktop の入力欄の上の行で、ブランチ名の右にある ワークツリー にチェックを入れて開始すると、そのセッションだけが隔離した作業ツリーで動きます。名前の入力欄は無く、ブランチ名は worktree- で始まる名前が自動で付きます。入力欄の上に出たブランチ名を控え、以降この資料の worktree-issue-1 は控えた名前に読み替えてください。作業ツリーは .claude/worktrees/ の下に1つできます。

配布した .claude/settings.json には worktree.baseRef = head が入っているので、ワークツリーは開始したときに乗っていたブランチの HEAD から切られます。ハンズオン1 では ex/p3- の最後のコミットが分岐元です。コミットしていない変更は入りません。

演習ブランチ切る元そこで足すもの
プチ演習1ex/p1-<ユーザー名>mainmodel と effort の設定、レビュアー定義2本
プチ演習2ex/p2-<ユーザー名>ex/p1-deny 10本と ask 3本
プチ演習3ex/p3-<ユーザー名>ex/p2-読み取りの deny 3本、PreToolUse フック
ハンズオン1worktree- で始まる自動の名前ex/p3- の HEADIssue #1 の改修
プチ演習4・5ex/p4-<ユーザー名>ex/p3-PostToolUse フック、JSON ゲート
ハンズオン2ex/h2-<ユーザー名>ex/p4-REVIEW.md、観点別レビュアー、CI ゲート
プチ演習6ex/h2-<ユーザー名> のまま切らないStop フック
ハンズオン3ex/h3-<ユーザー名>ex/h2-SessionStart フック、夜間ジョブ
main に戻らない理由

.claude/settings.json に足す設定は、2日間を通して積み上がっていきます。演習中は誰の MR もマージしないので main は動かず、毎回 main から切り直すと前の演習で足した設定が消えて次の演習が成り立ちません。main から切るのはプチ演習1 だけで、それ以降は上の表の「切る元」に切り替えてから新しいブランチを作ってください。Day2 の最初は、Day1 の ex/p3- に切り替えてから ex/p4- を作ります。

Tips:ブランチ名の頭文字には意味を持たせています。ex/ は人が手で始めた演習、worktree- は Claude Desktop のワークツリー、ai//implement-issue が作ったもの、nightly/ は CI の夜間ジョブが作ったものです。MR の一覧を見たときに、誰が始めた変更かが名前だけで分かります。
STEP 3

VSCode のソース管理ペイン

[6min]

変更の確認、コミット、同期、ブランチの切り替えは、すべて VSCode の画面でできます。左サイドバーの枝分かれのアイコンがソース管理ペインです。アイコンの右上の数字が、いま変わっているファイルの数です。

  • 1ブランチを切り替えます。ウィンドウ左下にいまのブランチ名が出ています。そこをクリックして、一覧から選ぶか 新しいブランチの作成 で新規に作ります。
  • 2差分を見ます。変更 の一覧でファイル名をクリックすると、左に変更前、右に変更後が並びます。AI が書いたものは必ずここで読んでください。
  • 3ステージに上げます。ファイル名の右の + を押します。変更したファイルだけを選んで押してください。フックが作った作業ファイルまで巻き込まないためです。
  • 4メッセージを書いてコミットします。入力欄に日本語の1行を書き、コミット を押します。
  • 5同期します。変更の同期 を押すと、手元のコミットが GitLab へ送られ、GitLab 側の更新が手元に入ります。

コミットは1つの変更意図につき1つです。10個の変更を1コミットにまとめると、そのうち1つを取り消したいときに手作業で切り分けることになります。メッセージは「見積一覧の顧客名検索をプレースホルダに置き換える」のように、何をどうしたかを書きます。ファイル名を並べたメッセージは、あとで履歴を読むときに何も足しません。

指示を出す前にコミットしてください。 /rewind で戻せるのは AI がファイルの編集として行った変更だけです。コマンドで動かした分、サブエージェントの変更、手で直した分は戻りません。全部まとめて効く保険は、作業の前後のコミットだけです。
切り替えで止まったときの見方

ブランチを切り替えようとして拒まれたときは、前の演習の変更がコミットされていません。ソース管理ペインの 変更 に残っているものをコミットしてから、もう一度切り替えてください。同期でユーザー名とパスワードを聞かれたら、事前セットアップで変更した GitLab のパスワードを入れます。

この Step が終わった状態
  • 左下のブランチ表示が ex/ で始まる名前になっている(ハンズオン1 だけは控えた worktree- で始まる名前)
  • ソース管理ペインの 変更 に、前の演習の変更が残っていない
STEP 4

GitLab の Web 画面

[8min]

MR の作成、差分の確認、パイプラインの確認、マージの判断はブラウザで行います。main はブランチ保護がかかっており、合流の経路は MR だけです。

  • 1MR を作ります。同期したあとにプロジェクトの画面を開くと、上部に Create merge request の帯が出ます。出ていないときは左メニューの Code > Merge requests から New merge request を押します。
  • 2合流先が main、元が自分のブランチになっていることを確かめます。
  • 3説明欄には、リポジトリの既定のテンプレート(.gitlab/merge_request_templates/Default.md)が最初から入っています。変更概要影響範囲 を先に埋め、AI レビュー結果 の表は演習の途中で埋めます。
  • 4差分は Changes タブで読みます。行の左に出るアイコンから、その行に直接コメントを付けられます。
  • 5パイプラインは Pipelines タブで見ます。落ちたジョブの名前をクリックするとログが開きます。
  • 6Merge は押しません。演習中は誰の MR もマージせず、開いたまま残してください。MR の一覧が2日間の記録になります。
作成直後のMRのOverview画面。説明欄にテンプレートの見出しが並び、右側にパイプラインの状態が表示されている
説明欄の見出しがテンプレートどおりに入っていることと、右側の Pipeline が動き始めていることを見ます。

Pipelines タブには、パイプラインが2本ずつ並びます。1本目は変更を出すたびに走るブランチ用で linttest の2段4ジョブ、2本目は MR に対して走る MR 用で reviewgate の2段2ジョブです。どちらも前の段が落ちると後ろの段は動きません。ブランチ用のいちばん右の implement にある nightly_implement は再生ボタンが付いた手動ジョブで、ハンズオン3まで押しません。

MRのPipelinesタブ。lint、test、review、gateの4ステージが横に並び、gateのai_gateだけが警告マークになっている
merge request のラベルが付いた行が review と gate、branch の行が lint と test です。Stages の丸にマウスを乗せるとジョブ名が出ます。赤い行は、テストだけを先に出した回のブランチ用パイプラインです。
落ちたジョブのログの読み方

落ちた理由は、ログのいちばん下ではなく赤い行の直前にあります。ai_gate が止めたときは、止めた指摘がそのままログに並びます。

しきい値 P1 以上、確信度 0.0 以上の指摘を数えます。
confidence の無い指摘は 1.0、P0〜P3 以外の severity は P0 として数えます。
P1: 1 件 / P2: 3 件 / P3: 2 件

ゲートで止めた指摘 1 件
  [P1] app/controllers/estimate_ctl.php:48 顧客名がSQL文字列へ連結されており、検索欄から任意のSQLを実行できます。db_select の第2引数にプレースホルダで渡してください。

直すか、直さない理由をMRのコメントに書いてから再実行してください。

どの指摘で止まったかが分かれば正しく読めています。

GitLab の ai_review ジョブの画面。Passed の表示、緑の $ で始まる実行行、最後の Job succeeded、右側の Duration が写っている
ジョブ名をクリックすると開く画面です。緑の $ で始まる行が実行した命令で、最後に Job succeeded で終わっています。右側の Duration が計測表の所要に写す値です。findings.json は同じ右側の Job artifacts から取得します。
GitLab プロジェクトの Pipelines 一覧。各行に状態、#番号、ブランチ名、latest / branch / merge request のラベル、Stages の丸が並んでいる
左メニューの Build > Pipelines で開くプロジェクト全体の一覧です。全員の行が混ざるので、自分の行はブランチ名で探します。左端が状態、# の数字がパイプライン番号、右の Stages の丸が段ごとの結果です。
マージを自分で押さない理由

書いた本人がマージまで通してしまうと、指摘を採るか採らないかの判断が自分だけで閉じます。人が残る仕事を「Issue の粒度決め」「マージ承認」「指摘の採否」の3つに絞る、という2日間の立場を運用の形にしたのがこの約束です。CI が緑になったら、MR の説明欄の 人が判断した採否 の表を埋めてください。直さなかった指摘には理由を書きます。理由が残っていないと、次の改修で同じ指摘が出て同じ時間を使います。

Tips:Closes #1 を説明欄に残すと、マージしたときに Issue が閉じます。演習中は閉じないので、書き換えずにそのまま残してください。
Tips:ai_gate は初期状態で allow_failure: true です。落ちてもパイプライン全体は赤になりません。ハンズオン2でこの1行を外し、本当に合流を止めるゲートにします。test-phpunit だけ他より2分ほど長くかかりますが、止まっているように見えても待ってください。
STEP 5

AI レビューのノートの読み方

[4min]

ai_review は MR にコメントを1本置きます。1件の指摘は severityconfidencefilelinemessagecategory の6つを持ちます。ノートは列挙するだけで、直すかどうかは決めません。

読む順番を決めておくと速くなります。severity で P0 と P1 だけを先に読み、次に confidence が 0.5 以下のものを「実物を確かめてから判断する」側に寄せ、最後に今回の変更の外を指している指摘を外します。この3手で、6件のノートが2件の判断に減ります。

MR の Overview に ai_review_bot が投稿したコメント。モデル名と深さと差分行数の見出し、P0 から P3 の件数、指摘の箇条書きが並んでいる
MR の Overview の下部に、ai_review_bot のコメントとして届きます。1行目にモデル名、深さ、差分の行数、その下に P0 から P3 の件数、続いて指摘の箇条書きです。
ノートの本文の例
AIレビュー(モデル: claude-sonnet-5 / 深さ: quick / 差分 42 行)

見積一覧の検索条件とテストの差分を読み、6件を報告します。

P0 0 件 / P1 1 件 / P2 3 件 / P3 2 件

- [P1] app/controllers/estimate_ctl.php:48 (sql-injection / 確信度 0.9)
  顧客名がSQL文字列へ連結されており、検索欄から任意のSQLを実行できます。db_select の第2引数にプレースホルダで渡してください。
- [P2] app/controllers/estimate_ctl.php:61 (spec-mismatch / 確信度 0.6)
  期間の上限が指定日の 00:00 で切れるため、指定日当日の見積が一覧に出ません。

判定は ai_gate ジョブが行います(現在のしきい値 P1)。採否の理由はこのMRのコメントに書いてください。

ノートの見出し行に、使われたモデルと差分の行数が出ます。

P0 から P3 の線引き

P0 は動かないか壊すもの、P1 は実環境で落ちるか外部入力が素通しになるもの、P2 は指示との不一致と波及漏れ、P3 はそれ以外です。ai_gate の既定のしきい値 P1 は「P0 と P1 を止める」という意味です。この線引きは .claude/review.schema.json に書かれており、演習では変えません。自社版を作るのはハンズオン2です。

件数を減らすことは目的ではありません。 このノートで見るのは、履歴を切ると指摘が何件どう変わるかです。ハンズオン1では同じ変更を3通りで読ませ、件数と所要時間を MR の表に並べます。CI の ai_review を加えると4行目になります。
補足

統合ターミナルとコマンド

画面から実行できないものは、Claude Desktop の統合ターミナルから打ちます。右上の >_ アイコン、または Ctrl+バッククォートで開きます。セッションの作業ディレクトリで開き、Claude と同じ環境を共有するので、パスを移動する操作はいりません。2本目のタブが要るときは、ターミナルペーンの + で増やします。演習の手順で「ターミナルで」と書いてあるのは、すべてこのターミナルです。コマンドを打つ場面は2日間で十数か所あり、どれも統合ターミナルにそのまま貼れる形で書いてあります。

やることコマンド使う演習
AI に読ませる差分をファイルに出すgit diff main --output=review-input.diffプチ演習1、ハンズオン1
非対話で1回だけ走らせるclaude -p "指示"ハンズオン3
消えたコミットを探すgit reflogプチ演習2
Tips:差分をファイルに出すのは、AI に「いまの変更だけ」を読ませるためです。リポジトリ全体を渡すと、今回触っていない場所の指摘が混ざります。> で書き出さずに --output= を使うのは、PowerShell 5.1 の > が UTF-16 のファイルを作り、日本語が読めなくなるためです。
Tips:統合ターミナルが使えるのは手元で動かしているセッションだけです。隔離した作業ツリーを作る操作はコマンドではなく、STEP 2 に書いた ワークツリー のチェックで行います。

1つのプロジェクトを全員で使う形

演習リポジトリ dl-training-app は1つで、受講者全員がここを使います。同じ場所を触るのに作業がぶつからないのは、人ごとにブランチが分かれていて、main が保護されているからです。演習に入る前に、この節でその形を押さえてください。

受講者全員が1つのGitLabプロジェクトを共有する形の図。各自のPCから人ごとのブランチへ同期し、GitLab側ではmainがブランチ保護で動かず、各自のMRが開いたまま並ぶ。下段にrunnerが1台であることと順番待ちの説明がある
左が各自の手元、右が GitLab 側です。破線の main だけが全員の共有物で、演習中はここに何も入りません。右の実線の行が人ごとに分かれたブランチと、開いたままの MR です。下段は CI の待ちが出る理由で、これだけは全員で1台を分け合います。

作業がぶつからない理由

変更を書き込む先は、いつも ex/<演習番号>-<ユーザー名> という自分のブランチです。ユーザー名は社用メールアドレスの「@ より前」なので、全員分が重なりません。main にはブランチ保護がかかっており、受講者の権限では直接 push できません。合流の経路は MR だけです。ブランチを切り忘れて main のまま同期しようとした場合は、GitLab 側で弾かれます。その文面と直し方は「困ったとき」にあります。

他の方の手元への影響

演習中は誰の MR もマージしません。main が動かないので、他の方の変更がご自身の手元へ入ってくることはありません。同期を押しても、取り込まれるのは自分のブランチの分だけです。逆に、ご自身が書いたものが他の方の画面に現れることもありません。壊れる心配をせずに、思い切った書き換えを AI に頼んで構いません。

他の方のブランチと MR の見え方

GitLab の一覧には、受講者全員のブランチ、MR、パイプラインが並びます。見えてよいものです。むしろ MR が開いたまま残ることで、2日間に誰が何を試して、どの指摘をどう判断したかが一覧として残ります。守っていただく約束は1つで、他の方のブランチには切り替えない、他の方の MR はマージしない、それだけです。自分の行を探すときは、ブランチ名に入っているご自身のユーザー名で絞ってください。

パイプラインの順番待ち

CI のジョブを実行する runner は1台です。全員が同じ時間帯に同期すると、パイプラインは1台に並ぶので pending のまま待つ時間が出ます。異常ではありません。待っている間は、MR の説明欄の記入や記録の下書きなど、CI を待たない作業を先に進めてください。ハンズオン3 の手動ジョブは1本が最長30分 runner を使います。Step 3 は講師が main で1本だけ流して全員で同じログを読み、Step 5 で各自が自分のブランチの手動ジョブを押します。

マージを演習中に行わない理由

誰かの MR が main に入ると、その後に出す MR の差分がそこからの差になり、同じ題材を扱っている他の方の結果と比べられなくなります。全員が同じ Issue を扱う場面ではとくに影響が出ます。開いたまま残しておけば、読ませ方を変えたときの指摘件数の違いが MR の一覧にそのまま並びます。ハンズオン3 の最後だけは、講師が全員の判断を聞いたうえで1本だけマージします。

ブランチ名の接頭辞で見分けられること

一覧に並ぶブランチは、頭の文字で作った側が分かるようにしてあります。ex/ は人が手で始めた演習、worktree- は Claude Desktop のワークツリー、ai//implement-issue が作ったもの、nightly/ は CI の夜間ジョブが作ったものです。ハンズオン1 は Claude Desktop のワークツリーを使うので、ブランチも作業ツリーも Claude Desktop が作り、ブランチ名も自動で付きます。セッションごとに隔離されるため、同じリポジトリを開いていても手元の作業が混ざりません。

記録台帳と計測表

演習の成果物は、ファイルそのものより「どこに置くと決めたか」の記録のほうが後で効きます。台帳と計測表の2つを、演習のたびに1行ずつ書き足してください。書き足すのは演習の最後ではなく、生成物ができた直後です。

台帳

持ち帰り台帳.md

2日間で足す機能を1行ずつ記録します。演習中に決めるのは置き場所と担当で、ここが空欄のまま研修が終わると、持ち帰ったファイルは端末の中に残ったままになります。最後の列は「未 / 書いた / 置き場所まで決めた」の3つから選びます。

台帳の書き方の例
| 演習 | 足したもの | D2 での置き場所 | smart3pm での置き場所 | 担当 | 状態 |
|---|---|---|---|---|---|
| プチ演習1 | review-light.md / review-full.md | agents/ 配下(当日確定) | agents 相当の場所(当日確定) | 山田 | 置き場所まで決めた |
| プチ演習2 | deny 5本 + CLAUDE.md の戻し方 | settings.json | settings 相当(当日確定) | 山田 | 未 |

1行目を Day1 の冒頭で書きます。

置き場所の列は先に書いてください。 D2 は PowerShell 版、smart3pm は bash 版を正にします。同じガードを2言語で書き続けると、片方だけ直す事故が起きます。どちらを正にするかは Day1 の最後に各自が決めます。
Tips:D2 と smart3pm の具体的なディレクトリ名は、この資料には書いていません。ご自身の端末で開いたハーネスの構成に合わせて記入してください。
計測

計測表

指摘の総数、うち P0 と P1、所要時間の3つを演習ごとに取り、採否を決めたら採用・見送りの件数を足します。Day2 の最後に、これが効果測定の初回の実測値になります。数字を取らないと、品質が上がったかどうかを言葉でしか言えません。

取り方取るタイミング
指摘の総数ノートの合計件数、または findings.jsonfindings の長さレビューを1回回すたび
うち P0 と P1P0 と P1 の合計。ノートの見出し行にそのまま出ます同上
所要時間レビューを頼んでから結果が返るまでの分数。CI はジョブ画面の Duration同上
採用・見送り「即修正」に仕分けた件数と、「将来課題」「意図した設計」に仕分けた件数を「1・3」の形で並べる採否を決めた直後
計測表の書き方の例
| 読ませ方 | 指摘の総数 | うち P0 と P1 | 採用・見送り | 所要時間(分) |
|---|---|---|---|---|
| 1 実装したセッションでそのまま依頼 | 4 | 1 | 1・3 | 2 |
| 2 review-other サブエージェント | 6 | 2 | 2・4 | 3 |
| 3 履歴を切った新しい会話 | 3 | 2 | 1・2 | 6 |
| 4 CI の ai_review | 6 | 1 | 1・5 | 1 |

4行の並びは MR 説明の「AI レビュー結果」欄と同じにしてください。数字は例で、当日はご自身の結果を入れます。

Tips:所要時間は秒単位で取らなくて構いません。「2分」「10分超」の粒度で足ります。比べるのは、読ませ方を変えたときの差です。
この章の持ち帰り物
  • 持ち帰り台帳.md に、演習ごとの置き場所と担当が入っている
  • 計測表に、ハンズオン1の3通りと CI の ai_review の4行がそろっている
ファイルD2 での置き場所smart3pm での置き場所
持ち帰り台帳.mdハーネスの文書置き場(当日確定)ハーネスの文書置き場(当日確定)
計測表_Day1_Day2.md同上。効果測定の初回値として残します同上

置き場所の具体名は、ご自身の端末で開いたハーネスの構成に合わせて決めてください。この2つは公開できる内容なので、社内で共有する側に置いても差し支えありません。

用語集

2日間の資料と演習で、説明なしに出てくる語をまとめています。手が止まったらここに戻ってください。

意味出てくる場所
Claude Desktop 研修で使うデスクトップアプリです。セッションの開始時にプロジェクトフォルダを選ぶと、そのフォルダのファイルを読み書きします。統合ターミナルと worktree の操作も中にあります。設定ファイルは CLI と共通です。 全演習
ソース管理ペイン VSCode 左サイドバーの枝分かれアイコンで開く画面です。変更の一覧、差分、ステージ、コミット、同期、ブランチの切り替えがここにまとまっています。演習の git 操作はこの画面で行います。 全演習
CLAUDE.md リポジトリ直下に置く指示書です。セッションの開始時に読み込まれ、AI はこの文章を参考にして動きます。文章なので「守るとは限らない」のが前提で、演習では「文脈であって設定ではない」と呼びます。 プチ演習2、プチ演習4
settings.json .claude/settings.json。モデル、権限(permissions)、フック(hooks)をここに書きます。JSON が1文字でも壊れていると、ファイル全体が読まれずに既定値で動きます。セッションの開始時に読まれるため、書き換えたら Ctrl+N で新しいセッションを開きます。登録の確認は、このファイルを VSCode で開いて見ます。Claude Desktop の入力欄では /permissions/hooks は使えません。 プチ演習1 から3
フック(hook) 決まった場面(ツールの実行前、実行後、応答の終了時など)で自動的に呼び出されるスクリプトです。settings.jsonhooks に登録します。スクリプトは標準入力で JSON を受け取り、終了コードで結果を返します。演習のフックは PowerShell 版(.ps1)と bash 版(.sh)が .claude/hooks/ にあります。フックの単体テストは配布時点で22件あり、プチ演習3 とプチ演習4 で1件ずつ足します。 プチ演習3、プチ演習4、プチ演習6
環境別のフック設計 配布物の 50_環境別のフック設計/環境別のフック設計.md です。AI ツールが動く場所、コードの置き場所、ランタイムの版が研修環境と違うプロジェクトで、フックをどう組むかをまとめています。 プチ演習3、プチ演習6
exit 2 / $LASTEXITCODE スクリプトが終わるときに返す数字が終了コードです。フックでは 0 が「通す」、2 が「止める」の合図です。2 の効き方はイベントで違い、PreToolUse はツールの呼び出しを止めて標準エラーの文章を AI に返し、Stop は応答を終わらせずに作業を続けさせます。PostToolUse は実行済みなので止められず、標準エラーの文章を AI に渡すだけです。SessionStart はセッションを止めず、標準エラーの文章は利用者の画面に出るだけで AI には届きません。1 など 2 以外の数字は止める合図にならず、処理はそのまま進みます。直前に動かしたスクリプトの終了コードは、PowerShell では $LASTEXITCODE、bash では $? と打つと表示されます。 プチ演習3、プチ演習4、ハンズオン3
サブエージェント 別の会話として起こす、役割つきの AI です。定義は .claude/agents/<名前>.md に置き、使えるツールとモデルを絞れます。入力欄で @ を打つと一覧に <名前> (agent) として出るので、そこから選んで依頼文を続けます。 プチ演習1、ハンズオン1
frontmatter Markdown ファイルの先頭に --- で囲って書く設定の部分です。サブエージェントの定義では name / description / tools / model / effort がここに入ります。閉じの --- を消すと本文として読まれ、設定が効きません。 プチ演習1
/rewind 巻き戻し機能です。入力欄に /rewind と打つと、これまでのメッセージの一覧が開きます。地点を選ぶと、復元の範囲を コードと会話 / 会話のみ / コードのみ から選ぶ確認画面に進みます。Esc を2回押す開き方は Claude Desktop では効きません。戻せるのはファイルの編集として行われた変更だけです。 プチ演習2
パイプライン / ジョブ / ランナー GitLab CI の用語です。変更や MR をきっかけに自動で走る一連の処理がパイプライン、その中の1つ1つ(lint-phpverai_review など)がジョブ、ジョブを実際に実行するサーバがランナーです。結果は MR の Pipelines タブに並びます。 ハンズオン1 から3
permission mode 権限の効き方を決めるモード。Claude Desktop の画面に出るのは 手動 / 編集を受け入れる / プラン / 自動 の4つで、設定値ではそれぞれ default / acceptEdits / plan / auto です。設定値にはほかに dontAsk と bypassPermissions があり、bypassPermissions は Claude Desktop の設定で 権限をバイパス として出せます。dontAsk は画面に出ません。acceptEdits は作業ディレクトリ内の rm まで自動承認します。auto と bypassPermissions はプロジェクトの .claude/settings.json からは指定できません。 Day1 の権限の話、ハンズオン3
deny permissions.deny に書く拒否の規則。どのパーミッションモードでも効き、allow で例外を作れません。Bash(...) の規則は PowerShell ツールの呼び出しに当たらないので、Windows 向けには PowerShell(...) と対で書きます。コマンド文字列の照合なので、/bin/rmbash -c "..." の形はすり抜けます。塞ぐのは PreToolUse フックの役目です。 プチ演習2、プチ演習3
PreToolUse ツールを実行する直前に走るフック。deny と同じくどのパーミッションモードでも走り、exit 2 で呼び出しを止めます。matcherBash だけだと PowerShell ツールの呼び出しでは走らないので、演習では Bash|PowerShell で登録します。演習では block-destructive がこれです。 プチ演習3
PostToolUse ツールの実行後に走るフック。ファイルの編集の後に check-phpver を走らせ、このプロジェクトの対象バージョン(PHP 7.4)で動かない構文を exit 2 で差し戻します。 プチ演習4
Stop hook 応答を終えようとしたときに走るフック。{"decision":"block","reason":"..."} を標準出力すると、作業を続けさせます。演習では stop-gate がテストの通過を見ます。 プチ演習6、ハンズオン3
stop_hook_active Stop hook の入力 JSON に入る真偽値。継続で再び呼ばれたときに true になります。これを見ずに block を返し続けると、Claude Code が8回連続の block で打ち切るまで継続が繰り返され、そのぶんトークンを使います。 プチ演習6
effort 考える深さ。low / medium / high / xhigh / max の5段です。settings.jsoneffortLevel、skill と agent の frontmatter、環境変数 CLAUDE_CODE_EFFORT_LEVEL で決まります。CLAUDE.md には書けません。 プチ演習1
worktree 同じリポジトリの別の作業ツリー。Claude Desktop の入力欄の上の行で、ブランチ名の右にある ワークツリー にチェックを入れて開始すると作られます。名前の入力欄は無く、ブランチ名は自動で付きます。作業ツリーは <プロジェクトルート>/.claude/worktrees/ の下にできます。分岐元は settings.jsonworktree.baseRef で決まり、配布した設定の head は開始時のブランチの HEAD から切ります。終了したらサイドバーのアーカイブのアイコンで削除します。gitignore されたファイルを持ち込むときは、プロジェクトルートに .worktreeinclude を置きます。 ハンズオン1
非対話実行 対話画面を開かずに1回だけ走らせる使い方です。claude -p "指示" の形で、Claude Desktop の統合ターミナルか CLI から呼びます。Claude Desktop の画面操作としては用意されていないのがこれです。確認が要る操作はその場で拒否されて先へ進むため、--permission-mode--allowedTools--max-turns で何を許すかと回数の上限を決めて初めて無人で動かせます。夜間ループはこの形です。 ハンズオン3
--bare CLAUDE.md もフックも読まずに起動します。制約が効かなくなるので実装側には使いません。履歴と文脈を切って読ませたいレビュー側にだけ使います。ログイン情報も読まないため、環境変数 ANTHROPIC_API_KEY が無い端末では起動しません。 ハンズオン1 の発展課題
--json-schema 出力を JSON Schema の形に固定します。.claude/review.schema.json を渡すと findings の形で返り、そのまま判定スクリプトに流せます。 ハンズオン1 の補足
findings レビュー結果の配列。1件が severity / confidence / file / line / message / category を持ちます。CI では findings.json として artifacts に残ります。 プチ演習5、ハンズオン2
P0 〜 P3 指摘の重大度。P0 は動かないか壊すもの、P1 は実環境で落ちるか外部入力が素通しになるもの、P2 は指示との不一致と波及漏れ、P3 はそれ以外です。 全演習
confidence 0 から 1 の数値。実物を読んで確認できた度合いです。経路の一部が読めていない指摘は 0.5 以下になります。件数を絞るときの2番目の手がかりです。 プチ演習5、ハンズオン2
GATE_LEVEL ai_gate が落とす重大度の下限。既定は P1 で、P0 と P1 を止める意味です。.gitlab-ci.ymlvariables か CI/CD Variables で変えられます。 ハンズオン2
allow_failure ジョブが落ちてもパイプライン全体を赤にしない設定。ai_gate は初期状態で true です。ハンズオン2でこの1行を外します。 ハンズオン2
artifacts ジョブが残すファイル。ジョブ画面の右側から取得できます。findings.json と PHPUnit のレポートがここに入ります。 ハンズオン2、ハンズオン3
pipeline schedule GitLab が決まった時刻にパイプラインを起動する仕組み。Build > Pipeline schedules から作ります。夜間ループの起動側です。 ハンズオン3
プロジェクトアクセストークン プロジェクト単位で発行するトークン。演習ではロール Developer、スコープ apiwrite_repository で発行しています。CI_JOB_TOKEN では MR を作れないため、夜間ジョブはこちらを使います。 ハンズオン3
masked variable CI/CD Variables のマスク指定。ジョブのログで値が伏せ字になります。API キーとトークンは必ずこの指定を付けて登録します。 Day1 の秘密情報の話、ハンズオン3
MR Merge Request。ブランチを main に合流させる申請です。演習では main が保護されており、合流の経路は MR だけです。 全演習
Issue 演習の題材。#1 から #5 まであり、本文は 背景 / 現状 / 期待する振る舞い / 受入条件 / 対象ファイル / 範囲外 の6節で書かれています。/implement-issue はこの6節の見出しをそのまま読みます。 ハンズオン1 から3
PHPCompatibility phpcs の規格。--standard=PHPCompatibility --runtime-set testVersion 7.4 で対象バージョンに無い構文を検出します。php -l は文法として正しければ通してしまうため、match 式や ?-> はこちらでないと捕まりません。 プチ演習4
フック4イベントの位置を示す図。SessionStart、PreToolUse、PostToolUse、Stop の並びと、exit 0 と exit 2 で動きがどう変わるか
表の「フック」と「exit 2」の補足です。上段が4イベントの位置で、起動時が SessionStart、ツール呼び出しの直前が PreToolUse、実行の直後が PostToolUse、応答を終える直前が Stop です。下段が終了コードの違いで、exit 0 は通し、exit 2 は止めて標準エラーの理由をモデルへ返します。この止め方が効くのは PreToolUse で、PostToolUse は理由を渡すだけ、SessionStart は利用者の画面に出すだけです。Stop は exit 2decision: block のどちらでも作業を続けさせられます。
Tips:この表にない語が出てきたら、その場で講師にお伝えください。当日の質問はこの用語集に追記して、研修後に配り直します。
ページの先頭へ