{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://gorce-ai.github.io/termwright/compatibility/schema.json",
  "title": "Termwright framework certification and capability graph bindings",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schemaVersion",
    "frameworks"
  ],
  "properties": {
    "$schema": {
      "type": "string"
    },
    "schemaVersion": {
      "const": 6
    },
    "frameworks": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/framework"
      }
    }
  },
  "$defs": {
    "versionSupport": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "policy",
        "declared",
        "verified"
      ],
      "properties": {
        "policy": {
          "enum": [
            "exact",
            "capability"
          ]
        },
        "declared": {
          "type": "string",
          "minLength": 1
        },
        "verified": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "minLength": 1
          },
          "uniqueItems": true
        }
      }
    },
    "runtime": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "name",
        "version"
      ],
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1
        },
        "version": {
          "type": "string",
          "minLength": 1
        },
        "notes": {
          "type": "string",
          "minLength": 1
        }
      }
    },
    "patchSet": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "name",
        "version",
        "patchSetVersion"
      ],
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1
        },
        "version": {
          "type": "string",
          "minLength": 1
        },
        "patchSetVersion": {
          "type": "integer",
          "minimum": 1
        }
      }
    },
    "variantModule": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "name",
        "version"
      ],
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1
        },
        "version": {
          "type": "string",
          "minLength": 1
        },
        "optional": {
          "type": "boolean"
        }
      }
    },
    "variant": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "frameworkVersion",
        "modules"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1
        },
        "frameworkVersion": {
          "type": "string",
          "minLength": 1
        },
        "modules": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/variantModule"
          }
        }
      }
    },
    "injectionTier": {
      "enum": [
        "T0",
        "T1",
        "T2",
        "T3"
      ]
    },
    "addedUnit": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "target",
        "sourceDigest"
      ],
      "properties": {
        "target": {
          "type": "string",
          "minLength": 1
        },
        "sourceDigest": {
          "type": "string",
          "pattern": "^sha256:[a-f0-9]{64}$"
        }
      }
    },
    "intervention": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "capability",
        "tier",
        "sourcePatching",
        "requiredSymbols",
        "addedUnits",
        "conformanceSuites"
      ],
      "properties": {
        "capability": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9-]*$"
        },
        "tier": {
          "$ref": "#/$defs/injectionTier"
        },
        "sourcePatching": {
          "type": "boolean"
        },
        "versionRange": {
          "type": "string",
          "minLength": 1
        },
        "requiredSymbols": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "minLength": 1
          },
          "uniqueItems": true
        },
        "addedUnits": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/addedUnit"
          },
          "uniqueItems": true
        },
        "conformanceSuites": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "pattern": "^(packages|clients)/.+(?:/tests/|(?:test|spec)[^/]*\\.)[^/]*$"
          },
          "uniqueItems": true
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "tier": {
                "const": "T0"
              }
            }
          },
          "then": {
            "properties": {
              "sourcePatching": {
                "const": false
              },
              "addedUnits": {
                "maxItems": 0
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "tier": {
                "const": "T1"
              }
            }
          },
          "then": {
            "properties": {
              "sourcePatching": {
                "const": false
              },
              "addedUnits": {
                "minItems": 1
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "tier": {
                "const": "T2"
              }
            }
          },
          "then": {
            "properties": {
              "sourcePatching": {
                "const": true
              },
              "addedUnits": {
                "minItems": 1
              }
            }
          }
        }
      ]
    },
    "annotations": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "kind",
        "package",
        "packageVersion",
        "apis",
        "notes"
      ],
      "properties": {
        "kind": {
          "enum": [
            "framework-native",
            "termwright-sdk"
          ]
        },
        "package": {
          "type": "string",
          "minLength": 1
        },
        "packageVersion": {
          "type": "string",
          "minLength": 1
        },
        "apis": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "minLength": 1
          },
          "uniqueItems": true
        },
        "notes": {
          "type": "string",
          "minLength": 1
        }
      }
    },
    "certification": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "ids",
        "adapterVersion",
        "strategy",
        "checksumSources"
      ],
      "properties": {
        "ids": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9-]*@[^/]+/[^/]+$"
          },
          "uniqueItems": true
        },
        "adapterVersion": {
          "type": "string",
          "minLength": 1
        },
        "strategy": {
          "enum": [
            "native-hook",
            "runtime-capability-and-behavior",
            "compile-and-behavioral-capability",
            "checksummed-instrumentation",
            "checksummed-replacement"
          ]
        },
        "checksumSources": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^(packages|clients)/.+\\.json$"
          },
          "uniqueItems": true
        }
      }
    },
    "sessionCapability": {
      "enum": [
        "semantic-tree",
        "stable-identity",
        "intended-geometry",
        "clipped-geometry",
        "painted-region",
        "pointer-geometry",
        "pointer-hit-testing",
        "focus",
        "scroll",
        "render-order",
        "action-strategies",
        "keyboard-input",
        "pointer-input",
        "focus-input",
        "paired-revisions"
      ]
    },
    "probeDegradedCapability": {
      "enum": [
        "semantic-tree",
        "stable-identity",
        "intended-geometry",
        "clipped-geometry",
        "painted-region",
        "pointer-geometry",
        "pointer-hit-testing",
        "focus",
        "scroll",
        "render-order",
        "action-strategies",
        "keyboard-input",
        "pointer-input",
        "focus-input",
        "paired-revisions",
        "inactive-screen-tree",
        "custom-container-enumeration"
      ]
    },
    "probeCapability": {
      "enum": [
        "stable-identity",
        "intended-rect",
        "visible-rect",
        "operations",
        "annotations",
        "frame-begin",
        "paint-order"
      ]
    },
    "adapterCapability": {
      "enum": [
        "tree",
        "intended-geometry",
        "clipped-geometry",
        "states",
        "focus-state",
        "actions",
        "action-recipes",
        "text-ranges",
        "render-revisions",
        "logs",
        "pointer-hit-grid",
        "incremental-tree"
      ]
    },
    "providerCapability": {
      "enum": [
        "pointer-regions",
        "hit-test",
        "focus-state",
        "action-recipes",
        "scroll-state",
        "painted-regions",
        "terminal-input-modes"
      ]
    },
    "runtimePrerequisite": {
      "enum": [
        "writable-pty",
        "terminal-input-modes-authoritative",
        "mouse-reporting-enabled",
        "mouse-motion-enabled",
        "focus-reporting-enabled",
        "committed-observation"
      ]
    },
    "claimId": {
      "enum": [
        "claim.semantic-tree-authoritative",
        "claim.stable-identity-authoritative",
        "claim.intended-geometry-authoritative",
        "claim.clipped-geometry-authoritative",
        "claim.painted-region-authoritative",
        "claim.pointer-region-authoritative",
        "claim.pointer-hit-test-authoritative",
        "claim.focus-authoritative",
        "claim.scroll-authoritative",
        "claim.render-order-authoritative",
        "claim.action-strategy-authoritative",
        "claim.keyboard-real-pty",
        "claim.pointer-real-pty",
        "claim.focus-report-real-pty",
        "claim.paired-revisions",
        "claim.logs-diagnostic"
      ]
    },
    "applicationIntegration": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "providerType",
        "providerCapabilities",
        "capabilities",
        "sdks"
      ],
      "properties": {
        "providerType": {
          "enum": [
            "pointer-evidence",
            "focus-evidence",
            "action-strategy",
            "scroll-evidence",
            "paint-evidence",
            "input-mode-evidence"
          ]
        },
        "providerCapabilities": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/providerCapability"
          },
          "uniqueItems": true
        },
        "capabilities": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/sessionCapability"
          },
          "uniqueItems": true
        },
        "sdks": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "minLength": 1
          },
          "uniqueItems": true
        }
      }
    },
    "inputProviderAlternative": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "providerType",
        "providerCapabilities",
        "sdks"
      ],
      "properties": {
        "providerType": {
          "enum": [
            "pointer-evidence",
            "focus-evidence",
            "action-strategy",
            "scroll-evidence",
            "paint-evidence",
            "input-mode-evidence"
          ]
        },
        "providerCapabilities": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/providerCapability"
          },
          "uniqueItems": true
        },
        "sdks": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "minLength": 1
          },
          "uniqueItems": true
        }
      }
    },
    "inputCapability": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "capability",
        "producerFacts",
        "providerAlternatives",
        "runtimePrerequisites"
      ],
      "properties": {
        "capability": {
          "$ref": "#/$defs/sessionCapability"
        },
        "producerFacts": {
          "type": "array",
          "minItems": 1,
          "items": {
            "enum": [
              "terminal.writable-pty",
              "terminal.input-modes-observable"
            ]
          },
          "uniqueItems": true
        },
        "providerAlternatives": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/inputProviderAlternative"
          }
        },
        "runtimePrerequisites": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/runtimePrerequisite"
          },
          "uniqueItems": true
        }
      }
    },
    "claimBinding": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "files"
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/claimId"
        },
        "files": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "pattern": "^(packages|clients|examples)/.+(?:/tests/|(?:test|spec)[^/]*\\.)[^/]*$"
          },
          "uniqueItems": true
        }
      }
    },
    "capabilityGraphBinding": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "automatic",
        "applicationIntegrated",
        "input",
        "unsupported",
        "claims"
      ],
      "properties": {
        "automatic": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/sessionCapability"
          },
          "uniqueItems": true
        },
        "applicationIntegrated": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/applicationIntegration"
          }
        },
        "input": {
          "type": "array",
          "minItems": 2,
          "items": {
            "$ref": "#/$defs/inputCapability"
          }
        },
        "unsupported": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/sessionCapability"
          },
          "uniqueItems": true
        },
        "claims": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/claimBinding"
          }
        }
      }
    },
    "framework": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "name",
        "frameworkPackage",
        "versions",
        "runtimes",
        "probe",
        "instrumentation",
        "annotations",
        "certification",
        "capabilityGraph",
        "limitations",
        "documentation"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9-]*$"
        },
        "name": {
          "type": "string",
          "minLength": 1
        },
        "frameworkPackage": {
          "type": "string",
          "minLength": 1
        },
        "versions": {
          "$ref": "#/$defs/versionSupport"
        },
        "runtimes": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/runtime"
          }
        },
        "probe": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "package",
            "packageVersion",
            "launch",
            "identityKind",
            "capabilities",
            "adapterCapabilities"
          ],
          "properties": {
            "package": {
              "type": "string",
              "minLength": 1
            },
            "packageVersion": {
              "type": "string",
              "minLength": 1
            },
            "launch": {
              "type": "string",
              "minLength": 1
            },
            "identityKind": {
              "enum": [
                "stable",
                "frame-local",
                "correlated"
              ]
            },
            "capabilities": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/probeCapability"
              },
              "uniqueItems": true
            },
            "adapterCapabilities": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/adapterCapability"
              },
              "uniqueItems": true
            }
          }
        },
        "instrumentation": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "strategy",
            "patchSets",
            "variants",
            "interventions",
            "semanticClass",
            "degradedCapabilities",
            "t3DebtCount"
          ],
          "properties": {
            "strategy": {
              "type": "string",
              "minLength": 1
            },
            "patchSets": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/patchSet"
              }
            },
            "variants": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/variant"
              }
            },
            "interventions": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/intervention"
              }
            },
            "semanticClass": {
              "enum": [
                "A",
                "B"
              ]
            },
            "degradedCapabilities": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/probeDegradedCapability"
              },
              "uniqueItems": true
            },
            "t3DebtCount": {
              "type": "integer",
              "minimum": 0
            }
          }
        },
        "annotations": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/annotations"
            }
          ]
        },
        "certification": {
          "$ref": "#/$defs/certification"
        },
        "capabilityGraph": {
          "$ref": "#/$defs/capabilityGraphBinding"
        },
        "limitations": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "minLength": 1
          },
          "uniqueItems": true
        },
        "documentation": {
          "type": "string",
          "pattern": "^/"
        }
      }
    }
  }
}
