Board Digest
A kanban board is only a to-do list if people open it. This job removes the opening: every morning it reads each person’s open cards straight off the boards, orders them by due date, marks anything late, and puts the list in their inbox with one link back to the board. It never creates, moves or closes a card; it only reads them out.
Cards in, one email each out
Four steps, two of them human and both of them on the board. The job in the middle is a single read, a sort, and a send per person. The step cards below say exactly which cards make the list.
How each step works
The only input the digest has is the board as it stands. A card counts when it is assigned, not done, not archived, and a top-level card rather than a subtask, on a board that is active and not archived. A due date is optional; the digest orders by it when present.
One query pulls every qualifying card with its board and its assignee’s name and email. A second read checks which assignees are active team members; anyone else is dropped. Cards are grouped by person, sorted by due date ascending with undated cards last, and a card is flagged overdue when its due date is before today’s date. Someone with no qualifying cards is never in the map, so they never get an email.
Each person gets one transactional email: a greeting by preferred name, the count of open tasks, then one line per card with its title linked to its board, the board name and the due date, red and marked overdue when late, and a link to the Workboard. A send that is accepted is logged with the kind and the card count; a rejected send is logged as an error and the loop moves on, so one bad address never blocks the rest. The run returns recipients and emailed, and those two numbers are what Settings → Agents shows.
The reply to the email is on the board: move the card, set a due date, close it. Tomorrow’s digest reads the result. The email carries no buttons and accepts no replies, because the board is the system of record and the digest is only its mirror.
Every exception has an owner
Most rows here are filters rather than failures: the digest is deliberately narrow about which cards it reads out. The last four are the ones to watch on Settings → Agents.
| Condition | What happens | Where you hear about it |
|---|---|---|
| Person has no open cards | No email at all; silence means a clear board | Nowhere, by design |
| Assignee is not an active team member | Their cards are skipped; no email | Nowhere, by design |
| Board is not active, or has been archived | Its cards are left out of every digest | Nowhere, by design |
| Card is a subtask | Not listed; only top-level cards count | Nowhere, by design |
| Card has no due date | Listed after every dated card as “no due date”; never overdue | The email |
| Due date is before today | Date shown in red with “(overdue)” | The email |
| Card is done, or archived | Excluded; the query only reads open, unarchived cards | Nowhere, by design |
| Mail provider key missing | Nothing is sent; a warning is logged per recipient; the run still reports recipients | Settings → Agents: recipients above zero, emailed zero |
| One send is rejected | That person gets nothing today; the loop continues to the next | Settings → Agents: emailed below recipients |
| Card or roster read fails | Run stops before any email | Settings → Agents, as an error run |
| Run triggered twice in a day | A second email goes out; there is no per-day key | The inbox |
The seven elements
Every workflow we document has the same anatomy: seven elements, each assigned to a human, a machine, or both. This is the Centaur Map from our workflow design method.
Time. 08:15 (+07) every day, weekends included. Nobody asks for their list.
Open, unarchived, top-level cards with an assignee; the board each belongs to; the active team roster.
Who gets an email (anyone active with at least one open card on an active board), the order (due date ascending, undated last) and the flag (due date before today).
One email per person to the address on their people record. Nothing goes to a channel, nothing goes to a manager.
A short HTML email: a greeting, the count of open tasks, one line per card linking to its board, and a link to the Workboard.
Transactional email through the mail provider; every accepted send is logged with its kind and card count.
Each run leaves a row on Settings → Agents with recipients and emailed. Recipients higher than emailed is the alarm. The count on the email itself is the nudge: a number that never shrinks is the conversation to have.
Reads and writes
- Reads: tasks with their board and assignee; team members with status active
- Writes: nothing on the board. One sent-email log row per accepted send, one routine run row per run
- No idempotency key: the digest is a snapshot, and a second run the same day sends a second snapshot
- Today is the run’s UTC date; a card due today is not overdue until tomorrow’s run
The standing rules
- The board is the to-do list; the email only reads it out
- Only active people, only active boards, only top-level open cards
- Oldest due first, undated last, late in red
- No cards, no email: an empty inbox means a clear board