{
  "description": "Auto-generated derived type for SnapshotScheduleSpec via `CustomResource`",
  "properties": {
    "spec": {
      "additionalProperties": false,
      "description": "Cron + `policyRef`. One source of `Snapshot` CRs; pausing it doesn't affect\nin-flight or completed runs. ADR §3.5.",
      "properties": {
        "failedJobsHistoryLimit": {
          "description": "Bounds *failed* `Snapshot` CRs from this schedule. Successful retention is\nGFS-driven on `SnapshotPolicy.spec.retention` — there is deliberately NO\n`successfulJobsHistoryLimit` (ADR-0003 §4.4, ADR-0001 §4.4).",
          "format": "uint32",
          "minimum": 0,
          "nullable": true,
          "type": [
            "integer",
            "null"
          ]
        },
        "policyRef": {
          "additionalProperties": false,
          "description": "The single `SnapshotPolicy` (recipe) this schedule invokes; resolved in the\nschedule's own namespace. ADR §3.5 separates recipe from schedule. **Mutually\nexclusive** with `policySelector` — exactly one is required (webhook-enforced,\nADR-0005 §10). Optional at the type level so `policySelector` can be used instead.",
          "nullable": true,
          "properties": {
            "name": {
              "description": "Name of the referenced `SnapshotPolicy`.",
              "type": "string"
            },
            "namespace": {
              "description": "Namespace of the `SnapshotPolicy`; absent = same namespace as the referrer.",
              "nullable": true,
              "type": [
                "string",
                "null"
              ]
            }
          },
          "required": [
            "name"
          ],
          "type": [
            "object",
            "null"
          ]
        },
        "policySelector": {
          "additionalProperties": false,
          "description": "Fan-out form (ADR-0005 §10): a label selector over `SnapshotPolicy` objects in\nthe schedule's namespace. Each matching policy gets a `Snapshot` per firing\n(\"back up everything tagged `tier=critical` nightly\" in one object). **Mutually\nexclusive** with `policyRef`. Mirrors the `pvcSelector` pattern.",
          "nullable": true,
          "properties": {
            "matchExpressions": {
              "description": "matchExpressions is a list of label selector requirements. The requirements are ANDed.",
              "items": {
                "additionalProperties": false,
                "description": "A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.",
                "properties": {
                  "key": {
                    "description": "key is the label key that the selector applies to.",
                    "type": "string"
                  },
                  "operator": {
                    "description": "operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.",
                    "type": "string"
                  },
                  "values": {
                    "description": "values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.",
                    "items": {
                      "type": "string"
                    },
                    "type": [
                      "array",
                      "null"
                    ]
                  }
                },
                "required": [
                  "key",
                  "operator"
                ],
                "type": "object"
              },
              "type": [
                "array",
                "null"
              ]
            },
            "matchLabels": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.",
              "type": [
                "object",
                "null"
              ]
            }
          },
          "type": [
            "object",
            "null"
          ]
        },
        "schedule": {
          "additionalProperties": false,
          "description": "Cron, jitter, timezone, and concurrency for the firing cadence. ADR §3.5.",
          "properties": {
            "concurrencyPolicy": {
              "default": "Forbid",
              "description": "How to handle a firing while a prior run is still in flight. ADR §4.1.\n\nCarries a real OpenAPI `default: Forbid` (ADR-0005 §1) — unconditional, so it\nmaterializes into the stored object / `kubectl explain`.",
              "enum": [
                "Forbid",
                "Allow",
                "Replace"
              ],
              "type": [
                "string",
                "null"
              ]
            },
            "cron": {
              "description": "Cron expression with Jenkins-style `H` substitution. ADR §4.1 (G4).",
              "type": "string"
            },
            "jitter": {
              "description": "Deterministic jitter (Go-style duration), derived from `(scheduleUID, slot)`. ADR §4.1.",
              "nullable": true,
              "type": [
                "string",
                "null"
              ]
            },
            "runOnCreate": {
              "default": false,
              "description": "GitOps-friendly default: do NOT fire immediately on create. ADR §4.1 (G3).\n\nCarries a real OpenAPI `default: false` (ADR-0005 §1) so it materializes into\nthe stored object / `kubectl explain` and GitOps stops diff-thrashing. NOT\n`skip_serializing_if`-elided, so the materialized value round-trips.",
              "type": [
                "boolean",
                "null"
              ]
            },
            "startingDeadlineSeconds": {
              "description": "If a slot is missed by more than this many seconds (e.g. operator was\ndown), skip it instead of firing late. ADR §4.1.",
              "format": "int64",
              "nullable": true,
              "type": [
                "integer",
                "null"
              ]
            },
            "suspend": {
              "description": "Skip future firings while true. ADR §5.9.",
              "type": [
                "boolean",
                "null"
              ]
            },
            "timezone": {
              "description": "IANA timezone the cron is evaluated in (e.g. `America/Los_Angeles`).\nAbsent means the controller's configured default. ADR §4.1.",
              "nullable": true,
              "type": [
                "string",
                "null"
              ]
            }
          },
          "required": [
            "cron"
          ],
          "type": "object"
        }
      },
      "required": [
        "schedule"
      ],
      "type": "object",
      "x-kubernetes-validations": [
        {
          "message": "exactly one of policyRef or policySelector",
          "rule": "[has(self.policyRef), has(self.policySelector)].filter(x, x).size() == 1"
        }
      ]
    },
    "status": {
      "additionalProperties": false,
      "description": "Observed state of a `SnapshotSchedule`: pinned firing slots and failure run. ADR §3.5.",
      "nullable": true,
      "properties": {
        "conditions": {
          "description": "Standard Kubernetes conditions surfacing schedule health. ADR §5 status conventions.",
          "items": {
            "additionalProperties": false,
            "description": "Condition contains details for one aspect of the current state of this API Resource.",
            "properties": {
              "lastTransitionTime": {
                "description": "lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.",
                "format": "date-time",
                "type": "string"
              },
              "message": {
                "description": "message is a human readable message indicating details about the transition. This may be an empty string.",
                "type": "string"
              },
              "observedGeneration": {
                "description": "observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.",
                "format": "int64",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "reason": {
                "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.",
                "type": "string"
              },
              "status": {
                "description": "status of the condition, one of True, False, Unknown.",
                "type": "string"
              },
              "type": {
                "description": "type of condition in CamelCase or in foo.example.com/CamelCase.",
                "type": "string"
              }
            },
            "required": [
              "lastTransitionTime",
              "message",
              "reason",
              "status",
              "type"
            ],
            "type": "object"
          },
          "type": [
            "array",
            "null"
          ]
        },
        "consecutiveFailures": {
          "description": "Count of back-to-back failed runs; resets on success. Drives alerting.",
          "format": "int64",
          "nullable": true,
          "type": [
            "integer",
            "null"
          ]
        },
        "lastSchedule": {
          "additionalProperties": false,
          "description": "Most recent firing (cron + jitter, pinned). ADR §3.5.",
          "nullable": true,
          "properties": {
            "at": {
              "description": "The RFC3339 instant this slot fired (or is scheduled to). Accepts the\n`scheduledAt` alias on the wire (see the struct docs) but always\nserializes back as `at`.",
              "nullable": true,
              "type": [
                "string",
                "null"
              ]
            },
            "snapshotRef": {
              "additionalProperties": false,
              "description": "The `Snapshot` CR this slot produced, when one was created.",
              "nullable": true,
              "properties": {
                "name": {
                  "description": "The `Snapshot`'s `metadata.name` (same namespace as the schedule).",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": [
                "object",
                "null"
              ]
            }
          },
          "type": [
            "object",
            "null"
          ]
        },
        "lastSuccessfulSchedule": {
          "additionalProperties": false,
          "description": "The most recent firing whose `Snapshot` succeeded. ADR §3.5.",
          "nullable": true,
          "properties": {
            "at": {
              "description": "The RFC3339 instant this slot fired (or is scheduled to). Accepts the\n`scheduledAt` alias on the wire (see the struct docs) but always\nserializes back as `at`.",
              "nullable": true,
              "type": [
                "string",
                "null"
              ]
            },
            "snapshotRef": {
              "additionalProperties": false,
              "description": "The `Snapshot` CR this slot produced, when one was created.",
              "nullable": true,
              "properties": {
                "name": {
                  "description": "The `Snapshot`'s `metadata.name` (same namespace as the schedule).",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": [
                "object",
                "null"
              ]
            }
          },
          "type": [
            "object",
            "null"
          ]
        },
        "nextSchedule": {
          "additionalProperties": false,
          "description": "The next firing slot the controller has computed (cron + jitter, pinned).",
          "nullable": true,
          "properties": {
            "at": {
              "description": "The RFC3339 instant this slot fired (or is scheduled to). Accepts the\n`scheduledAt` alias on the wire (see the struct docs) but always\nserializes back as `at`.",
              "nullable": true,
              "type": [
                "string",
                "null"
              ]
            },
            "snapshotRef": {
              "additionalProperties": false,
              "description": "The `Snapshot` CR this slot produced, when one was created.",
              "nullable": true,
              "properties": {
                "name": {
                  "description": "The `Snapshot`'s `metadata.name` (same namespace as the schedule).",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": [
                "object",
                "null"
              ]
            }
          },
          "type": [
            "object",
            "null"
          ]
        },
        "observedGeneration": {
          "description": "The `metadata.generation` this status reflects, for staleness detection.",
          "format": "int64",
          "nullable": true,
          "type": [
            "integer",
            "null"
          ]
        }
      },
      "type": [
        "object",
        "null"
      ]
    }
  },
  "required": [
    "spec"
  ],
  "title": "SnapshotSchedule",
  "type": "object"
}