Skip to content

予定を全件取り直す「再同期」を追加 - #34

Merged
sasagar merged 1 commit into
mainfrom
dev
Jul 28, 2026
Merged

予定を全件取り直す「再同期」を追加#34
sasagar merged 1 commit into
mainfrom
dev

Conversation

@sasagar

@sasagar sasagar commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

なぜ

f561f56(アプリ外で削除された予定が消えないバグ)の修正はこれから届く削除通知にしか効かない。既に取りこぼした分は Google 側の syncToken が先に進んでいるため二度と送られてこない。

全同期は applyFullSyncAtomic が stale を全消しして置き換えるので、全同期さえ走れば残骸は消える。しかし利用者が全同期をやり直す導線が無かった。

状態を持つ同期は、バグの影響が修正後も残る。カーソル (syncToken) で「どこまで受け取ったか」を管理していると、取りこぼしはカーソルの先に置き去りになる。

サーバー側は変更していない

調査の結果、POST /api/syncSyncRequest.forceFull(2026-07-22、eventType バックフィル用に追加)が既に「syncToken を無視して全同期する」を実現していた。破棄用エンドポイントを足すと同じ結果に至る第二の経路と認可面が増えるだけなので追加していない。欠けていたのは UI の導線だけだった。

付随して直した既存バグ: scheduler の trailing rerun

syncScheduler.ts は「走行中なら完了後にもう1回だけ再実行する」方式だが、再実行するのが初回の run だった。そのため通常同期の走行中に再同期を要求すると、全同期が黙って増分同期に格下げされる。利用者が明示的に押す脱出口が、たまたま同期中だったというだけで効かないのは致命的。rerunRequestedSetMap<key, SyncRunner> にして最後に要求された run を使う。同一キーの run は「同じカレンダーを同期する」処理で互換なので、より新しい要求(= より強い要求を含みうる)を採るほうが常に安全側。回帰テスト2本追加。

UI

設定モーダルのキャッシュ削除の直下。住み分けを文言で明示した。

  • 表示が古い → キャッシュを削除して再読み込み(表示用ファイルの入れ替え)
  • 予定の中身がおかしい → 再同期(予定データの取り直し)

2段階確認。通信量と時間がかかること、作業実績・連携アカウント・設定は消えないことを明記。

2段階確認 UI が5つ目になったので ConfirmActionControl に畳んだ。DOM は1文字も変えていない(クラス名・要素の並び・disabled の付き方まで同一)。正味 −約120行。

デスクトップ版への一言

isTauri() のときだけ、ビルド情報の直下に「最新にするには ⌘R(またはトレイの「再読み込み」)」。リモート URL 方式で再デプロイが自動反映されないため、「古いビルドを見ていると気づかせる」ためのビルド情報に対して次の行動が書いていないのは片手落ちだった。ブラウザ/PWA には出さない。

検証

  • pnpm --filter web test 1076 passed / pnpm --filter sync test 615 passed
  • 両 typecheck / pnpm lint(エラー0、警告はベースラインと同数)/ build / build:site
  • 実ブラウザでライト/ダーク/スマホ、確認前・確認中・実行中・完了・失敗の各状態を確認

🤖 Generated with Claude Code

https://claude.ai/code/session_01HGESE2zBNzoW8MYvtEySBQ

削除通知の取りこぼしを直しても(f561f56)、既に取りこぼした分は syncToken が
先に進んでいるため二度と届かない。全同期は applyFullSyncAtomic で stale を全消しして
置き換えるので、全同期さえ走れば残骸は消える ― しかし利用者が全同期をやり直す導線が
無かった。

サーバー側は変更していない。POST /api/sync の forceFull(2026-07-22、eventType
バックフィル用)が既に「syncToken を無視して全同期する」を実現しており、破棄用の
エンドポイントを足すと同じ結果に至る第二の経路と認可面が増えるだけになる。
欠けていたのは UI の導線だけだった。

あわせて syncScheduler の trailing rerun を直した。通常同期の走行中に schedule() された
場合、これまでは初回の run を再実行していたため、**再同期が黙って増分同期に格下げされる**。
利用者が明示的に押す脱出口が、たまたま同期中だったというだけで効かないのは致命的なので、
最後に要求された run を使うようにした。同一キーの run は互換なので、より新しい要求を
採るほうが常に安全側になる。

設定モーダルの2段階確認 UI が5つ目になったので ConfirmActionControl に畳んだ。
DOM は1文字も変えていない(クラス名・要素の並び・disabled の付き方まで同一)。

デスクトップ版のときだけ、ビルド情報の直下に ⌘R で読み直す旨を出す。リモート URL 方式で
再デプロイが自動反映されないため、「古いビルドを見ていると気づかせる」ビルド情報に対して
次の行動が書いていないのは片手落ちだった。

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HGESE2zBNzoW8MYvtEySBQ
@sasagar
sasagar merged commit a722a7e into main Jul 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant