| name | ops-notify |
| description | Tell a human something happened, through whichever channel this repo uses — a Claude push notification by default, or whatever a repo overrides this with. Infrastructure, not a gate: a notification that fails must never fail the work it was reporting on. Idempotent per caller-supplied key, so a sweeping loop cannot send the same message twice. Called by name with (action, context-json) . NOT for direct use — never select it from a description match. |
ops-notify
One way to reach a human, so no loop has to know which way that is.
Visibility: cross-cutting (infrastructure). Any layer may call it — a loop, a service, a
primitive.
It is never a gate. Nothing waits on a notification, nothing branches on one, and a
failure to send MUST NOT fail the work being reported. A loop that lands a PR and then
cannot push-notify has still landed the PR; it says so in the outcome and moves on. Getting
this backwards means an outage in a notification channel stops releases.
Invocation
ops-notify <action> '<context-json>'
| Action | Context | Returns |
|---|
send | { subject, body, urgency?, key? } | { ok, sent } |
An absent context is {}. Reject any other action.
subject — one line. Assume it is all a human reads on a phone.
body — the detail, in plain language. Include the repo and the PR/issue number; a
notification with no address is a notification nobody can act on.
urgency — normal (default) or . means a human is something,
not merely that the loop found it interesting.