deep-research · git:20260701.b9c1253 · 2026-07-01 · sha256 6a34eb54122b5676

deep-research git:20260701.b9c1253B

Immutable. This exact content is served forever at /api/v1/blob/6a34eb54122b5676.

---
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.