951 B
951 B
1. Schema & Notify
- 1.1
db/schema.sql: idempotentorders.renews_at TIMESTAMPTZ;make db-up - 1.2
internal/notify: Notifier (ntfy POST + sms via sms.Sender;NOTIFY_CHANNELenv: ntfy|sms|both;NTFY_URL/NTFY_TOPICenv)
2. Gating Integration
- 2.1
scan.go:shouldAlertreturns (bool, reason); lapsed branch uses renews_at lazy expiry; handler callsnotifyUnlockwhen blocked by lapsed or credits (message: plan lapsed / out of credits + tag link)
3. Admin
- 3.1 OrderResource:
renews_atdate-time picker + table column; lapsed badge when past due
4. Verification
- 4.1 New suite: order paid + renews_at past → blocked + unlock notice logged; credits exhausted → blocked + notice; NOTIFY_CHANNEL=sms → notice via log sender; unpaid (non-paid status) → notice
- 4.2 Regressions (72) green; deploy (frontend binary; admin restart)
- 4.3
openspec validate renewal-unlock; commit