| name | deep-research |
| license | MIT |
| description | Deep, multi-source, fact-checked research on a topic — fan out searches, read primary sources, adversarially verify each claim, and synthesize a cited report. Use when the user wants a thorough research report rather than a quick answer, e.g. "深度调研", "research this properly", "写一份调研报告", "帮我系统调研", "多来源核实", "give me a researched writeup", "背景调查一下". BEFORE starting, if the question is underspecified (scope, region, time window, use-case unclear), ask 2-3 clarifying questions to narrow it. For a single quick lookup use web_search directly; for a whole codebase/feature use the relevant dev skills. |
Skill: deep-research
A harness for research you can trust: breadth first (many angles), then depth
(primary sources), then an adversarial pass that tries to break each claim
before it goes in the report. Built on octo's native tools — web_search,
web_fetch, sub_agent, and (for login-gated / JS-rendered / anti-bot sites)
the browser tool via the web-access skill. No external services.
The goal is a cited report where every non-obvious claim traces to a source
you actually read — not a plausible-sounding summary of search snippets.
0. Scope before you search
Research is only as good as the question. Before any tool call, confirm you can
state the deliverable: what question, what decision it informs, what time
window, what region/market, what depth. If any of these is missing and would
change the answer, ask 2-3 sharp clarifying questions first — don't guess a
scope and burn a fan-out on the wrong one.
Then write down, in one line, what "done" looks like. That line is the acceptance
criterion the final report is checked against.
1. Fan out — breadth
Decompose the question into 4-8 independent sub-questions, each attacking a
different angle (definition, current state, competing views, data/numbers,
history, criticisms, primary actors). Independence matters: overlapping
sub-questions waste the fan-out.
Dispatch them in parallel. web_search / web_fetch are stateless, so this is
exactly the case sub-agents are for:
- One
sub_agent per sub-question. Prompt it goal-first, not step-first:
describe what to find out, not "search for X" — an anti-bot source may need
browser on the main site, and "search" would anchor the sub-agent to
web_search.
- Tell each sub-agent to load the
web-access skill and follow it, to return
findings with source URLs, and to flag anything it couldn't verify.
- Do NOT parallelize
browser work — the browser session is single-page and
process-shared; concurrent sub-agents fight over one page. Keep browser
interaction to a single sequence; parallelize only the stateless search/fetch.
If sub_agent is unavailable in this session, run the sub-questions sequentially
inline and say so.
2. Go to the source — depth
Search engines and aggregators are a discovery entry point, not proof. N
outlets quoting the same wrong number is circular, not corroboration. For every
claim that matters, reach the primary source and read it:
| Claim type | Primary source |
|---|
| Policy / regulation | Issuing body's official site |
| Company announcement | The company's own newsroom / filing |
| Academic / scientific | The original paper or the institution |
| Product capability / API | Official docs or source, not blog posts |
| Statistics | The dataset publisher, not the article citing it |
Use web_fetch on the source URL to pull the page as clean Markdown (pass the
raw URL — don't hand-build a r.jina.ai/ prefix). When the source is behind a
login, renders via JS, or blocks fetching, switch to browser per web-access.
When no official source exists, an original report from an authoritative outlet
(not a reprint) can serve as a secondary basis — but say so explicitly:
"No official source found; the following relies on [outlet]'s reporting and may
carry transcription error."
3. Adversarial verify — try to break each claim
This is what separates research from a summary. For each load-bearing claim,
run a skeptical pass before trusting it:
- Does the source actually say this, or is it the article's spin on it?
- Is the source primary, or is it echoing someone else? Trace one hop back.
- Is it current, or superseded? Note the date on every source.
- Do independent sources disagree? Surface the disagreement — don't average it away.
For high-stakes claims, dispatch a verifier sub_agent prompted to refute
the claim (default to "unverified" when uncertain), not to confirm it. A claim
that survives an honest attempt to break it is worth reporting; one that doesn't
gets dropped or flagged as contested.
Track claim → source as you go. Anything you can't attribute to a source you
read does not enter the report as fact — at most as a clearly-labelled open
question.
4. Synthesize — the cited report
Structure to the deliverable from step 0, not a fixed template. Typical shape:
- Bottom line — the answer to the question, up front, in a few sentences.
- Findings — organized by sub-question or theme, each key claim carrying an
inline source (title + URL). Present genuine disagreement as disagreement.
- Confidence & gaps — what's well-established, what's thin or single-sourced,
what you couldn't resolve. State this honestly; a known gap is more useful than
false certainty.
- Sources — the primary sources you actually read, deduped.
Then check the report against the step-0 acceptance line. If it doesn't answer
the question, name what's still missing rather than padding.
Completeness check
Before finishing, ask: what's missing? A sub-question not run, a claim asserted
but never traced to a source, a contradiction glossed over, a source cited but
not read. Whatever that surfaces is the next round — loop back to step 1 for it,
don't ship around it. Stop when the acceptance criterion is met, not before, and
don't over-research past it.