{"record":{"id":"3bee9bf5604c7cab","repo":"gastownhall/beads","slug":"title-does-not-support-s-operator","errorCode":null,"errorMessage":"title does not support %s operator","messagePattern":"title does not support (.+?) operator","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/query/evaluator.go","lineNumber":861,"sourceCode":"\t\t}, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"label does not support %s operator\", comp.Op.String())\n\t}\n}\n\nfunc (e *Evaluator) buildTitlePredicate(comp *ComparisonNode) (func(*types.Issue) bool, error) {\n\tvalue := strings.ToLower(comp.Value)\n\tswitch comp.Op {\n\tcase OpEquals:\n\t\treturn func(i *types.Issue) bool {\n\t\t\treturn strings.Contains(strings.ToLower(i.Title), value)\n\t\t}, nil\n\tcase OpNotEquals:\n\t\treturn func(i *types.Issue) bool {\n\t\t\treturn !strings.Contains(strings.ToLower(i.Title), value)\n\t\t}, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"title does not support %s operator\", comp.Op.String())\n\t}\n}\n\nfunc (e *Evaluator) buildDescriptionPredicate(comp *ComparisonNode) (func(*types.Issue) bool, error) {\n\tvalue := comp.Value\n\tisNone := value == \"\" || strings.ToLower(value) == \"none\" || strings.ToLower(value) == \"null\"\n\tswitch comp.Op {\n\tcase OpEquals:\n\t\tif isNone {\n\t\t\treturn func(i *types.Issue) bool { return i.Description == \"\" }, nil\n\t\t}\n\t\treturn func(i *types.Issue) bool {\n\t\t\treturn strings.Contains(strings.ToLower(i.Description), strings.ToLower(value))\n\t\t}, nil\n\tcase OpNotEquals:\n\t\tif isNone {\n\t\t\treturn func(i *types.Issue) bool { return i.Description != \"\" }, nil\n\t\t}","sourceCodeStart":843,"sourceCodeEnd":879,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/query/evaluator.go#L843-L879","documentation":"Title comparisons support contains (via substring match on the lowercased title) and NotEquals (negated contains). Any other operator falls through to the default branch of buildTitlePredicate and returns this error. Title matching is substring-based, not exact.","triggerScenarios":"A query filter like `title = \"exact\"` if equality is not in the handled cases, or `title >= foo` — an operator outside the contains/not-equals set.","commonSituations":"Assuming exact-match semantics for titles; reusing field=value patterns that work elsewhere; users familiar with SQL's = on text columns.","solutions":["Use the contains operator (the one handled for title, typically the default/contains form) for substring search.","Use `!=` to exclude titles containing the text.","For exact-title lookup, prefer `bd show <id>` or filter results in a script."],"exampleFix":"// before\nbd list --query \"title >= fix\"\n// after\nbd list --query \"title contains fix\"","handlingStrategy":"validation","validationCode":"// Go: title supports contains and != only\nif !isContainsOp(comp.Op) && comp.Op != query.OpNotEquals {\n    return fmt.Errorf(\"title supports only contains and !=, got %s\", comp.Op)\n}","typeGuard":null,"tryCatchPattern":"// Go\npred, err := e.buildComparisonPredicate(node)\nif err != nil {\n    return fmt.Errorf(\"title filter invalid: %w\", err)\n}","preventionTips":["Treat title filters as substring search, not equality.","Match case-insensitively; the evaluator lowercases both sides.","Use bd show <id> for exact-title lookups instead of the query language."],"tags":["query-language","unsupported-operator","title-search"],"backgroundTag":"query-unsupported-operator","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}