開発financial-data

朝、Chrome 拡張機能から JSON を落とそうとしたら、ファイル名がぜんぶ「ダウンロード」に書き換えられて Downloads/ 直下に積み上がっていた。気持ち悪いので原因を潰しに行ったら、結果として 3 時間溶かして「そもそも拡張機能経由でファイルを落とす意味がなかった」という結論にたどり着いた、無駄な迂回路の記録。

発端 — ファイル名が「ダウンロード」に強制リネームされる

朝の earnings-dynamics-poc の作業で、拡張機能から銘柄ごとの JSON を保存しようとした瞬間に気づいた。本来 mu-earnings-2026-05-19.json のような名前で落ちるはずのファイルが、全部 ダウンロード.jsonダウンロード (1).jsonダウンロード (2).json で積まれていく。Downloads フォルダを開いて 5 秒で「これは個人 Chrome では起きていない挙動だ」と判断した。

仕事マシンの Chrome は Google Workspace 管理コンソール配下に置いている。直感で「Workspace 管理ブラウザの DL ポリシーが拡張のファイル名を握り潰している」と決めつけた。後から振り返るとここで決めつけたのが時間を溶かす入り口だった。

Claude in Chrome に管理コンソール調査を派遣する

Workspace 管理コンソールは設定項目が多くて、手探りで触ると 1 時間が溶ける。なので Claude in Chrome に作業を投げることにした。Claude Code 側に「コピペで使える調査プロンプトを書いて」と頼み、Claude in Chrome へ管理コンソールの調査作業を委任した。

派遣した内容はざっくり次の通り。

  • chrome://policy をダンプして JSON で返す
  • Workspace 管理コンソール側の Chrome ブラウザ設定を一通り確認する
  • ダウンロード関連・Safe Browsing 関連の項目を優先度順に列挙する

Claude in Chrome が chromeMetadata 付きのポリシー JSON を吐いて返してきた。それを Claude Code に流し込んで解析させると、容疑者として SafeBrowsingProtectionLevel: 2 が浮上した。Workspace 側で「セーフ ブラウジングを保護強化機能で有効にする」が効いていて、拡張機能の chrome.downloads.download API の挙動に干渉しているのでは、という線。

Safe Browsing を「標準モード」に下げる — 効果ゼロ

Claude in Chrome に「セーフ ブラウジングを標準モードに変更して保存」と指示。スクリーンショット付きで保存前確認まで上がってきたので、Yes を返してポリシーを書き換えた。SafeBrowsingProtectionLevel: 2 → 1 への遷移を chrome://policy で検証して、変更は確実に反映された。

Claude Code 側に変更内容と画面キャプチャを memo に書き残させてから、拡張機能で再度 JSON を保存。

結果、ファイル名は 「ダウンロード (1)」のまま。Downloads/ 直下に出る挙動も変わらない。Safe Browsing は犯人ではなかった。Claude in Chrome が前段で「非表示の Inherited Policy がある可能性」と書いていた説明も、ポリシーダンプを照らし合わせると事実と整合しない。容疑者を 1 つ潰しただけで、本丸は別だった。

「困る人ほかにいないのか」で英日並列検索

ここで戦略を切り替えた。Claude Code に「英語と日本語の両方で並列検索して。同じ症状で困っている人を探して」と投げた。並列で走らせた検索の中から、Anthropic の GitHub Issue #57838 が同症状っぽいことが見えてきた。Chrome 拡張機能(Claude for Chrome)側の MV3 + Blob 実装に問題があるのでは、という線が浮上する。

Codex にも同時に調査を投げて、Claude Code 自身も並列で公式トラブルシューティングを当たらせた。複数の情報源を突き合わせていくと、

  • Workspace ポリシー単独で説明できる症状ではない
  • Claude 拡張側の MV3 実装にバグの匂いがする
  • ただし「Workspace 環境固有」と切り分けられた事例はまだ少ない

という、犯人が複数候補のまま残る曖昧な状況になった。

決定的情報 — 「Workspace ログインしてない Chrome では動く」

ここで自分から確定情報を投入した。手元には Workspace ログインなしの素の Chrome プロファイルがあり、同じ拡張機能で同じ操作をすると、ファイル名は正しく付いて落ちる。これは確実に再現する。

この一言で容疑者は絞れた。Claude 拡張の MV3 バグ単独説は脱落する。再現条件が「Workspace 管理プロファイルかどうか」で完全に切り分かるなら、Workspace 管理対象プロファイル固有の何かが拡張のファイル名指定を握り潰している、で確定。

ただし Safe Browsing は既に下げて再現しているので、犯人は別のポリシー。Workspace 管理コンソールには無数のスイッチがあって、ここから 1 つずつ潰しに行くと半日が消える。

「そもそも拡張機能経由で DL させる必要がない」

ここで自分の手が止まった。冷静に考え直す。

拡張機能経由で JSON を落としているのは何のためか。中身はダッシュボード裏で動いているデータ取得経路が返す JSON で、拡張機能はそれをただファイル化しているだけ。であれば、そもそも拡張機能のダウンロード API を通す必要がない。同じデータ取得経路を別の手段で呼んで JSON を受け取れば、Workspace ポリシーも MV3 バグも全部関係なくなる。

「拡張機能経由で DL させる手間自体が無意味、JSON はもう取れているんだから、拡張機能を通すのをやめる」と判断した。Claude Code に拡張機能経由 DL の経路を廃止させ、ブラウザのログイン文脈を借りて JSON を受け取る経路へ作り替えさせた。

ロールバック — 変更したポリシーを元に戻す

廃止が決まったので、迂回路で触った設定は戻すべき。Safe Browsing を標準モードに下げたまま放置しても、業務影響は小さいけれど、原因究明のためだけに触った設定を残すと、後で別の調査をするときに前提が汚れる。

Claude in Chrome に「セーフ ブラウジングを未設定に戻して保存」のロールバック指示書を渡して実行。chrome://policySafeBrowsingProtectionLevel がポリシー未適用の状態に戻ったことを確認して、両方のドキュメント(変更記録と顛末書)にロールバック完了の記録を追記した。

この迂回路から拾った教訓

  • 拡張機能のファイル名問題を「Workspace ポリシーが犯人」と決めつけて 3 時間溶かした
  • Safe Browsing を 1 段下げても症状は消えなかった。容疑者を 1 つ潰すたびに別の容疑者が増える展開
  • 最後に効いたのは「Workspace なし Chrome では動く」という再現条件の切り分け
  • でも本当の解決は「拡張機能経由 DL 自体をやめる」という根本転換
  • ポリシーで戦うより、経路を 1 本減らす方が早い

UI 経由のエクスポート機能でハマったときは、UI の挙動を直しに行く前に「そもそもダッシュボード裏でデータ取得経路が動いているから、それを別の手段で借りられないか」を先に検討する。これが今日一番の収穫。

税理士・会計士視点での応用

業務クラウド SaaS(会計ソフト A / B / C)のエクスポート機能でファイル名や形式が思い通りにならないとき、UI のダウンロードボタンや拡張機能と格闘するより、ブラウザの DevTools でダッシュボードが取得している JSON を確認して、そのデータをそのまま受け取る経路に切り替える方が早い。公式 API トークンを発行できるサービスなら、最初から公式 API でスプレッドシートや会計データを引き抜く構成を組んだ方が、月次の繰り返し作業で時間が返ってくる。