{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://mayvins.example/contracts/timetabler-phase1-load-evidence-v1.json",
  "title": "Timetabler Phase 1 load profile evidence",
  "type": "object",
  "required": [
    "schema_version",
    "profile",
    "service",
    "repository",
    "run_id",
    "environment",
    "production",
    "git_sha",
    "resource_booking_git_sha_attestation",
    "github_run_id",
    "source_scope",
    "entry_watermark",
    "final_watermark",
    "prior_evidence_sha256",
    "predecessor_evidence",
    "source_transactions",
    "profile_timing",
    "approved_window",
    "configuration_snapshot_sha256",
    "evidence_exchange",
    "workload_parameters",
    "thresholds",
    "stage_assertions",
    "source_metric_samples",
    "host_metric_samples",
    "final_source_metrics",
    "load_executed",
    "mutation_executed",
    "restart_executed",
    "reverse_delivery_enabled",
    "phase2_enabled",
    "dr_executed",
    "resource_booking_database_touched",
    "resource_booking_process_touched",
    "direct_database_mutation",
    "manual_outbox_edit",
    "evidence_sha256"
  ],
  "properties": {
    "schema_version": {"const": 1},
    "profile": {"enum": ["ENTRY", "LOAD-01", "PROVISION", "LOAD-02", "LOAD-03", "LOAD-04", "LOAD-05", "LOAD-06", "LOAD-07", "LOAD-08", "CLEANUP", "FINAL"]},
    "service": {"const": "timetabler"},
    "repository": {"const": "Mayvins/timetabler-be"},
    "run_id": {"pattern": "^phase1-load-[0-9]{8}t[0-9]{6}z-[0-9a-f]{12,32}$"},
    "environment": {"const": "staging"},
    "production": {"const": false},
    "git_sha": {"pattern": "^[0-9a-f]{40}$"},
    "resource_booking_git_sha_attestation": {"pattern": "^[0-9a-f]{40}$"},
    "github_run_id": {"pattern": "^[0-9]+$"},
    "source_scope": {"type": "string", "minLength": 1},
    "entry_watermark": {"type": "integer", "minimum": 1},
    "final_watermark": {"type": "integer", "minimum": 1},
    "prior_evidence_sha256": {"pattern": "^[0-9a-f]{64}$"},
    "predecessor_evidence": {
      "type": "object",
      "required": ["profile", "evidence_sha256", "external_accepted_root"]
    },
    "profile_timing": {
      "type": "object",
      "required": ["workload_seconds", "drain_seconds", "observation_seconds"]
    },
    "approved_window": {
      "type": "object",
      "required": ["starts_at", "ends_at"]
    },
    "configuration_snapshot_sha256": {"pattern": "^[0-9a-f]{64}$"},
    "evidence_exchange": {
      "type": "object",
      "required": ["path_sha256", "timetabler_owner_uid", "resource_booking_reader_uid", "directory_mode", "file_mode", "credentials_forbidden"],
      "properties": {
        "path_sha256": {"const": "3117a62de996b871b81b6fc43bbbb418af99a429bc7ceae8f722f828b81dfd6d"},
        "timetabler_owner_uid": {"const": 1073},
        "resource_booking_reader_uid": {"const": 1069},
        "directory_mode": {"const": "0755"},
        "file_mode": {"const": "0444"},
        "credentials_forbidden": {"const": true}
      },
      "additionalProperties": false
    },
    "workload_parameters": {"type": "object"},
    "thresholds": {"type": "object"},
    "stage_assertions": {"type": "object"},
    "source_transactions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["source_transaction_id", "source_sequence", "committed_at", "published_at", "canonical_bytes", "member_count", "workload_classification"],
        "properties": {
          "source_transaction_id": {"type": "string"},
          "source_sequence": {"type": "integer", "minimum": 1},
          "committed_at": {"type": "string", "pattern": "(?:Z|[+-][0-9]{2}:[0-9]{2})$"},
          "published_at": {"type": "string", "pattern": "(?:Z|[+-][0-9]{2}:[0-9]{2})$"},
          "canonical_bytes": {"type": "integer", "minimum": 1, "maximum": 2097152},
          "member_count": {"type": "integer", "minimum": 1},
          "workload_classification": {"type": "string"},
          "recurring_assignment": {
            "type": "object",
            "required": ["academic_term_id", "academic_term_start_date", "academic_term_end_date", "activity_source_ref_sha256", "recurrence_occurrence_count", "staff_assignment_count", "location_assignment_count", "staff_preset_count", "location_preset_count", "assignment_transition"],
            "properties": {
              "academic_term_id": {"const": 26},
              "academic_term_start_date": {"const": "2026-01-05"},
              "academic_term_end_date": {"const": "2026-06-26"},
              "activity_source_ref_sha256": {"pattern": "^[0-9a-f]{64}$"},
              "recurrence_occurrence_count": {"type": "integer", "minimum": 2},
              "staff_assignment_count": {"type": "integer", "minimum": 0, "maximum": 1},
              "location_assignment_count": {"type": "integer", "minimum": 0, "maximum": 1},
              "staff_preset_count": {"const": 1},
              "location_preset_count": {"const": 1},
              "assignment_transition": {"enum": ["assigned", "released"]}
            },
            "additionalProperties": false
          }
        }
      }
    },
    "source_metric_samples": {"type": "array"},
    "host_metric_samples": {"type": "array"},
    "final_source_metrics": {"type": "object"},
    "load_executed": {"type": "boolean"},
    "mutation_executed": {"type": "boolean"},
    "restart_executed": {"type": "boolean"},
    "reverse_delivery_enabled": {"const": false},
    "phase2_enabled": {"const": false},
    "dr_executed": {"const": false},
    "resource_booking_database_touched": {"const": false},
    "resource_booking_process_touched": {"const": false},
    "direct_database_mutation": {"const": false},
    "manual_outbox_edit": {"const": false},
    "evidence_correction": {
      "type": "object",
      "required": ["artifact_filename", "original_evidence_sha256", "original_timetabler_sha", "original_resource_booking_sha", "source_timezone", "reason"],
      "properties": {
        "artifact_filename": {"enum": ["provision-corrected.json", "provision-corrected-v2.json", "provision-corrected-v3.json", "provision-corrected-v4.json", "provision-corrected-v5.json", "provision-corrected-v6.json", "provision-corrected-v7.json"]},
        "original_evidence_sha256": {"const": "c1ec62ac166a1e0d8d6f80cfda390b227dad4f0fab30cad1e84c94d1be1c45eb"},
        "original_timetabler_sha": {"const": "27aa6f6aef21ce28c23e269eef03a62b42cf4039"},
        "original_resource_booking_sha": {"const": "c93001409606cacbe817bfa0721547753f7b8f86"},
        "source_timezone": {"const": "Asia/Kuala_Lumpur"},
        "reason": {"const": "missing-timezone-offset"}
      },
      "additionalProperties": false
    },
    "correction_action_assertions": {
      "type": "object",
      "required": ["api_authentication_performed", "domain_mutation", "database_write", "manual_outbox_edit", "process_restart", "load_executed", "dr_executed", "reverse_delivery_enabled", "original_evidence_preserved", "fixture_inventory_counts", "fixture_inventory_sha256"]
    },
    "evidence_sha256": {"pattern": "^[0-9a-f]{64}$"}
  },
  "additionalProperties": true
}
