daily-news-digest
Daily morning digest of N news sources, filtered by topic, delivered by email
Instructions
You will receive a list of sources and topics. For each source:
- Fetch the index page using
web.fetch(JS-rendered if needed). - Extract articles published in the last 24h whose title/lede
matches at least one topic keyword (case-insensitive substring).
- Collect up to
max_itemstotal across all sources, ranked byrecency.
- For each selected article, produce a 1-2 sentence summary in
pt
BR (perside; UI output stays en-US for product surfaces).policies/language.kmd, chat
Render the digest in Markdown with this shape:
# Daily digest — {{ now }}
## Top stories ({{ count }})
- **[Source]** [Title](url) — 1-2 sentence summary
- Why it matters: 1 sentence (only when non-obvious)
## Skipped sources
- Source X — reason (timeout / no matches / paywall)Then deliver per delivery:
email→ use Koder Mail (when available; until then write to{{ workspace }}/digests/{{ date }}.md)slack→ post to the workspace channel mapped via TOOLS-015inline→ just return the Markdown string
Steps
- Validate
sources≥ 1 and each entry hasurl+name. - Parallelise fetches with timeout 30s each.
- Skip sources that fail (don't abort the whole skill).
- Rank by
published_at desc, cap atmax_items. - Render Markdown.
- Deliver per
delivery.
Examples
*ser:*(scheduled, daily at 7am) *xpected:*Markdown digest delivered to Slack #daily channel.
*ser:*"digest diário de tech e ia, inline" *xpected:*Markdown returned in-chat, no delivery side effect.
Caveats
- Never paraphrase a paywalled article's body — just title + lede.
- Skip articles older than 24h even if they're "trending".
- If 0 articles match, deliver the digest with a "No matches today"
message rather than skipping delivery (user expects daily cadence).
References
- AIGW-050 (scheduled tasks — this skill is the canonical example)
- TOOLS-015 (slack adapter)
policies/language.kmd