Use when running or wiring OpenScientist for AI Gene Review gene-function hypotheses, especially blinded comparisons against local bioinformatics analyses.
Installs into .claude/skills of the current project.
Are you the author of Openscientist Hypothesis?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/ai4curation-openscientist-hypothesis)
---
name: openscientist-hypothesis
description: Use when running or wiring OpenScientist for AI Gene Review gene-function hypotheses, especially blinded comparisons against local bioinformatics analyses.
metadata:
short-description: AIGR OpenScientist hypothesis workflow
---
# OpenScientist Hypothesis Workflow
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.