{"record":{"id":"4d0aca343168b80a","repo":"gastownhall/beads","slug":"spec-does-not-support-s-operator","errorCode":null,"errorMessage":"spec does not support %s operator","messagePattern":"spec does not support (.+?) operator","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/query/evaluator.go","lineNumber":1020,"sourceCode":"\thasWildcard := strings.HasSuffix(value, \"*\")\n\tif hasWildcard {\n\t\tprefix := strings.TrimSuffix(value, \"*\")\n\t\tswitch comp.Op {\n\t\tcase OpEquals:\n\t\t\treturn func(i *types.Issue) bool { return strings.HasPrefix(i.SpecID, prefix) }, nil\n\t\tcase OpNotEquals:\n\t\t\treturn func(i *types.Issue) bool { return !strings.HasPrefix(i.SpecID, prefix) }, nil\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"spec with wildcard only supports = and != operators\")\n\t\t}\n\t}\n\tswitch comp.Op {\n\tcase OpEquals:\n\t\treturn func(i *types.Issue) bool { return i.SpecID == value }, nil\n\tcase OpNotEquals:\n\t\treturn func(i *types.Issue) bool { return i.SpecID != value }, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"spec does not support %s operator\", comp.Op.String())\n\t}\n}\n\nfunc (e *Evaluator) buildBoolPredicate(comp *ComparisonNode, getter func(*types.Issue) bool) (func(*types.Issue) bool, error) {\n\tval := strings.ToLower(comp.Value)\n\tvar boolVal bool\n\tswitch val {\n\tcase \"true\", \"yes\", \"1\":\n\t\tboolVal = true\n\tcase \"false\", \"no\", \"0\":\n\t\tboolVal = false\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"invalid boolean value: %s\", comp.Value)\n\t}\n\n\tswitch comp.Op {\n\tcase OpEquals:\n\t\treturn func(i *types.Issue) bool { return getter(i) == boolVal }, nil","sourceCodeStart":1002,"sourceCodeEnd":1038,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/query/evaluator.go#L1002-L1038","documentation":"The spec field only supports = and != operators. buildSpecPredicate rejects a non-wildcard spec value used with any ordering or other operator, because spec ids are identity strings, not ordered values, in this query language.","triggerScenarios":"Queries such as `spec > bd-100` or `spec !=` variants with unsupported operators like contains — any spec comparison whose operator is not = or !=.","commonSituations":"Users expecting lexicographic spec ranges; query templates shared between numeric and string fields; porting queries from Jira/Lucene-style syntax that allows range operators on keys.","solutions":["Use spec = <id> or spec != <id> exactly.","Use a trailing wildcard with = for prefix family matching: spec = auth-*.","OR together multiple exact spec clauses for a set of specs.","Update query-generation code to emit only equality operators for spec fields."],"exampleFix":"// before\nbd list --query \"spec > bd-100\"\n// after\nbd list --query \"spec = bd-100\"","handlingStrategy":"validation","validationCode":"func checkSpecOperator(op Operator) error {\n\tif op != OpEquals && op != OpNotEquals {\n\t\treturn fmt.Errorf(\"spec supports only = and !=, got %s\", op)\n\t}\n\treturn nil\n}","typeGuard":"func isSpecEqualityQuery(op Operator) bool { return op == OpEquals || op == OpNotEquals }","tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"spec does not support\") {\n\treturn fmt.Errorf(\"rewrite spec clause with = or !=: %w\", err)\n}","preventionTips":["Never use range operators on spec fields","Use = / != with prefix wildcards for spec families","Port queries from other trackers with operator mapping rules","Add unit tests for query templates covering the spec field"],"tags":["query","operators","bd-cli"],"backgroundTag":"unsupported-operator-for-field","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}