# Founding Hypothesis

URL: /business/founding-hypothesis · Id: `page:business/founding-hypothesis`

> One sentence with five slots names the customer, the Problem, the approach, the switch and the edge, each graded by outside Evidence.

A [Startup](/business/nouns/startup) authors one record, the Founding Hypothesis: one sentence with five slots, each graded by outside [Evidence](/business/nouns/evidence). Everything the Startup says, sells and measures compiles from it.

## One sentence, five slots
The sentence has a fixed shape. Each slot is a child [Hypothesis](/business/nouns/hypothesis) with its own [Metric](/business/nouns/metric) and threshold, and each points at a record.

```text
If we help {customer}
solve {problem}
with {approach},
they choose it over {switch}
because {differentiation}.
```

| Slot | Sentence | Points at | Cheapest test | Holds when |
| --- | --- | --- | --- | --- |
| `customer` | If we help [ICP] | [ICP](/business/nouns/icp) | Interview | The customer slot names the ICP, and holds while a selector returns real Prospects who reply. |
| `problem` | solve [Problem] | [Problem](/business/nouns/problem) | Interview | The problem slot names the Problem the ICP pays to solve today, and what solving it costs them. |
| `approach` | with [Product Template] | [Product Template](/business/nouns/product-template) | Smoke page | The approach slot names the Product Template the Startup bets on, with one backup approach. |
| `switch` | they choose it over [Organization] | [Organization](/business/nouns/organization) | Pre-sale | The switch slot names the Organization the ICP hires today, and holds when they pay to leave it. |
| `differentiation` | because [Metric] | [Metric](/business/nouns/metric) | Fake door | The differentiation slot names the two axes on which the Startup wins, each measured by a Metric. |

[Agents](/business/nouns/agent) draft the sentence from a cell on the opportunity map. The [Founder](/agents/founding/founder) edits the draft and commits it, then sets one number beside it: the [Minimum Success Criteria](/business/nouns/minimum-success-criteria).

## Grades, not filled fields
Each slot shows the strongest grade among its outside Evidence. Behavior beats Commitment, and Opinion weighs the same as no Evidence at all: zero. A compliment moves no slot.

[Lifecycle](/business/nouns/lifecycle) gates read grades, never fields, so typing into a slot passes nothing.

| To enter | Slots at Commitment or Behavior, from outside people |
| --- | --- |
| [Building](/business/lifecycle/states/building) | customer, problem, switch |
| [Live](/business/lifecycle/states/live) | all five |

## Everything compiles from it
The sentence is the source. The [Story](/business/nouns/story), the [Offer](/business/nouns/offer) and its [Price](/business/nouns/price), the [Site](/business/nouns/site) copy, the [Personas](/business/nouns/persona) and the first [Plays](/business/nouns/play) are compiled from it, never written beside it.

Every output carries its lineage as `from: Hypothesis#<slot>@v<version>`. A headline traces back through the Story to the slot and to the Evidence behind it. An edit to an output is kept as an override that names its source.

## A pivot is a diff
An edit to the sentence is a [Change](/business/nouns/change). Its preview shows every output the edit recompiles before it merges. A merged Change adds a version, and every version stays on the record.

A [pivot](/business/lifecycle/pivots) is the diff between two versions, named for the slot that moved. It carries the Evidence that forced it.

## Write it
The sentence lives in `startup.ts` under `hypothesis`, one key per slot, each a phrase. The approach names its [Product Template](/business/nouns/product-template), and the differentiation names its two axes.

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

export default Startup({
  name: 'Platecost',
  domain: 'platecost.app',
  extends: 'solo-saas',
  hypothesis: {
    customer: 'Independent restaurants with one to three locations',
    problem: 'Food-cost drift from changing supplier prices',
    approach: 'A SaaS that recomputes plate costs from every invoice they photograph',
    switch: 'The spreadsheet and the bookkeeper',
    differentiation: 'Margins the same day, as a cost per plate',
  },
})
```

`npm create startups` takes the same object as `hypothesis` in its `--json` input. On a running Startup, each slot is its own Hypothesis under the root, `hypothesis_1`, and every [Interface](/business/nouns/interface) writes one with `Hypothesis.create`:

**API**

```bash
curl -X POST https://api.sb/platecost.app/hypotheses \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"problem","parent":"hypothesis_1","statement":"Food-cost drift from changing supplier prices"}'
```

**SDK**

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

const slot = await $.Hypothesis.create({
  kind: 'problem',
  parent: 'hypothesis_1',
  statement: 'Food-cost drift from changing supplier prices',
})
```

**CLI**

```bash
npx startup-builder do Hypothesis.create --json '{"kind":"problem","parent":"hypothesis_1","statement":"Food-cost drift from changing supplier prices"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Hypothesis.create({ kind: 'problem', parent: 'hypothesis_1', statement: 'Food-cost drift from changing supplier prices' })",
    "mode": "try"
  }
}
```

A slot starts at version 1 with the grade `None`. To edit a slot, change it in `startup.ts` and run `npx startup-builder dev`, which previews the Change and every output it recompiles.

To read the grades back, ask for the record:

```bash
npx startup-builder show /hypothesis --fields slot,grade,next
```

```text
platecost.app   Founding Hypothesis v1   state Idea

slot              grade        next
customer          Commitment   met
problem           Commitment   met
approach          None         Smoke page
switch            Commitment   met
differentiation   Opinion      Fake door

pass  Three slots at Commitment   building-slots   3 of 3
```

`next` names the cheapest rung on the [test ladder](/business/test-ladder) that lifts the slot to Commitment. The differentiation slot holds Opinion, so it counts zero and still blocks Live.

## Example
```text
platecost.app: three compiled outputs, each with its lineage

Reserve page headline  "Stop rebuilding the food-cost sheet every weekend."   from: Hypothesis#problem@v1
Price anchor           $79 a month against a $400 bookkeeper                    from: Hypothesis#switch@v1
Story one-liner        "Margins per plate, updated the morning an invoice lands." from: Hypothesis#differentiation@v1
```

## Next
- [Minimum Success Criteria](/business/minimum-success-criteria): the number beside the sentence.
- [Weekly test](/business/weekly-test): the weakest slot each week, and the one test that grades it.
- [Canvases](/business/canvases): the lean canvas, the Story and the job, rendered from the slots.