Priority-driven daily briefing — the 3 things to focus on today, why now, and what moved
Install
npx skillscat add atrium-hermes/atrium-lighthouse/morning-brief Install via the SkillsCat registry.
${var} — Area to emphasize. If empty, covers all areas.
A good morning brief is a priming document, not a news dump. Every line must answer "so what?".
Today is ${today}. Read memory/MEMORY.md, memory/logs/${yesterday}.md (and today's if it exists), and memory/cron-state.json (if present).
Steps
1. Rank, don't aggregate
Collect candidate items from:
- MEMORY.md "Next Priorities"
- Yesterday's log: unfinished work, follow-ups, notes
- Pending repo items:
gh pr list --state open --limit 10andgh issue list --state open --limit 10 --assignee @me memory/cron-state.json: skills withconsecutive_failures >= 2orsuccess_rate < 0.8aeon.yml: skills whose cron matches today
Score each candidate on leverage × urgency:
- Leverage = does progressing this change the next 7 days?
- Urgency = does delay today make it worse?
Keep at most 3 focus items. Everything else either goes in "Since yesterday" or is dropped. If ${var} is set, bias ranking toward that area but do not force a focus item if nothing qualifies.
2. Headlines — only if they change priorities
Use WebSearch for 2 headlines in the user's tracked areas (AI and crypto by default; emphasize ${var} if set). Include a headline only if it meaningfully updates one of the 3 focus items, flags a new risk, or implies an action (a deadline, a market move, a shipped competitor, a disclosed exploit). If nothing qualifies, omit the Watch section entirely. No filler.
3. Format — terse, scannable, opinionated
*Morning Brief — ${today}*
*Focus today*
1. [item] — why now: [≤12 words]
2. [item] — why now: [≤12 words]
3. [item] — why now: [≤12 words]
*Since yesterday*
- [moved]: what changed (link if relevant)
- [stuck]: what's blocked, on whom
*Watch* (omit entirely if nothing qualifies)
- [headline] — implication for focus #N
*Running today*
- skill @ HH:MM UTCStyle rules:
- Every focus item should state why now in ≤12 words. If you can't, demote it.
- "Since yesterday" is ≤5 bullets; merge duplicates across PR/issue/log sources.
- No throat-clearing ("here's your briefing…"). Lead with Focus.
- No empty sections — omit rather than print "(none)".
- If fewer than 3 candidates survive the why-now bar, allow up to 1 background item (tagged
background:instead ofwhy now:) so the brief still surfaces something worth knowing on quiet days. Never invent items, and never include more than 1 background item. - If soul files under
soul/are populated, match that voice; otherwise keep it direct and neutral (per CLAUDE.md).
4. Send via ./notify and email
- Send the formatted brief with
./notify "...". - Send email via Resend:
- Build the brief as HTML (wrap each section in
<h2>headers,<ul>/<li>bullets) - Also keep a plain-text copy (the
./notifycontent above, as-is) - Parse
$BRIEF_RECIPIENTSas a comma-separated list of addresses - POST to
https://api.resend.com/emails:Authorization: Bearer $RESEND_API_KEY Content-Type: application/json { "from": "Aeon Briefings <onboarding@resend.dev>", "to": ["<each recipient>"], "subject": "[Aeon] Morning Brief — ${today}", "html": "<html version>", "text": "<plain-text version>" } - Log the
idfield from the Resend response as a comment on the current Paperclip execution issue for traceability - If Resend returns an error, log the full error body as a comment and fail loudly (do not silently continue)
- Build the brief as HTML (wrap each section in
- Append to
memory/logs/${today}.mdunder a### morning-briefheading: timestamp, the 3 focus items (one line each), headline count, and any skills flagged from cron-state. This becomes tomorrow's "since yesterday" input.
Sandbox note
The sandbox may block outbound curl. Use WebFetch as a fallback for any URL fetch. For GitHub queries, use gh CLI (handles auth internally) rather than curl.