purpose / 目的
未処理 webhook イベントの保持上限を導入し, DO ストレージ肥大の唯一残った無限増加経路を塞ぐ. あわせて retention 仕様 (処理済み 7 日 / 未処理 90 日) をユーザー向け README (root + NPM 公開パッケージ) に明記する.
premise / 前提
design / 設計方針
- 未処理 purge:
processed=0 かつ received_at が UNPROCESSED_PURGE_AFTER_DAYS 日 (既定 90) より古いイベントを削除. 既定を長く取るのは未読データ消失の安全域だから (処理済み 7 日との非対称は意図的).
- トリガ: mark_processed のみに依存しないこと. 「消費されない = 未処理が溜まる」放置テナントでは mark_processed が呼ばれず, 掃除が一番要る相手に手が届かない. DO Alarms (
ctx.storage.setAlarm + alarm() ハンドラ) で消費ゼロでも走る時間駆動 sweep を実装する. sweep は期限超過の処理済み (>7 日) と未処理 (>90 日) の両方をまとめて掃除し, alarm() 内で次回を再スケジュールして周期実行する (例: 日次).
- 既存の mark_processed 時 purge は即時性のため残してよいが, 本質的な保証は Alarms sweep が担う.
- 既知の限界 (スコープ外): 時間窓は「古さ」を縛るが「量」は縛らない. 高頻度 x 無消費テナントは 90 日窓があっても 1GB 壁に先に到達しうる. 量ベースの hard cap (最新 N 件 / 最大 M バイト) は別 issue 候補として記録のみ.
- DO Alarms が現プランで制約/不可の場合: それを surface した上で mark_processed トリガにフォールバックし, 放置テナントの限界を docs に明記する (ブロックしない).
constraints / 制約
- 新規 env
UNPROCESSED_PURGE_AFTER_DAYS (既定 90) を worker/wrangler.toml [vars] に追加. 既存 PURGE_AFTER_DAYS (処理済み, 7) は just-shipped のため改名せずそのまま.
- docs/0-requirements.md と docs/0-requirements.ja.md に未処理 retention と Alarms sweep を反映 (同一 PR, docs 分割禁止).
- README 二枚に retention 仕様を明記:
- README.md (リポジトリ root)
- mcp-server/README.md (NPM 公開パッケージ
github-webhook-mcp の README)
- 内容: 処理済み 7 日 (
PURGE_AFTER_DAYS) / 未処理 90 日 (UNPROCESSED_PURGE_AFTER_DAYS) / Alarms による自動 sweep / 既定値と env 可変であること.
- NOTE: local-mcp/ は private (未公開) のため README 更新対象外.
- テスト: 未処理 >90 日が sweep で削除 / 未処理 <90 日は残る / 処理済み >7 日が sweep で削除 / alarm が再スケジュールされる, を検証.
scope out / スコープ外
target files / 対象ファイル
- worker/src/store.ts
- worker/wrangler.toml
- worker/test/workers/store.test.ts
- docs/0-requirements.md, docs/0-requirements.ja.md
- README.md
- mcp-server/README.md
completion conditions / 完了条件
Refs #234 #235 #233 #29
purpose / 目的
未処理 webhook イベントの保持上限を導入し, DO ストレージ肥大の唯一残った無限増加経路を塞ぐ. あわせて retention 仕様 (処理済み 7 日 / 未処理 90 日) をユーザー向け README (root + NPM 公開パッケージ) に明記する.
premise / 前提
mark_processed時,processed=1かつreceived_atがPURGE_AFTER_DAYS日 (既定 7) より古いものを削除.processed=0) は age に関わらず一切削除されない (feat: purge processed events from events.json #29 の安全側設計: 未読 = ユーザー未確認, 黙って捨てない).design / 設計方針
processed=0かつreceived_atがUNPROCESSED_PURGE_AFTER_DAYS日 (既定 90) より古いイベントを削除. 既定を長く取るのは未読データ消失の安全域だから (処理済み 7 日との非対称は意図的).ctx.storage.setAlarm+alarm()ハンドラ) で消費ゼロでも走る時間駆動 sweep を実装する. sweep は期限超過の処理済み (>7 日) と未処理 (>90 日) の両方をまとめて掃除し, alarm() 内で次回を再スケジュールして周期実行する (例: 日次).constraints / 制約
UNPROCESSED_PURGE_AFTER_DAYS(既定 90) を worker/wrangler.toml [vars] に追加. 既存PURGE_AFTER_DAYS(処理済み, 7) は just-shipped のため改名せずそのまま.github-webhook-mcpの README)PURGE_AFTER_DAYS) / 未処理 90 日 (UNPROCESSED_PURGE_AFTER_DAYS) / Alarms による自動 sweep / 既定値と env 可変であること.scope out / スコープ外
target files / 対象ファイル
completion conditions / 完了条件
Refs #234 #235 #233 #29