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.md・windows.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 のセキュリティレビュー・プラグインは、ローカル一人運用ならユーザーレベルだけで十分だった
今日の試行錯誤
| # | テーマ | 試したこと | 結果 | 気づき |
|---|---|---|---|---|
| 1 | MCP固着 | Chrome 136+ のプロファイル制約を疑う | 外れ | 9222は404を返すゾンビ。バージョン制約ではなかった |
| 2 | MCP固着 | 9222を解放しtemp profileでクリーン起動 | 成功 | webSocketDebuggerUrl 入りJSONが返る正常状態に復旧 |
| 3 | MCP固着 | 全体再起動が必須と断定 | 訂正 | /mcp reconnect だけで復活すると実証。断定が過剰だった |
| 4 | パースエラー | 大量パス調査で履歴が肥大 | 頻発 | 「tool call could not be parsed」連発。履歴肥大が真因 |
| 5 | パースエラー | 1回ずつ小さく刻んで進める | 回避 | 出力崩れが止まった。長い調査は刻むのが効く |
| 6 | 過去問移行 | 移行スクリプト初回実行 | exit 1 | トップレベルが配列の14ファイルで失敗 |
| 7 | 過去問移行 | dict/配列どちらも処理する分岐 | 成功 | 外部由来データはトップ構造のばらつきを先に診断すべき |
| 8 | OCR進捗 | 非TTYで進捗が見えない | 不安 | Pythonのブロックバッファリング。-u で可視化 |
| 9 | 蔵書再構造化 | サブエージェントで sync() | ハング | Embedded Replicaはバッチ/サブエージェントで固まる既知問題 |
| 10 | 蔵書再構造化 | 全ステップHTTP直接接続に変更 | 成功 | 残り3冊はハング無しで完了 |
| 11 | レプリカ破損 | クラウドだけ更新→ローカル陳腐化 | 破損 | .db-info 欠落。退避して再DLで自動再構築 |
今日の学び
- 思い込んだ制約と実際の真因は違うことがある。MCP固着は「Chromeのバージョン制約」だと決めつけていたが、真因は「壊れた残骸9222リスナーの居座り」。
/json/versionが404という観測事実を見るまで、仮説を真因と取り違えていた - 断定しすぎず、実証して書き直す。「全体再起動が必須」と書いたが、
/mcpreconnect だけで直ると実際に確かめられた。codexにも「因果を断定しすぎ」と突かれた。ドキュメントは実測で上書きするのが正しい - 会話履歴を肥大させない。大量のファイルパスを履歴に流し込むと、ツール呼び出しの出力が崩れて「could not be parsed」が頻発する。長い調査は小さく刻むと回避できる
- Embedded Replica はバッチ/サブエージェントでハングする。書き込みやFTSリビルドはHTTP直接接続が安全。そしてクラウドだけ更新するとローカルレプリカが陳腐化するので、退避→再構築の手順を覚えておく
- 読む教材より、操作して見比べる教材の方が腹落ちする。同じ操作を3設計に同時に流すと、履歴が残る/消えるの差が一目で出る。ロジックを純粋関数に出しておくとテストも楽だった(19件pass)
明日やること(任意)
- 過去問DBをCloudflare上のDBとして使う構成の検討(D1 連携 or Turso のまま)
- 蔵書DBに取り込んだ参考書を使った横断検索の使い勝手を試す
- 状態 vs イベント教材の最終ブラウザ動作チェック(パースエラーで途中までだった分)