mono.experiment) with run_defaults, a reusable model set-up (model_config), and a cohort (cohort) all exist.experiment.run_defaults (model set-up, nudge, and whether to keep candidates). The experimenter picks the target group, adjusts anything, optionally names the run and attaches context files, then clicks Launch.experiment_run) is written with state = running, started_at = now(), launched_by set to the experimenter, and foreign keys to the nudge, model set-up, and cohort it uses (nudge_id, model_config_id, cohort_id). Those definitions, and the parent experiment, are held immutable while the run references them (RESTRICT), so later edits to the study or the model set-up can never change what this run used. Enrolled enrollees get run_enrollment rows.run_defaults, cohort_member, experiment_run writes experiment_run, run_enrollment| If… | Then… |
|---|---|
Someone in the chosen group is enrolled in another run that is running or paused | The launch is refused with an overlap warning. End or wait for that run, or pick a non-overlapping group. |
run_defaults names a model set-up that has since been deleted | The form asks for one. The default was never a foreign key, so nothing else is affected. |
| A context file is still extracting or embedding, or has failed | It is not attached to the run; only ready documents are. |
| The name is left blank | One is generated (study, group, model set-up, date-time) and frozen. |
experiment_run exists with state = running and foreign keys to its nudge, model set-up, and cohort, and one run_enrollment row per enrolled enrollee.Launching is the moment a reusable study becomes one concrete, running thing: this group of people, this model set-up, this nudge, right now.
The form arrives already filled in from the study's defaults, so most launches are just “check and go.” The one thing that can stop you is the overlap rule. If any of those people are already inside another live study, ChatMaestro refuses, because their answers would be shaped by two conditions at once.
When it does go, the run is pinned to the exact definitions it uses — the study, the nudge, the model set-up, and the group. Those are locked for as long as the run refers to them. That is what makes the results trustworthy months later: you cannot rewrite the study or delete a model set-up out from under a run, so it always knows exactly what it used.
run_enrollment × experiment_run.state; the condition is fixed by the RESTRICT rules on the run's foreign keys, no copy needed. What happens next to the run is the state machine in Run a nudge-comparison series.