# Open Hypothesis: instructions for agents

Open Hypothesis answers a research question with hypotheses that pass a blind two-stage forecast of experimental confirmation. Four models propose 10 hypotheses each (GPT-6 Astra, Grok 4.5, Claude Opus 5.5, Gemini 4 Argon). The hypotheses are pooled, shuffled and renumbered H1, H2, ..., so no forecasting model sees who wrote which. GPT-6 Astra answers for every hypothesis whether an experiment will confirm it, and every hypothesis it answers "no" is discarded. Claude Sonnet 5.5, Gemini 4 Argon, Grok 4.5 answer the same question about the kept hypotheses; a hypothesis is selected when all three answer "yes". Each selected hypothesis is then compared with the published literature.

Page for people: https://eternalsearch.net/open-hypothesis. Protocol version: open-hypothesis-v2.

## 1. Start a run on our models

No key and no sign-in.

```http
POST https://eternalsearch.net/api/v1/open-hypothesis/runs
Content-Type: application/json

{"question": "How does remodelling of the bone-marrow niche affect the fitness of mutant clones in clonal haematopoiesis?",
 "background": "optional: what is already known, up to 8000 characters",
 "language": "en"}
```

Answer `202`:

```json
{"id": "<run id>", "status": "queued", "protocol": "open-hypothesis-v2",
 "url": "https://eternalsearch.net/open-hypothesis/<run id>",
 "poll": "https://eternalsearch.net/api/v1/open-hypothesis/runs/<run id>",
 "poll_interval_seconds": 15}
```

- `question`: 10-2000 characters, any language. `background`: optional, up to 8000 characters. `language`: `en` or `ru`; `ru` also prepares a Russian rendering of the hypotheses for the page.
- Limits: 3 runs per client address in 24 hours, 20 runs waiting at once, 60 runs per 24 hours for everyone.
- Errors: `400` with `question_too_short`, `question_too_long`, `background_too_long` or `invalid_body`; `429` with `client_limit` or `daily_cap`; `503` with `queue_full`. `Retry-After` gives the wait in seconds.

## 2. Read the result

```http
GET https://eternalsearch.net/api/v1/open-hypothesis/runs/<run id>
```

Poll every 15 seconds. A run takes about 10-30 minutes. `status` moves through `queued`, `generating`, `screening_stage1`, `screening_stage2`, `checking_novelty` to `completed`; a run that stops ends in `failed_at_generate`, `failed_at_stage1`, `failed_at_stage2` or `failed_at_novelty`, and keeps everything obtained before the stop.

What to read:

- `hypotheses[]`: every generated hypothesis with `label` (the blind number), `author_name`, `statement`, `mechanism`, `prediction`, `forecasts` (model id to `true`, `false` or `null`), `stage1` (`discarded`, `kept` or `no_answer`), `selected`, `delivered` and `literature`.
- `delivered: true`: selected by the forecast and not already reported or contradicted in the literature. These are the hypotheses to hand to your user.
- `selected: true` with `delivered: false`: the literature check found an article that already reports the claim or its opposite; `literature.evidence` quotes it.
- `literature.verdict`: `reported`, `contradicted`, `components_reported` (each part is known, the causal link itself is not stated), `not_reported`, or `unresolved` (the check did not finish; read it as no information).
- `counts`: generated, discarded, kept, selected, delivered. `steps`: the state of each of the four steps.
- `?lang=ru` returns the Russian rendering of a run started with `"language": "ru"` once it is ready (`translation.state`).

## 3. Apply the forecast protocol to your own hypotheses

The selection uses one short question per model and no other information about the hypotheses.

1. Write each hypothesis as one text: the statement, then ` Mechanism: ` and the mechanism, then ` Prediction: ` and the prediction.
2. Pool the hypotheses from every source, shuffle them and number them H1, H2, ... The forecasting models must not see who wrote a hypothesis.
3. Ask each forecasting model once, with every hypothesis in one request, web search and tools off, a JSON answer required. A reply that misses a hypothesis, repeats one or is not JSON is asked once more; a model with no usable reply gives no vote.
4. Stage 1: ask GPT-6 Astra about every hypothesis. Discard every hypothesis it answers `false`.
5. Stage 2: ask Claude Sonnet 5.5, Gemini 4 Argon, Grok 4.5 about the hypotheses that were kept. Select a hypothesis only when every one of them answers `true`. GPT-6 Astra is not asked again: its `true` from stage 1 stands.

System message:

```text
Return a JSON object.
```

User message (with a research background):

```text
For each hypothesis below, will it be confirmed experimentally?

BACKGROUND
<BACKGROUND>

RESEARCH QUESTION
<QUESTION>

HYPOTHESES
[H1] <HYPOTHESIS 1 TEXT>

[H2] <HYPOTHESIS 2 TEXT>

Return a JSON object with a "forecasts" array. For each hypothesis include its "id" and a boolean "confirmed".
```

Without a background, the BACKGROUND block is left out:

```text
For each hypothesis below, will it be confirmed experimentally?

RESEARCH QUESTION
<QUESTION>

HYPOTHESES
[H1] <HYPOTHESIS 1 TEXT>

[H2] <HYPOTHESIS 2 TEXT>

Return a JSON object with a "forecasts" array. For each hypothesis include its "id" and a boolean "confirmed".
```

Answer to parse: `{"forecasts": [{"id": "H1", "confirmed": true}, ...]}`, one boolean for every id.

For Grok models the benchmark appended this sentence to the system message and to the end of the user message, followed in the user message by the JSON reminder; without it Grok describes a plan instead of answering:

```text
You have no tools, no files and no internet access. Give your complete final answer in this single reply, in the requested format. Never describe what you are going to do; do it now. Your reply must start with { and be only the JSON object.
```

## 4. The generation request we send

Each generator receives this system message and user message once (the benchmark's single-request wording, with one added sentence asking for untested hypotheses):

```text
You are a research scientist in the biology of ageing. You propose scientific hypotheses that answer research questions. Answer with JSON only.
```

```text
TASK
Research question:
<QUESTION>

The goal is hypotheses that answer the research question: specific, testable causal claims.

Propose only hypotheses that, to your knowledge, have not yet been tested experimentally: do not restate a finding that the published literature has already established or refuted. Each hypothesis must be new as a specific causal claim, even when it builds on known mechanisms.

Propose ten hypotheses.

Return JSON {"hypotheses":[{"statement":"the hypothesis in 1-3 sentences","mechanism":"the proposed mechanism","prediction":"a result that would support it over the alternatives","domain_category":"short label of its mechanism class"}],"notes":""}
```

With a background, the TASK block starts with `Research background:` and the background text, then a blank line, before `Research question:`.

## 5. How the rule was measured

The rule was selected and tested in our hypothesis-generation benchmark on 50 articles on the biology of ageing published after the models' stated training cutoffs. For each article the models received its background and question; three models from other companies judged whether each hypothesis matched the article's finding. Of the Grok 4.5 hypotheses the rule selected, 74% (14 of 19) matched; for Claude Opus 5.5, 64% (14 of 22); for Gemini 4 Argon, 47% (9 of 19). Among randomly chosen hypotheses, 12-18% matched. The measured precision applies to this roster of forecasting models.

Benchmark article: https://eternalsearch.net/omega/benchmark/article
