---
description: 課題Aの生成物を観点に沿って点検し、中間データを残しながら修正ループを回して報告書を書きます
argument-hint: [対象フォルダ 例 kadaiA]
allowed-tools: Read, Write, Edit, Glob, Grep, Task
---

# /selfcheck 手順書

課題A の生成物を点検し、直し、直しきれたかを判定して、人間が読む報告書を出すところまでを1本で回します。以下の手順を上から順に、飛ばさずに実行してください。

## 0. 前提と引数

- 対象フォルダ: `$ARGUMENTS`。空のときは `kadaiA` を対象とします。以降この値を `<TARGET>` と書きます。
- `<TARGET>` が `kadaiA` 以外だった場合は、その旨を1行断ってから同じ手順で進めます。
- 作業の起点は `handson` フォルダです。パスはすべて `handson` からの相対パスで書きます。
- 中間データは `handson/.work/` に置きます。フォルダが無ければ作ります。既にファイルがある場合は上書きします。
- 所要時間の目安は3分から5分です。20名が同時に実行するため、サブエージェントの起動は必ず1件ずつ（逐次）にしてください。並列で起動しないでください。

## 1. 入力を読む

次の6種類を読みます。存在しないものがあれば、その旨を `.work/01_inventory.md` に記録して先へ進みます。読めないことを理由に止まらないでください。

| # | 入力 | 何を取り出すか |
|---|---|---|
| 1 | `<TARGET>/` 配下の生成物一式（`Glob` で `<TARGET>/**/*`） | 点検対象のファイル。`dummy_data.csv` はデータなので点検対象に含めるが、変更対象からは外す |
| 2 | `docs/コーディング規約.md` | 命名・コメント・構成の決まり |
| 3 | `docs/生成物チェックリスト.md` | 成果物として揃っているべきもの |
| 4 | `docs/セキュリティチェックリスト.md` | 入力値とデータの扱いの観点 |
| 5 | `docs/セルフチェックの観点.md` | 深刻度の判定基準、点検の順番、直さないと決めてよいもの |
| 6 | `.claude/skills/kadaia-review/SKILL.md` | 本研修用の観点リスト（観点ID付き） |
| 7 | `memo.md` の `## A-2` 見出しの下 | 受講者本人が書いた懸念点 |

`docs/セルフチェックの観点.md` が見つからない場合は、`.claude/skills/kadaia-review/SKILL.md` の「深刻度の判定基準（控え）」を代わりに使い、その旨を `.work/01_inventory.md` の「読めなかったもの」に記録します。

`memo.md` の `## A-2` は必ず読んでください。受講者が自分で書いた不安を点検の観点に混ぜることが、このコマンドの設計上の要点です。`## A-2` が空だった場合は、その旨を記録したうえで観点リストだけで進めます。

読み終えたら `.work/01_inventory.md` を次の形式で書きます。

```markdown
# 01 点検対象の棚卸し

実行日時: <YYYY-MM-DD HH:MM>
対象フォルダ: <TARGET>

## 点検対象ファイル

| # | パス | 行数 | 役割 | 点検対象 |
|---|---|---|---|---|
| 1 | kadaiA/index.html | 214 | 一覧・検索・詳細の画面本体 | あり |
| 2 | kadaiA/dummy_data.csv | 51 | 元データ（変更禁止） | 参照のみ |

## 読み込んだ観点ファイル

| ファイル | 取り出した観点の数 |
|---|---|
| docs/コーディング規約.md | 12 |

## memo.md の ## A-2 から拾った懸念

- <受講者が書いた文をそのまま引用>

## 読めなかったもの

- <あれば書く。無ければ「なし」>
```

## 2. 点検する

点検は `.claude/agents/reviewer.md` のサブエージェントに任せます。メインの会話にコード全文を持ち込まずに済み、トークン消費も抑えられます。

1. `Task` ツールで `reviewer` サブエージェントを1件だけ起動します。並列起動はしません。
2. サブエージェントに渡す指示には、次を必ず含めます。
   - 対象ファイルのパス一覧（`.work/01_inventory.md` の「点検対象」が「あり」の行）
   - 観点リスト（`.claude/skills/kadaia-review/SKILL.md` の観点ID と内容）
   - 深刻度の判定基準（`docs/セルフチェックの観点.md`）
   - `memo.md` の `## A-2` から拾った受講者の懸念
   - 出力は JSON 配列のみで返すこと
3. 返ってきた指摘を `.work/02_findings.json` に書きます。形式は次のとおりです。配列の要素は必ずこの7キーを持たせ、キーを増やさないでください。

```json
[
  {
    "id": "F001",
    "観点": "A-03 入力値の扱い",
    "深刻度": "高",
    "ファイル": "kadaiA/index.html",
    "行": 132,
    "内容": "検索キーワードを innerHTML に直接入れているため、入力した文字列がそのまま HTML として解釈される",
    "根拠": "docs/セキュリティチェックリスト.md の「入力の扱い」および kadaia-review SKILL.md の観点 A-03"
  }
]
```

- `深刻度` は `高` `中` `低` の3値だけを使います。それ以外の語を入れないでください。
- `行` は整数です。範囲になる場合は開始行を書きます。特定できないときは `0` にし、`内容` の中で範囲を説明します。
- `根拠` は必ず参照元のファイル名と見出し（または観点ID）を書きます。「一般的に危険だから」は根拠になりません。
- 指摘が0件のときは空配列 `[]` を書きます。空配列でも先へ進みます。

## 3. 直すものと直さないものを決める

`.work/02_findings.json` の全件について、対応を決めます。判断の基準は `docs/セルフチェックの観点.md` の「直さないと決めてよいもの」に従います。

- 深刻度「高」: 必ず直します。
- 深刻度「中」: 依頼していない機能追加にならず、既存の動作を壊さずに直せるものだけ直します。
- 深刻度「低」: 直しません。報告書の未対応欄に載せます。
- 直し方が複数あって仕様が変わるもの: 直さず、報告書の「人間に判断してほしいこと」へ回します。

決めた内容を `.work/03_fix_plan.md` に次の形式で書きます。

```markdown
# 03 修正方針

## 対応一覧

| ID | 深刻度 | 観点 | 対応 | 判断理由 | 変更予定箇所 |
|---|---|---|---|---|---|
| F001 | 高 | A-03 入力値の扱い | 直す | そのままでは入力がHTMLとして解釈されるため | kadaiA/index.html 132行 |
| F004 | 低 | A-08 命名 | 直さない | 動作に影響がなく、演習の範囲外のため | ー |

## 人間に判断してほしいことへ回すもの

| ID | 論点 | 選択肢 |
|---|---|---|
| F007 | 検索の大文字小文字を区別するか | A) 区別しない（現状） / B) 区別する |

## 変更しないと決めているファイル

- kadaiA/dummy_data.csv（データの正本。CLAUDE.md の「してはいけないこと」に従う）
```

## 4. ループを回す

ここからが修正ループです。**最大3周**で打ち切ります。

### 1周の中身

1. `.work/03_fix_plan.md` で「直す」と決めた指摘を、上から順に修正します。1件ずつ `Edit` で当てます。まとめ書きはしません。
2. 修正した箇所だけを再点検します。手順2と同じサブエージェントを、変更したファイルに限定して1件だけ起動します。
3. 全体が壊れていないかを確認します。次の3点を必ず見てください。
   - `<TARGET>/index.html` が存在し、開くだけで動く形のままか（外部サーバーの起動が必要な形に変わっていないか）
   - HTML のタグの開閉、JavaScript の構文（括弧・引用符）が壊れていないか
   - `kadaiA/dummy_data.csv` が変更されていないか
4. 残っている指摘を深刻度ごとに数えます。
5. `.work/04_loop_log.md` に、その周の記録を追記します。

### 停止条件

次のどちらかを満たしたら、そこでループを抜けます。

- `.work/02_findings.json` の未対応のうち、深刻度「高」が **0件** になった
- 3周を終えた（3周で高が残っていても打ち切る）

3周で打ち切った場合は `.work/04_loop_log.md` の末尾に次の1行を書きます。

```
上限到達につき打ち切り。残件は REPORT.md の未対応欄へ。
```

同じ指摘を2周続けて直せなかった場合も、3周を待たずに打ち切ってかまいません。その場合は理由を「同一指摘の修正が2周連続で失敗したため打ち切り」と書きます。

### 04_loop_log.md の形式

```markdown
# 04 ループの記録

| 周 | 開始時 高/中/低 | 今周で直した件数 | 終了時 高/中/低 | 動作確認 | 判定 |
|---|---|---|---|---|---|
| 1周目 | 3/5/4 | 3 | 0/5/4 | index.html は開くだけで動く形を維持 | 高が0件になったため停止 |

## 各周のメモ

### 1周目
- 直した: F001, F002, F003
- 直せなかった: なし
- 気づいたこと: F002 の修正で表の列幅が変わったが、表示は崩れていない
```

1周で高が0件になった場合も、この表に1行だけ書いて「1周で停止」と記録します。ループが回らなかったのではなく、1周で条件を満たしたことがわかるようにします。

## 5. 報告書を書く

`<TARGET>/REPORT.md` を、人間が読む前提で次の順に書きます。見出しの文言と順番は変えないでください。

```markdown
# セルフチェック報告

実行日時: <YYYY-MM-DD HH:MM> ／ 対象: <TARGET>

## 1. 結論

（3行以内。何件指摘し、何件直し、何件残したか）

## 2. 数字のまとめ

| 項目 | 件数 |
|---|---|
| 指摘 | N件（高 N / 中 N / 低 N） |
| 修正 | N件 |
| 未対応 | N件 |
| ループ | N周 |

## 3. 直したもの

| ID | 観点 | ファイル・行 | 変更内容 | 確認方法 |
|---|---|---|---|---|

## 4. 直さなかったもの

| ID | 観点 | なぜ直さないと判断したか |
|---|---|---|

## 5. 人間に判断してほしいこと

- 論点: <何を決める必要があるか>
  選択肢: A) <案> / B) <案>
  影響: <どちらを選ぶと何が変わるか>
  AI の見立て: <どちらが有力か、その理由>

## 6. 使った観点と、その出どころ

| 観点ID | 観点の内容 | 出どころ（ファイル名と見出し） |
|---|---|---|
```

**第5節「人間に判断してほしいこと」は必ず1件以上書いてください。** 該当が無いと感じた場合でも、判断が分かれた箇所・前提を置いて進めた箇所を1件挙げます。全部を AI が決めて終わる報告書にしないことが、この演習で伝えたい線引きそのものです。

第6節の「出どころ」は、`docs/コーディング規約.md の ## 課題B（Java / Spring Boot）` のように、ファイル名と見出し名まで書きます。受講者が開いて照合できる粒度にしてください。

## 6. 終わり方

1. `.work/` の4ファイルが揃っているかを確認します。欠けていたら書き足します。
2. `.work/` は削除しません。実行後に開けることが体験の一部です。
3. 最後に、CLAUDE.md の `## 応答の最後に必ず出すもの` に従って実行サマリーを出します。「従った設定」欄には `/selfcheck` と `kadaia-review` を必ず含めてください。

## やらないこと

- `kadaiA/dummy_data.csv` と `kadaiB/src/main/resources/data.sql` の書き換え
- `kadaiB/` への変更（このコマンドは課題A専用です）
- 依頼していない機能の追加（見た目の刷新、ライブラリの導入、フレームワークへの移行）
- `git` コマンドの実行
- サブエージェントの並列起動
