Daily digests have a failure mode so common it's almost a law. Version one is short and people read it. Then someone points out a missing category, so it grows. Then it grows again. By version six it's a comprehensive summary of everything, which is functionally identical to the thing it was meant to replace, and people skim it and then don't open it.
The reason is that a digest competes for the same slot as your inbox: the first two minutes of the working day, when you are deciding what today is going to be about. Anything that doesn't resolve that question in that slot is not a summary. It's homework.
Design the constraint first
So we set the limit before the content: under 250 words, useful in under thirty seconds, readable on a phone while the kettle boils. Every question about what to include is then answered by what it would displace, which is a much better question than "would this be nice to have?"
What survived that filter was six sections, and the interesting thing is that four of them are about time and two are about people.
- Needs attention — overdue, due today, blocked, waiting, high priority. The things that hurt if missed.
- Today — what's actually scheduled, in priority order.
- Waiting for — what other people owe you, and how long it's been.
- You promised — what you owe other people.
- At risk — work whose deadline and whose progress have stopped agreeing.
- Nothing else. No streaks, no productivity score, no motivational line.
Generated from queries, not from a pile of text
There's a tempting shortcut when building something like this: hand a model a large dump of recent activity and ask it to summarise. It produces plausible output immediately, and it is quietly unreliable, because the model is deciding both what's true and what's important, and you have no way to audit either decision.
The alternative is more work and much more trustworthy. Run the same structured queries the app's own screens run — overdue actions, items due today, waiting items past their follow-up date, commitments outstanding — assemble the results into a compact set of facts, and give the model exactly one job: phrase this.
Narrow jobs are where language models are reliable. "Turn these eleven facts into four readable sentences" is a narrow job. "Read everything and tell me what matters" is not.
The practical consequence is that the numbers in the brief are the numbers in the database. If it says three things are overdue, three things are overdue — you can tap through and count them. That property sounds unremarkable until you've used a summary tool that didn't have it.
Empty sections should say they're empty
One small decision that turned out to matter: when a section has nothing in it, the brief says so rather than filling the space. "Nothing waiting on anyone" is a genuinely useful sentence. A generated paragraph gesturing at recent activity to avoid a gap is not, and it trains you to distrust the parts that are real.
Which is the general principle underneath all of this. The value of a daily brief is not that it tells you things. It's that you believe it when it does.