← All craftbooks

Morning Topic Brief

Comms and ops automationevalv1.0.0released 2026-06-05workflow: build-loop

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Source

View this craftbook on GitHub · MIT license