Brain Task Reminders

Open tasks a brain is waiting on — tracked in a table, mirrored into the brain's note, and swept daily into reminders across email, in-app notifications, and the session surface.

A brain often needs something it doesn't have yet — a photo, an answer only one person has, a document to upload. Brain task reminders give that "waiting on" state a durable home: it's tracked, mirrored where you can read it, and swept into reminders on its own schedule instead of depending on someone remembering to bring it up.

Opening and closing a task

Two MCP tools do the work mid-session:

  • open_brain_taskbrain_id, description, addressee ("owner" or "share"), and due_date (optional, YYYY-MM-DD). Addressing a task to "share" requires a share_id from a prior share_brain call — the recipient must already be shared with the brain.
  • close_brain_tasktask_id. Closing removes the task from the next digest, the brain's note, any still-staged reminder for it, and the top-of-session surface.
open_brain_task({
  brain_id: "<uuid>",
  description: "Photo of the front lawn, wide angle",
  addressee: "owner",
  due_date: "2026-10-01"
})

Where open tasks show up

  • The brain's compiled note carries an ## Open Tasks section, split into "Yours" (owner-addressed) and "Owed by others" (share-addressed), regenerated from the table — never hand-edited. It updates immediately when a task opens, closes, or reopens, not just on the next full compile.
  • The admin UI/admin/brain-tasks (linked from /admin/brain) lists every open task across your brains, with Close, Silence, and Reopen actions, plus a Staged Reminders panel described below.
  • The next session with that brain surfaces open tasks at the top, via the same compiled-note section get_brain returns.

The daily digest

A daily sweep finds tasks past their next reminder time and sends:

  • Owner-addressed tasks — a reminder goes out immediately, no staging, since nothing needs previewing for a message to yourself.
  • Share-addressed tasks — the reminder is staged behind a hold window (2 hours by default) rather than sent immediately. You get one digest email listing exactly what's queued and to whom, delivered before anything staged can possibly go out, with a one-click cancel link per item. Cancelling skips only that occurrence — the task stays open and comes up again next cycle. Silencing a task (from the admin UI) is the separate, explicit action for "stop asking about this" rather than "not today."

Reminder cadence backs off the longer a task goes unaddressed (starting daily, doubling up to a configurable cap), and tightens back to daily once a due date is close or has passed — the message states the age in days and, once due, how many days overdue.

Replying closes the loop

A shared recipient answers by replying to the reminder email — no login required, the same inbound path share_brain already uses. The reply is classified before it closes anything: a strict, typed judgment (not prose-parsing) decides whether the reply clearly resolves the ask, only partially addresses it, asks a question back, or is unrelated. Only a clear resolution closes the task; anything else leaves it open, and a classification failure always fails open rather than silently marking something done. You can reopen a task from the admin UI if a reply closed something it shouldn't have.

Configuration

All thresholds are environment variables with sane defaults — see BRAIN_TASKS_HOLD_WINDOW_MINUTES, BRAIN_TASKS_BASE_INTERVAL_DAYS, BRAIN_TASKS_MAX_INTERVAL_DAYS, BRAIN_TASKS_DUE_SOON_DAYS, and the BRAIN_TASKS_JEV_* reply-classification knobs. None require a redeploy to change.

Want this page as machine-readable markdown? GET /docs/features/brain-task-reminders.md