Experiments
A named channel attempt with a metric, a deadline and an optional stop rule. How due and decision work.
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 with an experiment item:
{
"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:
{ "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, for example memory_add with kind: "decision" and the experiment name as a tag.