{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://wanxiang.ai/contracts/play-loop/interaction-profile-registry-v2.schema.json", "title": "InteractionProfileRegistryV2", "description": "View/4 enforce 专用 registry;v1 继续冻结服务 solver shadow 与 A-C。", "type": "object", "required": ["schemaVersion", "registryVersion", "profiles", "registryHash"], "properties": { "schemaVersion": { "const": "InteractionProfileRegistry/2" }, "registryVersion": { "const": "2026-07-15.v2" }, "profiles": { "type": "object", "required": ["match3.orthogonal-swap-v1"], "properties": { "match3.orthogonal-swap-v1": { "$ref": "#/$defs/profile" } }, "additionalProperties": false }, "registryHash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false, "$defs": { "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, "component": { "type": "object", "required": ["id", "version", "config", "configHash"], "properties": { "id": { "type": "string", "minLength": 1 }, "version": { "const": "1.0.0" }, "config": { "type": "object" }, "configHash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false }, "profile": { "type": "object", "required": [ "id", "genre", "proofProfileId", "templateRoute", "solver", "actorProtocol", "producerCapability", "overlayNormalizer", "equivalenceAlgorithm", "geometryPolicy", "recoveryPolicy" ], "properties": { "id": { "const": "match3.orthogonal-swap-v1" }, "genre": { "const": "puzzle" }, "proofProfileId": { "const": "puzzle.match-board" }, "templateRoute": { "const": "_template-puzzle" }, "solver": { "type": "object", "required": ["id", "version", "config", "configHash"], "properties": { "id": { "const": "match3-orthogonal-swap" }, "version": { "const": "1.0.0" }, "config": { "type": "object", "required": ["adjacency", "requireNewRun", "minRunLength", "pairOrder"], "properties": { "adjacency": { "const": "orthogonal" }, "requireNewRun": { "const": true }, "minRunLength": { "const": 3 }, "pairOrder": { "const": "row-major" } }, "additionalProperties": false }, "configHash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false }, "producerCapability": { "type": "object", "required": ["id", "version", "config", "configHash"], "properties": { "id": { "const": "match3-producer-profile" }, "version": { "const": "1.0.0" }, "config": { "type": "object", "required": ["viewport", "grid", "cellShell", "selectionOverlay", "themeSafeBounds"], "properties": { "viewport": { "type": "object", "required": ["width", "height"], "properties": { "width": { "const": 390 }, "height": { "const": 844 } }, "additionalProperties": false }, "grid": { "type": "object", "required": ["rows", "columns", "pitchPx", "originX", "originY"], "properties": { "rows": { "const": 8 }, "columns": { "const": 8 }, "pitchPx": { "const": 40 }, "originX": { "const": 35 }, "originY": { "const": 120 } }, "additionalProperties": false }, "cellShell": { "type": "object", "required": ["shape", "radiusPx", "fillStyle"], "properties": { "shape": { "const": "circle" }, "radiusPx": { "const": 20 }, "fillStyle": { "const": "#1a1a2e" } }, "additionalProperties": false }, "selectionOverlay": { "type": "object", "required": ["shape", "maskSizePx", "strokeStyle", "expectedChangedPixelCount", "supportMaskHash"], "properties": { "shape": { "const": "pixel-mask-ring" }, "maskSizePx": { "const": 40 }, "strokeStyle": { "const": "#ffffff" }, "expectedChangedPixelCount": { "const": 472 }, "supportMaskHash": { "const": "ea15306223beee4a5d9a1a7b857011d076714c0339451f793e49655a4ec7c18f" } }, "additionalProperties": false }, "themeSafeBounds": { "type": "object", "required": ["insetPx"], "properties": { "insetPx": { "const": 12 } }, "additionalProperties": false } }, "additionalProperties": false }, "configHash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false }, "actorProtocol": { "type": "object", "required": ["viewVersion", "selectionVersion", "prompt", "parser", "resolver"], "properties": { "viewVersion": { "const": "ActorView/4" }, "selectionVersion": { "const": "ActorSelection/2" }, "prompt": { "type": "object", "required": ["id", "version", "artifactRef", "runtimeEligible", "hash"], "properties": { "id": { "const": "playtest.actor.contract-match3-v4" }, "version": { "const": "3.0.1" }, "artifactRef": { "const": "artifacts/playtest-actor-v4.contract.md" }, "runtimeEligible": { "const": false }, "hash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false }, "parser": { "allOf": [ { "$ref": "#/$defs/component" }, { "properties": { "id": { "const": "actor-selection-v2" }, "config": { "type": "object", "required": ["allowedTypes", "unknownFields", "waitMinMs", "waitMaxMs"], "properties": { "allowedTypes": { "const": ["tap", "drag", "key", "wait", "swap_pair"] }, "unknownFields": { "const": "reject" }, "waitMinMs": { "const": 100 }, "waitMaxMs": { "const": 600 } }, "additionalProperties": false } } } ] }, "resolver": { "allOf": [ { "$ref": "#/$defs/component" }, { "properties": { "id": { "const": "match3-pair-resolver" }, "config": { "type": "object", "required": ["dispatch", "actionCount", "secondEndpoint", "repeatActorRequest"], "properties": { "dispatch": { "const": "native-tap-pair" }, "actionCount": { "const": 2 }, "secondEndpoint": { "const": "other-canonical-pair-endpoint" }, "repeatActorRequest": { "const": false } }, "additionalProperties": false } } } ] } }, "additionalProperties": false }, "overlayNormalizer": { "allOf": [ { "$ref": "#/$defs/component" }, { "properties": { "id": { "const": "match3-selection-overlay-normalizer" }, "config": { "type": "object", "required": ["removeSelectionOverlay", "recomputeTargetSetAfterFirstTap"], "properties": { "removeSelectionOverlay": { "const": true }, "recomputeTargetSetAfterFirstTap": { "const": true } }, "additionalProperties": false } } } ] }, "equivalenceAlgorithm": { "allOf": [ { "$ref": "#/$defs/component" }, { "properties": { "id": { "const": "anonymous-cell-equivalence" }, "config": { "type": "object", "required": ["representation", "classIdInvariant", "requireCompleteClassification"], "properties": { "representation": { "const": "pairwise-equality-matrix" }, "classIdInvariant": { "const": true }, "requireCompleteClassification": { "const": true } }, "additionalProperties": false } } } ] }, "geometryPolicy": { "type": "object", "required": ["maxCenterDeltaPx", "requireSameDimensions"], "properties": { "maxCenterDeltaPx": { "const": 0 }, "requireSameDimensions": { "const": true } }, "additionalProperties": false }, "recoveryPolicy": { "type": "object", "required": ["maxActionGroupsPerRoll", "maxResetPerRoll", "selectionReset"], "properties": { "maxActionGroupsPerRoll": { "const": 2 }, "maxResetPerRoll": { "const": 1 }, "selectionReset": { "type": "object", "required": ["type", "strategy", "budgetMs"], "properties": { "type": { "const": "tap" }, "strategy": { "const": "repeat-first-endpoint" }, "budgetMs": { "const": 600 } }, "additionalProperties": false } }, "additionalProperties": false } }, "additionalProperties": false } } }