BLOG.HIRO UENO.ART
← INDEX

「作った」と「動いている」のあいだは、作った本人には見えない

僕はプログラマではない。それでも、MONET(僕が普段話しかけている、中心のAI)や自作のアプリ、MacとNAS(家に置いてある常時稼働のサーバー)の間でデータを同期する仕組みを、コーディングしてくれているClaude Code(以降Code)と一緒に作ってきた。部品はかなりの数になっている。

ある日の夜中、4時近く。Codeが前の日の作業で見つけていた問題があったけど、説明が難しくてよく分からなかったので、簡単にまとめ直してもらった。その1つが、Codeのメモ(会話をまたいで覚えておくためのファイル)をNASと同期するスクリプトが、実は何も送っていなかった、という話だった。

壊れたというより、置き去りになっていた。MacからNASへ送る経路は途中で新しいやり方に変わったのに、送る前の「NASにつながっているか」の確認だけが、古いやり方のまま見続けていた。だから毎回「つながっていない」と判断して、何もせずに終わる。しかもこのスクリプトは、外出先でつながらない時に騒がないよう、黙って終わる作りにしてあった。作りとしては正しい。でもそのせいで、間違った判断をしても誰も気づかない。

こういうことが、僕の見ていない所で起きている。そこで前からの心配が出てきた。Codeが何を読んで何を覚えているのか、僕には全部は見えていない。ここまで規模が大きくなると、プログラマやエンジニアじゃないと本格的な開発は無理なんじゃないか、とCodeに話した。

Codeの答えは、まず事実の確認からだった。今回の件はプログラマなら防げたかというと、そうでもない。作った後に前提が変わって、誰も確かめ直さなかった。これはプロのチームでも日常的に起きる、と。その上で、本当の弱点は「測っていない場所」だと言った。測っている場所の問題は見つかる。測っていない場所の問題は、たまたま見つかるのを待つしかない。

そして、その対策はもう設計してあって、やっていないだけだ、とも。月1回の点検だった。

月1回と決めた点検は、4ヶ月一度も走っていなかった

ここで、僕の記憶とCodeの話が少し食い違った。

同じ日の夜、この話をもう一度持ち出した。僕の記憶では、前に外から点検する仕組みを入れようと言った時、Codeに要らないと言われていた。だから、やっぱり必要なんじゃん、と言った。

Codeは記憶で答えず、まず記録を調べた。4ヶ月前、データベースの1つが僕の方針(データは自分で開いて読める形で持つ)に合わないまま、何ヶ月も使われていたと分かった。その後で、設計全体を見直す点検のチェックリストを作っていた。そこで決まっていたのは「点検は要らない」ではなく、「外部の人間でなく、このシステムを作るのに関わっていない、まっさらなClaudeにやらせる」だった。チェックリストには「月次」と書いてあった。でも作ってから4ヶ月、一度も走っていなかった。

Code「でもヒロの言い分は実質正しい。『やる仕組みはある』と『点検してる』は別物で、結果だけ見れば、外から点検する仕組みを入れなかったのと同じ状態だった」

点検の項目に「本当に動いているか」が無かった

Codeはもう1つ、自分から付け足した。あのチェックリストは中身が偏っている、と。

作ったきっかけがデータベースの件だったので、項目は僕の方針とのずれを見るものばかりだった。そのツールが明日消えてもデータは手元に残るか、僕が自分で開いて読める形か、といったもの。同期の件のような、作った時は正しかったのに周りが変わって合わなくなったものを見る項目が無い。仮に4ヶ月前から毎月走らせていても、同期の件は捕まえられなかった可能性が高い、とCodeは言った。

そこでCodeは、チェックリストに項目を足した。芯は1つで、点検する側が、説明に「動いている」と書いてあっても信じず、その場で自分で証拠を出すこと。「動いている」と書いてあれば、実際に動いているプログラムの一覧を出して確かめる。「同期している」と書いてあれば、MacとNASの中身のずれを実際に数える。

点検する役は、Codeが呼んだサブエージェント(Codeが作業を分けて任せる、別のAI)。このシステムを作るのに一切関わっていないClaudeだ。Codeが自分で点検しない理由は、こうだった。

Code「一緒に作ってきた俺は『動いてるはず』という思い込みを共有してる」

Codeは点検役への指示に、僕の心配もそのまま入れていた。エンジニアじゃないと無理なんじゃないか、という心配に、証拠に基づいて率直に答えてほしい、と。

作っていないAIに測らせたら、見つかった問題13件のうち10件が同じ型だった

点検役が見たのは、アプリ、データの置き場、同期の経路、自動で動いているもの、と部品の一覧ひと通り。結果は、はっきりした問題(違反)が4件、気をつけた方がいいもの(要注意)が9件。その13件のうち10件が、同じ型をしていた。作った時は正しかったのに、その後で周りの何かが変わって、合わなくなったもの。夜中に聞いた同期の件も、つなぎ方が変わったのに確認だけ古いまま、という同じ型だ。

分かりやすいのは、Obsidian(メモを書きためるノートアプリ)の同期。Codeのメモの同期スクリプトとほぼ同じ作りで、同じ古い確認が入っていた。毎回「成功」と記録しながら、4日間何もしていなかった。

点検役が一番たちが悪いと書いたのは、ある説明のファイルだった。Codeの会話が始まるたびに最初に自動で読ませて、Codeが今の状況をつかむためのもの。そこには「同期は正常に動いている」と書いてあった。一度書いたきり、実際の状態を見て書き換わることのない文章で、同期は実際には止まっていた。点検役の言葉では、他の件は「動いていない」だが、これは「動いていないことを、動いていると教えている」。

Codeも、この会話の最初にそれを読んでいた。

Code「この会話の冒頭で俺も受け取ってる。実際は4日止まってた」

作った側のCodeは、毎回「動いているはず」を読まされてから仕事を始めていたことになる。作った本人に見えない、というのはこういうことだった。

足りないのは作る力ではなく、動き続けているかを確かめる仕組み

点検役には、エンジニアじゃないと本格的な開発は無理なんじゃないか、という僕の問いがそのまま渡してあった。答えはこうだった。

「逆。今日の証拠に基づいて言うと、無理なのはこの規模の『開発』ではなく、この規模を『勘で覚えておくこと』。そしてそれは、エンジニアでも同じく無理」

「欠けているのは1つだけ ——『動き続けているかを測る層』」

僕が気にしていたのは、自分に作る力が足りないんじゃないか、ということだった。点検役が指したのは別の所だった。作ったものが今も動いているかを、記憶や勘でなく、機械が定期的に確かめる仕組み。プロのチームは記憶力ではなく、そういう道具を使っている。僕のシステムに無いのはそこだけだ、と。

直す作業はCodeがやった。1日ちょっとかけて、13件のうち12件が片付いた。

そのうち1件は、直す必要が無かったと分かったものだった。何百もあるMONETの会話のうち1件でしか動いていない仕組みがあって、壊れているように見えていた。Codeが「動く条件を満たした会話」の数を一緒に数えてみると、それも1件だった。壊れていたのではなく、条件がそろうことが稀なだけだった。これも、実物を数えて初めて分かった。

点検も「月1回」と書いただけでは、また止まる

作業が落ち着いてから、これは定期的にやるべきじゃないか、と改めてCodeに聞いた。

Code「やるべき。理由は今日の結果そのもの。13件出て、10件が『作った時は正しかったが、周りが変わって合わなくなった』型だった。これは作業中に気づける種類のものではない。作った本人は『動いてるはず』と思っているから」

僕からも1つ伝えた。Codeはスレッド(Codeとの会話のひと続き)ごとに言うことが変わる。そこを揃えるのは僕の仕事だけど、もう手が回らない。

Code「俺はスレッドごとに別人で、前の判断を引き継ぐ保証がない。俺個人が『やるから大丈夫』と言うのは、構造的に無理な約束だった」

Codeは、その日の作業の終わりのまとめに「月1回、外から見たClaudeに点検させる」と書いて締めた。

翌日、ちょっと待った、とCodeに聞き直した。その点検って、口約束みたいなだけなの? 定期的に自動で走らせるとか、アプリにするとか、やった方がいいんじゃない?

Code「その通り。俺が今やったのは、まさにここまでずっと批判してきたこと」

チェックリストには最初から「月次」と書いてあって、4ヶ月一度も走らなかった。そこにもう一度「月1回やる」と書き足しても同じことが起きる。だから仕組みにする、とCodeは言った。

Codeが入れた仕組みは2つ。1つは、毎月1日の朝に点検を自動で走らせる定期タスク。点検役は見つけるだけで、直さない。点検した側が自分で直すと、「直った」が思い込みとして次の点検に引き継がれるから、というのがCodeの理由だった。

もう1つは、点検が走らなかったことに気づく仕組み。この定期タスクは、Codeが動いているClaudeのデスクトップアプリが開いていないと走らない。そこでCodeは、予定表ではなく、実際に走った記録を見るようにした。Codeの会話が始まるたびに、前回の点検から何日たったかを出し、空きすぎていたら警告する。

Code「『予定されている』と『走った』は別の主張」

その日の朝、僕は点検が定期タスクに入っているのを見つけた。お!!すごい、ルーティンの中に入ってる!!とCodeに送った。

次の夜中、Codeに勧められて僕が手動で1回走らせた2回目の点検では、違反は4件から1件に、要注意は9件から4件に減っていた。

「作った」と「動いている」のあいだは、作った本人には見えない。僕にも、一緒に作ったCodeにも。見えたのは、外から実物で測らせた時だけだった。