From claude-skills
Orchestrates multi-phase autonomous research across all available skills. Discovers skill capabilities, manages persistent research state (questions, sources, facts, coverage), and guides the LLM through scope → sweep → deep-read → cross-reference → synthesise phases. Use when the user asks for deep research, comprehensive analysis, multi-source investigation, literature review, or any task requiring iterative search-read-analyse cycles across multiple data sources.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-skills:deep-researchThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **MANDATORY — read before doing anything else:**
MANDATORY — read before doing anything else:
- NEVER delegate research to Agent() or any subagent. Execute ALL phases directly in the main conversation. Spawning an Agent bypasses these instructions and breaks the workflow.
- NEVER use built-in Fetch to download URLs. It does NOT mimic a browser and gets blocked (403). To download ANY URL, use duckduckgo's
download.py— it sets browser headers and handles anti-bot protection. Every URL you want to read MUST go throughdownload.py.- NEVER use built-in Web Search. Use duckduckgo's
search.pyinstead.${CLAUDE_SKILL_DIR}= this skill only. To run duckduckgo scripts, read the/duckduckgoSKILL.md first — it has its own${CLAUDE_SKILL_DIR}.
This skill is an orchestrator, not a data fetcher. It provides two data-pipe scripts — one discovers available skill capabilities, the other manages persistent research state. The LLM does all the thinking: decomposing goals into questions, choosing which skills to invoke, evaluating coverage, deciding when to dig deeper, and synthesising findings.
User question
↓
LLM: decompose into sub-questions
↓
discover.py → capability map (what skills/scripts are available)
↓
state.py init → create research session
↓
┌─────────────────────────────────────────┐
│ PHASE LOOP (LLM orchestrates) │
│ │
│ 1. Pick unexplored questions │
│ 2. Choose skill + script for each │
│ 3. Run scripts → get raw data │
│ 4. LLM: extract facts, update state │
│ 5. LLM: check convergence │
│ 6. If not converged → generate new │
│ questions, loop back to 1 │
└─────────────────────────────────────────┘
↓
state.py export → full research state
↓
LLM: synthesise final report
Before using these commands: read the /duckduckgo SKILL.md to get its ${CLAUDE_SKILL_DIR}. The variable below (DDG_DIR) is a placeholder — replace it with the actual path from the duckduckgo SKILL.md.
# Web search (text, news, or images):
uv run --no-config ${DDG_DIR}/scripts/search.py text "your query" --max-results 10
uv run --no-config ${DDG_DIR}/scripts/search.py news "your query" --timelimit w
uv run --no-config ${DDG_DIR}/scripts/search.py images "your query"
# Comprehensive news sweep (multiple topics):
uv run --no-config ${DDG_DIR}/scripts/top_news.py --groups tech science
# *** DOWNLOAD ANY URL (replaces Fetch — mimics browser, avoids 403) ***:
uv run --no-config ${DDG_DIR}/scripts/download.py "https://example.com" --format md
# Fact checking (multi-source):
uv run --no-config ${DDG_DIR}/scripts/fact_check.py "claim to verify"
# Trending topics:
uv run --no-config ${DDG_DIR}/scripts/trending.py --discover
# Multi-language search:
uv run --no-config ${DDG_DIR}/scripts/translate_search.py "en:query" "de:query"
When you find a URL you want to read — use download.py, NEVER Fetch. Fetch gets 403 errors; download.py mimics a real browser.
| Task | Script | What it does |
|---|---|---|
| Discover available skills | discover.py | Scans skills/ directory, outputs JSON capability map |
| Initialize/resume research | state.py init | Creates or resumes a research session |
| Add research questions | state.py add-questions | Appends questions (deduped) to state (use --file) |
| Update question status | state.py update-question | Marks question as unexplored/partially/covered (use --file) |
| Add sources | state.py add-sources | Records URLs/docs with skill attribution (use --file) |
| Add facts | state.py add-facts | Records claims with source IDs and confidence (use --file) |
| Advance phase | state.py update-phase | Moves to next research phase |
| Check progress | state.py status | Returns coverage summary JSON |
| Export full state | state.py export | Dumps complete research state as JSON |
# Discover what skills are available:
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/discover.py [--skills-dir PATH]
# Initialize a research session:
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py init --research-id "my-topic" --goal "Understand X in depth"
# Add questions — use Write tool to create the JSON file, then pass --file:
# Write /tmp/questions.json with: ["What is X?", "How does Y relate to Z?"]
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py add-questions --research-id "my-topic" --file /tmp/questions.json
# Update a question's status:
# Write /tmp/uq.json with: {"question": "What is X?", "status": "covered"}
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py update-question --research-id "my-topic" --file /tmp/uq.json --status covered
# Record sources found:
# Write /tmp/sources.json with: [{"url": "https://...", "title": "Article", "skill": "duckduckgo"}]
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py add-sources --research-id "my-topic" --file /tmp/sources.json
# Record extracted facts:
# Write /tmp/facts.json with: [{"claim": "X causes Y", "source_ids": ["s1", "s2"], "confidence": "high"}]
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py add-facts --research-id "my-topic" --file /tmp/facts.json
# Advance to next phase:
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py update-phase --research-id "my-topic" --phase sweep
# Check progress:
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py status --research-id "my-topic"
# Export full state for synthesis:
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py export --research-id "my-topic"
# Custom state directory (when user says "store results in ..."):
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py init --research-id "my-topic" --goal "..." --state-dir /path/to/custom/dir
The LLM drives each phase. Scripts provide I/O and persistence; the LLM provides reasoning.
discover.py to see what skills/scripts are availablestate.py init to create a research sessionstate.py add-questions to record themstate.py update-phase --phase scopeLLM guidance: Questions should be concrete and verifiable. Bad: "Is AI good?" Good: "What are the top 3 documented risks of LLM deployment in healthcare as of 2026?" Each question should be answerable by finding specific sources.
Reminder: Do NOT use Agent(), Web Search, or Fetch. Run duckduckgo scripts directly via
uv run.
state.py add-sourcesstate.py add-factspartially if some data found, leave unexplored if nothing usefulstate.py update-phase --phase sweepSkill routing — use the capability map from discover.py, then READ the target skill's SKILL.md:
/duckduckgo SKILL.md, use its search.py, top_news.py. NEVER use built-in Web Search./duckduckgo SKILL.md, use its download.py. NEVER use built-in Fetch./duckduckgo SKILL.md, use its fact_check.py/duckduckgo SKILL.md, use its trending.py/google-drive SKILL.md, use its scriptsDecomposition before search: For specialized topics, decompose into precise queries BEFORE running search scripts. Enumerate vendors, products, publications, and sub-categories from existing knowledge, then search for each specifically.
partially covered question, fetch full content of promising sources/duckduckgo SKILL.md, use its download.py to get full text (or /google-drive download.py for Drive files)state.py add-facts for each batch of findingsstate.py add-questionsstate.py update-phase --phase deep-readLLM guidance: Read critically. Note contradictions between sources. When sources disagree, record both claims with confidence levels: high (multiple quality sources agree), medium (single source or partial evidence), low (unverified, social media, single blog).
state.py export to see all accumulated factsstate.py update-phase --phase cross-referenceLLM guidance: This is where analytical quality matters most. Cluster facts by theme. Identify which claims have multi-source backing vs. single-source. Flag facts where the only sources are opinion pieces or social media.
state.py export for the final statestate.py status to confirm coverage[1], [2] etc. in the body text[N] pointing to the Sources section. Do not leave any claim unsourced.state.py update-phase --phase synthesiseThe LLM decides when to stop. These are guidelines, not hard limits:
| Signal | Meaning |
|---|---|
All questions covered | Research goal fully addressed |
| 3 consecutive rounds with <2 new facts | Diminishing returns — synthesise |
≥80% questions covered or partially | Good enough — ask user if they want deeper |
| Contradictions resolved or explicitly flagged | Cross-reference phase complete |
Never stop prematurely if there are still unexplored questions with available data sources. The goal is thoroughness within the user's topic, not speed.
~/.cache/deep-research/<research-id>.json--state-dir /path/to/dir to all state.py commandsstate.py init with the same research-id returns the existing state without overwriting. All subsequent commands append without data loss.quantum-computing-trends-2026). Keep it short and filesystem-safe.This skill does NOT fetch data itself. It orchestrates other skills. Execute searches directly — NEVER delegate to Agent().
PATH WARNING: Each skill has its OWN
${CLAUDE_SKILL_DIR}. You MUST read the target skill's SKILL.md before running its scripts — that will give you the correct${CLAUDE_SKILL_DIR}for that skill. NEVER construct paths to other skills' scripts using this skill's${CLAUDE_SKILL_DIR}.
How to invoke another skill's scripts:
/duckduckgo SKILL.md)${CLAUDE_SKILL_DIR} — that variable resolves to the correct path for THAT skillWorkflow:
discover.py tells you WHAT skills exist and what they can dostate.py add-sources, set the skill fieldExample routing decisions (read the skill's SKILL.md first for exact commands):
/duckduckgo SKILL.md → use its search.py news/duckduckgo SKILL.md → use its top_news.py/duckduckgo SKILL.md → use its download.py/google-drive SKILL.md → use its search.py/duckduckgo SKILL.md → use its fact_check.py/duckduckgo SKILL.md → use its trending.pyFor large research tasks, the context window can fill up. The LLM should:
--fileWhen adding questions, sources, or facts, always use your Write tool to create a temp JSON file, then pass --file /path/to/file.json. NEVER use heredoc (<< 'EOF') or cat > in the terminal — these garble output and cause retries. NEVER pass large JSON as inline CLI arguments — shell quoting mangles them.
Pattern (repeat for every state update):
/tmp/<name>.json with the JSON contentuv run --no-config ... --file /tmp/<name>.jsonAffected commands:
add-questions --file /tmp/questions.json — JSON array of question stringsadd-sources --file /tmp/sources.json — JSON array of source objectsadd-facts --file /tmp/facts.json — JSON array of fact objectsupdate-question --file /tmp/uq.json — JSON object {"question": "...", "status": "..."}# Step 1: Write tool → /tmp/questions.json with content:
# ["What are the key factors?", "How does Y compare to Z?"]
# Step 2: run the script:
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py add-questions --research-id "my-topic" --file /tmp/questions.json
# Step 1: Write tool → /tmp/facts.json with content:
# [{"claim": "fact 1", "source_ids": ["s1"], "confidence": "high"}]
# Step 2: run the script:
uv run --no-config ${CLAUDE_SKILL_DIR}/scripts/state.py add-facts --research-id "my-topic" --file /tmp/facts.json
Inline --questions/--facts/--sources are only safe for 1–2 very short items. For any batch from a research round, use --file.
See references/phases.md for detailed phase-by-phase prompt patterns and examples.
npx claudepluginhub dmitrykrivaltsevich/claude-skills --plugin claude-skillsIndexes deep research principle skills for methodology, source evaluation, hallucination prevention, and synthesis-reporting; provides /research command for orchestrated multi-agent web research with verification.
Executes multi-agent research pipeline on any topic with Scout, Investigators, Deep Diver, Verifier, Synthesizer, and Critic reviews to produce verified, sourced reports.
Conducts deep web research with parallel agents, multi-wave exploration for gaps, and structured synthesis. Activates for investigating topics, comparing options, best practices, or comprehensive web info.