一键导入
omh-deep-research
parallel web research; subagents→synthesis→cite-verify
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
parallel web research; subagents→synthesis→cite-verify
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Drive an omh-ralph run: dispatch, evidence, commit hygiene.
Execute one omh-ralph task: file-scope, commit, report.
Drive omh-ralplan: context package, rounds, distillation.
Drive omh-triage: when to invoke, how to run rounds.
Multi-role consensus triage of an issue backlog.
pipeline: interview→plan→execute→QA→verify (idea→code)
| name | omh-deep-research |
| description | parallel web research; subagents→synthesis→cite-verify |
| version | 1.0.0 |
| metadata | {"hermes":{"tags":["research","web","synthesis","parallel","omh"],"category":"omh","requires_toolsets":["terminal","omh","web"]}} |
.omh/research/{slug}-report.md
with status: confirmed for this topic — view it insteadweb toolset is available in this Hermes install (see Prerequisites)This skill fail-fasts if any of the following are missing:
web toolset — provides web_search AND web_extract. If either
is unavailable, print:
omh-deep-research requires the `web` toolset (web_search + web_extract); aborting.
and exit before doing any work.omh_state tool — preferred path. If absent, fall back to manual
JSON read/write at .omh/state/research--{slug}.json (per-instance —
{slug} is the kebab+date+random4 minted in Phase 1; multiple research
topics can run concurrently). If neither is writable, fail-fast with a
clear error..omh/ for state, plan, findings, report, log.Hermes discovery: hermes skills list | grep omh-deep-research should
return this skill once installed.
mkdir -p ~/.hermes/skills/omh && ln -snf <repo>/plugins/omh/skills/omh-deep-research ~/.hermes/skills/omh/omh-deep-research
Parent dir creation MUST precede the symlink.
Five invocation phases, exit-safe between any two:
| # | Phase | Reads | Writes | Subagents |
|---|---|---|---|---|
| 1 | decompose | user query | {slug}-plan.md, state.phase=search | none |
| 2 | search | plan, state, findings/ | new findings file(s), state.completed_subtopics, phase | 1-3 [omh-role:researcher] parallel |
| 3 | gap_check | all findings | optional _followup.md OR direct phase flip | 0 or 1 [omh-role:researcher] |
| 4 | synthesize | all findings (parent inlines) | {slug}-report.md status: draft, phase=verify | 1 [omh-role:research-synthesist] |
| 5 | verify | report + findings (parent inlines) | confirmed frontmatter / state mutate / blocked | 1 [omh-role:research-verifier] |
Per-instance state. Each research session lives at
.omh/state/research--{slug}.json (the engine slugifies instance_id
into the filename). Multiple topics can be in flight concurrently — the
slug minted in Phase 1 IS the instance_id, and every subsequent
omh_state(...) call passes instance_id="{slug}". Per-session
artifacts (plan, findings, report) are slug-keyed under
.omh/research/. The earlier research-{id}.json and
research-state.json (singleton) wordings from older specs are
superseded.
Parent owns the filesystem. All web tool use happens inside delegated
subagents. The parent reads findings files and inlines their contents
into synthesist's and verifier's context field. Subagents return
text only.
Roles are referenced, never inlined. Use [omh-role:NAME] markers.
The full role bodies live in plugins/omh/references/role-*.md.
Before starting any new research session:
new_slug. We need it to disambiguate enumeration below.omh_state(action="list_instances", mode="research"). If the tool is
unavailable, glob .omh/state/research--*.json manually. Each entry
carries an instance_id (== slug) and active flag.omh_state(action="cancel_check", mode="research", instance_id="{slug}").
If cancelled, log CANCELLED slug={slug} and clear that instance via
omh_state(action="clear", mode="research", instance_id="{slug}")..omh/research/{slug}-report.md has frontmatter status: confirmed,
the previous run crashed after writing the sentinel but before
clearing state. Treat as completed: log
REPORT_CONFIRMED_RECOVERED slug={slug}, clear via
omh_state(action="clear", mode="research", instance_id="{slug}").topic
matches the new request, jump directly to Phase 2/3/4/5 for THAT
slug (use its existing instance_id); do not mint new_slug.{slug}-report.md
exists with status: confirmed matching the new topic, prompt:
refresh (mint a new slug and re-run) / view existing report / cancel.new_slug. Concurrent
active research on different topics is permitted; do not block.omh_state(action="cancel_check", mode="research", instance_id="{slug}").slug = kebab(topic)[:40] + '-' + YYYYMMDD + '-' + random4
where random4 is 4 lowercase-hex chars.
kebab() = lowercase, replace runs of non-alphanumeric with -,
strip leading/trailing -, truncate to 40 chars..omh/research/{slug}-plan.md with frontmatter:
---
status: planning
topic: {original user topic}
slug: {slug}
subtopics:
- name: {subtopic 1 name}
queries: [{q1}, {q2}, {q3}]
- ...
---
omh_state(action="write", mode="research", instance_id="{slug}", data={...}):
{
"phase": "search",
"slug": "{slug}",
"topic": "{topic}",
"subtopic_count": N,
"completed_subtopics": [],
"started_at": "{ISO-8601}",
"session_id": "{uuid4}",
"synthesis_attempts": 0
}
STARTED slug={slug} and PLAN_WRITTEN slug={slug} subtopics=N.This phase is re-entrant: it dispatches one batch of up to 3
researcher subagents per invocation, then exits. Re-invoke to dispatch
the next batch. Re-entry is driven by state.completed_subtopics.
omh_state(action="cancel_check", mode="research", instance_id="{slug}").{slug}-plan.md frontmatter.pending = [s for s in plan.subtopics if s.name not in state.completed_subtopics].batch = pending[:3] (up to 3 in parallel).[omh-role:researcher] marker:
delegate_task(tasks=[
{
"goal": "<self-contained: topic, subtopic name, exact queries to run, output template per [omh-role:researcher]>",
"context": "<plan excerpt for this subtopic; no other subagent's findings>",
},
...up to 3...
])
Each task's goal is fully self-contained — no inter-subagent
dependencies. The role marker [omh-role:researcher] MUST appear in
each goal so the subagent loads the role..omh/research/{slug}-findings/{subtopic-slug}.md with
frontmatter capturing subtopic, source_urls, and credibility
tags pulled from the subagent's returned SOURCES block.state.completed_subtopics (extend the list, persist via
omh_state(action="write", mode="research", instance_id="{slug}", data=...)).pending becomes empty after the write, set
state.phase = "gap_check" BEFORE exiting (still after the
findings write — order: findings → completed_subtopics → phase flip).BATCH_COMPLETE batch=N subtopics=[name1,name2,...] per batch.Pitfalls specific to Phase 2:
kebab(subtopic.name)[:60]. If
two subtopics kebab to the same slug, append -2, -3, etc.web_search or web_extract directly. All
web tool use is inside the delegated [omh-role:researcher]
subagents. The parent's job is dispatch and disk.The parent skill never calls web_search or web_extract directly;
all web tool use happens inside delegated subagents.
Cancel check: omh_state(action="cancel_check", mode="research", instance_id="{slug}").
Read all .omh/research/{slug}-findings/*.md files. From each, extract
the GAPS: bullet list. Concatenate, then dedup lexically
(case-insensitive trim-compare; preserve first occurrence).
TWO branches only:
(a) 0 gaps — Set state.phase = "synthesize", log
GAP_CHECK_COMPLETE gaps=0, exit.
(b) ≥1 gap — Delegate ONE [omh-role:researcher] subagent.
Goal: synthetic "subtopic" named _followup, with the deduped gap
list as the queries. Parent writes the returned text to
.omh/research/{slug}-findings/_followup.md (atomic). Set
state.phase = "synthesize", log GAP_CHECK_COMPLETE gaps=N, exit.
No threshold tiers. No N-versus-M gap branching. No inline web_search branch. Two branches only — that is the contract.
Cancel check: omh_state(action="cancel_check", mode="research", instance_id="{slug}").
Parent INLINES findings. Read ALL files under
.omh/research/{slug}-findings/ (including _followup.md if
present). Concatenate their full contents into the delegation's
context field. The synthesist subagent has no filesystem access.
Budget escape (verified safe). If the concatenated payload exceeds the orchestrator's tool-arg budget (≈40KB+ across 5+ findings files is a soft threshold), the parent MAY summarize each findings file's SYNTHESIS section while preserving:
[N] block verbatim (titles + URLs + tags + dates)_followup block verbatim (it is usually the smallest and
most claim-dense)
Do NOT drop or paraphrase any URL, citation tag, or numeric claim.
Dogfooded 2026-04: a 5-subtopic + 1-followup run with summarized
SYNTHESIS bodies + verbatim source lists passed verification at
high confidence with all 28 globally-renumbered citations intact.
When in doubt, prefer full inline; summarize only when forced.Dispatch ONE [omh-role:research-synthesist] task:
delegate_task(
goal="<self-contained: produce report per [omh-role:research-synthesist] template; topic={topic}; reference inlined plan + findings>",
context="<plan frontmatter + every findings file content, fully inlined>",
)
Retry context. If state.synthesis_attempts > 0, append the
prior verifier's REQUEST_CHANGES feedback (stored in
state.last_verifier_feedback) to the goal as:
Address these prior verifier findings:
{feedback}
Parent always overwrites .omh/research/{slug}-report.md with
the returned text. Frontmatter starts at status: draft. NO -v2
suffixing. Prior verdicts live only in state, not on disk.
C3 propagation. Parent does NOT edit the returned report. Any
(insufficient sources for this subtopic) strings remain verbatim.
Set state.phase = "verify", log REPORT_DRAFT, exit.
Cancel check: omh_state(action="cancel_check", mode="research", instance_id="{slug}").
Parent INLINES report + findings. Read {slug}-report.md AND
all {slug}-findings/*.md files. Concatenate BOTH into the
verifier delegation's context field. Verifier subagent has no
filesystem access.
Tools allowlist (A5). When dispatching, pass a tools allowlist
EXCLUDING write/edit/filesystem tools where Hermes supports
per-call tool scoping. If Hermes lacks per-call scoping, document
in Known Gaps and rely on the prose READ-ONLY contract in
role-research-verifier.md.
Dispatch ONE [omh-role:research-verifier] task. Parse the
returned VERDICT.
On VERDICT: PASS — STRICT ORDER (NEVER reverse):
{slug}-report.md with frontmatter status: confirmed (atomic; idempotent sentinel; THIS is the source-of-truth and must land FIRST).REPORT_CONFIRMED slug={slug} to the event log.omh_state(action="clear", mode="research", instance_id="{slug}").Phase 0 self-heals if a crash occurs between step 1 and step 3 (it detects the confirmed sentinel and clears the orphan state).
On VERDICT: FAIL with state.synthesis_attempts < 3:
state.synthesis_attempts.state.last_verifier_feedback.state.phase = "synthesize".VERIFY_FAIL slug={slug} and SYNTHESIS_RETRY attempt={N}.On VERDICT: FAIL with state.synthesis_attempts == 3:
state.phase = "blocked".VERIFY_FAIL slug={slug} and BLOCKED_RETRIES_EXHAUSTED slug={slug}.Append-only events to .omh/logs/research-{session_id}.log. Events are
decisions and phase transitions only — never findings content (matches
the omh-deep-interview convention).
Documented event vocabulary:
STARTED slug={slug}PLAN_WRITTEN slug={slug} subtopics=NBATCH_COMPLETE batch=N subtopics=[...]GAP_CHECK_COMPLETE gaps=NREPORT_DRAFTVERIFY_PASSVERIFY_FAILSYNTHESIS_RETRY attempt=NBLOCKED_RETRIES_EXHAUSTED slug={slug}REPORT_CONFIRMED slug={slug}REPORT_CONFIRMED_RECOVERED slug={slug}BLOCKED slug={slug}CANCELLEDDownstream skills (omh-deep-interview, omh-ralplan, omh-autopilot) detect a completed research session by:
.omh/research/{slug}-report.md with frontmatter `status: confirmed`
This file is the durable contract. State is ephemeral; the sentinel is the source of truth.
web_search or web_extract from the parent. All web
tool use happens inside delegated [omh-role:researcher] subagents.[omh-role:NAME] markers; bodies live
in plugins/omh/references/role-*.md.random4 suffix keeps
same-topic same-day re-runs from clobbering each other.[omh-role:research-verifier]
may be unavailable depending on Hermes install; READ-ONLY contract is
enforced by prose in role-research-verifier.md in that case. (A5)