NOTIFIER is NOTIFY + INTEL composed. Scope determines the route. Ledger determines the proof.
Primitive: NOTIFY (what you SEND) + INTEL (what you KNOW)
Service: NOTIFIER (governed cross-scope delivery product)
Instance: notify: {TARGET} in any CANON.md header
Hosted on Cloudflare Worker (canonic-services @ api.canonic.org).
``
POST /talk/send
{
“to”: “
Response:
{
“ok”: true,
“id”: “
` GET /talk/inbox?scope=X&limit=50&offset=0
Response:
{
“scope”: “
`
POST /talk/ack
{
“ids”: [“
Response:
{
“ok”: true,
“acked”:
| Method | Path | Auth | Purpose |
|---|---|---|---|
| POST | /talk/send | Bearer | Deliver cross-user message |
| GET | /talk/inbox?scope=X | Bearer | Read inbox for scope |
| POST | /talk/ack | Bearer | Mark messages as read |
Routes are declared in GOV, not configured at runtime.
`` GOV declaration: notify: DEXTER (in FATIMA/CHAT/CANON.md) Compiler output: “notify”: [“DEXTER”] (in CANON.json) Runtime delivery: inline at /talk/ledger write time Storage: inbox:{TARGET} in KV `
Discovery: magic scan walks all CANON.md notify:` headers → builds route table. Never hardcoded.
Runtime: Cloudflare Worker (canonic-services)
Storage: TALK_KV namespace (inbox:{PRINCIPAL} keys)
Delivery: Inline at ledger write time — no polling, no delay
| Field | Type | Required |
|---|---|---|
| id | string | yes |
| ts | ISO-8601 | yes |
| from | string | yes |
| to | string | yes |
| message | string | yes |
| context | string | no |
| read | boolean | yes |
| meta | object | no |
Every delivery creates a LEDGER entry:
type: NOTIFIER
key: {sender_scope}→{receiver_scope}
inventor: {sender}
work_ref: notifier:{id}
| *NOTIFIER | SPEC | SERVICES* |