daily-log

2026年5月19日の開発日記

朝、半導体銘柄の決算データを毎日 Turso に貯めるパイプラインを完成させたくて Chrome 拡張機能+DL の設計から着手した。途中で Workspace 管理ブラウザのファイル名強制リネーム問題にぶつかり、3 時間かけて Claude in Chrome を派遣して原因を追ったあげく、結局「拡張機能経由で DL する手間自体が不要、ダッシュボードが取得している JSON をそのまま受け取れば済む」と気づいて全部捨てた。午後は決算データプラットフォーム上の Estimates Overview ページのデータ取得経路を Chrome DevTools MCP で当てに行き、NVDA / MU / SNDK の決算データを Turso に流し込んで /check-earnings を一発で動く形まで完成させた。並行して教科書 Part 2 のユーザーレビュー対応(CH9 肉付け、Part 跨ぎナビ、SVG 補強)と CFWS の COM 検証 issue の回帰テスト化も片付けた。

今日のタイムライン

タイムライン

今日やったこと

1. データ取得経路を当てに行って /check-earnings を完成させた

朝、当初は Chrome 拡張機能から決算データプラットフォーム上の Actuals & Consensus ページの表をスクレイプして DL する設計だった。Phase 1-A でフロントが叩いているはずの銘柄検索エンドポイントを Chrome DevTools MCP で特定し、3 銘柄の銘柄識別子(KID)を確定。SNDK の KID が他銘柄と違うプレフィックスだと画面の JSON で確認できた瞬間、Codex の事前指摘 B「SNDK は他銘柄と同じプレフィックスじゃない可能性がある」が完全実証された。Phase 1-B で content.js に getTickerId を実装し、Phase 2 でボタン inject と DL 完了監視まで動いたところで Workspace ポリシーのファイル名強制リネーム問題が発覚した。

ユーザーが「本当に欲しいのは Actuals & Consensus じゃなく Estimates Overview の Earnings Matrix」と指摘してくれて、ページを開き直してから DOM 構造を再調査。さらに「拡張機能を完全に外して、ダッシュボードが取得している経路を直接呼べばいいのでは」とアイデアを投げてくれたので、Network タブから Estimates 用のデータ取得経路を特定して Sales/EPS/EPS GAAP が Free アカウントで全件取れることを確認した。MCP の evaluate_script でログイン文脈つきで JSON を一時ファイルに落とし、Python が stdin から JSON を読んで Turso に UPSERT する形まで作り直した。

主な成果:

  • 銘柄検索 / Estimates データ取得 の 2 つの経路を Chrome DevTools MCP で特定
  • NVDA / MU / SNDK 3 銘柄を Turso に取り込み、冪等性も確認(同じ銘柄を 2 回入れても件数は維持)
  • nvidia-guidance-watcher の notify.py に Turso 書き込み機能を追加、3 銘柄 15 行を UPSERT 成功
  • /check-earnings.md を新しいデータ取得経路に合わせて手順書として完成
  • Cloudflare Worker API とフロント書き換えも実装したが、デプロイ&ローカル動作検証はユーザー判断で保留

詳細: 決算データ取得ルートを設計し直して、半導体3銘柄を Turso に流し込む /check-earnings を完成させた


2. Workspace 管理ブラウザの DL ポリシーを 3 時間追いかけて、結局 DL 自体を捨てた

朝のフェーズで Chrome 拡張機能から DL されるファイルが「ダウンロード」に強制リネームされる症状にぶつかった。Claude in Chrome に Workspace 管理コンソール調査のプロンプトを書いて派遣し、SafeBrowsingProtectionLevel=2(厳格)が原因候補と判明したので「セーフ ブラウジングを標準モードで有効にする」に変更してもらった。結果は変わらず(依然「ダウンロード (1)」で保存)。

「困る人ほかにいないのか」と日本語と英語で並列検索させたところ、Anthropic GitHub の Issue #57838 が同じ症状っぽいことが分かった。決定打になったのはユーザー本人の一言で、「同じ拡張機能を Workspace でログインしてない Chrome では確実に動く」と教えてくれた。Workspace 管理対象プロファイル固有の問題と確定。

そこで「そもそも拡張機能経由 DL 自体やめればいい、ダッシュボードが取得している JSON をそのまま受け取ればいい」と気づいた。3 時間の迂回路を顛末書として記録し、Safe Browsing 設定もロールバックして閉じた。

主な成果:

  • Workspace ポリシー JSON を Claude in Chrome 経由で解析、SafeBrowsingProtectionLevel が原因候補と特定
  • Safe Browsing 設定変更でも症状が消えないことを実証
  • 「Workspace ログインしてない Chrome では動く」で原因を確定
  • 拡張機能経由 DL 自体を廃止する根本転換を実施し、ロールバックまで完了

詳細: Workspace 管理ブラウザの DL ポリシーを 3 時間追いかけて、結局 DL 自体を捨てた顛末


3. 教科書 Part 2 のユーザーレビュー対応と CFWS 回帰テスト化

朝、5/18 の積み残しメモから着手。CFWS の COM 検証 issue(#3, #4)を最新生成ファイルで再確認したら再現せず。「これだからテスト書いてるってことですよね。だから全部やったらいいんじゃないですか」とユーザーが判断したので、Dropbox 配下の最新 CFWS を全部 smoke test で回す回帰テストを追加し、issue をクローズした。pytest と verify_cfws_excel.py の sys.stdout 上書きが capture と衝突した件は __main__ 内に副作用を隔離して解決、3 passed。

その後、教科書 Part 2 のユーザーレビュー対応を順次実施。implementation-notes.html に作業ログを残しながら進めた。CH9 を 5,020 → 7,890 字に肉付けし、CH7 ↔ CH8 の Part 跨ぎナビを pager--part-transition バッジで追加。最後の SVG 補強では highlight:null 問が 59 問あったが、新規 SVG を作らず「既存 figure の highlight キーに問を割り当てる」方針に転換し、サブエージェント 3 並列で TS ファイル単位に分担させた。それでも図がつかなかった問について「ふさわしくないということ?」と聞かれて、理由 A(既存 figure の対比軸とクイズの論点軸が一致しない)と理由 B(そもそも対応するデータが存在しない)に分けてドキュメント化した。

主な成果:

  • CFWS COM 検証 issue を回帰テスト化してクローズ、pytest 3 passed
  • CH9 本文字数を指示書の目安範囲内(6,500-8,500 字)に着地させた
  • CH7 ↔ CH8 の Part 跨ぎナビをバッジ付きで実装、両方向で動作確認
  • Part 2 SVG 補強をサブエージェント 3 並列で実施、figure 流用方針で 59 問のうち補強できる問を網羅
  • figure 非表示問の判断(軸ズレ / データ不存在)を implementation-notes.html §3-4 に言語化

詳細: 教科書 Part 2 のユーザーレビューに順次対応:CFWS 回帰テスト化と figure 流用の判断


今日の試行錯誤

#テーマ試したこと結果気づき
1Chrome 拡張機能から決算データを DLcontent.js でボタン inject + DL 完了監視まで実装動作したが Workspace ポリシーでファイル名「ダウンロード」に強制リネームUI 経由の DL は Workspace 管理プロファイルで死ぬ
2Workspace ポリシーで SafeBrowsing を緩めるClaude in Chrome に管理コンソール調査を派遣、標準モードに変更症状は消えずSafeBrowsing は犯人じゃなかった
3拡張機能経由 DL 自体をやめるダッシュボード裏のデータ取得経路を Chrome DevTools MCP で特定Sales/EPS/EPS GAAP の fy0-fy3 + fq1-fq11 が Free アカウントで全件取れた「DL する」発想を捨てれば Workspace ポリシー問題は消える
4Actuals & Consensus と Estimates Overview の取り違え最初は Actuals & Consensus ページの表をスクレイプしていたユーザー指摘で Earnings Matrix が本命と判明ページが違うとデータ取得経路も DOM も全部違う
5SNDK の KID が他銘柄と同じプレフィックスじゃない疑い(Codex 指摘 B)銘柄検索の経路で確認プレフィックスが他銘柄と違うことが画面の JSON で実証プレフィックス決め打ちの実装にしなくて済んだ
6CFWS の COM 検証 issue #3, #4 が再現するか確認最新の生成済みファイルで verify を回した全 check=0 OK で再現せず直っていたなら回帰テストで固定化する
7pytest が verify_cfws_excel.py で capture と衝突sys.stdout の上書きが原因__main__ 内に副作用を隔離して 3 passed純粋関数とエントリポイントを分けるルールがそのまま効いた
8Part 2 SVG 補強を 1 枚ずつ新規作成59 問分の新規作成は重い既存 figure の highlight キーに問を割り当てる方針に転換「同じ figure が別の論点を支える」発想で大半が片付く

今日の学び

  • Workspace 管理ブラウザの UI 制約は迂回しない、設計を変える: Workspace ポリシーで挙動が変わるなら、UI 経由のフローは諦めて API 直叩きに切り替えるのが最短ルート。
  • 「Codex の事前指摘が実装中に実証される」体験は強力: SNDK の KID プレフィックス問題は Codex がレビューで指摘してくれていたので、決め打ち実装を回避できた。レビューは「将来のバグ」を 1 ラウンドで潰す。
  • issue を「直したら回帰テストに固定化」する運用が効く: COM 検証 issue は最新ファイルで再現しなかったが、テストとして固定化したことで再発したら即気づける。issue クローズと同時にテスト追加が習慣化できそう。
  • Figure 流用の判断は「対比軸」で決まる: 教科書の図を流用するかどうかは、問の論点軸と図の対比軸が一致しているかで決まる。新規作成は最後の手段。

関連記事