# Experiments

> A named channel attempt with a metric, a deadline and an optional stop rule. How due and decision work.

URL: https://mcp-docs.opennomos.com/docs/growth-loop/experiments

An experiment is a question you ask of one channel: "do helpful Reddit replies lead to conversations within two weeks?" OpenNomos keeps the deadline and counts the metric. **You** decide what it means.

## Create

Through [`track`](https://mcp-docs.opennomos.com/docs/tools/growth/track.md) with an `experiment` item:

```json
{
  "type": "experiment",
  "experiment": {
    "name": "Reddit helpful replies",
    "hypothesis": "People asking for alternatives will talk if we help first",
    "channel": "reddit",
    "metric": "willing_to_talk",
    "target": 3,
    "days": 14,
    "stop_rule": { "metric": "willing_to_talk", "op": "<", "value": 2 },
    "stop_rule_text": "If fewer than 2 people agree to talk after 14 days, change channel"
  }
}
```

Give exactly one of `days` (1–365) or `deadline` (a future ISO time, `{"in_days": n}` or `{"at": "…"}`). `target`, `hypothesis`, `stop_rule` and `stop_rule_text` are optional.

## Metrics

| `metric` | Counts, within the experiment window |
| --- | --- |
| `tracked` | Opportunities created in this experiment |
| `contacted`, `replied`, `willing_to_talk`, `converted` | Distinct opportunities that moved into that stage while attached to the experiment |
| `actions` | Actions logged against the experiment |
| `clicks` | Human (non-bot) clicks on the experiment's short links |
| `outcome:<type>` | Outcomes of that type that are **not** `unknown` |

Attach opportunities and actions with `experiment_id` on `track` (opportunity) and `log_action`.

## Stop rules

`stop_rule` is mechanical: `{ metric, op, value }` with `op` one of `<`, `<=`, `>`, `>=`, `==`, and `metric` equal to the experiment's metric. `stop_rule_text` is free text that OpenNomos only shows back to you. It never concludes an experiment.

## Due and decision

An experiment becomes `due` when its deadline passes. This is computed whenever you read, and persisted at the next briefing with the metric **frozen at the deadline**. A due experiment appears in the briefing with `decision_needed: true`, `overdue_days`, and a `question` built from the evidence, for example:

> Stop rule not met (1, rule < 2). Keep going, scale or conclude? Record your decision with track.

If no actions were recorded in the window, the question adds: *the result may reflect nothing being done rather than the channel not working.*

Record the decision by updating the experiment with its `id`:

```json
{ "type": "experiment", "id": "exp_7Hn2LpWc0", "experiment": { "decision": "extend", "extend_days": 7, "note": "Only 3 replies seen; give it one more week" } }
```

| `decision` | Resulting status |
| --- | --- |
| `stop` | `stopped` |
| `scale` | `scaled` |
| `extend` (needs `extend_days`) | `extended`, deadline moves out |
| `keep` | `concluded` |

Nothing reminds you outside the briefing: a due experiment stays at the top of `experiments` until a decision is recorded, and after 14 days a `notices` entry of type `experiment_overdue` is added.

## Save the lesson separately

The decision field holds a short `note`. The *lesson* (what you learned, what to do differently) belongs in [memory](https://mcp-docs.opennomos.com/docs/growth-loop/memory-vs-opportunity.md), for example `memory_add` with `kind: "decision"` and the experiment name as a tag.
