OpenScientist Hypothesis Workflow

SkillDev tools

Use when running or wiring OpenScientist for AI Gene Review gene-function hypotheses, especially blinded comparisons against local bioinformatics analyses.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the OpenScientist Hypothesis Workflow skill

What this skill tells your AI

The instructions your AI receives, as published by ai4curation/ai-gene-review in .claude/skills/openscientist-hypothesis/SKILL.md and read by ahel’s review.

Use this skill for AIGR work that runs, stages, or maintains OpenScientist hypothesis jobs for gene function review.

Core Rules

  • Treat OpenScientist as an independent bioinformatics scientist exploring a hypothesis: gene G has function F.
  • For existing annotations, prefer the neutral function-assignment mode: --as-function-hypothesis.
  • Do not feed existing local *-bioinformatics/RESULTS.md analyses into OpenScientist prompts. Those are holdout evidence for post-run comparison.
  • It is acceptable to pass bounded non-holdout review context, especially the selected term, original evidence reference, and a small number of relevant literature/deep-research references.
  • Avoid sending every function for genes with large reviews; select the specific hypothesis being tested.

Running Jobs

  • Use the just recipes, not raw deep-research-client, for AIGR hypothesis jobs. The justfile carries project defaults such as OpenScientist iteration count.
  • Be patient with OpenScientist. Jobs may run quietly for a long time before the local report is written.
  • Do not interrupt a real OpenScientist run merely because the local wrapper is silent or the child process is sleeping.
  • Check completed and running jobs at https://www.openscientist.io/jobs before deciding a job is stuck.
  • One-iteration OpenScientist runs are smoke tests only. Real hypothesis jobs should use the project default of at least 3 iterations unless the user explicitly asks otherwise.

Timeouts

  • Give analyses ample time. Real 3-iteration runs commonly take ~50-70 minutes, and structural / fold-discovery jobs can run longer; they are cancelled mid-analysis if the timeout is too short (observed: a job cancelled at the upstream 3600s default after producing nothing).
  • The just recipes now inject the maximum OpenScientist job timeout (--param timeout=7200, i.e. 2h) alongside --param max_iterations=3, and the wrapper's subprocess wall (--timeout-seconds, default 8100s) is kept above the job timeout so the child process is not killed first. If you ever bypass just and call the script directly, pass both: e.g. -- --param max_iterations=3 --param timeout=7200 plus --timeout-seconds 8100. The two timeouts are independent — raising one without the other still cancels the run.
  • 7200s is the API ceiling: OpenScientistParams.timeout is validated le=7200, so a larger value fails fast with a pydantic less_than_equal error and writes nothing. Do not exceed it.
  • Do not lower these to "save time"; a too-short timeout wastes the whole run.
  • When a job still hits the 7200s ceiling (common for human proteins asked a multi-faceted question), the fix is scope, not time: re-run with a single decisive analysis in the hypothesis (e.g. "Foldseek fold assignment" alone, not fold + disorder + motif + targeting) and/or --param max_iterations=2. Observed: C18orf21 7200s timeout -> 2708s when narrowed to Foldseek-only; HSPA12A/DNAJC28 likewise completed once narrowed. The paralog of a job that did finish (e.g. HSPA12B at 5208s) will usually finish on a plain retry — variance, not a hard limit.
  • Scoping each hypothesis to one computable question up front (rather than a broad "characterize this gene") both avoids timeouts and gives cleaner, more decisive provenance.

Failure Modes

  • A job can exit 0 yet write no report. Always confirm openscientist.md (and the openscientist_artifacts/ dir) actually exist before treating a run as done; an empty hypothesis directory means it failed.
  • Two distinct failure signatures seen, both leaving an empty output dir:
    • detail=... timed out after Ns ... has been cancelled -> raise the timeout (see above) and re-run.
    • detail=... Request ID: req_... -> a transient OpenScientist-internal LLM error (their server-side agent call failed; the id is for their debugging). Re-run; if the same gene fails this way repeatedly, treat it as a persistent upstream issue, move on, and report it rather than retrying indefinitely.
  • Remove the empty GENE-hypotheses/<slug>/ directory before re-running so a failed attempt does not masquerade as a completed one.

After Completion

  • Verify the generated report does not include withheld local bioinformatics paths or RESULTS.md content.
  • Compare the OpenScientist conclusion against the held-out local bioinformatics result after the run.
  • Keep operational lessons in skills or agent instructions, not in user-facing project pages.

Wiring Verdicts Into Reviews

  • A refuted proposal must be deleted, not set to REMOVE. Validation enforces that annotations absent from GOA carry action: NEW (they are AI proposals, identifiable by having no original_reference_id). If a run refutes such a proposal, delete the annotation block and any core_functions entry built on it, and record the refutation in the description + an OpenScientist file: reference. action: REMOVE is only for real GOA annotations and will fail validation on a not-in-GOA term ("Found N annotations not in GOA").
  • Gate findings that depend on uncacheable references. When a run's conclusion rests on very recent papers not in publications/ (so their supporting_text cannot be verbatim-verified) and that you cannot otherwise confirm, record it as a clearly-labelled lead — keep the conservative existing annotation, note "not yet verified / PMIDs not cached", and cite the OpenScientist file: report — rather than asserting a new annotation. Verify, don't trust. (Example: C18orf21 -> RMP24 / RNase MRP, left as a lead pending primary-literature caching.)
  • Don't overstate disagreements. Before wiring "the run overturns the prior review", check the primary data: the two analyses often agree on the facts (e.g. residues present) and differ only on interpretation (e.g. a PROSITE signature failure). Wire genuine standoffs as UNDECIDED with both lines of evidence and the decisive experiment, and do not import the run's secondary claims (e.g. a named degenerate paralog) unless corroborated by repo data.
  • Verbatim supporting_text gotchas: plain (unquoted) YAML scalars cannot contain ": " — single-quote any quote containing a colon-space (e.g. "Foldseek: zero ..."). The pre-edit hook catches these.

Job Hygiene

  • Background jobs are killed on container restart; the harness reports which. Check the GENE-hypotheses/<slug>/ dir — if empty, clean it and re-launch.
  • Check whether the API key is already set before assuming it is not: printenv OPENSCIENTIST_API_KEY (it is exported in some environments, so the just recipes work directly). Only if it is absent, pass OPENSCIENTIST_API_KEY inline when calling the script directly, and wire it into the environment/setup config for reproducible just runs.

Signals

GitHub stars
24
Forks
4
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
openscientist-hypothesis
Source
github.com/ai4curation/ai-gene-review