JuliusBrussee/caveman · error
stop experiment: %w
Error message
stop experiment: %w
What it means
The UPDATE that stops the experiment (sets stopped_at) failed in SQLite in StopExperiment, after open arms were already ended. Database-level failure; the experiment remains logically unstopped with closed arms.
Source
Thrown at proxy/internal/store/learn_experiment.go:155
if _, err := s.db.Exec(`INSERT INTO experiment_arms (experiment_id, arm, started_at)
VALUES (?, ?, ?)`, experiment.id, arm, now); err != nil {
return Experiment{}, fmt.Errorf("open arm %q: %w", arm, err)
}
return s.LoadExperiment(label)
}
func (s *Store) StopExperiment(label string) (Experiment, error) {
experiment, err := s.LoadExperiment(label)
if err != nil {
return Experiment{}, err
}
now := learnOutcomeClock().UTC().Format(time.RFC3339)
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)View on GitHub (pinned to 81536f57b3)
Solutions
- Check the SQLite database is writable and not locked
- Inspect the wrapped driver error for the root cause
- Retry StopExperiment; it is safe to call again
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at proxy/internal/store/learn_experiment.go:155 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/a58facaad22c1ff8.
Report an issue: GitHub.