{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://developer.reits.tech/schemas/runner-cost-approval.v1.schema.json",
  "title": "D05-T03 isolated Linux runner cost approval contract",
  "type": "object",
  "required": [
    "schemaVersion",
    "status",
    "observedAt",
    "program",
    "task",
    "quote",
    "infrastructureBinding",
    "approvalContract",
    "approvalSeats",
    "costControls",
    "liveEvidence",
    "sources",
    "invariants",
    "boundary"
  ],
  "properties": {
    "schemaVersion": { "const": "developer.reits.tech/runner-cost-approval/v1" },
    "status": { "const": "T03_REPOSITORY_IMPLEMENTED_DUAL_APPROVAL_REQUIRED" },
    "observedAt": { "type": "string", "format": "date-time" },
    "program": {
      "type": "object",
      "required": ["acceptedKnives", "totalKnives", "currentOrdinal", "currentKnife", "remainingIncludingCurrent", "remainingAfterCurrentAcceptance"],
      "properties": {
        "acceptedKnives": { "const": 4 },
        "totalKnives": { "const": 36 },
        "currentOrdinal": { "const": 5 },
        "currentKnife": { "const": "D05" },
        "remainingIncludingCurrent": { "const": 32 },
        "remainingAfterCurrentAcceptance": { "const": 31 }
      }
    },
    "task": {
      "type": "object",
      "required": ["id", "owners", "repositoryImplementationComplete", "currentExecutablePrerequisite", "currentExecutablePrerequisiteSatisfied", "liveDualApprovalObserved", "deploymentAdmitted", "nextTask", "nextTaskBlocked"],
      "properties": {
        "id": { "const": "D05-T03" },
        "owners": { "const": ["Product Owner", "FinOps"] },
        "repositoryImplementationComplete": { "const": true },
        "currentExecutablePrerequisite": { "const": "D05-T02" },
        "currentExecutablePrerequisiteSatisfied": { "const": false },
        "liveDualApprovalObserved": { "const": false },
        "deploymentAdmitted": { "const": false },
        "nextTask": { "const": "D05-T04" },
        "nextTaskBlocked": { "const": true }
      }
    },
    "quote": {
      "type": "object",
      "required": ["region", "currency", "hoursAssumption", "components", "fixedBaseUsd", "fixedBaseRoundedUsd", "proposedMonthlyAuthorizationCeilingUsd", "variableAllowanceUsd", "notFixed"],
      "properties": {
        "region": { "const": "ap-southeast-2" },
        "currency": { "const": "USD" },
        "hoursAssumption": { "const": 730 },
        "components": { "type": "array", "minItems": 3, "maxItems": 3 },
        "fixedBaseUsd": { "const": 176.836 },
        "fixedBaseRoundedUsd": { "const": 176.84 },
        "proposedMonthlyAuthorizationCeilingUsd": { "const": 250 },
        "variableAllowanceUsd": { "const": 73.164 },
        "notFixed": { "type": "array", "minItems": 4, "maxItems": 4 }
      }
    },
    "infrastructureBinding": {
      "type": "object",
      "required": ["requestDigest", "templateSha256", "priceSnapshotSha256", "availabilityZones", "instanceType", "desiredCapacity", "maximumCapacity", "rootVolumeGiBEach", "cpuCreditMode", "paidDetailedMonitoring", "natGateways", "inboundRules"],
      "properties": {
        "requestDigest": { "const": "sha256:55467056b51a687287e0aba44dd7f7dafcba223110e384a9bc54ad7ab8c8fcbe" },
        "templateSha256": { "const": "62d847f115feab4d01dd6d58fdb211a3d1b94c8ed5e3580de5c5b1463116cadb" },
        "priceSnapshotSha256": { "const": "13f3e40f3030f05b1264758faa085b78d68ce7bb2d4f8c0c39e1cfa449b72526" },
        "availabilityZones": { "const": 2 },
        "instanceType": { "const": "t3.large" },
        "desiredCapacity": { "const": 2 },
        "maximumCapacity": { "const": 2 },
        "rootVolumeGiBEach": { "const": 80 },
        "cpuCreditMode": { "const": "standard" },
        "paidDetailedMonitoring": { "const": false },
        "natGateways": { "const": 0 },
        "inboundRules": { "const": 0 }
      }
    },
    "approvalContract": {
      "type": "object",
      "required": ["requiredRoles", "requiredSignatures", "observedSignatures", "distinctPrincipalsRequired", "signatureAlgorithm", "maximumValidityDays", "maximumMonthlyAuthorizationUsd", "deploymentWithoutValidReceipt"],
      "properties": {
        "requiredRoles": { "const": ["PRODUCT_OWNER", "FINOPS"] },
        "requiredSignatures": { "const": 2 },
        "observedSignatures": { "const": 0 },
        "distinctPrincipalsRequired": { "const": true },
        "signatureAlgorithm": { "const": "Ed25519" },
        "maximumValidityDays": { "const": 31 },
        "maximumMonthlyAuthorizationUsd": { "const": 250 },
        "deploymentWithoutValidReceipt": { "const": "DENY" }
      }
    },
    "approvalSeats": { "type": "array", "minItems": 2, "maxItems": 2 },
    "costControls": { "type": "array", "minItems": 6, "maxItems": 6 },
    "liveEvidence": {
      "type": "object",
      "required": ["productOwnerSignaturesObserved", "finOpsSignaturesObserved", "validReceiptsObserved", "paidResourcesCreated", "runnerStacksCreated", "organizationRunnersOnline", "d05GateG01Satisfied"],
      "properties": {
        "productOwnerSignaturesObserved": { "const": 0 },
        "finOpsSignaturesObserved": { "const": 0 },
        "validReceiptsObserved": { "const": 0 },
        "paidResourcesCreated": { "const": 0 },
        "runnerStacksCreated": { "const": 0 },
        "organizationRunnersOnline": { "const": 0 },
        "d05GateG01Satisfied": { "const": false }
      }
    },
    "sources": { "type": "array", "minItems": 3, "maxItems": 3 },
    "invariants": {
      "type": "object",
      "required": ["priceSnapshotIsApproval", "repositoryPacketIsOwnerApproval", "environmentLatchAloneAuthorizesSpend", "unpricedResourcesAuthorized", "paidResourcesCreated", "productionChangesAuthorized", "d05Accepted", "programAdvanced"],
      "properties": {
        "priceSnapshotIsApproval": { "const": false },
        "repositoryPacketIsOwnerApproval": { "const": false },
        "environmentLatchAloneAuthorizesSpend": { "const": false },
        "unpricedResourcesAuthorized": { "const": false },
        "paidResourcesCreated": { "const": 0 },
        "productionChangesAuthorized": { "const": 0 },
        "d05Accepted": { "const": false },
        "programAdvanced": { "const": false }
      }
    },
    "boundary": { "type": "string", "minLength": 120 }
  },
  "additionalProperties": false
}
