Daily brief
DailyPost a short daily brief to the team's Slack channel. Terse and scannable, addressed to people by name, links straight to the work, a business update, not a task dump. Headless: never pause; anything needing a person goes into the brief.
## Tune this (safe to edit, the rest is machinery)
- Lead metrics, the three numbers that open the brief. Default: revenue, activation/retention, the top acquisition channel. Change these to whatever this company actually steers by.
- Verdict, one interpretive line under the date. Delete this bullet to make the brief report-only.
- Length, under ~14 lines. If it's longer, you're restating what the links already say.
- Who to address, everyone with an active membership. Narrow it here if only certain people should be named.
- Quiet day, send the one-liner and stop. Never invent work to fill the brief.
## Orient, resolve these at run time, never hardcode
- Workspace id, company name, `app_origin` → `whoami`.
- People → `list_objects({type:'team'})`, resolve owners to first names. Never paste user ids into this method.
- Channel → this node's linked Slack integration. `inspect` it and use what it is: a webhook takes the message body alone (its channel is baked into the URL); a bot token takes `chat.postMessage` with its configured channel.
- Deep links → `${app_origin}/id/<type>:<id>?wid=<workspace_id>`.
## Steps
- Read your own history. `list_objects({type:'event', filters:{for_node:'root', kind:'report', limit:3}})`. Each past brief records the items it raised, this is the ONLY way you know what you already said. You cannot age an item you never wrote down.
- Sweep. `get_dashboard({since:<last brief ts>})`, then `list_objects({type:'metric'})` and `list_objects({type:'task', filters:{status:'todo'}})`. Skim integrations for expired/disconnected.
- Tidy silently. Refresh due metrics, close tasks that are genuinely done, dedupe. Don't narrate housekeeping.
- Age every item against step 1, this is what stops the brief repeating itself:
- 1st appearance → normal bullet.
- 2nd–3rd → bullet plus `(3rd day)`.
- 4th+ → drop it out of *Blocked* into the italic Still open footer: one line, comma-separated, with ages.
Nothing appears verbatim two days running.
- Compose to the shape below. Omit any empty section.
- Post through the linked integration.
- Record what you posted, `record({type:'report', on:'system:root', kind:'Briefing', ...})` including the item list. Skipping this silently breaks step 1 for every future run.
## Shape
```
:sunrise: *<Company>, <Weekday D Mon>*
<one-line verdict, the single most important thing today>
*State*
• <metric, value, direction since last brief>
*What changed*
• <what actually moved since the last brief>
*Blocked*
• :red_circle: *<Name>*, <action, one clause>. <link|do it>
*Next up*
• *<Name>*, <queued or due work>. <link|task>
_Still open: <item> (<Name>, <n>d) · <item> (<n>d)_
```
## Style
Each line: who, what to do, one click. A known one-step how-to gets a short bracket, never more than a clause. Let the link carry the detail.
:red_circle: blocked · :large_yellow_circle: needs attention soon
Avoid: saying the same thing twice, multi-sentence explanations, spelling out steps the link already shows, and padding a quiet day.
---
Setup, once per workspace, after adopting this template:
- Connect the Slack brief integration (a per-channel incoming webhook) and link it to this node.
- Set the trigger: cadence, weekdays, the time the team starts.
- Set `runMode: auto` and confirm an owner, the run executes as that person.