{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://genesiscode.org/spec/normative-form-matrix-v0.1.schema.json",
  "title": "GenesisCode Normative Form Matrix v0.1",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "auditDate",
    "bindingSemantics",
    "canonicalSpec",
    "canonicalSpecSha256",
    "contentIdentitySha256",
    "errorSemantics",
    "forms",
    "kind",
    "nonclaims",
    "patternSemantics",
    "schema",
    "schemaSha256",
    "sourceBindings",
    "specialFormSymbols",
    "version"
  ],
  "properties": {
    "auditDate": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"},
    "bindingSemantics": {
      "type": "object",
      "additionalProperties": false,
      "required": ["functionParameters", "letBindings", "topLevelDefinitions"],
      "properties": {
        "functionParameters": {"const": "symbol-only-unique-nonempty"},
        "letBindings": {"const": "symbol-only-unique-sequential"},
        "topLevelDefinitions": {"const": "symbol-only-sequential-rebinding"}
      }
    },
    "canonicalSpec": {"const": "docs/spec/NORMATIVE_FORM_MATRIX_v0.1.md"},
    "canonicalSpecSha256": {"$ref": "#/$defs/sha256"},
    "contentIdentitySha256": {"$ref": "#/$defs/sha256"},
    "errorSemantics": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "fatalEvaluationFailure",
        "locationAvailability",
        "missingLocation",
        "parseLocationUnit",
        "parseOffsets",
        "protocolId",
        "recoverableLanguageFailure",
        "userForgery"
      ],
      "properties": {
        "fatalEvaluationFailure": {"const": "explicit-kernel-error"},
        "locationAvailability": {
          "type": "object",
          "additionalProperties": false,
          "required": ["canonicalization", "parse", "runtime", "typecheck"],
          "properties": {
            "canonicalization": {"const": "zero-based-module-form-ordinal"},
            "parse": {"const": "exact-byte-offset"},
            "runtime": {"const": "none-on-spanless-coreform"},
            "typecheck": {"const": "module-path-and-diagnostic-ordinal"}
          }
        },
        "missingLocation": {"const": "absent-never-fabricated"},
        "parseLocationUnit": {"const": "utf8-byte-offset"},
        "parseOffsets": {
          "type": "object",
          "additionalProperties": false,
          "required": ["eof", "escape", "invalidInteger", "unexpectedToken", "unterminatedContainer", "unterminatedLiteral"],
          "properties": {
            "eof": {"const": "source-byte-length"},
            "escape": {"const": "backslash-start"},
            "invalidInteger": {"const": "token-start"},
            "unexpectedToken": {"const": "token-start"},
            "unterminatedContainer": {"const": "opening-delimiter"},
            "unterminatedLiteral": {"const": "opening-delimiter"}
          }
        },
        "protocolId": {"const": "genesis/error-v0.2"},
        "recoverableLanguageFailure": {"const": "sealed-error"},
        "userForgery": {"const": "impossible-without-trusted-token"}
      }
    },
    "forms": {
      "type": "array",
      "minItems": 19,
      "maxItems": 19,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "canonicalDisposition",
          "class",
          "effectOps",
          "effectUnknown",
          "evaluation",
          "head",
          "id",
          "preludeRole",
          "scope",
          "source",
          "typeExpectation"
        ],
        "properties": {
          "canonicalDisposition": {"enum": ["atom", "data", "module-definition", "preserved-special", "binary-application"]},
          "class": {"enum": ["application", "collection", "grouping", "literal", "module", "special", "variable"]},
          "effectOps": {"$ref": "#/$defs/stringArray"},
          "effectUnknown": {"type": "boolean"},
          "evaluation": {
            "type": "object",
            "additionalProperties": false,
            "required": ["kind", "value"],
            "properties": {
              "kind": {"enum": ["closure", "data", "seal-token"]},
              "value": {"type": ["string", "null"]}
            }
          },
          "head": {"type": ["string", "null"]},
          "id": {"type": "string", "pattern": "^form/[a-z0-9-]+$"},
          "preludeRole": {"enum": ["none", "ordinary-binding-consumer"]},
          "scope": {"enum": ["expression", "module-only"]},
          "source": {"type": "string", "minLength": 1},
          "typeExpectation": {"enum": ["Bool", "Bytes", "Fn", "Int", "Nil", "Rec", "Str", "?"]}
        }
      }
    },
    "kind": {"const": "genesis/normative-form-matrix-v0.1"},
    "nonclaims": {"$ref": "#/$defs/stringArray"},
    "patternSemantics": {
      "type": "object",
      "additionalProperties": false,
      "required": ["destructuring", "exhaustiveness", "guards", "status", "unknownPatternLikeHeads"],
      "properties": {
        "destructuring": {"const": "unsupported"},
        "exhaustiveness": {"const": "not-applicable"},
        "guards": {"const": "unsupported"},
        "status": {"const": "unsupported"},
        "unknownPatternLikeHeads": {"const": "ordinary-application"}
      }
    },
    "schema": {"const": "docs/spec/NORMATIVE_FORM_MATRIX_v0.1.schema.json"},
    "schemaSha256": {"$ref": "#/$defs/sha256"},
    "sourceBindings": {
      "type": "array",
      "minItems": 8,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["id", "mode", "path"],
        "properties": {
          "id": {"type": "string", "minLength": 1},
          "mode": {"enum": ["canonicalizer", "compiled", "effect-inference", "frontend", "prelude", "reference", "runtime-shared", "selfhost-preview", "type-inference", "wasm-inherited-reference"]},
          "path": {"type": "string", "minLength": 1}
        }
      }
    },
    "specialFormSymbols": {"$ref": "#/$defs/stringArray"},
    "version": {"const": "0.1"}
  },
  "$defs": {
    "sha256": {"type": "string", "pattern": "^[0-9a-f]{64}$"},
    "stringArray": {
      "type": "array",
      "items": {"type": "string", "minLength": 1},
      "uniqueItems": true
    }
  }
}
