[{"data":1,"prerenderedAt":494},["ShallowReactive",2],{"content-/investment-quiz-part2-implementation":3,"all-pages-for-dir":492,"og-image-/investment-quiz-part2-implementation":493},{"id":4,"title":5,"body":6,"category":474,"description":475,"extension":476,"meta":477,"navigation":439,"ogImage":478,"path":479,"project_name":480,"published":481,"publishedAt":482,"seo":483,"stem":484,"tags":485,"todo":478,"unpublished":481,"updatedAt":478,"__hash__":491},"pages/2026-05/2026-05-14/investment-quiz-part2-implementation.md","米国式投資クイズPart 2を1日で実装した記録 — 書籍本文ベースに方針転換し、サブエージェント3並列で74問を起こす",{"type":7,"value":8,"toc":462},"minimark",[9,14,18,21,26,29,48,51,54,57,60,72,76,79,82,86,89,100,103,106,110,113,190,208,211,314,317,321,328,331,334,365,368,372,375,386,389,392,419,422,425,428,458],[10,11,13],"h1",{"id":12},"投資判断クイズ-part-2-を本ベースで起こした日","投資判断クイズ Part 2 を本ベースで起こした日",[15,16,17],"p",{},"朝、起きてすぐPart 2の続きをやろうとして、計画書を探した。前回の Part 1 を作ったときの HTML プロトタイプだけが残っていて、計画書のマークダウンが見当たらない。先に HTML を読み返して論点を抽出し直すところから始まった。",[15,19,20],{},"題材は広瀬隆雄『Market Hack流 世界一わかりやすい米国式投資の技法』（東洋経済新報社, 2014）。Part 1 で骨組みは作ってあるので、Part 2 では章単位で深掘りしていきたい。",[22,23,25],"h2",{"id":24},"計画書の復元と-codex-レビュー2回","計画書の復元と Codex レビュー2回",[15,27,28],{},"HTMLから論点を拾い直して、Part 2 派遣指示書 v1 を書いた。Codexに投げると、致命的指摘が4件＋補足1件で返ってきた。",[30,31,32,36,39,42,45],"ul",{},[33,34,35],"li",{},"章立てが Part 1 と重複している箇所がある",[33,37,38],{},"クイズ難易度の目安が示されていない",[33,40,41],{},"SVG図解の挿入タイミングが不明瞭",[33,43,44],{},"レジストリへの登録手順が曖昧",[33,46,47],{},"（補足）型定義の拡張が必要かもしれない",[15,49,50],{},"4件を反映してv1.1 → 再度Codexに投げる → 残った4件を反映してv1.2で確定した。1往復目で書き漏れが見えて、2往復目で構造の歪みが見えた。",[22,52,53],{"id":53},"方針のズレに気づいて転換した",[15,55,56],{},"v1.2 を見直していて、自分でもまだしっくり来ない違和感があった。指示書の本文を読むと「論点チェックリストから独自に起草する」と書いてある。",[15,58,59],{},"これは、自分が本来やりたかったことと違う。広瀬さんの本をオリジナルコンテンツに変換していくのが目的なのに、「論点だけ拾って独自起草」だと本のエッセンスが薄まる。本ベースに揃え直さないと、ただの一般的な投資クイズになってしまう。",[15,61,62,63,67,68,71],{},"指示書を書き直し、「Turso DB から書籍を chunk 単位で読み込み、本文に明示された重要ポイントだけをクイズ化する」方針に変えた。書籍は ",[64,65,66],"code",{},"book-knowledge-base"," に ",[64,69,70],{},"markethack-us-investing"," という ID で格納済みだったので、そこから取りに行く。",[22,73,75],{"id":74},"chapter-1-sec-1-をパイロットで試作","chapter 1 sec-1 をパイロットで試作",[15,77,78],{},"いきなり全章には手を出さず、chapter 1 の sec-1（POINT 1-1〜1-7、約5,500字）でパイロットを作った。chunkを読み込み、本文から POINT として明示されている主張を順番に拾って、4択クイズに変換していく。",[15,80,81],{},"7ポイントから5問のクイズが出来上がり、誤答選択肢も本文の文脈に沿った形で作れた。「これなら本のエッセンスがそのまま残る」と確信が持てたので、残りの章に展開する判断をした。",[22,83,85],{"id":84},"残り17-sec-をサブエージェント3並列で起こす","残り17 sec をサブエージェント3並列で起こす",[15,87,88],{},"パイロットで型ができたので、残り17 sec を一気にやる。1個ずつ順番にやると半日溶けるので、サブエージェントを3並列で立ち上げて分担させた。",[30,90,91,94,97],{},[33,92,93],{},"エージェントA: chapter 1 の残り sec",[33,95,96],{},"エージェントB: chapter 2 の sec 群",[33,98,99],{},"エージェントC: chapter 3 以降の sec 群",[15,101,102],{},"各エージェントには「指示書 v1.2 と書籍 ID を渡し、chunk 単位で読み込み、POINT 単位で4択クイズを起こす」と指示した。完成したクイズの素案 TS ファイルを3並列でドンドン書き出してくる。",[15,104,105],{},"合計18 sec / 74問のクイズ素案が、コーヒー1杯分の時間で揃った。",[22,107,109],{"id":108},"vue実装フェーズ-3択から4択への型拡張","Vue実装フェーズ — 3択から4択への型拡張",[15,111,112],{},"素案が揃ったら、次は表示側。既存の QuizCard コンポーネントは3択前提で組まれていた。Choice 型を 'A' | 'B' | 'C' から 'A' | 'B' | 'C' | 'D' に拡張する。",[114,115,120],"pre",{"className":116,"code":117,"language":118,"meta":119,"style":119},"language-typescript shiki shiki-themes vitesse-light vitesse-light","// types/quiz.ts\nexport type Choice = 'A' | 'B' | 'C' | 'D'\n","typescript","",[64,121,122,131],{"__ignoreMap":119},[123,124,127],"span",{"class":125,"line":126},"line",1,[123,128,130],{"class":129},"sxvE3","// types/quiz.ts\n",[123,132,134,138,142,146,150,154,158,161,164,166,169,171,173,175,178,180,182,184,187],{"class":125,"line":133},2,[123,135,137],{"class":136},"sHkkW","export",[123,139,141],{"class":140},"stQ0i"," type",[123,143,145],{"class":144},"sSkh3"," Choice",[123,147,149],{"class":148},"shFtX"," =",[123,151,153],{"class":152},"sMJiu"," '",[123,155,157],{"class":156},"sdGka","A",[123,159,160],{"class":152},"'",[123,162,163],{"class":148}," |",[123,165,153],{"class":152},[123,167,168],{"class":156},"B",[123,170,160],{"class":152},[123,172,163],{"class":148},[123,174,153],{"class":152},[123,176,177],{"class":156},"C",[123,179,160],{"class":152},[123,181,163],{"class":148},[123,183,153],{"class":152},[123,185,186],{"class":156},"D",[123,188,189],{"class":152},"'\n",[15,191,192,193,196,197,196,200,203,204,207],{},"これだけで型エラーがコード全体に波及した。",[64,194,195],{},"wrong-A",", ",[64,198,199],{},"wrong-B",[64,201,202],{},"wrong-C"," の3パターンしか想定していなかった解説キーに、",[64,205,206],{},"wrong-D"," を足す必要が出てきた。",[15,209,210],{},"QuizCard の選択肢グリッドは3列固定だったので、3択時のみ横並び、4択時は2x2グリッドに切り替わるように直した。",[114,212,216],{"className":213,"code":214,"language":215,"meta":119,"style":119},"language-vue shiki shiki-themes vitesse-light vitesse-light","\u003Cdiv\n  :class=\"[\n    'choices',\n    choices.length === 3 ? 'choices--inline-3' : 'choices--grid-2x2'\n  ]\"\n>\n","vue",[64,217,218,226,244,258,299,308],{"__ignoreMap":119},[123,219,220,223],{"class":125,"line":126},[123,221,222],{"class":148},"\u003C",[123,224,225],{"class":136},"div\n",[123,227,228,231,235,238,241],{"class":125,"line":133},[123,229,230],{"class":148},"  :",[123,232,234],{"class":233},"senZ8","class",[123,236,237],{"class":148},"=",[123,239,240],{"class":148},"\"",[123,242,243],{"class":148},"[\n",[123,245,247,250,253,255],{"class":125,"line":246},3,[123,248,249],{"class":152},"    '",[123,251,252],{"class":156},"choices",[123,254,160],{"class":152},[123,256,257],{"class":148},",\n",[123,259,261,265,268,272,275,279,282,284,287,289,292,294,297],{"class":125,"line":260},4,[123,262,264],{"class":263},"s4oTP","    choices",[123,266,267],{"class":148},".",[123,269,271],{"class":270},"sz8Xr","length",[123,273,274],{"class":140}," ===",[123,276,278],{"class":277},"sM54T"," 3",[123,280,281],{"class":140}," ?",[123,283,153],{"class":152},[123,285,286],{"class":156},"choices--inline-3",[123,288,160],{"class":152},[123,290,291],{"class":140}," :",[123,293,153],{"class":152},[123,295,296],{"class":156},"choices--grid-2x2",[123,298,189],{"class":152},[123,300,302,305],{"class":125,"line":301},5,[123,303,304],{"class":148},"  ]",[123,306,307],{"class":148},"\"\n",[123,309,311],{"class":125,"line":310},6,[123,312,313],{"class":148},">\n",[15,315,316],{},"quizTopics.ts に investment セクションを追加し、Part 2 の18 sec をまとめて登録する。",[22,318,320],{"id":319},"quizregistryts-の自動生成","quizRegistry.ts の自動生成",[15,322,323,324,327],{},"74問のレジストリエントリを手で書くと事故る。Python スクリプトを書いて、各クイズ TS ファイルからメタデータを抜き出し、",[64,325,326],{},"quizRegistry.ts"," の挿入位置に追記する処理に置き換えた。スクリプトを走らせると、74件のエントリが綺麗に並んだ。",[22,329,330],{"id":330},"型エラー9件を系統的に潰す",[15,332,333],{},"3並列サブエージェントの成果物には、軽い差分が含まれていた。型チェックを走らせると9件のエラー。系統別に分けて潰した。",[30,335,336,347,355],{},[33,337,338,339,342,343,346],{},"Choice拡張の波及（3件）: ",[64,340,341],{},"'A' | 'B' | 'C'"," のままになっている箇所を ",[64,344,345],{},"Choice"," 型参照に置換",[33,348,349,351,352,354],{},[64,350,206],{}," 解説キー漏れ（4件）: 4択化したが ",[64,353,206],{}," を埋めていない問題",[33,356,357,360,361,364],{},[64,358,359],{},"quizRegistry"," の ",[64,362,363],{},"\"complex\""," 表記揺れ（2件）: 一部エージェントが旧表記で生成していた",[15,366,367],{},"エラーを系統別に分類してから直すと、9件が3パスで片付いた。1件ずつ潰すより断然速い。",[22,369,371],{"id":370},"svg図解18枚を3並列で追加","SVG図解18枚を3並列で追加",[15,373,374],{},"最後にSVG図解。各 sec ごとに「最重要1図」を入れる方針で、18 sec × 1図 = 18枚。これもサブエージェント3並列に投げた。",[30,376,377,380,383],{},[33,378,379],{},"エージェントA: sec 1〜6",[33,381,382],{},"エージェントB: sec 7〜12",[33,384,385],{},"エージェントC: sec 13〜18",[15,387,388],{},"各エージェントにSVG作成ガイドラインを渡しておくと、トーンが揃った18枚が出来上がってきた。",[22,390,391],{"id":391},"学びメモ",[30,393,394,401,407,413],{},[33,395,396,400],{},[397,398,399],"strong",{},"指示書の方針が固まっていないと、Codex に2往復させても根本のズレは消えない","。今回も書籍本ベースに切り替えた瞬間に違和感が消えた。Codexは構造のチェックには強いが、「そもそも何をやりたいんだっけ」のズレは人間が拾うしかない。",[33,402,403,406],{},[397,404,405],{},"3並列サブエージェントは「型ができた後の量産フェーズ」で最も効く","。パイロットを1つ作って型を固めてから並列に投げると、揺らぎが最小化される。型ができる前に並列に走らせると、3エージェントが3方向に散らばって後の統合コストが膨らむ。",[33,408,409,412],{},[397,410,411],{},"型拡張は中央で1箇所変えてから周辺を直す方が早い","。Choice 型に 'D' を足してから波及エラーを潰したら、見落としが減って9件が3パスで片付いた。",[33,414,415,418],{},[397,416,417],{},"書籍本文を題材にすると、誤答選択肢の質が一段上がる","。「本文の別の章で出てくる似た概念」を誤答に持ってくると、知識の混同を狙えるクイズになる。独自起草だと、ここの誤答が薄くなりがちだった。",[22,420,421],{"id":421},"振り返り",[15,423,424],{},"Part 1 では HTML プロトタイプで「動くか」を確認した。Part 2 では計画書を Codex で2往復させ、方針転換を1回挟み、Vue 実装まで一気通貫で書いた。「本のエッセンスをクイズに翻訳する」軸が定まった瞬間に、74問が淀みなく流れた。",[15,426,427],{},"明日以降の作業として残った項目は以下の通り。",[30,429,432,442,452],{"className":430},[431],"contains-task-list",[33,433,436,441],{"className":434},[435],"task-list-item",[437,438],"input",{"disabled":439,"type":440},true,"checkbox"," 各 sec の Part 1 と Part 2 のリンク導線を整える（現状はトップから個別アクセスのみ）",[33,443,445,447,448,451],{"className":444},[435],[437,446],{"disabled":439,"type":440}," 4択クイズが追加されたことを既存ユーザーに知らせる導線を ",[64,449,450],{},"/quiz"," トップに足す",[33,453,455,457],{"className":454},[435],[437,456],{"disabled":439,"type":440}," SVG図解18枚のうち、文字が潰れている2枚（sec-9, sec-14）を作り直す",[459,460,461],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .sSkh3, html code.shiki .sSkh3{--shiki-default:#2E8F82;--shiki-dark:#2E8F82}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}",{"title":119,"searchDepth":133,"depth":133,"links":463},[464,465,466,467,468,469,470,471,472,473],{"id":24,"depth":133,"text":25},{"id":53,"depth":133,"text":53},{"id":74,"depth":133,"text":75},{"id":84,"depth":133,"text":85},{"id":108,"depth":133,"text":109},{"id":319,"depth":133,"text":320},{"id":330,"depth":133,"text":330},{"id":370,"depth":133,"text":371},{"id":391,"depth":133,"text":391},{"id":421,"depth":133,"text":421},"dev","広瀬隆雄『Market Hack流 世界一わかりやすい米国式投資の技法』を題材に、Codexレビュー2回・方針転換1回・サブエージェント3並列で74問のクイズと18枚のSVG図解を実装した1日の記録。","md",{},null,"/investment-quiz-part2-implementation","eurekapu-nuxt4",false,"2026-05-14T00:00:00.000Z",{"title":5,"description":475},"2026-05/2026-05-14/investment-quiz-part2-implementation",[486,487,488,66,215,489,490],"quiz","codex-review","subagent-parallel","svg","investment","ct-We9ixWUaJQJ9FI3NNt1wzuFl_dJFmbsQ97EJuT6A",[],"https://log.eurekapu.com/og/blog/investment-quiz-part2-implementation.png?v=2026-05-14T00%3A00%3A00.000Z&title=%E7%B1%B3%E5%9B%BD%E5%BC%8F%E6%8A%95%E8%B3%87%E3%82%AF%E3%82%A4%E3%82%BAPart%202%E3%82%921%E6%97%A5%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2%20%E2%80%94%20%E6%9B%B8%E7%B1%8D%E6%9C%AC%E6%96%87%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E6%96%B9%E9%87%9D%E8%BB%A2%E6%8F%9B%E3%81%97%E3%80%81%E3%82%B5%E3%83%96%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%883%E4%B8%A6%E5%88%97%E3%81%A774%E5%95%8F%E3%82%92%E8%B5%B7%E3%81%93%E3%81%99&author=Kei%20Komatsu&sig=5b1e6ddfb1a0eeb4",1782528836577]