SCOA(自治体で採用が広がっている総合適性検査)向け体験模試の棚卸しです。§2 以降は 2026-07-23 時点の一次現物(コード・データファイル・監査ログ)で確認したもので、当時は本番未公開でした。
v1.1(2026-07-26 追加)=「§1 全体像」を新設し、その後の変化を本番実測で反映しました。SCOAは 7/24 に一般公開され、正本リリースへの収載も完了しています。§2 以降は当時の記録としてそのまま残していますので、§1 末尾の対比表で読み替えてください。
SCOA体験模試も「①問題を作る」「②正本として版を固める」「③配る」の3層です。SPI・公務員と同じ正本リリース・同じ出題workerに相乗りしていますが、SCOAだけは問題型を「カード」として定義し、そのカードを指定して出題するという組み立て方をします。この節の記載はすべて 2026-07-26 に本番URL・本番R2を叩いて実測したもので、§2 以降(2026-07-23 時点)より新しい状態を表します。差分は節末にまとめました。
exam_family = scoa)api/scoa/set は、体験版レシピ(scoa-a-trial)が指定するカードの並び順どおりに10問を組む。出題セットには署名トークンが付き、採点はサーバ側。scoa-preview チャンクは約3KBで、中身は表示用のラベルと尺度名だけ(SCOA-A/言語・数理・論理…)。問題の同梱はありません。questions-api を共用| 系統 | 実体 | いま何が起きているか(2026-07-26 実測) |
|---|---|---|
| (A) 出題worker | spi-questions.komuin-sukima.workers.dev | fact稼働中。api/scoa/set を叩くと10問が返り、内訳は数理3・論理3・常識4で体験版レシピどおり。問題オブジェクトに answer も explanation も含まれないことを確認。すべて exam_family=scoa・bank_release_id=qb-r2-20260724d。 |
| (B) 自社フロント | educarelog.net/scoa/taiken/ | fact稼働中・一般公開。配信中のJS(ScoaTaikenGate)が公務員・SPIと共通の questions-api を読み込み、(A) の api/scoa/set/api/grade/finish を叩く実装であることを確認。 |
| (C) 周辺 | educare-poc…/auth/lineeducare-cbt-ingest…/ingest | fact会員登録(LINEログイン)と受験ログ送信。問題データは通らない。 |
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(カードを名指し)です。したがって出題の構成は毎回同じで、中の問題だけが入れ替わります。
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-20260724d に exam_family=scoa として収載済み。145問のうち130問が収載され、テキストが完全一致する重複15問(論理11・常識4)を除外。全問に恒久IDが付いている |
| テキスト基準の重複検査だと展開図12問・投影図12問が「重複」と誤判定され、正本収載前に内容ハッシュへ図を含める修正が必須 | 適用済み。除外された15問に空間把握(展開図・投影図)は1問も含まれていません。誤検知だった図問題は正しく残っています |
※ 公開後の第三者監査で見つかった①図が表示されない(正多面体・展開図)②解説の選択肢番号の矛盾③科目名の誤表示は、いずれも 7/24 に是正済みです。図の不表示は、図を安全に描画するためのフィルタが正当な図まで弾いていたことが原因でした。
fact本番未公開です。コード上でも裏付けが取れています。
| 項目 | 状態 |
|---|---|
| 公開フラグ | releaseReady = false(体験・総合演習・尺度別のすべて) |
| カタログ表示 | availability = "coming_soon" |
| ページ | /scoa/taiken はタイトルが「準備中|Educare」・noindex 固定 |
| プレビュー導線 | ?preview=scoa-toshi のクエリトークンでランナーが描画される(敏の目視確認用) |
| master へのマージ | 未実施(ブランチ feat/scoa-taiken-v1 のみ) |
feat/spi-generator-unify の worktree にしか存在せず(main比10コミット先行・未マージ)、②golden と lint は主リポジトリ、③配信面と量産済みバンク145問は別リポジトリの feat/scoa-taiken-v1 にあります。引き継ぎの際はこの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 |
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 でない」ものだけを抽出する仕組みのため自動的に外れます。型として採用するかは判断待ちです。
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件=バンクの知識問題数と一致)。
出題レシピはハードコードせず外部JSONに切り出し、モジュール読み込み時にスロット数と上限を自己検証して不整合なら即座に停止する作りです。空間把握は1セッションあたり最大1問に機械制約されています(図形問題ばかりになるのを防ぐため)。重複回避は1セッション内で効きますが、セッションをまたいだ出題多様性の保証はありません(複数回受けると同じ10問が再び出る可能性)。
SCOAの解説図は段階的に完成していくアニメーションで、SVG内に CSS を埋め込む必要があります。既存の共通サニタイザは <style> を無条件でブロックするため描画できず、専用サニタイザを新設しています。
| 項目 | 共通(SPI等) | SCOA専用 |
|---|---|---|
<style> | 完全ブロック | 2種類の固定パターンに正規表現で全文一致する場合のみ許可(フェード演出/線分図の描画アニメ)。任意CSSは一切通さない |
| インラインstyle | 不許可 | animation-delay:数値ms と --len:数値px の2パターンのみ |
| 実体参照攻撃 | 対策なし | 数値参照+既知の名前付き参照16種を1回デコードしてから危険パターンを検査。未知の参照が残れば安全側で拒否 |
| ルート制約 | チェックなし | 兄弟svg・ネストsvgを拒否 |
課題リリース前監査で、名前付き実体参照の一部が未対応との指摘が出ています(§8-1)。
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監査)に切り替えています。人間講師の盲検監査は投入後の後追いとする方針です。
fact外部監査2社を通し、片方は「現状のまま一般公開は不可」(条件付きGO)。公開前必須のHigh4件:
( 等が未デコードで url( 相当をすり抜ける)。現バンクは自社の決定論生成なので該当入力は無く、実害は「悪性SVGが混入した場合」に限定fact全問の由来情報に 「SPI生成器流用。SCOA-A実物の形式適合は未担保」「3ソース突合前」 と自分で記録されています。誠実な記録であると同時に、SCOAラインの最大の課題です。「SCOA対策」として売るには、実物の出題形式との一致度を裏づける必要があります。
factSCOA-Aは5尺度ですが、カードが存在するのは数理・論理・常識の3尺度のみ。言語・英語のカードは0枚で、体験模試にも含まれていません。方針として「キュレーション体制/根拠付きAI補助体制が整うまでカードを作らない」と明記されています。
factIDは scoa-a-{尺度}-batch-NN-NNN の形式で、バッチ内の連番です。現時点で重複はありませんが、SPIラインで実際に起きた「再生成すると同じIDが別問題を指す」問題と同じ構造です。SPI側では恒久ID(UUIDv7)と系譜台帳を導入して解決しました。
fact問題バンクの正本はR2上の版付きリリースですが、名前空間は現在 spi のみで、SCOAは1問も載っていません。品質ゲート(正答位置の一様性・重複遮断・ID一意性)も適用されていません。※SCOAは独自のL1/L3検品を通しているため品質は保たれていますが、共通基盤の検査は受けていない状態です。
exam_family=scoa として正本リリースへ収載する。ただしハッシュ定義に図を含める修正が前提(含めないと展開図・投影図が重複判定で弾かれる)。unknown形式規約として「5肢択一」を確定していますが、各生成器の実装が4〜5肢で混在している可能性が指摘されており、全カードの実装確認は行われていません。現バンク145問は全問5択であることを実測確認済みなので、少なくとも出荷済みの問題に不整合はありません。
fact承認済み13カードのうち、単元マスタへ対応付けできたのは7カードのみ。残る6カードは理由つきで未対応と正直に記録されています(四則計算=SCOA固有領域/生物=粒度不一致/政治・時事=該当taxonomy未構築/展開図2種=単元マスタに未収載)。
unknownなお単元マトリクス側は最新のSCOA整備を反映する前のスナップショットのままで(再ビルド未実行)、SCOA列は全行が未充填です。
fact時事は10問のみで、量産時に12問を要求して2件が在庫切れになりました。全問が2026年7月時点の内容で、鮮度失効の自動化は未実装(人手のレビュー依存)。生成器のモデル指定にも記録の食い違いがあり、どのモデルで生成されたかが確定できません。
fact重複回避は1セッション内のみ。複数回受験したときに同じ10問セットが再出現する確率的な可能性への対策はありません(実測はしていないため影響度は unknown)。バンクが145問で体験が10問なので、繰り返すほど既視感が出ます。
fact体験模試の受験記録はGA4のクライアントイベントのみで、サーバ側の受験ログには残りません。イベントの分類語彙に scoa が無く、送るとAPIがエラーになる系統のため、v1では記録機構を見送っています。
factSCOAの検品には正答位置の検査が一切ありません。answer_position/正答位置/一様 で量産CLI・golden・lint を全数grepしてヒットゼロでした。L1構造検品が見ているのは選択肢の重複・正答と選択肢の整合・解説の段数・誤答タグの有無、L3機械lintが見ているのは解説様式のマーカー・定型文汚染・汎用的すぎる文言です。
factそして共通側のゲートも効きません。リリースビルドの正答位置検査は1トピック20問未満をスキップする設定で、SCOAは全カードが12〜51問のため小さいものが素通りします。二重に無検査の状態です。
実測値:
| 問題型 | 問題数 | 最大シェア | 共通ゲート |
|---|---|---|---|
| 常識・時事 | 10 | 60% | 🔴 20問未満のため素通り |
| 常識・自然科学 | 12 | 42% | 🔴 素通り |
| 割合・損益 | 12 | 42% | 🔴 素通り |
参考までに、SPI正本7,537問では同じ検査で偏りゼロ、公務員2,377問では英文46%・生物41%・現代文40%が捕捉される一方、時事の各トピック(1〜2問ずつ・すべて100%)が同じ理由で素通りしていました。
factSCOAの常識カード(G8 政治/G9 生物/G11 時事)は、独自に問題を作っているのではなく知識バンク・時事バンクから抽出しています。そのバンクを作る生成器を調べたところ、正答位置のシャッフルが主経路に入っていませんでした。
| 生成器 | シャッフル | 実態 |
|---|---|---|
文章理解 reading/generator.py | ✅ 2026-07-23 追加 | 問題IDをシードにした決定論シャッフル |
知識 knowledge_generator.py | ⚠️ 複製時のみ | 主経路は生成AIが返した answer をそのまま採用 |
時事 current_affairs_generator.py | ⚠️ 同上 | 同上 |
推論・図形 e3/ ほか | ❌ 無し | — |
生成AIは正解を先頭に置く傾向があるため、主経路でシャッフルしないと偏ります。SPIの文章理解で本日是正したのと同じ機序です。
2026-07-23 に SPI ラインで外販対応を行いました。そこで確立した型と、踏んだ落とし穴を引き継ぎます。SCOAで作り直す必要はありません。
SPIで作った系譜台帳の内容ハッシュは、現在本文/問題文/選択肢/正答/解説の5要素で計算しており、図を含んでいません。SPI正本には図フィールドが存在しないため実害ゼロでしたが、SCOAで確実に破綻します。
対応:spi_bank_build/lineage/core.py のハッシュ入力へ figures を追加し、重複判定キーにも含める。正規化は「SVG文字列そのもの」ではなく、描画に影響しない差分(空白・属性順・id採番)を除去した正規形とすること。整形の揺れで版が切られると改訂履歴がノイズで埋まります。
問題文の冒頭60字一致を、重複の出荷停止条件にしてはいけません。SPI正本7,537問で500件が該当し、うち推論476件は数値だけ違う正常なパラメトリック問題でした。停止条件にすると健全な問題を大量に弾きます。
出荷停止にしてよいのは 「NFKC正規化した 本文+問題文+選択肢(順序込み)+図 の完全一致」だけ。冒頭60字一致は警報(レポート出力)に留めてください。
| 資産 | 場所と用途 |
|---|---|
| 系譜台帳 | 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と出所を記録したマニフェスト付き |
spi_bank_build/* は除外対象で、上書きすると前の版が復元不能です(本日、正答位置の是正で是正前の版を1つ失いました)。バンクを書き換える前に必ずスナップショットを取ってください。本仕様書が定義するAPI・バンクに共通する契約です。「選択肢を何番目として数えるか」「正答値の基準」「送信する回答値の意味」「宣言の在り処」を、実装側の解釈違いを防ぐために明文化します(2026-07-31 確定・ANSWER_BASE_MIGRATION_PLAN_20260730.md §10-8)。
| ID | 項目 | 定義 |
|---|---|---|
| DC-1 | 選択肢の数え方 | 選択肢配列は先頭を0とする配列添字で数えます。choices[0] が1番目の選択肢です。画面表示の「選択肢1」は添字0の投影(表示専用の変換)です。 |
| DC-2 | 正答の基準 | バンク内部の answer は1基準へ切替済みです(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/適性)すべてに同一内容で追記しています。