{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://github.com/Seven128/project-tiny-context-harness/schemas/design-resource-symbolic-source-ir-v1.schema.json",
    "title": "Project Tiny Context Symbolic Source IR v1",
    "type": "object",
    "additionalProperties": false,
    "required": ["schema_version", "target_ref", "certificate_scopes"],
    "properties": {
        "schema_version": {
            "const": "design-resource-symbolic-source-ir-v1"
        },
        "target_ref": {
            "$ref": "#/$defs/stableKey"
        },
        "certificate_scopes": {
            "type": "array",
            "minItems": 1,
            "items": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                    "certificate_scope_sha256",
                    "rule_scope_sha256",
                    "regions"
                ],
                "properties": {
                    "certificate_scope_sha256": { "$ref": "#/$defs/sha256" },
                    "rule_scope_sha256": { "$ref": "#/$defs/sha256" },
                    "regions": {
                        "type": "array",
                        "minItems": 1,
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": ["rule_region_sha256", "predicate"],
                            "properties": {
                                "rule_region_sha256": { "$ref": "#/$defs/sha256" },
                                "predicate": { "$ref": "#/$defs/predicate" }
                            }
                        }
                    }
                }
            }
        }
    },
    "$defs": {
        "stableKey": {
            "type": "string",
            "minLength": 1,
            "pattern": "^[a-z0-9][a-z0-9._-]*$"
        },
        "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
        },
        "scalar": {
            "oneOf": [{ "type": "string" }, { "type": "number" }]
        },
        "predicate": {
            "oneOf": [
                {
                    "type": "object",
                    "additionalProperties": false,
                    "required": ["op", "axis_ref", "value"],
                    "properties": {
                        "op": { "const": "eq" },
                        "axis_ref": { "$ref": "#/$defs/stableKey" },
                        "value": { "$ref": "#/$defs/scalar" }
                    }
                },
                {
                    "type": "object",
                    "additionalProperties": false,
                    "required": ["op", "axis_ref", "values"],
                    "properties": {
                        "op": { "const": "in" },
                        "axis_ref": { "$ref": "#/$defs/stableKey" },
                        "values": {
                            "type": "array",
                            "minItems": 1,
                            "items": { "$ref": "#/$defs/scalar" }
                        }
                    }
                },
                {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                        "op",
                        "axis_ref",
                        "minimum",
                        "maximum",
                        "minimum_inclusive",
                        "maximum_inclusive"
                    ],
                    "properties": {
                        "op": { "const": "range" },
                        "axis_ref": { "$ref": "#/$defs/stableKey" },
                        "minimum": { "type": "number" },
                        "maximum": { "type": "number" },
                        "minimum_inclusive": { "type": "boolean" },
                        "maximum_inclusive": { "type": "boolean" }
                    }
                },
                {
                    "type": "object",
                    "additionalProperties": false,
                    "required": ["op", "predicates"],
                    "properties": {
                        "op": { "enum": ["all", "any"] },
                        "predicates": {
                            "type": "array",
                            "minItems": 1,
                            "items": { "$ref": "#/$defs/predicate" }
                        }
                    }
                },
                {
                    "type": "object",
                    "additionalProperties": false,
                    "required": ["op", "predicate"],
                    "properties": {
                        "op": { "const": "not" },
                        "predicate": { "$ref": "#/$defs/predicate" }
                    }
                }
            ]
        }
    }
}
