{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://buildchain.libkungfu.dev/contracts/auditable-demo-scenario-v1.schema.json",
  "title": "Buildchain declarative binary auditable demo",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema", "product", "artifact", "execution", "renditions", "demos", "publication", "authority"],
  "properties": {
    "schema": {"const": "buildchain.declarative-binary-demo/v1"},
    "compositionMode": {
      "type": "string",
      "enum": ["presentation-framed", "terminal-fill"],
      "default": "presentation-framed"
    },
    "playback": {
      "type": "object",
      "additionalProperties": false,
      "required": ["schema", "mode", "activeDurationMs", "finalHoldMs"],
      "properties": {
        "schema": {"const": "buildchain.declarative-demo-playback/v1"},
        "mode": {"const": "deterministic-readable"},
        "activeDurationMs": {"type": "integer", "minimum": 1000, "maximum": 179750},
        "finalHoldMs": {"type": "integer", "minimum": 250, "maximum": 5000}
      }
    },
    "product": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "displayName", "binaryName"],
      "properties": {
        "id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"},
        "displayName": {"type": "string", "minLength": 1, "maxLength": 80},
        "binaryName": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$"}
      }
    },
    "artifact": {
      "type": "object",
      "additionalProperties": false,
      "required": ["platformId", "binaryPath", "metadataPath", "metadataContract", "runtimeDependencies"],
      "properties": {
        "platformId": {"const": "linux-x64"},
        "binaryPath": {"type": "string", "minLength": 1},
        "metadataPath": {"type": "string", "minLength": 1},
        "metadataContract": {"type": "string", "minLength": 1},
        "runtimeDependencies": {"type": "array", "maxItems": 0}
      }
    },
    "execution": {
      "type": "object",
      "additionalProperties": false,
      "required": ["deterministic", "network", "secrets", "totalTimeoutSeconds", "environment"],
      "properties": {
        "deterministic": {"const": true},
        "network": {"const": "none"},
        "secrets": {"const": "none"},
        "durationClass": {"type": "string", "enum": ["standard", "long-form"]},
        "totalTimeoutSeconds": {"type": "integer", "minimum": 1},
        "environment": {
          "type": "object",
          "propertyNames": {"pattern": "^[A-Z][A-Z0-9_]{0,63}$"},
          "additionalProperties": {"type": "string", "maxLength": 256}
        }
      }
    },
    "transportSmoke": {
      "type": "object",
      "additionalProperties": false,
      "required": ["argv", "timeoutSeconds", "expectedExitCodes", "stdoutIncludes"],
      "properties": {
        "argv": {"type": "array", "minItems": 1, "maxItems": 64, "items": {"type": "string", "maxLength": 512}},
        "timeoutSeconds": {"type": "integer", "minimum": 1, "maximum": 60},
        "expectedExitCodes": {"type": "array", "minItems": 1, "maxItems": 4, "items": {"type": "integer", "minimum": 0, "maximum": 255}},
        "stdoutIncludes": {"type": "array", "maxItems": 32, "items": {"type": "string", "minLength": 1, "maxLength": 256}}
      }
    },
    "presentation": {
      "type": "object",
      "additionalProperties": false,
      "required": ["schema", "proofs", "materialization"],
      "properties": {
        "schema": {"const": "buildchain.declarative-demo-presentation/v1"},
        "proofs": {
          "type": "array",
          "minItems": 1,
          "maxItems": 8,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": ["demoId", "label", "question", "summary"],
            "properties": {
              "demoId": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"},
              "label": {"type": "string", "minLength": 1, "maxLength": 80},
              "question": {"type": "string", "minLength": 1, "maxLength": 120},
              "summary": {"type": "string", "minLength": 1, "maxLength": 500},
              "transitionAfter": {"type": "string", "minLength": 1, "maxLength": 500}
            }
          }
        },
        "materialization": {
          "type": "object",
          "additionalProperties": false,
          "required": ["readmeMode", "technicalSpecPath", "technicalSpecTitle", "technicalMarker"],
          "properties": {
            "readmeMode": {"type": "string", "enum": ["full", "media-only"]},
            "technicalSpecPath": {"type": "string", "minLength": 1},
            "technicalSpecTitle": {"type": "string", "minLength": 1, "maxLength": 120},
            "technicalMarker": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._:-]{0,79}$"}
          }
        }
      }
    },
    "renditions": {
      "const": [
        {"id": "1080p", "role": "primary", "columns": 150, "rows": 36, "width": 1920, "height": 1080},
        {"id": "720p", "role": "responsive", "columns": 100, "rows": 28, "width": 1280, "height": 720}
      ]
    },
    "demos": {
      "type": "array",
      "minItems": 1,
      "maxItems": 8,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["id", "title", "claimBoundary", "steps"],
        "properties": {
          "id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"},
          "title": {"type": "string", "minLength": 1, "maxLength": 120},
          "claimBoundary": {"type": "string", "minLength": 1, "maxLength": 500},
          "steps": {
            "type": "array",
            "minItems": 1,
            "maxItems": 12,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": ["id", "argv", "timeoutSeconds", "expectedExitCodes", "stdoutIncludes", "fileAssertions"],
              "properties": {
                "id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$"},
                "argv": {"type": "array", "minItems": 1, "maxItems": 64, "items": {"type": "string", "maxLength": 512}},
                "timeoutSeconds": {"type": "integer", "minimum": 1, "maximum": 180},
                "expectedExitCodes": {"type": "array", "minItems": 1, "maxItems": 4, "items": {"type": "integer", "minimum": 0, "maximum": 255}},
                "stdoutIncludes": {"type": "array", "maxItems": 32, "items": {"type": "string", "minLength": 1, "maxLength": 256}},
                "fileAssertions": {
                  "type": "array",
                  "maxItems": 32,
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": ["path", "jsonEquals"],
                    "properties": {
                      "path": {"type": "string", "minLength": 1},
                      "jsonEquals": {"type": "object"}
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "publication": {
      "type": "object",
      "additionalProperties": false,
      "required": ["evidencePath", "readmePath", "marker"],
      "properties": {
        "evidencePath": {"type": "string", "minLength": 1},
        "readmePath": {"type": "string", "minLength": 1},
        "marker": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._:-]{0,79}$"}
      }
    },
    "authority": {
      "type": "object",
      "additionalProperties": false,
      "required": ["grants", "nonAuthorities"],
      "properties": {
        "grants": {"type": "array", "maxItems": 0},
        "nonAuthorities": {"type": "array", "minItems": 8, "uniqueItems": true, "items": {"type": "string"}}
      }
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "execution": {
            "required": ["durationClass"],
            "properties": {"durationClass": {"const": "long-form"}}
          }
        }
      },
      "then": {
        "properties": {
          "execution": {"properties": {"totalTimeoutSeconds": {"maximum": 180}}}
        }
      },
      "else": {
        "properties": {
          "execution": {"properties": {"totalTimeoutSeconds": {"maximum": 60}}},
          "demos": {
            "items": {
              "properties": {
                "steps": {
                  "items": {
                    "properties": {"timeoutSeconds": {"maximum": 60}}
                  }
                }
              }
            }
          }
        }
      }
    }
  ]
}
