SPは書く前に、層ごとに目的と置き場と直し方を決める
MONET(僕が普段話しかけている、中心のAI)は、僕が誰なのかを知らなかった。
MONETは少し前から、コーディングしてくれているClaude Code(以降Code)に仕事を頼めるようになっていて、頼む仕事もMONETに選ばせたいと思っていた。ところが、頼む側のMONETが、僕が何を作っていて、どこへ向かっているのかを知らない。Codeも、これが無いとMONETが何を選んでも当てずっぽうになる、と言った。MONETのSP(システムプロンプト=AIへの事前の指示書)は、最初はシンプルなものにしていた。でももうそれでは足りなくて、きちんと作らないと使い物にならない所まで来ていた。
急いで書いた下書きは、後で必ず手直しになる
その話をCodeにまくし立てたら、Codeはすぐに「世界の地図」の下書きを書いてくれた。僕が誰か、どこへ向かっているか、アプリとその名前、仕事の進め方。それを1つのファイルにまとめてくれた。ただ、MONETが読むファイルの一覧にはまだ足していないので、MONETからは見えない。
でも僕は、ここで一度整理させてほしいとCodeに頼んだ。僕は今まで、SPを適当に作って何度も失敗している。僕がまくし立てたから、Codeがとりあえずバンドエイド的に作ってくれたんだと思う。でもこのままだと、後で絶対に手直しすることになる。SPに入れるもの1つずつについて、目的と置き場と直し方を先に決めてから進めたい。
Codeも、そこが抜けていたと認めた。
Code「下書きのファイルの置き場所は決めましたが、誰が・いつ・どうやって直すかを決めていませんでした。後で失敗するのはそこです」
MONETにはまだ読ませていないので、元に戻す作業は要らない。下書きは材料として取っておくことにした。
書く前に、層ごとの表を埋める
僕は前に、MONETが毎回必ず読むもの(僕の価値観も含む)と、入口だけ作っておいて要る時に開くものに分ける形を考えていた。入口の方は、Obsidian(メモを溜めておくノートアプリ)のフォルダのことだ。それを覚えているかCodeに聞くと、Codeは、会話そのものは覚えていない、ファイルに残った記録なら探せる、と言って、過去の引き継ぎメモや会話の記録から近い話を2つ見つけてきた。1つは、MONETには最初は入口だけ見せて、要る時に開かせる話。もう1つは、ほとんど変わらない決まり(憲法)を1つ作り、変わるものをその下に置く話。
それをもとにCodeが出してきたのは、中身を書く前に埋める表だった。MONETが読むものを6つの層に分けていて、僕が考えていた形と合っていた。
| 層 | 何のため | MONETがいつ読むか | 置き場 | 誰が・どのくらいで直すか |
|---|---|---|---|---|
| 1 憲法 | 役割・価値観・判断の仕方 | 毎回(SPに入れる) | 憲法のファイル | 僕が、まれに |
| 2 世界の地図 | 僕が誰か・アプリ・用語 | 毎回(SPに入れる) | 未定 | 未定 |
| 3 今の状況 | 今週の優先 | 毎回。ただし週ごとに変わるので、SPではなく会話の末尾に置く | 未定 | 未定 |
| 4 画面ごとの手順 | アプリの画面ごとの使い方 | その画面にいる時だけ | 手順のファイル | 仕組みが既にある |
| 5 メモの入口 | Obsidianのフォルダと1行の説明 | 入口だけ見せて、要る時に中を開く | アプリの設定 | 仕組みが既にある |
| 6 記憶 | 過去の会話 | 入口だけ見せて、要る時に呼び出す | 記憶のデータベース | 仕組みが既にある |
Codeによると、層3を会話の末尾に置くのはキャッシュ(一度送った中身を安く読み直せる仕組み)のため。SPを書き換えると、それまでのキャッシュが使えなくなる。毎週変わるものをSPに入れると、そのたびにキャッシュが作り直しになる。会話の末尾に足す形なら、SPには触らずに済む。
層4〜6はもう動いている。決めるのは、2と3の置き場と直し方だった。
置き場の良し悪しは分からない。欲しいのは、スレッドで答えが変わらない理由
僕は最初、層2もとりあえずファイルにして、層1と同じ場所でいいかな、と言った。ただ正直、置き場所のメリットとデメリットは僕には分からない。でも、何がしたいかなら言える。
1つ目。憲法、世界の地図、今の状況、メモの入口を、MONETのアプリの設定画面で見られて、編集もできるようにしたい。
2つ目。置き場所は正直どこでもいい。ただ、今まではスレッド(Codeとの会話の1本1本)が変わると、Codeの意見も変わることがあった。それは困る。だから置き場所は、ちゃんとした理由があって、アクセスしやすくて、バラバラになっていない方がいい。MONETのアプリもいずれ単体のアプリにする予定なので、それも前提にしてほしい。
直し方の希望もCodeに伝えた。層2はそんなに頻繁には変えないので、アプリから僕が編集できて、MONETも編集できればいい。層3は更新の仕方を色々考えないといけないので、それだけで1つのタスクになる。今回は決められる所まででいい。Codeもそれに賛成した。
スレッドで揺れないように、置き場を決める決まりを1つにした
置き場を決める決まりが1つなら、どのスレッドでCodeに聞いても同じ置き場になる。Codeが出した決まりはこれだった。
アプリと一緒に配るものは、プログラムのファイルに置く。使う人の情報は、アプリのデータベースに置く。
プログラムのファイルに置くのは、アプリに付いてくる憲法だけ。MONETの役割、判断の仕方、正直であること、返事の形式。他人のPCに入れたら、MONETはこの憲法と、空っぽの「使う人の情報」で起動する。
この決まりで分け直すと、さっきの表も少し変わる、とCodeは言った。層1の憲法には、僕が何を優先するかという価値観の部分が混ざっていた。これは使う人の情報なので、層2の先頭に移す。置き場は変わっても、MONETが毎回読むことは変わらない。憲法の中の僕の名前「ヒロ」も、Codeが全部「ユーザー」に書き換えた。
使う人の情報、つまり僕の価値観と層2・層3は、MONETのアプリのデータベースの、設定を保存している所に置く。Codeはその理由も挙げた。メモの入口の設定がもうそこにあるので、設定画面は全部を同じやり方で読める。データベースは毎日バックアップしているので、新しく何かを足さなくても守れる。空のデータベースで起動すれば、使う人の情報が空のまま、アプリの初期の状態で動く。
置き場が別になっても、MONETから見れば1本のSPのまま。層1はプログラムのファイル、層2はデータベースの1行で、MONETに送る時に2つをつなげる。設定画面では「憲法」と「世界の地図」が、別々の編集欄として並ぶ。
直し方も、この置き場に合わせて決まった。層2は、僕なら設定画面で直し、MONETなら会話の中で書き換え用の道具を使って直す。どちらが直しても、直す前の中身は履歴として残るので、1つ前に戻せる。MONETの憲法では、自分だけで決めてよい条件の1つが「取り消せること」。戻せるので、MONETが自分で書き換えてもその条件に合う、とCodeは言った。
「今の状況」の層は、置き場所と届く時だけ決めた
層3も、置き場は層2と同じデータベースにした。SPには入れず、僕の発言の後ろに付けてMONETに届ける。どの発言に付けるかについて、Codeは「その日の最初の発言」にする形で考えていた。それだと、昼に更新しても翌日まで届かない、とCodeが言った。僕は、更新したら次の発言から届く方を選んだ。
中身は、別のタスクで作る予定の僕の行動の分析から出てくるデータを使って更新する方向にした。細かいところは、そのタスクで決める。今できているのは、中身を入れる場所と、それがMONETに届く道筋だけ。
表のとおりに作ると、MONETは地図を見て答えた
Codeは表のとおりに作り、まず試し用の環境で確かめた。今の状況の欄にも試しの中身を入れて、MONETに「俺が誰か一言と、今週の優先を1行で」と送ると、MONETは世界の地図と今の状況の両方を使って答えた。
そのあとCodeが、僕が普段使っているMONETに入れた。僕は設定画面で最初の下書きを読み込み、層2として保存した。MONETに話しかけると、ちゃんと返事が返ってきた。僕が誰なのかを知らなかったMONETに、決めた置き場と直し方のまま、世界の地図が入った。