{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://vclaw.dev/schemas/video/artifacts/cinema-continuity-ledger.schema.json",
  "title": "Cinema Continuity Ledger",
  "type": "object",
  "additionalProperties": false,
  "required": ["schemaVersion", "projectSlug", "ledgerId", "generatedAt", "records", "contentHash"],
  "properties": {
    "schemaVersion": { "const": 1 },
    "projectSlug": { "$ref": "#/$defs/text" },
    "ledgerId": { "$ref": "#/$defs/text" },
    "generatedAt": { "type": "string", "format": "date-time" },
    "records": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/record" } },
    "contentHash": { "$ref": "#/$defs/hash" }
  },
  "$defs": {
    "text": { "type": "string", "minLength": 1 },
    "hash": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
    "dimension": { "enum": ["wardrobe", "hair", "makeup", "damage", "injury", "propHand", "mechanism", "geography", "gaze", "time", "light", "emotion"] },
    "state": {
      "type": "object", "additionalProperties": false,
      "required": ["wardrobe", "hair", "makeup", "damage", "injury", "propHand", "mechanism", "geography", "gaze", "time", "light", "emotion"],
      "properties": {
        "wardrobe": { "$ref": "#/$defs/text" }, "hair": { "$ref": "#/$defs/text" }, "makeup": { "$ref": "#/$defs/text" },
        "damage": { "$ref": "#/$defs/text" }, "injury": { "$ref": "#/$defs/text" }, "propHand": { "$ref": "#/$defs/text" },
        "mechanism": { "$ref": "#/$defs/text" }, "geography": { "$ref": "#/$defs/text" }, "gaze": { "$ref": "#/$defs/text" },
        "time": { "$ref": "#/$defs/text" }, "light": { "$ref": "#/$defs/text" }, "emotion": { "$ref": "#/$defs/text" }
      }
    },
    "subject": { "type": "object", "additionalProperties": false, "required": ["subjectId", "values"], "properties": { "subjectId": { "$ref": "#/$defs/text" }, "values": { "$ref": "#/$defs/state" } } },
    "change": {
      "type": "object", "additionalProperties": false,
      "required": ["subjectId", "dimension", "from", "to", "beatId", "reason"],
      "properties": { "subjectId": { "$ref": "#/$defs/text" }, "dimension": { "$ref": "#/$defs/dimension" }, "from": { "$ref": "#/$defs/text" }, "to": { "$ref": "#/$defs/text" }, "beatId": { "$ref": "#/$defs/text" }, "reason": { "$ref": "#/$defs/text" } }
    },
    "record": {
      "type": "object", "additionalProperties": false,
      "required": ["shotId", "sceneMapId", "cameraSideId", "carriesFromShotId", "subjects", "intentionalChanges"],
      "properties": {
        "shotId": { "$ref": "#/$defs/text" }, "sceneMapId": { "$ref": "#/$defs/text" }, "cameraSideId": { "$ref": "#/$defs/text" },
        "carriesFromShotId": { "anyOf": [{ "$ref": "#/$defs/text" }, { "type": "null" }] },
        "subjects": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/subject" } },
        "intentionalChanges": { "type": "array", "items": { "$ref": "#/$defs/change" } }
      }
    }
  }
}
