feat(pmo): loop-sms-watch bridge + native notify TASK (ticket 522), gated on bootstrap
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
# TASK: harness native SMS notifier — `[notify]` (alpha wiring, Redmine 522)
|
||||
|
||||
## Context
|
||||
Charles (2026-08-29): "wire the sms ping into the go harness for alpha."
|
||||
He watches Redmine/Gitea/SMS today. The bash bridge (loop-sms-watch.sh)
|
||||
covers the interim; THIS replaces it natively. Runs AFTER the bootstrap
|
||||
turn (gated) — build on the containerized loop.
|
||||
|
||||
## Scope
|
||||
1. `[notify]` harness.toml section:
|
||||
- smtp_host / smtp_user_ref / smtp_pass_ref / from (key refs: env:
|
||||
or mpk: — keyproxy-ready per #497), rcpt = 8182807059@tmomail.net
|
||||
(config, not hardcoded), min_severity (info|ok|warn).
|
||||
- enabled=false default; absent section = zero behavior change.
|
||||
2. Go notifier (stdlib net/smtp, STARTTLS; AUTH PLAIN/LOGIN):
|
||||
- Events: turn complete (task id + title), turn failed (error class),
|
||||
quota wall deferral, loop scan error, daemon start/stop.
|
||||
- Message format mirrors ping-charles.sh: `[SEV MM-DD HH:MM MOPAC] ...`
|
||||
- Rate limit: max N per window (config, default 20/hour) — never
|
||||
SMS-flood; identical consecutive failures collapse with a counter.
|
||||
- Send failures: log + queue in state (retry next event), never block
|
||||
the loop; never include credential material (redaction rules).
|
||||
3. Tests: fake SMTP server (table-driven): auth, STARTTLS skip option,
|
||||
event mapping, rate-limit collapse, queue+retry.
|
||||
4. Wire the alpha container config (notify enabled once Charles drops
|
||||
SMTP creds in the env-file tonight); document in runbook.
|
||||
|
||||
## Deliverable
|
||||
`REPORT-20260829-1600-notify.md` in `~/.coordinate/inbox-pmo/`: config
|
||||
surface, event list, test results, exact env-file keys Charles fills in.
|
||||
Reference in New Issue
Block a user