BLOG.HIRO UENO.ART
← INDEX

いつの話か、本当に動いているかを書いておく

AIは、渡された文章を今のこととして読む。人も、画面に警告が出ていなければ、動いていると思って次へ行く。いつの話なのか、今も動いているのかが書いてなければ、古い情報も、止まったプログラムも、正しく見えてしまう。

続けて2つ、それを書き足すことになった。1つはAIに渡す情報で、こちらは先回りして足した。もう1つは僕が見る画面で、こちらは実際に2日間止まっていて、画面からは気づけなかった。

AIに渡す「今の状況」を、毎朝自動で書くことにした

MONET(僕が普段話しかけている、中心のAI)のSP(システムプロンプト=AIへの事前の指示書)には、「今の状況」という欄がある。僕の仕事が今どうなっているか、今週の山場は何か。MONETはこれを前提に話す。

この欄は、それまで僕が手で書き込んでいた。それをやめて、毎朝自動で書き直すことにした。

仕組みは、コーディングしてくれているClaude Code(以降Code)が作った。毎朝5時に、Handler(ハンドラー。タスクとスケジュール管理アプリ)の状況報告と、直近1週間のMONETとの会話の要約を集めて、それを材料にAIが「今の状況」を書く。タスクの番号や、期限を何日過ぎたかといった数字は、AIが自分で作らず、材料から写すだけ。写し間違えたら、Codeが入れたチェックが材料と見比べて、書き直させる。チェックに通らず書けなかった日は、前の日の中身がそのまま残る。

AIが読む中身の先頭に、材料を集めた時刻を入れた

出来上がったと聞いて、僕はCodeに聞いた。中身の先頭に、これは何月何日何時何分の情報です、と書いてあれば、MONETも迷わないんじゃないか。

Code「もう日付は入っていますが、時刻が無いので足します」

1行目は「〇月〇日 〇時〇分時点の情報・自動生成」という形になった。

入るのは、AIが書き終えた時刻ではなく、材料を集めた時刻。書けずに前の日の中身が残った日は、MONETに見えるのも前の日の時刻になる。変な中身が出た時のために「1つ前へ戻す」ボタンも残してあって、戻した時も、その古い中身の日時が出る。

Slackの返信待ちの一覧は、返したあとも「未処理」のままだった

もう1つは、Typewriter(タイプライター。代筆アプリ)の話。Slackで僕宛てに来たメッセージを拾って、返信の下書きを並べてくれる道具で、送るのは僕。NAS(家に置いてある常時稼働のサーバー)で動いている。

TypewriterをMONETと話すアプリにつなぐ前に、Codeが今の様子を見てくれた。Slackからは5分おきに取り込んでいて、未処理は16件。

Codeが気にしたのは、16件全部が未処理のままで、返信済みが0件なこと。僕がSlackで直接返した分は、Typewriterが自動で「返信済み」にするはずだった。

Codeが調べると、「返信済み」かどうかは、メッセージを取り込んだ瞬間に1回見るだけだった。後から僕が返しても、見直さない。一覧の「未処理」は、取り込んだ時点の話のまま残っていた。Codeは、未処理のものを5分おきに見直すように直した。

取り込みの時刻は進んでいたのに、2日前から1件も入っていなかった

Typewriterは、5分おきにSlackを読みに行って、僕宛ての新着を取り込む。画面には、最後に読みに行った時刻が出ている。

直したプログラムをNASで動かして、Codeが実際に効いているかを確かめた。ところが、16件のまま変わらない。Codeがログを見ると、Slackからエラーが返っていた。NASが使っていたSlackの鍵が、2日前に無効になっていた。その日から、新着は1件も入っていなかった。

それなのに、画面は止まったようには見えず、時刻も進み続けていた。TypewriterはSlackのチャンネル(話題ごとの部屋)を1つずつ読みに行く。1つで失敗しても全体は止めない作りで、失敗はログに残すだけだった。そのため、全部のチャンネルで失敗しても、読みに行ったことにはなって、時刻が進んでいた。

画面に出ていたのは、取り込めた時刻ではなく、読みに行っただけの時刻だった。作業の前に、Codeが5分おきに取り込めていると報告したのも、この時刻を見てのことだった。

取り込めない時は、止まった理由を画面に出す

Codeは、取り込めない時は時刻を進めず、「取り込み停止」と理由を画面に出すように直した。NASで動かしてからCodeが確かめると、画面に出すための記録に、鍵が無効になったという理由が入っていた。

鍵は僕が入れ直した。取り込みが戻ると、未処理は16件から4件になった。12件は、僕がSlackで返していたものだった。止まっていた2日分もTypewriterが読み直していて、僕宛ての新着は無かったと、Codeが教えてくれた。

「今の状況」の先頭の時刻は、いつの話かを添える。Typewriterの「取り込み停止」は、今も動いているかを添える。添えておかなければ、読む側は、それが今の話で、ちゃんと動いていると思って先へ進んでしまう。