# Hypothesis

URL: /business/nouns/hypothesis · Id: `noun:hypothesis`

> A Hypothesis is a belief about a Startup stated so it can be proved wrong, with the Metric and threshold that settle it.

A Hypothesis is a belief about a [Startup](/business/nouns/startup) stated so it can be proved wrong, with the [Metric](/business/nouns/metric) and threshold that settle it. [Experiments](/business/nouns/experiment) test it, and [Evidence](/business/nouns/evidence) grades it.

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `statement` | `text` | Yes | The belief, in one sentence. |
| `kind` | `string` | Yes | One of `founding`, the five slots (`customer`, `problem`, `approach`, `switch`, `differentiation`), or `loop`. |
| `parent` | [Hypothesis](/business/nouns/hypothesis) | No | The Founding Hypothesis a slot Hypothesis belongs to. |
| `verdict` | `string` | Yes | One of `Open`, `Testing`, `Supported`, or `Refuted`. |
| `metric` | [Metric](/business/nouns/metric) | No | The Metric that settles it. |
| `threshold` | `string` | No | The Metric value that settles it. |
| `grade` | `string` | No | Computed: the strongest grade of its outside Evidence, `None` without any. |
| `version` | `integer` | Yes | Each merged Change adds one; outputs cite it in their lineage. |

## Object
```json
{
  "$id": "https://api.sb/tutorloop.com/hypotheses/hypothesis_1",
  "$type": "Hypothesis",
  "statement": "Matches high school students with math tutors.",
  "kind": "founding",
  "parent": "hypothesis_1",
  "verdict": "Open",
  "metric": "metric_1",
  "threshold": "Example threshold",
  "grade": "Example grade",
  "version": 1
}
```

## Relationships
- <a id="rel-evidence"></a>A Hypothesis **has** many pieces of [Evidence](/business/nouns/evidence): [Evidence](/business/nouns/evidence) supports or refutes Hypotheses; the strongest outside Evidence sets each Hypothesis grade. `evidence`, inverse [`bearsOn`](/business/nouns/evidence#rel-bears-on).
- <a id="rel-slot-of"></a>A Hypothesis **is a slot of** one [Hypothesis](/business/nouns/hypothesis): the five slot Hypotheses of a Founding Hypothesis, each with a [Metric](/business/nouns/metric) and a threshold. `slotOf`, inverse `slots`.
- <a id="rel-slots"></a>A Hypothesis’s **slots** are many [Hypotheses](/business/nouns/hypothesis): the five slot Hypotheses of a Founding Hypothesis, each with a [Metric](/business/nouns/metric) and a threshold. `slots`, inverse `slotOf`.
- <a id="rel-stated-by"></a>A Hypothesis **is stated by** one [Startup](/business/nouns/startup): a [Startup](/business/nouns/startup) states Hypotheses about itself, the Founding Hypothesis first, each settled by a [Metric](/business/nouns/metric) and a threshold. `statedBy`, inverse [`states`](/business/nouns/startup#rel-states).
- <a id="rel-stories"></a>A Hypothesis **has** many [Stories](/business/nouns/story): the Founding Hypothesis whose slots the [Story](/business/nouns/story) compiles from; a pivot recompiles it. `stories`, inverse [`compiledFrom`](/business/nouns/story#rel-compiled-from).
- <a id="rel-tested-by"></a>A Hypothesis **is tested by** many [Experiments](/business/nouns/experiment): each [Experiment](/business/nouns/experiment) settles one Hypothesis; many Experiments test one Hypothesis in turn. `testedBy`, inverse [`tests`](/business/nouns/experiment#rel-tests).
- <a id="rel-tested-by-opening"></a>A Hypothesis **is tested by opening** one [Opening](/business/nouns/opening): a hire into an [Opening](/business/nouns/opening) must prove its Hypothesis. `testedByOpening`, inverse [`tests`](/business/nouns/opening#rel-tests).

## Lifecycle

| State | Meaning | Moves to |
| --- | --- | --- |
| `open` (first) | Stated with its Metric and threshold, and bound to no Experiment. | `testing` by [Hypothesis.test](/business/nouns/hypothesis/test); `dropped` by [Hypothesis.drop](/business/nouns/hypothesis/drop) |
| `testing` | An Experiment that decides it is running. | `supported` on [`Experiment.concluded`](/business/events/Experiment.concluded) when the Experiment’s Metric met this Hypothesis’s threshold; `refuted` on [`Experiment.concluded`](/business/events/Experiment.concluded) when the Experiment’s Metric missed this Hypothesis’s threshold; `dropped` by [Hypothesis.drop](/business/nouns/hypothesis/drop) |
| `supported` | Its Experiment met the threshold; its outside Evidence grades how far that holds. | `testing` by [Hypothesis.test](/business/nouns/hypothesis/test); `dropped` by [Hypothesis.drop](/business/nouns/hypothesis/drop) |
| `refuted` | Its Experiment missed the threshold; a merged Change can restate it and test it again. | `testing` by [Hypothesis.test](/business/nouns/hypothesis/test); `dropped` by [Hypothesis.drop](/business/nouns/hypothesis/drop) |
| `dropped` | Retired from active work and kept on record with its Evidence. | None: it ends here. |

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| [Hypothesis.drop](/business/nouns/hypothesis/drop) | Drop retires a Hypothesis from active work and keeps it, with its Evidence, on record. | [Strategist](/agents/founding/strategist) | [`Hypothesis.dropped`](/business/events/Hypothesis.dropped) | None. |
| [Hypothesis.test](/business/nouns/hypothesis/test) | Test binds a Hypothesis to the Experiment that decides it and moves the Hypothesis to testing. | [Strategist](/agents/founding/strategist) | [`Hypothesis.tested`](/business/events/Hypothesis.tested) | None. |
| <a id="create"></a>[Hypothesis.create](/business/nouns/hypothesis/create) | Creates a Hypothesis. Inherited from [Noun](/business/nouns/noun). | None. | `Hypothesis.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Hypothesis.get](/business/nouns/hypothesis/get) | Returns one Hypothesis by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Hypothesis.list](/business/nouns/hypothesis/list) | Returns Hypotheses, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |

A Hypothesis is kept forever and never edited: it has no `update` or `delete`.

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Hypothesis.create` | Yes | Yes | Yes | No |
| `Hypothesis.get` | Yes | Yes | Yes | Yes |
| `Hypothesis.list` | Yes | Yes | Yes | Yes |
| `Hypothesis.drop` | Yes | Yes | Yes | No |
| `Hypothesis.test` | Yes | Yes | Yes | No |

## Call it

**Ask**

```text
Test the latest hypothesis with an experiment.
```

**API**

```bash
curl -X POST https://api.sb/tutorloop.com/hypotheses/hypothesis_1/test \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"experiment":"experiment_1"}'
```

```json
{
  "api": "https://api.sb/tutorloop.com",
  "hypothesis": {
    "$id": "https://api.sb/tutorloop.com/hypotheses/hypothesis_1",
    "$type": "Hypothesis",
    "statement": "Matches high school students with math tutors.",
    "kind": "founding",
    "verdict": "Open",
    "version": 1
  },
  "action": {
    "$id": "https://api.sb/tutorloop.com/actions/action_1",
    "operation": "Hypothesis.test",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/tutorloop.com/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const hypothesis = await $.Hypothesis.test({ hypothesis: 'hypothesis_1', experiment: 'experiment_1' })
```

**CLI**

```bash
npx startup-builder do Hypothesis.test --json '{"hypothesis":"hypothesis_1","experiment":"experiment_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Hypothesis.test({ hypothesis: 'hypothesis_1', experiment: 'experiment_1' })"
  }
}
```

## Example
"Dental offices pay $99 a month to halve no-shows" is a Hypothesis with `metric` paid offices. Twelve paid offices within 30 days of the reservation link going out set `verdict: Supported`; fewer than four set `Refuted`.