conduktor.io ↗

Subject Compatibility Cannot Be NONE

Forbid spec.compatibility: NONE and require an explicit non-NONE mode.

Rationale

`NONE` lets any schema register over any predecessor, which guarantees a consumer break on the next deploy. Field-intel has multiple "I set it to NONE just to ship a hotfix on Friday" stories that became Saturday incidents. BACKWARD is the minimum sane default; FULL_TRANSITIVE is required for long-retention compacted topics.

Pattern

spec.compatibility in {BACKWARD, BACKWARD_TRANSITIVE, FORWARD, FORWARD_TRANSITIVE, FULL, FULL_TRANSITIVE}

Examples

compatibility: BACKWARD_TRANSITIVE
compatibility: FULL
compatibility: NONE
compatibility unset (falls back to global)

Parameters

NameDefaultDescription
allowed_modes ["BACKWARD","BACKWARD_TRANSITIVE","FORWARD","FORWARD_TRANSITIVE","FULL","FULL_TRANSITIVE"] Acceptable compatibility modes.

Implementation

Drop this YAML into Conduktor Console as a ResourcePolicy, then link it from an ApplicationInstance, Application, or KafkaCluster.

Conduktor ResourcePolicy
# Conduktor self-service ResourcePolicy
# spec.compatibility is optional — has(...) guard makes the rule fail closed.
---
apiVersion: self-serve/v1
kind: ResourcePolicy
metadata:
  name: subject-compatibility-not-none
spec:
  targetKind: Subject
  description: spec.compatibility must be set and not NONE
  rules:
    - condition: 'has(spec.compatibility) && spec.compatibility in ["BACKWARD", "BACKWARD_TRANSITIVE", "FORWARD", "FORWARD_TRANSITIVE", "FULL", "FULL_TRANSITIVE"]'
      errorMessage: "spec.compatibility must be explicitly set and not NONE — NONE allows arbitrary schema changes that break downstream consumers"

Related policies

Try Conduktor Console

Enforce policies like this across your team — central audit history, pre-commit guardrails, ApplicationInstance bindings. 5-min Docker install.

Get Started →