{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://kokunoyumeto.github.io/program-matematika-indonesia/schema/v2/v23-adapter-index-v2.schema.json",
  "title": "Program Matematika Indonesia snapshot-aware adapter index v2",
  "type": "object",
  "additionalProperties": false,
  "required": ["$schema", "schema_id", "schema_version", "snapshot", "policy", "summary", "packages", "adapters"],
  "properties": {
    "$schema": { "const": "https://kokunoyumeto.github.io/program-matematika-indonesia/schema/v2/v23-adapter-index-v2.schema.json" },
    "schema_id": { "const": "interlanguage/program-matematika-indonesia-v23-adapter-index/v2" },
    "schema_version": { "const": "2.0.0" },
    "snapshot": { "$ref": "#/$defs/snapshot" },
    "policy": {
      "type": "object",
      "additionalProperties": false,
      "required": ["owner_native_authoritative", "zero_copy", "machine_data_secondary", "aggregate_conformance_claim"],
      "properties": {
        "owner_native_authoritative": { "const": true },
        "zero_copy": { "const": true },
        "machine_data_secondary": { "const": true },
        "aggregate_conformance_claim": { "const": false }
      }
    },
    "summary": {
      "type": "object",
      "additionalProperties": false,
      "required": ["curriculum_roles", "role_bindings", "published_role_bindings", "pending_role_bindings", "distinct_adapter_packages", "published_adapter_packages", "pending_adapter_packages", "represented_native_families", "unbound_roles", "families_without_local_adapter", "families_without_public_replay_complete_adapter", "package_deduplicated_canonical_records"],
      "properties": {
        "curriculum_roles": { "const": 40 },
        "role_bindings": { "type": "integer", "minimum": 0, "maximum": 40 },
        "published_role_bindings": { "type": "integer", "minimum": 0, "maximum": 40 },
        "pending_role_bindings": { "type": "integer", "minimum": 0, "maximum": 40 },
        "distinct_adapter_packages": { "type": "integer", "minimum": 0, "maximum": 40 },
        "published_adapter_packages": { "type": "integer", "minimum": 0, "maximum": 40 },
        "pending_adapter_packages": { "type": "integer", "minimum": 0, "maximum": 40 },
        "represented_native_families": { "type": "integer", "minimum": 0, "maximum": 33 },
        "unbound_roles": { "type": "integer", "minimum": 0, "maximum": 40 },
        "families_without_local_adapter": { "type": "integer", "minimum": 0, "maximum": 33 },
        "families_without_public_replay_complete_adapter": { "type": "integer", "minimum": 0, "maximum": 33 },
        "package_deduplicated_canonical_records": { "type": "integer", "minimum": 0 }
      }
    },
    "packages": {
      "type": "array",
      "minItems": 1,
      "maxItems": 40,
      "items": { "$ref": "#/$defs/package" }
    },
    "adapters": {
      "type": "array",
      "minItems": 1,
      "maxItems": 40,
      "items": { "$ref": "#/$defs/adapter" }
    }
  },
  "$defs": {
    "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
    "fileIdentity": {
      "type": "object",
      "additionalProperties": false,
      "required": ["path", "bytes", "sha256"],
      "properties": {
        "path": { "type": "string", "minLength": 1 },
        "bytes": { "type": "integer", "minimum": 1 },
        "sha256": { "$ref": "#/$defs/sha256" }
      }
    },
    "snapshot": {
      "type": "object",
      "additionalProperties": false,
      "required": ["snapshot_id", "snapshot_kind", "as_of", "central_release_version", "central_release_record_doi", "mutable_overlay", "supersedes", "public_replay_state"],
      "properties": {
        "snapshot_id": { "type": "string", "minLength": 1 },
        "snapshot_kind": { "enum": ["immutable_release", "live_successor_overlay"] },
        "as_of": { "type": "string", "format": "date-time" },
        "central_release_version": { "type": "string", "minLength": 1 },
        "central_release_record_doi": { "type": ["string", "null"], "pattern": "^10\\.5281/zenodo\\.[0-9]+$" },
        "mutable_overlay": { "type": "boolean" },
        "supersedes": {
          "type": ["object", "null"],
          "additionalProperties": false,
          "required": ["snapshot_id", "central_release_version", "central_release_record_doi", "source"],
          "properties": {
            "snapshot_id": { "type": "string", "minLength": 1 },
            "central_release_version": { "type": "string", "minLength": 1 },
            "central_release_record_doi": { "type": "string", "pattern": "^10\\.5281/zenodo\\.[0-9]+$" },
            "source": { "$ref": "#/$defs/fileIdentity" }
          }
        },
        "public_replay_state": { "enum": ["published_public_readback_complete", "prepublication_local_validation_only", "postpublication_release_assets_readback_complete"] }
      },
      "allOf": [
        {
          "if": { "properties": { "snapshot_kind": { "const": "immutable_release" } }, "required": ["snapshot_kind"] },
          "then": { "properties": { "mutable_overlay": { "const": false }, "public_replay_state": { "const": "published_public_readback_complete" }, "central_release_record_doi": { "type": "string" } } }
        },
        {
          "if": { "properties": { "snapshot_kind": { "const": "live_successor_overlay" } }, "required": ["snapshot_kind"] },
          "then": { "properties": { "mutable_overlay": { "const": true }, "public_replay_state": { "enum": ["prepublication_local_validation_only", "postpublication_release_assets_readback_complete"] }, "supersedes": { "type": "object" } } }
        },
        {
          "if": { "properties": { "public_replay_state": { "const": "postpublication_release_assets_readback_complete" } }, "required": ["public_replay_state"] },
          "then": { "properties": { "central_release_record_doi": { "type": "string" } } }
        }
      ]
    },
    "plannedRelease": {
      "type": "object",
      "additionalProperties": false,
      "required": ["central_release_version", "artifact_path", "public_url_after_release", "state"],
      "properties": {
        "central_release_version": { "type": "string", "minLength": 1 },
        "artifact_path": { "type": "string", "minLength": 1 },
        "public_url_after_release": { "type": "string", "format": "uri" },
        "state": { "const": "planned_not_public" }
      }
    },
    "ownerAuthority": {
      "type": "object",
      "additionalProperties": false,
      "required": ["public_repository", "public_release", "release_commit", "release_tree", "version_doi", "concept_doi"],
      "properties": {
        "public_repository": { "type": "string", "format": "uri" },
        "public_release": { "type": "string", "format": "uri" },
        "release_commit": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
        "release_tree": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
        "version_doi": { "type": "string", "pattern": "^10\\.5281/zenodo\\.[0-9]+$" },
        "concept_doi": { "type": "string", "pattern": "^10\\.5281/zenodo\\.[0-9]+$" }
      }
    },
    "package": {
      "type": "object",
      "additionalProperties": false,
      "required": ["package_id", "native_family_id", "proof_kind", "contract_version", "adapter_version", "admission_state", "release_url", "public_asset_url", "public_replay_status", "adopted_capabilities", "known_limitations", "archive", "manifest", "canonical_records", "jsonl_csv_table_pairs", "owner_native_authoritative", "zero_copy", "scope_note"],
      "properties": {
        "package_id": { "type": "string", "minLength": 1 },
        "native_family_id": { "type": "string", "pattern": "^family-[0-9]{2}-[a-z0-9-]+$" },
        "proof_kind": { "enum": ["legacy_conformance_package", "reversible_lane_adapter"] },
        "contract_version": { "enum": ["legacy-v2.3", "2.3.1"] },
        "adapter_version": { "type": "string", "minLength": 1 },
        "admission_state": { "enum": ["published", "admitted_pending_release"] },
        "release_url": { "type": ["string", "null"], "format": "uri" },
        "public_asset_url": { "type": ["string", "null"], "format": "uri" },
        "planned_release": { "$ref": "#/$defs/plannedRelease" },
        "public_replay_status": { "enum": ["pending_release_local_seal_verified", "published_public_asset_readback_verified"] },
        "adopted_capabilities": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "pattern": "^[a-z0-9_]+$" } },
        "known_limitations": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
        "archive": { "$ref": "#/$defs/fileIdentity" },
        "manifest": { "$ref": "#/$defs/fileIdentity" },
        "canonical_records": { "type": "integer", "minimum": 1 },
        "native_records_preserved": { "type": "integer", "minimum": 1 },
        "reversible_native_mappings": { "type": "integer", "minimum": 1 },
        "additional_native_index_rows": { "type": "integer", "minimum": 1 },
        "assessment_records_preserved": { "type": "integer", "minimum": 1 },
        "exact_html_anchor_routes": { "type": "integer", "minimum": 1 },
        "explicit_solution_gaps": { "type": "integer", "minimum": 1 },
        "navigation_units_promoted": { "type": "integer", "minimum": 0 },
        "component_rights_exceptions": { "type": "integer", "minimum": 0 },
        "ordered_import_relations": { "type": "integer", "minimum": 0 },
        "rights_assignments": { "type": "integer", "minimum": 0 },
        "reader_reachable_units": { "type": "integer", "minimum": 0 },
        "retained_non_reader_units": { "type": "integer", "minimum": 0 },
        "reader_pages": { "type": "integer", "minimum": 1 },
        "unit_records": { "type": "integer", "minimum": 0 },
        "relation_records": { "type": "integer", "minimum": 0 },
        "source_translation_pairs": { "type": "integer", "minimum": 0 },
        "namespace_mappings": { "type": "integer", "minimum": 0 },
        "public_artifacts": { "type": "integer", "minimum": 0 },
        "native_html_claimed": { "type": "boolean" },
        "unit_or_page_anchors_claimed": { "type": "boolean" },
        "jsonl_csv_table_pairs": { "type": "integer", "minimum": 1 },
        "owner_native_authoritative": { "const": true },
        "zero_copy": { "const": true },
        "scope_note": { "type": "string", "minLength": 1 },
        "owner_authority": { "$ref": "#/$defs/ownerAuthority" },
        "owner_package_id": { "type": "string", "minLength": 1 },
        "dataset_id": { "type": "string", "minLength": 1 },
        "extension_id": { "type": "string", "minLength": 1 }
      },
      "allOf": [
        {
          "if": { "properties": { "admission_state": { "const": "published" } }, "required": ["admission_state"] },
          "then": {
            "properties": { "release_url": { "type": "string", "format": "uri" }, "public_asset_url": { "type": "string", "format": "uri" }, "public_replay_status": { "const": "published_public_asset_readback_verified" } },
            "not": { "required": ["planned_release"] }
          }
        },
        {
          "if": { "properties": { "admission_state": { "const": "admitted_pending_release" } }, "required": ["admission_state"] },
          "then": {
            "required": ["planned_release"],
            "properties": { "release_url": { "const": null }, "public_asset_url": { "const": null }, "public_replay_status": { "const": "pending_release_local_seal_verified" } }
          }
        }
      ]
    },
    "centralProjection": {
      "type": "object",
      "additionalProperties": false,
      "required": ["path", "status", "locale"],
      "properties": {
        "path": { "type": "string", "pattern": "^docs/" },
        "status": { "enum": ["published", "pending_successor_release"] },
        "locale": { "const": "id-ID" }
      }
    },
    "adapter": {
      "type": "object",
      "additionalProperties": false,
      "required": ["role_id", "course", "native_family_id", "adapter_package_id", "learner_url", "learner_runtime_relationship", "scope_note"],
      "properties": {
        "role_id": { "type": "string", "pattern": "^[A-D][0-9]{2,3}$" },
        "course": { "type": "string", "minLength": 1 },
        "native_family_id": { "type": "string", "pattern": "^family-[0-9]{2}-[a-z0-9-]+$" },
        "adapter_package_id": { "type": "string", "minLength": 1 },
        "learner_url": { "type": "string", "format": "uri" },
        "central_learner_projection": { "$ref": "#/$defs/centralProjection" },
        "learner_runtime_relationship": { "enum": ["directly_consumes_adapter_outputs", "course_link_only_no_adapter_consumption_claim"] },
        "course_specific_route_count": { "type": "integer", "minimum": 0 },
        "scope_note": { "type": "string", "minLength": 1 }
      }
    }
  }
}
