EDUCARE — CONFIDENTIAL / 社外秘

過去問 問題集+ビュワー
要件定義書 v1.2

2026-07-30 / 起草: Claude Opus 5 / 決裁者: 敏
対象: 会員マイページ /kakomon(worker educare-members-staging → 本番 educare-members)

結論(TLDR)

作るのは2つの画面だが、実体は1つのリリースである。問題・解説・図・欠陥判定・単元ラベルを束ねた不変リリースを作り、その上に「調べる面(ビュワー)」と「解く面(問題集)」を載せる。ビュワーを先に出す——検収していない問題を出題しないため。配信方式もUIも演習エンジンも既存資産(論文問題集・/api/training)の写像で、新規発明は要らない。着工前に潰しておくべき欠陥が2つ見つかった:単元ラベルの過半が未確定だったこと(真因は投票数ではなく語彙の欠落)と、全問を1ファイルで配ると18.1MBでWorkerが読めないこと。両方とも要件段階で決着済み。

0. 2つの機能の関係

同じデータの上に立つ別の面であって、別システムではない。

過去問ビュワー Ph①

  • 調べる。一覧から探し、問題と解説を読む
  • 利用者=敏・AI(検収)/受験生(復習・辞書的利用)
  • 入口=一覧+絞り込み(試験種・科目・単元)
  • 正答は最初から見える(調べる面だから)
  • 型=論文問題集の一覧/詳細をそのまま写す

過去問問題集 Ph①-B

  • 解く。出題され、答え、採点され、解説を読む
  • 利用者=受験生
  • 入口=単元や試験種を選んで「10問はじめる」
  • 正答は解答するまで伏せる(能動想起)
  • 型=既存 /api/training の演習UIに出題源を足すだけ
順序は動かせない

問題集はビュワーと同じリリースから出題する。ビュワーで検収した問題だけが問題集に出る。逆はできない(解いた結果を検収の代わりにはできない)。ゆえにビュワー→問題集の順に出す。

1. 目的(定量)

リスク減(最大の目的)

19.2% の欠陥

出荷済み2,558問のうち491問が受験生に解けない fact。今これを人が見る手段はJSONを開くことしかない。壊れた問題を会員に出す事故を防ぐ装置

工数減

3分 → 20秒

検収1問あたり。JSONを開いてidを探し図を別ファイルから探す作業が、一覧から1クリックになる inference

売上増

在庫の可視化

単元別の在庫数が見えて初めて「何を売れるか」が決まる。有料商材R1コンテンツの前提

利用者=第1フェーズは敏・AI(検収)、第2フェーズで会員。対象業務=過去問バンクの検収→単元別在庫把握→出題。副次的に、図解・解説の差し戻し先をURLで指せるようになる(現在はレビュー番号で指しており、7/29に番号ずれで合格済みの図を上書きする事故を起こした fact)。

2. 現状(2026-07-30 実測)

2-1. 素材の揃い方

素材実測所在
問題(設問・選択肢・正答)6,979問kakomon_bank_v2.json(全件 public_ok)
解説2,629問final_2629.json(公式正答表由来のみ)
解説(図つき・生成中)77問本日着手・2先生突合つき
解説(図なし・生成待ち)125問図が要らないのに未着手だった分
図解SVG306問Phase1(敏合格済52問)+Phase2の完成分。本走が進むほど増える
科目・単元ラベル6,902問labels_*.json(確度は §2-2 のとおり)
健全性判定2,558問全数スイープ済み。残り4,395問は未判定

2-2. 絞り込み軸ごとの確度 この節が設計を決めた

値の数確度判定
試験種(東京都1,749/特別区1,645/国家一般職1,261/東京消防庁945/国家初級572/国家総合職455/警視庁252/国税専門官100)8100%🟢 抽出時に構造で確定。そのまま使える
年度(H2〜R8)20100%🟢
区分(教養/専門)2100%🟢
科目群(一般知能・社会科学…)565%🟡
科目(判断推理・数的推理・政治…)30前後61%🟡 4割が単独モデルの申告
単元(対応関係・図形の計量…)実使用99446%🔴 過半が未確定 → 下記
分類対象は教養のみ 敏決裁 2026-07-30

「専門科目は完全除外。まずは教養をしっかり分類すればOK」。教養5,672問(単元 確定2,629/未確定3,043)が対象、専門1,307問は対象外。
「除外」はリリースから落とすのではなく、単元を付けないunit: null で運ぶ)。問題そのものは残るので、試験種・年度・区分での絞り込みには従来どおり出る。単元軸だけが教養限定になる。
この決裁で語彙も変えた。初版は技術系(構造力学・水理学・情報科学ほか)を入れていたが撤去——教養の物理に「材料工学」が付くのは誤りを誘発するだけで得がない。撤去前の途中結果では教養676問のうち141問(21%)に技術系ラベルが付いていたので、破棄して取り直した。

単元46%の真因 — 「3モデル目を回す」だけでは半分しか直らない

未確定3,742問を分解すると原因が2つに割れていた。票が足りない 2,150問(そもそも1モデルしか答えていない)と、票が割れている 1,515問。そして割れている分の49%(742問)が5科目に集中していた——物理303・生物151・化学108・数学94・地学86。この5科目は単元語彙の正本が空で、モデルに自由命名させていた。実例は「電気 vs 電磁気」「惑星 vs 太陽系」「無機化学 vs 周期表・元素」。表記ゆれで割れているところに3モデル目を足しても、3つ目の言い方が増えるだけである。単元名は正本90種に対し実使用994種まで発散し、638種は1問しか付いていなかった。

2-3. 既に確立している型(発明しなくてよいもの)現物読了

配信R2 current.jsonmanifest.json(sha256検証)→ 不変リリース。論文問題集で稼働中
一覧API/api/ronbun/problems。認証必須・軸切替・facetを件数つきで返す・不正クエリ400・バンク不達503
一覧UIRonbunProblemListPage(軸タブ+件数つきチップ+カード)→ 詳細ページ
演習エンジン/api/training/questions(出題)・/events(履歴)・/chat(AI先生)+TrainingPage 817行。出題→解答→復習キュー→サマリまで実装済み
正答の秘匿契約AI先生のプロンプトに reveal_state=locked の間は正解番号・正解肢全文・最終数値を出さない契約が既に書かれている

つまり過去問問題集に要るのは出題源の切り替えであって、演習UIの新規開発ではない。ビュワーも論文問題集の写像で足りる。

3. ECRS(要望 → 要件の絞り込み)

観点判断
E
liminate
単元ラベルの人手付与を無くす(994種×6,979問を人が振るのは不可能)②全問検収を無くす(欠陥率は試験種で3倍違うと実測済み。抜き取りは頻度比例でなく欠陥率比例に置く)③新しい管理画面サイトを作らない演習UIを新規開発しないモデルを増やす前に語彙を埋める
C
ombine
①解説・図・健全性・ラベルを1つのリリースに束ねる(UIが4ファイルを結合するのではなく、ビルド時に結合する)②論文問題集の配信・API・UIの型を使う③ビュワーと問題集は同じリリースを源にする④出題頻度データと結合(92単元中61単元を捨てても失う出題は6.5%)
R
earrange
①検収用と会員用を別物にせず同じAPIに mode を持たせて出し分けるビュワー→問題集の順に出す③単元の確定は「投票を増やす」より先に「語彙を埋める」を置く
S
implify
①絞り込みは確度100%の軸+科目を主とし、単元は確定/暫定を明示②全文検索エンジンは入れない③問題集の出題は単元・試験種を選んで10問の1形式のみ(模試・時間制限・難易度調整は後)
問題の本質

依頼は「ビューアと問題集が欲しい」だが、根本のニーズは「6,979問がどういう状態か、誰も見られないこと」。ゆえに要件の中心は閲覧UIそのものではなく、問題・解説・図・欠陥判定・ラベルを1本に束ねた不変リリースを作ることである。2つのUIはその表示面にすぎない。

4. スコープ

含める

  • ビュワー Ph① リリースのビルド/Worker API(一覧・詳細・リリース固定)/一覧・詳細画面/試験種・年度・区分・科目での絞り込みと並べ替え/検収モード(欠陥フラグ・来歴・パーマリンク)
  • 問題集 Ph①-B 出題源の切り替え/単元・試験種を選んで10問/解答→採点→解説/出題対象の絞り込み規則
  • 既存の復習キュー・AI先生・学習サマリはそのまま利用(改修しない)

含めない(将来の拡張想定)

  • 専門科目1,307問の単元分類 — 敏決裁。まず教養を仕上げる。問題自体は載り試験種・年度・区分では引けるが、単元は付かない
  • 模試形式(時間制限・成績表・偏差値)— 出題は1形式に絞る
  • 難易度に応じた出題順の最適化・弱点推定 — 想定正答率のデータはあるが使い方は効果測定後
  • 有料/無料の出し分け — 有料商材PJ側の別工事
  • 欠陥491問の修復 — ビュワーは見つけるまでを担う
  • AI合議・未確定の正答2,974問の解説生成 — 正答が推定のまま解説を書かない
  • 本番配信 — Ph①はst限定。権利面の決着が前提

5. 機能一覧

必須度: ◎必須○推奨  フェーズ: ①ビュワー ①-B問題集 ②次回

ID大項目機能仕様必須Ph
F-01データリリースビルダ問題+解説+図SVG+健全性+ラベルを結合し、索引+詳細バケット+manifest+currentを出力。決定論✅ 実装済み・2回ビルドしてバイト一致を実測
F-02データ来歴解説のモデル・プロンプト版・gold一致可否、図のレンダラ・検査pass
F-03データ欠陥フラグok/cosmetic/degraded/fatal/unknown の5値+根拠。未判定をokと偽らない
F-04データラベルの確度confirmed(2モデル以上一致)/provisional(単独)をデータに持たせる
F-05データ単元の確定
教養のみ
①語彙を埋める(90→157種・教養の標準単元)→②語彙が無かった700問は2モデルで引き直し③残る2,343問は3モデル目でtiebreak。専門1,307問は対象外🔄 実行中。パイロット12問で2モデル一致 11/12 を実測(この5科目は従来ほぼ0%)
F-06データ出題頻度の結合単元一覧に頻度を並べる。母数の限界を明示
F-07配信R2バケットeducare-kakomon-bank(st/本番で別)
F-08配信リリース固定過去リリースは不変。詳細URLはrelease idを含み、あとから内容が変わらない
F-09API一覧認証必須。試験種・年度・区分・科目・単元・健全性・解説有無・図有無で絞り、facetを件数つきで返す
F-09aAPI索引のキャッシュ索引は3.9MB。毎リクエストでR2から引いてparseしない。モジュールスコープ+Cache APIにrelease idをキーに保持
F-10API詳細索引のbucketから該当バケット1本だけを引く(全問を読まない)
F-11API防御不正クエリ400/バンク不達503(論文問題集と同じ文言体系)
F-12APIモードreview=欠陥も返し来歴を含む/member=fatal・degradedを除外。既定はmember(安全側)
F-13〜15UI一覧絞り込み・並べ替え・状態バッジ軸タブ+件数つきチップ。並べ替えは試験種→年度→問番(既定)/単元別/欠陥の重い順。「解説あり」「図あり」「要注意」を一覧で判別
F-16〜18UI詳細問題・解説・検収操作図はインライン表示。解説は手順・ひっかけ・選択肢別分析・想定正答率・時間圧。検収モードでパーマリンクと差し戻し
F-19UI在庫単元別在庫ビュー単元×(問題数/解説あり/図あり/欠陥)の表。何を売れるかを見る面
F-21品質出荷ゲートfail-closed 7種(整合・序数参照・正答・健全性・SVG・PII・確度)✅ 実装済み・欠陥8種を注入して落ちることまで検証(11テスト緑)
F-23運用非公開性認証の内側・noindex。過去問本文が検索に載らないこと
F-24問題集出題源/api/training/questionssource=kakomon を足す。既存のSPI経路はそのまま。返却形を既存に合わせUI改修を要らなくする①-B
F-25問題集出題規則①正答が公式表由来 ②解説がある ③健全性がok/cosmetic ④図が要る問題は図がある。1つでも欠けたら出さない①-B
F-26問題集単元選択単元は確定のものだけを選択肢に出す。暫定単元で出題すると別単元が混ざる①-B
F-27問題集出題順会員IDとセット番号を種にした決定論シャッフル。選択肢のシャッフルはしない(解説が選択肢の本文を引いているため、並べ替えると引用と表示の対応が崩れる)①-B
F-28問題集解説の開示解答後に開示。既存の reveal_state 契約に乗せる①-B
F-29問題集解答前にも図は出す(図がないと解けない)。図は解説の一部ではない①-B
F-30問題集履歴既存の学習履歴に相乗り。過去問由来を source で区別①-B
F-31問題集導線在庫表から「この単元を解く」、詳細から「この単元の類題を解く」

※ 表は主要23項目。全31項目の完全版はリポジトリの要件定義書(docs/KAKOMON_VIEWER_REQUIREMENTS_20260730.md)にある。

6. 画面

/kakomon(ビュワー一覧) ├─ 軸タブ: 試験種 / 科目 / 単元 ├─ チップで絞り込み(件数つき・複数可) └─ カード → /kakomon/<release>/<id>(詳細) ├─ 図(SVGインライン) ├─ 正答と解説 └─ 検収: パーマリンク / 差し戻し /kakomon/practice(問題集) ├─ 単元 or 試験種を選ぶ(確定単元のみ・出題可能数を表示) ├─ 10問を解く(図は先に表示・正答は伏せる) ├─ 解答 → 採点 → 解説(ビュワーと同じ解説) │ └─ AI先生(解答前は正解を漏らさない) └─ サマリ → 間違えた問題は復習キューへ(既存機能) /kakomon/inventory(単元別在庫・Ph②)
┌──────────────────────────────────────────────┐ │ 過去問バンク release: kakomon-r1-20260730 │ │ 6,979問 / 解説 2,706 / 図 170 / 要注意 491 │ ├──────────────────────────────────────────────┤ │ [試験種で探す] [科目で探す] [単元で探す] │ │ (東京都 1749) (特別区 1645) (国家一般職 1261) … │ │ 絞り込み: [解説あり] [図あり] [要注意を隠す] 並べ替え:[▼] │ ├──────────────────────────────────────────────┤ │ ┌────────────┐ ┌────────────┐ │ │ │特別区 R5 No.27 │ │東京都 R6 No.17 │ │ │ │空間把握/切断 │ │判断推理/対応関係 │ │ │ │次の図のように… │ │A〜Eの5人が… │ │ │ │[解説] [図] │ │[解説] [⚠要注意] │ │ │ └────────────┘ └────────────┘ │ └──────────────────────────────────────────────┘

UIデザインの作り込みは基本設計フェーズで行う。本要件では骨格と情報の優先順位までを確定する。配色・余白は既存の会員マイページのトークンに従い、新しいデザイン言語を持ち込まない。

7. データ契約 — 論文問題集の型をそのまま写せない点

全問を1本にすると18.1MB

論文問題集は80問なので corpus.json 1本で成立していたが、過去問は6,979問ある。実際に組んでみると18.1MBで、Workerが毎リクエストでR2から引いてparseするには重すぎる。一覧に要るものと詳細を分ける

ファイル中身実測
current.jsonどのリリースを配るか+manifestのsha256200B
releases/<id>/manifest.json件数・索引のsha256・バケット数・内訳1KB
releases/<id>/index.json一覧・facet・絞り込みに要る行だけ(設問は60字の抜粋)3.9MB
releases/<id>/q/<bucket>.json詳細(本文・選択肢・解説・図SVG)。試験種×年度で束ねる47個

原則は確度・由来・欠陥をデータに持たせ、UIには判断させないこと。UI側で「たぶん確定」を判断させると、単元46%のような不確かさが表示層で消える。
解説の採用条件はgold一致。登録正答と違う答えの解説は受験生に誤りを教えるので載せない(実測71問が該当)。

基準宣言(🔴 正答基準は暗黙にしない・2026-07-31追記)

2026-07-30 に発覚した「正答6,314問が全問1つずれて表示される」重大インシデントの再発防止。基準は必ずデータで宣言し、宣言のないリリースは読まない(fail-closed)
answer1始まり(正本宣言=release manifest の answer_base: 1・r6以降)。explanation.choice_analysis[].idx0始まりの配列添字。対応は idx == answer − 1。宣言なきリリース(manifestにanswer_baseキーが無いもの)は読まない。
year は過去問バンクでは和暦年度文字列(H/R+整数)、論文バンクでは西暦整数。横断集計は fiscal_year_ad(西暦整数)へ変換してから行う。

8. 受入条件(先に確定)

ID条件確認方法
AC-1〜3st で6,979問が一覧でき、チップの件数が実測と一致。試験種・年度・区分・科目で絞れる。単元は確定と暫定が視覚的に区別され、暫定で絞り込ませない実機・件数照合
AC-4図が、図解セッションが合格させたものとバイト一致で表示される機械照合
AC-5解説の本文に選択肢の番号参照が0件機械・exit=0
AC-6〜7member モードで欠陥問題が返らない/未認証で401自動テスト
AC-8〜92回ビルドしてバイト一致/過去リリースのURLが新リリース公開後も同じ内容を返す機械・実機
AC-10〜11noindex であること/スマホ幅で横スクロールが出ないことヘッダ確認・実機
AC-12出荷ゲートが exit=0。かつゲート自体が欠陥を注入すると落ちることを検証済み11項目のテスト
AC-13問題集で出題される問題が4条件をすべて満たす。欠陥・正答未確定・解説なしが1問も出ない自動テスト+実機50問
AC-14解答前に正解が画面にもAPI応答にも含まれない(AI先生の応答も含むAPI応答の全文検査
AC-15〜16問題集の単元選択に暫定単元が出ない/同じ会員が同じセットを開くと同じ出題順自動テスト

9. 進め方

1 リリースビルダ ✅ 2 単元の確定 ✅ 3 解説の積み増し ✅ 4 R2配置 5 API 6 ビュワーUI 7 敏の検収 8 問題集 9 敏の検収

7を通してから8に入る。検収されていない問題を出題しないため。

実装状況(2026-07-30 時点・md v1.2 §12準拠)

状態実測
リリースビルダ🟢 完了6,979問/索引3.9MB/詳細47バケット/2回ビルドでバイト一致(AC-8)
出荷ゲート🟢 完了・両方向検証済みG1-G7+11テスト。実弾リリース kakomon-r4-20260730 に対して出荷可
選択肢健全性(F-32)🟢 完了・両方向検証済み26テスト。全問検査で559問が解答不能を新規検出
単元の確定(教養のみ)🟢 完了語彙90→157種。教養の単元確定 46.4%→88.6%
解説の積み増し🟢 完了図つき77問・図なし125問・三重一致1,574問。採用 2,558→4,322問
正答の相互検証🟢 完了2,826問→三重一致2,060問
健全性スイープ全問🟢 完了未判定4,421問を判定。未判定は8問のみ
R2・API・UI⬜ 未着手Worker APIが次セッションの本題。Codex委任予定
ビルド実測値(kakomon-r4-20260730・出荷ゲート🟢・決定論🟢)

問題6,979 / 解説あり4,322(正答一致で採用・不採用83) / 図あり333 / 健全性 ok2,325・cosmetic1,590・degraded642・fatal 2,414・unknown8 / 正答未確定665(0に丸めずnullで運ぶ) / 単元 confirmed5,634・provisional1,345(教養は88.6%が確定) / 科目 confirmed6,296(教養95.5%) / 出題できる問題(F-25の4条件)=3,311問(教養2,628/専門683)・うち単元が確定した教養は2,316問・219単元(10問セットが組める単元は75種)。
fatal 2,414(35%)の意味: 全問スイープの結果。未判定だった側は判定済みだった側よりずっと状態が悪かった(解けない率51.3% vs 19.2%)。これらはリリースに載るが mode=member では配信しない。

10. 敏に決めてほしいこと

ID論点起草者の推奨
Q-1単元ラベルの46%問題決裁済み・実行中。①「推奨の進め方で進めて」②「専門は完全除外・まずは教養」。真因が語彙欠落だったため、語彙拡張(教養157種)→引き直し700問→tiebreak2,343問の三段に具体化した
Q-2欠陥491問をどう扱うか検収モードで最優先表示し、会員モードでは配信しない。バンクから外すと「直す対象」が見えなくなる
Q-3第1フェーズの利用者敏とAIのみ(検収特化)。権利面の線引きが未決のまま会員に出す理由がない
Q-4図の権利面の線引き図は原本の再現物(幾何忠実・デザインのみ自社)。着工はブロックしないが、本番配信の前に決着が要る
Q-5実装の担い手Codex委任+Claude必須レビュー+Gemini監査(100行超・新規実装は委任しきい値超え)
この資料の数値の出どころ

問題数・試験種別件数・年度・解説の充足・未着手の内訳・ラベルの確度・図の完成数は、いずれも本日このセッションで現物のJSONを直接集計したもの fact。欠陥19.2%は7/29の全数スイープの引用 fact。工数削減の見積りと推論費は概算 inference。論文問題集・演習エンジンの型はコードを実読して確認した fact

完全版(全31機能・データ契約の全文・轍の記録): 02_SAP_Marketing/owned_business/educaredev/docs/KAKOMON_VIEWER_REQUIREMENTS_20260730.md