[{"data":1,"prerenderedAt":161},["ShallowReactive",2],{"content-/mac-pdf-viewer-plan-and-review-rule":3,"all-pages-for-dir":140,"related-/mac-pdf-viewer-plan-and-review-rule":141,"og-image-/mac-pdf-viewer-plan-and-review-rule":160},{"id":4,"title":5,"body":6,"category":120,"concepts":121,"description":122,"extension":123,"meta":124,"navigation":125,"ogImage":121,"path":126,"project_name":127,"published":128,"publishedAt":129,"seo":130,"source":131,"stem":132,"tags":133,"todo":121,"unpublished":128,"updatedAt":121,"__hash__":139},"pages/2026-08/2026-08-07/mac-pdf-viewer-plan-and-review-rule.md","MacのPDFビューアーを自作する計画と、計画書レビューを必ず通す運用に戻した記録",{"type":7,"value":8,"toc":110},"minimark",[9,13,17,21,24,27,30,33,41,44,47,50,53,60,63,66,69,72,75,78,81,85,88,91,94],[10,11,5],"h1",{"id":12},"macのpdfビューアーを自作する計画と計画書レビューを必ず通す運用に戻した記録",[14,15,16],"p",{},"Mac で PDF をクリックすると、ブラウザのタブが開く。\n見るたびにそうなるので、ずっと引っかかっていた。\n有償の PDF ソフトの簡易版でいいから、手元で PDF を操作できるアプリを作ることにした。",[18,19,20],"h2",{"id":20},"環境を測ってから計画書を書かせる",[14,22,23],{},"リポジトリ置き場の直下に独立したプロジェクトとして立てる、という前提だけを渡した。\n最初にやらせたのは、Xcode と Swift と Rust が手元に入っているかの確認だった。\n候補を机上で並べても、動く保証のないものは選択肢にならない。\n実測で残ったものだけを材料にして、計画書を書かせた。",[14,25,26],{},"計画書は決裁フォーム付きで HTML に変換させ、Chrome の前面タブに出させた。\n図と表と回答ボタンが崩れていないことは、スクリーンショットで確認させた。\nここまではいつもの型どおりに流れていた。",[18,28,29],{"id":29},"レビューを通した記憶がない",[14,31,32],{},"画面を眺めていて引っかかった。\nこの計画書、Codex のレビューを通していないのではないか。",[14,34,35,36,40],{},"通っていなかった。\n理由を吐かせると、ルールファイル（",[37,38,39],"code",{},"~/.claude/rules/plan-codex-review.md","）が 2026-07-02 に「大規模・不可逆な計画のみレビュー必須」へ緩和されていた。\n今回はその条件に当たらないと判断してスキップした、とのことだった。",[14,42,43],{},"判断そのものは筋が通っている。\n数ファイルで可逆な変更しか含まない計画に毎回外の目を入れるのは重い、と考えて条件を絞ったのは自分だ。\nただ、そのとき頭にあったのは実装作業のほうで、計画書ではなかった。\n計画書は方針を固める文書で、ここが曲がったまま通ると後続の工程が全部その方向へ走る。\nしかも規模で線を引くと、線の内側かどうかを判定するのは実行側になる。\n今回まさに「該当しない」と自己判定されて飛んだ。",[14,45,46],{},"「計画書は規模を問わず必ずレビュー」に戻させた。\nそのうえで、今回の計画書もその場でレビューに投げさせた。",[18,48,49],{"id":49},"ルールとスキルでは効き方が違う",[14,51,52],{},"直させながら、もうひとつ気になった。\n決裁フォームに4件の未回答が並んでいる。\n回答が届いたら計画書に反映する。\nこの一連の流れは、どのファイルが定義しているのか。\nドキュメント作成のスキル側に書いてあるほうが自然にも思えたので、そこも含めて聞いた。",[14,54,55,56,59],{},"答えは ",[37,57,58],{},"~/.claude/rules/decision-form.md"," で、スキルではなくグローバルルールだった。\nルールは常にコンテキストへ読み込まれる。\nスキルは明示的に呼んだときだけ中身がロードされる。\n確実に効かせたい手順は、ルール側に置くほうが強い。",[14,61,62],{},"今回レビューが飛んだのも、同じ構造の裏返しだった。\nルールに書いてあったから、条件分岐そのものは確実に読まれていた。\nただ、その条件が緩かったので、緩いまま実行された。\nルールは書いたとおりに効く。",[18,64,65],{"id":65},"宛先が変わると前提も変わる",[14,67,68],{},"Codex のレビューを2巡させ、指摘を反映した計画書を画面に出し直させた。\nそこで自分の前提のほうが揺れた。\nWindows 機には有償の PDF ソフトが入っているし、Mac にも同じものを入れれば今日で解決する。",[14,70,71],{},"ただ、自作すれば人に渡せる。\n相手が有償ソフトを契約していない場合、渡せるかどうかが効いてくる。\n配布を前提にすると要件が変わるので、配布の設計も計画書に足させた。",[14,73,74],{},"本当の宛先は父の Mac だと、その場で言葉にした。\n毎回ブラウザに引かれていく挙動を、父の側でも止めたい。\nそのうえで聞いた。\nそもそも無料のアプリで開けるのではないか。",[14,76,77],{},"返ってきた答えは、OS 標準のプレビューが最有力というものだった。\n父の Mac にも最初から入っていて、無料で、広告も出ず、見開きも表示できる。\n既定アプリをそちらに変えるだけで、「ブラウザで開く」は今日直る。\n他の候補は、UI が古風で一般ユーザー向きではないオープンソースのビューアーと、閲覧は無料でもログイン誘導と有料版の案内が出る大手のリーダーくらいだった。",[14,79,80],{},"つまり自分が解きたかったのは「PDF が開けない」ではなかった。\n父が迷わず使える形まで細かく寄せたい、という問題だった。\n既製品で足りないのはその一点だけで、そこは自作でしか埋まらない。\nこの比較ごと計画書に書かせた。",[18,82,84],{"id":83},"決裁4件を受けて実装へ","決裁4件を受けて、実装へ",[14,86,87],{},"決裁フォームから4件の回答が届いたので、計画書に反映させた。\n3巡目のレビューを回してから、骨格の実装に入った。\n最初のウィンドウが開いて PDF が表示されるところまでは、この日のうちに動いた。",[14,89,90],{},"そのあとで、父の Mac はまだ買っておらず Apple Silicon の新機になる予定だと伝えた。\nそれだけで arm64 ビルドだけで足りることになり、複数アーキテクチャ対応のフェーズが着手前に消えた。",[18,92,93],{"id":93},"学び",[95,96,97,101,104,107],"ul",{},[98,99,100],"li",{},"計画書のレビューは規模で線を引かない。実装は小さくやり直せるが、方針を間違えた計画書は後続の工程を全部連れていく",[98,102,103],{},"規模を条件にすると、条件の判定そのものが実行側の自己申告になる。判定を渡したくない手順は、条件を付けずに書く",[98,105,106],{},"必ず守らせたい手順はスキルではなくルールに書く。スキルは呼ばないと読まれない",[98,108,109],{},"「誰に渡すか」を先に言葉にすると要件が減る。父の機種が決まっただけで、フェーズがひとつ消えた",{"title":111,"searchDepth":112,"depth":112,"links":113},"",2,[114,115,116,117,118,119],{"id":20,"depth":112,"text":20},{"id":29,"depth":112,"text":29},{"id":49,"depth":112,"text":49},{"id":65,"depth":112,"text":65},{"id":83,"depth":112,"text":84},{"id":93,"depth":112,"text":93},"dev",null,"MacでPDFをクリックするとブラウザで開いてしまう不便から、簡易PDFビューアーの自作を決めた。技術スタックを実測で確かめて計画書を書かせたところ、外部AIのレビューを飛ばしていたことに気づき、規模で線を引いていたルールを元に戻した記録。","md",{},true,"/mac-pdf-viewer-plan-and-review-rule","misc-dev",false,"2026-08-07T00:00:00.000Z",{"title":5,"description":122},"make-diary","2026-08/2026-08-07/mac-pdf-viewer-plan-and-review-rule",[134,135,136,137,138],"macOS","PDFビューアー","計画書","コードレビュー","Claude Code","5GASMdCnnxMrgEs3IFWl-SUJYN9fxCc-nY69OSxFP9E",[],[142,145,149,152,156],{"title":143,"path":144,"publishedAt":129},"2026年8月7日の開発日記 - 緩めたルールを、元に戻した日","/2026-08-07-diary",{"title":146,"path":147,"publishedAt":148},"2026年8月4日の開発日記 - 守ってくれているつもりの仕掛けが、止まっていた","/2026-08-04-diary","2026-08-04T00:00:00.000Z",{"title":150,"path":151,"publishedAt":148},"積み残しの一覧化から始めて、粒度を分けたコミットで締める一日","/backlog-first-project-workflow",{"title":153,"path":154,"publishedAt":155},"生成AIツールはなぜMac先行なのか、調べさせてHTMLとSVG図解で受け取った","/why-genai-tools-favor-mac","2026-08-02T00:00:00.000Z",{"title":157,"path":158,"publishedAt":159},"計画書の中で判断を返す — ターミナルの選択肢をやめてHTMLに3択ボタンを埋めた","/plan-decision-form","2026-07-26T00:00:00.000Z","https://log.eurekapu.com/og/blog/mac-pdf-viewer-plan-and-review-rule.png?v=2026-08-07T00%3A00%3A00.000Z&title=Mac%E3%81%AEPDF%E3%83%93%E3%83%A5%E3%83%BC%E3%82%A2%E3%83%BC%E3%82%92%E8%87%AA%E4%BD%9C%E3%81%99%E3%82%8B%E8%A8%88%E7%94%BB%E3%81%A8%E3%80%81%E8%A8%88%E7%94%BB%E6%9B%B8%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E5%BF%85%E3%81%9A%E9%80%9A%E3%81%99%E9%81%8B%E7%94%A8%E3%81%AB%E6%88%BB%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2&author=Kei%20Komatsu&sig=88f24db813d48098",1786233110952]