
Morning Topic Brief
Be informed without the doomscroll: this morning's items per watched topic, each with its source named, rumor separated from reporting, and yesterday's noise skipped — five minutes that replace an hour of feeds. Locks the brief rules FIRST, then gathers from the feeds, then writes the dated brief into the archive next to the previous ones. Use for morning briefs, daily topic digests, 'what happened overnight', news catch-ups on watched topics, and staying informed without the scroll.
Steps
Entry step: scope. Each step names the specialist role it wants; the full working prompt is expandable.
- Set the brief ruleseditorentry
topics read, yesterday skimmed, brief rules locked
Show working prompt
Set the brief's rules before touching the feeds. Step 1: read topics.json from the workspace — the topics being watched and their names — and skim the most recent brief in briefs/ so you know what yesterday already covered. Step 2: lock the brief rules — one section per topic; every item names its source, with a link when the feed gives one; an item that already appeared in yesterday's brief is skipped or explicitly marked as already covered, never re-reported as new; an item resting on a single source is flagged as rumor or unconfirmed, never stated as fact. Step 3: write an acceptance-criteria checklist ('a section for every topic in topics.json', 'every item cites its source', 'no yesterday item re-reported as new', 'single-source items flagged', 'five minutes to read, not an hour'). Call write_task_note with the topic list + checklist and write notes/scope.md. No fetching yet. - Gather the morning's itemsresearcher
fetch per topic, annotate sources, mark the cuts
Show working prompt
Gather this morning's items. Step 1: pull the current items for each watched topic — through the project's feed capabilities when the feeds are wired live, or from the freshest feed snapshots in the workspace. Step 2: for each topic, list every fetched item with its title, source, link, and anything the feed says about its confidence. Step 3: mark the cuts — which items are duplicates of yesterday's brief, which rest on a single source, which are noise not worth the owner's morning — and say why in a few words each. Step 4: write the full annotated item list to notes/items.md and call write_task_note with the fetched/kept/cut counts per topic.
- Write today's briefcopywriter
the dated brief in the archive, sources named, rumor flagged
Show working prompt
Write today's brief from the gathered items. Step 1: date the brief and write it into the archive — a new file in briefs/ named for today (YYYY-MM-DD.md), next to the previous ones. Step 2: one section per topic, using the topic's name as the heading; under it, the kept items — each a sentence or two of what actually happened, with the source named and linked where the feed gave one. Step 3: keep rumor separate — a single-sourced item appears with its flag ('unconfirmed', 'single source'), never dressed as settled reporting. Step 4: where yesterday's story is still the story, one line saying nothing new beats re-reporting it. Step 5: five minutes of reading, no filler. Call write_task_note with the item count per topic and the brief's path. - Evaluatereviewer
Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.
Show working prompt
Open today's brief in briefs/ and notes/items.md and verify every criterion from notes/scope.md: a section for every topic in topics.json, every item citing a named source (linked where the feed gave one), no item from yesterday's brief re-reported as new, every single-sourced item carrying its rumor or unconfirmed flag, and total reading time near five minutes. Cross-check the brief's items against the gathered list — nothing in the brief that was not fetched. Write PASS/FAIL per criterion; on any failure, name the gap and loop back to brief. Then route — this is the whole point of the loop: - **Every criterion PASSES →** call `advance_task_step({ ref, stepId: "evaluate", next: "finish" })`. - **Any criterion FAILS →** write the specific gaps to notes, then call `advance_task_step({ ref, stepId: "evaluate", next: "brief" })` to loop back. The builder fixes exactly those gaps. Never route to `finish` while any criterion is unmet. If you advance without a target, the loop sends you back by design. After ~3 unproductive loops, stop and report DONE_WITH_CONCERNS so the user can step in. - Finishdeveloper
All acceptance criteria met. Stamp a short summary and report DONE.
Show working prompt
Every acceptance criterion passed. Write a one-paragraph DONE summary to task notes via `write_task_note`: what was built, the deliverable path(s), and a one-line confirmation that each criterion is met. Then report DONE.
Triggers
Phrases that suggest this craftbook to a crew.
- morning brief
- what happened overnight
- today's brief
- run the morning digest
- catch me up on my topics
Source
View this craftbook on GitHub · MIT license