# CONSTRAINTS — メール配信システム（不変条件・禁止事項）

## 1. 絶対遵守（破壊操作）
- 実メール送信は `DRY_RUN=false` かつ `broadcast.approved=true` のときのみ。既定 `DRY_RUN=true`。
- ステップメール実送信も同条件（DRY_RUN/approvedゲート）。
- 本番DB破壊・全削除を行うAPIを作らない。

## 2. 冪等性
- broadcast_sends(broadcast_id,subscriber_id) / step_sends(enrollment_id,step_email_id) / subscribers(email) は一意。
- 予約配信は楽観ロック（status遷移）で1度だけ送信。
- Resend呼出に Idempotency-Key を必ず付与。

## 3. 上限（費用/レート）
- 1ティック送信 ≤ MAX_SENDS_PER_TICK（既定100, Resend batch上限に整合）。
- 1日送信 ≤ MAX_SENDS_PER_DAY（既定2000）。超過分は次ティック/翌日へ繰越。

## 4. 法令・到達率
- 全配信本文に配信停止リンク `/u/:token` と送信者表示（SENDER_INFO）を自動付与。
- status が unsubscribed / bounced の購読者は送信対象から除外。

## 5. セキュリティ
- 管理API/ページは認証必須。秘密はenv。CookieはHttpOnly+Secure+SameSite=Lax。
- トークンは crypto 乱数。Resend Webhook は署名検証。

## 6. 禁止事項（失敗から昇格 / FP-XXX）
- （初期）未承認・DRY_RUN中に実送信しない。
- （初期）スケジューラで status を確認せず送信しない（楽観ロック必須）。
- （初期）成果物（既存ファイル）を退避なしで上書き・削除しない（グローバル原則）。
