{"record":{"id":"d63e40dfbc7acf02","repo":"JuliusBrussee/caveman","slug":"usage-caveman-proxy-learn-apply-sink-id-dry","errorCode":null,"errorMessage":"usage: caveman-proxy learn apply <sink_id> [--dry-run]","messagePattern":"usage: caveman-proxy learn apply <sink_id> \\[--dry-run\\]","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/cmd/caveman-proxy/main.go","lineNumber":729,"sourceCode":"\t\tsidecar, err := spend.WriteLearnSidecars(home, plan, time.Now(), \"\")\n\t\tif err != nil {\n\t\t\tfatalJSON(logger, err)\n\t\t}\n\t\tif hasArg(args, \"--json\") {\n\t\t\tprintJSON(plan)\n\t\t\treturn\n\t\t}\n\t\tprintJSON(map[string]any{\"report\": out, \"sidecar\": sidecar, \"cave_score\": plan.CaveScore.Score, \"basis\": plan.Basis, \"sinks\": len(plan.Sinks)})\n\tcase \"savings\":\n\t\tsavings, err := spend.BuildLearnSavings(cwd, sources, since)\n\t\tif err != nil {\n\t\t\tfatalJSON(logger, err)\n\t\t}\n\t\tprintJSON(savings)\n\tcase \"apply\":\n\t\tsinkID := firstPositional(args)\n\t\tif sinkID == \"\" {\n\t\t\tfatalJSON(logger, fmt.Errorf(\"usage: caveman-proxy learn apply <sink_id> [--dry-run]\"))\n\t\t}\n\t\tplan, err := spend.BuildLearnPlan(cwd, sources, since)\n\t\tif err != nil {\n\t\t\tfatalJSON(logger, err)\n\t\t}\n\t\tapplyLearnSink(logger, home, sinkID, hasArg(args, \"--dry-run\"), plan)\n\tcase \"applied\":\n\t\tsinkID := firstPositional(args)\n\t\tif sinkID == \"\" {\n\t\t\tfatalJSON(logger, fmt.Errorf(\"usage: caveman-proxy learn applied <sink_id> [--fix-kind <k>] [--note <s>]\"))\n\t\t}\n\t\tplan, err := spend.BuildLearnPlanFilteredWithRetro(cwd, sources, since, store.RetroOptions{}, repoFilter)\n\t\tif err != nil {\n\t\t\tfatalJSON(logger, err)\n\t\t}\n\t\trecorded, err := spend.RecordAppliedFix(plan, sinkID, argFlag(args, \"--fix-kind\", \"\"), argFlag(args, \"--note\", \"\"))\n\t\tif err != nil {\n\t\t\tfatalJSON(logger, err)","sourceCodeStart":711,"sourceCodeEnd":747,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/proxy/cmd/caveman-proxy/main.go#L711-L747","documentation":"Thrown by runLearn's `apply` branch when no positional sink id is given: `caveman-proxy learn apply <sink_id> [--dry-run]`. The apply path builds a learn plan and materializes a candidate edit for the named sink, so it cannot proceed without an id.","triggerScenarios":"`caveman-proxy learn apply`, or `learn apply --dry-run` where `--dry-run` is a flag, not the positional, so firstPositional(args) still returns empty.","commonSituations":"Running apply without first inspecting `learn scan`/`learn report` output to obtain a sink_id; assuming flags alone are enough; pasting only `--dry-run` from docs and forgetting the id.","solutions":["Run `caveman-proxy learn scan` (or `learn report --json`) and copy a sink_id from plan.sinks.","Invoke: `caveman-proxy learn apply <sink_id> --dry-run` first to preview the candidate without writing.","Remember the id is a bare positional, not a --sink-id flag."],"exampleFix":"// before\ncaveman-proxy learn apply --dry-run\n// after\ncaveman-proxy learn apply context-overload-7f3a --dry-run","handlingStrategy":"validation","validationCode":"// shell\nif [ -z \"$SINK_ID\" ]; then echo \"learn apply requires a positional sink_id\" >&2; exit 2; fi\ncaveman-proxy learn apply \"$SINK_ID\" --dry-run","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Obtain sink_id from learn scan/report output before applying.","The id is a bare positional; --dry-run is a flag, not a substitute for it.","Preview with --dry-run first."],"tags":["cli","missing-argument","learn"],"backgroundTag":"missing-cli-argument","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}