Digest
# Digest Digest generates and delivers a curated daily summary on a specified topic by gathering signals from multiple sources (web search, X/Twitter cache, topic aggregators), filtering for substantive news with verified claims and fresh URLs, and structuring only the highest-signal items so a reader gains three actionable insights in 60 seconds. Use this skill when you need to stay informed on a specific domain without noise, or to automate regular briefings that prioritize decision-relevant developments over volume.
git clone --depth 1 https://github.com/aaronjmars/aeon /tmp/digest && cp -r /tmp/digest/skills/digest ~/.claude/skills/digestSKILL.md
<!-- autoresearch: variation B — curatorial discipline (filter → distill → structure → sanity-check) folded with sandbox-safe inputs and memory-aware dedup -->
> **${var}** — Topic for the digest (e.g. "AI agents", "solana", "rust"). **Required** — set your topic in aeon.yml.
Today is ${today}. Generate and send a daily **${var}** digest.
The whole point of a digest is **signal, not volume**. A reader skimming for 60 seconds should walk away with three things they didn't know that morning and one of them should change a decision they'd make this week. Anything that doesn't clear that bar gets cut.
## Phase 1 — Gather (cast a wide net)
Pull from at least two of these source classes — never rely on a single one:
1. **WebSearch** (built-in) — run 2 distinct queries:
- `"${var}" news ${today}` (broad)
- One narrower query you choose based on `${var}` (e.g. for "solana" → `"solana" launches OR funding OR exploit ${today}`; for "AI agents" → `"agent framework" OR "agentic" release ${today}`)
2. **xAI x_search via Grok** — pulls the X/Twitter signal layer.
- **Preferred path (sandbox-safe):** read `.xai-cache/digest.json` if it exists. The workflow's `scripts/prefetch-xai.sh` populates it before Claude runs. If you find the cache empty or absent, log a one-line note and continue — do not retry curl in a loop.
- **Fallback:** if the cache is missing, attempt a WebFetch to a public X search URL like `https://x.com/search?q=${var}&f=live` and extract a few top posts. Skip if that also returns nothing.
- If `XAI_API_KEY` is unset, skip entirely without erroring.
3. **WebFetch on a topic-relevant aggregator** (only if WebSearch returned thin results): e.g. `https://news.ycombinator.com/`, `https://www.reddit.com/r/<topic>/top/?t=day.json`, or a known feed for the topic.
Aim for **~15 raw candidates** at this stage. More is fine; fewer than 8 is a warning sign — broaden your queries before moving on.
## Phase 2 — Filter (kill the noise)
Drop any candidate that fails a single check:
- **No source link?** Drop it. Every surviving item must have a clickable URL (article URL or `https://x.com/handle/status/ID`).
- **Older than 36 hours?** Drop it unless it's a still-developing story being re-surfaced for new reason.
- **Pure speculation, hot take, or "X reacts to Y"?** Drop it. Keep things with a verifiable claim, named entity, number, release, or transaction.
- **Already covered in the last 3 daily logs?** Check `memory/logs/` for entries from the last 3 days. If the same story (same headline subject, same primary actor) appears, drop the duplicate unless there's a material new development to report.
- **Two sources telling the same story?** Keep one — prefer the primary source (announcement post, repo release, official filing) over the recap.
Target: ~5–8 survivors after this pass.
## Phase 3 — Distill and structure (force the shape)
Pick the **3–5 strongest** items. Lead with the **single most actionable** one — the item where a reader can do something today (subscribe, sell, fork, attend, apply, watch). Then descend by importance.
Format the digest exactly like this:
```
*${var} — ${today}*
_TL;DR: <one sentence covering the day's gravity. Concrete, no adjectives.>_
1. *<Headline-style title, ≤90 chars>*
<1–2 sentence summary. Lead with what happened, not who said it.>
Why it matters: <one short clause — concrete consequence, not vibes>
<link>
2. *<Title>*
...
3. *<Title>*
...
(Optional, only if there's genuine secondary signal:)
*Also worth a glance:* <1-line bullet> · <1-line bullet>
```
**Format rules:**
- Markdown only. No emoji. No "Here's your digest" preamble.
- Total length: **≤3000 chars** (the old 4000 was too loose — discipline forces cuts).
- Every item: title + summary + link. Include a "Why it matters" line whenever you can state a concrete consequence (price impact, user-facing change, upstream dependency, deadline, precedent). If you can't write one without hand-waving, **omit the line** — do not replace it with filler like "this could be significant" or "watch this space".
- On thin-news days where fewer than 3 items clear the bar: log `DIGEST_FETCH_EMPTY` (or `DIGEST_THIN` if 1–2 items survived) in the run log and **skip the notification** rather than padding.
## Phase 4 — Sanity-check (last pass before sending)
Before calling `./notify`, walk this checklist mentally:
- [ ] Lead item is the most actionable one I have, not just the most dramatic.
- [ ] Every link resolves to a real URL (no `[link]` placeholders, no truncated IDs).
- [ ] No item is paraphrasing a hot take — each has a verifiable underlying fact.
- [ ] No two items are the same story under different angles.
- [ ] Char count under 3000.
- [ ] No emoji slipped in. No corporate hedging ("could potentially", "it remains to be seen").
If the digest fails any check, fix it before sending. If after filtering you have **fewer than 3 strong items**, do not pad — send a shorter "thin day" digest with whatever survived and a one-line note acknowledging it was a quiet news day. Do not invent or stretch.
## Phase 5 — Send and log
1. Send via `./notify "<digest body>"`.
2. Append to `memory/logs/${today}.md`:
```
### digest (${var})
- Sources used: <list>
- Raw candidates: <N>, after filter: <M>, sent: <K>
- Lead item: <title>
- Notes: <anything unusual — sandbox failure, thin day, dedup against prior log>
```
3. Update `memory/MEMORY.md` "Recent Digests" table with one row: date, topic, key topics (3 short keywords).
## Sandbox note
The GitHub Actions sandbox blocks `curl` calls that interpolate env vars in headers — that is exactly the shape of a direct xAI call. **Do not** attempt `curl ... -H "Authorization: Bearer $XAI_API_KEY"` from this skill; it will fail silently or partially.
Two safe paths:
- **Pre-fetch (preferred):** add a `digest)` case to `scripts/prefetch-xai.sh` so the workflow populates `.xai-cache/digest.json` before Claude runs. ThisMention/keyword sweep on social platforms for [REPLACE: KEYWORDS] — trends, sentiment, top posts
5 concrete real-life actions, leverage-scored against open loops with specificity and anti-fluff gates
Curated AI-agent tweets, clustered into narratives with insight summaries
Tracker of AI agent substitution signals — which roles, companies, and industries show real headcount displacement. Named roles + real deployments only.
Competitive-intelligence digest on the AI agent framework space — momentum, releases, breaking changes across a curated watchlist
Cross-domain market pulse from AIXBT's free grounding endpoint — crypto, macro, tradfi, geopolitics. Refreshes taxonomy references (clusters, chains) as a bonus.
Pre-batch API provider health check — detects credit exhaustion or auth failure for every configured provider key before the scheduled batch runs, giving the operator a window to act before skills degrade
List a wallet's live ERC-20 token approvals on Base and flag unlimited / risky spender grants. Keyless via Base RPC (eth_getLogs + eth_call) — no explorer key needed.