[{"data":1,"prerenderedAt":364},["ShallowReactive",2],{"content-/oshieru-sansu-pr58-postmerge-review":3,"all-pages-for-dir":341,"related-/oshieru-sansu-pr58-postmerge-review":342,"og-image-/oshieru-sansu-pr58-postmerge-review":363},{"id":4,"title":5,"body":6,"category":321,"concepts":322,"description":323,"extension":324,"meta":325,"navigation":326,"ogImage":322,"path":327,"project_name":328,"published":329,"publishedAt":330,"seo":331,"source":332,"stem":333,"tags":334,"todo":322,"unpublished":329,"updatedAt":322,"__hash__":340},"pages/2026-06/2026-06-13/oshieru-sansu-pr58-postmerge-review.md","oshieru-sansu PR #58 マージ後レビューと内角の丸めバグ修正",{"type":7,"value":8,"toc":313},"minimark",[9,13,18,30,38,51,57,61,68,71,82,85,89,92,123,130,229,232,235,238,255,266,269,276,279,282,309],[10,11,12],"p",{},"朝5時45分、トレッドミルに乗りながら「昨日の積み残しを調べて」とClaude Codeに振ったところから始まった。",[14,15,17],"h2",{"id":16},"引き継ぎメモを読む-すでにマージ済みと判明","引き継ぎメモを読む → すでにマージ済みと判明",[10,19,20,21,25,26,29],{},"昨日（2026-06-12）の ",[22,23,24],"code",{},"memo/2026-06-12/"," を漁ってもらったら ",[22,27,28],{},"tokibo-handover.md"," と oshieru-sansu のセクション図解化ToDoメモが出てきた。「メインの積み残し: oshieru-sansu のセクション図解化」という見出しで、PRを立てて寝た記憶がうっすら蘇る。",[10,31,32,33,37],{},"「プルリクエストはあって、マージしたんですよ。だからそれを統合してほしい」とお願いしたら、リモートとローカルの状態を確認してきて、結論は",[34,35,36],"strong",{},"統合作業は不要","だった。",[39,40,41,45,48],"ul",{},[42,43,44],"li",{},"PR #58 はすでにマージ済み",[42,46,47],{},"ローカルの master は別プロセスが pull 済みで、マージコミットまで進んでいた",[42,49,50],{},"ローカルテスト76件もそのまま pass",[10,52,53,56],{},[22,54,55],{},"git pull"," すら走らせる必要がなかった。引き継ぎメモ通りに進めようとして空振りするのはよくあるが、今回は何もしなくていい方向の空振りだったので得した気分になった。",[14,58,60],{"id":59},"_3エージェント並列でpr-58-をレビュー","3エージェント並列でPR #58 をレビュー",[10,62,63,64,67],{},"統合が済んでいると分かったので「内容もちょっとレビューしてほしい」とお願いした。",[22,65,66],{},"/review"," スキルで進めてもらい、3エージェント並列で全42ファイルを舐めさせた。",[10,69,70],{},"レビュー結果は以下の通り。",[39,72,73,76,79],{},[42,74,75],{},"クリティカルな問題なし",[42,77,78],{},"修正を検討してもよい指摘1件（歩合の説明文の表現）",[42,80,81],{},"軽微な指摘2件",[10,83,84],{},"マージ済みのままで実害はないが、3件とも直しておく方針にした。",[14,86,88],{"id":87},"内角の合計が181になる丸めバグ","内角の合計が181°になる丸めバグ",[10,90,91],{},"3件の中で一番効いたのが、三角形の内角を表示するロジックの丸めバグだった。",[10,93,94,95,98,99,102,103,106,107,110,111,114,115,118,119,122],{},"各内角を ",[22,96,97],{},"Math.round()"," で整数化して画面に出していたが、たとえば実値が ",[22,100,101],{},"60.4°, 60.4°, 59.2°"," のとき、丸めると ",[22,104,105],{},"60°, 60°, 59°"," となり合計 ",[22,108,109],{},"179°","。逆方向だと ",[22,112,113],{},"60.6°, 60.6°, 58.8°"," → ",[22,116,117],{},"61°, 61°, 59°"," で合計 ",[22,120,121],{},"181°"," になる。三角形の内角の和は180°であることを教える教材なのに、表示上は180°にならない瞬間が出てしまっていた。",[10,124,125,126,129],{},"これは画面を見て違和感を拾えば一発で気づくタイプのバグで、レビューエージェントが代わりに気づいてくれたのが助かった。修正方針は単純で、3つ目の角度を ",[22,127,128],{},"180 - 残り2つ"," で算出して整合性を担保した。",[131,132,137],"pre",{"className":133,"code":134,"language":135,"meta":136,"style":136},"language-ts shiki shiki-themes vitesse-light vitesse-light","// 3つ目の角を引き算で出して、合計が必ず180°になるようにする\nconst a = Math.round(angleA)\nconst b = Math.round(angleB)\nconst c = 180 - a - b\n","ts","",[22,138,139,148,182,205],{"__ignoreMap":136},[140,141,144],"span",{"class":142,"line":143},"line",1,[140,145,147],{"class":146},"sxvE3","// 3つ目の角を引き算で出して、合計が必ず180°になるようにする\n",[140,149,151,155,159,163,166,169,173,176,179],{"class":142,"line":150},2,[140,152,154],{"class":153},"stQ0i","const ",[140,156,158],{"class":157},"s4oTP","a",[140,160,162],{"class":161},"shFtX"," =",[140,164,165],{"class":157}," Math",[140,167,168],{"class":161},".",[140,170,172],{"class":171},"senZ8","round",[140,174,175],{"class":161},"(",[140,177,178],{"class":157},"angleA",[140,180,181],{"class":161},")\n",[140,183,185,187,190,192,194,196,198,200,203],{"class":142,"line":184},3,[140,186,154],{"class":153},[140,188,189],{"class":157},"b",[140,191,162],{"class":161},[140,193,165],{"class":157},[140,195,168],{"class":161},[140,197,172],{"class":171},[140,199,175],{"class":161},[140,201,202],{"class":157},"angleB",[140,204,181],{"class":161},[140,206,208,210,213,215,219,222,224,226],{"class":142,"line":207},4,[140,209,154],{"class":153},[140,211,212],{"class":157},"c",[140,214,162],{"class":161},[140,216,218],{"class":217},"sM54T"," 180",[140,220,221],{"class":153}," - ",[140,223,158],{"class":157},[140,225,221],{"class":153},[140,227,228],{"class":157},"b\n",[14,230,231],{"id":231},"残り2件と軽微な改善",[10,233,234],{},"残り2件は表示文の表現修正と、レビュー指摘の任意改善3点（リファクタリングレベル）。歩合の説明文が誤読を招きそうな書き方になっていたので、教材としてもう一段優しい表現に直した。",[10,236,237],{},"修正後にテストを流して76件 pass を確認。コミットは以下の3本に分けた。",[39,239,240,245,250],{},[42,241,242],{},[22,243,244],{},"73f43fc3 fix(oshieru-sansu): PR #58マージ後レビューの指摘3件を修正",[42,246,247],{},[22,248,249],{},"e3907083 fix(oshieru-sansu): 内角表示の丸めで合計が181°になる矛盾を解消",[42,251,252],{},[22,253,254],{},"b63b2ed2 refactor(oshieru-sansu): レビュー指摘の任意改善3点を反映",[10,256,257,258,261,262,265],{},"修正系を ",[22,259,260],{},"fix:"," 、任意改善を ",[22,263,264],{},"refactor:"," に分けて、後でログを見たときに「これは挙動が変わったやつか、整形だけか」が一目で分かるようにした。",[14,267,268],{"id":268},"進捗管理メモも更新",[10,270,271,272,275],{},"「日記の分もコメントしておいてください。あと進捗管理のMarkdownがあれば、進捗更新しておいて」とお願いして、引き継ぎメモのチェックボックスを ",[22,273,274],{},"[x]"," に更新してもらった。",[10,277,278],{},"引き継ぎメモはマージで更新された後の最新版を読み直してから追記するよう指示が必要だった。寝起きでバックグラウンドの pull に気づかず古い状態を上書きするとマージコンフリクトを生む典型パターンなので、ここは慎重に進めた。",[14,280,281],{"id":281},"学び",[39,283,284,290,300],{},[42,285,286,289],{},[34,287,288],{},"マージ済みPRのレビューは結構効く",": マージ後に冷静に並列レビューすると、レビュー時に気づかなかった粒度のバグが出てくる。「マージしたら終わり」ではなく、翌朝にレビューを回す運用は悪くない",[42,291,292,295,296,299],{},[34,293,294],{},"整数の表示は合計の整合性に注意",": 教材系で「合計が一致する」ことを教えるなら、表示も合計が一致する設計にする。",[22,297,298],{},"Math.round"," を個別に当てると壊れる",[42,301,302,305,306,308],{},[34,303,304],{},"作業前に最新の状態を読み直す",": 引き継ぎメモを更新する前に、別プロセスが触っていないか念のため再読する。寝ている間に裏で ",[22,307,55],{}," が走っているケースがある",[310,311,312],"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 .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);}",{"title":136,"searchDepth":150,"depth":150,"links":314},[315,316,317,318,319,320],{"id":16,"depth":150,"text":17},{"id":59,"depth":150,"text":60},{"id":87,"depth":150,"text":88},{"id":231,"depth":150,"text":231},{"id":268,"depth":150,"text":268},{"id":281,"depth":150,"text":281},"dev",null,"前日積み残しの図解化PRがすでにマージ済みと判明。3エージェント並列でレビューしたら、内角表示の合計が181°になる丸めバグを含む3件の指摘が出てきたので修正してテスト76件をpassさせた。","md",{},true,"/oshieru-sansu-pr58-postmerge-review","mdx-playground",false,"2026-06-13T00:00:00.000Z",{"title":5,"description":323},"make-diary","2026-06/2026-06-13/oshieru-sansu-pr58-postmerge-review",[335,336,337,338,339],"oshieru-sansu","code-review","bug-fix","git","PR","ORqvMKbuRh81OsiocmV8o14i1574DjD4ibe4Trz3WIE",[],[343,347,351,355,359],{"title":344,"path":345,"publishedAt":346},"ブランチ跨ぎでmemoが消えたと焦った話。stash→branch切替→マージ→PR作成までを順次実行","/2026-05-03-git-stash-branch-merge-workflow","2026-05-03T00:00:00.000Z",{"title":348,"path":349,"publishedAt":350},"GitHub Issue・PR の正しいワークフロー","/github-issue-pr-workflow","2025-11-01T00:00:00.000Z",{"title":352,"path":353,"publishedAt":354},"Claude Code の設定バックアップが8日間止まっていた原因と、WindowsとMacで設定を分離する計画","/dotclaude-sync-failure-and-host-split","2026-08-09T00:00:00.000Z",{"title":356,"path":357,"publishedAt":358},"壊れて見えた投稿ヒートマップと、別マシンに置き去りだった10コミット","/blog-heatmap-and-stale-branch","2026-08-03T00:00:00.000Z",{"title":360,"path":361,"publishedAt":362},"Search Console効果測定で未登録5,030件の主因を特定し、デプロイエラーまで片付けた日","/search-console-audit-and-deploy","2026-07-04T00:00:00.000Z","https://log.eurekapu.com/og/blog/oshieru-sansu-pr58-postmerge-review.png?v=2026-06-13T00%3A00%3A00.000Z&title=oshieru-sansu%20PR%20%2358%20%E3%83%9E%E3%83%BC%E3%82%B8%E5%BE%8C%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A8%E5%86%85%E8%A7%92%E3%81%AE%E4%B8%B8%E3%82%81%E3%83%90%E3%82%B0%E4%BF%AE%E6%AD%A3&author=Kei%20Komatsu&sig=8e4814a632308a1b",1786424458296]