gastownhall/beads · error
owner does not support %s operator
Error message
owner does not support %s operator
What it means
The `owner` field only supports Equals and NotEquals comparisons, matched case-insensitively via strings.EqualFold. Any other operator in an owner comparison reaches buildOwnerPredicate's default branch and returns this error.
Source
Thrown at internal/query/evaluator.go:812
case OpNotEquals:
if isNone {
return func(i *types.Issue) bool { return i.Assignee != "" }, nil
}
return func(i *types.Issue) bool { return !strings.EqualFold(i.Assignee, value) }, nil
default:
return nil, fmt.Errorf("assignee does not support %s operator", comp.Op.String())
}
}
func (e *Evaluator) buildOwnerPredicate(comp *ComparisonNode) (func(*types.Issue) bool, error) {
value := comp.Value
switch comp.Op {
case OpEquals:
return func(i *types.Issue) bool { return strings.EqualFold(i.Owner, value) }, nil
case OpNotEquals:
return func(i *types.Issue) bool { return !strings.EqualFold(i.Owner, value) }, nil
default:
return nil, fmt.Errorf("owner does not support %s operator", comp.Op.String())
}
}
func (e *Evaluator) buildLabelPredicate(comp *ComparisonNode) (func(*types.Issue) bool, error) {
value := comp.Value
isNone := value == "" || strings.ToLower(value) == "none" || strings.ToLower(value) == "null"
switch comp.Op {
case OpEquals:
if isNone {
return func(i *types.Issue) bool { return len(i.Labels) == 0 }, nil
}
return func(i *types.Issue) bool {
for _, l := range i.Labels {
if strings.EqualFold(l, value) {
return true
}
}
return falseView on GitHub (pinned to 71377f2769)
Solutions
- Use `owner = <name>` or `owner != <name>` with the full name (case-insensitive).
- For finding unowned issues, check whether the value "" matches: `owner = ""`.
- If fuzzy matching is needed, filter results in a script instead of the query language.
Example fix
// before bd list --query "owner ~ bob" // after bd list --query "owner = bob"
Defensive patterns
Strategy: validation
Validate before calling
// Go: owner supports only = and !=
if comp.Op != query.OpEquals && comp.Op != query.OpNotEquals {
return fmt.Errorf("owner supports only = and !=, got %s", comp.Op)
} Try / catch
// Go
pred, err := e.buildComparisonPredicate(node)
if err != nil {
return fmt.Errorf("owner filter invalid: %w", err)
} Prevention
- Use exact (case-insensitive) owner names with = or !=.
- Do not attempt contains/range operators on owner.
- Post-filter results in code when fuzzy matching is required.
When it happens
Trigger: A query filter like `owner ~ bob` or `owner >= carol` — comparison on owner with any operator other than = or !=.
Common situations: Attempting partial-name matching with a contains-style operator; copying label/text filters that support richer operators; assuming owner behaves like a sortable text field.
Related errors
- status does not support %s operator
- unexpected operator: %s
- type does not support %s operator
- assignee does not support %s operator
- label does not support %s operator
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/b8eec12758c16b57.
Report an issue: GitHub.