EDUCARE — CONFIDENTIAL / 社外秘
2026-07-30 / 起草: Claude Opus 5 / 決裁者: 敏
対象: 会員マイページ /kakomon(worker educare-members-staging → 本番 educare-members)
作るのは2つの画面だが、実体は1つのリリースである。問題・解説・図・欠陥判定・単元ラベルを束ねた不変リリースを作り、その上に「調べる面(ビュワー)」と「解く面(問題集)」を載せる。ビュワーを先に出す——検収していない問題を出題しないため。配信方式もUIも演習エンジンも既存資産(論文問題集・/api/training)の写像で、新規発明は要らない。着工前に潰しておくべき欠陥が2つ見つかった:単元ラベルの過半が未確定だったこと(真因は投票数ではなく語彙の欠落)と、全問を1ファイルで配ると18.1MBでWorkerが読めないこと。両方とも要件段階で決着済み。
同じデータの上に立つ別の面であって、別システムではない。
/api/training の演習UIに出題源を足すだけ問題集はビュワーと同じリリースから出題する。ビュワーで検収した問題だけが問題集に出る。逆はできない(解いた結果を検収の代わりにはできない)。ゆえにビュワー→問題集の順に出す。
リスク減(最大の目的)
19.2% の欠陥
出荷済み2,558問のうち491問が受験生に解けない fact。今これを人が見る手段はJSONを開くことしかない。壊れた問題を会員に出す事故を防ぐ装置
工数減
3分 → 20秒
検収1問あたり。JSONを開いてidを探し図を別ファイルから探す作業が、一覧から1クリックになる inference
売上増
在庫の可視化
単元別の在庫数が見えて初めて「何を売れるか」が決まる。有料商材R1コンテンツの前提
利用者=第1フェーズは敏・AI(検収)、第2フェーズで会員。対象業務=過去問バンクの検収→単元別在庫把握→出題。副次的に、図解・解説の差し戻し先をURLで指せるようになる(現在はレビュー番号で指しており、7/29に番号ずれで合格済みの図を上書きする事故を起こした fact)。
| 素材 | 実測 | 所在 |
|---|---|---|
| 問題(設問・選択肢・正答) | 6,979問 | kakomon_bank_v2.json(全件 public_ok) |
| 解説 | 2,629問 | final_2629.json(公式正答表由来のみ) |
| 解説(図つき・生成中) | 77問 | 本日着手・2先生突合つき |
| 解説(図なし・生成待ち) | 125問 | 図が要らないのに未着手だった分 |
| 図解SVG | 306問 | Phase1(敏合格済52問)+Phase2の完成分。本走が進むほど増える |
| 科目・単元ラベル | 6,902問 | labels_*.json(確度は §2-2 のとおり) |
| 健全性判定 | 2,558問 | 全数スイープ済み。残り4,395問は未判定 |
| 軸 | 値の数 | 確度 | 判定 |
|---|---|---|---|
| 試験種(東京都1,749/特別区1,645/国家一般職1,261/東京消防庁945/国家初級572/国家総合職455/警視庁252/国税専門官100) | 8 | 100% | 🟢 抽出時に構造で確定。そのまま使える |
| 年度(H2〜R8) | 20 | 100% | 🟢 |
| 区分(教養/専門) | 2 | 100% | 🟢 |
| 科目群(一般知能・社会科学…) | 5 | 65% | 🟡 |
| 科目(判断推理・数的推理・政治…) | 30前後 | 61% | 🟡 4割が単独モデルの申告 |
| 単元(対応関係・図形の計量…) | 実使用994 | 46% | 🔴 過半が未確定 → 下記 |
「専門科目は完全除外。まずは教養をしっかり分類すればOK」。教養5,672問(単元 確定2,629/未確定3,043)が対象、専門1,307問は対象外。
「除外」はリリースから落とすのではなく、単元を付けない(unit: null で運ぶ)。問題そのものは残るので、試験種・年度・区分での絞り込みには従来どおり出る。単元軸だけが教養限定になる。
この決裁で語彙も変えた。初版は技術系(構造力学・水理学・情報科学ほか)を入れていたが撤去——教養の物理に「材料工学」が付くのは誤りを誘発するだけで得がない。撤去前の途中結果では教養676問のうち141問(21%)に技術系ラベルが付いていたので、破棄して取り直した。
未確定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問しか付いていなかった。
current.json → manifest.json(sha256検証)→ 不変リリース。論文問題集で稼働中/api/ronbun/problems。認証必須・軸切替・facetを件数つきで返す・不正クエリ400・バンク不達503/api/training/questions(出題)・/events(履歴)・/chat(AI先生)+TrainingPage 817行。出題→解答→復習キュー→サマリまで実装済みreveal_state=locked の間は正解番号・正解肢全文・最終数値を出さない契約が既に書かれているつまり過去問問題集に要るのは出題源の切り替えであって、演習UIの新規開発ではない。ビュワーも論文問題集の写像で足りる。
| 観点 | 判断 |
|---|---|
| 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はその表示面にすぎない。
必須度: ◎必須 / ○推奨 フェーズ: ①ビュワー ①-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-09 | API | 一覧 | 認証必須。試験種・年度・区分・科目・単元・健全性・解説有無・図有無で絞り、facetを件数つきで返す | ◎ | ① |
| F-09a | API | 索引のキャッシュ | 索引は3.9MB。毎リクエストでR2から引いてparseしない。モジュールスコープ+Cache APIにrelease idをキーに保持 | ◎ | ① |
| F-10 | API | 詳細 | 索引のbucketから該当バケット1本だけを引く(全問を読まない) | ◎ | ① |
| F-11 | API | 防御 | 不正クエリ400/バンク不達503(論文問題集と同じ文言体系) | ◎ | ① |
| F-12 | API | モード | review=欠陥も返し来歴を含む/member=fatal・degradedを除外。既定はmember(安全側) | ◎ | ① |
| F-13〜15 | UI一覧 | 絞り込み・並べ替え・状態バッジ | 軸タブ+件数つきチップ。並べ替えは試験種→年度→問番(既定)/単元別/欠陥の重い順。「解説あり」「図あり」「要注意」を一覧で判別 | ◎ | ① |
| F-16〜18 | UI詳細 | 問題・解説・検収操作 | 図はインライン表示。解説は手順・ひっかけ・選択肢別分析・想定正答率・時間圧。検収モードでパーマリンクと差し戻し | ◎ | ① |
| F-19 | UI在庫 | 単元別在庫ビュー | 単元×(問題数/解説あり/図あり/欠陥)の表。何を売れるかを見る面 | ○ | ② |
| F-21 | 品質 | 出荷ゲート | fail-closed 7種(整合・序数参照・正答・健全性・SVG・PII・確度)✅ 実装済み・欠陥8種を注入して落ちることまで検証(11テスト緑) | ◎ | ① |
| F-23 | 運用 | 非公開性 | 認証の内側・noindex。過去問本文が検索に載らないこと | ◎ | ① |
| F-24 | 問題集 | 出題源 | /api/training/questions に source=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)にある。
UIデザインの作り込みは基本設計フェーズで行う。本要件では骨格と情報の優先順位までを確定する。配色・余白は既存の会員マイページのトークンに従い、新しいデザイン言語を持ち込まない。
論文問題集は80問なので corpus.json 1本で成立していたが、過去問は6,979問ある。実際に組んでみると18.1MBで、Workerが毎リクエストでR2から引いてparseするには重すぎる。一覧に要るものと詳細を分ける。
| ファイル | 中身 | 実測 |
|---|---|---|
current.json | どのリリースを配るか+manifestのsha256 | 200B |
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-30 に発覚した「正答6,314問が全問1つずれて表示される」重大インシデントの再発防止。基準は必ずデータで宣言し、宣言のないリリースは読まない(fail-closed)。
answer は1始まり(正本宣言=release manifest の answer_base: 1・r6以降)。explanation.choice_analysis[].idx は0始まりの配列添字。対応は idx == answer − 1。宣言なきリリース(manifestにanswer_baseキーが無いもの)は読まない。
year は過去問バンクでは和暦年度文字列(H/R+整数)、論文バンクでは西暦整数。横断集計は fiscal_year_ad(西暦整数)へ変換してから行う。
| ID | 条件 | 確認方法 |
|---|---|---|
| AC-1〜3 | st で6,979問が一覧でき、チップの件数が実測と一致。試験種・年度・区分・科目で絞れる。単元は確定と暫定が視覚的に区別され、暫定で絞り込ませない | 実機・件数照合 |
| AC-4 | 図が、図解セッションが合格させたものとバイト一致で表示される | 機械照合 |
| AC-5 | 解説の本文に選択肢の番号参照が0件 | 機械・exit=0 |
| AC-6〜7 | member モードで欠陥問題が返らない/未認証で401 | 自動テスト |
| AC-8〜9 | 2回ビルドしてバイト一致/過去リリースのURLが新リリース公開後も同じ内容を返す | 機械・実機 |
| AC-10〜11 | noindex であること/スマホ幅で横スクロールが出ないこと | ヘッダ確認・実機 |
| AC-12 | 出荷ゲートが exit=0。かつゲート自体が欠陥を注入すると落ちることを検証済み | 11項目のテスト |
| AC-13 | 問題集で出題される問題が4条件をすべて満たす。欠陥・正答未確定・解説なしが1問も出ない | 自動テスト+実機50問 |
| AC-14 | 解答前に正解が画面にもAPI応答にも含まれない(AI先生の応答も含む) | API応答の全文検査 |
| AC-15〜16 | 問題集の単元選択に暫定単元が出ない/同じ会員が同じセットを開くと同じ出題順 | 自動テスト |
7を通してから8に入る。検収されていない問題を出題しないため。
| 段 | 状態 | 実測 |
|---|---|---|
| リリースビルダ | 🟢 完了 | 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委任予定 |
問題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 では配信しない。
| ID | 論点 | 起草者の推奨 |
|---|---|---|
| Q-1 | ✅ 決裁済み・実行中。①「推奨の進め方で進めて」②「専門は完全除外・まずは教養」。真因が語彙欠落だったため、語彙拡張(教養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