{"record":{"id":"09ff56bc318593dd","repo":"gastownhall/beads","slug":"assignee-does-not-support-s-operator","errorCode":null,"errorMessage":"assignee does not support %s operator","messagePattern":"assignee does not support (.+?) operator","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/query/evaluator.go","lineNumber":800,"sourceCode":"\t}\n}\n\nfunc (e *Evaluator) buildAssigneePredicate(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.Assignee == \"\" }, nil\n\t\t}\n\t\treturn func(i *types.Issue) bool { return strings.EqualFold(i.Assignee, value) }, nil\n\tcase OpNotEquals:\n\t\tif isNone {\n\t\t\treturn func(i *types.Issue) bool { return i.Assignee != \"\" }, nil\n\t\t}\n\t\treturn func(i *types.Issue) bool { return !strings.EqualFold(i.Assignee, value) }, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"assignee does not support %s operator\", comp.Op.String())\n\t}\n}\n\nfunc (e *Evaluator) buildOwnerPredicate(comp *ComparisonNode) (func(*types.Issue) bool, error) {\n\tvalue := comp.Value\n\tswitch comp.Op {\n\tcase OpEquals:\n\t\treturn func(i *types.Issue) bool { return strings.EqualFold(i.Owner, value) }, nil\n\tcase OpNotEquals:\n\t\treturn func(i *types.Issue) bool { return !strings.EqualFold(i.Owner, value) }, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"owner does not support %s operator\", comp.Op.String())\n\t}\n}\n\nfunc (e *Evaluator) buildLabelPredicate(comp *ComparisonNode) (func(*types.Issue) bool, error) {\n\tvalue := comp.Value\n\tisNone := value == \"\" || strings.ToLower(value) == \"none\" || strings.ToLower(value) == \"null\"","sourceCodeStart":782,"sourceCodeEnd":818,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/query/evaluator.go#L782-L818","documentation":"The `assignee` field only supports Equals and NotEquals. buildAssigneePredicate handles empty/none/null semantics specially (matching unassigned issues), but any other operator falls to the default branch and returns this error.","triggerScenarios":"A query filter like `assignee ~ alice` or `assignee > bob` — comparison on assignee with any operator besides = and !=. Note `assignee = none` and `assignee != none` are valid for unassigned/assigned.","commonSituations":"Trying substring/contains matching on assignee names; assuming ordering over usernames; forgetting that partial-name matching is not supported and the full (case-insensitive) name is required.","solutions":["Use the exact name with = or != : `assignee = alice`.","To find unassigned issues, use `assignee = none` (empty, \"none\", or \"null\" all work).","If unsure of the exact name, list issues and inspect the assignee field first."],"exampleFix":"// before\nbd list --query \"assignee ~ ali\"\n// after\nbd list --query \"assignee = alice\"","handlingStrategy":"validation","validationCode":"// Go: assignee supports only = and != (incl. none)\nif comp.Op != query.OpEquals && comp.Op != query.OpNotEquals {\n    return fmt.Errorf(\"assignee supports only = and !=, got %s\", comp.Op)\n}","typeGuard":null,"tryCatchPattern":"// Go\npred, err := e.buildComparisonPredicate(node)\nif err != nil {\n    return fmt.Errorf(\"assignee filter invalid: %w\", err)\n}","preventionTips":["Use full assignee names with = or != (matching is case-insensitive but not substring).","Use the none/null/empty sentinel for unassigned issues.","Normalize usernames before embedding them in queries."],"tags":["query-language","unsupported-operator","assignee"],"backgroundTag":"query-unsupported-operator","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}