{"record":{"id":"af45b5083f3fa615","repo":"alibaba/open-code-review","slug":"max-tokens-must-be-a-non-negative-integer","errorCode":null,"errorMessage":"--max-tokens must be a non-negative integer","messagePattern":"--max-tokens must be a non-negative integer","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/opencodereview/shared.go","lineNumber":51,"sourceCode":"// LLM session: a validated template, the resolved repo path, review rules,\n// and a shared git subprocess limiter.\ntype commonContext struct {\n\tTemplate   *template.Template\n\tRepoDir    string\n\tResolver   rules.Resolver\n\tFileFilter *rules.FileFilter\n\tGitRunner  *gitcmd.Runner\n\t// IsGitRepo reports whether RepoDir is inside a git repository. Always\n\t// true when requireGit was set; may be false when scan accepts non-git\n\t// directories.\n\tIsGitRepo bool\n}\n\n// resolveMaxTokens applies the per-run CLI override, then the saved setting,\n// and finally the embedded task-template default.\nfunc resolveMaxTokens(templateDefault int, cfg *Config, cliOverride int) (int, error) {\n\tif cliOverride < 0 {\n\t\treturn 0, fmt.Errorf(\"--max-tokens must be a non-negative integer\")\n\t}\n\tif cliOverride > 0 {\n\t\treturn cliOverride, nil\n\t}\n\tif cfg == nil || cfg.MaxTokens == 0 {\n\t\treturn templateDefault, nil\n\t}\n\tif cfg.MaxTokens < 0 {\n\t\treturn 0, fmt.Errorf(\"invalid max_tokens in app config: must be a positive integer\")\n\t}\n\treturn cfg.MaxTokens, nil\n}\n\n// resolveEffort applies the standard precedence for the review effort preset:\n// CLI flag > saved app config > EffortDefault.\nfunc resolveEffort(cfg *Config, cliOverride string) (template.Effort, error) {\n\tif cliOverride != \"\" {\n\t\treturn template.ParseEffort(cliOverride)","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/alibaba/open-code-review/blob/5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f/cmd/opencodereview/shared.go#L33-L69","documentation":"resolveMaxTokens rejects a negative --max-tokens CLI override: 0 means 'use defaults' and positive values are taken literally, so any negative value is invalid input. Thrown before any config or template lookup.","triggerScenarios":"Passing a negative number, e.g. `ocr review --max-tokens -1` (often a shell arg-parsing accident like `--max-tokens -5000` intended as another flag's value).","commonSituations":"Typo or missing value between two flags so the next flag's negative number is consumed as the token limit; scripting that interpolates an unset variable as negative.","solutions":["Pass 0 to use the saved-config/template default instead of a negative number","Set a positive integer limit (e.g. --max-tokens 20000)","Check flag ordering so the negative value is not accidentally swallowed"],"exampleFix":"// before\nocr review --max-tokens -1\n// after\nocr review --max-tokens 0      # fall back to default\nocr review --max-tokens 20000  # explicit positive limit","handlingStrategy":"validation","validationCode":"// validate before invoking the CLI\nfunc validMaxTokens(n int) bool { return n >= 0 }\nif !validMaxTokens(flagMaxTokens) {\n    return errors.New(\"--max-tokens must be >= 0 (0 = use default)\")\n}","typeGuard":"func nonNegative(n int) bool { return n >= 0 }","tryCatchPattern":"limit, err := resolveMaxTokens(def, cfg, cli)\nif err != nil {\n    return fmt.Errorf(\"usage: %w (0 means default)\", err)\n}","preventionTips":["Use 0, not a negative number, to request defaults","Quote/interpolate shell variables carefully so flags don't consume each other's values","Add shell completion or flag validation in wrapper scripts"],"tags":["go","cli","validation","arguments"],"backgroundTag":"invalid-argument-value","analyzedSha":"5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f","analyzedAt":"2026-09-02T02:08:09.116Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}