{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://usedeed.app/contracts/deed.formal_transition_oracle.v1.schema.json",
  "title": "DEED formal transition oracle v1",
  "type": "object",
  "required": ["$schema", "derivation", "domains", "oracleHash", "transition", "version"],
  "properties": {
    "$schema": { "const": "https://usedeed.app/contracts/deed.formal_transition_oracle.v1.schema.json" },
    "derivation": {
      "type": "object",
      "required": ["agdaSha256", "agdaSource", "contractSha256", "contractSource", "method", "note"],
      "properties": {
        "agdaSha256": { "$ref": "#/$defs/sha256" },
        "agdaSource": { "const": "formal/DEED/QAnamorphism.agda" },
        "contractSha256": { "$ref": "#/$defs/sha256" },
        "contractSource": { "const": "formal/runtime-state-contract.json" },
        "method": { "const": "parsed-agda-equations-v1" },
        "note": { "type": "string", "minLength": 1 }
      },
      "additionalProperties": false
    },
    "domains": {
      "type": "object",
      "required": ["branchPositions", "custodyPostures", "evidenceGrades", "gateModes", "questionKinds", "runtimeAnchors"],
      "additionalProperties": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1, "uniqueItems": true }
    },
    "oracleHash": { "$ref": "#/$defs/sha256" },
    "transition": {
      "type": "object",
      "required": ["custodyPosture", "nextAnchor", "nextGateMode", "nextKind", "strengthen"],
      "properties": {
        "custodyPosture": { "const": "preserve" },
        "nextAnchor": { "$ref": "#/$defs/transitionTable" },
        "nextGateMode": { "$ref": "#/$defs/transitionTable" },
        "nextKind": { "$ref": "#/$defs/transitionTable" },
        "strengthen": { "type": "object", "minProperties": 1, "additionalProperties": { "type": "string", "minLength": 1 } }
      },
      "additionalProperties": false
    },
    "version": { "const": 1 }
  },
  "$defs": {
    "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
    "transitionTable": { "type": "object", "minProperties": 1, "additionalProperties": { "type": "object", "required": ["observe", "constrain", "verify"], "additionalProperties": { "type": "string", "minLength": 1 } } }
  },
  "additionalProperties": false
}
