{"record":{"id":"9c1b55cb6adaf58f","repo":"gastownhall/beads","slug":"description-only-supports-operator-use-desc-con","errorCode":null,"errorMessage":"description only supports = operator (use desc contains pattern)","messagePattern":"description only supports = operator \\(use desc contains pattern\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/query/evaluator.go","lineNumber":314,"sourceCode":"\tif comp.Value == \"\" || strings.ToLower(comp.Value) == \"none\" || strings.ToLower(comp.Value) == \"null\" {\n\t\tfilter.NoLabels = true\n\t} else {\n\t\tfilter.Labels = append(filter.Labels, comp.Value)\n\t}\n\treturn nil\n}\n\nfunc (e *Evaluator) applyTitleFilter(comp *ComparisonNode, filter *types.IssueFilter) error {\n\tif comp.Op != OpEquals {\n\t\treturn fmt.Errorf(\"title only supports = operator (use title contains pattern)\")\n\t}\n\tfilter.TitleContains = comp.Value\n\treturn nil\n}\n\nfunc (e *Evaluator) applyDescriptionFilter(comp *ComparisonNode, filter *types.IssueFilter) error {\n\tif comp.Op != OpEquals {\n\t\treturn fmt.Errorf(\"description only supports = operator (use desc contains pattern)\")\n\t}\n\tif comp.Value == \"\" || strings.ToLower(comp.Value) == \"none\" || strings.ToLower(comp.Value) == \"null\" {\n\t\tfilter.EmptyDescription = true\n\t} else {\n\t\tfilter.DescriptionContains = comp.Value\n\t}\n\treturn nil\n}\n\nfunc (e *Evaluator) applyNotesFilter(comp *ComparisonNode, filter *types.IssueFilter) error {\n\tif comp.Op != OpEquals {\n\t\treturn fmt.Errorf(\"notes only supports = operator\")\n\t}\n\tfilter.NotesContains = comp.Value\n\treturn nil\n}\n\nfunc (e *Evaluator) applyCreatedFilter(comp *ComparisonNode, filter *types.IssueFilter) error {","sourceCodeStart":296,"sourceCodeEnd":332,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/query/evaluator.go#L296-L332","documentation":"applyDescriptionFilter accepts only = on the description field. `description = none` (or empty/null) maps to filter.EmptyDescription, finding issues with no description; any other value maps to DescriptionContains (substring match). All other operators are rejected. The message hints that contains-style searches use the desc field in predicate mode.","triggerScenarios":"Queries like `description contains error`, `desc != foo`, or `description ~ x` produce a ComparisonNode with Op != OpEquals and fail in filter mode.","commonSituations":"Searching issue bodies with contains syntax; trying to find empty descriptions with `description = \"\"` (works) versus `description != \"\"` (fails); queries adapted from other trackers' full-text search.","solutions":["Use `description = <substring>` in filter mode (behaves as contains)","Use `description = none` to find issues lacking a description","Use the `desc` field with contains in predicate mode for richer matching"],"exampleFix":"// before\nbd list 'description contains panic'\n// after\nbd list 'description = panic'","handlingStrategy":"validation","validationCode":"// Validate description comparisons before evaluation\nif comp.Field == \"description\" && comp.Op != OpEquals {\n\treturn fmt.Errorf(\"use 'description = <substring>' or 'description = none'\")\n}","typeGuard":"func descOpSupported(op Op) bool { return op == OpEquals }","tryCatchPattern":"if err := eval.applyComparison(comp, filter); err != nil {\n\tif strings.Contains(err.Error(), \"description only supports = operator\") {\n\t\t// rewrite to description = <value> or desc contains in predicate mode\n\t}\n}","preventionTips":["Use `description = none` to find issues lacking a description","Use `description = <substring>` for contains-style search in filter mode","Route richer full-text matching to predicate mode's desc field"],"tags":["query","filter","description","unsupported-operator"],"backgroundTag":"unsupported-query-operator","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}