きっかけ:月次売上の数字を見て手が止まった
朝、/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%)のときは、まず取り違えを疑う