name: quiz-quality-pipeline
description: 中学受験対策クイズの作成・品質チェック・修正を一貫実行する。科目非依存の設計で理科・歴史・算数などに適用可能。Turso/Supabase DB対応。「クイズ作成」「品質チェック」「クイズ追加」「問題作成」「quiz create」「quiz check」「quiz quality」「科目追加」などの作業に使う。
Quiz Quality Pipeline — 中学受験クイズ作成・品質管理スキル
クイズの作成 → DB投入 → AI品質チェック → NG問題の削除/修正 → カテゴリ再振り分けを一貫実行する。
対象アプリ
| アプリ | リポジトリ | DB |
|---|
| 理科クイズ | /Users/satokeita/Dev/science-quiz-app | Turso (HTTP Pipeline API) |
| 歴史クイズ | /Users/satokeita/Dev/history-quiz-app | Supabase |
ワークフロー
Phase 1: 単元構造の設計
- 学習指導要領を調査し、分野 > カテゴリ > 単元の3階層で整理
categories / units テーブルに投入
docs/QUIZ_DIFFICULTY_STANDARD.md を作成(Lv1-Lv4の4段階、Lv5は全アプリ共通で廃止済み)
難易度定義は references/difficulty-framework.md を参照。
Phase 2: クイズ一括作成
- 単元ごとにClaude CLIでクイズを生成(バッチ10-20問ずつ)
- Turso HTTP Pipeline APIで直接DB投入
- 全単元を網羅するまで繰り返し
作成時の制約:
- 学習指導要領の範囲を厳守。迷ったら出題しない
- Lv2を全問解くと教科書主要事項を概ね網羅できる設計を維持
- 1テーマにつき最低2段階の難易度を用意
answer は options 配列内の値と完全一致必須
Turso投入の実装パターンは references/turso-patterns.md を参照。
Phase 3: AI品質チェック(3項目)
全問をClaude CLI(--model sonnet)で1問ずつ判定。チェック項目:
| 項目 | 判定値 | 意味 |
|---|
| 内容正確性 | pass / fail / needs_review | 学習指導要領の範囲内か、科学的に正確か |
| 難易度 | appropriate / too_easy / too_hard | 設定難易度と実際の難しさが一致するか |
| カテゴリ | correct / incorrect / borderline | 割り当て単元が適切か |
チェックスクリプト: scripts/ai-quality-check.mjs
Phase 4: NG問題の対処
- fail → 削除: 学習指導要領の範囲外、科学的に不正確な問題をDB削除
- incorrect → 再振り分け: Claude CLIに全単元リストを渡し、最適な単元IDを選ばせる
- too_hard/too_easy → 難易度修正: AIが判定した推奨Lvで
quizzes.difficulty を更新
- needs_review → 再判定: pass/fail/fix を確定。fixは問題文・解説を自動修正
修正スクリプト:
Phase 5: 品質確認
最終的に以下を達成する:
- 内容正確性: pass 100%
- 難易度: appropriate 100%
- カテゴリ: incorrect 0%
Admin画面
品質チェック結果は /admin/quiz-quality で確認可能:
- サマリーダッシュボード(総数・チェック率・問題あり数)
- 単元別チェック進捗バー
- フィルタ(単元・状態・難易度)
- 展開式クイズカード(3項目ワンクリック判定 + メモ + 推奨値)
新科目追加時の手順
- DB接続情報を
.env.local に設定
- 学習指導要領を調査し単元構造を設計
quiz_quality_checks テーブルを作成(スキーマは references/quality-check-schema.sql)
- Phase 2-5 を実行
⚠️ よくある落とし穴
- 学習指導要領の範囲逸脱: 最多の失敗。「知っていたら差がつく」ではなく「知らないと困る」内容のみ出題する。迷ったら出題しない
- 旧単元マッピングでカテゴリ混入: 単元を再編すると、キーワードベースの再マッピングで問題が誤振り分けされる。再編後は必ずAIカテゴリチェックを実行
- suggested_unit が単元名テキストでIDに解決できない: AIの推奨単元名と実際のunit.nameが不一致の場合、suggested_unit_id がnullになる。fix-categories.mjs は全単元リストをプロンプトに渡してIDで返させるのが正解
- Claude CLIのJSON出力パース:
--output-format json は {"result":"..."} でラップされる。中身を取り出してからJSONパースする
- Turso の
source .env.local が効かない: export $(grep -E '^KEY=' .env.local | xargs) で明示的にexportする
- answer と options の不一致:
answer フィールドの値が options 配列内に完全一致で存在しないと正解判定が壊れる。全角/半角・送り仮名に注意
- Lv5 を作成してしまう: 全アプリ共通でLv5は廃止済み。Lv1-Lv4のみ
- 大量投入で品質劣化: 1回のクイズ生成は単元あたり20問以内を推奨。生成後すぐにAI品質チェックを回す