{"record":{"id":"a58facaad22c1ff8","repo":"JuliusBrussee/caveman","slug":"stop-experiment-w","errorCode":null,"errorMessage":"stop experiment: %w","messagePattern":"stop experiment: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/internal/store/learn_experiment.go","lineNumber":155,"sourceCode":"\tif _, err := s.db.Exec(`INSERT INTO experiment_arms (experiment_id, arm, started_at)\n\t\tVALUES (?, ?, ?)`, experiment.id, arm, now); err != nil {\n\t\treturn Experiment{}, fmt.Errorf(\"open arm %q: %w\", arm, err)\n\t}\n\treturn s.LoadExperiment(label)\n}\n\nfunc (s *Store) StopExperiment(label string) (Experiment, error) {\n\texperiment, err := s.LoadExperiment(label)\n\tif err != nil {\n\t\treturn Experiment{}, err\n\t}\n\tnow := learnOutcomeClock().UTC().Format(time.RFC3339)\n\tif _, err := s.db.Exec(`UPDATE experiment_arms SET ended_at = ?\n\t\tWHERE experiment_id = ? AND ended_at IS NULL`, now, experiment.id); err != nil {\n\t\treturn Experiment{}, fmt.Errorf(\"close open arm: %w\", err)\n\t}\n\tif _, err := s.db.Exec(`UPDATE experiments SET stopped_at = ? WHERE id = ?`, now, experiment.id); err != nil {\n\t\treturn Experiment{}, fmt.Errorf(\"stop experiment: %w\", err)\n\t}\n\treturn s.LoadExperiment(label)\n}\n\nfunc (s *Store) LoadExperiment(label string) (Experiment, error) {\n\tlabel = strings.TrimSpace(label)\n\trow := s.db.QueryRow(`SELECT id, label, COALESCE(sink_id,''), COALESCE(fix_kind,''),\n\t\tCOALESCE(note,''), created_at, COALESCE(stopped_at,'') FROM experiments WHERE label = ?`, label)\n\tvar experiment Experiment\n\tif err := row.Scan(&experiment.id, &experiment.Label, &experiment.SinkID, &experiment.FixKind,\n\t\t&experiment.Note, &experiment.CreatedAt, &experiment.StoppedAt); err != nil {\n\t\tif err == sql.ErrNoRows {\n\t\t\treturn Experiment{}, fmt.Errorf(\"no experiment named %q\", label)\n\t\t}\n\t\treturn Experiment{}, err\n\t}\n\trows, err := s.db.Query(`SELECT arm, started_at, COALESCE(ended_at,'')\n\t\tFROM experiment_arms WHERE experiment_id = ? ORDER BY started_at, id`, experiment.id)","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/81536f57b3303b7de7f5bc5b564cc344f9112d68/proxy/internal/store/learn_experiment.go#L137-L173","documentation":"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.","triggerScenarios":"Thrown at proxy/internal/store/learn_experiment.go:155 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","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"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"81536f57b3303b7de7f5bc5b564cc344f9112d68","analyzedAt":"2026-08-27T02:25:50.681Z","contentChangedAt":"2026-08-27T02:25:50.681Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}