CONFIDENTIAL | 2026-07-23(v1.1=2026-07-26 §1追加)

SCOA体験模試
コンテンツ&供給システム 仕様書 v1.1

SCOA(自治体で採用が広がっている総合適性検査)向け体験模試の棚卸しです。§2 以降は 2026-07-23 時点の一次現物(コード・データファイル・監査ログ)で確認したもので、当時は本番未公開でした。
v1.1(2026-07-26 追加)=「§1 全体像」を新設し、その後の変化を本番実測で反映しました。SCOAは 7/24 に一般公開され、正本リリースへの収載も完了しています。§2 以降は当時の記録としてそのまま残していますので、§1 末尾の対比表で読み替えてください。

📌 3行サマリー
🔴 デプロイ前の総点検向け:本日 SPI ラインで判明した共通事項(2026-07-23 夕方 追記) SPIラインの外販対応を進める過程で、SCOAにも直接効く事実が5つ判明しました。総点検の前に必ず目を通してください。詳細は §9 に展開しています。
  1. SCOAの検品には正答位置の検査が一切ありません。L1構造検品もL3機械lintも見ていません(全数grepでヒットゼロ)。そして共通ゲート側も最小バッチ20問の閾値で素通りするため、二重に無検査です。実測で常識・時事10問が60%偏っています
  2. その偏りはSCOA独自のものではありません。常識・時事カード(G8/G9/G11)は知識バンク・時事バンクから抽出しており、そのバンクを作る生成器の主経路にシャッフルが無いのが根です。生成器を直せばSCOAも直ります
  3. 正本リリースへ収載する前に、内容ハッシュへ図(figures)を追加する修正が必須です。やらないと展開図12問・投影図12問が重複と誤判定されビルドが止まります
  4. SCOAは未公開=受験データがゼロなので、恒久ID体系への破壊的移行を損失なしで今できます。公開後だとSPIと同じ苦労(過去ログの遡及救済)が発生します。着手順としてID体系を先に固めるのが最も安い
  5. SPIラインで作った資産(系譜台帳・リリースビルダ・判定ゲート・デプロイ正路)はそのまま流用できます。ゼロから作ると二重投資です
目次
  1. 全体像 — 何が、どこから、どう配られているか
  2. 現在の状態
  3. コンテンツ仕様
  4. 問題型カード(14枚)
  5. 量産と検品
  6. 配信面と図解
  7. 本家SCOAとの関係
  8. 課題 — 全12件
  9. SPIラインからの申し送り(デプロイ前必読)

1. 全体像 — 何が、どこから、どう配られているか

SCOA体験模試も「①問題を作る」「②正本として版を固める」「③配る」の3層です。SPI・公務員と同じ正本リリース・同じ出題workerに相乗りしていますが、SCOAだけは問題型を「カード」として定義し、そのカードを指定して出題するという組み立て方をします。この節の記載はすべて 2026-07-26 に本番URL・本番R2を叩いて実測したもので、§2 以降(2026-07-23 時点)より新しい状態を表します。差分は節末にまとめました。

生成層 | 問題をつくる
カードYAML 14枚 + 量産CLI
問題型ごとに生成器・難易度・誤答設計・解説様式を機械可読に定義し、3層の検品を通す。不合格なら公開用ファイルを書き出さずに終了する(fail-closed)
scoa-questions.bank.json
量産済みバンク 145問(数理36/論理75/常識34)。ここまでが素材
正本層 | 版として固める
release_build.py(exam_family = scoa
SPI・公務員と同じビルダに SCOAを独立した exam_family として収載。品質ゲート(正答位置の偏り/完全一致重複/ID衝突/解説の番号整合)を通した版だけが出せる
serving/scoa/尺度×問題型のシャード8本。答えを含まない
_answers/答えと解説だけを別バケットへ分離
図(figures)内容ハッシュに図を含める修正が適用済み
manifest.json全ファイルのsha256と件数を事前集計
current.json → qb-r2-20260724d
現行の正本リリース。この版に載っているSCOA問題は 130問(145問から重複15問を除外・本番R2の manifest 実測)
R2: educare-question-bank
serving + manifest + current.json
R2: educare-question-bank-answers
_answers のみ・別バケットに物理分離
配信層 | 出題は (A) の1経路のみ(2026-07-26 実測)
A正本・唯一の出題元
出題worker
spi-questions.komuin-sukima.workers.dev
SPI・公務員と同じworkerを共有。SCOA専用の api/scoa/set は、体験版レシピ(scoa-a-trial)が指定するカードの並び順どおりに10問を組む。出題セットには署名トークンが付き、採点はサーバ側
  • GET api/scoa/set(体験10問の一括構成)
  • POST api/grade/finish(サーバ採点)
応答に答え・解説を含まないことを本番実測
B(A)へ配線済み
自社フロント
SCOA体験模試(Web)
educarelog.net/scoa/taiken/
一般公開中(HTTP 200・2026-07-24 公開)。問題は開始時に (A) から取得します。同時に読み込まれる scoa-preview チャンクは約3KBで、中身は表示用のラベルと尺度名だけ(SCOA-A/言語・数理・論理…)。問題の同梱はありません
公務員・SPIと同じ questions-api を共用
C出題には非関与
周辺の外部呼び出し
会員導線・受験ログ
educare-poc… /auth/line
educare-cbt-ingest… /ingest
前者はLINEログイン(会員登録)の導線、後者は受験ログの送信先です。どちらも問題データは扱いません。体験モードは登録なしで受けられます
問題・答えは通らない
正本(A)から同世代を配っている ※ SCOAは受験データが発生する前に正本リリースへ収載できたため、SPIが経験した「IDの世代ズレ」を回避しています。
系統実体いま何が起きているか(2026-07-26 実測)
(A) 出題workerspi-questions.komuin-sukima.workers.devfact稼働中。api/scoa/set を叩くと10問が返り、内訳は数理3・論理3・常識4で体験版レシピどおり。問題オブジェクトに answerexplanation も含まれないことを確認。すべて exam_family=scoabank_release_id=qb-r2-20260724d
(B) 自社フロントeducarelog.net/scoa/taiken/fact稼働中・一般公開。配信中のJS(ScoaTaikenGate)が公務員・SPIと共通の questions-api を読み込み、(A) の api/scoa/setapi/grade/finish を叩く実装であることを確認。
(C) 周辺educare-poc…/auth/line
educare-cbt-ingest…/ingest
fact会員登録(LINEログイン)と受験ログ送信。問題データは通らない

1-1. 体験10問がどう組まれるか

SCOAの出題は、SPI・公務員の「試験種の科目配分+単元の重み」とは違い、体験版レシピ(profile_id = scoa-a-trial)が「1問目はこのカード、2問目はこのカード」と順番に指定する方式です。実測した応答には、レシピ自体の改竄検知用に blueprint_sha256 が付いていました。

出題順指定されるカード尺度
1〜3問目math-shisoku-kufuu(四則の工夫)/math-suuretsu(数列)/math-soneki(損益)数理
4〜6問目logic-suiron-junjo(順序推論)ほか論理系カード論理
7〜10問目常識系カード(自然科学・社会科学・時事)常識

※ 各スロットの選択方式は exact(カードを名指し)です。したがって出題の構成は毎回同じで、中の問題だけが入れ替わります

✅ この節(2026-07-26 実測)が、§2 以降(2026-07-23 時点)を更新している点

SCOAは 7月24日に一般公開され、そのあと第三者監査を受けて是正まで完了しています。§2 以降の本文は当時の記録としてそのまま残していますので、読み替えてください。

§2 以降の記述(7/23時点)現在(7/26 実測)
本番未公開releaseReady=false・カタログは coming_soon・ページタイトルは「準備中」・noindex 固定・masterへ未マージ一般公開中(2026-07-24)。educarelog.net/scoa/taiken/ が HTTP 200 を返し、サイトマップにも掲載されている
正本リリースの外にあり、正答位置の一様性検査・重複遮断・ID一意性検査を一度も通っていない正本リリース qb-r2-20260724dexam_family=scoa として収載済み。145問のうち130問が収載され、テキストが完全一致する重複15問(論理11・常識4)を除外。全問に恒久IDが付いている
テキスト基準の重複検査だと展開図12問・投影図12問が「重複」と誤判定され、正本収載前に内容ハッシュへ図を含める修正が必須適用済み。除外された15問に空間把握(展開図・投影図)は1問も含まれていません。誤検知だった図問題は正しく残っています

※ 公開後の第三者監査で見つかった①図が表示されない(正多面体・展開図)②解説の選択肢番号の矛盾③科目名の誤表示は、いずれも 7/24 に是正済みです。図の不表示は、図を安全に描画するためのフィルタが正当な図まで弾いていたことが原因でした。

2. 現在の状態

fact本番未公開です。コード上でも裏付けが取れています。

項目状態
公開フラグreleaseReady = false(体験・総合演習・尺度別のすべて)
カタログ表示availability = "coming_soon"
ページ/scoa/taiken はタイトルが「準備中|Educare」・noindex 固定
プレビュー導線?preview=scoa-toshi のクエリトークンでランナーが描画される(敏の目視確認用)
master へのマージ未実施(ブランチ feat/scoa-taiken-v1 のみ)
⚠️ 実装が3つのgit境界に分散している factSCOAの全体像を1つのブランチで再現できません。①カードYAML14枚と量産CLIは feat/spi-generator-unify の worktree にしか存在せず(main比10コミット先行・未マージ)、②golden と lint は主リポジトリ③配信面と量産済みバンク145問は別リポジトリの feat/scoa-taiken-v1 にあります。引き継ぎの際はこの3つを跨がないと読めません。

3. コンテンツ仕様

内訳(全145問・全問5択・SCOA-A形式)
尺度論理 75/数理 36/常識 34
問題型空間把握51・推論24・常識(自然科学)12・常識(社会科学)12・四則計算12・割合損益12・数列12・常識(時事)10
難易度2:39/3:63/4:43(1と5は無し)
正答位置0:31/1:34/2:33/3:18/4:29(最大32%)健全※ 番号は選択肢配列の0始まり index(内部表現)
解説欠落ゼロ
図解24問(段階アニメーション付き)
体験版レシピ10問10分=数理3+論理3(空間は最大1)+常識4
出所original/educare 82/未記録 63
誤検知だったもの(記録として残します) テキスト基準(問題文+選択肢の完全一致)で検査すると22問が「重複」と出ますが、現物は展開図12問・投影図12問で、問題文と選択肢は同じでも図が異なる別問題でした(各グループ内で正答も相異なります)。図が問題の本体である設問では、テキストだけ見る重複判定は機能しません。この発見は、SPIラインで構築中の系譜台帳のハッシュ定義に「図を含めていない」という穴を露呈させ、他ライン取り込み前の必須修正として記録済みです。

4. 問題型カード(14枚)

SCOAの特徴は、問題型を YAMLの「カード」として定義している点です。カードには生成器の参照先・難易度・1セットあたりの上限・誤答の設計方針・解説様式・実物SCOAとの突合状態が機械可読に書かれており、量産CLIがこれを読んで動きます。

カード尺度/問題型生成方式難易度量産
G1 四則計算数理/計算の工夫テンプレート2,3
G2 数列数理/規則性テンプレート2,3,4
G3 割合・損益数理/損益算テンプレート(SPI生成器流用)2,3,4
G4 推論・順序論理/順序関係CSPソルバー(解の一意性を構成的に保証)3,4
G5 推論・位置論理/位置関係CSPソルバー3,4
G6 空間・スライス論理/空間把握3D場面モデルから独立再導出2,3,4
G7 空間・投影論理/三面図同上2,3,4
G8 常識・政治常識/社会科学知識バンクから抽出2,3,4
G9 常識・生物常識/自然科学知識バンクから抽出2,3,4
G10 記号系列論理/系列推理テンプレート2,3,4機械除外
G11 常識・時事常識/法改正時事バンクから抽出2,3,4
G12 空間・正多面体論理/空間把握立体生成器2,3
G13 展開図・平行面論理/空間把握立体生成器3,4
G14 展開図・組立可否論理/空間把握立体生成器3,4

G10(記号系列)だけが量産から機械除外されています。3層の品質ゲートは通過し承認済みですが、「SCOAの問題型カタログでの裏付けが薄い」という理由で突合状態が weak となっており、量産CLIが「承認済み かつ 突合が weak でない」ものだけを抽出する仕組みのため自動的に外れます。型として採用するかは判断待ちです。

5. 量産と検品

python3 -m spi_generator.scoa.batch --seed <整数> --per-card 12 --out <dir>

  ① カード13枚を抽出(G10は自動除外)
  ② カードごとに問題を生成
       シード = seed×100000 + カード番号×1000 + 連番 + リトライ回数
       → 同じシード・同じカード順なら全問がバイト単位で再現する
       → 1問を差し替えても他問の再現性が壊れない設計
       失敗時は最大10回リトライし、理由を記録
  ③ L1 構造検品(全問・自動)
       選択肢の重複なし/正答と選択肢の整合/解説の段数/誤答タグ4件必須
       テンプレート型はさらに正答を再計算して照合
  ④ L2 人力抜き取り用の材料を生成
       設問と選択肢だけを転記した「独立解き直しシート」と正答キーを別ファイルで出力
       ※CLIはL2の合否を判定しない(人間が解いて突合する)
  ⑤ L3 機械lint
       解説様式のマーカー検査/同一説明文が3問以上に出たら定型文汚染と判定
       「計算ミスに注意」等の類型固有性ゼロの汎用文言を検出

  ⑥ 公開可否の判定(fail-closed)
       ブロッカーを「品質」と「供給」に分類し、
       品質ブロッカーが1件でもあれば公開用ファイルを昇格させず非0終了する

fact実際の量産では13カード×12問=156候補のうち11件がブロックされ、145問が成立しました。ブロックの内訳は時事バンクの在庫切れ2件(バンクに10件しかない)と正多面体の類似枯渇9件(似た形しか作れなくなった)で、誤答由来のブロックはゼロです。

知識問題34問には事実監査の台帳があり、問題内容のハッシュと監査結果を突き合わせて合格分だけを通す仕組みになっています(台帳エントリ34件=バンクの知識問題数と一致)。

6. 配信面と図解

6-1. 出題ロジック

出題レシピはハードコードせず外部JSONに切り出し、モジュール読み込み時にスロット数と上限を自己検証して不整合なら即座に停止する作りです。空間把握は1セッションあたり最大1問に機械制約されています(図形問題ばかりになるのを防ぐため)。重複回避は1セッション内で効きますが、セッションをまたいだ出題多様性の保証はありません(複数回受けると同じ10問が再び出る可能性)。

6-2. 図解専用のサニタイザ

SCOAの解説図は段階的に完成していくアニメーションで、SVG内に CSS を埋め込む必要があります。既存の共通サニタイザは <style> を無条件でブロックするため描画できず、専用サニタイザを新設しています。

項目共通(SPI等)SCOA専用
<style>完全ブロック2種類の固定パターンに正規表現で全文一致する場合のみ許可(フェード演出/線分図の描画アニメ)。任意CSSは一切通さない
インラインstyle不許可animation-delay:数値ms--len:数値px の2パターンのみ
実体参照攻撃対策なし数値参照+既知の名前付き参照16種を1回デコードしてから危険パターンを検査。未知の参照が残れば安全側で拒否
ルート制約チェックなし兄弟svg・ネストsvgを拒否

課題リリース前監査で、名前付き実体参照の一部が未対応との指摘が出ています(§8-1)。

7. 本家SCOAとの関係

当社が「わかっていること」と「わかっていないこと」を分けて記録しています 確認済み(公式サイト由来): SCOA-Aは基礎能力検査で、尺度は言語・数理・論理・常識・英語の5つ。回答時間は45〜60分(実施形態により幅)。実施方式はマークシート/テストセンター/オンライン。自治体の採用実例あり。

未確認(商品仕様のため非公開・公開コピーの使用禁止と明記): ①総問題数(「120問」は二次情報で公式未確認)②尺度別の問題数配分・配点 ③誤答減点の有無 ④出題順・尺度ブロック順 ⑤見直し可否 ⑥合格ライン ⑦監視仕様 ⑧画面遷移・UI

fact複製でないことは全問の由来情報に機械的に刻まれています。各カードに「オリジナル生成(実物SCOA問題の複製・流用なし)」、各問題に style_note: "SPI生成器流用。SCOA-A実物の形式適合は未担保"type_hypothesis_status: "3ソース突合前" が自動付与されます。

形式の規約は、公務員過去問917問・自社バンク1,262問・対策サイト3件以上の突合から「5肢択一」「設問語尾は〜はどれか」「1問30秒〜1分」を確定しています。ただし実装側の選択肢数が全カードで5肢に揃っているかは未検証(§8-6)。

品質保証の体制は、人間講師の監修が当面困難という判断から、AI講師による3層ゲート(構成的な正答保証 → 独立AIによる解き直し → 解説品質のAI監査)に切り替えています。人間講師の盲検監査は投入後の後追いとする方針です。

8. 課題 — 全12件

BLOCKER7-1. リリース前監査の公開ブロッカー4件が未解決

fact外部監査2社を通し、片方は「現状のまま一般公開は不可」(条件付きGO)。公開前必須のHigh4件:

是正案:残る2件(サニタイザ・公開ゲート)を潰して再監査 → PR → 本番。現在未デプロイ=実露出ゼロなので、リリースを急がなければリスクは顕在化しません。

HIGH7-2. 本家SCOA-Aの形式に合っているか未検証

fact全問の由来情報に 「SPI生成器流用。SCOA-A実物の形式適合は未担保」「3ソース突合前」 と自分で記録されています。誠実な記録であると同時に、SCOAラインの最大の課題です。「SCOA対策」として売るには、実物の出題形式との一致度を裏づける必要があります。

是正案:市販対策本・受験報告を3ソース以上突合して型カタログを確定する。確定するまでは「SCOA形式に寄せた練習」と位置づけを明示する。

HIGH7-3. 言語・英語の2尺度が未着手

factSCOA-Aは5尺度ですが、カードが存在するのは数理・論理・常識の3尺度のみ。言語・英語のカードは0枚で、体験模試にも含まれていません。方針として「キュレーション体制/根拠付きAI補助体制が整うまでカードを作らない」と明記されています。

是正案:5尺度中3尺度しか対策できない状態なので、商品として出す際は範囲を明示する。英語は SPI ラインでも未対応で、全社的な穴です。

MEDIUM7-4. 問題IDがバッチ内連番で、世代衝突のリスクがある

factIDは scoa-a-{尺度}-batch-NN-NNN の形式で、バッチ内の連番です。現時点で重複はありませんが、SPIラインで実際に起きた「再生成すると同じIDが別問題を指す」問題と同じ構造です。SPI側では恒久ID(UUIDv7)と系譜台帳を導入して解決しました。

是正案:正本リリースへ収載する際に、SPIと同じ系譜台帳へ載せる。受験データが貯まる前に対処すれば損失ゼロです。

MEDIUM7-5. 正本リリースに載っていない

fact問題バンクの正本はR2上の版付きリリースですが、名前空間は現在 spi のみで、SCOAは1問も載っていません。品質ゲート(正答位置の一様性・重複遮断・ID一意性)も適用されていません。※SCOAは独自のL1/L3検品を通しているため品質は保たれていますが、共通基盤の検査は受けていない状態です。

是正案exam_family=scoa として正本リリースへ収載する。ただしハッシュ定義に図を含める修正が前提(含めないと展開図・投影図が重複判定で弾かれる)。

MEDIUM7-6. 実装の選択肢数が5肢に揃っているか未検証

unknown形式規約として「5肢択一」を確定していますが、各生成器の実装が4〜5肢で混在している可能性が指摘されており、全カードの実装確認は行われていません。現バンク145問は全問5択であることを実測確認済みなので、少なくとも出荷済みの問題に不整合はありません

是正案:カード側の生成器を全数確認し、5肢を機械強制する。

MEDIUM7-7. 単元マトリクスへの対応が半分

fact承認済み13カードのうち、単元マスタへ対応付けできたのは7カードのみ。残る6カードは理由つきで未対応と正直に記録されています(四則計算=SCOA固有領域/生物=粒度不一致/政治・時事=該当taxonomy未構築/展開図2種=単元マスタに未収載)。

unknownなお単元マトリクス側は最新のSCOA整備を反映する前のスナップショットのままで(再ビルド未実行)、SCOA列は全行が未充填です。

是正案:単元マトリクスを再ビルドする。展開図など未収載の単元はマスタ側に追加する。

LOW7-8. 時事問題の在庫が薄く、自動更新もない

fact時事は10問のみで、量産時に12問を要求して2件が在庫切れになりました。全問が2026年7月時点の内容で、鮮度失効の自動化は未実装(人手のレビュー依存)。生成器のモデル指定にも記録の食い違いがあり、どのモデルで生成されたかが確定できません。

是正案:時事は「周期」ではなく「鮮度」で管理する別建て設計が要ります。公務員ラインと共通の課題です。

LOW7-9. セッションをまたいだ出題多様性の保証がない

fact重複回避は1セッション内のみ。複数回受験したときに同じ10問セットが再出現する確率的な可能性への対策はありません(実測はしていないため影響度は unknown)。バンクが145問で体験が10問なので、繰り返すほど既視感が出ます。

是正案:出題済みIDを保持して除外する(SPIラインの出題workerには実装済みの機能)。

LOW7-10. 受験ログが正式には残らない

fact体験模試の受験記録はGA4のクライアントイベントのみで、サーバ側の受験ログには残りません。イベントの分類語彙に scoa が無く、送るとAPIがエラーになる系統のため、v1では記録機構を見送っています。

是正案:公開するなら受験データを取れる状態にしてから。SCOAは市場が伸びている領域なので、データを取り逃すのは機会損失です。

HIGH7-11. 正答位置の偏りが、自前検品にも共通ゲートにも引っかからない(2026-07-23 追記)

factSCOAの検品には正答位置の検査が一切ありません。answer_position/正答位置/一様 で量産CLI・golden・lint を全数grepしてヒットゼロでした。L1構造検品が見ているのは選択肢の重複・正答と選択肢の整合・解説の段数・誤答タグの有無、L3機械lintが見ているのは解説様式のマーカー・定型文汚染・汎用的すぎる文言です。

factそして共通側のゲートも効きません。リリースビルドの正答位置検査は1トピック20問未満をスキップする設定で、SCOAは全カードが12〜51問のため小さいものが素通りします。二重に無検査の状態です。

実測値:

問題型問題数最大シェア共通ゲート
常識・時事1060%🔴 20問未満のため素通り
常識・自然科学1242%🔴 素通り
割合・損益1242%🔴 素通り

参考までに、SPI正本7,537問では同じ検査で偏りゼロ、公務員2,377問では英文46%・生物41%・現代文40%が捕捉される一方、時事の各トピック(1〜2問ずつ・すべて100%)が同じ理由で素通りしていました。

是正案:①根本は生成器側(§8-12)。②検査側は、小さいトピックを上位グループ(尺度)で束ねて検査するか、小標本に耐える統計量へ変える。①を直せば実害は消えますが、ゲートを穴のまま残すと次の生成器で再発を検出できません。

HIGH7-12. その偏りはSCOA由来ではなく、生成器の主経路から引き継いだもの(2026-07-23 追記)

factSCOAの常識カード(G8 政治/G9 生物/G11 時事)は、独自に問題を作っているのではなく知識バンク・時事バンクから抽出しています。そのバンクを作る生成器を調べたところ、正答位置のシャッフルが主経路に入っていませんでした

生成器シャッフル実態
文章理解 reading/generator.py✅ 2026-07-23 追加問題IDをシードにした決定論シャッフル
知識 knowledge_generator.py⚠️ 複製時のみ主経路は生成AIが返した answer をそのまま採用
時事 current_affairs_generator.py⚠️ 同上同上
推論・図形 e3/ ほか❌ 無し

生成AIは正解を先頭に置く傾向があるため、主経路でシャッフルしないと偏ります。SPIの文章理解で本日是正したのと同じ機序です。

是正案:文章理解に入れた決定論シャッフルを各生成器の主経路へ横展開する。SCOA側で個別に直すと二重投資になるので、生成器の修正として一度で済ませるべきです。直したうえで知識・時事バンクを再生成すれば、SCOAのカードも自動的に健全化します。

9. SPIラインからの申し送り(デプロイ前必読)

2026-07-23 に SPI ラインで外販対応を行いました。そこで確立した型と、踏んだ落とし穴を引き継ぎます。SCOAで作り直す必要はありません。

9-1. 着手順の推奨

💡 SCOAは未公開=今なら破壊的変更のコストがゼロ SCOAには受験データが1件も存在しません(受験ログはGA4のクライアントイベントのみで、サーバ側に記録されていない=§8-10)。 つまりID体系を破壊的に変えても失うものがありません

SPIでは公開後に同じ問題(IDが世代をまたいで再利用され、同じIDが別問題を指す)に直面し、過去の応答ログ1,428行を遡及救済する作業が発生しました(本日88.1%まで回復・残り170行は復元不能)。SCOAはID体系を先に固めてから公開するのが最も安く済みます。
  1. 生成器の正答位置シャッフル(§8-12)— 共通基盤の修正。ここを直すと知識・時事バンクの再生成でSCOAのカードも直る
  2. 恒久ID体系への移行(§8-4)— 公開前の今が最安
  3. 内容ハッシュへの figures 追加(8-2)— 正本収載の前提
  4. 正本リリースへの収載(§8-5)
  5. リリース前監査の残ブロッカー2件(§8-1)

9-2. 🔴 収載前に必須の修正:内容ハッシュに図を含める

SPIで作った系譜台帳の内容ハッシュは、現在本文/問題文/選択肢/正答/解説の5要素で計算しており、図を含んでいません。SPI正本には図フィールドが存在しないため実害ゼロでしたが、SCOAで確実に破綻します

実証済み:SCOAの22問が誤検知される SCOAバンク145問をテキスト基準(問題文+選択肢の完全一致)で検査すると22問が「重複」と出ます。しかし現物は展開図12問・投影図12問で、問題文と選択肢は同一でも図が異なる別問題でした(各グループ内で正答も相異なる)。

このまま収載すると:重複ゲートが正当な22問を弾いてビルドが止まります。逆に、図だけ差し替えた改訂も「同一内容」と誤認して見逃します。

対応spi_bank_build/lineage/core.py のハッシュ入力へ figures を追加し、重複判定キーにも含める。正規化は「SVG文字列そのもの」ではなく、描画に影響しない差分(空白・属性順・id採番)を除去した正規形とすること。整形の揺れで版が切られると改訂履歴がノイズで埋まります。

9-3. やってはいけない検査

問題文の冒頭60字一致を、重複の出荷停止条件にしてはいけません。SPI正本7,537問で500件が該当し、うち推論476件は数値だけ違う正常なパラメトリック問題でした。停止条件にすると健全な問題を大量に弾きます。

出荷停止にしてよいのは 「NFKC正規化した 本文+問題文+選択肢(順序込み)+図 の完全一致」だけ。冒頭60字一致は警報(レポート出力)に留めてください。

9-4. 流用できる資産

資産場所と用途
系譜台帳spi_bank_build/lineage/。UUIDv7の恒久ID発番・過去ログ救済・世代衝突検査。ライン非依存の設計なのでSCOAもそのまま載ります
リリースビルダspi_bank_build/release_build.py。統一エンベロープ化・答えの物理分離・ゲート・決定論ビルド(2回ビルドしてバイト一致を確認する仕組み)
判定ゲートspi_bank_build/verify_external_gate.py。10項目の機械判定。項目はSCOA向けに作り替えが要りますが、考え方は流用すべき(ソースを見るのではなく本番の実挙動を見る/確認不能は成功扱いにしない/検査が自分の痕跡を掃除する)
デプロイ後スモークspi_bank_build/smoke_external_after_deploy.sh。本番実弾検証の型
デプロイ正路03_Shared_Assets/deploy_gate/targets.yaml新しいworkerを出すなら、必ず先に登録してbootstrapすること
証拠保全の型~/educare-backups/bank-snapshots/20260723T1115/。checksumと出所を記録したマニフェスト付き

9-5. SPIで実際に踏んだ落とし穴

9-6. デプロイ前チェックリスト(SCOA向け)

  1. 変更前のバンクをスナップショット保全したか(checksumと出所つき)
  2. ハッシュに figures を含める修正を入れたか(入れないと収載でビルドが止まる)
  3. 全カードの正答位置をカード単位で検査したか(尺度単位の集計では偏りが隠れる)
  4. リリース前監査の残ブロッカー(サニタイザの名前付き実体参照・プレビュー公開ゲート)を潰したか
  5. サイトマップからプレビューURLを除外したか
  6. 公開フラグを反転する前に、デプロイ正路を1回通してリハーサルしたか
  7. ロールバック手順を書いたか(フラグを戻して再デプロイ/リリースポインタの書き戻し)
  8. 受験ログを取る仕組みを入れたか(§8-10。データを取り逃すと較正ができません
📐 データ契約(Data Contract)— 選択肢・正答・送信値の基準

本仕様書が定義するAPI・バンクに共通する契約です。「選択肢を何番目として数えるか」「正答値の基準」「送信する回答値の意味」「宣言の在り処」を、実装側の解釈違いを防ぐために明文化します(2026-07-31 確定・ANSWER_BASE_MIGRATION_PLAN_20260730.md §10-8)。

ID項目定義
DC-1選択肢の数え方選択肢配列は先頭を0とする配列添字で数えます。choices[0] が1番目の選択肢です。画面表示の「選択肢1」は添字0の投影(表示専用の変換)です。
DC-2正答の基準バンク内部の answer1基準へ切替済みです(2026-08-01 完了)。切替は当社内部の是正であり、本仕様のAPI挙動・採点結果は切替前後で同一であることを機械検査(全問題×全choice点の突合)で保証済みです。
DC-3解答送信の意味choice当APIが返した choices 配列の位置(0始まりの配列添字)です(2026-07-31 確定)。-1 は「未回答」を表す正規のセンチネル値です。
DC-4宣言の在り処正答を含むデータは manifest トップレベルの answer_base 宣言と同伴でのみ解釈します。宣言の無いデータは読みません(fail-closed・既定値で補いません)。

※ この節は共有済みの4仕様書(SPI/公務員/SCOA/適性)すべてに同一内容で追記しています。