{"record":{"id":"2812924960d4735b","repo":"JuliusBrussee/caveman","slug":"usage-caveman-proxy-trial-promote-optimizer-id","errorCode":null,"errorMessage":"usage: caveman-proxy trial promote <optimizer_id> --trial-id <id>","messagePattern":"usage: caveman-proxy trial promote <optimizer_id> --trial-id <id>","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/cmd/caveman-proxy/main.go","lineNumber":455,"sourceCode":"\t\t}\n\t\tprintJSON(map[string]any{\"trial_id\": trialID, \"report\": out, \"basis\": plan.Basis})\n\tcase \"export\":\n\t\ttrialID := requiredTrialID(logger, spend, args)\n\t\tplan, err := spend.BuildTrialPlan(trialID)\n\t\tif err != nil {\n\t\t\tfatalJSON(logger, err)\n\t\t}\n\t\toutDir := argFlag(args, \"--out\", filepath.Join(home, \"exports\", \"trial-\"+trialID))\n\t\tpaths, err := spend.ExportTrial(plan, outDir)\n\t\tif err != nil {\n\t\t\tfatalJSON(logger, err)\n\t\t}\n\t\tprintJSON(map[string]any{\"trial_id\": trialID, \"export\": paths})\n\tcase \"promote\":\n\t\ttrialID := requiredTrialID(logger, spend, args)\n\t\toptimizerID := firstPositional(args)\n\t\tif optimizerID == \"\" {\n\t\t\tfatalJSON(logger, fmt.Errorf(\"usage: caveman-proxy trial promote <optimizer_id> --trial-id <id>\"))\n\t\t}\n\t\tplan, err := spend.BuildTrialPlan(trialID)\n\t\tif err != nil {\n\t\t\tfatalJSON(logger, err)\n\t\t}\n\t\tpromoteMove(logger, home, trialID, optimizerID, plan)\n\tdefault:\n\t\tfatalJSON(logger, fmt.Errorf(\"unknown trial subcommand: %s\", sub))\n\t}\n}\n\nfunc runUsage(logger *slog.Logger, args []string) {\n\tif len(args) == 0 {\n\t\tfatalJSON(logger, fmt.Errorf(\"usage: caveman-proxy usage import|link|refresh|unlink <provider>\"))\n\t}\n\tsub := args[0]\n\targs = args[1:]\n\thome := mustHome(logger)","sourceCodeStart":437,"sourceCodeEnd":473,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/proxy/cmd/caveman-proxy/main.go#L437-L473","documentation":"The `caveman-proxy trial promote` subcommand requires an optimizer id as its first positional argument; none was found. fatalJSON logs the error as JSON and exits 1, so the process stops before BuildTrialPlan runs. The message doubles as inline usage text.","triggerScenarios":"Running `caveman-proxy trial promote --trial-id <id>` with no positional optimizer_id, or putting the optimizer id after a flag in a way firstPositional does not recognize (flags consumed first, positional missing).","commonSituations":"Copy-pasting a shortened command from docs/notes that omits the optimizer id; assuming --trial-id alone suffices; shell quoting that swallows the argument ($OPT empty due to unset variable).","solutions":["Supply the positional: caveman-proxy trial promote <optimizer_id> --trial-id <id>","Get valid ids first from the trial plan (export/show) so you promote one that exists","Quote shell variables and check they are non-empty: \"${OPT_ID:?optimizer id required}\""],"exampleFix":"# before\ncaveman-proxy trial promote --trial-id abc123\n\n# after\ncaveman-proxy trial export --trial-id abc123   # list candidate optimizer ids\ncaveman-proxy trial promote compress-prefix --trial-id abc123","handlingStrategy":"validation","validationCode":"if [ -z \"$OPT_ID\" ]; then echo \"optimizer id required\" >&2; exit 2; fi\ncaveman-proxy trial promote \"$OPT_ID\" --trial-id \"$TRIAL_ID\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Assert required positionals in wrapper scripts before invoking the CLI","Enumerate valid optimizer ids from trial export before promoting","Use shell parameter defaults with errors: ${OPT_ID:?missing optimizer id}"],"tags":["cli","usage-error","exit-1"],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}