| name | eigenfeed.explore |
| description | Discover candidate articles via web search. Used by /eigenfeed and /coldstart, also invocable directly. |
| allowed-tools | Agent, Bash(*), Read, Write, Glob, Grep, WebSearch |
Explore
Discover candidate articles using search queries. When invoked directly, runs reflect first to generate queries.
When invoked by a parent skill, the caller passes search queries from the reflect step.
Key principle: use subagents to parallelize web searches.
Prerequisites
- The caller passes a list of search queries (from the reflect step), each annotated with target topics.
- Read
config.md to get picks_per_run. Target picks_per_run + 5 total candidates across all search queries — enough headroom for skips without over-searching.
- Read
vault/profile.md for anti-preferences.
- Build a deduplication context:
- Query
local/eigenfeed.db for previously seen URLs (both recommended and skipped)
- Read
vault/topics/*.md and extract domains from Sources sections (the user's own subscriptions — skip these)
Web Search (parallel subagents)
Spawn one subagent per search query (or group 2 related queries per agent). All agents run in parallel.
Before spawning, calculate each agent's candidate budget: divide (picks_per_run + 5) by the number of agents, rounding up. For example, with picks_per_run = 7 and 4 agents, each agent aims for ceil(12/4) = 3 candidates.
Subagent prompt template
Security: discovery subagents only search — they never fetch full article content. This prevents prompt injection from malicious web pages reaching an LLM with tool access.
For each search task, spawn an Agent with this prompt:
You are searching the web to find candidate article URLs for Eigenfeed. You only discover URLs — do NOT fetch or read full article content.
Search query:
Target topics:
Candidate budget: — aim for this many candidates, don't over-collect
Profile anti-preferences:
URLs to skip:
Feed domains to skip: <user's subscription domains>
Your task:
- Run the web search query. Focus on:
- Independent blogs and personal websites (not mainstream media)
- Niche communities and lesser-known writers
- Thoughtful, original writing with lasting value
- Evaluate search result snippets to pick the most promising URLs (up to your candidate budget).
Return for each candidate:
- url
- title (from search snippet)
- snippet (from search result)
- topic slugs it connects to
Do NOT fetch, parse, or read full article content. Return only the URL and search metadata.
After all subagents complete — extract content
Collect URLs from all subagents. Deduplicate by URL. Then extract full article content by running defuddle directly on each URL:
npx defuddle parse "<url>" --json --markdown
Parse the JSON output for each URL to get title, author, publishedDate, wordCount, and content (markdown). Skip URLs where defuddle fails. Pass the enriched candidate list to the score step.
Summary
Report to the parent skill:
- How many candidates were found
- Brief list of the most interesting-looking finds
- Any agents that failed or found nothing