ultra-research
$SKILL_DIR is this skill's directory. The Python helper is scripts/vault.py;
prompts are in prompts/. Read each prompt when you reach its stage.
When to use (routing)
Prefer plain claudex:deep-research by default. Use ultra-research only when: the
question is high-stakes (policy/financial/factual gravity); the user explicitly
asks for dual-model or cross-verified research; or a prior deep-research run on the
topic returned mixed/unreliable citation integrity.
Setup
- Disambiguate like deep-research: if the question is underspecified, ask 2–3 clarifying questions, then proceed; else state one interpretation and proceed. Never block mid-run after this point.
- Resolve paths and the run id:
VAULT="$(python3 "$SKILL_DIR/scripts/vault.py" vaultpath)" REFINED_QUESTION="$(cat <<'EOF'
Stage 1 — independent research (parallel)
- Codex (background): dispatch
Agent(subagent_type: codex:codex-rescue)with the text ofprompts/codex-research.md, placeholders filled, including--writeand the absolute target$RUNDIR/20-report-codex.md. Prefer background. - Claude (inline): run
claudex:deep-researchyourself on the same refined question. When it finishes, write its verified report to$RUNDIR/10-report-claude.mdwith the report frontmatter (author-model: claude,note-type: report,degraded: false,tags: [ultra-research, report]). - Join: poll for the Codex file until ready or the deadline. Resolve the
per-stage timeout via the helper (handles scalar or object
codexTimeoutMs):
If the post-loop# Stage-1 research default: 20 min (1,200,000 ms) unless config overrides it. DEADLINE=$(( $(date +%s%3N) + $(python3 "$SKILL_DIR/scripts/vault.py" timeout --stage research) )) until python3 "$SKILL_DIR/scripts/vault.py" ready "$RUNDIR/20-report-codex.md"; do [ "$(date +%s%3N)" -ge "$DEADLINE" ] && break sleep 10 done if ! python3 "$SKILL_DIR/scripts/vault.py" ready "$RUNDIR/20-report-codex.md"; then # Execute DEGRADED branch A. fireadycheck fails → DEGRADED branch A (below).
Stage 2 — adversarial cross-audit (parallel)
Each report is audited by the OTHER model; auditors are blind to each other.
- Codex audits Claude (background): dispatch
codex:codex-rescue--writewith theprompts/audit.mdcontract + the absolute path$RUNDIR/10-report-claude.md, writing$RUNDIR/30-audit-of-claude-by-codex.md(author-model: codex,audited-report-model: claude). - Claude audits Codex (inline
Task): dispatch aTask(general-purpose) subagent and explicitly instruct it to useWebFetchfor every cited URL. Give it theprompts/audit.mdcontract assembled inline and the path$RUNDIR/20-report-codex.md; it writes$RUNDIR/31-audit-of-codex-by-claude.md(author-model: claude,audited-report-model: codex). Joined by the subagent's return. - Join Codex audit: recompute the deadline from a fresh clock read and the
Stage-2 audit timeout (default 10 min):
If the post-loopDEADLINE=$(( $(date +%s%3N) + $(python3 "$SKILL_DIR/scripts/vault.py" timeout --stage audit) )) until python3 "$SKILL_DIR/scripts/vault.py" ready "$RUNDIR/30-audit-of-claude-by-codex.md"; do [ "$(date +%s%3N)" -ge "$DEADLINE" ] && break sleep 10 done if ! python3 "$SKILL_DIR/scripts/vault.py" ready "$RUNDIR/30-audit-of-claude-by-codex.md"; then # Execute DEGRADED branch B. fireadycheck fails → DEGRADED branch B.
Stage 3 — trust-weighted final synthesis
Dispatch codex:codex-rescue --write with prompts/final-synthesis.md, the four
absolute paths filled in. It writes $RUNDIR/90-final-report.md and prints a bullet
summary to stdout.
- Poll with a freshly recomputed Stage-3 synthesis timeout (default 10 min):
If the post-loopDEADLINE=$(( $(date +%s%3N) + $(python3 "$SKILL_DIR/scripts/vault.py" timeout --stage synthesis) )) until python3 "$SKILL_DIR/scripts/vault.py" ready "$RUNDIR/90-final-report.md"; do [ "$(date +%s%3N)" -ge "$DEADLINE" ] && break sleep 10 done if ! python3 "$SKILL_DIR/scripts/vault.py" ready "$RUNDIR/90-final-report.md"; then # Execute DEGRADED branch C. fireadycheck fails → DEGRADED branch C. - The file is canonical; the rescue stdout is display-only.
Index + present
- Assemble
$RUNDIR/00-index.mdfromprompts/index.md. Read audit verdicts for the status table with:python3 "$SKILL_DIR/scripts/vault.py" get "$RUNDIR/30-audit-of-claude-by-codex.md" trust-verdict python3 "$SKILL_DIR/scripts/vault.py" get "$RUNDIR/30-audit-of-claude-by-codex.md" trust-score python3 "$SKILL_DIR/scripts/vault.py" get "$RUNDIR/31-audit-of-codex-by-claude.md" trust-verdict python3 "$SKILL_DIR/scripts/vault.py" get "$RUNDIR/31-audit-of-codex-by-claude.md" trust-score - Present to the user: the bullet summary, the two trust-verdicts, and the vault
path
$RUNDIR.
Degraded branches (never hard-fail; always label)
Degraded notes get degraded: true in frontmatter AND a first-line banner:
> **⚠️ DEGRADED — single-model run; adversarial cross-audit merit absent.**
- A — no Codex report: do NOT fake adversarial merit. Base the final on Claude's
deep-research report (already deterministically verified). Optionally attach a
Claude self-audit ONLY if labeled
self-audit — NOT adversarial; equivalent to plain deep-research integrity. Write a degraded90-final-report.mdand a degraded00-index.md. - B — Codex audit failed: Claude audits Codex's report normally (adversarial in
that direction) AND self-audits its own report under the explicit
self-audit — NOT adversarial; equivalent to plain deep-research integritylabel; proceed to Stage 3; mark the run partially degraded. - C — Codex synthesis failed: Claude writes
90-final-report.mdfrom the four inputs using the Stage-3 merge algorithm; set bothauthor-model: claudeandsynthesized-by: claude. Not full DEGRADED (all four inputs exist) — just note the synthesis fallback.
Hard rules
- Each side's own deterministic citation verification still runs inside its own report; the cross-audit is an ADDITIONAL adversarial layer.
- An auditor never audits its own report (except the explicitly-labelled degraded self-audit, which never counts as adversarial merit).
- The
90-final-report.mdfile — not any stdout — is the canonical final report. - Always deliver a labeled result; never stop to ask permission mid-run.