games-development-ai/contracts/play-loop/judge-package.schema.json
lili cbfd4d871b
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
feat(acceptance): 闭合 playtest v3 与 A+ 可信消费链
固化 Match-3 生产者、视觉、音频与双 Judge 证据闭包。

将《山海行纪》r1.1 绑定新的不可变 release,并以生产预检现场核验 bundle、Registry/2 和 25 项 Writer 快照。

同步地图1平衡锁值、跨游戏回归修复、验收契约与 SoT 证据。
2026-07-28 20:16:13 -07:00

126 lines
6.1 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://wanxiang.ai/contracts/play-loop/judge-package.schema.json",
"title": "JudgePackageV1",
"description": "playtest/3 Judge 唯一可读包;只含 proof 候选和事实投影,不含 interaction、Resolution 或 solver 身份。",
"type": "object",
"required": [
"schemaVersion", "projectionVersion", "packageType", "gameId", "genre",
"templateRoute", "proofProfileId", "proofRegistryVersion", "taskBindingHash",
"acceptanceRequestHash", "evidenceMode", "brief", "artifactHash", "briefHash",
"registry", "proofObligations", "actions", "frames", "gameEvents",
"textReferenceScope", "environment", "floor", "proofRef", "proofHash"
],
"properties": {
"schemaVersion": { "const": "playtest/3" },
"projectionVersion": { "const": "JudgePackage/1" },
"packageType": { "const": "JudgePackage" },
"gameId": { "type": "string", "minLength": 1 },
"genre": { "enum": ["narrative", "trpg", "heritage", "puzzle", "sim-business"] },
"templateRoute": { "type": "string", "pattern": "^_template-[a-z0-9-]+$" },
"proofProfileId": { "type": "string", "pattern": "^[a-z][a-z0-9-]*\\.[a-z][a-z0-9-]*$" },
"proofRegistryVersion": { "type": "string", "minLength": 1 },
"taskBindingHash": { "$ref": "#/$defs/sha256" },
"acceptanceRequestHash": { "$ref": "#/$defs/sha256" },
"evidenceMode": { "const": "native" },
"brief": { "type": "string" },
"artifactHash": { "$ref": "#/$defs/sha256" },
"briefHash": { "$ref": "#/$defs/sha256" },
"registry": {
"type": "object",
"required": [
"schemaVersion", "registryVersion", "proofProfileId", "genre",
"templateRoute", "briefRuleMatches"
],
"properties": {
"schemaVersion": { "const": "proof-obligations/2" },
"registryVersion": { "type": "string", "minLength": 1 },
"proofProfileId": { "type": "string", "minLength": 1 },
"genre": { "type": "string", "minLength": 1 },
"templateRoute": { "type": "string", "minLength": 1 },
"briefRuleMatches": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }
},
"additionalProperties": false
},
"proofObligations": { "type": "array", "items": { "$ref": "#/$defs/candidate" } },
"actions": { "type": "array", "items": { "$ref": "#/$defs/judgeAction" } },
"frames": { "type": "array", "items": { "$ref": "single-roll-fact-v3.schema.json#/$defs/evidenceFrame" } },
"gameEvents": { "type": "array", "items": { "$ref": "game-event.schema.json" } },
"textReferenceScope": {
"type": "object",
"required": ["actionRefs", "frameRefs", "eventRefs"],
"properties": {
"actionRefs": { "type": "array", "items": { "type": "string", "pattern": "^action-[1-9][0-9]*$" }, "uniqueItems": true },
"frameRefs": { "type": "array", "items": { "type": "string", "minLength": 1 }, "uniqueItems": true },
"eventRefs": { "type": "array", "items": { "type": "string", "pattern": "^event:[1-9][0-9]*$" }, "uniqueItems": true }
},
"additionalProperties": false
},
"environment": { "$ref": "playtest-evidence-v3.schema.json#/$defs/environmentV3" },
"floor": { "type": "null" },
"proofRef": { "type": "string", "minLength": 1 },
"proofHash": { "$ref": "#/$defs/sha256" }
},
"additionalProperties": false,
"$defs": {
"sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"candidate": {
"type": "object",
"required": [
"id", "title", "description", "required", "evidence", "candidateOnly",
"candidateState", "candidateProblems", "sequenceRefs", "actionRefs",
"postFrameRefs", "eventRefs", "evidenceRefs", "seenStepTitles", "missingStepTitles"
],
"properties": {
"id": { "type": "string", "minLength": 1 },
"title": { "type": "string" },
"description": { "type": "string" },
"required": { "type": "boolean" },
"evidence": { "$ref": "proof-obligation-registry.schema.json#/$defs/evidence" },
"candidateOnly": { "const": true },
"candidateState": { "enum": ["complete", "contradicted", "missing"] },
"candidateProblems": { "type": "array", "items": { "type": "string" } },
"sequenceRefs": { "type": "array", "items": { "$ref": "playtest-evidence.schema.json#/$defs/sequenceRef" } },
"actionRefs": { "type": "array", "items": { "type": "string" } },
"postFrameRefs": { "type": "array", "items": { "type": "string" } },
"eventRefs": { "type": "array", "items": { "type": "integer" } },
"evidenceRefs": { "type": "array", "items": { "type": "string" } },
"seenStepTitles": { "type": "array", "items": { "type": "string" } },
"missingStepTitles": { "type": "array", "items": { "type": "string" } }
},
"additionalProperties": false
},
"judgeAction": {
"type": "object",
"required": [
"actionId", "normalized", "valid", "preFrameRef", "preFrameHash", "preEventSeq",
"virtualTimeBudgetMs", "postFrameRef", "postFrameHash", "postEventSeq", "gameEvents"
],
"properties": {
"actionId": { "type": "string", "pattern": "^action-[1-9][0-9]*$" },
"normalized": { "$ref": "playtest-evidence.schema.json#/$defs/action" },
"valid": { "type": "boolean" },
"preFrameRef": {
"anyOf": [
{ "$ref": "playtest-evidence.schema.json#/$defs/frameRef" },
{ "type": "null" }
]
},
"preFrameHash": { "$ref": "#/$defs/sha256" },
"preEventSeq": { "type": "integer", "minimum": 0 },
"virtualTimeBudgetMs": { "type": "integer", "minimum": 0 },
"postFrameRef": {
"anyOf": [
{ "$ref": "playtest-evidence.schema.json#/$defs/frameRef" },
{ "type": "null" }
]
},
"postFrameHash": { "$ref": "#/$defs/sha256" },
"postEventSeq": { "type": "integer", "minimum": 0 },
"gameEvents": { "type": "array", "items": { "$ref": "game-event.schema.json" } }
},
"additionalProperties": false
}
}
}