Skip to content
Automation
Skill

/feed-brief

Runs the full feed-to-brief pipeline — fetches every configured source, scores and filters items by relevance, writes a human-voice brief per FEEDS.md, delivers it to the operator's configured channel, and archives it with rich frontmatter. Invoke with /feed-hermit:feed-brief

From plugin
claude-code-hermit
7486 skills11 agents
Install
$ npx -y skills add gtapps/claude-code-hermit --skill feed-brief --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/feed-brief

Context preview

The summary Claude sees to decide when to auto-load this skill.

Runs the full feed-to-brief pipeline — fetches every configured source, scores and filters items by relevance, writes a human-voice brief per FEEDS.md, delivers it to the operator's configured channel, and archives it with rich frontmatter. Invoke with /feed-hermit:feed-brief

SKILL.md

feed-brief.SKILL.md
name: feed-brief
description: >-
  Runs the full feed-to-brief pipeline — fetches every configured source, scores
  and filters items by relevance, writes a human-voice brief per FEEDS.md, delivers
  it to the operator's configured channel, and archives it with rich frontmatter.
  Invoke with /feed-hermit:feed-brief --morning|--evening|--slot <name> for
  scheduled or on-demand briefs. Reads feed-sources.md, feed-categories.md, and FEEDS.md
  from the project root.

Feed Brief

Run the full 7-phase brief pipeline for this project. Config lives at the project root (`feed-sources.md`, `feed-categories.md`, `FEEDS.md`); state and archive live under `.claude-code-hermit/`.

Flags

  • `--morning`: slot `morning`. Forward-looking. Emphasize what's new since yesterday evening, what's worth opening today, emerging patterns. Tone: calm, sharp, selective.
  • `--evening`: slot `evening`. Backward-looking. Emphasize what changed during the day, what escalated or faded, what to carry into tomorrow. Tone: slightly more reflective.
  • `--slot <name>`: custom slot label (e.g. `midday`). Use `<name>` verbatim wherever `<slot>` appears below. Orientation defaults to the morning (forward-looking) framing unless the operator's `FEEDS.md` says otherwise.

Resolve `<slot>` from the flag before starting. All filenames below use that resolved value.

Steps

1. Read `FEEDS.md` — brief philosophy, scoring rules, output format, and section guidance. 2. Read `feed-sources.md` — full source list with types and URLs. 3. Read `feed-categories.md` — operator's current focus areas and priority tiers (P1/P2). 4. Read `.claude-code-hermit/config.json` — the `feed.enrichments.*` and `feed.reaction_feedback` gates consulted in Phases 3 and 5b. A gate runs only when its value is `true`; treat an absent key as disabled.

Phase 1 — Web/RSS sources

Before dispatch, run `bun ${CLAUDE_PLUGIN_ROOT}/scripts/source-fetch-result.ts new-run`. Keep its returned UUID as the expected `run_id` for this invocation; never infer it from an existing file or the agent's reply. If generation fails, follow the wholesale fetch-failure path below without dispatching.

Dispatch the `@feed-hermit:source-fetcher` subagent (model: haiku) to fetch all `web` and `rss` sources from `feed-sources.md`. Pass the full source list (URLs + names), the resolved `<slot>`, the absolute project root and output path, and the generated `run_id` to copy exactly into the output JSON.

**Output-path contract:** the agent writes its extracted items to `tmp/feed-source-items-<slot>.json` in the project root (never `/tmp/`). Pass `<absolute-project-root>/tmp/feed-source-items-<slot>.json` to the agent so its inherited working directory cannot redirect the write. Items are nested under `sources[]`, each item: `{title, summary, url, published_at, source, section, author}`. No scoring — extraction only. After the agent returns, run:

bun ${CLAUDE_PLUGIN_ROOT}/scripts/source-fetch-result.ts verify "<absolute-output-path>" "<expected-run-id>"

Use the original expected ID, not an ID read from the output. On exit 0, consume only the accepted JSON printed by this command; do not re-read the raw file for candidate items. The verifier checks run identity and the envelope, not whether network fetches occurred.

**Reconcile against the file, not the reply** (mapping owned by `docs/schema.md` §5). The agent's reply is a claim; only the verified file payload is eligible for reconciliation. This classifies `web`/`rss` sources only — `chrome`/`reddit`/`reddit-home`/`x` sources are absent from `sources[]` by design and are classified in Phase 2:

  • Run ID generation or verification fails (including missing/unreadable/malformed output, an invalid envelope, or an absent/mismatched `run_id`) → every `web`/`rss` source in `feed-sources.md` goes to

`sources_skipped`. Continue to Phase 2 — do not re-dispatch the agent — and note the wholesale fetch failure in the brief's Source notes.

  • A `web`/`rss` source with no entry in `sources[]` → `sources_skipped`, regardless of what the

reply claimed.

  • Entry with `status: "failed"`, or any status other than `"ok"` → `sources_skipped`.
  • Entry with `status: "ok"` and empty `items[]` → `sources_quiet`. An entry that did yield items

stays provisional: Phase 6 splits `sources_used` vs `sources_quiet` on what survived Phase 3 scoring, so a source whose items were all filtered out still lands in `sources_quiet`.

  • Reply disagrees with the file → the file wins; note the discrepancy in the brief's Source notes.

Phase 2 — Chrome, reddit, and X sources

For each source whose type is `chrome`, `reddit`, `reddit-home`, or `x`:

  • **`reddit`:** try `bun ${CLAUDE_PLUGIN_ROOT}/scripts/reddit-fetch.ts <subreddit> [limit]` FIRST.
  • Exit 0 → parse the JSON array (`title, url, score, comments, permalink`) into the item format.
  • Exit 1 → fall back to Chrome (below). If Chrome is unavailable, skip and mark the source in `sources_skipped`.
  • **`chrome` / `reddit-home` / `x`:** these require a running Chrome. Check whether the Chrome MCP tools are

available (search `mcp__claude-in-chrome__` via ToolSearch). If Chrome is not available, SKIP the source gracefully and mark it in `sources_skipped` — Chrome availability is a deployment concern; do not attempt to launch a browser. If available, fetch per the operator's `FEEDS.md` Chrome guidance (process sequentially, extract the visible top items) into the item format.

Process Chrome-backed sources one at a time. Deduplicate against Phase 1 items.

Phase 2.5 — Collect fetch stats

Build a `fetch_log` array tracking per-source efficiency. Populate during Phases 1–2, finalize after Phase 3.

  • **After Phase 1:** count items per source name → `items_yielded`. `tokens_approx: 3000` for `web`/`rss`.
  • **After Phase 2:** count items per source → `items_yielded`. `tokens_approx: 3000` for `reddit` sources fetched via the script; `tokens_approx: 20000` for `chrome`/`reddit-h
Read more
Ships withclaude-code-hermit

If you know Claude Tag, the idea will feel familiar: hand Claude work through a channel, such as Discord, Telegram, or your custom integration, and get results back there.

Get the whole plugin

Other skills on claude-code-hermit.