daily-log

2026年5月27日の開発日記

朝から、起動するたびに固まるツールに足を止められた。「still connecting」の文字が点滅したまま、ブラウザを操る道具が一切生えてこない。数日前から続いていたこの詰まりの真因を、思い込みを一枚ずつ剥がして掘り当てたのが今日の入口だった。そこから先は、散らばっていたデータをひたすらDBへ流し込む一日になった——別アプリの過去問、自炊した参考書655ページ、そして「状態を上書きするな」という設計論を操作できる教材に仕立てる作業まで。

今日のタイムライン

タイムライン

今日やったこと

1. Chrome DevTools MCP が固まる真因を掘り当てた(claude-code-tools)

数日前から、Claude Code 起動時に chrome-devtools MCP が "still connecting" で固着し、mcp__chrome-devtools__* が一切ロードされない事象が出ていた。最初は Chrome 136+ のデフォルトプロファイル制約だと思い込んでいたが、調べさせたら別物だった。ポート9222は LISTENING しているのに /json/version が HTTP 404 を返す——「ポートは開いているがDevToolsとして機能していないゾンビ」が真因だった。

主な成果:

  • 真因=前のデバッグChromeを閉じ損ねて残った「壊れた残骸の9222リスナー」の居座りと特定。設定やChromeバージョンの問題ではなかった
  • 全体再起動は不要で、/mcp の reconnect だけで復活すると実証(当初「再起動必須」と書いたのは過剰断定だった)
  • issueメモを自己完結したクイックスタートに整備し、apps/web/CLAUDE.mdwindows.md にも追記。codex(gpt-5.5)でレビューして断定しすぎを修正、issueはクローズ

詳細: Chrome DevTools MCP が "still connecting" で固まる真因は『残骸9222リスナーの居座り』だった


2. ある国家資格試験の過去問を Turso DB に丸ごと移行(misc-dev)

別アプリに散らばっていた、ある国家資格試験の過去問JSONを Turso DB に全件コピーした。問題499・選択肢1992、解説や法令参照のネスト構造もJSON列でそのまま保持した。将来はCloudflare上のDBとして使っていく前提のメモも残した。

主な成果:

  • スカラー値は列、ネストした解説・法令参照はJSON列、という方針で全データを保持
  • 過去問10回分を全件格納し、HTTP接続でクラウド到達まで検証
  • バッチファイルのトップレベルが dict / 配列で混在していた問題に、両対応の分岐で対処

詳細: ある国家資格試験の過去問データを Turso DB に丸ごと移して全文検索できるようにした


3. 自炊した4分冊の参考書をOCRして蔵書DBに取り込み、章・節単位に再構造化(book-knowledge-base)

蔵書DBにこの分野の参考書が1冊も無かったので、自炊した市販の参考書(4分冊・合計655ページ)をyomitokuでOCRして取り込んだ。当初60分と見積もったが、GPU逐次処理が約1秒/ページで走り15〜20分で終わった。ページ単位640チャンクを、目次に沿って章・節単位74チャンクへ整理し直した。

主な成果:

  • 4分冊をそれぞれ独立した書籍として格納(図1181枚もリネーム)、横断FTS検索が章/節ラベルでヒット
  • サブエージェント経由で Embedded Replica の sync() がハングしたため、全ステップHTTP直接接続に切り替えて回避
  • クラウドだけ更新してローカルレプリカが陳腐化・破損(.db-info 欠落)したので、退避して約80MBを再DLし自動再構築

詳細: 自炊した4分冊の参考書をOCRして蔵書DBに取り込み、章・節単位に整理し直すまで


4. 「状態 vs イベント」を操作して見比べる教材を実装(mdx-playground)

farstepさんの「テーブルに状態を持たせてはいけない」を題材に、読むだけでなく操作して学べる教材を作らせた。会員データに「入会→利用停止→復帰→退会」を流し込むと、状態カラム上書き/イベント記録/状態テーブル分割の3設計が同時に更新され、履歴がどう残る/消えるかを見比べられる。

主な成果:

  • 監査の問い(いつ入会したか・何回停止されたか)に各設計が自分のデータだけで答えられるかを○×表で対比
  • ロジックは純粋関数(app/utils/membershipState.ts)に隔離し、Vueページは副作用シェルに徹する構成。ユニットテスト19件pass
  • 技術内容のレビューも実施。「イベントソーシングの一言で済む」への反論(安価な設計の規律と重いアーキテクチャの混同を避ける)も差し込んだ

詳細: 「テーブルに状態を持たせてはいけない」を、会員データを操作して3設計を見比べる教材に仕立てた


5. セキュリティレビュー・プラグインの有効化スコープを整理(eurekapu-nuxt4)

Claude が書いたコードを自動レビューするプラグインを導入しようとして、いったん手を止めて有効化スコープを整理した。結論は「ローカル一人運用なら /plugin install(ユーザーレベル)だけで全プロジェクトに効くので、プロジェクトの settings.json は冗長」。settings.json が要るのは web版を使うか他人とリポジトリを共有する場合だけ、と切り分けた。

主な成果:

  • 有効化はユーザーレベルのみ・settings.json は作らず、ガイダンス2ファイルだけ作成
  • server/api/ の決済・認証ガードをレビュー観点に反映

詳細: Claude Code のセキュリティレビュー・プラグインは、ローカル一人運用ならユーザーレベルだけで十分だった


今日の試行錯誤

#テーマ試したこと結果気づき
1MCP固着Chrome 136+ のプロファイル制約を疑う外れ9222は404を返すゾンビ。バージョン制約ではなかった
2MCP固着9222を解放しtemp profileでクリーン起動成功webSocketDebuggerUrl 入りJSONが返る正常状態に復旧
3MCP固着全体再起動が必須と断定訂正/mcp reconnect だけで復活すると実証。断定が過剰だった
4パースエラー大量パス調査で履歴が肥大頻発「tool call could not be parsed」連発。履歴肥大が真因
5パースエラー1回ずつ小さく刻んで進める回避出力崩れが止まった。長い調査は刻むのが効く
6過去問移行移行スクリプト初回実行exit 1トップレベルが配列の14ファイルで失敗
7過去問移行dict/配列どちらも処理する分岐成功外部由来データはトップ構造のばらつきを先に診断すべき
8OCR進捗非TTYで進捗が見えない不安Pythonのブロックバッファリング。-u で可視化
9蔵書再構造化サブエージェントで sync()ハングEmbedded Replicaはバッチ/サブエージェントで固まる既知問題
10蔵書再構造化全ステップHTTP直接接続に変更成功残り3冊はハング無しで完了
11レプリカ破損クラウドだけ更新→ローカル陳腐化破損.db-info 欠落。退避して再DLで自動再構築

今日の学び

  • 思い込んだ制約と実際の真因は違うことがある。MCP固着は「Chromeのバージョン制約」だと決めつけていたが、真因は「壊れた残骸9222リスナーの居座り」。/json/version が404という観測事実を見るまで、仮説を真因と取り違えていた
  • 断定しすぎず、実証して書き直す。「全体再起動が必須」と書いたが、/mcp reconnect だけで直ると実際に確かめられた。codexにも「因果を断定しすぎ」と突かれた。ドキュメントは実測で上書きするのが正しい
  • 会話履歴を肥大させない。大量のファイルパスを履歴に流し込むと、ツール呼び出しの出力が崩れて「could not be parsed」が頻発する。長い調査は小さく刻むと回避できる
  • Embedded Replica はバッチ/サブエージェントでハングする。書き込みやFTSリビルドはHTTP直接接続が安全。そしてクラウドだけ更新するとローカルレプリカが陳腐化するので、退避→再構築の手順を覚えておく
  • 読む教材より、操作して見比べる教材の方が腹落ちする。同じ操作を3設計に同時に流すと、履歴が残る/消えるの差が一目で出る。ロジックを純粋関数に出しておくとテストも楽だった(19件pass)

明日やること(任意)

  • 過去問DBをCloudflare上のDBとして使う構成の検討(D1 連携 or Turso のまま)
  • 蔵書DBに取り込んだ参考書を使った横断検索の使い勝手を試す
  • 状態 vs イベント教材の最終ブラウザ動作チェック(パースエラーで途中までだった分)

関連記事