[{"data":1,"prerenderedAt":192},["ShallowReactive",2],{"content-/plan-review-decision-form-loop":3,"all-pages-for-dir":170,"related-/plan-review-decision-form-loop":171,"og-image-/plan-review-decision-form-loop":191},{"id":4,"title":5,"body":6,"category":149,"concepts":150,"description":151,"extension":152,"meta":153,"navigation":154,"ogImage":150,"path":155,"project_name":156,"published":157,"publishedAt":158,"seo":159,"source":160,"stem":161,"tags":162,"todo":150,"unpublished":157,"updatedAt":150,"__hash__":169},"pages/2026-09/2026-09-16/plan-review-decision-form-loop.md","計画書を書かせ、別モデルでレビューし、3択フォームで決裁するまで",{"type":7,"value":8,"toc":140},"minimark",[9,13,16,19,28,32,35,38,42,45,48,51,54,57,60,71,78,81,84,87,90,93,96,99,102,105,108,115,118],[10,11,12],"p",{},"Xを眺めていたら、UIデザイナーの人が自作スキルを紹介する投稿が流れてきた。\nオブジェクトがどう紐づいているのかを見たくて、デザインデータと概念図とER図を同じキャンバスに乗せ、メニューひとつで行き来できるようにしたという。\nスクリーンショットが4枚ついていた。",[10,14,15],{},"見た瞬間、自分のChrome拡張でも同じことをやりたくなった。\n会計ソフトAの画面に機能を足している拡張だ。\n画像4枚をそのままClaude Codeに貼りつけた。",[10,17,18],{},"貼ったあと、すぐ実装へ走らせてもよかった。\nそうはせず、計画から入らせた。\nまずリポジトリの中身を把握させ、そのうえで計画書を書かせた。",[10,20,21,22,27],{},"足した機能そのものの話は",[23,24,26],"a",{"href":25},"/accounting-extension-monthly-trial-balance","別記事","に書いた。",[29,30,31],"h2",{"id":31},"heredocがクォートで崩れた",[10,33,34],{},"計画書の本文をheredocでファイルへ流し込もうとしたら、クォートの扱いで途中から崩れた。\nバッククォートも引用符も混ざるマークダウンを、シェル越しに長文で渡したのがまずかった。",[10,36,37],{},"書き方を変えて、Writeツールで直接ファイルを作らせたら、そのまま通った。",[29,39,41],{"id":40},"レビューを回している間に図を描かせた","レビューを回している間に、図を描かせた",[10,43,44],{},"計画書の初稿ができたところで、Codexへレビューを投げた。\n返事が来るまで、こちらの手は空く。",[10,46,47],{},"そのまま待つ理由はない。\n決裁フォームに載せる選択肢を先に用意させた。\n続けてsvg-diagramを読ませ、計画書に入れる図を描かせた。\nレビューが返るころには、図も選択肢も揃っている。",[29,49,50],{"id":50},"レビューで返ってきた1件の指摘",[10,52,53],{},"返ってきたのは、文章の良し悪しではなく、実データの誤りを1件突く指摘だった。\n計画書に書いた保存キーの前提が違う、という。",[10,55,56],{},"鵜呑みにはしない。\nCodexの判定をそのまま受け取らないのは普段からの方針だし、今回はコードを見れば済む話だった。\n拡張のコードをもう一度grepし直して、自分で確かめた。",[10,58,59],{},"指摘どおりだった。",[61,62,67],"pre",{"className":63,"code":65,"language":66},[64],"language-text","mfc:year:...   帳簿チェックが使う保存キー\nmfv:year:...   明細一覧ビューが使う保存キー\n","text",[68,69,65],"code",{"__ignoreMap":70},"",[10,72,73,74,77],{},"接頭辞が2種類あって、別物を保存している。\n最初に計画書を書かせたとき、",[68,75,76],{},"mfc:"," だけを検索していた。\n片方しか見ていない状態でキーの一覧を作り、その一覧を前提に設計を組み立てていたことになる。",[10,79,80],{},"このまま実装へ入っていたら、キーの一覧を前提に組んだ部分を書き直すことになっていたはずだ。\nすぐ作らせずに計画書を挟んだのは、これのためだった。",[10,82,83],{},"計画書を直して、もう一度Codexに投げた。\n今度は「承認」が返ってきた。",[29,85,86],{"id":86},"判断事項は3択ボタンにした",[10,88,89],{},"計画書が固まっても、こちらが決めないと先へ進めない項目が3件残った。",[10,91,92],{},"ターミナルの選択肢で聞かれるのは、この手の判断と相性が悪い。\n何を天秤にかけているのかは計画書の本文に書いてあるのに、選ぶ画面には選択肢の文字列しか出ない。\n前提を読み返そうとすると、選択の画面をいったん抜けることになる。",[10,94,95],{},"そこで計画書をHTML化して、判断が必要な箇所に3択ボタンを埋め込んだフォームを立てた。\n計画書を上から読んでいき、読み終わった流れのままボタンを押せばいい。",[29,97,98],{"id":98},"デバッグポートが開いていなかった",[10,100,101],{},"フォームを立てたら、描画を自分の目で確認する。",[10,103,104],{},"ところが、いつも使っているChromeのデバッグポートが開いていなかった。\nここで復旧に時間を使う理由もないので、ヘッドレスで立ち上げてスクリーンショットを撮らせた。",[10,106,107],{},"1枚目で、UIが生成されていることは分かった。\nただし全体を1枚に収めた画像では、ボタンの見た目までは分からない。\n判断事項の部分だけを切り出してもう1枚撮らせ、3択が崩れずに並んでいることを見た。\n最後に、待ち時間のあいだに描かせた図の描画も確かめた。",[10,109,110,111,114],{},"ここまで済ませてから、判断事項3件をブラウザで選べる状態にしたと報告し、",[68,112,113],{},"http://127.0.0.1:8899/"," を添えた。",[29,116,117],{"id":117},"学びメモ",[119,120,121,125,128,131,134,137],"ul",{},[122,123,124],"li",{},"別モデルのレビューは、文章の体裁ではなく実データの前提を突いてきたときに効く。今回の1件がそれだった",[122,126,127],{},"指摘が当たっているかは自分で確かめる。当たっていたのは結果であって、確かめるまでは分からない",[122,129,130],{},"grepの網が狭いと、計画書の前提がまるごとずれる。接頭辞が1種類とは限らない、と疑う癖をつける",[122,132,133],{},"レビューの待ち時間は空いている。図を描かせる、決裁の選択肢を用意する、といった作業を差し込める",[122,135,136],{},"判断を求めるときは、判断材料のすぐ隣にボタンを置く。前提と選択肢を別の画面に分けない",[122,138,139],{},"ブラウザの確認経路が塞がっていても、ヘッドレスで撮れば描画は見られる。全景1枚で終わらせず、見たい部分を切り出して撮る",{"title":70,"searchDepth":141,"depth":141,"links":142},2,[143,144,145,146,147,148],{"id":31,"depth":141,"text":31},{"id":40,"depth":141,"text":41},{"id":50,"depth":141,"text":50},{"id":86,"depth":141,"text":86},{"id":98,"depth":141,"text":98},{"id":117,"depth":141,"text":117},"dev",null,"他の人のスキル紹介を見て自分のChrome拡張にも同じ機能が欲しくなった。実装より先に計画書を書かせ、Codexのレビューで実データの誤りを1件潰し、判断事項3件を3択ボタンで選ぶ決裁フォームを立てるまでの記録。","md",{},true,"/plan-review-decision-form-loop","misc-dev",false,"2026-09-16T00:00:00.000Z",{"title":5,"description":151},"make-diary","2026-09/2026-09-16/plan-review-decision-form-loop",[163,164,165,166,167,168],"計画書","Codexレビュー","決裁フォーム","Claude Code","開発プロセス","開発日記","uTI1doBZtzlX4IlUoguiW2bNsWoaJL2hbrF__7zfwQ0",[],[172,176,180,184,188],{"title":173,"path":174,"publishedAt":175},"後回しにした理由を探したら、そんな記録はどこにもなかった","/course-restart-and-tax-plan","2026-09-13T00:00:00.000Z",{"title":177,"path":178,"publishedAt":179},"計画書の中で判断を返す — ターミナルの選択肢をやめてHTMLに3択ボタンを埋めた","/plan-decision-form","2026-07-26T00:00:00.000Z",{"title":181,"path":182,"publishedAt":183},"コミット前の2つのゲートに止められた：Markdownの太字崩れと計画書の締め忘れ","/commit-gates-md-lint-and-carryover","2026-09-19T00:00:00.000Z",{"title":185,"path":186,"publishedAt":187},"海外株の円換算が約定直後にマイナスに見える理由をウォーターフォール図で整理し、ポートフォリオ記録と株価通知も追随させた","/foreign-stock-fx-waterfall-and-portfolio-sync","2026-09-15T00:00:00.000Z",{"title":189,"path":190,"publishedAt":187},"Claude Code の make-diary を朝の実行ログで振り返り、同期の完了待ちと実行モデルを手順書に固定した","/make-diary-retro-fixes-and-statusline","https://log.eurekapu.com/og/blog/plan-review-decision-form-loop.png?v=2026-09-16T00%3A00%3A00.000Z&title=%E8%A8%88%E7%94%BB%E6%9B%B8%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%9B%E3%80%81%E5%88%A5%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%97%E3%80%813%E6%8A%9E%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A7%E6%B1%BA%E8%A3%81%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7&author=Kei%20Komatsu&sig=615384c6b56b4eef",1789885490529]