Skip to main content
The dashboard shows a new experiment on the element, the previous one concluded with reason superseded, and decisions went back to initializing. A declaration-class field changed. Changing one of these starts a new experiment on purpose, because the variants were generated against the old value; the question is which one changed, and whether you meant it.

Which fields restart an experiment

control (its content), rewards, format, requirements, parameters and options.holdout. Nothing else does. See Declarations.

Two call sites disagree

The most common cause. One path sends the declaration with "window_seconds": 86400 and another with 604800; one includes a reward the other omits; one call site was updated and the other was not. Each alternation supersedes the experiment again. Staging and production count as two call sites: a test key and a live key configure the same experiment. Put the declaration in one place: a shared constant sent by every decide, or a declare step with serving code that sends only element and user_id.

The control was edited

The control’s content is identity: changing the copy of your current version, even a typo, is a new control and a new experiment. If the old copy must change, accept the restart; if you only wanted to guide future variants, that is instructions, which updates in place.

The format was inferred, then declared

On a first call without format, Curious infers one from the control. A later call that declares a format that differs from the inferred one (a max_characters, a different field type) supersedes the experiment. Declare the format from the first call when you have one in mind.

The holdout changed

options.holdout is fixed for an experiment’s life; a different value supersedes it. The other options (assignment, approval, minimum_effect_size) update in place.

Finding the change

The dashboard shows the chain of experiments on the element, each with the declaration it ran under. Compare the two declarations field by field; the differing field is the cause. An identical declaration is always a no-op, so once the call sites agree, the restarts stop.

When you meant it

A deliberate restart carries the declaration forward, with your changes applied, but not the variants: the successor generates them afresh against the new declaration. Change declaration-class fields in one deliberate step rather than one at a time, so you pay for one restart, not several.