[{"data":1,"prerenderedAt":908},["ShallowReactive",2],{"content-/vue-migration-marathon-3kyu-notes":3,"all-pages-for-dir":906,"og-image-/vue-migration-marathon-3kyu-notes":907},{"id":4,"title":5,"body":6,"category":888,"description":889,"extension":890,"meta":891,"navigation":255,"ogImage":892,"path":893,"project_name":894,"published":895,"publishedAt":896,"seo":897,"stem":898,"tags":899,"todo":892,"unpublished":895,"updatedAt":892,"__hash__":905},"pages/2026-05/2026-05-02/vue-migration-marathon-3kyu-notes.md","簿記3級ノート24章をVueに移植：24並列サブエージェントで一日で仕上げたマラソンの記録",{"type":7,"value":8,"toc":878},"minimark",[9,26,31,38,41,57,64,74,91,95,114,385,388,392,395,421,436,440,451,471,488,492,495,515,521,527,533,536,540,547,550,567,570,774,779,782,789,795,811,826,829,874],[10,11,12,13,17,18,21,22,25],"p",{},"簿記3級ノート全26章のうち24章を、純HTMLからeurekapu-nuxt4のVueコンポーネントに一日で移植した。朝に6章を6並列で起動し、昼に9章を9並列で追加、夕方に9章を9並列で仕上げた。途中で ",[14,15,16],"code",{},"calcNetIncome"," の重複宣言バグを掘り当て、JournalExample.vue の貸方合計に当期純利益が乗っていない致命バグを潰し、Write権限拒否で止まったサブエージェントを手動で救済し、別セッションでブランチを取り違えて ",[14,19,20],{},"reset --soft"," で巻き戻し、最後にE2Eのフレーキーを ",[14,23,24],{},"expect.toPass"," で恒久対策した。",[27,28,30],"h2",{"id":29},"やったこと時系列","やったこと（時系列）",[10,32,33,34,37],{},"純HTMLで書いていた簿記3級ノートをVueコンポーネント化する作業は、前日までで2章だけ手作業で済ませていた。残り24章を一日で仕上げるには並列化しかない。",[14,35,36],{},"memo/2026-05-02/"," に章ごとの移植仕様メモを置き、サブエージェントに食わせる前提で章リストを優先度A・B・Cに分けた。",[10,39,40],{},"朝のうちに優先度A（6章）を6並列で起動した。",[42,43,44,48,51,54],"ul",{},[45,46,47],"li",{},"merchandise（商品売買）",[45,49,50],{},"notes（手形・電子記録債権）",[45,52,53],{},"fixed-assets（固定資産）",[45,55,56],{},"closing-adjustments-1〜3（決算整理仕訳の3章）",[10,58,59,60,63],{},"並列起動から30分ほどで6章すべてのVue化が返ってきた。コミット前の ",[14,61,62],{},"pnpm test"," でいきなり赤が出る。",[65,66,71],"pre",{"className":67,"code":69,"language":70},[68],"language-text","SyntaxError: Identifier 'calcNetIncome' has already been declared\n","text",[14,72,69],{"__ignoreMap":73},"",[10,75,76,79,80,82,83,86,87,90],{},[14,77,78],{},"useFinancialStatements.ts"," を開くと、",[14,81,16],{}," が同じファイル内で2回 ",[14,84,85],{},"const"," 宣言されていた。前日までの手作業移植で混入した pre-existing バグで、テストが走るのは今回が初めてだったため発覚した。後段のクロージングロジックが同名で再宣言していたので、片方を ",[14,88,89],{},"calcNetIncomeForBS"," に分離して解決。",[27,92,94],{"id":93},"バグ2-負債純資産の合計に当期純利益が乗っていない","バグ2: 「負債純資産の合計に当期純利益が乗っていない」",[10,96,97,98,101,102,105,106,109,110,113],{},"優先度Aの章をブラウザで開いてみたら、貸借対照表の合計が一致しない。負債純資産側に当期純利益が加算されていない。",[14,99,100],{},"JournalExample.vue"," の ",[14,103,104],{},"sectionTotals"," 計算ロジックで、",[14,107,108],{},"liab"," のみを集計していて ",[14,111,112],{},"eq","（純資産）と当期純利益を取りこぼしていた。",[65,115,119],{"className":116,"code":117,"language":118,"meta":73,"style":73},"language-ts shiki shiki-themes vitesse-light vitesse-light","// Before: 当期純利益が消える\nconst liabTotal = computed(() =>\n  rows.value.filter(r => r.section === 'liab').reduce((s, r) => s + r.amount, 0)\n)\n\n// After: liab + eq + 当期純利益\nconst liabEqTotal = computed(() =>\n  rows.value\n    .filter(r => r.section === 'liab' || r.section === 'eq')\n    .reduce((s, r) => s + r.amount, 0) + netIncome.value\n)\n","ts",[14,120,121,130,155,245,250,257,263,279,289,336,380],{"__ignoreMap":73},[122,123,126],"span",{"class":124,"line":125},"line",1,[122,127,129],{"class":128},"sxvE3","// Before: 当期純利益が消える\n",[122,131,133,137,141,145,149,152],{"class":124,"line":132},2,[122,134,136],{"class":135},"stQ0i","const ",[122,138,140],{"class":139},"s4oTP","liabTotal",[122,142,144],{"class":143},"shFtX"," =",[122,146,148],{"class":147},"senZ8"," computed",[122,150,151],{"class":143},"(()",[122,153,154],{"class":143}," =>\n",[122,156,158,161,164,167,169,172,175,178,181,184,186,189,192,196,199,201,204,207,210,213,216,218,221,223,226,229,231,233,236,238,242],{"class":124,"line":157},3,[122,159,160],{"class":139},"  rows",[122,162,163],{"class":143},".",[122,165,166],{"class":139},"value",[122,168,163],{"class":143},[122,170,171],{"class":147},"filter",[122,173,174],{"class":143},"(",[122,176,177],{"class":139},"r",[122,179,180],{"class":143}," =>",[122,182,183],{"class":139}," r",[122,185,163],{"class":143},[122,187,188],{"class":139},"section",[122,190,191],{"class":135}," === ",[122,193,195],{"class":194},"sMJiu","'",[122,197,108],{"class":198},"sdGka",[122,200,195],{"class":194},[122,202,203],{"class":143},").",[122,205,206],{"class":147},"reduce",[122,208,209],{"class":143},"((",[122,211,212],{"class":139},"s",[122,214,215],{"class":143},",",[122,217,183],{"class":139},[122,219,220],{"class":143},")",[122,222,180],{"class":143},[122,224,225],{"class":139}," s",[122,227,228],{"class":135}," + ",[122,230,177],{"class":139},[122,232,163],{"class":143},[122,234,235],{"class":139},"amount",[122,237,215],{"class":143},[122,239,241],{"class":240},"sM54T"," 0",[122,243,244],{"class":143},")\n",[122,246,248],{"class":124,"line":247},4,[122,249,244],{"class":143},[122,251,253],{"class":124,"line":252},5,[122,254,256],{"emptyLinePlaceholder":255},true,"\n",[122,258,260],{"class":124,"line":259},6,[122,261,262],{"class":128},"// After: liab + eq + 当期純利益\n",[122,264,266,268,271,273,275,277],{"class":124,"line":265},7,[122,267,136],{"class":135},[122,269,270],{"class":139},"liabEqTotal",[122,272,144],{"class":143},[122,274,148],{"class":147},[122,276,151],{"class":143},[122,278,154],{"class":143},[122,280,282,284,286],{"class":124,"line":281},8,[122,283,160],{"class":139},[122,285,163],{"class":143},[122,287,288],{"class":139},"value\n",[122,290,292,295,297,299,301,303,305,307,309,311,313,315,317,320,322,324,326,328,330,332,334],{"class":124,"line":291},9,[122,293,294],{"class":143},"    .",[122,296,171],{"class":147},[122,298,174],{"class":143},[122,300,177],{"class":139},[122,302,180],{"class":143},[122,304,183],{"class":139},[122,306,163],{"class":143},[122,308,188],{"class":139},[122,310,191],{"class":135},[122,312,195],{"class":194},[122,314,108],{"class":198},[122,316,195],{"class":194},[122,318,319],{"class":135}," || ",[122,321,177],{"class":139},[122,323,163],{"class":143},[122,325,188],{"class":139},[122,327,191],{"class":135},[122,329,195],{"class":194},[122,331,112],{"class":198},[122,333,195],{"class":194},[122,335,244],{"class":143},[122,337,339,341,343,345,347,349,351,353,355,357,359,361,363,365,367,369,371,373,376,378],{"class":124,"line":338},10,[122,340,294],{"class":143},[122,342,206],{"class":147},[122,344,209],{"class":143},[122,346,212],{"class":139},[122,348,215],{"class":143},[122,350,183],{"class":139},[122,352,220],{"class":143},[122,354,180],{"class":143},[122,356,225],{"class":139},[122,358,228],{"class":135},[122,360,177],{"class":139},[122,362,163],{"class":143},[122,364,235],{"class":139},[122,366,215],{"class":143},[122,368,241],{"class":240},[122,370,220],{"class":143},[122,372,228],{"class":135},[122,374,375],{"class":139},"netIncome",[122,377,163],{"class":143},[122,379,288],{"class":139},[122,381,383],{"class":124,"line":382},11,[122,384,244],{"class":143},[10,386,387],{},"このバグは前日までのHTML版でも同じ式だったが、HTML版は当期純利益を別表示にしていたため気づかなかった。Vue化で残高試算表を統合表示に変えた瞬間に表面化した、典型的な「移植で炙り出される潜在バグ」だ。",[27,389,391],{"id":390},"優先度b9章の9並列移植","優先度B（9章）の9並列移植",[10,393,394],{},"Aが片付いたところで、優先度Bの9章を9並列で起動した。",[42,396,397,400,403,406,409,412,415,418],{},[45,398,399],{},"intro-double-entry（複式簿記入門）",[45,401,402],{},"dividends（配当金）",[45,404,405],{},"depreciation-detailed（減価償却の詳細）",[45,407,408],{},"社会保険関連（給与・法定福利費）",[45,410,411],{},"advanced-topics（応用論点）",[45,413,414],{},"equity（純資産）",[45,416,417],{},"bad-debts-detailed（貸倒引当金の詳細）",[45,419,420],{},"ほか2章",[10,422,423,424,427,428,431,432,435],{},"9個中7個は無事に返ってきたが、",[14,425,426],{},"dividends"," と ",[14,429,430],{},"depreciation-detailed"," の2エージェントが Write 権限拒否で BLOCKED になった。サブエージェントに渡す権限スコープが章ディレクトリ単位で切られており、新規ファイル作成パスが許可リストから外れていたのが原因。リトライしても同じところで止まるので、出力されたコード片を読んで自分で ",[14,433,434],{},"apps/web/app/components/notes/3kyu/dividends/"," 配下に直接書き込んで救済した。",[27,437,439],{"id":438},"ブランチ取り違えreset-soft-で復旧","ブランチ取り違え→reset --soft で復旧",[10,441,442,443,446,447,450],{},"優先度Bを15時頃にコミットしようとしたら、別セッションで開いていた ",[14,444,445],{},"feat/journal-example-fix"," ブランチに自分が立っていた。気づかずに ",[14,448,449],{},"git add ."," まで進めかけて手が止まる。",[65,452,456],{"className":453,"code":454,"language":455,"meta":73,"style":73},"language-bash shiki shiki-themes vitesse-light vitesse-light","git status\n# On branch feat/journal-example-fix  ← 違う！\n","bash",[14,457,458,466],{"__ignoreMap":73},[122,459,460,463],{"class":124,"line":125},[122,461,462],{"class":147},"git",[122,464,465],{"class":198}," status\n",[122,467,468],{"class":124,"line":132},[122,469,470],{"class":128},"# On branch feat/journal-example-fix  ← 違う！\n",[10,472,473,476,477,480,481,483,484,487],{},[14,474,475],{},"git reset --soft HEAD"," でステージを戻し、新ブランチ ",[14,478,479],{},"feat/3kyu-notes-9chapters"," を切ってから再コミット。",[14,482,20],{}," を選んだのは、作業ツリーを保ちつつインデックスだけ巻き戻したかったから。",[14,485,486],{},"--hard"," を打っていたら午前の修正がすべて飛んでいた。",[27,489,491],{"id":490},"優先度c9章の9並列移植とpr-14","優先度C（9章）の9並列移植とPR #14",[10,493,494],{},"夕方に優先度Cの9章を9並列で投入した。",[42,496,497,500,503,506,509,512],{},[45,498,499],{},"trial-balance-detailed（試算表の詳細）",[45,501,502],{},"closing-overview（決算手続きの全体像）",[45,504,505],{},"ledgers（総勘定元帳）",[45,507,508],{},"mock-exam（模擬試験）",[45,510,511],{},"evidence（証憑類）",[45,513,514],{},"ほか4章",[10,516,517,518,520],{},"ここまでで累計24章/26章の移植が完了。",[14,519,62],{}," でテスト700件すべてグリーン。最後に「SVG見切れ」「グリッドテーブル化漏れ」「フォントサイズ不一致」「レスポンシブ対応漏れ」「ARIA属性」「キーボード操作」の6観点をサブエージェントに網羅レビューさせ、検出された不具合を7並列で一気に修正した。",[10,522,523,524,526],{},"PR #14 を ",[14,525,479],{}," から立てて、CIを回す。E2Eで1件だけ赤が出た。",[65,528,531],{"className":529,"code":530,"language":70},[68],"TimeoutError: page.click: Timeout 30000ms exceeded.\n  - waiting for selector \"[data-testid='journal-submit']\"\n",[14,532,530],{"__ignoreMap":73},[10,534,535],{},"ローカルで再実行すると緑。Playwrightのフレーキー特有のパターンだ。とりあえず Squash and merge で取り込み、フレーキーは別PRで潰すことにした。",[27,537,539],{"id":538},"pr-15-networkidle-load-expecttopass-の恒久対策","PR #15: networkidle → load + expect.toPass の恒久対策",[10,541,542,543,546],{},"PR #15 でE2Eのフレーキーを根治する。元の実装は ",[14,544,545],{},"await page.waitForLoadState('networkidle')"," の後に即 click していたが、Nuxt のハイドレートが完了する前に click が走ると要素が登録されておらず空振りする。",[10,548,549],{},"Codex GPT-5.5 にレビューさせたら、こう返ってきた。",[551,552,553],"blockquote",{},[10,554,555,558,559,562,563,566],{},[14,556,557],{},"networkidle"," は SSE や long-polling があるページで永遠に待つことがある。",[14,560,561],{},"load"," に変えて、その後 ",[14,564,565],{},"expect(...).toPass({ timeout: 5000 })"," で click をリトライする方が確実。",[10,568,569],{},"指摘通りに修正。",[65,571,573],{"className":116,"code":572,"language":118,"meta":73,"style":73},"// Before: ハイドレート前に click が走って空振り\nawait page.goto('/notes/3kyu/merchandise')\nawait page.waitForLoadState('networkidle')\nawait page.click('[data-testid=\"journal-submit\"]')\n\n// After: load + expect.toPass で click 自体を retry\nawait page.goto('/notes/3kyu/merchandise')\nawait page.waitForLoadState('load')\nawait expect(async () => {\n  await page.click('[data-testid=\"journal-submit\"]', { timeout: 1000 })\n}).toPass({ timeout: 5000 })\n",[14,574,575,580,605,626,648,652,657,677,697,717,754],{"__ignoreMap":73},[122,576,577],{"class":124,"line":125},[122,578,579],{"class":128},"// Before: ハイドレート前に click が走って空振り\n",[122,581,582,586,589,591,594,596,598,601,603],{"class":124,"line":132},[122,583,585],{"class":584},"sHkkW","await",[122,587,588],{"class":139}," page",[122,590,163],{"class":143},[122,592,593],{"class":147},"goto",[122,595,174],{"class":143},[122,597,195],{"class":194},[122,599,600],{"class":198},"/notes/3kyu/merchandise",[122,602,195],{"class":194},[122,604,244],{"class":143},[122,606,607,609,611,613,616,618,620,622,624],{"class":124,"line":157},[122,608,585],{"class":584},[122,610,588],{"class":139},[122,612,163],{"class":143},[122,614,615],{"class":147},"waitForLoadState",[122,617,174],{"class":143},[122,619,195],{"class":194},[122,621,557],{"class":198},[122,623,195],{"class":194},[122,625,244],{"class":143},[122,627,628,630,632,634,637,639,641,644,646],{"class":124,"line":247},[122,629,585],{"class":584},[122,631,588],{"class":139},[122,633,163],{"class":143},[122,635,636],{"class":147},"click",[122,638,174],{"class":143},[122,640,195],{"class":194},[122,642,643],{"class":198},"[data-testid=\"journal-submit\"]",[122,645,195],{"class":194},[122,647,244],{"class":143},[122,649,650],{"class":124,"line":252},[122,651,256],{"emptyLinePlaceholder":255},[122,653,654],{"class":124,"line":259},[122,655,656],{"class":128},"// After: load + expect.toPass で click 自体を retry\n",[122,658,659,661,663,665,667,669,671,673,675],{"class":124,"line":265},[122,660,585],{"class":584},[122,662,588],{"class":139},[122,664,163],{"class":143},[122,666,593],{"class":147},[122,668,174],{"class":143},[122,670,195],{"class":194},[122,672,600],{"class":198},[122,674,195],{"class":194},[122,676,244],{"class":143},[122,678,679,681,683,685,687,689,691,693,695],{"class":124,"line":281},[122,680,585],{"class":584},[122,682,588],{"class":139},[122,684,163],{"class":143},[122,686,615],{"class":147},[122,688,174],{"class":143},[122,690,195],{"class":194},[122,692,561],{"class":198},[122,694,195],{"class":194},[122,696,244],{"class":143},[122,698,699,701,704,706,709,712,714],{"class":124,"line":291},[122,700,585],{"class":584},[122,702,703],{"class":147}," expect",[122,705,174],{"class":143},[122,707,708],{"class":135},"async",[122,710,711],{"class":143}," ()",[122,713,180],{"class":143},[122,715,716],{"class":143}," {\n",[122,718,719,722,724,726,728,730,732,734,736,738,741,745,748,751],{"class":124,"line":338},[122,720,721],{"class":584},"  await",[122,723,588],{"class":139},[122,725,163],{"class":143},[122,727,636],{"class":147},[122,729,174],{"class":143},[122,731,195],{"class":194},[122,733,643],{"class":198},[122,735,195],{"class":194},[122,737,215],{"class":143},[122,739,740],{"class":143}," { ",[122,742,744],{"class":743},"sz8Xr","timeout",[122,746,747],{"class":143},": ",[122,749,750],{"class":240},"1000",[122,752,753],{"class":143}," })\n",[122,755,756,759,762,765,767,769,772],{"class":124,"line":382},[122,757,758],{"class":143},"}).",[122,760,761],{"class":147},"toPass",[122,763,764],{"class":143},"({ ",[122,766,744],{"class":743},[122,768,747],{"class":143},[122,770,771],{"class":240},"5000",[122,773,753],{"class":143},[10,775,776,778],{},[14,777,24],{}," は中の処理を timeout 内で何度もリトライしてくれる。click が空振りしても次のリトライで拾える。これでローカル20回連続グリーン、CIも安定して通った。",[27,780,781],{"id":781},"学び",[10,783,784,788],{},[785,786,787],"strong",{},"移植は潜在バグを炙り出す。"," 当期純利益が貸方合計に乗っていなかったバグは、HTML版で別表示にしていたから気づかなかった。Vue化で表示を統合した瞬間に、計算式の欠落が画面の数字として現れた。リファクタリングの副産物として既存バグが発掘されるパターンは、これからも繰り返し起きる。",[10,790,791,794],{},[785,792,793],{},"Write拒否は手動救済の方が早い。"," サブエージェントの権限スコープを後から広げて再起動するより、生成済みのコード片を自分で貼り付ける方が3倍速い。9並列のうち2個が落ちても、残り7個の出力を待つ間に手で救済できる。",[10,796,797,802,803,805,806,228,808,810],{},[785,798,799,801],{},[14,800,557],{}," は罠。"," Nuxt のように継続的にイベントが飛ぶページでは ",[14,804,557],{}," が永遠に待ち続けることがある。",[14,807,561],{},[14,809,24],{}," の組み合わせを今後のE2Eテンプレに採用する。",[10,812,813,818,819,821,822,825],{},[785,814,815,817],{},[14,816,20],{}," は命綱。"," ブランチ取り違えに気づいた瞬間に ",[14,820,486],{}," を打っていたら午前中の修正がすべて消えた。インデックスだけ巻き戻したいときは必ず ",[14,823,824],{},"--soft"," を選ぶ。",[27,827,828],{"id":828},"明日やること",[42,830,833,842,853,864],{"className":831},[832],"contains-task-list",[45,834,837,841],{"className":835},[836],"task-list-item",[838,839],"input",{"disabled":255,"type":840},"checkbox"," 残り2章（cash-detail, journal-rules）をVue化して26章コンプリート",[45,843,845,847,848,101,850,852],{"className":844},[836],[838,846],{"disabled":255,"type":840}," ",[14,849,100],{},[14,851,104],{}," 計算にスナップショットテストを追加して当期純利益バグの再発を防ぐ",[45,854,856,858,859,228,861,863],{"className":855},[836],[838,857],{"disabled":255,"type":840}," E2Eテンプレに ",[14,860,561],{},[14,862,24],{}," パターンをまとめて、他のテストファイルにも横展開",[45,865,867,869,870,873],{"className":866},[836],[838,868],{"disabled":255,"type":840}," サブエージェントの権限スコープを章ディレクトリではなく ",[14,871,872],{},"apps/web/app/components/notes/"," 配下全体に広げて Write 拒否の再発を防ぐ",[875,876,877],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}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 pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}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 .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}",{"title":73,"searchDepth":132,"depth":132,"links":879},[880,881,882,883,884,885,886,887],{"id":29,"depth":132,"text":30},{"id":93,"depth":132,"text":94},{"id":390,"depth":132,"text":391},{"id":438,"depth":132,"text":439},{"id":490,"depth":132,"text":491},{"id":538,"depth":132,"text":539},{"id":781,"depth":132,"text":781},{"id":828,"depth":132,"text":828},"dev","純HTMLの簿記3級26章をeurekapu-nuxt4のVueコンポーネントに移植。サブエージェント24並列、Write拒否の手動救済、当期純利益バグの発見、ブランチ取り違えからのreset復旧、E2Eフレーキー対策まで。","md",{},null,"/vue-migration-marathon-3kyu-notes","eurekapu-nuxt4",false,"2026-05-02T00:00:00.000Z",{"title":5,"description":889},"2026-05/2026-05-02/vue-migration-marathon-3kyu-notes",[900,901,902,903,904],"Vue移植","サブエージェント並列","JournalExample","PRレビュー","Codexレビュー","-6sxzEEoJfkfn1D3tHnEa_LF4AQf9K7xnP3EkKW3X98",[],"https://log.eurekapu.com/og/blog/vue-migration-marathon-3kyu-notes.png?v=2026-05-02T00%3A00%3A00.000Z&title=%E7%B0%BF%E8%A8%983%E7%B4%9A%E3%83%8E%E3%83%BC%E3%83%8824%E7%AB%A0%E3%82%92Vue%E3%81%AB%E7%A7%BB%E6%A4%8D%EF%BC%9A24%E4%B8%A6%E5%88%97%E3%82%B5%E3%83%96%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E4%B8%80%E6%97%A5%E3%81%A7%E4%BB%95%E4%B8%8A%E3%81%92%E3%81%9F%E3%83%9E%E3%83%A9%E3%82%BD%E3%83%B3%E3%81%AE%E8%A8%98%E9%8C%B2&author=Kei%20Komatsu&sig=abc977f9770ea228",1782528832129]