きっかけ:月次売上の数字を見て手が止まった

朝、/memory-makers/elite-material のページを開いて月次売上高のテーブルをスクロールしたところで、目が引っかかった。AI サーバー向け CCL(銅張積層板)の最大手としては桁が合わない。100億NT$台の月もあれば、別の月は別のレンジに振れている。台光電子(2383.TW)の決算リリースで見ていた数字の感触と合わない。

Claude Code に「月次売上高、数字が違う気がする。もう一回調べて」と投げた。

調査:表示されていたのは「同欣電子」だった

データファイル・生成スクリプト・valuationSnapshot を順に確認させたら、結論はあっけなかった。

ページに出ていた数字は Elite Material(台光電子、2383.TW)ではなく、全くの別会社「同欣電子(Tong Hsing、6271)」のものだった。 ティッカーの取り違えが根本原因。

memory-makers の生成パイプラインは FinMind と Turso からティッカー指定でデータを引いてくる。どこかでティッカーが 6271 のまま Elite Material のスロットに流し込まれていた。月次・四半期・valuation の3経路すべてが同じティッカーを参照していたので、ページ全体が同欣電子の数字で埋まっていた格好。

修正:洗い出し → 取り違えの波及範囲を潰す

修正の段取りはこんな流れで進めてもらった。

  • 関連箇所の取り違えが他銘柄にも広がっていないか全体を grep で洗い出し
  • 生成スクリプトを読んで、Turso と FinMind のどちらから取るルートかを確認
  • valuationSnapshot の生成スクリプトも合わせて確認(株価・倍率まで取り違えていないか)
  • 取り込み完了を待つ間に、データを参照しているユニットテストの有無を確認
  • 新しい eliteMaterialMonthlyRevenue.ts を再生成して中身を確認
  • tripleBeat/valuation.ts への取り違え波及がないか確認

最終的に全テスト pass、dev サーバーでページを開いて表示が正しい台光電子のデータに置き換わっていることを目視で確認した。

修正後の正しい数字

  • 月次: 2026-05 売上 156.2 億NT$、YoY +114.6%
  • 四半期: 1Q26 売上 330.67 億NT$、EPS 14.9

AI サーバー向け CCL 最大手の実態にきちんと合うレンジに収まった。最初に違和感を持ったときの「桁が違う」感覚が、ここでようやく裏付けられた。

学び:画面の数字を見て違和感を拾うのは人間の役目

今回も構図は同じだった。

  • 人間の係:画面に出てる数字を見て「これ違うぞ」と気づく
  • AI の係:取り違えの根本原因を辿って、波及範囲を洗い出して、修正してテストまで通す

データ生成パイプラインを AI に任せると、ティッカー1つの取り違えで25銘柄丸ごと壊れる事故が普通に起きる。テストはコードの整合性は守ってくれるが、「6271 と 2383 のどちらが Elite Material か」という意味の正しさは守ってくれない。

ページを開いて数字を見て「桁が違う」と気づける目が、データ品質の最後の防波堤になる。今回は AI サーバー向け CCL 最大手という事業特性のおかげで、桁の違和感が拾えた。マイナーな銘柄だったら気づけずに本番反映していた可能性は普通にある。

再発防止のメモ

  • 新規銘柄を追加したときは、ティッカー → 会社名 → 月次売上の桁感、を1回だけ目視で突き合わせる
  • valuationSnapshot 生成時のティッカー指定を、データの「source of truth」として固定する仕組みを後で考える
  • 月次売上の YoY が極端な値(今回は +114.6%)のときは、まず取り違えを疑う