wow-digest
Daily digest of 3-7 genuinely surprising items from newsletters and Telegram channels. Scores content for epistemic friction, not just relevance. Ap…
它会碰到什么
逐条看命中(5 条严重或高危)
- 高
scripts/enrich.py:21cred-envreadFIRECRAWL_API_KEY = os.environ.get("FIRECRAWL_API_KEY", "") - 高
scripts/ingest.py:56exec-spawnresult = subprocess.run(
- 高
scripts/ingest.py:71exec-spawnmsg_result = subprocess.run(
- 高
scripts/ingest.py:112exec-spawnresult = subprocess.run(
- 高
scripts/wow_score.py:101exec-spawnresult = subprocess.run(
这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。
技能内容
wow-digest
Purpose
Pull last 24h of newsletters (email) and Telegram channel posts, filter noise,
score survivors for genuine surprise against the user's focus and recent research,
and append 3-7 WOW items to today's daily note.
Workflow
- Run
scripts/ingest.pyto pull and normalize candidates from all sources - Run
scripts/enrich.pyto fetch full content for link-only newsletters (LinkedIn, beehiiv, Substack) - Run
scripts/salience_filter.pyto drop obvious noise (marketing, payments, greetings) - Run
scripts/wow_score.pyon filtered candidates to score and select WOW items - Append selected items to today's daily note under
## Reading - Save raw candidates to
.wow-eval/candidates/YYYYMMDD.jsonlfor replay - Archive processed newsletter emails via GWS
- During eval phase: run
scripts/feedback.pyto collect human verdicts
Manual run
python3 scripts/ingest.py --days 1 --output /tmp/wow-candidates.jsonl
python3 scripts/enrich.py --input /tmp/wow-candidates.jsonl --output /tmp/wow-enriched.jsonl
python3 scripts/salience_filter.py --input /tmp/wow-enriched.jsonl --output /tmp/wow-filtered.jsonl
python3 scripts/wow_score.py --input /tmp/wow-filtered.jsonl --output /tmp/wow-selected.json
# Then the skill appends to daily note and archives emails
Dry-Run Mode
When the user says /wow-digest --dry-run or "preview the digest", run the full pipeline but:
- Do NOT append to daily note
- Do NOT archive emails
- Instead, print the selected items with scores and hooks directly in the conversation
This lets the user preview what would be appended without side effects.
Context Sourcing
The scoring prompt uses three context signals from the vault (~/Brains/brain/):
{focus}— FromMy Focus.md, sections## Current,## Base,## Primary(stops at## Nice to have). This tells the scorer what the user cares about right now.{research}— Fromai-research/*.mdfiles (last 30 days), parsed from filenames (YYYYMMDD-topic.md) andresearch_topic:frontmatter. Shows what the user has already investigated.{recent_topics}— FromDaily/YYYYMMDD.mdheadings (last 7 days), excluding## doand## log. Shows recent daily note themes.
If these files don't exist, scoring still works but with degraded personalization.
Dedup
Ingestion deduplicates against the last 7 days of .wow-eval/candidates/*.jsonl using SHA-256 hashes of title|source_name (case-insensitive). Same article shared to multiple channels or re-sent in a newsletter won't appear twice. Pass --no-dedup to ingest.py to skip.
Config
Edit config/sources.yaml to add/remove email patterns or Telegram channels.
Edit config/wow_prompt.txt to tune the scoring prompt.
Output Format
After scoring, append to today's daily note (Daily/YYYYMMDD.md) ABOVE the - - - separator, below any existing content:
## Reading
- **[Title]** (Source) — hook explaining WHY it's surprising
- **[Title]** (Source) — hook
...
_WOW digest · N candidates → M selected · YYYY-MM-DD_
CRITICAL: Always run date +"%Y%m%d" to get today's date. Never assume.
If ## Reading already exists in the daily note, append items to it rather than creating a duplicate section.
Archive
After appending to daily note, archive processed newsletter emails:
- Collect all
message_idvalues from email candidates - Run GWS batchModify to remove INBOX label
gws gmail users messages batchModify \
--params '{"userId":"me"}' \
--json '{"ids":["ID1","ID2",...],"removeLabelIds":["INBOX"]}'
Eval Mode (first 2 weeks)
During eval phase, do NOT auto-archive. Instead:
- Run ingest + scoring as normal
- Present the selected items to the user with FULL CONTENT, not just titles. For each item show:
- Title + source
- The snippet (first 300-500 chars of actual content)
- The LLM's hook and challenged_assumption
- WOW score breakdown (relevance, surprise, bridge_value, predictability)
- Show all items in a single text block first so the user can read the content
- Then ask via AskUserQuestion: "Was this actually WOW?" with options: wow / meh / noise / already_knew
- Record feedback via
scripts/feedback.py - Show current feedback stats
- Only archive after user confirms
CRITICAL: The user CANNOT judge WOW from titles alone. Always show the snippet content.
If the snippet is empty or too short, fetch the full email body via GWS before presenting.
To check if eval mode is active:
- If
.wow-eval/feedback.jsonlhas fewer than 50 entries → eval mode - If 50+ entries → auto mode (archive without asking)
想直接用这个技能?
本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。