Install
openclaw skills install long-researchClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.
[BETA] Deep research that actually reads pages instead of summarizing search results. Tell it how long to research (10 min, 2 hours, all night) and it works the full duration — searching, reading every result, following leads, cracking forums, cross-verifying findings, and writing progressively to a research file. Tree-style exploration: each page read spawns new searches, like a human researcher. Enforced read-to-search ratio prevents shallow search-spamming. Wall-clock time commitment — it won't finish early. Self-audit gate blocks delivery until quality checks pass. Works with web_search, web_fetch, and browser-use for JS-heavy sites.
openclaw skills install long-research⚠️ BETA — This skill works as described but is under active development. Review the notes below before installing.
pip install browser-use && browser-use install. Used for JS-heavy sites, login-gated forums, and retailer pricing. The skill will not function fully without it.browser-use remote mode:
The browser-use cascade tries 3 modes in order: chromium (local, free) → real (local, free) → remote (cloud-hosted, burns API credits). Remote mode sends page content to browser-use.com's cloud infrastructure. If you care about privacy, you can:
remote from the cascade and only use local modesLogin-gated forums and browser profiles:
The skill includes patterns for extracting content from login-gated forums using --profile flags. Profiles persist cookies locally on your machine in browser-use's default profile directory. The agent does NOT attempt automated login — it uses browser-use's cookie persistence from previous manual sessions. If you haven't logged into a forum manually via browser-use before, the agent won't have access. No credentials are stored or transmitted by this skill.
Filesystem writes:
Research output is written to research/[topic]-[date].md in your agent's working directory. Progressive writes happen every 3-5 tool calls as crash recovery. Files stay on your local machine — nothing is uploaded. If running in a shared environment, configure your agent's working directory to a safe location.
Sub-agent prompt injection surface: The skill mandates pasting full instructions into sub-agent task prompts. This means the entire SKILL.md (including your research query) is sent to whatever model provider your sub-agent uses. If you use external/remote model providers, be aware that your research queries and the full skill text are transmitted to those services. This is standard for any agent skill that delegates to sub-agents — but worth noting if your research topics are sensitive.
Recommended for first-time users:
When the user invokes this skill (e.g. "do long research", "research X", "pull up long research"), immediately start the pre-flight checklist. Do NOT ask "what topic?" separately — go straight into the pre-flight questions. If the user already provided a topic in their message, pre-fill it and ask the remaining questions.
Before starting ANY research, confirm all of these with the user:
Topic — What exactly to research. Get specific. If not provided yet, ask now.
Duration — How long to spend. Minimum 10 minutes, can be hours.
Autonomy — Choose one. Default: Autonomous.
Tools — List in priority order (highest priority first). The plan block MUST reflect this ordering. Default priority:
references/browser-use-patterns.mdUser may reorder (e.g., browser-use first for pricing-heavy research). Always include all three in the plan block — never omit browser-use.
Scheduling — Now or delayed? If delayed, note time + timezone.
Output — Where to deliver (this chat, specific topic, file only) and format (summary, full report, comparison table).
Clarifying questions — Ask anything about the user's situation BEFORE starting. Don't assume hardware, location, budget, preferences, etc.
⛔ GATE: You MUST post the plan block below and receive explicit user approval before making ANY research tool calls. Do not start research based on implied approval, partial answers, or "just get going" energy. The plan block IS the gate.
Post this and wait for approval:
📋 Research Plan
• Topic: [what]
• Duration: [X] minutes/hours
• Mode: Autonomous / Interactive / Interactive-continue
• Tools: [list in priority order, e.g. web_search → web_fetch → browser-use]
• Start: Now / [scheduled time]
• Output: [where and format]
• Questions: [anything unclear about user's situation]
Proceed? (yes to start)
If the user answers clarifying questions but doesn't say "proceed/yes/go", re-post the updated plan and ask again.
⛔ The sub-agent MUST have the full skill instructions in its task prompt. The root cause of most research failures is the orchestrator paraphrasing the skill instead of injecting it. A sub-agent that doesn't read this file will ignore every gate, every ratio, every enforcement rule.
TASK PROMPT TEMPLATE (paste in this order — critical rules at TOP and BOTTOM):
─────────────────────────────────────────────────────────────────────────────
## ⛔ CRITICAL RULES (read first, enforce always)
1. READ > SEARCH. After Seed, you cannot search unless you've read something since your last search.
2. NEVER start synthesis while time remains. Run `date +%s` and check END_TS.
3. browser-use cascade: chromium → real → remote. Try ALL 3 before giving up on any source.
4. web_search returns URLS, not answers. Ignore Perplexity's synthesis text. Extract only the citation URLs.
5. "Not found" IS a valid finding. If you can't find what was asked, say so honestly. Do NOT answer an adjacent question.
## Research Task
[The user's EXACT question, quoted verbatim. Do not paraphrase, soften, or broaden it.]
## Task Anchor (re-read every 5 tool calls)
Your job is to answer THIS question: "[exact question again]"
Every 5 tool calls, ask yourself: "Does my last action directly serve THIS question?"
If no → STOP current branch → re-orient.
## User Context
[Any relevant context — location, timeline, constraints. Keep separate from the task.]
## Research Rules
[Paste the FULL Execution section from SKILL.md — the complete Read-Driven Loop,
browser-use Cascade, Forum-Cracking Playbook, Progressive Writing, Time Enforcement,
Negative Results, Self-Audit, etc.]
## ⛔ REMINDER (read last, enforce always)
- You MUST read more pages than you search. Track: reads vs searches.
- You MUST try all 3 browser modes before giving up.
- You MUST NOT start synthesis while time remains.
- You MUST deliver honest negative results, not drift to adjacent questions.
- You MUST run the self-audit before delivering.
─────────────────────────────────────────────────────────────────────────────
The fundamental architecture: reading pages is the default action. Searching is only allowed when the URL queue is empty. This prevents the search-addiction pattern where agents fire 15 searches and read 3 pages.
1. SETUP
├─ START_TS=$(date +%s)
├─ END_TS=$((START_TS + DURATION_SECONDS))
├─ SEARCH_COUNT=0, READ_COUNT=0, WRITE_COUNT=0
├─ Create URL_QUEUE (empty list)
└─ Post: "🚀 Research started. Deadline: $(date -d @$END_TS '+%H:%M:%S')"
2. SURVEY PHASE (first 30% of committed time — BREADTH before depth)
├─ Goal: IDENTIFY as many candidates/angles as possible. Do NOT deep-dive yet.
├─ Run 3-5 broad searches with different angles/terminology
├─ For each search: extract citation URLs + candidate names/items mentioned
├─ Build a CANDIDATE LIST: every distinct option/entity mentioned across all sources
├─ ⛔ GATE: Write #1 to file (Task Anchor + FULL candidate list + URL queue)
├─ CANDIDATE GATE: You MUST have identified ≥10 candidates before deep-diving ANY of them.
│ If topic naturally has fewer (e.g., "best 3 X"), adjust to ≥2x the expected answer count.
├─ WRITE_COUNT += 1
└─ Post: "📋 Survey complete. [N] candidates identified: [list]. Now deep-diving."
Example: Don't stop at the first 3 options you find. If researching [Topic], survey should
uncover at least 10-20 candidates across different categories, brands, or approaches.
THEN prioritize which to deep-dive based on relevance to the question.
3. MAIN LOOP (repeat until time runs out)
│
├─ IF URL_QUEUE is not empty:
│ ├─ Pop next URL from queue
│ ├─ RELEVANCE CHECK: Is this URL likely to contain what the Task Anchor asks for?
│ │ If clearly irrelevant (e.g., beginner guide when searching for expert anecdotes): SKIP, log as "pruned: [reason]"
│ ├─ READ it (web_fetch first, browser-use cascade if fails)
│ ├─ After reading, assess: "Did this page help answer the Task Anchor?"
│ │ If yes: READ_COUNT += 1 (productive read)
│ │ If no: DEAD_END_COUNT += 1 (log as dead end, don't count as productive)
│ ├─ Extract: findings + new URLs → add new URLs to queue
│ ├─ If read spawns a question that needs a NEW search:
│ │ └─ ALLOWED (because you just read something)
│ │ ├─ web_search → extract citation URLs → add to queue
│ │ └─ SEARCH_COUNT += 1
│ └─ Continue to next iteration
│
├─ IF URL_QUEUE is empty AND you need more:
│ ├─ web_search with NEW terms (not repeating old queries)
│ ├─ SEARCH_COUNT += 1
│ ├─ Extract URLs → add to queue
│ └─ Go back to reading from queue
│
├─ Every 3-5 tool calls: write findings to file, WRITE_COUNT += 1
│
├─ Every 5 tool calls:
│ ├─ Re-read Task Anchor — am I still on-target?
│ ├─ Run: NOW=$(date +%s); REMAINING=$((END_TS - NOW))
│ ├─ Post: ⏱️ elapsed/committed (remaining) | 🔍 S | 📄 R | 📝 W | 🪦 D (dead ends) | R>S? yes/no
│ └─ Verify: READ_COUNT > SEARCH_COUNT? If not, STOP searching, READ.
│
├─ ⛔ BROWSER-USE DEADLINE: By 50% of committed time, you MUST have attempted
│ at least 1 browser-use call. If you reach the halfway mark without one,
│ STOP everything and run a browser-use cascade on your most promising blocked URL.
│
├─ ⛔ NO IDLE WAITING — NEVER USE `sleep` EXCEPT FOR browser-use PAGE LOADS (max 3s):
│ If you have time remaining, you MUST be making productive tool calls.
│ Running `sleep 60` or any sleep > 3s to fill time is a HARD FAIL.
│
│ Before you even think about sleeping, run this MANDATORY checklist:
│ □ Have I tried the top 3 forums for this domain?
│ □ Have I tried old.reddit.com web_fetch on at least 1 subreddit?
│ □ Have I tried Google cache on at least 1 blocked URL?
│ □ Have I searched YouTube comments?
│ □ Have I searched in non-English languages (if relevant)?
│ □ Have I tried older threads (2020, 2021, 2022)?
│ □ Have I tried alternative community forums beyond the obvious ones?
│ □ Have I cross-verified my existing findings with a second source?
│ If ANY box is unchecked → DO THAT instead of sleeping.
│
└─ TIME CHECK: if $(date +%s) >= END_TS → exit loop, go to SYNTHESIS
4. SYNTHESIS (only after time is up)
├─ ⛔ GATE: Run date +%s. Print result. If NOW < END_TS, go back to step 3.
├─ Write final version of research file
├─ Include: Task Anchor, Executive Summary, Research Tree, Findings, Sources, Verification
└─ WRITE_COUNT += 1
5. SELF-AUDIT (hard gate — blocks delivery)
├─ Run every checklist item (see Self-Audit section below)
├─ Fix any failures
└─ Write Process Compliance section
6. DELIVER
├─ Chat summary (<500 words)
├─ Link to research file
└─ Final elapsed time from date +%s
Why this works better than a ratio rule:
web_search returns URLs, not answers.
When web_search returns a response from Perplexity/Sonar:
Why: Perplexity fabricates quotes, hallucinates thread URLs, and presents unverified claims as consensus. If you read its synthesis, you'll unconsciously treat it as a finding. Don't read it. URLs only.
After Seed phase, you earn each search by reading:
Hard search cap: Maximum searches = 1.5x committed minutes. For 10 min = max 15 searches. If you hit the cap, you are BLOCKED from searching for the rest of the session. Read only. At any checkpoint: if SEARCH_COUNT > 2x READ_COUNT → BLOCKED from searching until reads catch up.
PDF URLs: If a URL ends in .pdf, use browser-use to render it. web_fetch returns binary garbage for PDFs. Skip PDFs entirely if browser-use is unavailable.
For grey-area topics (supplements, nootropics, off-label treatments, emerging tech, anything without large studies or established consensus):
Forum reads / Total reads >= 0.4? If not → next reads MUST be forums.For well-studied topics (established science, mainstream products):
For EVERY candidate/option the research identifies as "good" or "recommended":
"[candidate] dangers" OR "[candidate] problems" OR "[candidate] risks" OR "[candidate] didn't work"The #1 failure mode is task drift — answering an adjacent, easier question.
Mechanism:
## Task Anchor.Examples of drift:
The test: If your findings say "according to official policy..." instead of "user X on forum Y reported that..." — you've drifted.
Sometimes the answer is: "I looked hard and didn't find it."
This is a VALID research outcome. Do NOT:
Instead:
The summary for a negative result should lead with the negative. Don't bury it under adjacent findings.
--profile. web_fetch cannot scrape Amazon.pip install browser-use && browser-use install.browser-use has 3 browser modes. You MUST try them in order. Do NOT give up after one failure.
Use this exact bash pattern:
URL="https://example.com"
SESSION="research"
# Attempt 1: chromium (free)
echo ">>> Trying chromium..."
browser-use --session $SESSION --browser chromium open "$URL" 2>&1 | tail -5
# If "url:" appears in output → SUCCESS
# Attempt 2: real (free)
echo ">>> Trying real..."
browser-use --session $SESSION --browser real open "$URL" 2>&1 | tail -5
# Attempt 3: remote (paid, last resort)
echo ">>> Trying remote..."
browser-use --session $SESSION --browser remote open "$URL" 2>&1 | tail -5
Run all 3 in sequence. Stop at the first success. Log all attempts:
[BROWSER CASCADE: {url}]
chromium: SUCCESS/FAIL (reason)
real: SUCCESS/FAIL (reason)
remote: SUCCESS/FAIL (reason)
⛔ If you get an import error (e.g., BrowserConfig not found), that's a code bug, not a site block. Fix the code (use BrowserProfile) and retry. Do NOT count code bugs as cascade failures.
⛔ NEVER give up after 1 failure. NEVER skip to "find alternative source" without trying all 3 modes. If you log only 1 attempt, the self-audit will fail you.
When web_fetch returns 403, empty content, Cloudflare, or broken HTML:
[web_fetch BLOCKED: {url} → cascade: chromium=X, real=Y, remote=Z]Forums are where real experiences live. They're also the hardest to access. Use these strategies IN ORDER:
Reddit (NOTE: as of 2026, Reddit blocks most automated access including old.reddit.com):
old.reddit.com via web_fetch (try first but expect 403)cache:reddit.com/r/[sub]/comments/[id]reddit.com (last resort)site:reddit.com "[exact phrase]" — use citation URLs, NOT Perplexity synthesisLogin-gated forums:
browser-use --session forum --browser chromium open "https://forum.example.com/thread/[ID]"
# Wait 2s for page load
browser-use --session forum --browser chromium eval "Array.from(document.querySelectorAll('[data-role=commentContent], .post-body, .message-content')).map((e,i) => 'POST ' + i + ': ' + e.innerText.substring(0,600)).join('\n===\n')"
Blocked forums:
YouTube comments:
Domain-specific community forums:
site:[forum-domain]Vendor research with browser-use:
document.querySelectorAll('.product-miniature') → map name + priceGeneral fallback for any blocked source:
cache:[url] via web_fetchhttps://web.archive.org/web/[url]site:[domain] "[exact phrase]" to find alternative pages on the same siteWhen the user asks for real-life experiences, first-person accounts, or anecdotes:
Use personal-language queries:
"my experience with" [topic] site:[relevant-forum]
"I tried" OR "I switched to" OR "after using" [topic] forum
"my experience" [topic] "what happened" forum
"I had to" OR "they told me" OR "turns out" [topic keywords]
DO NOT use policy-language queries:
"[topic] requirements overview" ← returns official pages, not stories
"what is needed for [topic]" ← returns guides, not experiences
Source priority for anecdotes:
site: searches with first-person languageThe test: Your findings should contain direct quotes from real people, with usernames and thread URLs. If your report says "typically X happens..." instead of "user @JohnDoe42 on [Forum] reported: '...'" — you've answered a different question.
[⚠️ unverified forum consensus]⛔ GATE: First write MUST happen after Seed phase. You CANNOT proceed to tree traversal until you've written initial findings, URL queue, and Task Anchor to the research file.
📝 [N] file writes. If N=0 after 4+ tool calls → STOP and write NOW.Setup:
START_TS=$(date +%s)
END_TS=$((START_TS + DURATION_SECONDS))
echo "START_TS=$START_TS" > /tmp/research_time
echo "END_TS=$END_TS" >> /tmp/research_time
echo "Deadline: $(date -d @$END_TS '+%H:%M:%S UTC')"
Every status check:
source /tmp/research_time
NOW=$(date +%s)
echo "Elapsed: $(( (NOW - START_TS) / 60 )) min | Remaining: $(( (END_TS - NOW) / 60 )) min"
Status format:
⏱️ [elapsed] / [committed] ([remaining] left) | 🔍 [S] searches | 📄 [R] reads | 📝 [W] writes | R>S? [yes/no]
The R>S? field: reads must exceed searches. If it says "no", stop searching and read.
⛔ Before starting synthesis, you MUST run this check:
source /tmp/research_time
NOW=$(date +%s)
if [ $NOW -lt $END_TS ]; then
echo "BLOCKED: $((( END_TS - NOW ) / 60)) minutes remaining. Go back to research."
else
echo "TIME UP: Proceed to synthesis."
fi
If the check prints "BLOCKED": You CANNOT synthesize. Go back to the Main Loop. Use the remaining time for:
If the check prints "TIME UP": Proceed to synthesis.
references/context-management.md)research/[topic]-[date].md progressively.If the research involves products/purchases:
research/[topic]-[date].md)# [Topic] Research
**Date:** [timestamp]
**Duration:** [actual time spent]
**Tools used:** [list]
**Searches:** [count] | **Deep reads:** [count] | **Ratio R:S:** [ratio]
## Task Anchor
> [User's exact question, quoted verbatim]
## Executive Summary
[3-5 bullet points — ONLY ✅ verified findings]
[If negative result: lead with "After X searches and Y page reads, no [specific thing] was found."]
## Research Tree
[SEARCH → READ → spawned → READ → etc. Shows traversal.]
## Detailed Findings
### [Category 1]
[findings with source URLs, ✅/⚠️ markers]
## Comparison Table (if applicable)
## Sources
[numbered list of URLs actually fetched — NOT search result URLs]
## Source Verification
[✅ verified (fetched actual page) | ⚠️ unverified (search synthesis) | 🔗 direct quote]
## Confidence Notes
[what's solid vs uncertain]
## Recommendation
[ONLY ✅ verified sources. If negative result, recommend next steps to find the answer.]
## Process Compliance
[Self-audit pass/fail for each gate + remediation taken]
Post concise summary (<500 words) when done. Link to full research file.
⛔ You CANNOT post the chat summary until every box is checked. Run the audit, fix failures, THEN deliver.
date +%sdate +%s (no guessing)date +%s ≥ END_TSreads: [R] / searches: [S]🪦 [D] dead ends📝 [N] and R>S? [yes/no]⛔ For each browser-use gate, you must paste the actual command and its output. Checking a box without evidence is audit fraud.
chromium attempt: [paste command + result]
real attempt: [paste command + result]
remote attempt: [paste command + result]
[url] → 403 → cascade: chromium=[result], real=[result], remote=[result]
🪦 [url] — [why irrelevant]Forum reads: [F] / Study reads: [S] / Ratio: [F/(F+S)]Devil's advocate searches: [N] / Candidates: [M] / Ratio: [N/ceil(M/3)]| Failure | Fix |
|---|---|
| READ_COUNT ≤ SEARCH_COUNT | Read more pages now |
| Missing writes | Write current findings immediately |
| Unverified claims in recommendation | Remove or verify them |
| Time not honored | Continue researching |
| browser-use cascade incomplete | Run remaining modes now |
| Task drift | Re-search with original question terms |
| No anecdotes when requested | Forum searches with first-person language |
| Only 1-2 browser modes tried | Try the remaining modes on any pending source |
date +%s against END_TS before ANY final output.sleep for more than 3 seconds (browser-use page loads only). Running sleep 60 to fill remaining time is a HARD FAIL that the audit WILL catch. The checklist of "things to do when done" is mandatory — run through it before claiming you're out of options.--profile.date +%s. No guessing.