[{"data":1,"prerenderedAt":474},["ShallowReactive",2],{"content-/make-diary-parallel-workflow":3,"all-pages-for-dir":472,"og-image-/make-diary-parallel-workflow":473},{"id":4,"title":5,"body":6,"category":453,"description":454,"extension":455,"meta":456,"navigation":399,"ogImage":457,"path":458,"project_name":459,"published":460,"publishedAt":461,"seo":462,"stem":463,"tags":464,"todo":457,"unpublished":460,"updatedAt":457,"__hash__":471},"pages/2026-05/2026-05-29/make-diary-parallel-workflow.md","毎朝の /make-diary を並列ワークフロー化できるか調査して試作スクリプトを検証した",{"type":7,"value":8,"toc":439},"minimark",[9,13,22,26,39,48,52,60,67,77,80,90,105,109,116,142,149,152,161,172,183,186,192,206,213,323,326,329,336,340,353,356,385,388,427,430],[10,11,5],"h1",{"id":12},"毎朝の-make-diary-を並列ワークフロー化できるか調査して試作スクリプトを検証した",[14,15,16,17,21],"p",{},"毎朝走らせている ",[18,19,20],"code",{},"/make-diary"," を眺めていて、中身が「日記生成」「Xポスト案」「決算チェック」の3系統を順番に流しているだけだと気づいた。違うことを順次でやっているなら並列化で短くできるはず、と思って Workflow 化が今回のユースケースに合うか調査を依頼した。結論は「全部は無理。でも5分のログ同期の裏に決算系を隠すのが最大の勝ち筋」。試作スクリプトをサンドボックスで走らせて、13分・74万トークンという実測値まで掴んだところで翌朝の本番ランに持ち越した。",[23,24,25],"h2",{"id":25},"まず全体像を掴む",[14,27,28,30,31,34,35,38],{},[18,29,20],{}," の中身を Claude Code に読ませたら、11ステップの長い順次パイプラインだった。前半はログ同期と記事生成、後半が ",[18,32,33],{},"/check-earnings"," と ",[18,36,37],{},"earnings-beat-scan"," のチェーン。並列化の可否は「後半で外部リソースを奪い合うか」で決まると見て、チェーン先の依存関係まで追わせた。",[14,40,41,42,44,45,47],{},"ポイントになったのは Chrome を何個使うか。",[18,43,33],{}," の Koyfin 取得も、ブラウザ表示確認も、同じリモートデバッグ Chrome（1個）を触る。一方で ",[18,46,37],{}," は x-search（Grok 経由）だけでブラウザに触らない、と確認できた。ここが効いた。",[23,49,51],{"id":50},"全並列は不可と判断した","全並列は不可、と判断した",[14,53,54,55,59],{},"調べた結果、3系統に並列化の余地はあるが",[56,57,58],"strong",{},"全部は並列にできない","と判断した。理由はシンプルで、後半でChrome 1個を奪い合うから。日記のブラウザ確認とKoyfin取得を同時に走らせると、同じデバッグChromeのタブを取り合って事故る。",[14,61,62,63,66],{},"そこで「独立3トラックを絞ったWF」に方針を固めた。一番おいしいのは、",[56,64,65],{},"5分かかるログ同期（sync-once.sh）が回っている裏で、ブラウザに触らない決算系を先行実行する","こと。sync待ちの空き時間に前倒しできる作業を詰める発想。",[68,69,74],"pre",{"className":70,"code":72,"language":73},[71],"language-text","[ メインループ ] sync-once.sh 実行中（〜5分）\n       └─ その裏で Koyfin取得（Chrome）を先行 → Turso取込\n[ WF ] 日記生成 / Xポスト案 / earnings-beat-scan を並列\n[ メインループ ] WF完了後にブラウザ表示確認\n","text",[18,75,72],{"__ignoreMap":76},"",[23,78,79],{"id":79},"設計の途中でドキュメントの食い違いを発見した",[14,81,82,83,85,86,89],{},"WF を組む前に、気になっていた ",[18,84,37],{}," の運用変更を裏取りした。これは「コンソール出力のみ」だったはずが、最近「公開記事として保存」に変わっている感触があった。実物を探したら、今朝09:09作成の ",[18,87,88],{},"earnings-beats-2026-05-28.md"," が実在した。運用が変わっているのは事実。",[14,91,92,93,96,97,100,101,104],{},"ところが SKILL.md 側は今も「コンソール出力のみ・",[18,94,95],{},"content/","に書かない」と明記したままだった。",[56,98,99],{},"ドキュメントが実運用に追いついていない","。WF はドキュメントを正典として各エージェントに読ませる設計なので、これを直さないと WF が古い挙動を再現してしまう。実運用に合わせて、SKILL.md と ",[18,102,103],{},"make-diary.md"," Step11 のドキュメント不整合3箇所を修正した。Step9 のXポスト案は正当なコンソール専用なので触っていない。",[23,106,108],{"id":107},"計画を-codex-に2回レビューさせた","計画を Codex に2回レビューさせた",[14,110,111,112,115],{},"実装前に計画を ",[18,113,114],{},"memo/2026-05-29/make-diary-workflow-plan.md"," に書いて、グローバルルールどおり Codex でレビューした。初回の指摘は3点、いずれも妥当だった。",[117,118,119,126,135],"ul",{},[120,121,122,125],"li",{},[56,123,124],{},"Koyfin取得は WF完了後ではなく、sync実行中のメインループで先行実行せよ","（順序を見落としていた）",[120,127,128,134],{},[56,129,130,133],{},[18,131,132],{},"diff_estimates"," はKoyfin取込後に動かす","（前日差分はデータが入ってから）",[120,136,137,138,141],{},"短縮効果の表現は「3トラック並列で大幅短縮」ではなく「",[56,139,140],{},"sync待ちに決算系を前倒しして2〜4分削る","」が正確",[14,143,144,145,148],{},"全面的に取り込んで計画を直し、",[18,146,147],{},"resume --last"," で前回の文脈を継いだまま再レビューさせた。再レビューは「致命的な点なし」。ここで計画が固まった。",[23,150,151],{"id":151},"ワークフロースクリプトを実装した",[14,153,154,155,157,158,160],{},"Phase 1 として、既存の ",[18,156,20],{}," は温存したまま、単体起動して検証できる独立ファイルとしてWFスクリプトを実装させた。ルールの二重管理を避けるため、各エージェントには既存の正典ファイル（",[18,159,103],{},"・各スキル）を読ませる方式にしたのが肝。WF側にルールを写経すると、いつか今日みたいなドキュメント不整合をまた生む。",[14,162,163,164,167,168,171],{},"実装中にひとつ詰まった。",[18,165,166],{},"node --check"," で構文検証すると top-level の ",[18,169,170],{},"return"," で弾かれる。これは Workflow ランタイムが本体を async 関数で包む仕様で、ランタイム同等の文脈（async でラップ）に置き直したら正常にパースできた。node 単体で弾かれただけだった。",[14,173,174,175,178,179,182],{},"SRE観点で1点だけ自分で改善を入れた。詳細記事エージェントが失敗すると ",[18,176,177],{},"parallel"," が null を返し、そのカテゴリが",[56,180,181],{},"黙って欠落","する。欠落をログに出して気づける形にした（「No silent caps」の方針）。",[23,184,185],{"id":185},"サンドボックスでスモークテストした",[14,187,188,189,191],{},"本番の ",[18,190,95],{}," を壊さずに機構を検証したかった。「ログはあるが content ディレクトリがまだ無い日付」に書かせれば衝突しないと考えたが、調べたら全ログ日付に既に content ディレクトリが存在していて安全な日付が無かった。",[14,193,194,195,202,203,205],{},"そこで",[56,196,197,198,201],{},"出力先をサンドボックス（",[18,199,200],{},"memo/2026-05-29/wf-test/","）にリダイレクトしたスモークテスト版","を作り、既存ログ（2026-05-27）を入力に走らせた。5分の再syncは省略（既存ログ流用）、PNG書込が ",[18,204,95],{}," にハードコードされる timeline はスタブ化。本番 content には一切触れていない。",[14,207,208,209,212],{},"結果、",[56,210,211],{},"WF機構は全項目パス","した。",[214,215,216,235],"table",{},[217,218,219],"thead",{},[220,221,222,226,229,232],"tr",{},[223,224,225],"th",{},"#",[223,227,228],{},"検証項目",[223,230,231],{},"結果",[223,233,234],{},"気づき",[236,237,238,253,267,281,295,309],"tbody",{},[220,239,240,244,247,250],{},[241,242,243],"td",{},"1",[241,245,246],{},"全並列でChrome競合するか",[241,248,249],{},"不可",[241,251,252],{},"後半でChrome 1個を奪い合う。絞ったWFに変更",[220,254,255,258,261,264],{},[241,256,257],{},"2",[241,259,260],{},"Codex計画レビュー（初回）",[241,262,263],{},"致命3点",[241,265,266],{},"Koyfin先行実行・diff順序・短縮効果の表現を是正",[220,268,269,272,275,278],{},[241,270,271],{},"3",[241,273,274],{},"Codex再レビュー",[241,276,277],{},"致命なし",[241,279,280],{},"計画確定",[220,282,283,286,289,292],{},[241,284,285],{},"4",[241,287,288],{},"top-level return の構文検証",[241,290,291],{},"一度失敗→解決",[241,293,294],{},"ランタイムがasyncで包む仕様。node単体検証では弾かれるだけ",[220,296,297,300,303,306],{},[241,298,299],{},"5",[241,301,302],{},"サンドボックスでスモーク",[241,304,305],{},"全項目パス",[241,307,308],{},"12エージェント・x-search実データ・記事生成・lint OK",[220,310,311,314,317,320],{},[241,312,313],{},"6",[241,315,316],{},"費用対効果の実測",[241,318,319],{},"微妙",[241,321,322],{},"13分・74万トークン（しかも5分sync省いた状態で）",[14,324,325],{},"生成物の品質は高かった。frontmatter は正確、視点ルール（筆者が主語・AIは道具）も守られ、匿名化（「ある資格試験」「自炊した教科書」）も vivid-writing も効いていた。本番スクリプトに軽微なバグを1件見つけて直した（統合日記エージェントがスキーマ未指定でパスではなく散文を返していた）。",[23,327,328],{"id":328},"費用対効果は見立てより微妙だった",[14,330,331,332,335],{},"正直に言うと、実測の費用対効果は思ったより渋い。機構は完璧に動いて生成物も良いが、",[56,333,334],{},"13分・74万トークン","かかった。しかも5分のsyncを省いた状態で、だ。一方で短縮効果は2〜4分どまり。サブエージェントは今のセッションと同じ課金枠で動くので追加の金銭課金は出ないが、トークン消費の大きさは無視できない。",[23,337,339],{"id":338},"phase-2-は見送り翌朝の本番ランで判断する","Phase 2 は見送り、翌朝の本番ランで判断する",[14,341,342,344,345,348,349,352],{},[18,343,103],{}," 本体の書き換え（Phase 2）はやらないことにした。マークダウンの正典は触らず、明日 ",[56,346,347],{},"本番スクリプトを全工程で一度だけ通して採否を判断する","方針。明日は新しいセッションなので、本番スクリプト＋Chrome後処理を正しくオーケストレーションできるよう、ランブックを ",[18,350,351],{},"memo/2026-05-29/make-diary-parallel-RUNBOOK.md"," に書いた。翌朝6時の実行予定を Google カレンダーに登録した（6:00ポップアップ通知付き）。",[23,354,355],{"id":355},"今日の学び",[117,357,358,365,372,379],{},[120,359,360,361,364],{},"並列化の可否は「独立しているか」より「",[56,362,363],{},"共有する外部リソース（Chrome 1個）を奪い合うか","」で決まる。SaaS で言えば、同じ承認画面を複数バッチが同時に触れない構図と同じ",[120,366,367,368,371],{},"「全部並列で速くなる」は幻想で、",[56,369,370],{},"待ち時間（sync 5分）に前倒しできる作業を詰める","方が現実的な勝ち筋だった",[120,373,374,375,378],{},"WF のルールはWF側に書かず、",[56,376,377],{},"正典ファイルを読ませる","。さもないとドキュメント不整合をまた量産する。今日その不整合を実際に踏んだ",[120,380,381,382],{},"機構が動くことと、費用対効果が見合うことは別問題。",[56,383,384],{},"実測のトークン量を見るまで採否は決めない",[23,386,387],{"id":387},"明日やること",[117,389,392,406,412,418],{"className":390},[391],"contains-task-list",[120,393,396,401,402,405],{"className":394},[395],"task-list-item",[397,398],"input",{"disabled":399,"type":400},true,"checkbox"," ランブックに従って ",[18,403,404],{},"make-diary-parallel"," を全工程で一度走らせる",[120,407,409,411],{"className":408},[395],[397,410],{"disabled":399,"type":400}," 実測の所要時間・トークン量を、今日のスモーク（13分・74万）と比較する",[120,413,415,417],{"className":414},[395],[397,416],{"disabled":399,"type":400}," sync裏のKoyfin先行実行が実際に2〜4分を削れているか確認する",[120,419,421,423,424,426],{"className":420},[395],[397,422],{"disabled":399,"type":400}," 見合うと判断したら Phase 2（",[18,425,103],{}," 本体の差し替え）に進むか決める",[23,428,429],{"id":429},"関連記事",[117,431,432],{},[120,433,434],{},[435,436,438],"a",{"href":437},"/2026-05-28-diary","2026年5月28日の開発日記",{"title":76,"searchDepth":440,"depth":440,"links":441},2,[442,443,444,445,446,447,448,449,450,451,452],{"id":25,"depth":440,"text":25},{"id":50,"depth":440,"text":51},{"id":79,"depth":440,"text":79},{"id":107,"depth":440,"text":108},{"id":151,"depth":440,"text":151},{"id":185,"depth":440,"text":185},{"id":328,"depth":440,"text":328},{"id":338,"depth":440,"text":339},{"id":355,"depth":440,"text":355},{"id":387,"depth":440,"text":387},{"id":429,"depth":440,"text":429},"dev","11ステップの順次パイプライン /make-diary を Workflow で並列化できるか調査した記録。後半でChromeを1個奪い合うため全並列は不可と判断し、5分のログ同期の裏で決算系を先行実行する『絞ったWF』に着地。試作スクリプトをサンドボックスでスモークテストし、13分・74万トークンという費用対効果の実測値まで掴んだ。","md",{},null,"/make-diary-parallel-workflow","claude-code-tools",false,"2026-05-29T00:00:00.000Z",{"title":5,"description":454},"2026-05/2026-05-29/make-diary-parallel-workflow",[465,466,467,468,469,470],"Claude Code","Workflow","並列化","Codex","make-diary","サブエージェント","D8VKGZpQqU3-8M7wz3g7qzJfsjfbtw2uIMzx42p7jOo",[],"https://log.eurekapu.com/og/blog/make-diary-parallel-workflow.png?v=2026-05-29T00%3A00%3A00.000Z&title=%E6%AF%8E%E6%9C%9D%E3%81%AE%20%2Fmake-diary%20%E3%82%92%E4%B8%A6%E5%88%97%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E5%8C%96%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%E8%AA%BF%E6%9F%BB%E3%81%97%E3%81%A6%E8%A9%A6%E4%BD%9C%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%97%E3%81%9F&author=Kei%20Komatsu&sig=25870736eb368442",1782528844960]