D2とsmart3pmのハーネスで何が起きるかを答える10問です。どの問いも、今日のプチ演習で起こしたことから出ます。
解き方
解き方
10問とも、D2(d2_harness_20260828)かsmart3pm(smart3pm-harness-review)の実物のハーネスの話です。問いの頭に、どちらのハーネスかを書いています。前提には、そのハーネスのファイルが何を見て何を返すかを書いています。
どの問いも、今日のプチ演習で自分の手で起こしたことと同じ形です。1問1点で、8点以上を目安にしてください。解説は、全部解いた後に開きます。
選択肢を押すと、その答えを選べます。別の選択肢を押すと選び直しになる作りです。10問選んだら、ページの下の「採点する」を押してください。点数と、各問の正解の印が出ます。
10問
rules/core.mdは、どのセッションでも開始時に全文が読み込まれるルールのファイル。上限は80行と決めているharness/check-guidelines.shが、コミットの前とpushの前に動く。core.mdの行数をwc -lで数え、80行を超えていたら止める
- core.mdは今79行。1行が600文字のルールを1本足して、80行にした。これをコミットする
check-guidelines.shの行数の検査はどうなる?
正解と解説(解いた後に開く)
正解A
根拠:check-guidelines.shの検査1(wc -lの行数だけを上限と比べる。178-185行目)
誤答:Bは文字数も見ているという思い込み。Cは「80行まで」を「80行未満」と取り違え。Dは検査が知らせるだけだという思い込み
プチ演習1(ハンズオンガイド)で、自分のCLAUDE.mdに600文字の1行を足し、行数だけの検査が通すのを見ました。
- CLAUDE.mdの中に
@ファイル名と書いたファイルは、セッションを開いた時点で中身ごと読み込まれる - D2のCLAUDE.mdは、7行目の
@AGENTS.mdでAGENTS.mdを読み込んでいる - AGENTS.mdの「読み分けガイド」には、「コーディングの前にagents/03(コーディング規約)を読むこと」と文章で書いてある。
@は付いていない - 開始時に動くフック
sessionstart_info.ps1が出すのは、ブランチ名と変更の状態だけ - D2のフックは、この開始時の1本と、ツールの実行の前後に動くものだけ。依頼を送ったときに動くフックは無い
- D2のリポジトリで新しいセッションを開いた。まだ何も頼んでいない
この時点で、agents/03の中身は読み込まれている?
正解と解説(解いた後に開く)
正解B
根拠:CLAUDE.md:7(@はAGENTS.mdの1本だけ)、AGENTS.md:76-78(読み分けガイドは文章の指示)、sessionstart_info.ps1(出すのはブランチとステータス)
D2自身もagents/07:76-77で「入口のトリガーが弱い」と書いている
誤答:Aは@の取り込みが、文章で書いた参照にまで連なると思う誤解。CとDはフックが知識を入れると思う誤解
プチ演習2(ハンズオンガイド)で、名前で指しただけのREVIEW.mdを、Claudeが後から開く表示を見ました。
- D2では、
DB/(SQLファイルの置き場)を書き換えてよいのはdevelopとmasterのブランチだけ .claude/hooks/guard_db_branch.ps1は、EditとWriteの実行前(PreToolUse)に動くフック。今のブランチがdevelopとmaster以外で、書き先がDB/の中なら、理由をstderrに書いて終了コード2を返す
feature/s6000/s6010_d2_documentブランチで、ClaudeがWriteでDB/sql/x.sqlを新しく作ろうとした
どうなる?
正解と解説(解いた後に開く)
正解C
根拠:guard_db_branch.ps1:40-43(DB/配下はdevelop・master以外でexit 2)、cases db-feat-01
誤答:Bは実行後の検査と混同。Dは終了コード2を確認の依頼と思う誤解
プチ演習3(ハンズオンガイド)で、guard_pathsが書く前に止め、理由を返すのを見ました。
- 既存のmigration(
app/Database/Migrations/の中)は書き換えず、新しく足す決まり。backendユニットの.claude/immutable-paths(書き換え禁止の一覧)に載っている guard-write-scope.shは、EditとWriteの実行前に動く。書き先が担当範囲の外か、immutable-pathsに載っていれば止めるguard-bash-write.shは、Bashの実行前に動く。止める条件は、書き先が担当範囲の外であることだけapp/Database/Migrations/は、backendユニットの担当範囲の中にある
- ClaudeがBashで
sed -i 's/old/new/' app/Database/Migrations/001_init.phpを実行しようとした(確認の画面は出ない設定とする)
どうなる?
正解と解説(解いた後に開く)
正解C
根拠:guard-write-scope.sh:150(immutable-pathsを見るのはEdit系だけ)、guard-bash-write.sh:189-208(スコープの判定だけ)
誤答:AはEditと同じ一覧を見ると思う誤解。Dはフックがどのツールにも効くと思う誤解
プチ演習4(ハンズオンガイド)で、Editを止めるフックだけのときに、シェルの書き込みが通るのを見ました。
- D2では、テキストファイルの改行はCRLFと決めている
.claude/hooks/check_crlf_bom.ps1は、EditとWriteの実行後(PostToolUse)に動くフック。LFだけの改行を見つけると、理由をstderrに書いて終了コード2を返す
feature/s6000/s6010_d2_documentブランチで、ClaudeがWriteで、LF改行のdoc/notes/memo.mdを新しく作った
どうなる?
正解と解説(解いた後に開く)
正解A
根拠:check_crlf_bom.ps1:38-43(単独のLFでexit 2)、cases cb-02
誤答:Bは実行前と実行後の混同。Cは検査が直すと思う誤解。Dは実行後のフックの結果が捨てられると思う誤解
プチ演習5(ハンズオンガイド)で、check-phpverが、ファイルを残したまま結果を返すのを見ました。
- ハーネスのフックの本体は、
smart3pm_guidelinesフォルダに1つだけある - 各ユニットの
.claude/settings.jsonのフックは、親のフォルダをたどって本体を探し、見つけたら呼ぶ短いコマンドになっている。Bashの実行前に動くコマンドの要所は[ -r "$H" ] || { …; exit 2; } $Hは見つけた本体のパス。[ -r "$H" ]は「そのファイルが読めるか」を確かめる書き方で、読めなければ||の後ろが動く
- 親のどこにも
smart3pm_guidelinesが無い場所でユニットを開いた。Claudeが最初にBashでlsを実行しようとした
どうなる?
正解と解説(解いた後に開く)
正解D
根拠:harness/settings.backendのBash用command([ -r "$H" ] || { …; exit 2; })、design/harness-reference-type.md:33,71
誤答:Aは、安全装置が無くても作業は進むと思う誤解(設計原則のFail loudに反する)。Cは実行前と実行後の混同
プチ演習8(ハンズオンガイド)で、フックの本体が無いとき、直接の登録では素通りし、ラッパーを挟むと止まるのを見ました。
- D2の作業の順番は、実装 → レビュー②(人が行う2回目のレビュー)→ マージ待ち → マージ
.claude/agents/d2-code-reviewer.mdは、レビュー②の前に差分を読むサブエージェント。定義ファイルでpermissionModeをplan(読むだけ)にし、「コードを直さない」「人が確かめる点を分けて書く」と決めている
- 実装が終わり、d2-code-reviewerを動かした
実際に起こるのはどれ?
正解と解説(解いた後に開く)
正解D
根拠:d2-code-reviewer.md「報告の契約」(コードを直さない、要人間確認を分ける)、CLAUDE.md:23、d2-task-start/SKILL.md:35(レビュー②待ちは人の手番)
誤答:Aは「AIレビュー= AIが直す」という期待。BとCはレビュー②を機械の工程と思う誤解
プチ演習6(ハンズオンガイド)で、AIレビューが指摘を書くだけで、コードを変えないのを見ました。
- ゲート①は、人が計画書を承認する工程。承認すると
new-approval-receipt.shが、計画書のsha256をレシートに書く - sha256は、ファイルの中身から計算する指紋のような値。1文字でも変わると別の値になる
verify-approval-receipt.shは、作業フォルダにある今の計画書からsha256を計算し直し、レシートの値と比べる
- 承認(レシートの発行とコミット)の後で、担当ユニットの
plan-backend.mdの誤字を1文字直した。まだコミットしていない
verify-approval-receipt.shの結果は?
正解と解説(解いた後に開く)
正解C
根拠:verify-approval-receipt.sh(作業ツリーのsha256を計算し直す)、plan-feature.md:73-91
誤答:Aはレシートが計画書に追いつくと思う誤解。Dはコミット済みだけを見ると思う誤解
プチ演習9(ハンズオンガイド)で、承認の後に1文字直すとINVALIDになるのを見ました。
- D2では、push、マージ、ブランチ作成は人の作業と決めている
.claude/settings.jsonのdenyにBash(git push:*)とPowerShell(git push:*)があるguard_shell_policy.ps1も、BashとPowerShellの実行前にgit pushを見つけると、終了コード2を返す
- 夜、誰も画面を見ていない状態でClaudeにIssueを実装させた。実装の後で、Claudeが
git push origin feature/s7000/s7001_xを実行しようとした
どうなる?
正解と解説(解いた後に開く)
正解B
根拠:settings.json:17,21(deny)、guard_shell_policy.ps1のgit guard(pushをexit 2)
誤答:Aはdenyとaskの混同。Dは、人がいないと決まりが緩むと思う誤解
プチ演習10(ハンズオンガイド)で、denyは確認なしで止まり、askは確認のダイアログが出るのを見比べました。
- smart3pmの最後の検査は、gitのpre-pushフック。pushの直前に、手元のPCで動く
- GitLab側(サーバ)には検査を置いていない(design/harness-server-free.md)
- ワークスペースでセッションを開くと、検査を通っていないpushがあれば警告を出す
- 人が端末で
git push --no-verifyを実行した
何が起こる?
正解と解説(解いた後に開く)
正解A
根拠:design/harness-server-free.md:252(git push --no-verifyは素通り。事後の検知だけ)、harness/check-pushed-state.sh(ワークスペースのSessionStartで警告)
誤答:Bは--no-verifyがフックを飛ばすことを知らない。Cは、前提の「GitLab側には検査を置いていない」を見落としている。DはClaudeのセッションの外の操作だと気づいていない
プチ演習7(ハンズオンガイド)で、手元のpre-commitを--no-verifyで飛ばし、GitLabのcheck-rulesで止まるのを見ました。研修リポジトリにはcheck-rulesがあるので止まりました。smart3pmには、それに当たる検査がありません。
採点と答え合わせ
0 / 10問を選びました
一覧を開く(解いた後に)
| 問 | ハーネス | 正解 | 起こしたプチ演習 |
|---|---|---|---|
| Q1 | smart3pm-harness-review | A | プチ演習1 |
| Q2 | d2_harness_20260828 | B | プチ演習2 |
| Q3 | d2_harness_20260828 | C | プチ演習3 |
| Q4 | smart3pm-harness-review | C | プチ演習4 |
| Q5 | d2_harness_20260828 | A | プチ演習5 |
| Q6 | smart3pm-harness-review | D | プチ演習8 |
| Q7 | d2_harness_20260828 | D | プチ演習6 |
| Q8 | smart3pm-harness-review | C | プチ演習9 |
| Q9 | d2_harness_20260828 | B | プチ演習10 |
| Q10 | smart3pm-harness-review | A | プチ演習7 |
