Driftwatch

Cloudflare / Cloudflare API /

Breakingdirection flip: their tools call this safe

operator can now return "has", "not_has"

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

WhereBeforeAfter
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.