{"record":{"id":"43138f1f786f7e69","repo":"JuliusBrussee/caveman","slug":"unknown-trial-subcommand-s","errorCode":null,"errorMessage":"unknown trial subcommand: %s","messagePattern":"unknown trial subcommand: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/cmd/caveman-proxy/main.go","lineNumber":463,"sourceCode":"\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)\n\tspend := mustStore(logger, home)\n\tdefer spend.Close()\n\tprovider := firstPositional(args)\n\tswitch sub {\n\tcase \"import\":\n\t\tif provider == \"\" {\n\t\t\tfatalJSON(logger, fmt.Errorf(\"usage: caveman-proxy usage import codex|claude\"))\n\t\t}","sourceCodeStart":445,"sourceCodeEnd":481,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/proxy/cmd/caveman-proxy/main.go#L445-L481","documentation":"The `trial` command dispatch received a first subcommand token that matches no known case (export, promote). fatalJSON logs 'unknown trial subcommand: <sub>' and the process exits 1 before any store work happens.","triggerScenarios":"Running e.g. `caveman-proxy trial list`, `trial show`, or a typo like `trial expor`. The switch on sub has only \"export\" and \"promote\" arms.","commonSituations":"Assuming subcommands that exist in other tool families (list/show/delete); tab-completion or muscle-memory typos; scripts written against a newer/older binary with a different subcommand set.","solutions":["Check spelling: valid subcommands are export and promote","Run caveman-proxy trial (no args) or --help to see the accepted set for your binary version","Pin script subcommands to the documented set of the binary version you ship"],"exampleFix":"# before\ncaveman-proxy trial show --trial-id abc123\n\n# after\ncaveman-proxy trial export --trial-id abc123","handlingStrategy":"validation","validationCode":"case \"$1\" in export|promote) exec caveman-proxy trial \"$@\";; *) echo \"unknown trial subcommand: $1\" >&2; exit 2;; esac","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check the binary's help output for the accepted subcommand set","Pin CLI versions in scripts so the verb set cannot drift","Prefer tab-completion or named scripts over retyping subcommands"],"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"}