[{"data":1,"prerenderedAt":464},["ShallowReactive",2],{"content-/micron-q4-guidance-chart-fix-and-focus-button":3,"all-pages-for-dir":462,"og-image-/micron-q4-guidance-chart-fix-and-focus-button":463},{"id":4,"title":5,"body":6,"category":443,"description":444,"extension":445,"meta":446,"navigation":447,"ogImage":448,"path":449,"project_name":450,"published":451,"publishedAt":452,"seo":453,"stem":454,"tags":455,"todo":448,"unpublished":451,"updatedAt":448,"__hash__":461},"pages/2026-06/2026-06-26/micron-q4-guidance-chart-fix-and-focus-button.md","Micron Q4 FY26 ガイダンスチャートの1Qズレ修正と earnings-dynamics の Focus Quarter ボタン復活",{"type":7,"value":8,"toc":434},"minimark",[9,23,28,39,46,50,61,68,139,142,146,153,164,179,182,186,197,223,229,312,322,326,333,360,370,373,403,406,430],[10,11,12,13,17,18,22],"p",{},"beat-monitoring の自動化に ",[14,15,16],"strong",{},"2本の落とし穴"," を踏み抜いた一日。1つは「forecast の全置換」がやり過ぎて Q3 の実績まで上書きしたバグ、もう1つは「Focus Quarter ボタンが消えた」原因が Turso の ",[19,20,21],"code",{},"report_date"," 4日ズレだったという地味な事故。両方とも make-diary に組み込んで再発を止めた。",[24,25,27],"h2",{"id":26},"koyfin-が朝から繋がった","Koyfin が朝から繋がった",[10,29,30,31,34,35,38],{},"朝イチで Chrome DevTools MCP が動いた。昨日まで「auth_token が見つからない」と Step 0 をスキップしていたのに、",[19,32,33],{},"document.cookie"," から取り直す手順を読み返したら一発で通った。Chrome タブの DevTools Console で ",[19,36,37],{},"document.cookie.split('; ').find(c => c.startsWith('auth_token='))"," を叩いて掴むだけ。",[10,40,41,42,45],{},"そのトークンで 33 銘柄を一括叩いたら全部 200 で返ってきて、Turso に流し込んで NTM PE / EPS が今日の値で更新された。MU は Q3 ビート直後で ",[14,43,44],{},"FY29 EPS が +262% も上方修正"," されていて、コンセンサスが景色ごと書き換わっていた。",[24,47,49],{"id":48},"mu-の-q4-fy26-コンセンサスが古いままだった","MU の Q4 FY26 コンセンサスが古いままだった",[10,51,52,53,56,57,60],{},"Turso 側は最新コンセンサスを持っているのに、",[19,54,55],{},"tripleBeat/MU.json"," の Q4 FY26 のピンクバー（コンセンサス）は古い数字のまま。",[14,58,59],{},"JSON は手書きの SSOT"," なので、Turso が更新されただけでは描画は変わらない。",[10,62,63,64,67],{},"ということで、forecast の四半期だけ Turso から自動上書きするスクリプト ",[19,65,66],{},"apps/web/scripts/update-triple-beat-consensus.mjs"," を新規で生やした。33 銘柄分の forecast 行を順番に舐めて、estimates のフィールドだけ差し替える方針。",[69,70,75],"pre",{"className":71,"code":72,"language":73,"meta":74,"style":74},"language-js shiki shiki-themes vitesse-light vitesse-light","// 方針（疑似コード）\nfor (const ticker of tickers) {\n  const data = readJson(`tripleBeat/${ticker}.json`)\n  for (const q of data.quarters) {\n    if (!q.isForecast) continue       // 実績は触らない\n    const latest = await turso.fetchConsensus(ticker, q.fiscalYear, q.fiscalQuarter)\n    q.estimates = { ...q.estimates, revenue: latest.rev, eps: latest.eps }\n  }\n  writeJson(`tripleBeat/${ticker}.json`, data)\n}\n","js","",[19,76,77,85,91,97,103,109,115,121,127,133],{"__ignoreMap":74},[78,79,82],"span",{"class":80,"line":81},"line",1,[78,83,84],{},"// 方針（疑似コード）\n",[78,86,88],{"class":80,"line":87},2,[78,89,90],{},"for (const ticker of tickers) {\n",[78,92,94],{"class":80,"line":93},3,[78,95,96],{},"  const data = readJson(`tripleBeat/${ticker}.json`)\n",[78,98,100],{"class":80,"line":99},4,[78,101,102],{},"  for (const q of data.quarters) {\n",[78,104,106],{"class":80,"line":105},5,[78,107,108],{},"    if (!q.isForecast) continue       // 実績は触らない\n",[78,110,112],{"class":80,"line":111},6,[78,113,114],{},"    const latest = await turso.fetchConsensus(ticker, q.fiscalYear, q.fiscalQuarter)\n",[78,116,118],{"class":80,"line":117},7,[78,119,120],{},"    q.estimates = { ...q.estimates, revenue: latest.rev, eps: latest.eps }\n",[78,122,124],{"class":80,"line":123},8,[78,125,126],{},"  }\n",[78,128,130],{"class":80,"line":129},9,[78,131,132],{},"  writeJson(`tripleBeat/${ticker}.json`, data)\n",[78,134,136],{"class":80,"line":135},10,[78,137,138],{},"}\n",[10,140,141],{},"走らせると差分が 4 / 12 / 2 / 4 行とコンパクトに収まって、Q4 FY26 のピンクバーが新しい $50.71B を反映。良し、と思って一旦コミットしようとしたところで罠を踏んだ。",[24,143,145],{"id":144},"_1個ずれてるのスクリーンショットが飛んできた","「1個ずれてる」のスクリーンショットが飛んできた",[10,147,148,149,152],{},"ユーザーから画像が貼られてきて、Q3 FY26 の会社ガイダンス（実績ベース）が ",[14,150,151],{},"コンセンサスより低い側にプロットされている"," と指摘された。Q3 はもう発表済みでビート確定なので、ガイドの方が低かったはず（売上 +20% でビート）。チャートの絵が現実と食い違っていた。",[10,154,155,156,159,160,163],{},"原因はスクリプトが「全置換」していたこと。",[19,157,158],{},"q.isForecast"," で弾いているつもりが、Q3 の reported を取りに行く前に ",[14,161,162],{},"estimates をまるごと差し替え"," ていたので、過去 Q の reported とガイダンスの整合が崩れていた。Q4 だけ更新したつもりで Q3 まで踏み抜いていた格好。",[10,165,166,167,170,171,174,175,178],{},"修正は ",[14,168,169],{},"forecast 行に範囲を限定"," するだけ。estimates の差し替えを ",[19,172,173],{},"q.isForecast === true"," の四半期エントリ単位でガードして再実行。Q4 FY26 が 41.83（コンセンサス）/ 50（会社ガイド）/ +20% の整合表示に戻った。コミット ",[19,176,177],{},"11619905","。",[10,180,181],{},"ここで「人間が違和感を拾う係、AI が実装を回す係」のいつもの構図がまた効いた。スクショ1枚で「ズレてる」と言ってもらえなかったら、forecast 行限定のスコープに気付かないまま全銘柄をぐちゃぐちゃにしていた可能性がある。",[24,183,185],{"id":184},"focus-quarter-q4-fy26-のボタンが消えた","Focus Quarter Q4 FY26 のボタンが消えた",[10,187,188,189,192,193,196],{},"差分整合が取れたので earnings-dynamics 側を確認すると、",[19,190,191],{},"/earnings-dynamics/MU"," のページから ",[14,194,195],{},"Q4 FY26 の Focus Quarter ボタンが消えていた","。6/28 でもう Q3 期間が終わったので Q4 のボタンが出ているはずなのに、UI 上は影も形もない。",[10,198,199,202,203,206,207,214,215,218,219,222],{},[19,200,201],{},"MU.ts"," の Q4 FY26 行は存在しているし、",[19,204,205],{},"reportDate"," の算出ロジックを追うと ",[14,208,209,210,213],{},"Turso の ",[19,211,212],{},"eac_periods.report_date"," が null"," で、フォールバックの ",[19,216,217],{},"period_ending + 28日 = 2026-06-28"," で計算されていた。実発表日は 2026-06-24 なので ",[14,220,221],{},"4日ぶん未来側にズレ"," ていて、次Qの windowStart の外側に Q4 が転がり落ちていた。",[10,224,225,226,228],{},"対処は Turso を直接 UPDATE して ",[19,227,21],{}," を実発表日に上書きする一行。",[69,230,234],{"className":231,"code":232,"language":233,"meta":74,"style":74},"language-sql shiki shiki-themes vitesse-light vitesse-light","UPDATE eac_periods\nSET report_date = '2026-06-24'\nWHERE ticker = 'MU' AND fiscal_year = 2026 AND fiscal_quarter = 3;\n","sql",[19,235,236,246,269],{"__ignoreMap":74},[78,237,238,242],{"class":80,"line":81},[78,239,241],{"class":240},"sHkkW","UPDATE",[78,243,245],{"class":244},"sG7-3"," eac_periods\n",[78,247,248,251,254,258,262,266],{"class":80,"line":87},[78,249,250],{"class":240},"SET",[78,252,253],{"class":244}," report_date ",[78,255,257],{"class":256},"stQ0i","=",[78,259,261],{"class":260},"sMJiu"," '",[78,263,265],{"class":264},"sdGka","2026-06-24",[78,267,268],{"class":260},"'\n",[78,270,271,274,277,279,281,284,287,290,293,295,299,301,304,306,309],{"class":80,"line":93},[78,272,273],{"class":240},"WHERE",[78,275,276],{"class":244}," ticker ",[78,278,257],{"class":256},[78,280,261],{"class":260},[78,282,283],{"class":264},"MU",[78,285,286],{"class":260},"'",[78,288,289],{"class":240}," AND",[78,291,292],{"class":244}," fiscal_year ",[78,294,257],{"class":256},[78,296,298],{"class":297},"sM54T"," 2026",[78,300,289],{"class":240},[78,302,303],{"class":244}," fiscal_quarter ",[78,305,257],{"class":256},[78,307,308],{"class":297}," 3",[78,310,311],{"class":244},";\n",[10,313,314,315,318,319,178],{},"走らせて MU.ts を再生成すると、Q4 FY26 のボタンが UI に ",[14,316,317],{},"にゅっと出現"," した。コミット ",[19,320,321],{},"243b7122",[24,323,325],{"id":324},"make-diary-に-step-26-と-105-3e-を埋め込んだ","make-diary に Step 2.6 と 10.5-3e を埋め込んだ",[10,327,328,329,332],{},"今日踏んだ穴を再発させないため、",[19,330,331],{},".claude/commands/make-diary.md"," の手順に2つステップを足した。",[334,335,336,351],"ul",{},[337,338,339,342,343,346,347,350],"li",{},[14,340,341],{},"Step 2.6（beat-monitoring consensus 自動更新）",": Koyfin → Turso 反映の直後に ",[19,344,345],{},"update-triple-beat-consensus.mjs"," を回して、",[19,348,349],{},"tripleBeat/*.json"," の forecast 行を Turso 最新値で同期する",[337,352,353,356,357,359],{},[14,354,355],{},"Step 10.5-3e（report_date 更新）",": 新規決算を反映したら、Turso ",[19,358,212],{}," を実発表日で UPDATE してから earnings-dynamics TS を再生成する",[10,361,362,363,366,367,178],{},"これで朝の ",[19,364,365],{},"/make-diary"," を回すだけで「コンセンサス古いまま」「Focus Quarter ボタン消えた」の2系統が自動で潰れる。コミット ",[19,368,369],{},"be9deb9e",[24,371,372],{"id":372},"学び",[334,374,375,385,397],{},[337,376,377,380,381,384],{},[14,378,379],{},"forecast 自動更新は「範囲限定」が肝","。estimates まるごと差し替えは reported との整合を壊す。",[19,382,383],{},"isForecast === true"," の四半期エントリ単位でガードを掛ける",[337,386,387,178,390,392,393,396],{},[14,388,389],{},"Turso 由来のフォールバックは沈黙して間違える",[19,391,21],{}," が null だと ",[19,394,395],{},"period_ending + 28日"," で勝手に算出されて、UI 上の判定（windowStart 内かどうか）を静かに狂わせる。実発表日が分かったら即 UPDATE",[337,398,399,402],{},[14,400,401],{},"ユーザーのスクショ1枚の重み","。チャートの色とバーの上下関係を人間が見て「これおかしくない？」と言ってくれるから、テストが拾えない論理ズレが浮かぶ。AI で自動化したパイプラインほど、最終アウトプットを目視するレビューを残しておかないと事故が伝播する",[24,404,405],{"id":405},"関連ファイル",[334,407,408,413,419,424],{},[337,409,410,412],{},[19,411,66],{}," — forecast 行限定で Turso からコンセンサスを上書き",[337,414,415,418],{},[19,416,417],{},"apps/web/app/data/earningsDynamics/MU.ts"," — Q3 FY26 の reportDate 修正で Q4 ボタン復活",[337,420,421,423],{},[19,422,331],{}," — Step 2.6 / Step 10.5-3e の追加",[337,425,426,429],{},[19,427,428],{},".claude/commands/update-ticker-quarter.md"," — 既存銘柄に新Q行を1件追加するワークフロー（今回の Q4 行追加と同じパターン）",[431,432,433],"style",{},"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);}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}",{"title":74,"searchDepth":87,"depth":87,"links":435},[436,437,438,439,440,441,442],{"id":26,"depth":87,"text":27},{"id":48,"depth":87,"text":49},{"id":144,"depth":87,"text":145},{"id":184,"depth":87,"text":185},{"id":324,"depth":87,"text":325},{"id":372,"depth":87,"text":372},{"id":405,"depth":87,"text":405},"dev","Koyfin の auth_token を document.cookie から取り直して 33 銘柄一括取得。MU Q3 ビート後のコンセンサスを Turso から自動上書きする仕組みを作ったらバグでズレた話と、Focus Quarter ボタンが消えた原因が report_date 4日ズレだった話。","md",{},true,null,"/micron-q4-guidance-chart-fix-and-focus-button","financial-data",false,"2026-06-26T00:00:00.000Z",{"title":5,"description":444},"2026-06/2026-06-26/micron-q4-guidance-chart-fix-and-focus-button",[456,457,458,459,460],"beat-monitoring","earnings-dynamics","Micron","Koyfin","Turso","8f1qygdhX2KAwyPfXhE_dMD3ef-1FkLyATpjvXbH9-c",[],"https://log.eurekapu.com/og/blog/micron-q4-guidance-chart-fix-and-focus-button.png?v=2026-06-26T00%3A00%3A00.000Z&title=Micron%20Q4%20FY26%20%E3%82%AC%E3%82%A4%E3%83%80%E3%83%B3%E3%82%B9%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88%E3%81%AE1Q%E3%82%BA%E3%83%AC%E4%BF%AE%E6%AD%A3%E3%81%A8%20earnings-dynamics%20%E3%81%AE%20Focus%20Quarter%20%E3%83%9C%E3%82%BF%E3%83%B3%E5%BE%A9%E6%B4%BB&author=Kei%20Komatsu&sig=1489f70d37ee4678",1782528861043]