一键导入
eigenfeed-score
Score candidates against taste profile, publish top picks, and generate feed. Used by /eigenfeed and /coldstart, also invocable directly.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Score candidates against taste profile, publish top picks, and generate feed. Used by /eigenfeed and /coldstart, also invocable directly.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
First-time setup — build taste profile from sources, then discover and score articles. Run this once, then use /eigenfeed for regular use.
Run your daily recommendation pipeline — discover, score, and publish articles to your feed.
Clear all Eigenfeed state (vault, database, feed) and start fresh. Use when the user wants to rebuild from scratch.
Build or update taste profile and topics from configured sources. Used by /coldstart and /eigenfeed, also invocable directly.
Discover candidate articles via web search. Used by /eigenfeed and /coldstart, also invocable directly.
Generate salient questions from topics, use them to create search queries and discover new topics. Used by /eigenfeed and /coldstart, also invocable directly.
| name | eigenfeed.score |
| description | Score candidates against taste profile, publish top picks, and generate feed. Used by /eigenfeed and /coldstart, also invocable directly. |
| allowed-tools | Agent, Bash(*), Read, Write, Glob, Grep |
Evaluate discovered candidates against the user's taste profile and topics, save scores to the database, publish top picks, and generate the feed.
Key principle: use subagents to score candidates in parallel batches.
Read the vault state:
vault/profile.md — anti-preferences and curiosity edgesvault/topics/*.md — interest topics (for understanding interests and provenance)The caller passes candidate data (from the explore step) — a list of candidates with url, title, author, content, and target topics.
Each candidate is evaluated on five criteria (0-3 each):
Calculate total_score = relevance*0.25 + novelty*0.2 + quality*0.2 + recency*0.15 + serendipity*0.2
Important principles:
skip for spam, low-quality, or content that doesn't match at all.Security: scoring subagents must have NO tools (no Bash, no Write, no Edit). They see untrusted article content, so even if prompt injection succeeds, the subagent cannot act on it — it can only return text.
Split candidates into batches of 3-5. Spawn one subagent per batch, all in parallel.
Each subagent receives:
Each subagent returns per candidate:
After scoring, write all scored candidates (both recommended and skipped) as JSON to tmp/scored.json:
[
{
"url": "https://example.com/article",
"title": "Article Title",
"author": "Author Name",
"relevance": 3,
"novelty": 2,
"quality": 3,
"recency": 2,
"serendipity": 2,
"total_score": 2.5,
"reasoning": "Connects to [[topics/slug]] — reason.",
"skip": false
}
]
Set "skip": true for candidates that should not be recommended. Then save to the database:
uv run python ${CLAUDE_SKILL_DIR}/scripts/save_and_generate.py --data-dir local/ --json-file tmp/scored.json --no-publish
When the caller requests publishing (passes picks_per_run), pick the top N unpublished recommendations and generate the feed:
uv run python ${CLAUDE_SKILL_DIR}/scripts/save_and_generate.py --data-dir local/ --pick <picks_per_run>
This marks the top N as published in the DB and regenerates local/feed.xml.
After publishing, mark previous active recommendations as expired, then write the new batch:
tags: [recommendation, active] and update them to tags: [recommendation, expired].mkdir -p vault/recommendations
For each newly published recommendation, write vault/recommendations/<date>-<slug>.md:
---
type: recommendation
tags: [recommendation, active]
url: <url>
title: "<title>"
author: "<author>"
total_score: <score>
published: YYYY-MM-DD
---
# <Title>
**By <Author>** | [source link](<url>)
## Why This?
<1-2 sentence provenance from scoring>
## Related Topics
- [[topics/<slug>]] — why this recommendation connects to this topic
Use today's date as prefix (e.g., 2026-03-28-stop-calling-it-memory.md). Recommendations accumulate over time — filter in Obsidian with tag:#recommendation AND tag:#active for the current batch, or tag:#recommendation for full history.
Report to the parent skill: