困ったとき

AIカスタム研修 / 症状から引く対処の一覧

演習中に止まったときに、画面に出ている文字から原因と直し方を引くページです。見出しを開くと、原因と直し方が出ます。

困ったときの引き方

画面に出ている文字から引いてください。左の列で症状を探し、右の列のカテゴリへ飛ぶと、その中に同じ見出しの項目があります。見出しをクリックすると原因と直し方が開きます。講師を呼ぶ前に直し方の1番だけ試していただけると、こちらで原因を絞る時間が減ります。

症状カテゴリ
Claude Code が起動しない、アプリの一覧に出てこない起動と実行環境
アプリからプロジェクトのフォルダを開けない起動と実行環境
フックが効いているのか画面で分からない起動と実行環境
確認が出ないまま編集が進んでしまう起動と実行環境
パイプでつなぐ書き方が動かない起動と実行環境
コマンドを打つ場所が見つからない起動と実行環境
スクリプトの実行が無効と赤い文字で出る起動と実行環境
フックの日本語が読めない並びになる起動と実行環境
bash\r、bad interpreter と出る起動と実行環境
Permission denied と出る、止まるはずが素通りする起動と実行環境
編集のたびに数秒待たされる起動と実行環境
jq not found と出て判定が通ってしまう起動と実行環境
拒否の規則を足したのに実行される設定とフックの効き方
CLAUDE.md に書いた禁止が守られない設定とフックの効き方
フックも拒否も同時に効かなくなった設定とフックの効き方
隔離して起動するとフックが発火しない設定とフックの効き方
effort やモデルが指定どおりにならない設定とフックの効き方
AI の変更の一部だけを戻したい巻き戻しと隔離
自分の手直しと AI の変更が混ざった巻き戻しと隔離
巻き戻しても戻らないファイルがある巻き戻しと隔離
Esc を2回押しても巻き戻しの一覧が開かない巻き戻しと隔離
隔離した作業の始め方が分からない巻き戻しと隔離
隔離すると .env が入っていない巻き戻しと隔離
隔離したあとブランチが使えない巻き戻しと隔離
対象バージョンで動かない構文が差し戻される対象バージョンの制約とテスト
lint のジョブだけが赤になる対象バージョンの制約とテスト
main に push できないGitLab と CI
見覚えのないブランチや MR が一覧に並ぶGitLab と CI
パイプラインが pending のまま動かないGitLab と CI
ai_review が緑なのにコメントが付かないGitLab と CI
ai_gate が止めたのにマージできるGitLab と CI
夜間ジョブの手動ボタンが押せない夜間ループと Stop hook
夜間ジョブが MR を作らない、403 で弾かれる夜間ループと Stop hook
Stop hook が止まらない夜間ループと Stop hook
進め方そのものに迷った、時間内に終わらない進行と画面共有
Tips:ここに無い症状に当たったら、画面の文字をそのままチャットへ貼ってください。画像より文字のほうが検索できます。当日出た症状はこのページに追記して、研修後に配り直します。

起動と実行環境

入り口で止まる症状です。Claude Desktop の起動、プロジェクトフォルダの選び方、フックの確かめ方、パーミッションモード、統合ターミナル、実行ポリシー、文字化け、改行コード、実行ビット、動く速さ、判定コマンドの不在を置いています。当日の朝に一番多く出ます。

プロジェクトのフォルダを開けない共通
症状

Claude Desktop は起動しているのに、演習のファイルが見えません。ファイル名を伝えても「そのファイルが見つかりません」と返ってきます。プロジェクトの一覧に dl-training-app が並んでいません。

原因

プロジェクトフォルダは、セッションを始めるときにプロンプト領域で設定する4項目の1つです。ここを選ばないまま書き始めると、会話はできてもファイルには手が届きません。ZIP を展開した場所と、選んだ場所が違う場合も同じ症状になります。

直し方
  • 1まず事前セットアップで dl-training-app を取り込んだ場所を確認してください。
  • 2新しいセッションを作ってください。Ctrl+N です。
  • 3プロンプト領域の4項目から、プロジェクトフォルダに dl-training-app を選んでください。1つ上の階層を選ぶと、.claude の設定が読まれません。
  • 4app/libraries/util.php の先頭10行を見せてください」と頼み、中身が返ることを確かめてください。ここまで通れば、以降の演習は進みます。
  • 5返らない場合は、フォルダの位置がネットワークドライブや OneDrive の同期フォルダの下になっていないかを見てください。演習中は C:\work のようなローカルのフォルダに置いてください。
Claude Desktop の入力欄まわり。ローカル、dl-training-app、ブランチ ai/issue-2 とワークツリーの選択、下の行にモードとモデルが並んでいる
セッションを始める前の入力欄です。上の行が環境、プロジェクトフォルダ、ブランチ(その右がワークツリーの選択)、下の行の左がパーミッションモード、右がモデルです
Tips:セッションは Ctrl+N で並べて持てます。切り替えは Ctrl+Tab です。演習では、実装のセッションとレビューのセッションを分けて使います。同じことは CLI でもできます。研修では Claude Desktop で進めます。
フックが効いているか画面で分からないプチ演習3
症状

settings.json にフックを書いたものの、効いているかどうかが画面から読み取れません。何も起きていないのか、書き方が違うのか、判断が付きません。

原因

フックは動いたときだけ画面に出ます。止めるものが何も来ていなければ、正しく登録されていても表示は変わりません。「出ない」と「効いていない」を、見た目で区別できないということです。なお、フックと permissions、プロジェクトの CLAUDE.md は Claude Desktop と CLI で共有されます。片方で書いたものが、もう片方で効かないということはありません。

直し方
  • 1まず settings.json を VSCode で開き、hooks のキーの中にイベント名が並んでいるかを見てください。Claude Desktop の入力欄に /hooks と打つと「isn't available in this environment」と返ります。登録の確認はいつもこのファイルで行います。
  • 2拒否の規則も同じファイルの permissions.deny で見ます。自分が足した行が Bash(...)PowerShell(...) の対で並んでいるかを確認してください。/permissions も入力欄では使えません。
  • 3効いていることを確かめるには、止まるはずの操作を1回頼んでください。止まった理由がフックの書いた文言で返れば、動いています。
  • 4何も出ずに実行された場合は、フックが素通りしています。Windows では、まず matcherBash|PowerShell になっているかを見てください。Bash だけだと、PowerShell ツールから打たれたコマンドではフックが呼ばれません。次に実行ポリシーの項目を見ます。
  • 5書き換えたあとは Ctrl+N で新しいセッションを開いてください。settings.json はセッションの開始時に読まれます。
Claude Desktop の入力欄で /hooks を送った結果。/hooks isn't available in this environment と返り、入力欄の上に一部のコマンドはターミナルでのみ使えるという注記が出ている
Claude Desktop の入力欄で /hooks を送ったときの画面です。この表示が出るのは故障ではなく、入力欄では使えないコマンドだからです
フックが git reset --hard を止めたときの Claude の返答。block-destructive.sh が PreToolUse で止めたことと、フックが返したメッセージの1行が引用されている
フックが止めたときの会話の表示です。どのフックが、どのイベントで止めたかと、フックが返した文言が引用されます。この1行が出れば効いています
止められたコマンドの行を展開した画面。実行しようとした Bash のコマンドと、PreToolUse:Bash hook error の行が見える
赤い「失敗しました」の行を押して展開した画面です。実行しようとしたコマンドと、PreToolUse:Bash hook error で始まるフックの出力がそのまま出ます
止まることを1回見てから先へ進んでください。 フックの故障は、画面に何も出さずに素通りする形で起きます。書いた直後に1回だけ止まるところを見ておくと、あとで疑う場所が減ります。
確認が出ないまま編集が進むプチ演習2
症状

ファイルを変更してよいかの確認が出ません。頼んだ内容がそのまま適用され、気づいたときには複数のファイルが書き換わっています。拒否の規則に当たるものは止まるので、設定が壊れているわけではありません。

原因

パーミッションモードが 自動 になっています。画面で選べるのは 自動手動編集を受け入れるプラン の4つです。編集を受け入れる でも、ファイルの編集は確認なしで進みます。新しいセッションやワークツリーに移ったときに、前と違うモードで始まっていないかを見直してください。

直し方
  • 1いまのモードを確認してください。演習中は 手動 にしておくと、どこで何を聞かれるかが見えます。
  • 2止め金の演習をしているあいだは 自動 を選ばないでください。規則とフックが止めた場面を見ることが、演習の中身です。
  • 3何を作るか先に見たいときは プラン を使ってください。ファイルは変わらず、手順だけが返ります。
  • 4すでに書き換わってしまった場合は、巻き戻しの項目へ進んでください。ファイル単位で戻せます。
Claude Desktop のモードのメニュー。自動、手動、編集を受け入れる、プラン の4つと、権限をバイパス の行が並んでいる
入力欄の下のモード名を押すと開くメニューです。自動 / 手動 / 編集を受け入れる / プラン の順に並びます
新しいセッションを開いたら、まずモードを見てください。 メッセージを送る前に入力欄の下のモード名を確認する癖をつけると、自動 のまま自社のリポジトリを触る事故を防げます。
パイプでつなぐ書き方が動かないハンズオン1
症状

差分をレビューへ渡す1行を、Claude Desktop の入力欄に貼っても動きません。-p--print を使う形は、アプリの中では実行できません。

git diff main | claude --bare -p "..." --output-format json
原因

Claude Desktop は対話で使うアプリで、非対話の実行(-p / --print)には対応していません。同じ理由で、エージェントチーム、インラインのコード補完、Bedrock などの第三者プロバイダも、アプリの側にはありません。CI の夜間ジョブが claude -p で書いてあるのは、あれが CLI で動いているためです。

直し方
  • 1統合ターミナルを開いてください。この形はターミナルから CLI を呼んで実行します。
  • 2コマンドを1行ずつ貼って流してください。出力先の findings.json ができることを確認します。
  • 3ターミナルから claude が起動しない場合は、起動の項目の折りたたみを開いてください。
  • 4対話で進める演習は、アプリの側へ戻してください。使い分けの線はここです。無人で回す形だけが CLI の仕事になります。
コマンドを打つ場所が見つからない共通
症状

手順に git worktree list のようなコマンドが出てきます。Claude Desktop の入力欄にそのまま打っても、コマンドとしては実行されません。

原因

入力欄は依頼を書くところで、シェルではありません。コマンドは統合ターミナルから実行します。この研修でコマンドを打つ場面は十数か所あり、どれも統合ターミナルにそのまま貼れる形で手順に書いてあります。

直し方
  • 1統合ターミナルを開いてください。右上の >_ アイコンか、Ctrl+バッククォートです。
  • 2開いた場所はセッションの作業ディレクトリです。dl-training-app の中にいれば、手順のコマンドはそのまま通ります。
    pwd
  • 32つ目のタブが要るときは、ターミナルペーンの + を押してください。
  • 4コマンドを頼む形でも実行できます。「git worktree list を実行して結果を見せてください」と書くと、確認のうえで実行されます。拒否の規則に当たるものは、ここで止まります。
  • 5止まった場合は、止めているのが規則なのかフックなのかを読み分けてください。理由の1行に、どちらが止めたかが出ます。
Claude Desktop で統合ターミナルを開いた画面。左にチャット、右にターミナルのペインが並び、ターミナルにはシェルのプロンプトが出ている
統合ターミナルを開いた直後です。右上のターミナルのアイコン(>_)か、Ctrl+バッククォートで開きます。右のペインがターミナルで、開いた場所はセッションの作業フォルダです。画面は Mac で撮ったもので、Windows ではプロンプトが PS C:\...> の形になります
統合ターミナルはローカルのセッションだけです。 リモートのセッションでは開きません。コマンドを使う手順は、ローカルで開いたセッションで進めてください。
Tips:ターミナルは Claude と同じ環境を共有します。ここで別のフォルダへ移ると、その先の操作も同じ場所を見ます。迷ったら pwd で確かめてください。
PowerShell が .ps1 の実行を拒むプチ演習3
症状

Claude Desktop がフックを呼んだとき、または中のターミナルから手で試したときに、赤い文字でこう出ます。

.\block-destructive.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル
C:\Users\yamada\Desktop\dl-training-app\.claude\hooks\block-destructive.ps1 を読み込めません。
詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170)
を参照してください。
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
原因

Windows の既定の実行ポリシーは Restricted で、署名の無い .ps1 を読み込めません。配布した settings.json の呼び出しは -ExecutionPolicy Bypass を付けていて、ふつうの端末ならこの形で読み込めます。エラーが出るのは、その引数を落として登録したとき、ターミナルから .\block-destructive.ps1 のように直接叩いたとき、そして会社のグループポリシーで実行ポリシーが固定されているときです。-ExecutionPolicy Bypass はその場のプロセスだけの指定で、グループポリシーの値(MachinePolicyUserPolicy)は上書きできません。

直し方
  • 1.claude/settings.json のフック登録を開き、"command": "powershell.exe"args"-NoProfile", "-ExecutionPolicy", "Bypass", "-File" が並んでいることを確認してください。
  • 2中のターミナルから手で叩くときも同じ形にします。
    powershell -NoProfile -ExecutionPolicy Bypass -File .claude\hooks\block-destructive.ps1
  • 3それでも出る場合は、いまのポリシーを確認してください。
    Get-ExecutionPolicy -List
  • 4MachinePolicyUserPolicy の行が Undefined 以外になっていたら、グループポリシーで固定された端末です。この端末では -ExecutionPolicy Bypass を付けても ps1 は動かないので、講師に知らせてください。Set-ExecutionPolicy は実行しないでください。

引数を落として叩いたときの表示です。1行目の このシステムではスクリプトの実行が無効になっているため がこの症状の目印です。

.\block-destructive.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\yamada\Desktop\dl-training-app\.claude\hooks\block-destructive.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\block-destructive.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
Tips:-NoProfile も外さないでください。個人のプロファイルが読み込まれると、そこに書いた文字コード設定や関数がフックの出力に混ざります。
Claude Code が起動しない共通
症状

Claude Desktop を開いても、演習で使う Claude Code の画面に入れません。サインインを求められたまま進まない、または起動はするものの、どのフォルダも開けない状態のままです。

原因

多いのはサインインが済んでいない場合と、アプリの版が古い場合です。社内の配布で入っている版が古いまま固定されていることもあります。

直し方
  • 1Claude Desktop をいったん終了し、もう一度起動してください。サインインの画面が出たら、案内したアカウントで入ってください。
  • 2アプリの更新が来ていないかを確認してください。更新のあとは、もう一度起動し直します。
  • 3Claude Desktop の設定画面で版を確認してください。2.1.280 以降であることが、モデルと effort の演習の前提です。
  • 4ここまでで入れない場合は講師へお知らせください。端末の側の制限であることが多く、受講者側で直せる範囲を越えます。

フォルダを開いたセッションで「こんにちは」と送り、返事の中にフォルダ名 dl-training-app が出れば、この項目の問題ではありません。

版が古いとプチ演習1の結果が変わります。 2.1.280 より前の版では、model: opus のサブエージェントが Opus 5.5 ではなく Opus 5 で動き、タスクのペインの表示が他の方と食い違います。maxEffortLevel2.1.267 より前の版では無視されます。版が上がらない場合は講師へお知らせください。
CLI 版が見つからない場合

研修は Claude Desktop で進めるので、ここは読まなくても完走できます。持ち帰って CLI でも使う方向けの補足です。

ターミナルで claude と打って次が出る場合は、導入先が PATH に入っていません。

claude : 用語 'claude' は、コマンドレット、関数、スクリプト ファイル、または操作可能な
プログラムの名前として認識されません。
    + FullyQualifiedErrorId : CommandNotFoundException

Git Bash や WSL では bash: claude: command not found の1行になります。導入の直後はターミナルを開き直してください。PATH の変更は、起動中のターミナルには届きません。それでも出る場合は、実体の場所と npm の導入先を見比べます。

where.exe claude
npm config get prefix
$env:PATH -split ';' | Select-String npm

1つ目で出たパスが3つ目の結果に含まれていなければ、アプリケーションを終了して起動し直してください。

フックの日本語が文字化けするプチ演習3
症状

フックが返す理由が読めない並びになります。

[block-destructive] 繧ウ繝槭Φ繝峨r豁「繧√∪縺励◆
原因

日本語版 Windows の PowerShell 5.1 は、指定しなければ CP932 で読み書きします。.ps1 を UTF-8 で保存して日本語のメッセージを書くと、出力がこの並びになります。読み込み側も同じで、Get-Content-Encoding UTF8 を付けないと、UTF-8 の日本語が CP932 として読まれて化けます。

直し方
  • 1自分で足したメッセージに日本語が入っていないかを確認し、英語に直してください。.ps1 はコメントも含めて ASCII だけで書きます。
  • 2日本語で残したい説明は .claude/hooks/README.md へ移してください。フックの中に説明を置く必要はありません。
  • 3PHP ファイルを読む処理を自分で足した場合は、-Encoding UTF8 が付いているかを見てください。
    $lines = @(Get-Content -LiteralPath $path -Encoding UTF8)
  • 4セッションを開き直し、sessionstart_verify の報告に ASCII 以外のバイトの指摘が残っていないことを確認してください。
この制約は自社ハーネスにも効きます。 D2 のフックは PowerShell 5.1 で動いており、同じ CP932 の上にあります。ASCII だけで書くという約束は、いまは人が守っている決まりです。sessionstart_verify のような検証を1本足せば、機械が守る側へ移せます。
改行コードでフックが不発になるプチ演習3
症状

bash 版のフックを登録した端末で、Bash ツールを使うたびにこれが出ます。

/usr/bin/env: 'bash\r': No such file or directory

環境によっては次の形になります。

bash: .claude/hooks/block-destructive.sh: /usr/bin/env: bad interpreter: No such file or directory

フックが何も出さないまま素通りするだけのこともあります。画面には失敗の表示すら出ません。

原因

行末の \r がシェバングの一部として読まれています。.sh を Windows のエディタで開いて保存し直すと、改行が CRLF に変わることがあります。WSL 上のプロジェクトを Windows 側のエディタから開いた場合も同じです。リポジトリ直下の .gitattributes.ps1 は CRLF、.sh は LF に固定していますが、ZIP で受け取ったファイルを編集したときはこの固定が効きません。

直し方
  • 1VSCode で該当の .sh を開き、右下のステータスバーの CRLF をクリックして LF を選び、保存してください。
  • 2複数ある場合は PowerShell からまとめて直せます。
    Get-ChildItem .claude\hooks\*.sh | ForEach-Object {
      $t = [IO.File]::ReadAllText($_.FullName) -replace "`r`n", "`n"
      [IO.File]::WriteAllText($_.FullName, $t)
    }
  • 3もう一度フックを手で流し、2 が返ることを確認してください。
    echo '{"tool_name":"Bash","tool_input":{"command":"git reset --hard"}}' | bash .claude/hooks/block-destructive.sh
    echo $?
  • 4Permission denied が出た場合は改行ではなく実行ビットの側です。次の項目へ進んでください。
Tips:逆向きも起こります。.ps1 が LF になると、PowerShell 5.1 が途中でパースに失敗することがあります。自社ハーネスへ持ち帰るときは、置き先のリポジトリにも .gitattributes の2行を入れてください。
フックの実行ビットが落ちているプチ演習3
症状

フックを登録したのに、止まるはずのコマンドが素通りします。手で叩くとこう返ります。

bash: .claude/hooks/block-destructive.sh: Permission denied

WSL では、chmod +x を打っても ls -l の表示が変わらないことがあります。

原因

ZIP は実行ビットを持たないので、展開した .sh644 になります。WSL から /mnt/c 配下(Windows 側のディスク)を触っている場合は、chmod を打っても元に戻ります。この位置のファイルシステムは、既定ではパーミッションを保持しません。素通りは失敗として表示されないので、気づくのが遅れます。

直し方
  • 1いまの状態を見てください。左端が -rwxr-xr-x なら実行ビットは立っています。
    ls -l .claude/hooks/*.sh
  • 2Linux 側のディスク(~/ 配下)に置いたリポジトリなら、これで直ります。
    chmod +x .claude/hooks/*.sh
  • 3/mnt/c 配下で戻ってしまう場合は、フックの登録を bash .claude/hooks/block-destructive.sh の形に変えてください。bash に渡す形なら実行ビットを見ません。
  • 4Windows で進めている方は .ps1 側を登録してください。実行ビットの概念がありません。
  • 5直したあと、止まるはずのコマンドを1回頼んで、止まることを目で確認してください。素通りは黙って起きます。
止まらない側へ倒れる故障です。 実行ビットの欠落は、フックが無いのと同じ状態を作ります。しかも画面には何も出ません。環境を移したあとは、止まることを1回確かめてから先へ進んでください。
フックは動くが毎回もたつくプチ演習3
症状

フックは効いています。ただ、Edit のたびに数秒から十数秒待たされます。ツリー全体を見る検査を足したあとに目立ちます。

原因

WSL から /mnt/c 配下を読み書きすると、1ファイルごとに変換が挟まります。フックは編集のたびに走るので、この遅さが回数分積み上がります。AI は1つの依頼で何度も編集するため、体感は人が手で書くときの比ではありません。

直し方
  • 1いまどちら側にいるかを確認してください。/mnt/c で始まっていれば Windows 側のディスクです。
    pwd
  • 2リポジトリを WSL 側のディスク(~/ 配下)へ移してください。VSCode の WSL 接続から開けば、操作感は変わりません。
  • 3移せない事情がある場合は、フックが見る範囲を編集されたファイル1本に絞ってください。標準入力の tool_input.file_path に対象が入っています。
  • 4ツリー全体の検査は CI の側へ置いてください。手元で毎回やる必要のある検査は多くありません。
Tips:環境ごとのフックの組み方は、配布物の 50_環境別のフック設計/環境別のフック設計.md にまとめてあります。WSL と Windows をまたぐ構成、対象バージョンが複数ある構成は、そちらを見てください。
判定コマンドが無くて素通りするプチ演習3・5
症状

1つ目は、レビュー結果を findings.json に落とす1行で止まります。

jq : 用語 'jq' は、コマンドレット、関数、スクリプト ファイル、または操作可能な
プログラムの名前として認識されません。

2つ目は、bash 版のフックを登録したのに、止まるはずのコマンドが実行されます。標準エラーに1行だけ出ます。セッション開始時の報告にも同じ趣旨の行が並びます。

[block-destructive] jq not found, allowing the call
原因

jq は CI の alpine イメージに入れている道具で、端末に入っているとは限りません。判定スクリプトそのものは jq を使っていません。ci/gate.ps1ConvertFrom-Json で読み、ci/gate.shci/ai_gate.sh が jq を使います。bash 版のフックも jq でペイロードを読むので、jq が無いとガードを止めずに報告して素通りさせます。全部の Bash 呼び出しを止めるより、止まらないことを大きく知らせるほうが被害が小さいという判断です。

直し方
  • 1Windows で進めている方は、フックは bash 版ではなく .ps1 側を登録してください。こちらは jq を使いません。
  • 2JSON の取り出しは ConvertFrom-Json に置き換えてください。自分で JSON を書き出すときは、BOM を付けない形にします。
    [IO.File]::WriteAllText("$PWD\findings.json", $out, (New-Object Text.UTF8Encoding $false))
    Set-Content -Encoding UTF8Out-File -Encoding utf8 は先頭に BOM を付けます。ci/gate.ps1 は読めますが、bash ci/gate.sh の jq は parse error を返します。
  • 3findings.json を開き、summaryfindings の2つのキーがあることを確認してから判定にかけます。
    powershell -NoProfile -ExecutionPolicy Bypass -File ci\gate.ps1
    $LASTEXITCODE
  • 4bash を正として持ち帰る方は、jq を入れてからフックの単体テストを流してください。1件でも合わないとランナーが 1 を返し、そのケースの出力を表示します。
    bash .claude/hooks/tests/run_cases.sh
  • 5自分で書いたフックでも同じ形を作らないでください。判定に使うコマンドが無いときにエラーを握りつぶすと、毎回通ってしまいます。command -v jq のような存在確認を先頭に置き、無ければ止めるか、標準エラーへ大きく出すかを決めてください。
  • 6CI 側は触らないでください。ジョブのイメージには jq を入れてあります。
判定の考え方は3本とも同じにしてあります。 手元の ci/gate.ps1、その bash 版の ci/gate.sh、CI が使う ci/ai_gate.sh は、どれも findings.json を読んで GATE_LEVEL 以上の件数を数えます。落ちる理由が揃っていないときは、まず文字コードを疑ってください。
Tips:素通りしたことが標準エラーに出るかどうかは、自社ハーネスでも見どころです。気づけない素通りが一番高くつきます。

設定とフックの効き方

書いたのに効かないという症状です。置き場所、再起動、JSON の壊れ、隔離起動、effort とモデルの優先順位の6件を置いています。設定は書いた瞬間ではなく、セッションの開始時に読まれます。

deny に足したのに実行されるプチ演習2
症状

拒否の規則を足したのに、頼むと実行されます。止まるはずの git reset --hard がそのまま走ります。

原因

Windows でいちばん多いのは、Bash(...) の規則だけを書いている場合です。Git for Windows が入った Windows では、Claude は PowerShell ツールでコマンドを打つので、Bash(...) の規則は当たりません。次に多いのが、書き足した先が違う場合です。Claude Code が読むのは .claude/settings.json だけで、注釈付きの .claude/settings.example.jsonc は読みません。次に多いのが、VSCode で開いたフォルダが dl-training-app の親になっていて、プロジェクトルートが別の場所になっている場合です。

直し方
  • 1セッションのプロジェクトフォルダが dl-training-app になっていることを確認してください。1つ上の階層だと、別の場所の設定が読まれます。
  • 2.claude/settings.json を VSCode で開き、permissions.deny に自分が足した行が Bash(git reset --hard *)PowerShell(git reset --hard *) のような対で並んでいるかを見てください。.jsonc のほうに書いていたら、注釈行を落として settings.json へ写します。
  • 3Ctrl+N で新しいセッションを開いてください。settings.json はセッション開始時に読まれます。
  • 4止まるはずの操作を1回頼み、permissions.deny による拒否と返ることを確認してください。
  • 5並んでいるのに実行される場合は、書き方の側です。Bash(git reset --hard *) は文字列の照合なので、/bin/rmbash -c "..." の形は当たりません。この穴を塞ぐのが PreToolUse フックです。
Tips:設定の優先は settings.local.json、プロジェクトの settings.json~/.claude/settings.json の順です。deny はどこに書いたものも合わせて効きます。
CLAUDE.md に書いた禁止が守られないプチ演習2
症状

CLAUDE.md に禁止と書いた操作が実行されます。あるいは、数ターン前に直したはずの PHP 8.0 の match 式が、新しい編集でまた入ります。

$label = match ($status) { 1 => '見積中', 2 => '受注', default => '' };
原因

CLAUDE.md は文脈であって設定ではありません。長い対話では優先度が下がり、会話の圧縮でも薄れます。公開されている不具合報告にも、禁止と書いた操作が実行された例と、指示どおりに戻せずコミットが消えた例が残っています。

直し方
  • 1破ると実害が出る約束を1つ選び、permissions.deny の1行に移してください。規則の形にします。
  • 2文字列の照合ですり抜ける形が思いつくなら、PreToolUse フックの側にも足してください。block-destructive はコマンド全文を見ます。
  • 3編集のたびに検査したい約束は PostToolUse に置いてください。対象バージョンの制約がこの位置です。
  • 4CLAUDE.md に残すのは、禁止の列挙ではなく代替の書き方にしてください。match を禁止と書くより「switch で書く」と書くほうが、次の編集に効きます。
--bare では読まれません。 claude --bare -p はフック、スキル、CLAUDE.md、MCP の自動読み込みを全部飛ばします。レビュー側に使うのは正しい用法ですが、実装側に使うと制約が1つも効きません。
フックも拒否もまとめて効かないプチ演習3
症状

フックも拒否の規則も、まとめて効かなくなります。止まるはずの操作が止まらず、差し戻されるはずの編集がそのまま通ります。さっきまで効いていたものが同時に消えるのが特徴です。

原因

JSON として読めないファイルは、丸ごと無視されます。手で足していく演習なので、末尾のカンマ、閉じ括弧の過不足、// のコメントが原因になりやすい場所です。コメントを書けるのは .jsonc のほうだけです。

直し方
  • 1VSCode で .claude/settings.json を開き、赤い波線が付いている行を探してください。
  • 2末尾のカンマを消し、// で始まる行があれば削除してください。
  • 3PowerShell で読めるかどうかを確かめます。エラーなく通れば JSON として正しい形です。
    Get-Content .claude\settings.json -Raw | ConvertFrom-Json
  • 4Claude Desktop のセッションを開き直し、止まるはずの操作を1回頼んで止まることを確認してください。
隔離起動でフックが発火しないハンズオン1
症状

元のフォルダでは止まっていたコマンドが、ワークツリーで始めたセッションでは素通りします。あるいは、ワークツリーの .claude/settings.json を開くと中身が配布時点のままです。

{
  "worktree": {
    "baseRef": "head"
  },
  "permissions": {
    "deny": [],
    "ask": [],
    "allow": []
  },
  "hooks": {}
}
原因

ワークツリーは新しいチェックアウトです。配布した settings.json には worktree.baseRef = head が入っているので、ワークツリーは開始したときに乗っていたブランチの最後のコミットから切られます。午前に足した modeleffort、拒否の規則、フックの登録は、ex/p3- にコミットしてあれば入ります。入っていないのは、開始したときに ex/p3- 以外のブランチに乗っていたか、設定をコミットしていなかったかのどちらかです。

直し方
  • 1いったんセッションをアーカイブし、元のフォルダの VSCode で左下のブランチ名が ex/p3- で始まっているかを見てください。違っていたら ex/p3- に切り替えます。
  • 2ソース管理ペインに .claude の下の変更が残っていたら、+ でステージし、メッセージを書いてコミットします。
  • 3もう一度、ブランチ名の右の ワークツリー にチェックを入れて始めてください。開いたら .claude/worktrees/ の下のフォルダの .claude/settings.json に拒否の規則が入っていることを確認します。
  • 4フックの登録を自分で書き換えた方は、.claude/settings.example.jsonc の形と比べてください。フックは入力 JSON の cwd から作業フォルダを割り出すので、ワークツリーの中でも正しい場所を検査します。
effort を下げても元に戻るプチ演習1
症状

settings.jsoneffortLevelmedium にしたのに、入力欄の右下の effort の表示が変わりません。下げても、次のプロンプトで元に戻ります。サブエージェントの effort はバックグラウンドタスクのペインに出ないので、この症状はセッション本体の話です。

原因

解決の順は、環境変数 CLAUDE_CODE_EFFORT_LEVEL--effort/effortsettings.jsonmodelSettingseffortLevel、モデル既定です。同じファイルの中では、モデルごとの modelSettings がトップレベルの effortLevel より優先されます。/effort で段を確定すると modelSettings に書き戻されるので、そのあとトップレベルを書き換えても負けます。もう1つ、~/.claude/settings.json のトップレベルに書いた effortLevel は Opus 5.5 には効きません。プロジェクトの .claude/settings.json に書いた値は効きます。

直し方
  • 1版を確認してください。Claude Desktop のバージョンは設定画面で見られます。中の Claude Code が 2.1.280 以降であることが前提です。
  • 2環境変数が残っていないかを見ます。値が返ったら、それが最優先で効いています。
    $env:CLAUDE_CODE_EFFORT_LEVEL
  • 3入力欄の右下のモデル名と effort の表示で、いま効いている値を見てください。
  • 4settings.jsonmodelSettings に今のモデルの行があれば、その行を書き換えるか、入力欄で /effort に続けて段を打って選び直してください。
  • 5上限で抑える手もあります。maxEffortLevel はどのスコープから指定しても、最も低い上限が効きます。
Tips:モデルを切り替えるとプロンプトキャッシュが失効します。1つのセッションの中でモデルを行き来させるほど、使うトークンが増えます。
サブエージェントのモデルが違うプチ演習1
症状

frontmatter に model: haiku と書いた grep-scout を呼んだのに、バックグラウンドタスクの行には別のモデル名が出ます。

原因

サブエージェントのモデルは、呼び出し時の指定、定義の frontmatter の model、環境変数 CLAUDE_CODE_SUBAGENT_MODEL、親のモデルの順に決まります。frontmatter に書いてあれば環境変数より先に効くのがふつうです。ただし環境変数 CLAUDE_CODE_SUBAGENT_MODEL_FORCE1 のときは、CLAUDE_CODE_SUBAGENT_MODEL が最優先になります。社内の配布設定で入っていることがあります。版が 2.1.251 より前だと、FORCE が無くても環境変数が先に効きます。

直し方
  • 1統合ターミナルで、2つの環境変数に値が入っていないかを確認してください。
    $env:CLAUDE_CODE_SUBAGENT_MODEL_FORCE
    $env:CLAUDE_CODE_SUBAGENT_MODEL
  • 21行目が 1 を返した場合は、それが原因です。自分で設定したものなら外し、Claude Desktop を終了して起動し直してください。会社の配布設定で入っているなら講師に知らせてください。
  • 3外せない設定であれば、そのまま進めて構いません。台帳には「この端末では CLAUDE_CODE_SUBAGENT_MODEL_FORCE で環境変数が優先された」と1行書いてください。優先順位を自分の目で確かめたことが、この演習の中身です。

巻き戻しと隔離

AI が一度に広く書き換えたあとの戻し方です。チェックポイントの届く範囲、一部だけ戻す手順、自分の手直しと混ざったときの分け方、先に範囲を絞る方法、worktree での隔離を置いています。

Esc 2回では巻き戻しの一覧が開かないプチ演習2
症状

Esc を2回押しても、巻き戻しの一覧が開きません。画面は入力待ちのまま変わりません。開いたときは、地点を選んだあとの確認画面に復元の3択が並びます。

コードと会話
会話のみ
コードのみ
原因

Claude Desktop では Esc 2回の開き方が効きません。入力欄に /rewind と打って送るのが正しい開き方です。もう1つの原因は、戻す先が無い場合です。直前の変更がシェルのコマンドによるものなら、ファイルは戻りません。

直し方
  • 1入力欄に次を打って送ります。
    /rewind
  • 2一覧から、戻したい地点のメッセージを選びます。
  • 3確認画面の「復元」で コードのみ を選び、巻き戻し を押します。ファイル編集ツールで変えたファイルだけが戻り、シェルのコマンドで動かしたファイルは残ります。
  • 4メッセージにマウスを乗せると出る巻き戻しのアイコンからも、同じ確認画面に進めます。
Claude Desktop で /rewind と打って開いた巻き戻しの一覧。これまでのメッセージが上から順に並んでいる
/rewind を送った直後の画面です。これまでのメッセージが並び、戻したい地点の文を選ぶと確認画面に進みます
巻き戻しの確認画面。戻る地点のメッセージ、復元の欄、変更されるファイル数 +4 -1、シェルコマンドによる変更は元に戻されないという注記、キャンセルと巻き戻しのボタン
地点を選んだ後の確認画面です。戻るファイルの数と行数が出ます。「シェルコマンドによる変更は元に戻されません。コミットはそのまま残ります」の注記が、この機能の守備範囲そのものです
確認画面の復元のプルダウンを開いたところ。コードと会話、会話のみ、コードのみ の3つが並んでいる
「復元」のプルダウンを開いたところです。コードと会話 は両方、会話のみ はファイルを残して会話だけ、コードのみ は会話を残してファイルだけ戻します。手順3で選ぶのは コードのみ です
戻せる範囲は狭いと考えてください。 チェックポイントが持つのは Edit と Write の変更と会話です。シェルのコマンドによる変更、サブエージェントの変更、手で直した分、シンボリックリンクは戻りません。保持の期間にも上限があります。ツールを跨いで効く保険は、タスク前後のコミットだけです。
巻き戻しても戻らない変更があるプチ演習2
症状

復元で コードのみ を選んだのに、ファイルが元に戻りません。プチ演習2では、この形で残ります。

$ ls app/libraries
sql_lib.php
util.bak
原因

ファイル名を変えたのがシェルのコマンド経由だからです。チェックポイントが持っているのはファイル編集ツールの変更だけで、シェルのコマンドで動かした結果は対象の外にあります。同じ理由で、サブエージェントの変更と、エディタで手で直した分も戻りません。AI に「全部やり直して」と頼んでも、この差は埋まりません。

直し方
  • 1VSCode のソース管理ペインを開いてください。シェルのコマンドで動かした分も、ここには変更として出ます。チェックポイントより広い範囲が見えます。
  • 2戻したいファイルの行にカーソルを合わせ、右端の 変更を破棄(戻る矢印)を押してください。そのファイルだけが直前のコミットの状態に戻ります。
  • 3すでに push した変更を取り消す場合は、GitLab の Web 画面でマージ済みの MR を開き、右上の Revert を押してください。打ち消すコミットが新しく積まれ、履歴は残ります。
  • 4次のタスクに入る前にコミットしてください。戻せる単位はコミットの単位です。
Tips:「さっきの変更を戻して」と頼んだら git reset --hard が走った事例が報告されています(issue #17190)。拒否の規則を Bash(...)PowerShell(...) の対で入れ、フックも入れておけば、この頼み方でも止まります。
AI の変更を一部だけ戻したいプチ演習2
症状

1回の依頼で20ファイルが書き換わりました。当たっている修正と、外している修正が混ざっています。巻き戻しの コードのみ は選んだ点まで全部を戻すので、当たっている分も一緒に消えます。

原因

チェックポイントの単位はセッションの時点で、ファイルや行では選べません。粒度を選べるのは git の側です。AI は1つの依頼で広く触るので、人が手で書くときより、この粒度の差が効いてきます。

直し方
  • 1VSCode のソース管理ペインを開き、変更されたファイルの一覧を出してください。これが AI が触った範囲です。
  • 2戻したいファイルの行で 変更を破棄 を押してください。そのファイルだけが直前のコミットの状態に戻ります。
  • 31つのファイルの中の一部だけ戻す場合は、ファイル名をクリックして差分を開き、戻したい塊の上で右クリックして 選択した範囲を元に戻す を選びます。左側が元、右側が今の状態です。
  • 4残した変更だけでテストを流してください。AI の変更どうしが依存していることがあり、片方だけ残すと通らない場合があります。手元に PHP は入っていないので、コミットして push し、CI の testtest-phpunit のジョブの結果で確かめます。
  • 5どのファイルを残し、どれを捨てたかを台帳に1行書いてください。同じ依頼をもう一度出すときに、範囲を絞る材料になります。
AI を呼ぶ前のコミットが前提です。 直前のコミットが AI に渡す前の状態になっていれば、部分ロールバックは「差分を捨てる」だけで済みます。コミットせずに渡すと、戻す先が自分の手直しの途中になり、どこまで戻すかの判断から始まります。
自分の手直しと AI の変更が混ざったプチ演習2
症状

AI に直させたあと、自分でも手を入れています。あとから AI の分だけを取り消したくなっても、どの行が誰の分か分かりません。ソース管理ペインはファイル単位でしか教えてくれません。

原因

どちらも未コミットの変更として同じ場所に積まれています。チェックポイントはファイル編集ツールの変更しか持たないので、巻き戻しで コードのみ を選ぶと自分の手直しだけが残る形になり、意図した状態とずれます。

直し方
  • 1すでに混ざっている場合は、ソース管理ペインでファイルをクリックして差分を開いてください。自分が書いた塊の上で右クリックし、選択した範囲をステージ を選びます。
  • 2自分の分を全部ステージしたら、メッセージを書いてコミットしてください。「手直しの分」と1行で構いません。
  • 3残った未ステージの変更が AI の分です。この状態なら、丸ごと捨てるか、ファイル単位で戻すかを選べます。
  • 4どちらの分か判断が付かない塊は、捨てずに残してください。あとから履歴で追えるのは、コミットした分だけです。
  • 5次からは混ざる前に切ってください。AI に渡す直前にコミットを1つ打ち、AI の出力をそのまま2つ目のコミットにし、自分の手直しを3つ目にします。この順にすると、上の作業がまるごと要らなくなります。
Tips:「AI が触った範囲」は、AI の出力だけを入れたコミットの差分そのものです。分けてコミットしておくと、あとから範囲を測れます。何ファイル触ったかという数字は、次の依頼の粒度を決めるときに効きます。
変更の範囲を先に絞りたいプチ演習3
症状

止めたいコマンドは拒否の規則とフックで止まります。ただ、「30ファイルを一度に書き換える」「頼んでいないディレクトリまで触る」といった範囲の広さは止まりません。気づくのは終わったあとです。

原因

拒否の規則もフックも、見ているのはコマンドの種類だけです。変更の量と場所は見ていません。範囲は依頼の文面に書いてあるだけで、機械が守っている決まりにはなっていません。

直し方
  • 1依頼の時点で触ってよい場所を書いてください。「app/libraries/util.php の中だけ」のように、先に決めます。
  • 2PreToolUse のフックで、Edit と Write の対象パスを見てください。範囲の外なら 2 で返します。
    if ($payload.tool_input.file_path -notlike "*\app\libraries\*") { exit 2 }
  • 3件数で見る場合は PostToolUse の側です。変更されたファイルの本数を数え、決めた本数を超えたら標準エラーへ出してください。止めずに知らせるだけでも効きます。
    (git status --short | Measure-Object).Count
  • 4作業そのものを隔離すると、範囲はそのワークツリーの中に収まります。ブランチ名の右の ワークツリー にチェックを入れて始めてください。
  • 5どの絞り方を選んだかを台帳に書いてください。パスで絞ったのか、件数で知らせたのか、隔離したのかで、戻す手間が変わります。
先に絞った分だけ、戻す作業が小さくなります。 範囲の制限は止め金であると同時に、巻き戻しの設計でもあります。AI が触る範囲を10ファイルに抑えれば、部分ロールバックで見る差分も10ファイルで済みます。
隔離した作業の始め方ハンズオン1
症状

手順に「隔離して起動してください」と書いてあります。どこから作るのかが分かりません。

原因

ワークツリーはアプリの画面から作ります。入力欄の上の行で、ブランチ名の右に ワークツリー のチェックがあり、チェックを入れて始めると、同じリポジトリの別のチェックアウトで作業が始まります。元のフォルダはそのまま残るので、手元の作業と並べて進められます。

直し方
  • 1始める前に .claude の変更をコミットしておいてください。ワークツリーは開始したときのブランチの最後のコミットから切られ、コミットしていない設定は持ち込まれません。
  • 2ブランチ名の右の ワークツリー にチェックを入れ、入力欄に1行送ってセッションを開始してください。名前を入れる欄はありません。
  • 3入力欄の上に出た worktree- で始まるブランチ名を控えてください。作業用のフォルダは <プロジェクトルート>/.claude/worktrees/ の下に1つできます。
  • 4作業が終わって push まで済んだら、サイドバーのアーカイブのアイコンで削除してください。
Claude Desktop の入力欄の上の行。ブランチ名 main の右にある ワークツリー のチェックが入った状態
ブランチ名の右の ワークツリー にチェックを入れた状態です。この状態でセッションを始めると、.claude/worktrees/ の下に作業用のコピーが作られます
隔離すると .env が無いハンズオン1
症状

worktree で作業を始めたら、動いていたはずのものが動きません。設定ファイルを探すと、.env のような無視対象のファイルが入っていません。

原因

worktree は新しいチェックアウトなので、入るのは追跡されているファイルだけです。.gitignore に書いたファイルは持ち込まれません。鍵や接続先を .env に置いている場合、隔離した側からは見えなくなります。

直し方
  • 1プロジェクトルートに .worktreeinclude があるかを見てください。演習リポジトリには配布時点で入っています。
  • 2持ち込みたいファイルを1行ずつ書きます。
    .env
    .env.local
  • 3もう一度 worktree を作り直し、書いたファイルが入っていることを確認してください。
  • 4鍵そのものを書かないでください。持ち込むのはファイルの名前で、中身は元の場所から写されます。.worktreeinclude はコミットするファイルで、演習リポジトリには .env の行が入った状態で配布しています。
隔離のあとブランチが使えないハンズオン1
症状

隔離して作業したあと、元のフォルダで作業を続けようとすると弾かれます。

fatal: 'worktree-issue-1' is already used by worktree at
'C:/work/dl-training-app/.claude/worktrees/...'

ブランチ名とフォルダ名は、ワークツリーを作ったときに自動で付いた名前になります。この資料の worktree-issue-1 は、控えた名前に読み替えてください。

あるいは、元のフォルダのソース管理ペインを見ても、隔離中に作ったコミットが出てきません。

原因

同じブランチを2つの作業ツリーで同時にチェックアウトすることはできません。隔離中のコミットはワークツリーのブランチの側にあり、元のフォルダの ex/p3- には入っていません。元のフォルダは ex/p3- のままで正しい状態です。

直し方
  • 1いまある作業ツリーの一覧を見てください。ここはコマンドを使います。
    git worktree list
  • 2隔離したフォルダを VSCode でもう1つ開いてください。ファイル から フォルダーを開く で、.claude/worktrees/ の下にできたフォルダを選びます。ここに隔離中のコミットが見えます。
  • 3その窓のソース管理ペインから push してください。初回は ブランチの発行 の表示になります。
  • 4MR は GitLab の Web 画面で作ります。push 後に画面上部へ出る Create merge request から、ソースに控えたブランチ(この資料の worktree-issue-1)、ターゲットに main を選んでください。
  • 5push が済んでから片付けます。サイドバーの worktree の行にあるアーカイブのアイコンを押すと削除されます。
終了時の確認を読み飛ばさないでください。 隔離したセッションを終えるとき、worktree を残すか消すかを聞かれます。消すと、その中の未 push のコミットも一緒に消えます。押す前に、push が済んでいるかを確かめてください。

対象バージョンの制約とテスト

このプロジェクトの対象は PHP 7.4 です。検査は手元の check-phpver フックと、CI の lint-phpver の2か所です。フックは phpcs の PHPCompatibility があればそれを使い、無ければ正規表現で見ます。lint-phpverphp -lphp ci/undefined_functions.php の2段です。どこで捕まえたかによって直す場所が変わる5件を置いています。

対象バージョンの決め方プチ演習4
症状

いま動いている環境の版と、これから移す先の版が違います。どちらを検査の対象に書けばよいか迷います。

原因

検査の対象を現行の版に合わせると、移行のときに書き直す量が増えます。逆に新しすぎる版を書くと、いまの環境で動かないコードが通ってしまいます。この演習では移行先の 7.4 を対象に置いています。

直し方
  • 1リプレイスの予定がある場合は、移行先の版を対象に書いてください。現行より新しい構文は止まりますが、移行のときにそのまま持っていけます。
  • 2対象は設定ファイルの1か所に書き、フックと CI の両方がそこを読む形にしてください。2か所に書くと、片方だけ上げたときに食い違います。
  • 3AI が素で書きたがるのは、もっと新しい版の構文です。match 式、enumreadonly、名前付き引数、コンストラクタプロモーション、str_contains?-> は、どれも 7.4 には入っていません。
  • 4現行の環境でしか動かさない部分がある場合は、そこだけ別の対象を持たせてください。1つのリポジトリに複数の対象があること自体は、おかしなことではありません。
構文検査を通っても実行時に落ちるものがあります。 str_contains() は関数の呼び出しなので、php -l の構文検査は通ります。7.4 で実行すると Call to undefined function になります。CI の lint-phpver はこれを2段目の php ci/undefined_functions.php で落とします。構文だけを見る層では捕まえられないので、関数の有無を見る段を別に置いてください。
phpcs が入っていないプチ演習4
症状

手で phpcs を叩くと、コマンドが見つからない旨のメッセージになります。フックの側は phpcs が無くても何も表示せずに正規表現の検査へ進むので、差し戻しはそのまま起きます。phpcs は入っているのに規格が無い端末では、フックの標準エラーに次の1行が出て、同じく正規表現の検査へ進みます。

[check-phpver] PHPCompatibility standard not installed, using the regex fallback
原因

端末に PHP と phpcs を入れていないためです。演習では入れなくても進みます。フックは phpcs が見つからないときに正規表現で代替し、対象外の構文と関数を並べた表の分だけ見ます。

直し方
  • 1そのまま進めてください。正規表現版でも match 式、enumreadonly?-> などの構文と、str_contains()str_ends_with() などの関数の呼び出しは捕まります。
  • 2誤検知が出た場合は、指摘された行を開いて確認してください。正規表現版はコメントと引用符の中身を外してから照合しますが、文字列の中のエスケープまでは追わないので、まれに当たります。
  • 3最終の判定は CI の lint-phpver です。1段目の php -l が構文を、2段目の php ci/undefined_functions.php が関数の有無を見ます。
  • 4自社の環境に入れる場合は、規格の配布元を見てください。https://github.com/PHPCompatibility/PHPCompatibility です。導入の手順は社内の PHP 環境に依存するため、この場では扱いません。
対象内の行が差し戻されるプチ演習4
症状

該当する構文が無い行が差し戻されます。

[check-phpver] code that PHP 7.4 cannot run:
  C:\...\app\views\estimate_list.php:44  nullsafe operator (?->) (8.0)  ->  write isset($a) ? $a->b : null
Rewrite these lines with the form shown after the arrow, then edit again.
Arrow functions, typed properties, ?? and the spaceship operator are all fine on 7.4.
原因

正規表現版はコメントを外し、引用符で囲まれた文字列の中身を空にしてから照合します。それでも、文字列の中にエスケープした引用符があると区切りを読み違え、画面に出す文言の一部が照合に残ることがあります。文字コードの読み違いでも起こります。日本語コメントを CP932 として読むと、コメントの区切りが崩れて同じ形に見えます。

直し方
  • 1指摘された行を開き、実際に 7.4 で動かない構文や関数があるかを目で確かめてください。
  • 2無ければ、文字列の書き方の側です。エスケープした引用符を含む文言を変えられるなら変え、変えられないなら phpcs を入れて正規表現版を使わない形にします。
  • 3ほかの行でも同じ誤検知が出る場合は、読み込みの文字コードを疑ってください。Get-Content-Encoding UTF8 が付いているかを見ます。
  • 4アロー関数 fn() と型付きプロパティは 7.4 で動きます。これが指摘されたら、フックを自分で書き換えたときの取りこぼしです。
lint ジョブだけが赤になるプチ演習4
症状

push すると lint-phpver だけが赤になり、後ろの testtest-phpunit が動きません。ログには、1段目で落ちたときは PHP Parse error で始まる行と Errors parsing に続くファイル名の行が、2段目で落ちたときは次の行が出ます。

undefined_functions: PHP 7.4 に無い関数を呼んでいます。php -l は通りますが実行時に落ちます。
原因

lint-phpver は対象バージョンの PHP 7.4 で2段の検査をします。1段目の php -l は構文を見るので、match 式のような 8.0 以降の構文はここで落ちます。2段目の php ci/undefined_functions.php は、呼んでいる関数が 7.4 にあるかを function_exists() で確かめるので、str_contains() のような 8.0 で入った関数はここで落ちます。手元のフックを登録していれば編集の直後に差し戻されるはずなので、落ちたということは、その端末でフックが効いていないか、CI 側だけに届いた変更です。

直し方
  • 1ログに出た行番号を開き、対象バージョンで動く書き方に置き換えてください。match 式なら switchstr_contains() なら strpos() です。ハンズオン1 のように Issue が「直さずに記録」を求めている場合は、置き換えずに行番号とエラーの1行目をそのまま記録します。
  • 2同じ構文や関数がほかにも無いかを確認してから push してください。
  • 3フックが効いていなかった方は、settings.jsonhooksPostToolUse が並んでいるかを確認してください。
段ごとに見ているものが違います。 1段目は構文だけ、2段目は関数の有無だけを見ます。クラスやメソッドが 7.4 にあるかどうかは、どちらの段も見ていません。ジョブが緑になったことは、対象バージョンで動く証明にはなりません。
検査用の見本ファイルで lint が落ちるプチ演習4
症状

フックのテストケースを足したあと、lint-phpver のジョブが落ちます。ログの Errors parsing の行に、足した見本のファイル名(.claude/hooks/tests/fixtures/ の下の .php)が出ます。

原因

CI の lint はツリーの中の *.php を全部 php -l に掛けます。対象バージョンで動かない見本を .php の名前で置くと、見本そのものが構文エラーとして拾われます。配布した見本の拡張子が .php.txt なのはこのためです。

直し方
  • 1足した見本のファイル名を .php.txt に戻してください。
  • 2.claude/hooks/tests/cases.jsonfixture の値も、同じ名前に直してください。
  • 3単体テストを流し、全件が合格することを確認してください。
    powershell -NoProfile -ExecutionPolicy Bypass -File .claude\hooks\tests\run_cases.ps1
  • 4ランナーは実行のたびに一時ディレクトリへ .php として写します。検査そのものは、拡張子を変えても同じように走ります。

GitLab と CI

push、パイプライン、AI レビューのジョブで止まる6件です。CI で止まったときは、ジョブのログの最初の10行と最後の10行で切り分けられます。

main に push できない共通
症状

push すると VSCode の右下に赤い通知が出ます。出力ペインの Git を開くと、この文面が入っています。

remote: GitLab: You are not allowed to push code to protected branches on this project.
 ! [remote rejected] main -> main (pre-receive hook declined)
原因

main にブランチ保護がかかっており、合流の経路は MR だけです。受講者の権限は Developer なので、直接 push は必ず弾かれます。ブランチを切らずに編集を始めたときに出ます。

直し方
  • 1VSCode の左下、青いステータスバーにいまのブランチ名が出ています。main になっていないかを確認してください。
  • 2main のままなら、そのブランチ名をクリックし、上に出る一覧から 新しいブランチの作成 を選び、ex/p1-yamada のように、その演習のブランチ名を付けてください。コミット前の変更はそのまま移ります。
  • 3ソース管理ペインでメッセージを書き、チェックマークでコミットしてください。続けて ブランチの発行 を押すと、そのブランチが GitLab 側にできます。
  • 4MR は GitLab の Web 画面で作ります。push のあと、プロジェクトの画面上部に Create merge request のボタンが出ます。
  • 5ボタンが出ていない場合は Code から Merge requests を開き、New merge request でソースに自分のブランチ、ターゲットに main を選んでください。
Tips:ブランチ名のユーザー名の部分は、社用メールアドレスの「@ より前」をそのまま使ってください。一覧で見たときに、誰の演習かが分かります。
見覚えのないブランチや MR が一覧に並ぶ共通
症状

GitLab の Code > BranchesMerge requests を開くと、ご自身が作った覚えのない行が受講者の人数ぶん並びます。パイプラインの一覧も同じです。

原因

演習リポジトリは dl-training-app の1つで、受講者全員がここを使います。書き込む先は ex/<演習番号>-<ユーザー名> という人ごとのブランチに分かれており、ユーザー名は社用メールアドレスの「@ より前」なので重なりません。main にはブランチ保護がかかっていて、合流の経路は MR だけです。その MR も演習中はマージしないため、main は2日間動きません。他の方の変更がご自身の手元へ入ってくることも、ご自身の変更が他の方の画面に現れることもありません。

直し方
  • 1直す必要はありません。全員の行が見える状態が正しい状態です。
  • 2ご自身の行は、一覧の上にある検索欄にご自身のユーザー名を入れて絞ってください。ブランチ名に入っています。
  • 3他の方のブランチには切り替えず、他の方の MR にも Merge を押さないでください。守るのはこの2つだけです。
  • 4仕組みの詳しい説明は、共通の章の「1つのプロジェクトを全員で使う形」にあります。
Tips:MR が開いたまま残ることには意味があります。2日間に誰が何を試して、どの指摘をどう判断したかが、MR の一覧としてそのまま記録になります。
パイプラインが pending のまま動かない共通
症状

MR を出してもジョブが pending のままです。ジョブを開くと、上部にこの文言が出ます。

This job is stuck because the project doesn't have any runners online assigned to it.

タグを付けた場合は次の形になります。

This job is stuck because you don't have any active runners online or available
with any of these tags assigned to them: ...
原因

ジョブを実行する runner が空いていないか、オフラインです。runner は1台です。全員が同じ時間に push すると、並列数の上限で順番待ちになります。ハンズオン3では nightly_implement が1本最長30分 runner を使うので、その間に出した MR のパイプラインも後ろに並びます。この場合の pending は異常ではありません。

直し方
  • 12分ほど待ってから、パイプラインの画面を再読み込みしてください。順番待ちなら、ここで動き始めます。
  • 25分以上動かない場合は、講師へお知らせください。runner の状態は受講者の権限では見られません。
  • 3待っているあいだは、手元でできる作業を先に進めてください。レビューの記録と、MR の説明欄の記入は CI を待ちません。
GitLab の Pipelines 一覧。左端の Status 列に Passed と Warning が並び、各行に branch か merge request のラベルが付いている
手順1で再読み込みする Build > Pipelines の一覧です。左端の Status 列が状態で、この画面には緑の Passed と橙の Warning だけが写っています。順番待ちの行は同じ列に pending と出ます。自分の行は、Pipeline 列のコミットメッセージの下に付くブランチ名で探すか、上の検索欄に自分のブランチ名を入れて絞ります。branchmerge request のラベルは同じ push で走った2本の区別です

ジョブ画面の上部に出る文言です。stuck の語が出ていれば順番待ちではなく、runner 側の問題です。

This job is stuck because the project doesn't have any runners online assigned to it.
ai_review が緑なのにコメントが付かないハンズオン2
症状

ai_review ジョブは緑で終わるのに、MR にコメントが1本も付きません。ジョブのログにこの1行が出ています。

[ai_review] CI/CD変数 ANTHROPIC_API_KEY が未設定のため、レビューを実行せずに終了します

artifacts の findings.json を開くと、findings が空で "skipped":"no_api_key" が入っています。指摘が0件なので ai_gate も緑になり、ゲートが何も止めていない状態で MR がマージできる形になります。

トークン側が足りないときは、こちらは落ちます。ログの末尾はこの形です。

ci/ai_review.sh: line 20: GITLAB_BOT_TOKEN: CI/CD変数 GITLAB_BOT_TOKEN が未設定です

ハンズオン3の nightly_implement は、キーが無いと先頭の確認で止まります。「実装を開始します」の行は出ず、ci_logs/ も作られません。

ci/nightly_implement.sh: line 15: ANTHROPIC_API_KEY: CI/CD変数 ANTHROPIC_API_KEY が未設定です
ERROR: Job failed: exit code 1
原因

ジョブが使う変数が登録されていないか、登録はされていても Protect variable が付いています。保護付きの変数は、保護されたブランチのパイプラインにしか渡りません。受講者のブランチは保護対象ではないので、値が届かずこの形になります。ai_review が緑で終わるのは、読むだけのジョブを環境の不備で赤にしない作りにしているためです。落とす判断は ai_gate の側にあり、指摘が0件なら通ります。緑だから安全、とは読めません。

直し方
  • 1これは講師側の設定で、受講者の権限では CI/CD の変数の画面は見られません。講師へお知らせください。
  • 2講師から直ったと連絡があったら、MR の画面の Pipelines タブで該当の行の右端にある再実行のボタンを押してください。push をやり直す必要はありません。nightly_implement の場合は、同じ手動ボタンをもう一度押します。
  • 3キーが無いまま緑になった ai_review の回は、計測表の「CI の ai_review」の行に「未実施」と書いてください。指摘0件として数えると、比較が壊れます。
鍵をリポジトリに置かないでください。 手元で値を渡して回避したくなりますが、コミットに入ると取り消せません。鍵を使う処理は CI 側に寄せるのが、この演習で採る形です。
ai_gate が赤にならないハンズオン2
症状

ai_gate のログには止めた記録が出ているのに、パイプライン全体は緑で、MR はマージできる状態のままです。ジョブ名の横に Allowed to fail の表示が付いています。

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

ゲートで止めた指摘 2 件
  [P1] app/controllers/estimate_ctl.php:36 date_to が条件に使われず、範囲の上限が効きません

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

.gitlab-ci.ymlai_gateallow_failure: true が入っています。初期状態はこれです。列挙だけを見せて、落とす判断は受講者が自分で入れる順番にしてあります。なお、この行を外してパイプラインが赤になっても、演習のプロジェクトでは Merge ボタンは押せます。Pipelines must succeed を設定していないためです。押せますが押しません。

直し方
  • 1.gitlab-ci.yml を開き、ai_gate の節の allow_failure: true の1行を消してください。
  • 2コミットして push し、パイプラインが赤くなることを確認してください。ここで1回落ちる記録が、この演習の合格の形です。
  • 3指摘を直してもう一度 push し、緑に戻してください。
  • 4落とす重大度を変えたい場合は、allow_failure ではなく GATE_LEVEL を動かしてください。P1 は P0 と P1 を止め、P2 はそこに P2 を加えます。
Tips:指摘の中身を変えたいのか、通す基準を変えたいのかは、別の話として扱ってください。前者は REVIEW.md、後者は GATE_LEVEL です。2つのジョブに分けてあるのは、後から追えるようにするためです。
指摘が差分の前半に偏るハンズオン2
症状

ai_review は緑で、MR のコメントも投稿されているのに、指摘が差分の前半のファイルに偏ります。後半で入れた変更には1件も付きません。

原因

差分が長いと、先頭の一定量で打ち切ってからモデルに渡しています。打ち切ったことはプロンプトには書いていますが、指摘そのものは前半に偏ります。

直し方
  • 1MR を分けてください。1本を小さく保つほうが、しきい値を上げるより効きます。レビューの質は差分の長さで下がります。
  • 2分けられない事情があるときだけ、CI/CD Variables に AI_REVIEW_DIFF_CHAR_LIMIT を足して上限を上げてください。
  • 3上げた場合は、モデルの選択も見直してください。差分の行数で切り替えるしきい値は AI_REVIEW_DIFF_THRESHOLD です。
  • 4台帳には、どこまで読まれた状態の指摘なのかを1行残してください。件数の比較に効きます。

夜間ループと Stop hook

無人で回すときに止まる9件です。1回目は止まる前提で流します。どこで止まったかを計測表に書くところまでが演習なので、緑にならなくても先へ進んでください。

手動ボタンが押せないハンズオン3
症状

パイプラインの一覧に nightly_implement の再生ボタンが出ていない、または灰色で押せません。ジョブを開くと、上部にこの文言が出ています。

This job requires a manual action

別の形では、ジョブの状態が createdskipped のまま動きません。

原因

3つのどれかです。1つ目は、前の段(lint と test)がまだ終わっていない場合で、implement の段はその後に来ます。2つ目は、押しているパイプラインのブランチに権限が無い場合です。保護ブランチのパイプラインの手動ジョブは、そのブランチへのマージ権限を持つアカウントだけが押せます。演習の main は Developer にもマージを許しているので、受講者も main の手動ジョブを押せます。押せても押しません。ハンズオン3 の Step 3 は講師が main で流し、Step 5 で各自が自分のブランチで押します。3つ目は、pipeline schedule から起動されたパイプラインを見ている場合で、そこでは手動ボタンではなく自動で走る形になります。

直し方
  • 1Build > Pipelines の行の Stages で、lint と test の丸が緑になるまで待ってください。test-phpunit が2分ほど長くかかります。
  • 2緑になったら画面を再読み込みし、いちばん右の丸に再生ボタンが出ていることを確認してください。
  • 3押すのはハンズオン3 の Step 5 で、自分のブランチのパイプラインの行です。それより前に押してしまった場合は、そのジョブの Cancel を押してください。
schedule が有効のまま残っているハンズオン3
症状

Pipeline schedules の一覧で、自分の行が Active になっています。Next Run に翌日の 2:00 が入っています。

原因

Activated のチェックが既定で入っており、外さずに保存しています。このままだと翌日の 2:00 に受講者の人数ぶんの nightly_implement が同時に走り、runner と API の予算を使います。

直し方
  • 1Build > Pipeline schedules を開き、自分の行の Active のトグルを切ってください。表示が Inactive に変わります。
  • 2すでに走ってしまった場合は、Build > Pipelines で起動元が schedule の行を探し、Cancel を押してください。
  • 3行の右端の再生ボタン(Run pipeline schedule)も押さないでください。schedule を手で即時起動するボタンで、同じことが起きます。
GitLab の Pipeline schedules 画面。まだ schedule が無く、説明文と Create a new pipeline schedule のボタンだけが表示されている
手順1で開く Build > Pipeline schedules の画面です。写っているのはまだ schedule が1本も無いときの表示で、中央の Create a new pipeline schedule から作ります。有効な schedule があると、ここが一覧に変わり、行に Active のトグルと Next Run が出ます。この画面に戻っていれば、翌日に走るものはありません
夜間ジョブが30分で打ち切られるハンズオン3
症状

「実装を開始します」の行のあと、ログが動かないまま30分が過ぎ、末尾にこの行が出て終わります。

ERROR: Job failed: execution took longer than 30m0s seconds

artifacts の ci_logs/ は残りますが、claude-issue-4.json が空か、途中で切れた JSON になっていることがあります。

原因

.gitlab-ci.ymltimeout: 30m が効いています。--max-turns 15 は回数の上限で、1ターンが長いと回数に届く前に時間のほうが先に来ます。tests/run_tests.php が DB の接続待ちで固まった場合と、影響範囲の調査で grep-scout がツリー全体を読みに行った場合に起こります。

直し方
  • 1timeout--max-turns は上げないでください。1本あたりの所要時間と費用が読めなくなります。
  • 2計測表には「時間の上限で打ち切られた」と書き、直す層は「Issue の粒度」を選んでください。Issue の「対象ファイル」を2本に絞った版を予備の Issue #5 の形で書くのが、研修後の課題です。
  • 3ジョブ画面の上部の経過時間が動いているあいだは、打ち切りではなく実行中です。25分を過ぎたら講師へお知らせください。
夜間ジョブが許可待ちで終わるハンズオン3
症状A

nightly_implement は数十秒で終わり、ログの末尾はこうなります。ブランチもコミットもできていません。

turns: 1 / cost_usd: 0.01 / is_error: false
変更がありません。MRは作りません。どこで止まったかは ci_logs/claude-issue-4.json を見てください。

結果 JSON の result には、ツールの使用許可を求める文が入っています。

配布のスクリプトでは3つの引数がそろっているので、ここで終わるのは次の症状Bのほうが多いです。

症状B

結果 JSON(ci_logs/claude-issue-4.json)の permission_denialscurl を使おうとした記録が入り、result が「受入条件が特定できない」で終わります。拒否は .err には出ません。

原因

症状Aは、非対話の -p では確認が要る操作がすべてその場で拒否されるためです。確認を出す相手がいないので、書き換えもコマンドも通らずに終わります。無人で動かすには --permission-mode dontAsk--allowedTools--max-turns の3つで、許す範囲と回数の上限を決めます。症状Bは、SKILL.md の手順1 が Issue 本文の取得に curl を使う一方、--allowedTools に渡しておらず、ci/settings.ci.jsondeny にも Bash(curl *) が入っているためです。SKILL.md が意図した止め金として書いている箇所で、ハンズオン3 の1回目はここで終わります。

直し方
  • 1ci/nightly_implement.sh の起動行を開き、3つの引数がそろっているかを確認してください。
    claude -p "$PROMPT" \
      --permission-mode dontAsk \
      --allowedTools "Read,Edit,Write,Grep,Glob,Bash(php *),Bash(git add *),Bash(git commit *)" \
      --max-turns 15 \
      --output-format json
  • 2Bash(git add *)* の前の半角スペースを消さないでください。Bash(git add*) と書くと別のコマンドにも当たります。
  • 3結果 JSON を開き、拒否されたツールの名前を確かめてください。--allowedTools に無いツールを使おうとして止まっている場合は、許すべきツールかどうかを先に判断します。
  • 4ブランチ作成と push は、エージェントではなくスクリプトの仕事にしてあります。ここを許すと、止め金の外で push できてしまいます。渡すツールを増やす前に、その線を動かしてよいかを考えてください。
  • 5症状Bの直し方は1通りです。ci/nightly_implement.shPROMPT に「Issue の本文は _issues/issue-4.md にあります」の1行を足して、Read で読ませます。--allowedToolsBash(curl *) を足しても、ci/settings.ci.jsondeny が先に効くので通りません。外へ出る経路を増やさない形が、夜間の実行に向いています。
許すツールの一覧が、無人運転の仕様です。 対話のときは人が1つずつ判断していた部分が、ここでは書いた一覧だけになります。増やす前に、そのツールが外へ出るかどうかを見てください。
夜間ジョブが MR を作らないハンズオン3
症状

ジョブは緑で終わっているのに、MR の一覧に何も増えません。ログの末尾はこの1行です。

変更がありません。MRは作りません。どこで止まったかは ci_logs/claude-issue-4.json を見てください。
原因

差分が1行も無いときは MR を作らない作りにしています。原因は3つのどれかです。許可待ちで止まった、Issue の本文を読んで「変更不要」と判断した、途中でターン数の上限に当たった。

直し方
  • 1ジョブ画面の右側の Job artifactsBrowse を押し、ci_logs の中の claude-issue-4.json をクリックして開いてください。
  • 2num_turns を見ます。15 に張り付いていれば上限で打ち切られています。Issue の粒度が大きすぎるので、範囲を狭めてください。
  • 312 で終わっていれば許可待ちです。前の項目の手順へ進んでください。
  • 4result に「変更は不要」という趣旨の文が入っていた場合は、Issue の 期待する振る舞い受入条件 を読み直してください。人が読んで曖昧なら、エージェントも同じところで迷います。
  • 5止まった箇所と、どの層の設定で直すかを台帳に1行書いてから再実行してください。
MR の作成が 403 で弾かれるハンズオン3
症状

コミットと push は通っているのに、MR が立ちません。ci_logs/ とジョブログの末尾に GitLab の応答が出ます。

remote: GitLab: 403 Forbidden - You are not allowed to create merge request
原因

夜間ジョブは、push に使ったトークンの権限で MR を作ります。CI_JOB_TOKEN では通りません。GITLAB_BOT_TOKEN のスコープが足りない場合も同じ形になります。

直し方
  • 1これは講師側の設定です。まず講師へお知らせください。
  • 2GITLAB_BOT_TOKEN をプロジェクトアクセストークン(ロール Developer、スコープ apiwrite_repository)に差し替えます。
  • 3ブランチは push できているので、GitLab の画面から Create merge request を押せば先へ進めます。止まった箇所は「MR の作成で止まった」として記録してください。
流し直しで push が拒否されるハンズオン3
症状

2回目の実行で、最後の push だけが落ちます。

 ! [rejected]        HEAD -> nightly/issue-4 (non-fast-forward)
error: failed to push some refs to 'https://gitlab-09291006aidev.give-app.net/...'
hint: Updates were rejected because the tip of your current branch is behind its
hint: remote counterpart.
原因

1回目の nightly/issue-4 が残っており、今回作り直したブランチとは別の歴史になっています。強制 push は拒否の規則で禁じているので、CI にも例外を作っていません。

直し方
  • 1GitLab の Code から Branches を開いてください。
  • 2nightly/issue-4 を探し、右端のごみ箱で削除してください。前回の MR が開いていれば、先に閉じます。
  • 3自分のブランチのパイプラインで、もう一度 nightly_implement の手動ボタンを押してください。
  • 4前回の結果を残したい場合は、ISSUE_ID を予備の 5 に変えて流します。New pipelineVariables の欄に、キー ISSUE_ID、値 5 を1行入れて起動します。ブランチ名が nightly/issue-5 になるので衝突しません。
Tips:強制 push を CI だけ例外にすると、止め金の意味がなくなります。夜間に動くものほど、例外を作らないほうが後で楽になります。
Stop hook が止まらないプチ演習6
症状

応答が終わりません。同じ理由の継続が何度も繰り返され、テストの実行だけが延々と走ります。

php tests/run_tests.php failed with exit code 1. Run it, read the failing case,
fix the code, then finish.
原因

継続で呼び戻されたときに stop_hook_activetrue になります。これを見ずに block を返し続けると、Claude Code が8回連続の block で打ち切るまで、同じ継続が繰り返されます。配布した stop-gate は、この判定を先頭に置いています。講師が先に見せる壊れた版は、その3行を外したものです。

直し方
  • 1Esc でいったん止めてください。
  • 2.claude/hooks/stop-gate.ps1 の先頭の判定が残っているかを確認してください。
    if ($payload.stop_hook_active -eq $true) { exit 0 }
  • 3継続の回数にも上限を置いてください。環境変数 STOP_GATE_MAX で変えられます。既定は同じセッションで 2 回までです。
  • 4回数を数えている作業メモを消してから、もう一度試してください。
    Remove-Item .claude\hooks\.stop-gate.state -ErrorAction SilentlyContinue
  • 5正しい版では、1回の連鎖で継続が入るのは1回だけです(stop_hook_active が true になって2回目は素通りします)。同じセッションで依頼を繰り返すと累計が上限(既定2)に達し、次の行を出して終わります。
    [stop-gate] already continued 2 time(s), the cap is 2. Letting the session stop.
止める条件を先に書いてください。 続ける条件から書くと、止まらない版が先にできます。無人で回すものは、止まらない側の失敗のほうが高くつきます。
作業メモがコミットに混ざるプチ演習6
症状

コミットの前にソース管理ペインを見ると、見覚えのないファイルが並びます。

.claude/hooks/stop-gate.ps1        M
.claude/hooks/.stop-gate.state     U
原因

継続の回数をセッションごとに数えているファイルです。テストが通れば自動で消えますが、赤いまま終えると残ります。手元の作業メモなので、共有するものではありません。

直し方
  • 1.gitignore に1行足してください。
    .claude/hooks/.stop-gate.state
  • 2すでにコミットへ入れてしまった場合は、追跡だけを外してください。ここはコマンドを使います。
    git rm --cached .claude/hooks/.stop-gate.state
  • 3ソース管理ペインでは、コミットしたいファイルの行の + だけを押してステージしてください。まとめて上げる癖をやめると、この種の混入は起きません。

進行と画面共有

進め方そのもので止まったときの2件です。リモートの方も多く参加されます。手が止まったときに一番早いのは、画面を見せることです。

共有した画面が読めない共通
症状

共有した画面について、講師からこう返ってきます。

文字が小さくて読めません。ターミナルだけを共有していただけますか。

あるいは、共有を始めた瞬間に別の話になります。

いまの画面、社内のリポジトリが映っています。共有を止めてください。
原因

画面全体を共有すると、ターミナルの文字が小さくなり、開いている別のウィンドウも一緒に映ります。自社ハーネスを開いた VSCode が映ると、そこで扱いが変わります。

直し方
  • 1共有するのは、画面全体ではなくウィンドウ単位にしてください。VSCode か、ブラウザの GitLab の画面のどちらか1つです。
  • 2ターミナルの文字を大きくしてから共有してください。VSCode では Ctrl を押しながらホイールを回すと変わります。
  • 3自社ハーネスを開いているウィンドウは共有しないでください。中身を見せる必要がある場合は、講師と個別のやり取りに切り替えます。
  • 4エラーの文面は、画像ではなくテキストでチャットへ貼ってください。こちらで検索して、同じ症状の受講者に一度で返せます。
  • 5台帳の提出もチャットで結構です。現地の方と同じ形式で受け取ります。
Tips:共有を待っているあいだも、手は止めないでください。1つの Step で詰まったら、次の Step の「自分で考える」の欄を先に埋めておくと、復帰が早くなります。
時間内に演習が終わらない共通
症状

Step の [Nmin] を超えても終わりません。次の Step の説明が始まってしまいます。

原因

[Nmin] は目安で、全員が同じ速さで進む前提には置いていません。CI の待ち時間と、レビューの読み込みで差が出ます。

直し方
  • 1OK 基準の欄を開き、いくつ満たしているかを数えてください。すべて満たす必要はありません。
  • 2満たしていない項目のうち、次の演習の土台になるものだけを先に片付けてください。プチ演習の成果物は、後の演習で使います。
  • 3残りは「追加と考察」の扱いにして、先へ進んでください。止まったまま待つより、次の Step の前半を聞くほうが得るものが多くなります。
  • 4どこで詰まったかを台帳に1行書いてください。Day2 の冒頭で、詰まりの多かった箇所から返します。
ページの先頭へ