gastownhall/beads · error

%s only supports = operator

Error message

%s only supports = operator

What it means

Thrown by the shared boolean-field filter (used for `pinned`, `ephemeral`, etc.) when the field is compared with an operator other than `=`. Boolean fields only support equality against truthy/falsy literals.

Source

Thrown at internal/query/evaluator.go:463

	if strings.HasSuffix(comp.Value, "*") {
		filter.SpecIDPrefix = strings.TrimSuffix(comp.Value, "*")
	} else {
		filter.SpecIDPrefix = comp.Value
	}
	return nil
}

func (e *Evaluator) applyParentFilter(comp *ComparisonNode, filter *types.IssueFilter) error {
	if comp.Op != OpEquals {
		return fmt.Errorf("parent only supports = operator")
	}
	filter.ParentID = &comp.Value
	return nil
}

func (e *Evaluator) applyBoolFilter(comp *ComparisonNode, filter *types.IssueFilter, field string) error {
	if comp.Op != OpEquals {
		return fmt.Errorf("%s only supports = operator", field)
	}
	val := strings.ToLower(comp.Value)
	var boolVal bool
	switch val {
	case "true", "yes", "1":
		boolVal = true
	case "false", "no", "0":
		boolVal = false
	default:
		return fmt.Errorf("invalid boolean value for %s: %s", field, comp.Value)
	}

	switch field {
	case "pinned":
		filter.Pinned = &boolVal
	case "ephemeral":
		filter.Ephemeral = &boolVal
	case "template":

View on GitHub (pinned to 71377f2769)

Solutions

  1. Use `pinned = true` / `pinned = false` (or `ephemeral = ...`).
  2. Replace `field != false` with `field = true` and vice versa.
  3. Remember accepted boolean literals: true/false, yes/no, 1/0 (case-insensitive).

Example fix

// before
bd list 'pinned != false'
// after
bd list 'pinned = true'
Defensive patterns

Strategy: validation

Validate before calling

func validateBoolComparison(field, op string) error {
	if op != "=" {
		return fmt.Errorf("%s supports only =, got %q", field, op)
	}
	return nil
}

Prevention

When it happens

Trigger: Queries like `pinned != false`, `ephemeral > 0`, or `pinned ~ true` reaching applyBoolFilter.

Common situations: Writing `pinned != false` to mean "is pinned" instead of `pinned = true`; SQL-style boolean comparisons; copying filters between query languages.

Related errors


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