開発mdx-playground

Micron Q3 FY26 決算をbeat-monitoringとearnings-dynamicsに手作業で反映した記録

2026年6月24日(米国時間)にMicronがFY26 Q3決算を発表した。翌朝の/make-diaryから流れで/check-earningsに入ったところで、Chrome DevTools MCPが繋がらずKoyfinのStep 0がスキップになった。コンセンサスが当日取れない状態で、/beat-monitoring/MUのチャートにQ3実績$41.5Bを手で流し込み、/earnings-dynamics/MUのQ4 FY26ボタンが出ないバグを潰し、ついでに以前から気になっていたバー並び順とdivider lineの違和感を一気に直した。最後にIRサマリーカードを新規ページとして切り出し、Micron公式IRのPrepared Remarks PDFまで貼り直した。

Koyfin Step 0が落ちた状態でのMU手動更新

朝の/check-earningsはSEC EDGARでMUのQ3 FY26決算を検知したが、Chrome DevTools MCPがmcp__chrome-devtools__*を一切ロードしてくれず、Koyfinスナップショット取得(Step 0)がスキップ。SECの8-Kとプレスリリースから実績数字を手で拾い直した。

  • Revenue: **41.5B** vs コンセンサス 35.84B(+16%)、会社ガイド $33.5B(+24%)
  • 粗利率: 84.9%
  • Non-GAAP EPS: $25.11
  • Q4 FY26 ガイダンス: 売上 50B ± 1B、粗利率 約86%、EPS 31 ± 1

このQ3実績行をMU.jsonに上書きし、Q4 FY26を予測行として追加した。

Q3予想$47.39Bをユーザー指示で手で上書き

Koyfinが落ちているのでFY27 Q1(= Q4 FY26のガイド対象)のコンセンサスが取れない。ユーザーから「とりあえず47.39を入れといて」と指示が来て、Q4 FY26行のガイダンス欄(= ガイド対象 Q1 FY27)のコンセンサスをn/a$47.39Bに書き換えた。EPSは前日Koyfinから$27.63が取れていたのでそちらを採用。

triple-beat-guidance-target.mdルールに沿って、ガイドチャート側はX軸が「ガイド対象Q」になっていることを確認しながら触った。

earnings-dynamics/MUのQ4ボタンが出ないバグ

/earnings-dynamics/MUを開いたら、Q4 FY26のボタンが出ていない。最初はreportedが無いせいだと当たりをつけて、MU.tsのQ3 FY26に手でreportedを追加した。それでもQ4ボタンが出ない。

原因を追ったら、buildFocusQuartersの中でestimateの直近スナップショットが「Q4 FY26のwindow内」に存在しないと、その四半期はfocusQuartersから外される仕様だった。最新のestimateが2026-06-23まで、Q4 FY26のwindowStart2026-06-29以降。間に入っているestimateが無いから、Q4 FY26がフィルタで弾かれていた。

対処は2つを並行で。

  1. Q3 FY26のreportDateを実発表日(2026-06-24)に更新
  2. Q4 FY26のestimates2026-06-25のダミースナップショット(前日値と同値)を追加

これでwindow判定が通り、Q4 FY26ボタンが出るようになった。コミット0df4babd

バー並び順を「予想→ガイダンス→実績」に変更

EPSチャートを見たユーザーから「通常左が予想、右が実績だよね?ガイダンスが左に来てるのおかしい」と指摘。EarningsChart.vue(実体はBeatExpectationsChart.vue)の中で、3本パターン・2本パターン両方のバー順序を組み替えた。

  • 旧: ガイダンス → 予想 → 実績
  • 新: アナリスト予想(左・グレー)→ 会社ガイダンス(中/右・ピンク)→ 実績(右・ダーク)

凡例も同じ順序に揃えた。コミット5351f2c5

Divider lineを「最後の実績Qの右端」に変更

「実績 ← | → 予想」の縦の区切り線が、EPSには出ているのにRevenueには出ないという報告が来た。dividerXのロジックを読んだら、findIndexで「最初にreportedが無いQ」を探していて、Revenueの先頭3つ(Q3 FY25 / Q4 FY25 / Q1 FY26)にreportedが無いとindex 0が返ってfirstFutureIdx <= 0nullを返す形になっていた。EPSは全Qにreportedがあるので問題が顕在化していなかった。

直し方は逆方向に。findIndexをやめて、forEachで「最後にreportedを持っているQ」のインデックスを拾い、その右端をdivider Xにした。これで銘柄ごとのreported充足状況に依存せずに線が引ける。コミットa69c9792

// 旧: 「最初の予想Q」を探す → reported歯抜けで死ぬ
const firstFutureIdx = series.findIndex(s => !s.reported)

// 新: 「最後の実績Q」を探す → 歯抜けでも死なない
let lastReportedIdx = -1
series.forEach((s, i) => { if (s.reported) lastReportedIdx = i })

アナリスト予想と将来予想を統合

凡例とバーで「アナリスト予想(グレー)」と「将来予想(薄いグレー)」が別カテゴリになっていたが、Q-by-Q時点では同じ意味のメトリクスなのでまとめてしまった。凡例から「将来予想」を消し、バーは全部「アナリスト予想」に寄せた。コミット690cebc9

MicronFy26Q3SummaryCard.vue 新規作成 → ページ分離

/beat-monitoring/MUの末尾にQ3 FY26のIRサマリーカードを置きたいというリクエスト。MicronFy26Q3SummaryCard.vueを新規作成して、[ticker].vueの末尾にMU専用の差し込みを入れた。

途中で「カード1個にカンファレンスコール全部詰めると重すぎるね」となり、方針変更。

  • /beat-monitoring/MU/fy2026-Q3に詳細ページを切り出し
  • /beat-monitoring/MUからはそこへのリンクだけ残す
  • カード本体はSVG 5点(SCA構造図、需要側の階段、HBMロードマップ等)+ Prepared Remarks引用 + CFO発言詳細という構成

Codex CLIにレビューさせたら、SVGはみ出しとnavigateTo名前衝突を含めて3件の致命的指摘が返ってきたので全部潰した。

ソースをThe TranscriptからMicron公式IRのPrepared Remarks PDFに差し替え

初版のカンファレンスコール引用は、The Transcript(@TheTranscript_)のTwitter抜粋から取っていた。ユーザーから「NVIDIAの時に同じ人が原文使ってたよね?The TranscriptのTwitter抜粋は厳密には原文じゃない」と指摘。

NVIDIAの過去記事を確認したらMotley Foolが原文ソースだった。Micron Q3 FY26はMotley Foolにまだ無く(決算翌日のタイムラグ)、Micron公式IRサイトに "Fiscal Q3 2026 Earnings Call Prepared Remarks" PDF(11ページ)があったのでこれを正とした。

curlがWindows環境で詰まったのでPowerShellのInvoke-WebRequestでPDFを直接落として、5トピックのquoteを公式原文に置き換え。同時にファクトエラーが2つ判明した。

  • 「Open Floor / Nemo Flow」(Twitter抜粋)→ 正しくは「OpenClaw / NemoClaw
  • 売上数字を$41.5B(公式表記)に統一

SCA「5年契約 1→7件」のファクト確認と16件表記訂正

ユーザーから「カード内SVGに『16件』って書いてるけど、Gene Munsterのツイートでは『1→7件』って言ってるよ。どっちが正しい?」と指摘。

x-searchでファクトを引き直したら 両方とも正しい ことが分かった。

  • 16件: 全SCA契約の総数(5年契約 + 3年契約の合計、CFO Mark Murphyの発言ベース)
  • 1→7件: 5年契約だけに絞った前期→今期の増分(Gene Munsterのツイート、Q&Aセクションからの引用と思われる)

「最も過小評価されているデータポイント」がこの 5年契約だけで7倍 という構造だったので、SVG #1(SCA全体像)を「5年契約 / 3年契約」の内訳が見える構造に作り直し、需要側の階段SVG(基本車1× / L2+ 5× / ヒューマノイド 50×)も高さを厳密比例で書き直した。ソースリストにMunsterツイートを追加。

振り返り

Koyfin取得が落ちた状態でも、SEC 8-K + x-searchの突き合わせで実績数字は手で詰められる、というワークフローを今回証明できた。一方でearnings-dynamicsのfocusQuartersフィルタは、決算翌日にestimate snapshotが存在しないと該当Qが見えなくなる、という落とし穴があった。/make-diary Step 10.5に「reportDate更新 + estimatesダミー追加」を組み込んだので、次回MU決算の朝はもう少しスムーズに通るはず。

カードコンポーネントのソース差し替えは、これからも「The TranscriptのTwitter抜粋 → 公式Prepared Remarks PDF」を標準パターンにしたい。Micron / NVIDIA / SK Hynixあたりは公式IRに必ずPDFが上がる。