[{"data":1,"prerenderedAt":258},["ShallowReactive",2],{"content-/family-trips-commit-security-review-2026-06-22":3,"all-pages-for-dir":256,"og-image-/family-trips-commit-security-review-2026-06-22":257},{"id":4,"title":5,"body":6,"category":238,"description":239,"extension":240,"meta":241,"navigation":242,"ogImage":243,"path":244,"project_name":245,"published":246,"publishedAt":247,"seo":248,"stem":249,"tags":250,"todo":243,"unpublished":246,"updatedAt":243,"__hash__":255},"pages/2026-06/2026-06-22/family-trips-commit-security-review.md","family-trips の未コミット変更を粒度で切り分けてプッシュ、セキュリティレビューも通した",{"type":7,"value":8,"toc":229},"minimark",[9,14,23,34,38,44,73,84,91,95,98,112,119,123,130,133,155,158,198,201,204,211,217,223],[10,11,13],"h2",{"id":12},"発端たまった未コミット変更を良い単位で片付けたかった","発端：たまった未コミット変更を「良い単位で」片付けたかった",[15,16,17,18,22],"p",{},"family-trips は、家族で行った旅行をひとつのアーカイブにまとめている Astro + Cloudflare Pages のサイトだ。週末や夜に少しずつ触っているうちに、",[19,20,21],"code",{},"git status"," の赤と緑が画面を埋めるようになっていた。ディズニーランドのガイド、別府・湯布院方面のシミュレーター更新、ナビゲーション差し替え、宿泊の予約確定反映――テーマがバラバラのまま積み上がっている。",[15,24,25,26,29,30,33],{},"そのまま ",[19,27,28],{},"git add -A"," で一括コミットすると、後から ",[19,31,32],{},"git log"," を眺めたときに何が何の変更なのか追えなくなる。半年後の自分が「この行いつ入れたんだっけ」と git blame を叩く未来が見えたので、Claude Code に「良い単位でコミットしてプッシュしておいて」と一言だけ投げた。",[10,35,37],{"id":36},"コミット粒度機能ごとに切ってもらって7コミットになった","コミット粒度：機能ごとに切ってもらって7コミットになった",[15,39,40,43],{},[19,41,42],{},"/commit"," スキルにそのまま任せた。中で diff と新規ファイルを一通り走査してから、論理的な単位を提案してくる。今回返ってきた分割案はこんな並びだった。",[45,46,47,55,58,61,64,67,70],"ol",{},[48,49,50,51,54],"li",{},"dev-server のログを ",[19,52,53],{},".gitignore"," に追加",[48,56,57],{},"memo ディレクトリの引き継ぎメモとスクリーンショット類",[48,59,60],{},"ディズニーランドのガイドページ追加",[48,62,63],{},"ナビゲーションの更新",[48,65,66],{},"別府方面の宿泊シミュレーターの再構成",[48,68,69],{},"大分の残3件の宿泊予約の確定反映",[48,71,72],{},"上記をまとめてプッシュ",[15,74,75,76,79,80,83],{},"提案を眺めて、特に違和感がなかったのでそのまま走らせた。1コミットずつメッセージを生成 → ステージ → ",[19,77,78],{},"git commit"," を順に流して、最後に ",[19,81,82],{},"git push","。7コミットがリモートに乗ったところで、Cloudflare Pages の自動デプロイが裏でビルドを始める。",[15,85,86,87,90],{},"自分でやろうとすると、",[19,88,89],{},"git add -p"," でハンクを選びながら頭の中でカテゴリ分けして、メッセージを毎回考え直して……と地味に重い作業だ。手は動かしても頭の負荷は集中力を確実に削る。差分を読んで「これとこれは同じテーマ」と判断する部分を AI にやらせると、自分は「7コミットで OK」と頷くだけで済む。",[10,92,94],{"id":93},"粒度分けの基準は結局後から-git-log-を-grep-したくなる単位","粒度分けの基準は、結局「後から git log を grep したくなる単位」",[15,96,97],{},"7コミットに分けてもらった並びを眺めて気づいたのは、どれも「後から検索したくなる単語」が独立しているということだった。",[99,100,101,106,109],"ul",{},[48,102,103,105],{},[19,104,53],{}," の変更は、別の開発環境で「dev サーバーのログがコミットされる事故」を調べるときに引きたい",[48,107,108],{},"memo の引き継ぎは、過去に何を考えていたか思い出したいときに引きたい",[48,110,111],{},"ディズニー、別府、ナビ、宿泊予約――どれも別タイミングで「あれどこで直した」と探したくなる粒度",[15,113,114,115,118],{},"「機能単位」「日付単位」「カテゴリ単位」のどれで切るかと聞かれると毎回迷うが、",[19,116,117],{},"git log --grep"," で自分が将来叩きそうな単語がちゃんと1コミットに閉じているか、で判断すれば外しにくい。Claude Code に粒度を任せるときも、「後から検索したくなる単位で」と添えれば外れ値が出にくくなりそうだ。",[10,120,122],{"id":121},"セキュリティレビュープッシュ直後にもう一度全変更を流す","セキュリティレビュー：プッシュ直後にもう一度全変更を流す",[15,124,125,126,129],{},"コミットとプッシュが終わった直後、続けて ",[19,127,128],{},"Review this change for security vulnerabilities."," と投げた。プッシュ前にやってもよかったが、コミットを分割した後の方がレビューする側も差分を読みやすい。1コミット = 1テーマなので、レビュー側も「このコミットでは何を見ればいいか」が一発で決まる。",[15,131,132],{},"レビュー対象は3グループに分かれた。",[45,134,135,141,144],{},[48,136,137,140],{},[19,138,139],{},"src/data/guides.json"," への単純なデータ追加（ガイドの新規エントリ）",[48,142,143],{},"Vue コンポーネントのプレゼンテーション層リファクタ",[48,145,146,147,150,151,154],{},"別府方面の宿泊シミュレーターの構造リファクタ（",[19,148,149],{},"onsen"," → ",[19,152,153],{},"aquagarden"," のフィールド改名含む）",[15,156,157],{},"戻ってきた所見はどれも「No findings」だった。判定の根拠が短くまとまっていて、読みやすい。",[99,159,160,171,182],{},[48,161,162,163,166,167,170],{},"JSON はすべて開発者が書いた静的リテラル。",[19,164,165],{},"src/pages/index.astro"," で CSS 背景と ",[19,168,169],{},"/guides/\u003Cslug>"," の静的リンクとして消費されるだけで、攻撃者が触れる経路がない",[48,172,173,174,177,178,181],{},"Vue コンポーネントは入力が数値 ref のみ。テンプレート出力は全部 ",[19,175,176],{},"{{ }}"," の自動エスケープに通る。",[19,179,180],{},"v-html"," も動的 class 合成もない",[48,183,184,185,150,187,189,190,193,194,197],{},"シミュレーターは静的な価格データに対する算術で、シェル/SQL/eval/FS/HTML 注入/ネットワーク/ログのどのシンクにも到達しない。",[19,186,149],{},[19,188,153],{}," の改名は ",[19,191,192],{},"Scenario4"," 型と ",[19,195,196],{},"sumScenario4"," の両方で揃っているので、レジストリ的な不整合もなし",[15,199,200],{},"「リネームが片側だけ漏れていないか」までチェック対象に入っていたのが地味にうれしい。型と集計関数のどちらかだけ古い名前のまま残っていると、ビルドは通っても挙動が崩れるパターンだ。",[10,202,203],{"id":203},"やってみて思ったこと",[15,205,206,210],{},[207,208,209],"strong",{},"「コミット粒度を AI に判断させる」のは、何度か続けると安定する。"," 最初の数回は「自分ならもう少し細かく切る/もう少しまとめる」とズレを感じたが、3〜4回回すうちに自分の好みに合った提案が返ってくるようになった。スキル側のプロンプトに「機能・日付・カテゴリ別」と入っているのも効いている。",[15,212,213,216],{},[207,214,215],{},"セキュリティレビューは分散コミット後の方が読みやすい。"," 一塊にした diff に「ここ大丈夫?」と聞くと、レビュー側は全テーマを同時に頭に入れる必要がある。コミット単位で意味が閉じていれば、レビュー側も「このコミットでは入力経路がない」「このコミットでは型の片側更新を確認」と1つずつ片付けられる。今回 No findings で終わったのは、レビューが軽かったというより、レビュー対象が読みやすい形に整っていたからだと思う。",[15,218,219,222],{},[207,220,221],{},"家族旅行のサイトでも、ちゃんとセキュリティレビューを通す。"," 公開する以上、静的サイトでも入力経路はゼロではない（JSON にどう値が入るか、ユーザー操作で何が表示されるか）。「個人サイトだから」と素通りさせず、コミットの後に1コマンドだけ追加するのを習慣にしておくと、後で困らない。",[15,224,225,226,228],{},"1時間ほどの軽い片付けで、未コミット変更を整理し、リモートにプッシュし、セキュリティレビューまで通った。",[19,227,21],{}," が真っ白になった画面を見て、ようやく今日の作業に区切りがついた気がした。",{"title":230,"searchDepth":231,"depth":231,"links":232},"",2,[233,234,235,236,237],{"id":12,"depth":231,"text":13},{"id":36,"depth":231,"text":37},{"id":93,"depth":231,"text":94},{"id":121,"depth":231,"text":122},{"id":203,"depth":231,"text":203},"dev","Astro + Cloudflare Pages で動かしている家族旅行アーカイブの未コミット変更を、機能・カテゴリ別に7コミットへ分割してプッシュ。続けて全変更ファイルにセキュリティレビューをかけた1時間の記録。","md",{},true,null,"/family-trips-commit-security-review-2026-06-22","family-trips",false,"2026-06-22T00:00:00.000Z",{"title":5,"description":239},"2026-06/2026-06-22/family-trips-commit-security-review",[251,252,253,254],"コミット","セキュリティレビュー","git","Cloudflare Pages","9Ee0_zt42gzuh7UB2MoAlSFwrVL5bzEqztiFxUhXKoc",[],"https://log.eurekapu.com/og/blog/family-trips-commit-security-review-2026-06-22.png?v=2026-06-22T00%3A00%3A00.000Z&title=family-trips%20%E3%81%AE%E6%9C%AA%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%A4%89%E6%9B%B4%E3%82%92%E7%B2%92%E5%BA%A6%E3%81%A7%E5%88%87%E3%82%8A%E5%88%86%E3%81%91%E3%81%A6%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E3%80%81%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%82%82%E9%80%9A%E3%81%97%E3%81%9F&author=Kei%20Komatsu&sig=2ad4409616fe5e8f",1782176333597]