> ## Documentation Index
> Fetch the complete documentation index at: https://docs.roboticks.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Email

> Per-event emails and daily digests for the V&V loop. Per-recipient channel preferences. Distribution lists. Calm-by-default cadences.

# Email

Email is the quiet integration. Use it for compliance distribution lists, off-hours summaries, and anyone who'd rather a single morning digest than a stream of Slack pings.

## Two modes

Roboticks supports two email cadences per recipient:

| Mode             | When it sends                                  | Best for                                               |
| ---------------- | ---------------------------------------------- | ------------------------------------------------------ |
| **Per-event**    | Immediately on the event                       | On-call backup, distribution lists for critical events |
| **Daily digest** | One email per day, in the recipient's timezone | Managers, compliance officers, weekly-review folks     |

A recipient can mix modes — e.g., per-event for `evidence_pack.generation_failed`, daily digest for everything else.

## Set up

<Steps>
  <Step title="Add an email connector">
    **Settings → Integrations → Email → Add**. Name it for the audience (e.g., `compliance-officers`).
  </Step>

  <Step title="Recipients">
    Comma-separated mailboxes:

    ```
    qa-lead@acme.com, compliance@acme.com, robotics-eng@acme.com
    ```

    Distribution lists work fine — DL members each apply their own per-recipient preferences if they have a Roboticks account.
  </Step>

  <Step title="Default cadence">
    Pick **per-event** or **daily digest** as the connector default. Recipients with Roboticks accounts can override per event type.
  </Step>

  <Step title="Pick event types">
    Toggle the events to route. Defaults are conservative: `evidence_pack.generated` and `evidence_pack.generation_failed` on, the rest off.
  </Step>

  <Step title="Send test">
    Hit **Send test email**. A sample arrives within seconds.
  </Step>
</Steps>

## Per-recipient preferences

Anyone with a Roboticks account at **app.roboticks.io → Profile → Notifications** can override the connector defaults for events that involve them:

* Project they're a member of
* Requirement they authored
* Test run they triggered

```
Notification preferences for amir@roboticks.io
────────────────────────────────────────────────────
test_run.completed (failed)        per-event
test_run.completed (passed)        off
requirement.gap_opened             daily digest
evidence_pack.generated            per-event
evidence_pack.generation_failed    per-event
standard.amendment_published       per-event
runner_pool.offline                off
```

These preferences override connector-level routing **for the recipient's own mailbox** only — they don't affect the rest of a distribution list.

## Sample emails

### Per-event — test run failed

```
Subject: [Roboticks · warehouse · FAIL] Run 8a1f3c2d on main

Run 8a1f3c2d — main @ 0xabc123
Status: FAIL · 411/412 tests · 2m 19s · prod-gpu-farm

Failed test
  tests/test_estop.py::test_estop_halts_motion
  AssertionError: stop reached at 142ms (budget 100ms)

Affected requirement
  REQ-001  E-stop halts motion within 100 ms  → uncovered

Pull request: #214 "Faster brake controller"

[View run]  [LLM triage]  [Open PR]
```

### Daily digest

```
Subject: [Roboticks digest · warehouse · 2026-05-24]

Last 24h
  3 PRs · 47 test runs · 46 pass / 1 fail
  Requirement coverage: 142/160 confirmed (88.75%), -1 vs yesterday

Notable events
  GAP    REQ-051  Tool-change interlock (no confirming test since 2026-05-21)
  GAP    REQ-072  Compliance: torque cut-off (test renamed in #218)
  EV     v2.4.0 evidence pack generated (4.2 MB, 142 hash-chain entries)

Pinned standards
  ISO 10218-2:2025 — no amendments in window

[Open dashboard]  [Manage preferences]
```

## Calendar-aware digests

Daily digests respect:

* The recipient's **profile timezone** (UTC by default)
* A **quiet-hours window** (default 22:00–07:00 local) — events that would page during quiet hours queue for the morning digest
* A **weekend mode** (off by default) — Saturday/Sunday digests can be suppressed for non-on-call roles

Configure at **app.roboticks.io → Profile → Notifications → Digest schedule**.

## Deliverability

|                       | Value                                         |
| --------------------- | --------------------------------------------- |
| Sender domain         | `notify.roboticks.io`                         |
| SPF                   | `v=spf1 include:amazonses.com ~all`           |
| DKIM                  | RSA-2048, rotated annually                    |
| DMARC                 | `p=quarantine; rua=mailto:dmarc@roboticks.io` |
| One-click unsubscribe | RFC 8058 (per-recipient)                      |

If your gateway is aggressive, allowlist `notify.roboticks.io` and `noreply@roboticks.io`. The bounce rate from us is sub-0.1%, so deliverability issues are almost always at the receiver end.

## Multiple connectors

You'll often want several email connectors:

| Connector             | Recipients               | Default cadence | Event filter               |
| --------------------- | ------------------------ | --------------- | -------------------------- |
| `compliance-officers` | DL `compliance@acme.com` | daily digest    | evidence-pack events only  |
| `qa-team`             | DL `qa@acme.com`         | per-event       | all test events            |
| `on-call-backup`      | individual mailboxes     | per-event       | `runner_pool.offline` only |

## Troubleshooting

<AccordionGroup>
  <Accordion title="No emails arrive">
    Check the delivery log at **Settings → Integrations → Email → Delivery log**. Status `bounced` means the recipient's mailbox rejected; `dropped` means our pre-send checks (SPF, DKIM) flagged the recipient domain.
  </Accordion>

  <Accordion title="Recipients getting too many emails">
    Switch them to daily digest via **Profile → Notifications**, or remove them from the connector's distribution list and have them subscribe per-recipient.
  </Accordion>

  <Accordion title="One-click unsubscribe broke a distribution list">
    DL members who unsubscribe only mute their own delivery — the DL itself is unaffected for everyone else. Use individual mailboxes if you need DL members to opt out without affecting peers.
  </Accordion>
</AccordionGroup>

## Best practice

* Reserve per-event for the events that actually need real-time attention.
* Use distribution lists, not individual mailboxes — survives team changes.
* Wire **one** connector to `evidence_pack.generated` and route it to the auditor's mailbox; that's the most common use of email in regulated shops.
