Paper Review — 單篇論文深度評讀

SkillDev tools

Deep single-paper academic analysis — journal credibility, author profiling, reference verification, citation impact, and critical appraisal. Like a teaching hospital journal club report. Use this skill whenever the user wants to deeply review, evaluate, or dissect a single academic paper, prepare a journal club presentation, verify a paper's references, check an author's track record, or do any thorough paper-level analysis. Also trigger when the user says "review this paper", "深度評讀", "journal club", "論文評讀", "幫我看這篇", or provides a DOI/PMID asking for analysis. NOT for multi-paper systematic reviews or standalone evidence grading.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Paper Review — 單篇論文深度評讀 skill

What this skill tells your AI

The instructions your AI receives, as published by drpwchen/paper-review-and-digest in paper-review/SKILL.md and read by ahel’s review.

Overview

This skill performs a 360-degree deep dive into a single academic paper, covering journal credibility, author backgrounds, publication history, historical context, reference verification, critical appraisal, and citation impact analysis. The output is a structured Obsidian note in ${vault.papers_dir} plus a daily note entry under ${vault.daily_section}.

Reviews should be clinically grounded, teachable (journal-club ready), and honest about what the evidence can and cannot support. Tone, language, specialty framing, and external-validity checks are driven by ${persona} (see Configuration).

Configuration (read FIRST, every run)

Before Phase 0, read config.yaml in this skill's directory (copy config.example.yamlconfig.yaml on first setup). It defines the values this document references as ${section.key}:

  • ${vault.papers_dir}, ${vault.medicine_dir}, ${vault.inbox_note}, ${vault.daily_section}
  • ${fulltext.*} (inbox, Zotero, Elsevier, SFX resolver, institution) — consumed via fulltext-acquisition.md
  • ${secrets.backend} — how bundled scripts read API keys
  • ${persona} — language, specialty, audience, locale, reimbursement system. This is user-authored; it sets whether output is 繁體中文/English, which clinical lens, and whether coverage lookups run.

Wherever this SKILL writes ${...}, substitute the config value. A blank/placeholder value means "skip that route". The bundled scripts (grade_judge.py, argdown_lint.py) need no config.

Input

Accepts any of:

  • DOI (e.g., 10.1097/PHM.0000000000002700)
  • PMID (e.g., 39056432)
  • Paper title (partial or full)
  • PDF file path (local file)
  • Pasted content (abstract or full text in the conversation)

Effort tiers (pick before starting — token budget)

  • Quick (daily-note [x] checkbox): Phases 1 + Critical Appraisal + 白話導讀 only. No author/journal deep-dive, no citation analysis, no reference verification. ~1 model, cheap.
  • Deep (/paper-review): all 7 phases. Token-heavy (many MCP + WebFetch calls). Before starting, offer the user a focused deep: "全跑 (Phases 1-7) 還是只跑關鍵幾關 (2 期刊/6 引用查核/appraisal)?" Respect a "skip" after any phase. Don't silently run all 7 if the user wanted a spot-check.
  • Either tier: reuse journal_cache.json / author_cache.json before any WebSearch.

Delegation (deep tier — added 2026-07-07 per dispatch-protocol)

The main context keeps what is intelligence-bound: reading the paper itself ONCE, the Critical Appraisal, GRADE domain ratings, and final synthesis. Everything that is fan-out lookup work gets delegated so raw search dumps never enter main context:

  • Phase 3 (author profiling) → ONE subagent per key author (parallel, same message, model: "haiku"): given name + affiliation, run the S2 author tools + WebSearch, return a ≤6-bullet profile (h-index, top papers, COI/retraction flags). Main context never sees raw search results.
  • Phase 6 Steps 2-3 (reference verification) → batch the selected references into 1-2 subagents (model: "sonnet"), each returns verification-table rows only (the exact columns of Step 4). Give each agent the claim text + citation; NOT your appraisal reasoning.
  • Phase 7 (citation categorization + PubPeer/social sweep) → one subagent (model: "sonnet") returns the 🟢🔴🔵🟡 categorized list + any PubPeer/news hits with links.
  • Every delegation prompt includes: "If you cannot meet the criteria, say FAILED and list what you tried — do not return a best guess as verified." Failed lookups are reported as gaps, never silently dropped.
  • Quick tier: no delegation (overhead exceeds benefit).

Phase 0: Full Text Acquisition

Follow the shared protocol: ~/.claude/skills/paper-review/fulltext-acquisition.md (check order, OA auto-fetch rule, Elsevier TDM, institutional SFX resolver, Zotero bookkeeping + citekey).

Review-specific policy: if NO full text is obtainable from any route, proceed with abstract-only review — mark "⚠️ Abstract-level review" at the top of Deep Review, and every section limited by this notes「abstract 未報告,需全文確認」. (Contrast: /paper-digest hard-stops.) For figures/tables when working from a Zotero PDF: point the user to the PDF in Zotero.

Phase 1: Paper Identification & Metadata

Use Semantic Scholar MCP as primary (more reliable), PubMed MCP as supplement:

Semantic Scholar MCP (primary):

  • search_papers or get_paper_details → citation count, fields of study, TL;DR, DOI
  • Semantic Scholar's paper ID is needed for later phases (citations, references, authors)

PubMed MCP (supplement — may be flaky, session errors common):

  • search_articles → find PMID if not already known
  • get_article_metadata → MeSH terms, publication dates, abstract
  • If PubMed MCP fails (session terminated / invalid content), fall back to WebSearch site:pubmed.ncbi.nlm.nih.gov "{title}" to get PMID

Extract and confirm: title, all authors (with affiliations), journal, DOI, PMID, study type, received/accepted/published dates, keywords/MeSH terms.

After this phase, show the user a brief summary — confirm this is the right paper before proceeding with the deep dive.

Phase 2: Journal Credibility

Assess the journal's trustworthiness and standing:

  • Impact metrics: WebSearch for current Impact Factor, SJR ranking, CiteScore
  • Indexing: Confirm presence in PubMed/MEDLINE, Scopus, Web of Science
  • Peer review process: Single-blind, double-blind, or open review
  • Reputation in field: Where does this journal sit in the specialty hierarchy? (e.g., for PM&R: AJPMR > Archives PMR > J Rehabil Med > smaller specialty journals)
  • Red flags: WebSearch "{journal name}" retraction watch and "{journal name}" predatory to check for controversy, inclusion in Beall's list, or unusual retraction rates
  • Retraction/correction check (this paper) — SINGLE authoritative check, done once here: mcp__zotero__scite_check_retractions on the DOI catches retractions, expressions of concern, and corrections in one call. This is the canonical paper-level integrity check; Phase 4 reuses this result instead of re-searching. Only if scite is unavailable, fall back to one WebSearch "{DOI}" retraction OR "expression of concern" OR erratum.

Output: 2-4 bullet points summarizing journal credibility with specific metrics.

Phase 3: Author Profiling

Focus on first author and corresponding author (often the senior PI). For other authors, brief mentions only.

Delegate this phase (see §Delegation) — one parallel model: "haiku" agent per key author. Each agent runs, and returns only a ≤6-bullet profile from:

  • search_authors + get_author_details → h-index, total citations, paper count
  • get_author_top_papers → their most-cited works (shows research trajectory)
  • WebSearch → institutional affiliation, lab/research group, recent grants
  • Check for COI: look at the paper's COI declaration section + WebSearch for industry ties
  • Red flags: WebSearch "{author name}" retraction to check history
  • Any tool failure → the agent reports "FAILED: " for that bullet, not a guess

Output: a brief profile for each key author — credentials, expertise match to this paper's topic, and any concerns.

Phase 4: Publication Timeline

From metadata already gathered:

  • Received → Revised → Accepted → Published dates
  • Calculate review duration (received to accepted). Flag if unusually fast (<30 days for a non-letter/editorial) or slow (>12 months)
  • Reuse the Phase 2 scite retraction/correction result — do NOT re-search. Note here only if a correction/erratum post-dates publication (relevant to the timeline).
  • Check if there's a related commentary or editorial in the same journal issue

Output: timeline with any notable observations.

Phase 5: Historical Context & Background

This phase explains why this paper exists — the research landscape that motivated it:

  • Read the paper's Introduction carefully for the narrative arc
  • Use Semantic Scholar get_related_papers and get_paper_references to map the intellectual lineage
  • Identify:
    • The specific research gap or controversy this paper addresses
    • 3-5 key prior works that directly led to this study
    • The field's trajectory — is this an emerging area, a mature debate, or a paradigm shift?
  • For each key prior work, get a one-line summary via get_paper_details

Output: a narrative (in bullet form) tracing the intellectual path from prior work to this paper.

Phase 6: Reference Verification (Key Claims Only)

This is the most distinctive part of this review. The goal is to check whether the paper accurately represents its sources — a common and often undetected problem in the literature.

Step 1: Identify key claims

Read through the paper and identify 5-10 claims that are central to the paper's argument. These are typically in the Introduction (establishing the rationale) and Discussion (comparing results).

If the paper has >20 references, ask the user which claims or sections to focus on. Don't auto-select all.

Adaptation for Systematic Reviews / Umbrella Reviews

For SR/meta-analysis/umbrella reviews, Reference Verification takes a different form:

  • Instead of checking individual citation accuracy, assess the quality of included studies
  • Check whether the search strategy was comprehensive (databases, date range, grey literature)
  • Verify the quality assessment tool used (AMSTAR-2 for SRs, Cochrane RoB for RCTs)
  • Flag if conclusions are stronger than the quality of included evidence supports
  • Check for overlap in primary studies across included SRs (umbrella reviews)
  • Run the actual PRISMA 2020 checklist against this paper (not just "did they cite PRISMA") — walk the 27 items (title/abstract/introduction/methods/results/discussion/funding sections; full item list at prisma-statement.org if needed) and mark each Reported / Partial / Missing. Report only the gaps (don't pad a table of 27 ✅ rows) — missing protocol registration, incomplete search strategy reporting, or no risk-of-bias-across-studies assessment are the highest-yield flags. This is a reporting-completeness check on the paper's OWN methods section, separate from AMSTAR-2 (which judges methodological rigor).

Step 2: CrossRef existence gate (anti-hallucination, do this FIRST)

Before any semantic comparison, run a cheap deterministic existence check per selected reference — this catches fabricated DOIs and "right DOI, wrong paper" swaps that a purely semantic read misses (ported from htlin222/robust-lit-review's crossref.py, the same anti-hallucination gate DeepTRACE found necessary — LLM-written citations run 40–80% accuracy unaudited):

  • WebFetch https://api.crossref.org/works/{doi} (no key needed). 404 / no messagedoes not exist — flag ❌ fabricated/unresolvable DOI, do not proceed to semantic comparison for it.
  • If it resolves, compare the returned title against the reference's title as cited in the paper (simple token-overlap read, not exact-match — journals reformat titles). Low overlap → flag ⚠️ DOI resolves to a different paper before trusting the citation at all.
  • No DOI given for a reference → note "no DOI, existence unverified" and rely on Semantic Scholar/PubMed title search as the fallback existence check.
  • Hard rule — existence pass is never a claim-level pass: machines catch nonexistence, not misquotation. A CrossRef pass only unlocks Step 3; it must never shortcut or substitute the semantic comparison. If CrossRef itself is down, mark "existence gate skipped" on affected rows and still run Step 3 — degrade to explicit uncertainty, never to a silent pass.

Step 3: Verify each claim (semantic layer, only for references that passed Step 2)

Delegate Steps 2-3 as a batch (see §Delegation): split the selected references across 1-2 model: "sonnet" agents; each returns only completed Step-4 table rows (+ explicit "FAILED" rows where a lookup died). Main context assembles the table and judges borderline verdicts.

For each key claim and its cited reference:

  • Use Semantic Scholar get_paper_details or PubMed MCP get_article_metadata to get the reference's abstract
  • Compare what the paper says the reference found vs. what the reference actually says
  • Classification:
    • Accurate — faithful representation
    • ⚠️ Minor discrepancy — slightly overstated, simplified, or missing nuance
    • Misrepresented — the reference doesn't support the claim, says something different, or is taken out of context
  • If a reference looks suspicious at abstract level, try to get full text (same acquisition strategy, but only for suspicious ones)

Step 4: Output verification table

#ReferenceCrossRefClaim in PaperReference Actually SaysVerdict
1Author2020✅ exists, title matches"X causes Y""X correlates with Y in subset"⚠️ overstated

Critical Appraisal (integrated after Phase 5-6)

Step 1 — Route by study design (MANDATORY, do not use a generic checklist)

Identify the design first, then appraise domain-by-domain with the matching tool. Each domain gets 🟢/🟡/🔴 + a one-line justification, then an overall risk-of-bias judgement.

study_typeToolDomains to walk through
RCTCochrane RoB 2randomization process / deviations from intended interventions / missing outcome data / outcome measurement / selective reporting
Cohort / case-control / cross-sectionalROBINS-I (interventions) or Newcastle-Ottawa (etiologic)confounding / selection / classification of exposure / missing data / outcome measurement / selective reporting
SR / MAAMSTAR-2 critical domains + GRADE per outcomeprotocol registration / search adequacy / RoB of included studies / meta-analysis methods / publication bias / heterogeneity handling
Diagnostic accuracyQUADAS-2patient selection / index test / reference standard / flow & timing
Prediction modelPROBASTparticipants / predictors / outcome / analysis (EPV, validation)
GuidelineAGREE II (精簡: rigor of development + editorial independence)evidence base / recommendation-evidence link / COI management / update policy
Narrative reviewSANRA + cherry-picking checkjustification / literature search description / referencing of key statements / are contradicting studies acknowledged?
Case series / reportJBI checklistconsecutive inclusion / clear criteria / complete reporting

Observational studies additionally: read the bundled causal-appraisal.md (35 Hernán + Users' Guide doctrines, folded into this skill — no external dependency) and check the applicable ones explicitly (confounding by indication, immortal time bias, selection into study, time-zero misalignment, collider bias…). Name the doctrine when flagging a problem — teachable output.

Step 2 — Statistical & spin review

  • Statistical significance ≠ clinical significance: for each primary outcome, compare the effect size against the MCID of the instrument (search vault/textbook-md for the MCID of common ${persona.specialty} scales; cite the source). p<0.05 but < MCID → say so explicitly.
  • RCT extras: ITT vs per-protocol (which was used, does it matter here), multiplicity correction for multiple outcomes/timepoints, fragility index when computable from a 2×2 (events small → quote it), sample size calculation vs actual enrollment.
  • Trial registration check (RCTs; prospective SRs → PROSPERO): WebFetch the ClinicalTrials.gov / registry record and compare registered primary outcome vs published primary outcome. Outcome switching or unreported registered outcomes → 🔴 flag. No registration for a modern RCT → 🔴.
  • Spin detection: put the abstract conclusion side-by-side with the actual results. Flag when the conclusion (a) claims benefit off a non-significant primary outcome via secondary/subgroup emphasis, (b) generalizes beyond the studied population, or (c) omits harms.
  • Argument-structure check (does the conclusion follow from the paper's own premises?) — run it through the bundled argdown_lint.py so the verdict is a deterministic gate, not an impression:
    1. Read the paper's conclusion sentence → claim + claim_type (causal / hard_endpoint / consistency / general).
    2. List each primary/secondary finding meant to support it as a premise, TAGGING its type (direct_rct / association / surrogate_outcome / single_study / subgroup / secondary_outcome / mechanistic / expert_opinion).
    3. python argdown_lint.py argmap.json — it flags the illicit jumps deterministically (surrogate→hard-endpoint, association→causal, single-study→"consistently shows", subgroup/secondary-only→benefit). Exit 1 = a gap exists. The LLM does the semantic tagging; the script does the logic. Write the flagged gap(s) inline in this section; when the linter returns clean (exit 0), skip silently (don't pad every paper).
  • Funding & COI: funding source, sponsor role in design/analysis, author COI vs the direction of conclusions.

Step 3 — Grade and summarize

  • GRADE (per main outcome where applicable) — recompute the certainty with the bundled grade_judge.py, don't let a holistic LLM impression stand. The model rates the domains; the script computes the authoritative final grade (its value, not your gut-call label, goes in the note):
    1. Starting level: RCT-dominant evidence → high; observational-dominant → low.
    2. Rate each of the 5 domains — risk_of_bias / inconsistency / indirectness / imprecision / publication_bias — as not_serious (0) / serious (−1) / very_serious (−2), one-sentence justification each.
    3. Observational + no downgrade applied → add upgrades (large_effect RR>2 or <0.5 → +1, RR>5 or <0.2 → +2; dose_response; opposing_confounding). The script enforces the GRADE rule that upgrades apply only to observational evidence with no downgrade — don't pre-filter, just list them.
    4. Write the ratings to grade_input.json and run python grade_judge.py grade_input.json. The printed FINAL CERTAINTY is authoritative and goes into the 品質快照 + Critical Appraisal. If your holistic impression disagrees with the computed value, that's a signal to re-examine a domain rating, not to override the number. (Deterministic core ported from htlin222/robust-lit-review's grade_judge.py.)
  • Limitations: authors' own AND unacknowledged ones.
  • Fill the note's ## Critical Appraisal section (domain table) and the 品質快照 callout (see note template) — the snapshot is the 10-second verdict, the section is the evidence.

Phase 7: Citation & Impact Analysis

Evaluate how the paper has been received by the academic community and public:

Academic citations:

  • scite first: mcp__zotero__scite_enrich_item (or scite_enrich_search) → supporting / mentioning / contrasting citation counts. A non-trivial contrasting count is the signal to dig — deep-read only the contrasting/critical citers instead of sampling blindly.
  • get_paper_citations → list of citing papers
  • Categorize the top 5-10 most relevant citing papers:
    • 🟢 Supporting: builds on or confirms findings
    • 🔴 Contradicting: presents opposing evidence
    • 🔵 Extending: takes the work in a new direction
    • 🟡 Methodological critique: questions the methods or analysis
  • Note total citation count and trend (increasing? plateaued?)

Public/social discussion (part of the Phase-7 delegated agent, see §Delegation):

  • WebSearch: "{title}" OR "{DOI}" site:pubpeer.com
  • WebSearch: "{title}" OR "{DOI}" twitter OR reddit OR blog
  • Look for news coverage, especially in medical/science news outlets
  • Note any notable commentary, criticism, or endorsement
  • WebSearch/WebFetch failure or zero hits → state "PubPeer/social sweep: no hits / FAILED ()" in the note — an unrun sweep must not read as "no criticism found"

Output: impact assessment relative to field norms and paper age.

Output: Obsidian Note

Write to ${vault.papers_dir}{FirstAuthorYear} - {Short Title}.md

If a note for this paper already exists (check by DOI or PMID), merge the deep review sections into the existing note rather than creating a duplicate. Show the user a diff of changes before writing (per CLAUDE.md rules). Brand-new note → show the full draft before writing (CLAUDE.md tiered approval — new notes are draft-first, same as merges are diff-first).

Note template — 三塊結構

筆記分為三塊邏輯:(1) 讀完能用 (2) 可不可信 (3) 連結與來源

Quick review([x] checkbox 觸發)只寫前兩塊 + Resource。 Deep review(/paper-review 觸發)加入 # Deep Review 段落。

## 白話導讀 一律要寫(quick 與 deep 都寫):放在 ## Summary 之後、## Clinical Application 之前, 用一個 > [!abstract] callout 把整篇用繁體中文白話「講一遍」,讓使用者不必讀完深度評讀就能掌握全篇在說什麼。 這是「導讀/意譯」不是逐句翻譯。外框固定三段(一句話 / 為什麼做 / 所以呢),中間「主體」依 study_type 分流

  • RCT:逐組講清楚——實驗組 vs 對照組各自的 protocol(具體介入、劑量、頻率、療程;對照是 sham 還是 standard care), 且每個 outcome 要給兩組的實際數值與組間差異(mean±SD / Δ / 95% CI / p),不可只寫「有顯著差異」。
  • SR/MA:逐 outcome 講——每個 outcome 的納入族群定義(PICO)+ pooled effect(SMD/RR/OR + 95% CI、I²、納入篇數/人數)。
  • Narrative review:逐組別/主題講——他把主題分成哪幾組,每組整理了什麼重點(一組一行)。
  • 觀察性研究(cohort/case-control/cross-sectional):逐組講——各組的定義、各組的結果(關鍵數值)、 以及作者推測的原因/機轉(明確標示為 inference,不是因果證實)。

醫學名詞、藥名、參數、量表保留英文,關鍵數值用 ==highlight==,其餘用白話中文。 abstract-only 時就依摘要能取得的範圍寫,缺的數值標「abstract 未報告,需全文確認」,並沿用 ## Summary 的 ⚠️ 標記。

---
tags:
  - source/journal
  - med/{specialty}      ← 只用已存在的 med/ tag,新 tag 需更新 registry
citekey: "{BBT citation key}"
doi: "{DOI}"
zotero: "zotero://select/items/@{citekey}"
journal: "{Journal}"
year: {YYYY}
authors: "{All authors}"
study_type: "{RCT/SR+MA/cohort/etc.}"
pmid: "{PMID}"
review_depth: "quick"   ← 或 "deep"
---

> [!info] 品質快照
> **設計**:{RCT / cohort / SR+MA…}|**n**:{樣本數}|**RoB**({RoB 2/ROBINS-I/AMSTAR-2…}):{🟢低/🟡中/🔴高}
> **GRADE**:{High/Moderate/Low/Very Low}(主要 outcome)|**Registration**:{✅一致 / 🔴 outcome switching / ❌未註冊 / n.a.}
> **一句話 verdict**:{可信度+最關鍵的 1-2 個弱點,例:可信度中等——隨機化健全但 open-label、primary outcome 未達 MCID}

# Key Points

## Summary

> ⚠️ Based on abstract only  (或 > ✅ Full text reviewed)

- 一句話重點,==highlight== 最重要數值

## 白話導讀

> [!abstract] 整篇講給你聽(繁體中文白話)
> - **一句話**:這篇到底在說什麼
> - **為什麼做**:背景動機、想補的研究缺口
> - **主體**(依研究類型,見下方規則填對應結構)
> - **所以呢**:臨床/實務上的意義 + 最重要的 1-2 個限制

> [!example]- 主體結構範例(依 study_type 擇一,實際只留對應那種)
> **RCT** — 逐組講清楚 + outcome 實際展現:
> - 組別 protocol:實驗組(介入、劑量/頻率/療程)vs 對照組(sham/standard care 具體是什麼)
> - 每個 outcome:實驗組 vs 對照組 的==實際數值與組間差異==(不只寫「有顯著」;給 mean±SD / Δ / 95% CI / p)
>
> **SR/MA** — 逐 outcome 講:
> - 每個 outcome:納入的==族群定義==(誰、什麼介入、什麼比較)+ pooled effect(==SMD/RR/OR + 95% CI==、I² 異質性、納入幾篇/幾人)
>
> **Narrative review** — 逐組別/主題講:
> - 他把主題切成哪幾個組別/段落,==每一組整理了什麼重點==(一組一行)
>
> **觀察性研究(cohort / case-control / cross-sectional)** — 逐組講:
> - 各組的==定義==(暴露/非暴露、case/control 怎麼分)
> - 各組的結果(==關鍵數值==)
> - 作者推測的原因/機轉(標明這是 inference,非因果證實)

## Clinical Application

- **適應症:**(具體 condition、severity)
- **Protocol:**(full text 時補充:頻率、pulse 數、coil 類型、治療天數、時機)
- **禁忌/注意:**
- **實務 tips:**
- **在地適用性 / external validity:** 研究族群能否外推到 `${persona.locale}` 的
	`${persona.specialty}` 病人。**給付/自費查詢為 OPTIONAL**:只在 `${persona.reimbursement_system}`
	非空、且使用者問到給付或介入明顯涉及給付決策時才查(用你設定的給付資料庫工具);否則略過此 bullet。

# Paper Details

## Methods

- 研究設計、收案條件、介入方式
- (full text 時補充:statistical methods、sample size calculation、具體 protocol)

## Critical Appraisal

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
39
Forks
8
Last commit
Aug 2026
Advanced
Catalog kind
skill
Gateway key
paper-review-drpwchen
Source
github.com/drpwchen/paper-review-and-digest