JuliusBrussee/caveman · error

no experiment named %q

Error message

no experiment named %q

What it means

Guard in LoadExperiment: no experiments row matches the given label after trimming whitespace. It fires for unknown or misspelled labels and propagates through StartExperiment, SwitchExperimentArm, StopExperiment, ListExperiments, and BuildExperimentReport, which all load by label.

Source

Thrown at proxy/internal/store/learn_experiment.go:168

	if _, err := s.db.Exec(`UPDATE experiment_arms SET ended_at = ?
		WHERE experiment_id = ? AND ended_at IS NULL`, now, experiment.id); err != nil {
		return Experiment{}, fmt.Errorf("close open arm: %w", err)
	}
	if _, err := s.db.Exec(`UPDATE experiments SET stopped_at = ? WHERE id = ?`, now, experiment.id); err != nil {
		return Experiment{}, fmt.Errorf("stop experiment: %w", err)
	}
	return s.LoadExperiment(label)
}

func (s *Store) LoadExperiment(label string) (Experiment, error) {
	label = strings.TrimSpace(label)
	row := s.db.QueryRow(`SELECT id, label, COALESCE(sink_id,''), COALESCE(fix_kind,''),
		COALESCE(note,''), created_at, COALESCE(stopped_at,'') FROM experiments WHERE label = ?`, label)
	var experiment Experiment
	if err := row.Scan(&experiment.id, &experiment.Label, &experiment.SinkID, &experiment.FixKind,
		&experiment.Note, &experiment.CreatedAt, &experiment.StoppedAt); err != nil {
		if err == sql.ErrNoRows {
			return Experiment{}, fmt.Errorf("no experiment named %q", label)
		}
		return Experiment{}, err
	}
	rows, err := s.db.Query(`SELECT arm, started_at, COALESCE(ended_at,'')
		FROM experiment_arms WHERE experiment_id = ? ORDER BY started_at, id`, experiment.id)
	if err != nil {
		return Experiment{}, err
	}
	defer rows.Close()
	for rows.Next() {
		var arm ExperimentArm
		if err := rows.Scan(&arm.Arm, &arm.StartedAt, &arm.EndedAt); err != nil {
			return Experiment{}, err
		}
		experiment.Arms = append(experiment.Arms, arm)
	}
	return experiment, rows.Err()
}

View on GitHub (pinned to 81536f57b3)

Solutions

  1. Verify the experiment label spelling (leading/trailing whitespace is trimmed before lookup)
  2. Run ListExperiments to see existing labels
  3. Create the experiment first with StartExperiment before loading, switching, or stopping it
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at proxy/internal/store/learn_experiment.go:168 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of JuliusBrussee/caveman@81536f57b3 (2026-08-27). Data as JSON: /api/errors/df4d9c461f735231. Report an issue: GitHub.