{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://wanxiang.ai/contracts/play-loop/match3-board-projection.schema.json", "title": "Match3BoardProjectionV1", "description": "Match3BoardProjection/1。只读匿名棋格投影;不包含颜色名、DOM、源码或游戏私有状态。", "type": "object", "required": [ "schemaVersion", "sourceFrameRef", "sourceFrameHash", "targetSetRef", "targetSetHash", "latticeId", "dimensions", "interactionProfileId", "interactionRegistryVersion", "interactionBindingHash", "classifier", "cells", "projectionStatus", "projectionHash" ], "properties": { "schemaVersion": { "const": "Match3BoardProjection/1" }, "sourceFrameRef": { "type": "string", "minLength": 1 }, "sourceFrameHash": { "$ref": "#/$defs/sha256" }, "targetSetRef": { "type": "string", "minLength": 1 }, "targetSetHash": { "$ref": "#/$defs/sha256" }, "latticeId": { "type": "string", "pattern": "^l[0-9]{2}$" }, "dimensions": { "$ref": "#/$defs/dimensions" }, "interactionProfileId": { "const": "match3.orthogonal-swap-v1" }, "interactionRegistryVersion": { "enum": ["2026-07-15.v1", "2026-07-15.v2"] }, "interactionBindingHash": { "$ref": "#/$defs/sha256" }, "classifier": { "$ref": "#/$defs/versionedComponent" }, "cells": { "type": "array", "minItems": 9, "maxItems": 144, "items": { "$ref": "#/$defs/visualCellClass" } }, "projectionStatus": { "enum": ["resolved", "indeterminate"] }, "projectionHash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false, "allOf": [ { "if": { "properties": { "interactionRegistryVersion": { "const": "2026-07-15.v2" } }, "required": ["interactionRegistryVersion"] }, "then": { "properties": { "classifier": { "type": "object", "required": ["id", "version", "configHash"], "properties": { "id": { "const": "deterministic-lab-cell-cluster" }, "version": { "const": "1.1.0" }, "configHash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false } } } } ], "$defs": { "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, "dimensions": { "type": "object", "required": ["rows", "columns"], "properties": { "rows": { "type": "integer", "minimum": 3, "maximum": 12 }, "columns": { "type": "integer", "minimum": 3, "maximum": 12 } }, "additionalProperties": false }, "cell": { "type": "object", "required": ["row", "column"], "properties": { "row": { "type": "integer", "minimum": 1, "maximum": 12 }, "column": { "type": "integer", "minimum": 1, "maximum": 12 } }, "additionalProperties": false }, "versionedComponent": { "type": "object", "required": ["id", "version", "configHash"], "properties": { "id": { "type": "string", "minLength": 1 }, "version": { "type": "string", "minLength": 1 }, "configHash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false }, "alternative": { "type": "object", "required": ["classId", "confidencePermille"], "properties": { "classId": { "type": "string", "pattern": "^vc[0-9]{2,3}$" }, "confidencePermille": { "type": "integer", "minimum": 0, "maximum": 1000 } }, "additionalProperties": false }, "visualCellClass": { "type": "object", "required": [ "cell", "cropHash", "state", "classId", "confidencePermille", "alternatives" ], "properties": { "cell": { "$ref": "#/$defs/cell" }, "cropHash": { "$ref": "#/$defs/sha256" }, "state": { "enum": ["classified", "ambiguous", "unreadable"] }, "classId": { "anyOf": [ { "type": "string", "pattern": "^vc[0-9]{2,3}$" }, { "type": "null" } ] }, "confidencePermille": { "type": "integer", "minimum": 0, "maximum": 1000 }, "alternatives": { "type": "array", "maxItems": 12, "items": { "$ref": "#/$defs/alternative" } } }, "additionalProperties": false, "allOf": [ { "if": { "properties": { "state": { "const": "classified" } }, "required": ["state"] }, "then": { "properties": { "classId": { "type": "string", "pattern": "^vc[0-9]{2,3}$" }, "alternatives": { "maxItems": 0 } } } }, { "if": { "properties": { "state": { "const": "ambiguous" } }, "required": ["state"] }, "then": { "properties": { "classId": { "type": "null" }, "alternatives": { "minItems": 1 } } } }, { "if": { "properties": { "state": { "const": "unreadable" } }, "required": ["state"] }, "then": { "properties": { "classId": { "type": "null" }, "confidencePermille": { "const": 0 }, "alternatives": { "maxItems": 0 } } } } ] } } }