purpose / 目的
DO 移行 (#71 ) で失われた auto-purge 機能 (#29 / #33 / PR#30) を Durable Objects 版 WebhookStore に再移植し, 処理済み webhook イベントの無制限蓄積による DO ストレージ肥大を止める.
premise / 前提
現状の WebhookStore (worker/src/store.ts) の mark_processed は processed=1 を立てるだけでイベントを削除しない (DELETE FROM events が存在しない). 処理済み行が永続的に蓄積する.
旧 events.json 版には PR#30 で auto-purge があったが, Tenant routing and data isolation with Durable Objects #71 の DO 移行で移植されず, docs (0-requirements.md の PURGE_AFTER_DAYS / F4.5 の purged 戻り値) も後の書き直しで消滅している.
イベントは 1 テナント = 1 DO (store-{account_id}) で, 各 DO 内 SQLite の events テーブルに保存される.
無料枠は DO 1 個あたり 1GB / アカウント合計 5GB. 処理済み死蔵行がこれを食う.
教訓: 当時 purge を守る CI テストが無かったため移行で静かに regression した. 今回はテスト必須.
constraints / 制約
purge は mark_processed 実行時に, processed=1 かつ received_at が保持期間 (PURGE_AFTER_DAYS 日) より古いイベントを DELETE する.
保持期間は環境変数 PURGE_AFTER_DAYS で設定可能. 既定 = 7 (日). worker/wrangler.toml の [vars] に追加.
DO が env を読むための型は store.ts にローカル最小定義し, index.ts の Env への循環 import を避ける.
unprocessed イベントは保持期間に関わらず削除しない.
mark_processed の戻り値に削除件数を含める (例: { success, event_id, purged }). 旧 F4.5 と整合.
docs/0-requirements.md および docs/0-requirements.ja.md に auto-purge 仕様 (PURGE_AFTER_DAYS, mark_processed の purged 戻り値, 構成テーブル) を同一 PR で復活させる. docs 分割 PR 禁止.
既存テストとの相互作用に注意: store.test.ts の既存 mark-processed テスト (m1 を received_at "2026-01-01" で ingest して mark し /event?id=m1 が processed=true で再取得できることを期待) は, 既定 7 日 purge では mark 時に即削除され 404 になり壊れる. 新挙動 (保持期間超過の処理済みは消える) に合わせて既存テストを更新すること. テストの "now" は実時刻なので received_at を相対的に制御して設計する.
scope out / スコープ外
TenantRegistry の quota (events_stored, 上限 10000) の decrement 連動は本 issue で扱わない. purge で行削除しても件数 quota は減らない (lifetime カウンタ) 問題は軸が別. /quota-decrement エンドポイントは既存だが未配線. 別 issue 候補として記録のみ.
DO Alarms による定期 purge は任意の将来拡張. 本 issue は feat: purge processed events from events.json #29 に忠実に mark_processed トリガのみ実装する.
target files / 対象ファイル
worker/src/store.ts
worker/wrangler.toml
worker/test/workers/store.test.ts
docs/0-requirements.md, docs/0-requirements.ja.md
completion conditions / 完了条件
Refs #29 #33 #71
purpose / 目的
DO 移行 (#71) で失われた auto-purge 機能 (#29 / #33 / PR#30) を Durable Objects 版
WebhookStoreに再移植し, 処理済み webhook イベントの無制限蓄積による DO ストレージ肥大を止める.premise / 前提
WebhookStore(worker/src/store.ts) のmark_processedはprocessed=1を立てるだけでイベントを削除しない (DELETE FROM eventsが存在しない). 処理済み行が永続的に蓄積する.store-{account_id}) で, 各 DO 内 SQLite のeventsテーブルに保存される.constraints / 制約
mark_processed実行時に,processed=1かつreceived_atが保持期間 (PURGE_AFTER_DAYS 日) より古いイベントをDELETEする.PURGE_AFTER_DAYSで設定可能. 既定 = 7 (日). worker/wrangler.toml の [vars] に追加.Envへの循環 import を避ける.mark_processedの戻り値に削除件数を含める (例:{ success, event_id, purged }). 旧 F4.5 と整合./event?id=m1が processed=true で再取得できることを期待) は, 既定 7 日 purge では mark 時に即削除され 404 になり壊れる. 新挙動 (保持期間超過の処理済みは消える) に合わせて既存テストを更新すること. テストの "now" は実時刻なので received_at を相対的に制御して設計する.scope out / スコープ外
events_stored, 上限 10000) の decrement 連動は本 issue で扱わない. purge で行削除しても件数 quota は減らない (lifetime カウンタ) 問題は軸が別./quota-decrementエンドポイントは既存だが未配線. 別 issue 候補として記録のみ.target files / 対象ファイル
completion conditions / 完了条件
Refs #29 #33 #71