gogen-eitango Phase 4: D1本番適用と章末ミニテストの4択化 — Fable 5のrate limitをCodex引き継ぎで乗り切った日

開発eurekapu-nuxt4

gogen-eitango Phase 4: D1本番適用と章末ミニテストの4択化 — Fable 5のrate limitをCodex引き継ぎで乗り切った日

英語語源学習アプリ(gogen-eitango)の Phase 4 を一日かけて進めた。朝の積み残し確認から始めて、D1 マイグレーションの本番適用、英語コンテンツ全8バッチの生成、章末ミニテストの4択化、本番公開まで走った。途中で Fable 5 が rate limit に到達して、画面に「You've reached your Fable 5 limit」が9連発で並んだが、Codex への引き継ぎで乗り切った。

朝: 積み残し確認から D1 マイグレーション0007の本番適用へ

朝イチで「昨日途中でやってたやつの進捗を確認して」と投げた。memo・git履歴・untracked の dev/ ディレクトリを漁らせて、積み残しの筆頭が D1 マイグレーション0007 の本番適用(自分の確認待ち)だと確定。

Windows を再起動する予定があったので、確認結果は memo/2026-07-16/gogen-progress-check.md に残させ、昨日の計画書の進捗欄も実態に合わせて更新させた。次のセッションで「積み残し何ですか」と聞けば同じ答えに辿り着ける状態にしておく。

再起動後のセッションで改めて積み残しを聞くと、答えは朝と同じだった。要対応が2件と判断待ちが2件。0007 の本番適用を承認して実行してもらい、あわせて Phase 4(アトラス3859号)の英語コンテンツ生成を「計画ドキュメントを確認しながら」進めるよう指示した。

Phase 4A: パイロットで方針を固めてから量産へ

コンテンツ生成は、いきなり全量を回さずパイロットから入らせた。形式ゲートの17テストが green になったのを確認してから、スキーマ拡張・バッチ入出力スクリプト・エージェント用プロンプトテンプレートを整備。

パイロットの段階で判断材料がひとつ出てきた。root_id が NULL の語に付いている「語源形式」メモ1,518語は、大半が -tion/-ly/-al などの接辞(文法マーカー)で、絵にできる「動きを持つ語根」(leg/lect=読む・選ぶ、nat=生まれる等)は少数だという。これで 4b の方針を確定できた。

  • 語根モチーフを付けるのは root_id 付きの214語だけ
  • 残り3,645語はモチーフなしテンプレで、visual_spec は例文の意味だけから構図を作る
  • 画風のロックは全画像共通なので、見た目の統一感は保たれる

検収の往復: 直すべきはデータか、レビュアーか

生成と並行してレビューも別エージェントに回した。review-002 は clean 30 / suspect 2。目視検収では、見出し語自身が murder の例文がゲートの見出し語除外で設計どおり通過していること、content(形容詞・満足して)や range のような多義語の語義選択が正しいことも確認できた。

suspect の扱いは二手に分かれた。

  • spy・spatial・spur の3語は原本照合で OCR 誤り(原本は小文字)と確定 → 確立済みの corrections.json 経路で修正
  • measure・range など4語の「語義は名詞・メモは動詞」という指摘は、照合したら4件とも原本どおり → 直すべきはレビュアーの指示書の方だった

原本の「動詞は目的語・前置詞も記憶」というパターンをレビュアー指示書と生成プロンプトの両方に反映して、以降の誤検知を潰した。stuff の例文修正、range の再修正例文(気温の変動幅)の投入まで済ませて、パイロットの詳細メモは memo/2026-07-16/ に残させた。

波状の並列生成

そこから波状に並列を組ませた。第1波(4バッチ・144語)の意味検証×4体と、第2波の生成×4体の計8体を並列起動。第1波の検証は suspect ほぼゼロで流れ、続けて第2波の検証4体と第3波の生成4体を起動した。

生成済み・形式ゲート通過が359語(approved 72+検証済み clean 142+検証中145)まで積み上がったところで、画面が止まった。

Fable 5 が rate limit に到達 → 全8バッチは書き終わっていた

「You've reached your Fable 5 limit」。何を打っても同じ一行が返ってくる。9回続けて同じ表示を見たところで、週間制限に引っかかったと理解した。

「途中までだけど、どこまでいってるか引き継ぎをドキュメント化して」と(モデルを切り替えて)指示したら、意外な報告が返ってきた。全8バッチとも実際には書き終わっていて、API エラーは書き込み後の最終応答時に出ただけだった。落ちた時点の見た目は「途中で全滅」でも、DB の実物を確認したら全部揃っていた。

そのまま全て取り込ませ、suspect 1件だけ対処した。violent — 語義は「激しい・猛烈な」で例文としては正しくても、画像化すると暴力と子どもの組み合わせになる。レビュアーの指摘どおりなので、中立な題材に差し替えた。

続きは Codex(GPT-5.6-sol)に投げることにした。最新の DB 状態を確認させたうえで引き継ぎプロンプトを書かせ、ファイルに保存して codex exec -m gpt-5.6-sol "$(cat prompt.txt)" で渡す形にした。

Codex に計画書と実装の突き合わせレビューをさせた

午後、全体計画書と進捗メモのパスを渡して、実装の実態との突き合わせレビューを Codex にやらせた。結論はこうだった。

  • Phase 3b までは完了
  • Phase 4a は生成は完走したが、検収と公開反映が未了で進行中
  • 4b / 4c / 4d は未着手
  • DB と公開 JSON が非同期、計画書・進捗メモの進捗欄が失効している

ただし最大の指摘だった「DB→公開JSON の未反映」は、再確認したら別セッションの再エクスポートですでに解消済みだった。レビュー時点と現在地のずれも含めて、memo/2026-07-16/gogen-plan-review-and-status.md に現在地スナップショットと明日の再開タスクをまとめさせた。明日はこのドキュメントだけ見れば再開できる。

章末コーナーのレイアウト崩れ: 箇条書きが段落に溶けていた

port の章末ページを開いたら、「使い分けラボ」「混同注意」で箇条書きのつもりの行が1つの段落に溶けて文字の壁になっていた。スクショを貼って「箇条書きすべきところは箇条書きに、あるいは段落を分けて」と指示。あわせて、ミニテストはテスト形式と履歴保持を保って、アプリケーションとして成立させることも条件に入れた。

原因はデータ側の形式ゆれ(行頭マーカー ● の有無)を HTML 生成スクリプトが吸収できていなかったこと。export-content-json.ts の組み立てをミニテスト分岐に対応させて、1項目ずつの箇条書きに直させた。ブラウザ実描画で13チェック PASS まで確認させている。

この時点でミニテストは「答えを隠した自己採点式カード」になり、章末クイズと同じ学習履歴に記録されるようになった。

ミニテストの4択化: 正解・不正解ボタンを押させない

直したミニテストを vert-vers のページで見て、イメージと違うと気づいた。「convert A ___ B」の空欄に何が入るかを答える問題なのに、答えを見てから「正解できた・間違えた」のボタンをいちいち押す形式になっている。押すたびに、これは自己申告であってテストではないという感覚が積もる。「4択にして選ばせるようにして」と方向転換した。

全18章×5問=90問を、章ごとに作問→独立レビューのワークフロー(Sonnet 36エージェント)で4択選択式に変換させた。仕上がりはこうなった。

  • 選択肢をクリックすると即時に○×が判定される
  • 自己申告ボタンなしで、そのまま学習履歴に記録される
  • vert-vers の「convert A ___ B」は for/into/by/with の4択で、正解 into が判定される

再走の待ち時間に4択レンダリングを実装させておき、デスクトップとモバイルの両方を実画面で目視した。

テストは2,720件パス・失敗0。ファイル単位で9件 failed に見えたが、負荷起因のタイムアウトで、単独実行では全部パスすることを確認した。

本番オープン化とセキュリティレビュー

ここまで gogen-eitango は localhost:3200 でしか見られない状態だったので、本番環境にオープンにする設定変更を指示した。あわせてミニテスト機能の変更にセキュリティレビューをかけて、データフローを追跡してもらった。指摘は「draft 解除が意図的か」の確認だけ — 自分が公開を指示した変更そのものなので、対応不要と判断した。

ビルド&デプロイは6.4分で完走し、draft 露出ガードも OK。本番 URL で表示・音声・教材 JSON まで実地検証して締めた。

学習ゲートは LEARN_SKIP でパス

コミット時に学習ゲートがブロックして /learn のクイズが立ち上がったが、朝から走り続けた頭にはもう解く気力が残っていなかった。「疲れたのでパスさせてください」と伝えて、LEARN_SKIP で理由を残して通した(コミット 4c02fbfb・88ファイル)。回避ではなくログに残るスキップなので、後ろめたさはない。

明日の再開ポイント

再開の起点は memo/2026-07-16/gogen-plan-review-and-status.md。今セッションの進捗も反映済みなので、このドキュメントだけ開けば続きに入れる。

  • Phase 4a の残り: 生成済みバッチの検収と公開反映を最後まで通す(Codex に委任した継続分の結果確認から)
  • 検証中だった145語の判定を DB に反映する
  • Phase 4b(visual_spec からの画像生成。語根モチーフは root_id 付き214語のみ)に着手する
  • 4択ミニテストの本番での学習履歴の記録を、実際に数問解いて確かめる

学びメモ

  • rate limit で「途切れた」は「失われた」ではない。全8バッチは書き込み済みで、エラーは最終応答時に出ただけだった。落ちた直後は DB の実物を確認してから引き継ぎ内容を決める
  • レビュアーの suspect は原本照合してから直す。4件とも原本どおりで、直すべきはレビュアーの指示書の方だった。誤検知は指示書に1行足せば以降の全バッチに効く
  • モデルの週間制限は、経過ドキュメントと引き継ぎプロンプトを1枚書けば別モデル(Codex)にそのまま渡せる。都度 memo に経過を残す習慣が引き継ぎコストを数分に縮める
  • 箇条書きが段落に溶ける類のレイアウト崩れは、データ側の形式ゆれ(行頭マーカーの有無)が原因のことがある。表示側ではなく HTML 生成側の分岐で吸収する
  • クイズ UI は「答え合わせボタンを押させる」より「選択肢を選ばせて即時判定」。操作が1タップ減るだけで、単語帳の付録が学習アプリとして成立する
  • テストのファイル単位 failed は、まず負荷起因のタイムアウトを疑って単独実行で切り分ける。2,720件パス・失敗0なら中身は壊れていない
  • 朝イチの「積み残し何ですか」が機能するのは、前日の終わりと当日の朝に memo を残しているから。セッションもモデルも跨げる復元ポイントになる