What changed
Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.
Affects rules[].conditions[].clauses[].operator on flagship_Flag reachable from 5 operations.
New values: has, not_has.
can now return "has", "not_has"
Who is affected
Code that reads Cloudflare's flagship_Flag objects, used by 5 Cloudflare operations.
Before and after
| Where | Before | After |
|---|---|---|
| flagship_Flag.rules[].conditions[].clauses[].operator | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "in", "less_than", "less_than_or_equals", "not_equals", "not_in", "starts_with" | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "has", "in", "less_than", "less_than_or_equals", "not_equals", "not_has", "not_in", "starts_with" |
| flagship_FlagDefinitions.flags[key].rules[].conditions[].clauses[].operator | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "in", "less_than", "less_than_or_equals", "not_equals", "not_in", "starts_with" | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "has", "in", "less_than", "less_than_or_equals", "not_equals", "not_has", "not_in", "starts_with" |
| flagship_Flag.rules[].conditions[].operator | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "in", "less_than", "less_than_or_equals", "not_equals", "not_in", "starts_with" | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "has", "in", "less_than", "less_than_or_equals", "not_equals", "not_has", "not_in", "starts_with" |
| flagship_Flag.rules[].conditions[].clauses[].clauses[].operator | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "in", "less_than", "less_than_or_equals", "not_equals", "not_in", "starts_with" | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "has", "in", "less_than", "less_than_or_equals", "not_equals", "not_has", "not_in", "starts_with" |
| flagship_FlagDefinitions.flags[key].rules[].conditions[].operator | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "in", "less_than", "less_than_or_equals", "not_equals", "not_in", "starts_with" | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "has", "in", "less_than", "less_than_or_equals", "not_equals", "not_has", "not_in", "starts_with" |
| flagship_FlagDefinitions.flags[key].rules[].conditions[].clauses[].clauses[].operator | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "in", "less_than", "less_than_or_equals", "not_equals", "not_in", "starts_with" | "contains", "ends_with", "equals", "greater_than", "greater_than_or_equals", "has", "in", "less_than", "less_than_or_equals", "not_equals", "not_has", "not_in", "starts_with" |
Code that breaks
switch (response.rules[0].conditions[0].clauses[0].operator) {
// existing branches …
// no branch for "has"
// no branch for "not_has"
default:
throw new Error("unexpected operator");
}Based on Cloudflare’s published API specification. How severity is decided.