{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:animsmith:schema:transition-pose-evaluation:1",
  "title": "AnimSmith transition-pose evaluation V1",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema", "schema_version", "status", "decision", "declaration_input", "declaration_normalized", "subject_input", "families"],
  "properties": {
    "schema": { "const": "urn:animsmith:schema:transition-pose-evaluation:1" },
    "schema_version": { "const": 1 },
    "status": { "enum": ["complete", "incomplete"] },
    "decision": { "enum": ["pass", "finding", "not_evaluated"] },
    "reason": { "$ref": "#/$defs/reason" },
    "declaration_input": { "$ref": "#/$defs/identity_8m" },
    "declaration_normalized": { "$ref": "#/$defs/identity_8m" },
    "subject_input": { "$ref": "#/$defs/identity" },
    "subject_dependency_closure_identity": { "description": "Complete dependency closure for a document subject; absent for a collection manifest subject.", "$ref": "#/$defs/identity" },
    "families": { "type": "array", "maxItems": 4096, "items": { "$ref": "#/$defs/family" } }
  },
  "allOf": [{ "$ref": "#/$defs/top_level_state" }],
  "$defs": {
    "identity": {
      "type": "object", "additionalProperties": false, "required": ["sha256", "bytes"],
      "properties": { "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, "bytes": { "type": "integer", "minimum": 0 } }
    },
    "identity_8m": {
      "allOf": [{ "$ref": "#/$defs/identity" }, { "properties": { "bytes": { "maximum": 8388608 } } }]
    },
    "reason": { "enum": ["no_configured_families", "dependency_closure_incomplete", "member_unavailable", "zero_duration", "skeleton_basis_mismatch", "time_tolerance_unsupported", "unsupported_sampling", "input_limit", "family_work_limit", "aggregate_work_limit", "retention_limit", "result_limit"] },
    "member": {
      "type": "object", "additionalProperties": false, "required": ["take_index", "take_name", "source_input"],
      "properties": { "take_index": { "type": "integer", "minimum": 0 }, "take_name": { "type": "string", "minLength": 1, "maxLength": 4096 }, "source_input": { "oneOf": [{ "$ref": "#/$defs/identity" }, { "type": "null" }] }, "source_dependency_closure_identity": { "description": "Complete dependency closure for this available member source.", "$ref": "#/$defs/identity" } }
    },
    "translation_offender": {
      "type": "object", "additionalProperties": false, "required": ["bone_ordinal", "bone_name", "delta_m"],
      "properties": { "bone_ordinal": { "type": "integer", "minimum": 0, "maximum": 4095 }, "bone_name": { "type": "string" }, "delta_m": { "type": "number", "minimum": 0 } }
    },
    "rotation_offender": {
      "type": "object", "additionalProperties": false, "required": ["bone_ordinal", "bone_name", "delta_deg"],
      "properties": { "bone_ordinal": { "type": "integer", "minimum": 0, "maximum": 4095 }, "bone_name": { "type": "string" }, "delta_deg": { "type": "number", "minimum": 0 } }
    },
    "pair": {
      "type": "object", "additionalProperties": false,
      "required": ["member_indices", "boundary", "max_translation_delta_m", "max_rotation_delta_deg", "translation_tolerance_m", "rotation_tolerance_deg", "translation_offenders", "rotation_offenders"],
      "properties": {
        "member_indices": { "type": "array", "minItems": 2, "prefixItems": [{ "type": "integer", "minimum": 0 }, { "type": "integer", "minimum": 0 }], "items": false },
        "boundary": { "enum": ["entry", "exit"] },
        "max_translation_delta_m": { "type": "number", "minimum": 0 }, "max_rotation_delta_deg": { "type": "number", "minimum": 0 },
        "translation_tolerance_m": { "type": "number", "minimum": 0 }, "rotation_tolerance_deg": { "type": "number", "minimum": 0 },
        "translation_offenders": { "type": "array", "maxItems": 16, "items": { "$ref": "#/$defs/translation_offender" } },
        "rotation_offenders": { "type": "array", "maxItems": 16, "items": { "$ref": "#/$defs/rotation_offender" } }
      }
    },
    "family": {
      "type": "object", "additionalProperties": false,
      "required": ["family_id", "status", "decision", "members", "pairs"],
      "properties": {
        "family_id": { "type": "string", "minLength": 1, "maxLength": 255 },
        "status": { "enum": ["complete", "incomplete"] }, "decision": { "enum": ["pass", "finding", "not_evaluated"] },
        "reason": { "$ref": "#/$defs/reason" }, "members": { "type": "array", "minItems": 2, "maxItems": 4096, "items": { "$ref": "#/$defs/member" } },
        "skeleton_basis_input": { "$ref": "#/$defs/identity" }, "pairs": { "type": "array", "maxItems": 4096, "items": { "$ref": "#/$defs/pair" } }
      },
      "allOf": [{ "$ref": "#/$defs/family_state" }]
    },
    "top_level_state": {
      "oneOf": [
        { "properties": { "status": { "const": "complete" }, "decision": { "const": "pass" }, "reason": { "const": "no_configured_families" }, "families": { "maxItems": 0 } }, "required": ["reason"] },
        { "properties": { "status": { "const": "complete" }, "decision": { "const": "pass" }, "families": { "minItems": 1, "items": { "properties": { "status": { "const": "complete" }, "decision": { "const": "pass" } }, "required": ["status", "decision"] } } }, "not": { "required": ["reason"] } },
        { "properties": { "status": { "const": "complete" }, "decision": { "const": "finding" }, "families": { "minItems": 1, "contains": { "properties": { "status": { "const": "complete" }, "decision": { "const": "finding" } }, "required": ["status", "decision"] }, "items": { "not": { "properties": { "status": { "const": "incomplete" } }, "required": ["status"] } } } }, "not": { "required": ["reason"] } },
        { "properties": { "status": { "const": "incomplete" }, "decision": { "const": "not_evaluated" }, "families": { "minItems": 1, "contains": { "properties": { "status": { "const": "incomplete" } }, "required": ["status"] }, "not": { "contains": { "properties": { "reason": { "const": "dependency_closure_incomplete" } }, "required": ["reason"] } } } }, "not": { "required": ["reason"] } },
        { "properties": { "status": { "const": "incomplete" }, "decision": { "const": "not_evaluated" }, "families": { "minItems": 1, "contains": { "properties": { "reason": { "const": "dependency_closure_incomplete" } }, "required": ["reason"] } } }, "not": { "required": ["reason"] } }
      ]
    },
    "family_state": {
      "oneOf": [
        { "properties": { "status": { "const": "complete" }, "decision": { "const": "pass" }, "members": { "items": { "properties": { "source_input": { "$ref": "#/$defs/identity" } }, "required": ["source_dependency_closure_identity"] } }, "skeleton_basis_input": { "$ref": "#/$defs/identity" }, "pairs": { "minItems": 1, "items": { "properties": { "translation_offenders": { "maxItems": 0 }, "rotation_offenders": { "maxItems": 0 } } } } }, "required": ["skeleton_basis_input"], "not": { "required": ["reason"] } },
        { "properties": { "status": { "const": "complete" }, "decision": { "const": "finding" }, "members": { "items": { "properties": { "source_input": { "$ref": "#/$defs/identity" } }, "required": ["source_dependency_closure_identity"] } }, "skeleton_basis_input": { "$ref": "#/$defs/identity" }, "pairs": { "minItems": 1, "contains": { "anyOf": [{ "properties": { "translation_offenders": { "minItems": 1 } }, "required": ["translation_offenders"] }, { "properties": { "rotation_offenders": { "minItems": 1 } }, "required": ["rotation_offenders"] }] } } }, "required": ["skeleton_basis_input"], "not": { "required": ["reason"] } },
        { "properties": { "status": { "const": "incomplete" }, "decision": { "const": "not_evaluated" }, "reason": { "const": "dependency_closure_incomplete" }, "members": { "contains": { "not": { "required": ["source_dependency_closure_identity"] } } }, "pairs": { "maxItems": 0 } }, "required": ["reason"] },
        { "properties": { "status": { "const": "incomplete" }, "decision": { "const": "not_evaluated" }, "reason": { "const": "member_unavailable" }, "pairs": { "maxItems": 0 } }, "required": ["reason"] },
        { "properties": { "status": { "const": "incomplete" }, "decision": { "const": "not_evaluated" }, "reason": { "$ref": "#/$defs/incomplete_reason_with_available_members" }, "members": { "items": { "properties": { "source_input": { "$ref": "#/$defs/identity" } }, "required": ["source_dependency_closure_identity"] } }, "pairs": { "maxItems": 0 } }, "required": ["reason"] }
      ]
    },
    "incomplete_reason_with_available_members": { "enum": ["zero_duration", "skeleton_basis_mismatch", "time_tolerance_unsupported", "unsupported_sampling", "input_limit", "family_work_limit", "aggregate_work_limit", "retention_limit", "result_limit"] }
  }
}
