Imported from ExpAstroWIS/vault-starter (
.claude/skills/arxiv-digest/SKILL.md). Install upstream withnpx skills add ExpAstroWIS/vault-starter --skill arxiv-digest. Copyright stays with the author.
arXiv digest
Manual-launch literature watch. Fetches recent papers via ADS (mechanical,
digest_pkg), then applies judgment to rank and explain relevance, and writes
a dated digest note whose checkboxes double as an import queue: tick one and
re-run this skill (or ask Claude to import it) to pull that paper into the
vault via newpaper.
1. Import pass first
Before fetching anything new, look for unfinished business from previous
digests: scan obsidian/journal/* - arXiv digest.md notes for checked
- [x] entries whose paper identifier (bibcode or arXiv:...) is still
absent from the vault (same presence check as digest_pkg.dedupe: no
matching obsidian/papers/* - BibTeX.md bibcode/eprint, no matching paper
filename).
For each such entry, run the newpaper skill flow with that identifier. Once
imported, follow newpaper's own source/digest-note handling (step 6 there):
if the digest note now holds nothing but imported/still-pending entries,
leave it as the running digest; there's no need to delete it since it's a
dated record, not a scratch stub. Report which papers were imported this way.
2. Fetch
Determine the lookback window: days since the most recent existing
obsidian/journal/* - arXiv digest.md note's date: frontmatter, capped at
30; default to 7 if no previous digest exists.
Run, from scripts/:
python -m digest_pkg.fetch --days <N>
This queries ADS once per standing topic. The queries come from the
topic_queries list in vault.config.yaml at the vault root when that key is
set (written by /setup in starter vaults), else from the built-in
digest_pkg.fetch.TOPIC_QUERIES — a hand-tuned query list; keep whichever is
in use aligned with the research_areas in vault.config.yaml. Hits are
merged across topics and anything already in the vault is dropped. It prints
a JSON array to stdout:
bibcode, arxiv_id, title, authors (first 3 + author_count),
abstract, pubdate, matched_topics.
Network/auth failure: if the command errors (missing ADS token, ADS unreachable, HTTP error), report the exact error to the user and stop — no retries beyond the one the CLI already makes internally.
3. Rank by relevance (judgment)
This step is why the skill isn't just a cron job: read the candidate list against what the user is actually working on right now.
- Read active projects: board model notes tagged
Project/SubProjectwithstatus: active(grep -rl '^status: active' obsidian --include=*.mdfiltered to those tags). - Read the
research_areaslist invault.config.yamlat the vault root (plus.claude/memory/user-research.md, when that file exists) for standing interests and instruments/surveys. - For each candidate, judge concrete connection — not just topic-string overlap (that's already been used for retrieval; this pass should catch candidates that matched broadly but aren't actually relevant, and rank the rest by how directly they bear on an active project or named interest).
- Keep the top ≤ 15. If more passed the fetch, say exactly how many were dropped in the note (no silent truncation) — e.g. "12 further candidates were reviewed and not included."
4. Write the digest note
Path: obsidian/journal/YYYY-MM-DD - arXiv digest.md, dated today. If a
digest note for today already exists (re-running same day), update it in
place rather than duplicating.
Frontmatter — match the vault's journal convention (check a recent note under
obsidian/journal/ if unsure it hasn't drifted):
---
title: YYYY-MM-DD - arXiv digest
tags:
- Journal
- ArxivDigest
created: "YYYY-MM-DDTHH:MM:SS"
modified: "YYYY-MM-DDTHH:MM:SS"
creator: <creator from vault.config.yaml; omit the line if unset>
date: YYYY-MM-DD
---
Body:
> [!note] Generated by <model> on <date>.
Tick a box and run `/arxiv-digest` again (or ask Claude to import it) to add
that paper to the vault via `newpaper`.
- [ ] **[<Title>](https://ui.adsabs.harvard.edu/abs/<bibcode>)** — <First-author-surname> et al. (<year>)
<one-sentence relevance, wikilinking the related [[Project]]/[[Concept]] notes>
arXiv:<arxiv_id>
...
*N further candidates were reviewed and not included this round.*
- One entry per kept paper, in descending relevance order.
- The relevance line is AI judgment — keep it to one sentence, concrete (name the project/concept it connects to), and wikilink every project or concept note it mentions per the vault's linking conventions (readable concept titles; links to not-yet-created concept notes are fine).
- Use the ADS abstract link (
bibcode) when available; if a candidate is arXiv-only (no bibcode yet), linkhttps://arxiv.org/abs/<arxiv_id>instead and still print the plainarXiv:<id>identifier line. - Preserve Hebrew/RTL text verbatim if any candidate title or note content requires quoting it.
5. Report
Tell the user: how many papers were imported in the pass-first step, the lookback window used, how many candidates were fetched vs. kept vs. dropped, and the digest note's path.
Non-goals / rules
- Read-only except the digest note itself (and any papers imported in
step 1, which follow
newpaper's own file-creation rules). - No scheduling — manual launch only.
- No PDF fetching at digest time — that happens on import via
newpaper. - Privacy: only the standing topic query strings (
topic_queriesinvault.config.yaml, or the built-ins indigest_pkg.fetch) are sent to ADS. Never send note contents, titles beyond what's needed for the ADS query, or any other vault material to ADS or any third-party service.