{"record":{"id":"8824f62ca7759caf","repo":"gastownhall/beads","slug":"started-does-not-support-s-operator","errorCode":null,"errorMessage":"started does not support %s operator","messagePattern":"started does not support (.+?) operator","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/query/evaluator.go","lineNumber":422,"sourceCode":"}\n\nfunc (e *Evaluator) applyStartedFilter(comp *ComparisonNode, filter *types.IssueFilter) error {\n\tt, err := e.parseTimeValue(comp)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid started time: %w\", err)\n\t}\n\tswitch comp.Op {\n\tcase OpGreater:\n\t\tfilter.StartedAfter = &t\n\tcase OpGreaterEq:\n\t\tfilter.StartedAfter = &t\n\tcase OpLess:\n\t\tfilter.StartedBefore = &t\n\tcase OpLessEq:\n\t\tendOfDay := time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 999999999, t.Location())\n\t\tfilter.StartedBefore = &endOfDay\n\tdefault:\n\t\treturn fmt.Errorf(\"started does not support %s operator\", comp.Op.String())\n\t}\n\treturn nil\n}\n\nfunc (e *Evaluator) applyIDFilter(comp *ComparisonNode, filter *types.IssueFilter) error {\n\tif comp.Op != OpEquals {\n\t\treturn fmt.Errorf(\"id only supports = operator\")\n\t}\n\t// Check if it looks like a prefix (ends with *)\n\tif strings.HasSuffix(comp.Value, \"*\") {\n\t\tfilter.IDPrefix = strings.TrimSuffix(comp.Value, \"*\")\n\t} else {\n\t\tfilter.IDs = append(filter.IDs, comp.Value)\n\t}\n\treturn nil\n}\n\nfunc (e *Evaluator) applySpecFilter(comp *ComparisonNode, filter *types.IssueFilter) error {","sourceCodeStart":404,"sourceCodeEnd":440,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/query/evaluator.go#L404-L440","documentation":"Thrown when the `started` field is compared with an operator other than `>` or `>=` (and their less-than counterparts map to StartedBefore; the default rejects everything unsupported). Only time-range comparisons are meaningful for `started`, so other operators are rejected.","triggerScenarios":"Queries like `started = 2024-06-01` or `started != yesterday` — any ComparisonNode on \"started\" whose Op falls into the default branch of applyStartedFilter.","commonSituations":"Expecting equality on a timestamp instead of a range; copying `closed`-style `<=` queries onto `started` when only `>`/`>=` are intended/supported.","solutions":["Use `started > <date>` or `started >= <date>` (after) or `started < <date>` / `started <= <date>` (before).","Express 'started on date D' as a range: `started >= D and started < D+1day`.","Check documented operators for `started` before building programmatic queries."],"exampleFix":"// before\nbd list 'started = 2024-06-01'\n// after\nbd list 'started >= 2024-06-01 and started <= 2024-06-01'","handlingStrategy":"validation","validationCode":"func validateStartedOp(op string) error {\n\tswitch op {\n\tcase \">\", \">=\", \"<\", \"<=\":\n\t\treturn nil\n\tdefault:\n\t\treturn fmt.Errorf(\"started supports only time-range operators, got %q\", op)\n\t}\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use range operators (> >= < <=) for `started`, never equality.","Express 'started on day D' as a >= / <= range pair.","Centralize query construction so operators are constrained per field."],"tags":["query-language","filter","operator-unsupported"],"backgroundTag":"unsupported-query-operator","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}