wow-digest
Daily digest of 3-7 genuinely surprising items from newsletters and Telegram channels. Scores content for epistemic friction, not just relevance. Appends to daily note. Use when the user says "/wow-digest", "run the wow digest", "what's surprising today", "morning reading", or "digest my newsletters".
What this skill does
# 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
1. Run `scripts/ingest.py` to pull and normalize candidates from all sources
2. Run `scripts/enrich.py` to fetch full content for link-only newsletters (LinkedIn, beehiiv, Substack)
3. Run `scripts/salience_filter.py` to drop obvious noise (marketing, payments, greetings)
4. Run `scripts/wow_score.py` on filtered candidates to score and select WOW items
4. Append selected items to today's daily note under `## Reading`
5. Save raw candidates to `.wow-eval/candidates/YYYYMMDD.jsonl` for replay
6. Archive processed newsletter emails via GWS
7. During eval phase: run `scripts/feedback.py` to collect human verdicts
## Manual run
```bash
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:
1. Do NOT append to daily note
2. Do NOT archive emails
3. 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}`** — From `My Focus.md`, sections `## Current`, `## Base`, `## Primary` (stops at `## Nice to have`). This tells the scorer what the user cares about right now.
- **`{research}`** — From `ai-research/*.md` files (last 30 days), parsed from filenames (`YYYYMMDD-topic.md`) and `research_topic:` frontmatter. Shows what the user has already investigated.
- **`{recent_topics}`** — From `Daily/YYYYMMDD.md` headings (last 7 days), excluding `## do` and `## 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:
```markdown
## 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:
1. Collect all `message_id` values from email candidates
2. Run GWS batchModify to remove INBOX label
```bash
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:
1. Run ingest + scoring as normal
2. 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)
3. Show all items in a single text block first so the user can read the content
4. Then ask via AskUserQuestion: "Was this actually WOW?" with options: wow / meh / noise / already_knew
5. Record feedback via `scripts/feedback.py`
6. Show current feedback stats
7. 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.jsonl` has fewer than 50 entries → eval mode
- If 50+ entries → auto mode (archive without asking)
Related in Writing & Docs
jax-development
IncludedUse this skill when the user is writing, debugging, profiling, refactoring, reviewing, benchmarking, parallelising, exporting, or explaining JAX code, or when they mention JAX, jax.numpy, jit, grad, value_and_grad, vmap, scan, lax, random keys, pytrees, jax.Array, sharding, Mesh, PartitionSpec, NamedSharding, pmap, shard_map, Pallas, XLA, StableHLO, checkify, profiler, or the JAX repo. It helps turn NumPy or PyTorch-style code into pure functional JAX, fix tracer/control-flow/shape/PRNG bugs, remove recompiles and host-device syncs, choose transforms and sharding strategies, inspect jaxpr/lowering/IR, and benchmark compiled code correctly.
nature-article-writer
IncludedDrafts, rewrites, diagnostically critiques, and style-calibrates primary research manuscripts for Nature and Nature Portfolio journals. Use when the user wants a Nature-style title, summary paragraph or abstract, introduction, results, discussion, methods, figure legends, presubmission enquiry, cover letter, reviewer response, or when a scientific draft sounds generic, jargon-heavy, structurally weak, or AI-ish and needs precise, broad-reader-friendly prose without inventing data, analyses, or references. Best for primary research articles and letters rather than reviews or press releases unless explicitly adapting one.
deckrd
IncludedDocument-driven framework that derives requirements, specifications, implementation plans, and executable tasks from goals through structured AI dialogue. Use when user says "write requirements", "create spec", "plan implementation", "derive tasks", "structure this feature", "break down into tasks", or "document this module". Also use for reverse engineering existing code into docs (/deckrd rev). Do NOT use for direct code writing — use /deckrd-coder after tasks are generated. Do NOT use when the user only wants to run or fix existing code without planning.
clinical-decision-support
IncludedGenerate professional clinical decision support (CDS) documents for pharmaceutical and clinical research settings, including patient cohort analyses (biomarker-stratified with outcomes) and treatment recommendation reports (evidence-based guidelines with decision algorithms). Supports GRADE evidence grading, statistical analysis (hazard ratios, survival curves, waterfall plots), biomarker integration, and regulatory compliance. Outputs publication-ready LaTeX/PDF format optimized for drug development, clinical research, and evidence synthesis.
handling-sf-data
IncludedSalesforce data operations with 130-point scoring. Use this skill to create, update, delete, bulk import/export, generate test data, and clean up org records using sf CLI and anonymous Apex. TRIGGER when: user creates test data, performs bulk import/export, uses sf data CLI commands, needs data factory patterns for Apex tests, or needs to seed/clean records in a Salesforce org. DO NOT TRIGGER when: SOQL query writing only (use querying-soql), Apex test execution (use running-apex-tests), or metadata deployment (use deploying-metadata).
accelint-ac-to-playwright
IncludedConvert and validate acceptance criteria for Playwright test automation. Use when user asks to (1) review/evaluate/check if AC are ready for automation, (2) assess if AC can be converted as-is, (3) validate AC quality for Playwright, (4) turn AC into tests, (5) generate tests from acceptance criteria, (6) convert .md bullets or .feature Gherkin files to Playwright specs, (7) create test automation from requirements. Handles both bullet-style markdown and Gherkin syntax with JSON test plan generation and validation.