謎のログが途切れるバグが起きたので相談したい
まとめ
よくわからないバグが発生したので悩んで相談した
当初認識していた「ログが途切れる」が、現象の認識として正しくないことがわかった
正しくは「ログが二つの会話に分かれる」
ログが消えてないことがわかって一安心

あなたはこの会話で何が起きて欲しいですか?

謎のログが途切れるバグが起きたので相談したい

その「バグ」は、どんな「バグ」ですか?

ログのうち冒頭の数行が失われるという現象が起きた。サーバに保存されているデータでも冒頭が失われている。

その「ログ」は、どんな「ログ」ですか?

会話のログ。チャットにユーザが入力したものとボットが返事したものがリストになっている。

その「ログ」について、他に何かありますか?

そもそもサーバには1行の発言を送って、サーバサイドで追記をしているはずなのに、なんで途中で途切れるのか不可解
> 会話のログ。チャットにユーザが入力したものとボットが返事したものがリストになっている。
この「ログ」は、どのあたりにありますか?

サーバにある

その「サーバ」は、どんな「サーバ」ですか?

Herokuで文字列を受け取って返答のレスポンスを返す。状態はFirestoreに保存される。

その「保存する」は、どんな「保存する」ですか?

トークIDをキーとするKVSになっていて、そこに会話継続に必要な内部状態をJSONに変換して入れている。JSONなのは歴史的経緯、実際に使うときにはdefaultdictとかなのだけどこれはそのままFirestoreに入らないので保存する前にFirestoreに入る形に変換する必要があり、その変換方法でたまたまJSONを選んだだけ

あなたが価値を感じているのは何ですか?

バグが解消してほしい。ログが失われるのは損失だし、失われるかもしれないと思ってると安心して使えない。ざっと怪しい操作をしてみたけど再現しなくて頭を抱えている

その「ログ」は、どこにありますか?

Firestoreにある。
> バグが解消してほしい。ログが失われるのは損失だし、失われるかもしれないと思ってると安心して使えない。ざっと怪しい操作をしてみたけど再現しなくて頭を抱えている
この「ログ」は、何のようですか?

追記するファイル。ログが消えたとなると上書きしたのかなと思うわけだが、そもそもロードして追加して書き戻してるはずなので消えるのが不可解

その「ログ」は、どこから来るのですか?

えーとね、今回怪しいと思ってる機能は最近つけた「過去の会話を開いて続行する機能」で、実際にログが消えた時もそれを使いまくってた。この機能を使った時は、まずブラウザのIndexedDBに入ってる会話IDでFirestoreにアクセスして過去のログを取得してそれを表示する。

あなたはその「ログ」をどう知るのですか?

Firestoreに会話IDを送って「この会話のログをくれ」ってやる

その「ログ」に関して、何が起こるとよいですか?

消えないか、せめて消える現象の再現方法がわかってほしい。再現しないとデバッグできない。

それには「ログ」に何が起こる必要がありますか?

わからない!
> Firestoreに会話IDを送って「この会話のログをくれ」ってやる
この「Firestore」は、どんな「Firestore」ですか?

単なるサーバ上のKVS

その「サーバ」について、他に何かありますか?

サーバ上の値を調査しやすくするためにローカルにダウンロードするスクリプトが用意してあって、それを使ってたしかに問題のログの冒頭が途切れてるのを見たのだが、その時に他にも数件ダウンロードされたな。それらがどんなデータなのかも見てみるべきか

あなたはその「サーバ」をどう知るのですか?

サーバがどんな状態になってるか知る一番いい方法がそれだからね

その「サーバ」は、どこにありますか?

ローカルにあるコピーを観察してくる
> サーバがどんな状態になってるか知る一番いい方法がそれだからね
この「サーバ」に関して、何が起こるとよいですか?

わかった、ログは消えたのではなく二つの会話に分かれてる

その「会話」は、どんな「会話」ですか?

つまり、僕は一つの会話をしているつもりでいたが、何らかの操作ミスかなにかで一つ目の会話の最中に別の新しい会話を開始してしまっていたようだ

その「会話」について、他に何かありますか?

いまブラウザに保存されてた過去の会話一覧を見てきたのだが、たしかに2つの会話があった。それに気づかずに2つ目の会話が終わったタイミングでログ表示をしたから、後半の会話のログしか表示されず「前半が失われた?!」と勘違いしたわけか。前半のログも問題なく見れた。

あなたはその「会話」をどう知るのですか?

過去の会話一覧機能をつけておいて良かったね。そこを見ればわかる。

その「会話」は、何のようですか?

消えても構わない口頭の会話と違って、ログが残って後から読み返せることを大事だと思ってる。書き物のイメージなんだな。だから「ログが消えた?!」と焦ったけど、とりあえず消えてはないことがわかって一安心。

その「会話」は、どこから来るのですか?