$schema: https://json-schema.org/draft/2020-12/schema $id: https://info-tech-canon.local/schemas/emission-cadence.schema.yaml title: InfoTechCanon EmissionCadenceDeclaration 0.1 description: Generic source-authored event emission cadence declaration. type: object required: - schema_version - declaration_id - source - sources properties: schema_version: const: "0.1" declaration_id: $ref: "#/$defs/non_empty_string" source: $ref: "#/$defs/non_empty_string" stream_id: $ref: "#/$defs/non_empty_string" sources: type: array minItems: 1 items: $ref: "#/$defs/cadence_entry" extensions: $ref: "#/$defs/extensions" additionalProperties: false $defs: non_empty_string: type: string minLength: 1 duration: type: string pattern: "^(?:P(?=\\d|T\\d)(?:\\d+D)?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+S)?)?|[1-9][0-9]*(?:s|m|h|d))$" extensions: type: object minProperties: 1 propertyNames: pattern: "^[a-z][a-z0-9.-]*$" additionalProperties: type: object heartbeat: type: object required: - event_class - assertion - missing properties: event_class: $ref: "#/$defs/non_empty_string" interval: $ref: "#/$defs/duration" interval_seconds: type: integer minimum: 1 assertion: $ref: "#/$defs/non_empty_string" missing: $ref: "#/$defs/non_empty_string" extensions: $ref: "#/$defs/extensions" oneOf: - required: [interval] not: required: [interval_seconds] - required: [interval_seconds] not: required: [interval] additionalProperties: false reconciliation: type: object required: - compare_local - compare_observed - divergence properties: compare_local: $ref: "#/$defs/non_empty_string" compare_observed: $ref: "#/$defs/non_empty_string" divergence: $ref: "#/$defs/non_empty_string" undrained_local: $ref: "#/$defs/non_empty_string" extensions: $ref: "#/$defs/extensions" additionalProperties: false cadence_entry: type: object required: - source_id - event_class - form properties: source_id: $ref: "#/$defs/non_empty_string" source_system: $ref: "#/$defs/non_empty_string" event_class: $ref: "#/$defs/non_empty_string" form: enum: - expected-rate - heartbeat-or-reconciliation window: $ref: "#/$defs/duration" window_seconds: type: integer minimum: 1 expected_min: type: integer minimum: 0 drop_below: $ref: "#/$defs/non_empty_string" heartbeat: $ref: "#/$defs/heartbeat" reconciliation: $ref: "#/$defs/reconciliation" extensions: $ref: "#/$defs/extensions" allOf: - if: properties: form: const: expected-rate required: [form] then: required: - expected_min - drop_below oneOf: - required: [window] not: anyOf: - required: [window_seconds] - required: [heartbeat] - required: [reconciliation] - required: [window_seconds] not: anyOf: - required: [window] - required: [heartbeat] - required: [reconciliation] - if: properties: form: const: heartbeat-or-reconciliation required: [form] then: anyOf: - required: [heartbeat] - required: [reconciliation] not: anyOf: - required: [window] - required: [window_seconds] - required: [expected_min] - required: [drop_below] additionalProperties: false