{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://grids365.dev/corpus/language-feature-coverage.schema.json",
  "title": "Grid conversation-corpus controlled feature coverage",
  "type": "object",
  "required": [
    "schemaVersion",
    "generatedBy",
    "language",
    "languageVersion",
    "scope",
    "registry",
    "counts",
    "sourceIdentities",
    "features",
    "gaps"
  ],
  "properties": {
    "schemaVersion": { "const": 1 },
    "generatedBy": { "const": "scripts/generate-language-corpus.mjs" },
    "language": { "const": "Grid" },
    "languageVersion": {
      "type": "string",
      "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
    },
    "scope": {
      "type": "object",
      "required": [
        "includedRecordTypes",
        "excludedRecordTypes",
        "rejectedCandidates",
        "field",
        "semantics"
      ],
      "properties": {
        "includedRecordTypes": {
          "const": [
            "canonical-program",
            "documented-task",
            "verified-behavior"
          ]
        },
        "excludedRecordTypes": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "required": ["recordType", "reason"],
            "properties": {
              "recordType": { "const": "function-case" },
              "reason": { "type": "string", "minLength": 1 }
            },
            "additionalProperties": false
          }
        },
        "rejectedCandidates": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "sourceKey",
              "sourcePath",
              "modelSourceSha256",
              "reason",
              "featureTagsExcluded"
            ],
            "properties": {
              "sourceKey": { "const": "documented-task:5.5" },
              "sourcePath": { "const": "docs/language/ai-agent-guide.md" },
              "modelSourceSha256": { "$ref": "#/$defs/sha256" },
              "reason": { "const": "compiler-error" },
              "featureTagsExcluded": { "const": true }
            },
            "additionalProperties": false
          }
        },
        "field": { "const": "metadata.languageFeatureIds" },
        "semantics": { "type": "string", "minLength": 1 }
      },
      "additionalProperties": false
    },
    "registry": {
      "type": "object",
      "required": [
        "path",
        "sha256",
        "features",
        "authorityLanguageVersion",
        "authoritySourceCommit",
        "authoritySourceCommittedAt",
        "authorityAdditions"
      ],
      "properties": {
        "path": { "const": "corpus/language-features.json" },
        "sha256": { "$ref": "#/$defs/sha256" },
        "features": { "type": "integer", "minimum": 1 },
        "authorityLanguageVersion": {
          "type": "string",
          "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
        },
        "authoritySourceCommit": {
          "type": "string",
          "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$"
        },
        "authoritySourceCommittedAt": {
          "type": "string",
          "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]+)?(?:Z|[+-][0-9]{2}:[0-9]{2})$"
        },
        "authorityAdditions": {
          "$ref": "#/$defs/featureIdList"
        }
      },
      "additionalProperties": false
    },
    "counts": {
      "type": "object",
      "required": [
        "records",
        "taggedRecords",
        "uniqueSources",
        "taggedUniqueSources",
        "coveredFeatures",
        "uncoveredFeatures",
        "statuses",
        "taskTypes"
      ],
      "properties": {
        "records": { "type": "integer", "minimum": 1 },
        "taggedRecords": { "type": "integer", "minimum": 1 },
        "uniqueSources": { "type": "integer", "minimum": 1 },
        "taggedUniqueSources": { "type": "integer", "minimum": 1 },
        "coveredFeatures": { "type": "integer", "minimum": 0 },
        "uncoveredFeatures": { "type": "integer", "minimum": 0 },
        "statuses": {
          "type": "object",
          "required": ["supported", "syntax-only", "diagnostic"],
          "properties": {
            "supported": { "$ref": "#/$defs/statusCount" },
            "syntax-only": { "$ref": "#/$defs/statusCount" },
            "diagnostic": { "$ref": "#/$defs/statusCount" }
          },
          "additionalProperties": false
        },
        "taskTypes": {
          "type": "object",
          "required": ["source-generation", "expected-output"],
          "properties": {
            "source-generation": { "type": "integer", "minimum": 0 },
            "expected-output": { "type": "integer", "minimum": 0 }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    },
    "sourceIdentities": {
      "type": "array",
      "minItems": 1,
      "items": { "$ref": "#/$defs/sourceIdentity" }
    },
    "features": {
      "type": "array",
      "minItems": 1,
      "items": { "$ref": "#/$defs/featureCoverage" }
    },
    "gaps": {
      "type": "object",
      "required": [
        "actionableSupported",
        "syntaxOnly",
        "expectedDiagnostic"
      ],
      "properties": {
        "actionableSupported": { "$ref": "#/$defs/featureIdList" },
        "syntaxOnly": { "$ref": "#/$defs/featureIdList" },
        "expectedDiagnostic": { "$ref": "#/$defs/featureIdList" }
      },
      "additionalProperties": false
    }
  },
  "additionalProperties": false,
  "$defs": {
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "statusCount": {
      "type": "object",
      "required": ["registry", "covered"],
      "properties": {
        "registry": { "type": "integer", "minimum": 0 },
        "covered": { "type": "integer", "minimum": 0 }
      },
      "additionalProperties": false
    },
    "featureIdList": {
      "type": "array",
      "items": {
        "$ref": "https://grids365.dev/corpus/language-feature-id.schema.json?languageVersion=0.65.0&registrySha256=29a712e1353b41dd417a25be887d81d70897e6a3ef4dc7796b17ca6b03579372"
      },
      "uniqueItems": true
    },
    "sourceIdentity": {
      "type": "object",
      "required": [
        "sourceKey",
        "sourcePath",
        "modelSourceSha256",
        "reviewedAt",
        "reviewedAgainstAuthorityCommit"
      ],
      "properties": {
        "sourceKey": { "type": "string", "minLength": 1 },
        "sourcePath": { "type": "string", "minLength": 1 },
        "modelSourceSha256": { "$ref": "#/$defs/sha256" },
        "reviewedAt": { "const": "2026-08-31" },
        "reviewedAgainstAuthorityCommit": {
          "type": "string",
          "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$"
        }
      },
      "additionalProperties": false
    },
    "featureCoverage": {
      "type": "object",
      "required": [
        "id",
        "status",
        "counts",
        "recordIds",
        "lineageIds",
        "sourceKeys"
      ],
      "properties": {
        "id": {
          "$ref": "https://grids365.dev/corpus/language-feature-id.schema.json?languageVersion=0.65.0&registrySha256=29a712e1353b41dd417a25be887d81d70897e6a3ef4dc7796b17ca6b03579372"
        },
        "status": {
          "enum": ["supported", "syntax-only", "diagnostic"]
        },
        "counts": {
          "type": "object",
          "required": [
            "totalRecords",
            "uniqueSources",
            "source-generation",
            "expected-output"
          ],
          "properties": {
            "totalRecords": { "type": "integer", "minimum": 0 },
            "uniqueSources": { "type": "integer", "minimum": 0 },
            "source-generation": { "type": "integer", "minimum": 0 },
            "expected-output": { "type": "integer", "minimum": 0 }
          },
          "additionalProperties": false
        },
        "recordIds": {
          "type": "array",
          "items": { "type": "string", "minLength": 1 },
          "uniqueItems": true
        },
        "lineageIds": {
          "type": "array",
          "items": { "type": "string", "minLength": 1 },
          "uniqueItems": true
        },
        "sourceKeys": {
          "type": "array",
          "items": { "type": "string", "minLength": 1 },
          "uniqueItems": true
        }
      },
      "additionalProperties": false
    }
  }
}
