deep-research + deep-web-research: v2.0.0 — six-move flow, domain-aware tool selection, re-strategize checkpoints, tag-based saturation, 600-turn ceiling

This commit is contained in:
Hermes Agent
2026-07-05 17:28:26 -05:00
parent 7771212893
commit d25b048a72
2 changed files with 173 additions and 44 deletions

View File

@@ -1,7 +1,7 @@
--- ---
name: deep-research name: deep-research
description: Dispatch exhaustive deep web research to the research profile. Triggered by "deep research", "ask web", or "research this". The research profile runs with the deep-web-research skill loaded — five-move flow, external ledger, mechanical saturation, disconfirmation, condensation from disk. description: Dispatch exhaustive deep web research to the research profile. Triggered by "deep research", "ask web", or "research this". The research profile runs with the deep-web-research skill loaded — six-move flow, external ledger, mechanical saturation, disconfirmation, condensation from disk.
version: 1.0.1 version: 2.0.0
author: Hermes Agent author: Hermes Agent
license: MIT license: MIT
platforms: [linux] platforms: [linux]
@@ -17,12 +17,14 @@ metadata:
Dispatches a research question to the research profile, which runs with the `deep-web-research` skill loaded. The research agent does exhaustive, trail-following research — any tool, any trail, no rush — then condenses everything into a tight, concrete, evidence-backed answer. This agent just relays the result. Dispatches a research question to the research profile, which runs with the `deep-web-research` skill loaded. The research agent does exhaustive, trail-following research — any tool, any trail, no rush — then condenses everything into a tight, concrete, evidence-backed answer. This agent just relays the result.
See `references/design-rationale.md` for the v2.0 architecture decisions and Claude validation findings.
**Trigger phrases:** "deep research", "ask web", "research this", "deep dive on", "exhaustive research on" **Trigger phrases:** "deep research", "ask web", "research this", "deep dive on", "exhaustive research on"
## Command ## Command
``` ```
hermes -p research -s deep-web-research chat -q "<question>" -Q --max-turns 200 --yolo hermes -p research -s deep-web-research chat -q "<question>" -Q --max-turns 600 --yolo
``` ```
- Output line 1: `session_id: <id>` — capture this - Output line 1: `session_id: <id>` — capture this
@@ -31,20 +33,21 @@ hermes -p research -s deep-web-research chat -q "<question>" -Q --max-turns 200
**Subsequent asks (resume the session):** **Subsequent asks (resume the session):**
``` ```
hermes -p research -s deep-web-research chat --resume <session_id> -q "<follow-up>" -Q --max-turns 200 --yolo hermes -p research -s deep-web-research chat --resume <session_id> -q "<follow-up>" -Q --max-turns 600 --yolo
``` ```
## What the Research Agent Does ## What the Research Agent Does
The `deep-web-research` skill on the research profile enforces: The `deep-web-research` skill on the research profile enforces:
0. **Analyze & Strategize** — analyze the question, select tools from the arsenal, write strategy to ledger
1. **Decompose** — break the question into sub-questions with time classifications 1. **Decompose** — break the question into sub-questions with time classifications
2. **Landscape Pass** — shallow sweep, identify key sources and terms 2. **Landscape Pass** — shallow sweep, identify key sources and terms
3. **Deep-Dive** — 3+ search angles per sub-question, full-page reads, citation trails, depth-first 3. **Deep-Dive** — 3+ search angles per sub-question, full-page reads, citation trails, depth-first
4. **Disconfirmation** — actively hunt for contradiction and outdated claims 4. **Disconfirmation** — actively hunt for contradiction and outdated claims
5. **Condensation** — read the external findings ledger from disk, synthesize into a concrete answer 5. **Condensation** — read the external findings ledger from disk, synthesize into a concrete answer
The research agent writes all findings to `/tmp/research-<sid>.md` (external ledger) and uses a phase gate file to enforce completion before condensing. Mechanical saturation checks (`grep -c`) prevent endless searching. The research agent writes all findings to `/tmp/research-<sid>.md` (external ledger) and uses a phase gate file to enforce completion before condensing. Mechanical saturation checks (`grep -c`) prevent endless searching. Re-strategize checkpoints after Move 2 and every ~10 findings during Move 3 enable mid-research pivots.
## When to Use ## When to Use
@@ -80,33 +83,20 @@ The research agent self-reports are not verified fact. If it claims a file write
1. **Profile flag required.** Always use `-p research`. The sticky default may be general. 1. **Profile flag required.** Always use `-p research`. The sticky default may be general.
2. **Skill flag required.** Always use `-s deep-web-research`. Without it, the research agent runs in normal mode without the methodology. 2. **Skill flag required.** Always use `-s deep-web-research`. Without it, the research agent runs in normal mode without the methodology.
3. **--yolo is required.** The research agent runs headless. Without it, approval prompts fail closed. 3. **--yolo is required.** The research agent runs headless. Without it, approval prompts fail closed.
4. **200 turns is the ceiling, not the target.** The research agent should condense well before 200. Hitting the ceiling means it failed to condense. 4. **600 turns is the ceiling, not the target.** The research agent should condense well before 600. Hitting the ceiling means it failed to condense.
5. **Don't re-condense.** The research agent already produced a condensed answer. Relay it, don't summarize it further. 5. **Don't re-condense.** The research agent already produced a condensed answer. Relay it, don't summarize it further.
6. **Don't do the research yourself.** If the user triggers deep research, dispatch it. Don't run a few searches and call it done. This is the #1 failure mode: the agent runs 2-3 `mcp_searxng_searxng_web_search` calls, gets empty results, and gives up. That's not deep research — that's a casual lookup. If you catch yourself typing `mcp_searxng_searxng_web_search` for a deep research request, STOP. You're doing it wrong. Dispatch to the research profile. 6. **Don't do the research yourself.** If the user triggers deep research, dispatch it. Don't run a few searches and call it done. This is the #1 failure mode: the agent runs 2-3 `mcp_searxng_searxng_web_search` calls, gets empty results, and gives up. That's not deep research — that's a casual lookup. If you catch yourself typing `mcp_searxng_searxng_web_search` for a deep research request, STOP. You're doing it wrong. Dispatch to the research profile.
7. **The methodology skill lives on the research profile.** `deep-web-research` is at `~/.hermes/profiles/research/skills/research/deep-web-research/SKILL.md`. It does NOT exist on the general profile. Don't search for it here — it won't be found. The general profile only has this delegation skill. 7. **The methodology skill lives on the research profile.** `deep-web-research` is at `~/.hermes/profiles/research/skills/research/deep-web-research/SKILL.md`. It does NOT exist on the general profile. Don't search for it here — it won't be found. The general profile only has this delegation skill.
8. **`reasoning_effort: xhigh` breaks `glm-5.2:cloud`.** The research profile's default model (`glm-5.2:cloud` via `custom:ollama`) rejects `xhigh` — it only accepts `high`, `medium`, `low`, `max`, or `none`. If the dispatch fails with "HTTP 400: invalid reasoning value: 'xhigh'", check `~/.hermes/profiles/research/config.yaml``agent.reasoning_effort`. Set it to `max` (the highest level the model actually supports). Do NOT downgrade to `high` without asking the user — they explicitly want maximum reasoning effort. If the model changes to one that supports `xhigh`, revert to `xhigh`.
## Pre-Dispatch Reasoning Check (MANDATORY) ## Pre-Dispatch Reasoning Check (MANDATORY)
Before EVERY deep research dispatch, verify the research profile's reasoning_effort is set to the maximum the model supports. This is a hard gate — do not dispatch without checking. Before EVERY deep research dispatch, set the research profile's reasoning_effort to `max`. This is a hard gate — do not dispatch without it.
``` ```
# 1. Read the research profile's current model and reasoning_effort
grep -E "default:|reasoning_effort:" ~/.hermes/profiles/research/config.yaml
# 2. If reasoning_effort is NOT 'max' (or 'xhigh' for models that support it):
# - If model is glm-5.2:cloud → set to 'max' (xhigh rejected)
# - If model is deepseek-v4-pro:cloud → set to 'max' (xhigh rejected)
# - If model is minimax-m3:cloud → set to 'xhigh' (supports it)
# - If unsure what the model supports → set to 'max' (safe default)
# 3. Apply the fix if needed:
hermes -p research config set agent.reasoning_effort max hermes -p research config set agent.reasoning_effort max
# OR for models that support xhigh:
hermes -p research config set agent.reasoning_effort xhigh
``` ```
**Rule:** Always dispatch with the highest reasoning effort the model actually supports. Never silently downgrade. If the model changed and you don't know what it supports, test with `max` first (universally safer than `xhigh`). `max` is the highest effort setting universally supported by all models. No model-specific table needed. If the model changes to one that supports `xhigh`, the user will set it in config — the pre-dispatch check just ensures it's at `max` minimum.
## Research → Validate → Fix Pipeline ## Research → Validate → Fix Pipeline

View File

@@ -1,7 +1,7 @@
--- ---
name: deep-web-research name: deep-web-research
description: Exhaustive deep web research — five-move flow, external findings ledger, mechanical saturation check, disconfirmation, condensation from disk. Opt-in skill for the research profile. description: Exhaustive deep web research — six-move flow, external findings ledger, mechanical saturation check, disconfirmation, condensation from disk. Domain-aware tool selection with adaptive re-strategizing. Opt-in skill for the research profile.
version: 1.0.0 version: 2.0.0
author: Hermes Agent author: Hermes Agent
--- ---
@@ -25,18 +25,54 @@ These persist across all turns — they are in the skill, not in fading context:
- **Local and free only.** No internet-based paid services, no SaaS APIs with - **Local and free only.** No internet-based paid services, no SaaS APIs with
billing, no metered endpoints. Use any tool already configured that fits this rule. billing, no metered endpoints. Use any tool already configured that fits this rule.
## Tool Selection Principles
These are reasoning heuristics, not rules. Apply judgment. Read once — they are
static reference, not generated per-question.
1. **Match tool strength to information need.** Don't use SearXNG when arxiv is
purpose-built for paper search. Don't use SearXNG when maigret is purpose-built
for username lookup. Each tool exists because it's better at something than
general search.
2. **Compose, don't isolate.** Most questions need multiple tool categories. A
person investigation might need OSINT (maigret, holehe) + social (twscrape) +
web (SearXNG) + reference (wikipedia). Compose across categories.
3. **Start broad, then specialize.** Landscape pass uses broad tools (SearXNG,
wikipedia). Deep-dive uses specialized tools (arxiv, maigret, Firecrawl). Don't
lead with Spiderfoot when a SearXNG search would tell you whether there's even
a domain to scan.
4. **Follow the trail, not the plan.** If a finding points to a source type you
didn't anticipate, add the tool that handles that source type. The strategy is
a starting point, not a contract.
5. **Prefer purpose-built over general.** arxiv > SearXNG for papers. maigret >
SearXNG for usernames. holehe > SearXNG for email registration. gnews > SearXNG
for news. Use SearXNG for what doesn't have a purpose-built tool.
6. **Consult the `search-key` decision matrix.** It maps task types to tools. Use
it as a reference, not a lookup table. If the matrix says `maigret` for username
lookup, that's a strong signal — but verify it makes sense for this specific
question.
7. **OSINT tools are an escalation ladder, not a default.** Start with SearXNG for
person lookups. Escalate to maigret if you have a username. Escalate to holehe
if you have an email. Escalate to Spiderfoot only if you have a domain and the
scope justifies it. Don't jump to the most aggressive tool first.
## Architecture: External Findings Ledger ## Architecture: External Findings Ledger
At 200 turns, early findings scroll out of context. The ledger is the fix. At 600 turns, early findings scroll out of context. The ledger is the fix.
**Path:** `/tmp/research-<session-id>.md` **Path:** `/tmp/research-<session-id>.md`
**Schema per finding:** **Schema per finding:**
``` ```
## Finding #<N>: <short label> ### Finding #<N> [SQ<N>]: <short label>
- Sub-Question: <which sub-question this belongs to>
- Claim: <the factual claim> - Claim: <the factual claim>
- Source: <URL> — <credibility tier: primary|secondary|aggregator|social> - Source: <URL> — <credibility tier: primary|secondary|aggregator|social|osint>
- Confirmed by: <URL> (or "single-sourced") - Confirmed by: <URL> (or "single-sourced")
- Date: <YYYY-MM-DD of the information, not of the search> - Date: <YYYY-MM-DD of the information, not of the search>
- Confidence: confirmed | likely | single-sourced | disputed - Confidence: confirmed | likely | single-sourced | disputed
@@ -47,11 +83,48 @@ At 200 turns, early findings scroll out of context. The ledger is the fix.
finding with the same claim. If found, add the new source to "Confirmed by" finding with the same claim. If found, add the new source to "Confirmed by"
instead of creating a duplicate. Duplicate findings defeat the saturation check. instead of creating a duplicate. Duplicate findings defeat the saturation check.
**Sub-question tagging:** Every finding must reference which sub-question it **Sub-question tagging:** Every finding line includes `[SQ<N>]` — e.g.,
belongs to. This enables the phase gate to verify coverage and the condensation `### Finding #3 [SQ2]: ...`. This enables per-sub-question saturation checks
phase to group findings by topic. that are immune to header ordering.
## Five-Move Research Flow **Credibility Tiers:**
| Tier | Definition | Examples |
|---|---|---|
| `primary` | Original source — the entity that created or owns the data | Official docs, original research paper, company release notes, raw dataset, government database, court filing |
| `secondary` | Reports on or analyzes primary sources with editorial oversight | News article citing a study, analyst report, Wikipedia (well-cited), reputable tech blog |
| `aggregator` | Collects/curates from other sources without original analysis | Hacker News, Reddit, link aggregators, auto-generated comparison sites |
| `social` | Individual opinion without institutional backing | Tweet, personal blog, forum post, YouTube comment |
| `osint` | Machine-generated tool output — marks provenance, not confidence | maigret report, holehe results, Spiderfoot scan, theHarvester output |
**Important:** `osint` marks *provenance* (where the claim came from), not
*confidence*. A single raw maigret hit is low-confidence osint; the same account
confirmed by a human-authored source is still confirmable. Don't auto-cap
confidence just because the tier is `osint`.
## Six-Move Research Flow
### Move 0: Analyze & Strategize
1. Consult the `search-key` decision matrix — it's your tool reference, not a
lookup you match against.
2. Call `mcp_searxng_searxng_instance_info` to discover available categories and
engines. Write them to the ledger.
3. Write this to the ledger, then start Move 1:
```
## Strategy
- Info needed: <kinds of facts that answer this question>
- Where it lives: <source types — papers? profiles? release notes? news?>
- Tools: <tool → what it fetches> (purpose-built over general search)
- Pivots: if I find <X>, add <tool Y>
```
4. OSINT gate — only if the plan names maigret / holehe / theHarvester /
Spiderfoot AND the target is a private individual with no public role: log
`## Ethics Note: <intent>` and confirm the scan is proportionate.
### Move 1: Decompose ### Move 1: Decompose
@@ -77,6 +150,21 @@ Shallow-but-broad sweep. For each sub-question, 1-2 searches, read top 1-2 resul
Extract only: key sources, terms of art, where disagreement lives, major players. Extract only: key sources, terms of art, where disagreement lives, major players.
No deep-diving yet. Append landscape notes to the ledger. No deep-diving yet. Append landscape notes to the ledger.
**After Move 2: Re-Strategize Checkpoint.** Read the strategy from the ledger. Ask:
- Are the tools I selected actually producing results?
- Have I discovered new angles that need different tools?
- Is the topic different than I initially thought?
- Are there tools I should add or drop?
If the answer to any is yes, update the strategy section:
```
### Strategy Revision <N>
- Trigger: <what I learned that changed my mind>
- Added tools: <tools to add and why>
- Dropped tools: <tools to drop and why>
- New pivot signals: <updated signals>
```
### Move 3: Deep-Dive per Sub-Question ### Move 3: Deep-Dive per Sub-Question
For each sub-question: For each sub-question:
@@ -90,13 +178,27 @@ For each sub-question:
- Assign credibility tier at capture time (not post-hoc in output). - Assign credibility tier at capture time (not post-hoc in output).
- Cross-reference: every claim needs 2+ independent sources. - Cross-reference: every claim needs 2+ independent sources.
- Use browser tools (Playwright) when static extraction fails on JS-heavy pages. - Use browser tools (Playwright) when static extraction fails on JS-heavy pages.
- Append every finding to the ledger. - Append every finding to the ledger with `[SQ<N>]` tag.
Citation trail stop conditions: Citation trail stop conditions:
- Reached primary source (original paper, official docs, raw data) - Reached primary source (original paper, official docs, raw data)
- Dead end (paywall, 404, requires login) - Dead end (paywall, 404, requires login)
- Circular reference (already read this source) - Circular reference (already read this source)
**Every ~10 findings during Move 3: Re-Strategize Checkpoint.** Same questions
as after Move 2. Update strategy if needed.
**Information-void handling:** After 5 searches on a sub-question with zero
relevant results (not zero *new* findings — zero *any* findings), document the
void and move on:
```
## SQ<N>: <sub-question> — VOID
- Searches attempted: <N>
- Tools tried: <comma-separated>
- Reason: no relevant results found
- Note: <why this might be — too new, too obscure, paywalled, etc.>
```
### Move 4: Disconfirmation Pass ### Move 4: Disconfirmation Pass
Actively try to falsify each key claim: Actively try to falsify each key claim:
@@ -113,13 +215,32 @@ Disconfirmation actively hunts for disagreement.
Read the full ledger from disk. Read the phase gate file. If any box is Read the full ledger from disk. Read the phase gate file. If any box is
unchecked, do NOT condense — go back and complete that item. unchecked, do NOT condense — go back and complete that item.
Synthesize: Synthesize using this template:
- Lead with the answer. No process narrative.
- Evidence-backed. Every claim tied to a source from the ledger. ```
- Concrete. Numbers, dates, names, specifics. # <Answer in 1-3 sentences>
- Uncertainty explicit. "X confirmed by A and B. Y single-sourced from C.
Z unresolved — D and E conflict." ## Key Findings
- Sources section: numbered list with URLs and credibility tiers. - <finding> — <source> (<credibility tier>, <date>)
- <finding> — <source> (<credibility tier>, <date>)
## Uncertainty
- <claim>: single-sourced from <source>
- <claim>: disputed — <source A> vs <source B>
- <claim>: unresolved — no sources found
## Tools Used
- <tool>: <what it contributed>
- <tool>: <what it contributed>
## Sources
1. <URL> — <description> (<tier>)
2. <URL> — <description> (<tier>)
## Tools That Would Have Helped
- <tool>: <what it would have enabled>
None: all sources were accessible with available tools.
```
## Guardrails ## Guardrails
@@ -127,11 +248,12 @@ Synthesize:
Every 3-4 searches, run this command — do not self-assess: Every 3-4 searches, run this command — do not self-assess:
``` ```
grep -c "^## Finding #" /tmp/research-<sid>.md grep -c "^### Finding #.*\[SQ<N>\]" /tmp/research-<sid>.md
``` ```
Compare to the previous count. If zero new findings in the last 3 searches, Compare to the previous count. If zero new findings in the last 3 searches,
that sub-question is saturated. Move to the next. This is a measurable fact, that sub-question is saturated. Move to the next. This is a measurable fact,
not a vibe. not a vibe. The `[SQ<N>]` tag makes this immune to header ordering — it counts
by tag, not by position.
### Phase Gate File ### Phase Gate File
@@ -143,17 +265,34 @@ If any box is unchecked, do NOT condense. Go back and complete that item.
# Phase Gate # Phase Gate
- [ ] All sub-questions have findings in the ledger - [ ] All sub-questions have findings in the ledger
- [ ] Disconfirmation pass completed for key claims - [ ] Disconfirmation pass completed for key claims
- [ ] Source diversity: ≥5 unique domains across all findings
- [ ] Source diversity: no single domain >30% of findings
- [ ] Tool diversity: ≥2 different tool categories used (not just SearXNG)
- [ ] Recency spread: findings span appropriate date range for topic
- [ ] OR: saturation condition fired (no new findings in last 3 searches) - [ ] OR: saturation condition fired (no new findings in last 3 searches)
- [ ] OR: turn ceiling approaching (wrap up what you have) - [ ] OR: turn ceiling approaching (wrap up what you have)
``` ```
Update this file as you progress. Update this file as you progress.
Mechanical domain diversity check:
```
grep -oP 'Source: \K[^ ]+' /tmp/research-<sid>.md | grep -oP 'https?://[^/]+' | sort -u | wc -l
```
### Turn Ceiling ### Turn Ceiling
200 turns is a safety net, not a target. Hitting the ceiling is a failure to 600 turns is a safety net, not a target. Hitting the ceiling is a failure to
condense, not the normal path. If the ceiling is hit, deliver partial findings condense, not the normal path. Ramp: if ≥450 turns used, begin condensation
with a note on what's missing. within 60 turns. If ≥540 turns used, condense immediately with what you have.
If the ceiling is hit, deliver partial findings with a note on what's missing.
### SearXNG Failure Handling
If SearXNG returns errors or empty results for 3 consecutive searches (different
queries), wait 10 seconds and retry once. If still failing, note the instance
issue in the ledger and fall back to `web_search` (built-in) or
`duckduckgo-search` (Python library) for the remainder of that sub-question.
## Tool Policy ## Tool Policy