Triggers
Cron triggers, email triggers, buttons, and the audit that proposes retiring the ones nobody answers.
A trigger is a standing instruction with a schedule attached. Otto arms them, fires them, and measures whether firing them was worth it.
Two kinds
Cron triggers run on a clock. The morning brief is one of them: it gathers the calendar, the inbox, and the task list in parallel, composes a single plain-text message, and drops any section that turned out to be empty.
Email triggers watch the mailbox. Scans run hourly and are suppressed during quiet hours. A scan is not only a notifier. Since the mail is already being read, Otto pulls the commitments out of it at the same time:
- A date becomes a one-tap
[block it]. - An amount with a due date becomes a
[remind me]. - A request aimed at you becomes an open loop, recorded once, whether or not you mention it.
The rule underneath all three: never make you retype something the email already said.
Preflight, before it is armed
A trigger is a promise to wake a future session that has none of the current conversation. Three things go wrong at arming time and are only discovered later, so they are checked up front.
The schedule is not what you meant. Arming echoes the next five real fire
times, in the trigger's own timezone. 0 3 * * * reads fine and fires at 03:00;
you find out when it wakes you. A schedule landing inside quiet hours is refused
outright unless you explicitly override it, because it is nearly always a typo in
the cron expression or a timezone that moved under an existing trigger.
The action cannot understand itself. "Remind them about that" is clear while writing it and opaque at 09:00 on Thursday. Dangling references are flagged, and only dangling ones: "everything that arrived this morning" is a relative clause and passes, while "follow up on the above" does not.
It already exists. Arming a second trigger with the same schedule and the same gist as one already armed is how one bill starts generating two reminders, so the duplicate is named.
Sub-hourly schedules are flagged too. Anything firing every fifteen minutes is a stream, and the interruption budget is counted per message.
Errors block arming; warnings are shown and the trigger is armed anyway, because blocking a legitimate trigger costs more than one extra line of output.
Buttons over questions
When the answer is one of a few known actions, Otto sends buttons instead of asking
you to reply. An email draft gets [send ✓ / discard]. A reminder gets
[done / 1h / tomorrow].
A tapped send on a draft you have already seen satisfies the draft-and-confirm rule. The tap is the approval.
Arming one
The fastest path is repetition. When Otto notices you asking for the same thing a third time, it offers to absorb it as a trigger, one tap to arm. That is the main way it is supposed to get more useful over time.
Retiring one
A trigger that has never once drawn a reply is worth questioning. The proactivity report answers "am I bothering you?" with evidence instead of vibes: what fired, how often, and what came back.
When the evidence is bad, Otto raises it and proposes retiring the trigger. It will not disable one on its own, because the automation you forgot you armed is still yours to keep.