gastownhall/beads · error

created does not support %s operator

Error message

created does not support %s operator

What it means

The created field in filter mode supports only =, >, >=, <, and <= (mapping to CreatedAfter/CreatedBefore window bounds). Any other operator — typically != or IN — is rejected with this message that names the offending operator via comp.Op.String(). The value itself parsed fine; the operator is the problem.

Source

Thrown at internal/query/evaluator.go:354

	}
	switch comp.Op {
	case OpEquals:
		// For equals, set both before and after to bracket the day
		dayStart := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
		dayEnd := dayStart.Add(24 * time.Hour)
		filter.CreatedAfter = &dayStart
		filter.CreatedBefore = &dayEnd
	case OpGreater:
		filter.CreatedAfter = &t
	case OpGreaterEq:
		filter.CreatedAfter = &t
	case OpLess:
		filter.CreatedBefore = &t
	case OpLessEq:
		endOfDay := time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 999999999, t.Location())
		filter.CreatedBefore = &endOfDay
	default:
		return fmt.Errorf("created does not support %s operator", comp.Op.String())
	}
	return nil
}

func (e *Evaluator) applyUpdatedFilter(comp *ComparisonNode, filter *types.IssueFilter) error {
	t, err := e.parseTimeValue(comp)
	if err != nil {
		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:

View on GitHub (pinned to 71377f2769)

Solutions

  1. Express exclusion as a range: `created < X OR created > Y` around the unwanted point/day
  2. Use supported operators: `created > t`, `created >= t`, `created < t`, `created <= t`, `created = t`
  3. Use predicate mode if the desired operator is implemented in buildCreatedPredicate

Example fix

// before
bd list 'created != 2026-08-01'
// after
bd list 'created < 2026-08-01 OR created > 2026-08-02'
Defensive patterns

Strategy: validation

Validate before calling

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

Type guard

func createdOpSupported(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(), "created does not support") {
		// rewrite as a range using < and > around the excluded point
	}
}

Prevention

When it happens

Trigger: Queries like `created != 2026-01-01` or `created not in ...` produce a ComparisonNode whose Op falls into the switch's default branch of applyCreatedFilter.

Common situations: Trying to exclude a specific day (`created != date`) assuming negation is supported; grammar-generated queries using unsupported operators; users expecting SQL-like operator coverage.

Related errors


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