{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Schedule record",
  "type": "object",
  "additionalProperties": true,
  "required": [
    "reviewCardId",
    "setId",
    "state"
  ],
  "properties": {
    "id": {
      "description": "Optional. Omit the key to generate a source identity; null and empty strings are invalid. SRS history requires an explicitly supplied schedule id.",
      "type": "string",
      "minLength": 1
    },
    "reviewCardId": { "type": "string", "minLength": 1 },
    "setId": { "type": "string", "minLength": 1 },
    "state": { "enum": ["new", "learn", "review", "relearn"] },
    "step": { "type": ["integer", "null"] },
    "stability": { "type": ["number", "null"] },
    "difficulty": { "type": ["number", "null"] },
    "decay": {
      "description": "Positive, finite FSRS forgetting-curve parameter for this snapshot; null means unknown. Import does not consult a manifest.",
      "type": ["number", "null"],
      "exclusiveMinimum": 0
    },
    "timeDue": {
      "description": "Exact due instant. Exactly one of timeDue and dueReviewDay must be populated; the inactive field may be omitted or null.",
      "type": ["string", "null"],
      "format": "date-time"
    },
    "dueReviewDay": {
      "description": "Due study date resolved by the application using its current reset and timezone. Exactly one of timeDue and dueReviewDay must be populated; no timestamp fallback is stored.",
      "type": ["string", "null"],
      "format": "date",
      "pattern": "^(?!0000)[0-9]{4}-[0-9]{2}-[0-9]{2}$"
    },
    "scheduledIntervalMs": {
      "description": "Positive nominal interval selected by the latest answer, independent of timeDue minus lastReviewTime. Null means unknown.",
      "type": ["integer", "null"],
      "minimum": 1
    },
    "lastReviewTime": { "type": ["string", "null"], "format": "date-time" },
    "lapses": { "type": ["integer", "null"], "default": 0 },
    "isStruggle": { "type": ["boolean", "null"], "default": false },
    "successStreak": { "type": ["integer", "null"], "default": 0 },
    "suspended": { "type": ["boolean", "null"], "default": false },
    "disabled": { "type": ["boolean", "null"], "default": false }
  },
  "oneOf": [
    {
      "required": ["timeDue"],
      "properties": {
        "timeDue": { "type": "string" },
        "dueReviewDay": { "type": "null" }
      }
    },
    {
      "required": ["dueReviewDay"],
      "properties": {
        "timeDue": { "type": "null" },
        "dueReviewDay": { "type": "string" }
      }
    }
  ],
  "allOf": [
    {
      "if": { "properties": { "state": { "const": "new" } } },
      "then": {
        "properties": {
          "decay": { "type": "null" },
          "dueReviewDay": { "type": "null" },
          "scheduledIntervalMs": { "type": "null" }
        }
      }
    }
  ]
}
