開発記録 #02 ── 「AIにAIへの指示書を書かせる」
前回のあらすじ
CLIからRAGを叩きたかった。
でもそもそも会話ログが手元にない。
ブラウザの怪しい拡張機能を調べていたら「自作したほうがいい」という結論になった。
今回は、その「自作」をどう進めたか、という話だ。
自分でコードを書くつもりは、なかった
正直に言う。
Tampermonkeyのユーザースクリプト、MutationObserver、SHA-256ハッシュ、Blob生成……
やることはわかった。
でも自分で一から書くつもりはなかった。
そのためのCopilotだ。
ただ、「会話を自動保存するスクリプト書いて」と丸投げすると、だいたいひどいものが出てくる。
曖昧な指示には曖昧なコードが返ってくる。これはどのAIでも同じだ。
だから先にChatGPTと設計を詰めて、仕様書レベルのプロンプトを作ってからCopilotに渡すことにした。
ChatGPTが仕様書を書いた
「ではCopilotに指示してください」と頼んだら、ChatGPTがそのまま使える指示書を出してきた。
内容を要約するとこうだ:
スクリプト名: Universal Local AI Chat Auto Saver
対象URL:
https://chat.openai.com/*https://claude.ai/*https://gemini.google.com/*https://grok.com/*
セキュリティ要件:
-
@grant none(外部通信不可) - fetch・XMLHttpRequest・WebSocket・Firebase・外部CDN、すべて禁止
- データはブラウザ内にのみ存在すること
動作:
-
MutationObserverでDOMの変化を監視 - 1500ms変化が止まったら「AI応答完了」と判断
- 会話テキストを抽出してMarkdown整形
- SHA-256ハッシュで重複チェック(同じ内容なら保存しない)
- Blobでローカルダウンロード
保存フォーマット:
---
source: {hostname}
url: {full URL}
timestamp: {ISO8601}
hash: {sha256}
---
(会話本文)
ファイル名: AIChat-{hostname}-{YYYYMMDD-HHmmss}.md
モジュール構成:
observeChanges()extractText()computeHash()shouldSave()saveMarkdown()
明示的に禁止されていることまでリストアップされていた。
「クラウド同期・アカウントログイン・IndexedDB・外部ストレージAPI」、全部NG。
この指示書、なぜここまで細かいのか
AIにコードを書かせるとき、一番やらかすのがセキュリティ要件の抜けだ。
「ローカル保存してね」と言っても、
便利だと思ってfetchを使い始めたり、
外部ライブラリをCDNから読み込んだり、
平気でやってくる。
だから「禁止事項」を明示するのは、指示書設計の基本だ。
それと、モジュール名を具体的に指定したのも意味がある。
関数名が決まっていると、後でデバッグするときに話が早い。
「computeHash()がうまく動いてない」と言えば、どこの問題かすぐわかる。
AIに指示書を書かせて、別のAIに渡す
ここで少し立ち止まって考えてみると、なかなか奇妙な構造だ。
- ChatGPT(会話相手)が設計を手伝い
- Copilot(コーディング担当)がスクリプトを書き
- そのスクリプトが、ChatGPTやClaudeやGeminiの会話を保存する
AIがAIへの指示書を書いて、そのコードがAIの会話を収集する。
別に深い意味はないが、2026年らしい光景だと思う。
次回予告
Copilotに仕様書を渡した。
スクリプトは出てきた。
動かなかった。
次回は、どこで詰まって、どう直したか、の話をする。
MutationObserver はAIサービスのSPAと相性が悪い、という話も出てくる。
ちなみに、まだアプリは完成していない。
開発記録 #02 了
続きは #03 で。
