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 false

View on GitHub (pinned to 71377f2769)

Solutions

  1. Use `owner = <name>` or `owner != <name>` with the full name (case-insensitive).
  2. For finding unowned issues, check whether the value "" matches: `owner = ""`.
  3. 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

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


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/b8eec12758c16b57. Report an issue: GitHub.