0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バックアップは3件復元できた。返信先だけが戻らなかった

0
Posted at

HTTP 200、messagesImported: 3。3件の本文もIDも戻っている。それでも、返信先の情報だけが消えるケースを再現しました。

AI運用の開発プロジェクト aichance で、2026年10月16日に行ったローカル検証です。対象は WA-archiverの固定コミット(package 1.1.0-beta.1)、サーバーSQLiteモード。検証対象の元ファイル222件が固定版と一致することを確認し、アプリを変更せず、架空のテキストメッセージだけを使いました。作者本人による実行報告ではありません。

復元前と復元後

親メッセージ、通常メッセージ、親への返信の3件を用意します。返信は通常のメッセージ作成APIへ replyToId を渡して作り、保存後のAPIと画面の両方で、親への参照が成立していることを先に確認しました。

バックアップ前には、返信本文の上に引用が表示されています。

バックアップ前。架空の親メッセージへの引用が返信の上に表示されている

実際の Settings → Download backup (.json) で得た1,783bytesを、別に作った空のSQLite DBへ Restore from backup からそのまま渡し、再読み込みします。

復元後。3件の本文は残るが、返信本文の上の引用が消えている

比較対象 バックアップ前 復元・再読み込み後
メッセージ件数 3 3
ID・本文・日時など、replyTo以外の全選択項目 保存値 一致
返信のreplyTo 親のID・送信者・本文・種別を持つオブジェクト null
返信内の親メッセージの引用 表示 非表示

通常のメッセージ取得APIが返す3レコードを全項目比較すると、差分は返信1件の replyTo だけでした。通常項目が残ったことを確認する対照と、関係が残ったことを確認する検査を分けたため、「全部壊れた」という曖昧な結果にもなりません。

エクスポート同士を比べると見逃す

この固定版では、バックアップのGETが replyToId を出力せず、復元するPOSTもその関係を保存していませんでした。

つまり、エクスポートしたJSONと、復元後にもう一度エクスポートしたJSONの共通項目だけを比べると、どちらにも返信先が存在しません。比較対象から最初に落ちた項目は、一致しているように見えてしまいます。

今回は、返信関係を解決して返す通常のメッセージAPIを観測に使いました。画面の引用表示も別に確認しています。検査対象のエクスポーターだけに、何を比較するかを決めさせないことがポイントでした。

ブラウザを新しくするだけではDBは空にならない

このアプリの今回のモードはサーバーSQLiteです。ブラウザコンテキストを新しくしても、同じサーバーを使えばDBは共有されたままです。

検査コードは送出元・復元先に別々の新規SQLiteファイルを作り、子プロセスごとにDBパスを指定しました。復元先は事前にチャット一覧が空、検証チャットの取得が404であることを確認しています。その後、実際にダウンロードしたバイト列を復元UIへ渡しました。JSONの作り直しや、復元後のレコードの補修は行っていません。

画面が自動生成する空のSaved Messagesチャットは重複として1件スキップされ、検証用チャット1件・メッセージ3件が取り込まれました。成功件数と、守りたい値の一致は別々に確認します。

普通の保存検査は2件ともPASSしていた

App Crash Lab 0.10.0 で、このアプリの次の2件はPASSしています。

  • 保存後に再読み込みしても、選択した全メッセージDTOが変わらない。
  • 壊れたJSONをHTTP400で拒否した後も、保存値が変わらない。

生成した通常のPlaywrightも、別実行で2件PASSしました。CLIと生成テストは同じプロトコルを共有しており、独立した検査アルゴリズムではありません。

バックアップは別の経路を通ります。そこで実ファイルの復元まで追加すると、今回の返信関係の欠落が見つかりました。

なお、App Crash Lab 0.10 の組み込みバックアップ検査はブラウザ内の保存レコードが対象です。今回のサーバーDBの往復は、別のPlaywright補助コードで実行しています。組み込み機能でサーバーSQLiteを検査できた、という報告ではありません。

自分のアプリへ持ち帰るなら

  1. 意味のある親子・参照・依存関係を通常の操作で作り、保存できたことを確認する。
  2. 復元先を、実際の保存先の単位で空にする。新しいブラウザと新しいDBを区別する。
  3. アプリが出した実ファイルを、そのまま通常の復元UIへ渡す。
  4. エクスポート形式だけに依存しない観測経路で、選択した完全レコードと関係を比較する。

再実行用キット・通常検査のJSON・元のバックアップ・実測結果をGitHubで公開しています。検証済みの起動手順はREADMEにあります。サーバー起動も管理する補助コードはmacOS/Linux向けで、実測はmacOS・Node22.16.0です。自身のアプリへ導入する場合は、セレクターと観測項目を実際の保存仕様に合わせてください。

対象は今回の3件の架空テキストと引用表示です。Android、端末内SQLite/OPFS、メディア、予約メッセージ、DB全体の忠実な復元は別の検査が必要です。

次のリリース前に見返したい方は、必要ならリポジトリをStarで保存しておいてください。自分のアプリで試した結果や導入で詰まった点も、Issueで受け付けています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?