gastownhall/beads · error

updated does not support %s operator

Error message

updated does not support %s operator

What it means

The updated field accepts only =, >, >=, <, and <= in filter mode (mapped to UpdatedAfter/UpdatedBefore). An operator outside that set — typically != — lands in the switch default and returns this error naming the unsupported operator. The time value was valid; only the operator is rejected.

Source

Thrown at internal/query/evaluator.go:380

		return fmt.Errorf("invalid updated time: %w", err)
	}
	switch comp.Op {
	case OpEquals:
		dayStart := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
		dayEnd := dayStart.Add(24 * time.Hour)
		filter.UpdatedAfter = &dayStart
		filter.UpdatedBefore = &dayEnd
	case OpGreater:
		filter.UpdatedAfter = &t
	case OpGreaterEq:
		filter.UpdatedAfter = &t
	case OpLess:
		filter.UpdatedBefore = &t
	case OpLessEq:
		endOfDay := time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 999999999, t.Location())
		filter.UpdatedBefore = &endOfDay
	default:
		return fmt.Errorf("updated does not support %s operator", comp.Op.String())
	}
	return nil
}

func (e *Evaluator) applyClosedFilter(comp *ComparisonNode, filter *types.IssueFilter) error {
	t, err := e.parseTimeValue(comp)
	if err != nil {
		return fmt.Errorf("invalid closed time: %w", err)
	}
	switch comp.Op {
	case OpGreater:
		filter.ClosedAfter = &t
	case OpGreaterEq:
		filter.ClosedAfter = &t
	case OpLess:
		filter.ClosedBefore = &t
	case OpLessEq:
		endOfDay := time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 999999999, t.Location())

View on GitHub (pinned to 71377f2769)

Solutions

  1. Rephrase negation as a disjunction of supported comparisons (e.g. `updated < X OR updated > Y`)
  2. Restrict to =, >, >=, <, <= when building updated filters
  3. Use predicate mode if the needed operator is supported by buildUpdatedPredicate

Example fix

// before
bd list 'updated != today'
// after
bd list 'updated < today OR updated > tomorrow'
Defensive patterns

Strategy: validation

Validate before calling

// Allow only supported updated operators
var allowed = map[Op]bool{OpEquals: true, OpGreater: true, OpGreaterEq: true, OpLess: true, OpLessEq: true}
if comp.Field == "updated" && !allowed[comp.Op] {
	return fmt.Errorf("updated does not support %s", comp.Op.String())
}

Type guard

func updatedOpSupported(op Op) bool {
	switch op {
	case OpEquals, OpGreater, OpGreaterEq, OpLess, OpLessEq:
		return true
	}
	return false
}

Try / catch

if err := eval.applyComparison(comp, filter); err != nil {
	if strings.Contains(err.Error(), "updated does not support") {
		// rewrite the negation as a range: updated < X OR updated > Y
	}
}

Prevention

When it happens

Trigger: Queries like `updated != 2026-08-01` or other non-comparison operators on updated reach the default branch of applyUpdatedFilter.

Common situations: Attempting to exclude a specific update date; generated queries from tools assuming full operator sets; users translating SQL WHERE clauses directly into bd query syntax.

Related errors


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