daily-brief latest Context
Daily heartbeat for any recurring agent workflow tracked in Context: once a day, post one comment on the workflow's designated Daily Brief issue saying what published, what awaits approval, what failed and what is next, and rebuild the epic's `## Runs` block (schedule · next slots · routine health · last 7 briefs) so the owner sees it on the epic. A missing brief is the outage alert.
Install
curl -fsSL https://agents.onecontext.me/skills/daily-brief.md --create-dirs -o .claude/skills/daily-brief/SKILL.mdDepends on
SKILL.md
Daily brief
Every recurring workflow (a drafter that runs nightly, a publisher every few hours, a weekly report…) installs this skill first — before any other routine — because it is the dead-man's switch: if the brief does not appear, the owner knows the loop is down without any server-side monitor. Context has no scheduler by design; the routine runs on the host that owns the workflow.
Inputs
- The workflow's epic in Context and its Daily Brief issue (a standing
child issue titled
Daily Brief, labelbrief:daily). Create it when the workflow is charted if it does not exist; record its id in the epic's## Rules. - The workflow's channel parents, when it has them (issues labelled
lane:<channel>under the epic —Blog,Instagram,Site— whose children are the pieces) and itsBacklog(lane:backlog). Resolve them withlist_issues {parent_id: <epic>, label: "lane:<x>"}or read the ids from the epic's## Structure.list_issues {parent_id}returns direct children only: the pieces are visible through their parent, never through the epic. - The time and timezone the owner chose (default 08:00 in their timezone).
- Optionally, any other MCP the workflow uses (read-only calls only).
Once per day
start_contextif this is a fresh session.- Gather, read-only, for the last 24 h and the next 24 h — over the pieces
(
list_issues {parent_id: <channel parent>, includeClosed: true}for each parent, follownextCursor; the epic's direct children when the workflow has no parents):- Published — pieces that moved to
doneand carry a live link (Published:update) or deliverable. - Awaiting approval — issues
in_reviewwith an openrequest_review, oldest first, with how long they have waited. - Failed / skipped — routine runs that errored, publish windows missed, checker bounces or escalations; anything you had to skip.
- Next — what is scheduled in the next 24 h (drafts due, publish slots, reports), the buffer left (drafts ready vs slots), and the open Backlog (ideas / topics).
- Routine health — each routine of this workflow: last run time,
ok/failed. On a host with scheduled jobs read their logs (convention:
<repo>/.build/routines/<routine>.log, laststart/end rc=lines and the routine's one-line summary). Say plainly if you cannot observe one.
- Published — pieces that moved to
- Post one comment on the Daily Brief issue with
post_comment {parent_id: id, body}using the template below. If today's brief already exists (a comment from the last 20 h with theDaily brief —title), do not post a second one; append only if something failed since. - If anything failed or a publish window was missed, also raise it on the
affected issue (
post_comment) so it is visible where the work is. - Report
workStatson the update. - Rebuild the epic's
## Runsblock (next section) — also on days when today's brief already existed.
Template
Daily brief — <YYYY-MM-DD> (<timezone>)
Published (24h): <n> — <title> → <link> · … (or "none")
Awaiting approval: <n> — <title> (<waited>) · … (or "none")
Failed / skipped: <n> — <what, why, what you did> (or "none")
Next 24h: <what is due, when> · buffer: <n drafts / m slots>
Routines: <name> ok <time> · <name> FAILED <time> — <one line>
Keep it under 20 lines. Names, not bare ids. No credential values, ever.
Epic ## Runs block — the owner's at-a-glance
The epic description ends with a ## Runs block: the routine schedule, the
next three slots, routine health and the last seven briefs as one-liners.
After the comment, get_epic {id: <epic>} → description, keep everything
above ## Runs byte for byte, rebuild the block from today's data
(never append to the old one), update_epic {id: <epic>, description}.
Append the block if the epic has none yet.
## Runs
schedule: brief <08:00 daily> · drafter <02:00 nightly> · publisher <every 3 h> · assessment <Mon 09:00> (<tz>)
next: <Mon 07 Sep 09:00 IG MTLY-190 (in review)> · <Mon 07 Sep 22:00 blog MTLY-177> · <Tue 08 Sep 07:00 IG MTLY-191>
routines: brief ok <03 Sep 08:00> · drafter <ok 03 Sep 02:00 | FAILED 03 Sep 02:00 rc=1 | never> · publisher <…> · assessment <…>
briefs:
- <03 Sep>: published <n> · awaiting <n> · failed <n> · next <one phrase>
- … (last 7 days, newest first)
schedulecomes from the routine definitions on this host and the epic's## Rules(timezone);next= the three earliestdueamong open pieces across the channel parents (day, time, channel, ticket, state when not backlog), padded with the next cadence slots marked(no issue);routines= the health lines you gathered;briefs= one line per day from the last seven briefs on the Daily Brief issue, today's first.- Budget: 2048 characters for the whole description. If the rebuilt
text exceeds it, drop the oldest
briefsline, then the third and the secondnextentries, until it fits. Never cut above## Runs; if the text above the block alone leaves fewer than ~400 characters, writescheduleandroutinesonly and say so in the comment. - Nobody else writes this block. If the write is refused, say so in the comment — the comment is the record, the block is the view.
Rules that bite here
- The brief is the alert. Never skip it because "nothing happened" — post
nonelines. - Read-only towards other systems; the brief never publishes or approves.
- If the routine cannot run (host down, key missing), say so on the Daily Brief issue as soon as you can, with the key name that is missing.
Drift note (v4)
If setup reports this skill as update, refresh it before posting the brief; the brief must name the skill version it ran with (daily-brief@4) in work_stats. v5: the brief also lists the tools it called.
Changelog
- v5 v16
- feat(daily-brief): v5 — evidence run B
- v4 v15
- feat(daily-brief): v4 — drift note; e2e beta-channel probe
- v3 v14
- skills: move version/depends/attach/source under metadata, add metadata.product (frontmatter only)
- v3 v10
- feat(skills): v3 tool-name migration + new context skill (CONT-507)
- v2 v4
- feat(skills): epic structure v2 — channel parents, one Backlog, existing-epic setup + routines step, epic Runs block; manifest v4 (CONT-454, E12)
- v1 v3
- feat(skills): blog-drafter + blog-publisher v1, checker cascade, manifest v3 (CONT-434, E6)
- v1 v1
- Seed context-skills: harness + blog skills, manifest builder, check-skills, CI