固化 Match-3 生产者、视觉、音频与双 Judge 证据闭包。 将《山海行纪》r1.1 绑定新的不可变 release,并以生产预检现场核验 bundle、Registry/2 和 25 项 Writer 快照。 同步地图1平衡锁值、跨游戏回归修复、验收契约与 SoT 证据。
1432 lines
44 KiB
JSON
1432 lines
44 KiB
JSON
{
|
||
"schemaVersion": "proof-obligations/2",
|
||
"registryVersion": "2026-07-15.v3",
|
||
"eventContractVersion": "game-event/1",
|
||
"description": "便宜档五个可信模板 profile 的玩法闭环义务。机械层只选择具备动作、动作后截图和版本化业务事件的有序候选;语义成立仍由独立 Judge 和 finalPostguard 复核。",
|
||
"profiles": {
|
||
"narrative.branching-story": {
|
||
"id": "narrative.branching-story",
|
||
"genre": "narrative",
|
||
"templateRoute": "_template-story",
|
||
"description": "分支叙事:作出有后果的选择,并抵达与路径一致的明确结局。",
|
||
"obligations": [
|
||
{
|
||
"id": "narrative.choice-selected",
|
||
"title": "玩家作出有效选择",
|
||
"description": "至少一次选择被游戏接受。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "choice",
|
||
"title": "提交选择",
|
||
"event": {
|
||
"type": "narrative.choice-committed",
|
||
"predicates": [
|
||
{
|
||
"path": "/choiceId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "动作后画面显示选择已生效。"
|
||
},
|
||
{
|
||
"id": "narrative.choice-consequence",
|
||
"title": "选择产生可见后果",
|
||
"description": "选择必须改变后续节点或路径。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "consequence",
|
||
"title": "选择改变节点",
|
||
"event": {
|
||
"type": "narrative.choice-committed",
|
||
"predicates": [
|
||
{
|
||
"op": "changed",
|
||
"beforePath": "/node/before",
|
||
"afterPath": "/node/after"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示新节点、属性变化或不同路径内容。"
|
||
},
|
||
{
|
||
"id": "narrative.ending-reached",
|
||
"title": "抵达明确结局",
|
||
"description": "必须进入带明确结果的结局页。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "ending",
|
||
"title": "抵达结局",
|
||
"event": {
|
||
"type": "narrative.ending-reached",
|
||
"predicates": [
|
||
{
|
||
"path": "/endingId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/outcome",
|
||
"op": "oneOf",
|
||
"value": [
|
||
"win",
|
||
"lose"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图可读出结局标题或明确的故事结束状态。"
|
||
},
|
||
{
|
||
"id": "narrative.ending-branch-consistent",
|
||
"title": "结局与已走分支一致",
|
||
"description": "Judge 用选择与结局两个有序步骤核对路径一致性。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "choice",
|
||
"title": "提交分支选择",
|
||
"event": {
|
||
"type": "narrative.choice-committed",
|
||
"predicates": [
|
||
{
|
||
"path": "/branchId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
},
|
||
{
|
||
"stepId": "ending",
|
||
"title": "抵达分支结局",
|
||
"event": {
|
||
"type": "narrative.ending-reached",
|
||
"predicates": [
|
||
{
|
||
"path": "/branchId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
],
|
||
"sameValue": [
|
||
{
|
||
"path": "/branchId",
|
||
"stepIds": [
|
||
"choice",
|
||
"ending"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "结局文案与本局选择和事件路径没有矛盾。"
|
||
},
|
||
{
|
||
"id": "narrative.ending-gallery-visible",
|
||
"title": "结局图鉴可见",
|
||
"description": "brief 要求图鉴时,结局页必须显示解锁状态。",
|
||
"defaultRequired": false,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "gallery",
|
||
"title": "显示结局图鉴",
|
||
"event": {
|
||
"type": "narrative.gallery-updated",
|
||
"predicates": [
|
||
{
|
||
"path": "/unlockedCount",
|
||
"op": "gt",
|
||
"value": 0
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图能看见图鉴及已解锁数量。"
|
||
}
|
||
],
|
||
"interactionOptionalRules": [],
|
||
"briefOptionalRules": [
|
||
{
|
||
"id": "narrative-ending-gallery",
|
||
"description": "brief 提到多结局或结局图鉴时提升图鉴义务。",
|
||
"when": {
|
||
"anyKeywords": [
|
||
"多结局",
|
||
"结局图鉴",
|
||
"收集结局",
|
||
"多个结局"
|
||
]
|
||
},
|
||
"requireObligationIds": [
|
||
"narrative.ending-gallery-visible"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"trpg.dice-tower": {
|
||
"id": "trpg.dice-tower",
|
||
"genre": "trpg",
|
||
"templateRoute": "_template-trpg",
|
||
"description": "掷骰爬塔:进入战斗、完成真实结算、击杀并翻层;按 brief 覆盖升级闭环。",
|
||
"obligations": [
|
||
{
|
||
"id": "trpg.battle-entered",
|
||
"title": "进入真实战斗",
|
||
"description": "从菜单进入有敌我状态的战斗场景。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "battle",
|
||
"title": "进入战斗",
|
||
"event": {
|
||
"type": "trpg.battle-entered",
|
||
"predicates": [
|
||
{
|
||
"path": "/enemyId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图同时显示玩家、敌人状态和可操作战斗控件。"
|
||
},
|
||
{
|
||
"id": "trpg.attack-resolved",
|
||
"title": "一次攻防结算改变状态",
|
||
"description": "攻击后敌我状态真实变化。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "combat",
|
||
"title": "完成攻防结算",
|
||
"event": {
|
||
"type": "trpg.combat-resolved",
|
||
"predicates": [
|
||
{
|
||
"op": "changed",
|
||
"beforePath": "/encounterState/before",
|
||
"afterPath": "/encounterState/after"
|
||
},
|
||
{
|
||
"path": "/outcome",
|
||
"op": "oneOf",
|
||
"value": [
|
||
"success",
|
||
"critical",
|
||
"failure"
|
||
]
|
||
},
|
||
{
|
||
"path": "/heroHp",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "动作后至少一个战斗数值与动作前不同。"
|
||
},
|
||
{
|
||
"id": "trpg.enemy-killed",
|
||
"title": "击杀至少一个敌人",
|
||
"description": "出现明确敌人击败事件。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "kill",
|
||
"title": "击败敌人",
|
||
"event": {
|
||
"type": "trpg.enemy-defeated",
|
||
"predicates": [
|
||
{
|
||
"path": "/enemyId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示敌人消失、击败提示或胜利状态。"
|
||
},
|
||
{
|
||
"id": "trpg.floor-advanced",
|
||
"title": "击杀后翻到下一层",
|
||
"description": "击杀必须在之后带来楼层增长。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "kill",
|
||
"title": "击败敌人",
|
||
"event": {
|
||
"type": "trpg.enemy-defeated",
|
||
"predicates": [
|
||
{
|
||
"path": "/enemyId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/sourceFloorVisitId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
},
|
||
{
|
||
"stepId": "next-floor",
|
||
"title": "进入下一层",
|
||
"event": {
|
||
"type": "trpg.floor-entered",
|
||
"predicates": [
|
||
{
|
||
"op": "increased",
|
||
"beforePath": "/floor/before",
|
||
"afterPath": "/floor/after"
|
||
},
|
||
{
|
||
"path": "/sourceFloorVisitId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag",
|
||
"wait"
|
||
]
|
||
}
|
||
],
|
||
"sameValue": [
|
||
{
|
||
"path": "/sourceFloorVisitId",
|
||
"stepIds": [
|
||
"kill",
|
||
"next-floor"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图中的层数或敌人已与击杀前不同。"
|
||
},
|
||
{
|
||
"id": "trpg.level-increased",
|
||
"title": "角色等级提升",
|
||
"description": "brief 只要求普通升级时,证明等级真实增长而不强制天赋选择。",
|
||
"defaultRequired": false,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "level",
|
||
"title": "等级提升",
|
||
"event": {
|
||
"type": "trpg.level-increased",
|
||
"predicates": [
|
||
{
|
||
"path": "/upgradeId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"op": "increased",
|
||
"beforePath": "/level/before",
|
||
"afterPath": "/level/after"
|
||
}
|
||
]
|
||
},
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
],
|
||
"postScreenshotRequired": true
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示角色等级或能力数值提升。"
|
||
},
|
||
{
|
||
"id": "trpg.talent-selected",
|
||
"title": "升级时成功选择天赋",
|
||
"description": "brief 要求升级时选择可用天赋。",
|
||
"defaultRequired": false,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "talent",
|
||
"title": "选择天赋",
|
||
"event": {
|
||
"type": "trpg.talent-selected",
|
||
"predicates": [
|
||
{
|
||
"path": "/upgradeId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/talentId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
],
|
||
"postScreenshotRequired": true
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示已选天赋或能力变化。"
|
||
},
|
||
{
|
||
"id": "trpg.returned-after-upgrade",
|
||
"title": "升级后返回下一层",
|
||
"description": "同一次升级中等级增长、选择天赋并返回更高楼层。",
|
||
"defaultRequired": false,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "level",
|
||
"title": "等级提升",
|
||
"event": {
|
||
"type": "trpg.level-increased",
|
||
"predicates": [
|
||
{
|
||
"path": "/upgradeId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"op": "increased",
|
||
"beforePath": "/level/before",
|
||
"afterPath": "/level/after"
|
||
}
|
||
]
|
||
},
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
],
|
||
"postScreenshotRequired": true
|
||
},
|
||
{
|
||
"stepId": "talent",
|
||
"title": "选择天赋",
|
||
"event": {
|
||
"type": "trpg.talent-selected",
|
||
"predicates": [
|
||
{
|
||
"path": "/upgradeId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/talentId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
],
|
||
"postScreenshotRequired": true
|
||
},
|
||
{
|
||
"stepId": "next-floor",
|
||
"title": "返回下一层战斗",
|
||
"event": {
|
||
"type": "trpg.floor-entered",
|
||
"predicates": [
|
||
{
|
||
"path": "/upgradeId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"op": "increased",
|
||
"beforePath": "/floor/before",
|
||
"afterPath": "/floor/after"
|
||
}
|
||
]
|
||
},
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag",
|
||
"wait"
|
||
],
|
||
"postScreenshotRequired": true
|
||
}
|
||
],
|
||
"sameValue": [
|
||
{
|
||
"path": "/upgradeId",
|
||
"stepIds": [
|
||
"level",
|
||
"talent",
|
||
"next-floor"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图依次显示等级提升、已选天赋和下一层战斗,且不是停留在升级页。"
|
||
}
|
||
],
|
||
"interactionOptionalRules": [],
|
||
"briefOptionalRules": [
|
||
{
|
||
"id": "trpg-level-up",
|
||
"description": "brief 只要求普通升级时提升等级增长义务。",
|
||
"when": {
|
||
"anyKeywords": [
|
||
"升级",
|
||
"等级提升",
|
||
"level up"
|
||
]
|
||
},
|
||
"requireObligationIds": [
|
||
"trpg.level-increased"
|
||
]
|
||
},
|
||
{
|
||
"id": "trpg-talent-choice",
|
||
"description": "brief 明确天赋或三选一时才提升天赋选择与返回战斗义务。",
|
||
"when": {
|
||
"anyKeywords": [
|
||
"天赋",
|
||
"三选一",
|
||
"talent"
|
||
]
|
||
},
|
||
"requireObligationIds": [
|
||
"trpg.level-increased",
|
||
"trpg.talent-selected",
|
||
"trpg.returned-after-upgrade"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"heritage.ordered-craft": {
|
||
"id": "heritage.ordered-craft",
|
||
"genre": "heritage",
|
||
"templateRoute": "_template-feiyi",
|
||
"description": "有序工序制作:同一作品完整完成 3–12 道独立工序,再形成一致汇总和已评分成品。",
|
||
"obligations": [
|
||
{
|
||
"id": "heritage.ordered-craft-completed",
|
||
"title": "完整工序产生已评分成品",
|
||
"description": "同一作品的全部工序按 1..N 完成且每步有判定,随后汇总全部完成并产生成品与评分。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"orderedSeries": {
|
||
"seriesId": "craft-step",
|
||
"title": "逐道完成工序",
|
||
"event": {
|
||
"type": "heritage.step-completed",
|
||
"predicates": [
|
||
{
|
||
"path": "/workId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/stepId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/stepIndex",
|
||
"op": "gte",
|
||
"value": 1
|
||
},
|
||
{
|
||
"path": "/totalSteps",
|
||
"op": "gte",
|
||
"value": 3
|
||
},
|
||
{
|
||
"path": "/totalSteps",
|
||
"op": "lte",
|
||
"value": 12
|
||
},
|
||
{
|
||
"path": "/judgement",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
],
|
||
"postScreenshotRequired": true,
|
||
"groupByPath": "/workId",
|
||
"indexPath": "/stepIndex",
|
||
"itemIdPath": "/stepId",
|
||
"totalPath": "/totalSteps",
|
||
"judgementPath": "/judgement",
|
||
"minItems": 3,
|
||
"maxItems": 12,
|
||
"summary": {
|
||
"stepId": "summary",
|
||
"title": "确认全部工序完成",
|
||
"event": {
|
||
"type": "heritage.craft-completed",
|
||
"predicates": [
|
||
{
|
||
"path": "/workId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/totalSteps",
|
||
"op": "gte",
|
||
"value": 3
|
||
},
|
||
{
|
||
"path": "/totalSteps",
|
||
"op": "lte",
|
||
"value": 12
|
||
},
|
||
{
|
||
"path": "/orderedStepIds",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/allStepsCompleted",
|
||
"op": "equals",
|
||
"value": true
|
||
}
|
||
]
|
||
},
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
],
|
||
"postScreenshotRequired": true,
|
||
"groupByPath": "/workId",
|
||
"totalPath": "/totalSteps",
|
||
"orderedItemIdsPath": "/orderedStepIds",
|
||
"completedPath": "/allStepsCompleted"
|
||
},
|
||
"terminal": {
|
||
"stepId": "terminal",
|
||
"title": "产生成品并评分",
|
||
"event": {
|
||
"type": "heritage.product-completed",
|
||
"predicates": [
|
||
{
|
||
"path": "/workId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/score",
|
||
"op": "gte",
|
||
"value": 0
|
||
},
|
||
{
|
||
"path": "/works",
|
||
"op": "gt",
|
||
"value": 0
|
||
}
|
||
]
|
||
},
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
],
|
||
"postScreenshotRequired": true,
|
||
"groupByPath": "/workId",
|
||
"scorePath": "/score",
|
||
"worksPath": "/works"
|
||
}
|
||
}
|
||
},
|
||
"visualCheck": "逐步截图显示每道工序的可见判定;收尾截图显示全部工序完成、成品数量大于零且评分可读。"
|
||
}
|
||
],
|
||
"interactionOptionalRules": [],
|
||
"briefOptionalRules": []
|
||
},
|
||
"puzzle.match-board": {
|
||
"id": "puzzle.match-board",
|
||
"genre": "puzzle",
|
||
"templateRoute": "_template-puzzle",
|
||
"description": "匹配盘面解谜:合法操作改变盘面,达成目标并记录关卡结果。",
|
||
"obligations": [
|
||
{
|
||
"id": "puzzle.legal-move",
|
||
"title": "合法操作改变盘面",
|
||
"description": "至少一次合法操作改变盘面。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "move",
|
||
"title": "改变盘面",
|
||
"event": {
|
||
"type": "puzzle.move-applied",
|
||
"predicates": [
|
||
{
|
||
"op": "changed",
|
||
"beforePath": "/boardHash/before",
|
||
"afterPath": "/boardHash/after"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "动作前后盘面存在与操作一致的变化。"
|
||
},
|
||
{
|
||
"id": "puzzle.goal-state",
|
||
"title": "最终盘面满足目标",
|
||
"description": "最终盘面真实满足当前关卡目标。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "goal",
|
||
"title": "达成目标",
|
||
"event": {
|
||
"type": "puzzle.goal-reached",
|
||
"predicates": [
|
||
{
|
||
"path": "/goalId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "Judge 按画面与规则核对目标成立。"
|
||
},
|
||
{
|
||
"id": "puzzle.level-completed",
|
||
"title": "出现关卡完成事件",
|
||
"description": "游戏明确确认当前关卡完成。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "complete",
|
||
"title": "完成关卡",
|
||
"event": {
|
||
"type": "puzzle.level-completed",
|
||
"predicates": [
|
||
{
|
||
"path": "/level",
|
||
"op": "gt",
|
||
"value": 0
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示通关、下一关或完成页。"
|
||
},
|
||
{
|
||
"id": "puzzle.result-recorded",
|
||
"title": "记录通关成绩",
|
||
"description": "通关后记录步数、星级、时间或得分。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "result",
|
||
"title": "记录成绩",
|
||
"event": {
|
||
"type": "puzzle.level-completed",
|
||
"predicates": [
|
||
{
|
||
"path": "/result",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图能读出本关成绩且与事件一致。"
|
||
},
|
||
{
|
||
"id": "puzzle.match3-valid-swap",
|
||
"title": "完成一次标准三消有效交换",
|
||
"description": "仅在可信标准 Match-3 interaction binding 核验后,证明第二次点击同步提交交换并形成新三连。",
|
||
"defaultRequired": false,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "swap-committed",
|
||
"title": "提交交换",
|
||
"event": {
|
||
"type": "puzzle.swap-committed",
|
||
"predicates": [
|
||
{ "path": "/moveId", "op": "exists" },
|
||
{
|
||
"op": "increased",
|
||
"beforePath": "/boardRevisionBefore",
|
||
"afterPath": "/boardRevisionAfter"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": ["tap"]
|
||
},
|
||
{
|
||
"stepId": "match-formed",
|
||
"title": "形成新三连",
|
||
"event": {
|
||
"type": "puzzle.match-formed",
|
||
"predicates": [
|
||
{ "path": "/moveId", "op": "exists" },
|
||
{ "path": "/matchedCount", "op": "gte", "value": 3 }
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": ["tap"]
|
||
}
|
||
],
|
||
"sameValue": [
|
||
{
|
||
"path": "/moveId",
|
||
"stepIds": ["swap-committed", "match-formed"]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "第二次点击后的画面显示棋盘已结算,且与交换提交和新三连事件一致。"
|
||
},
|
||
{
|
||
"id": "puzzle.hint-shown",
|
||
"title": "卡壳提示真实可用",
|
||
"description": "brief 要求提示时,触发后出现可执行提示。",
|
||
"defaultRequired": false,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "hint",
|
||
"title": "显示提示",
|
||
"event": {
|
||
"type": "puzzle.hint-shown",
|
||
"predicates": [
|
||
{
|
||
"path": "/hintId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示具体提示或高亮动作。"
|
||
},
|
||
{
|
||
"id": "puzzle.next-level-entered",
|
||
"title": "进入下一关",
|
||
"description": "brief 要求递进时,完成后进入更高关卡。",
|
||
"defaultRequired": false,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "complete",
|
||
"title": "完成当前关",
|
||
"event": {
|
||
"type": "puzzle.level-completed",
|
||
"predicates": [
|
||
{
|
||
"path": "/level",
|
||
"op": "gt",
|
||
"value": 0
|
||
},
|
||
{
|
||
"path": "/sourceLevelVisitId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
},
|
||
{
|
||
"stepId": "next-level",
|
||
"title": "进入下一关",
|
||
"event": {
|
||
"type": "puzzle.level-entered",
|
||
"predicates": [
|
||
{
|
||
"op": "increased",
|
||
"beforePath": "/level/before",
|
||
"afterPath": "/level/after"
|
||
},
|
||
{
|
||
"path": "/sourceLevelVisitId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag",
|
||
"wait"
|
||
]
|
||
}
|
||
],
|
||
"sameValue": [
|
||
{
|
||
"path": "/sourceLevelVisitId",
|
||
"stepIds": [
|
||
"complete",
|
||
"next-level"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示关卡编号、规则或盘面复杂度增加。"
|
||
}
|
||
],
|
||
"interactionOptionalRules": [
|
||
{
|
||
"id": "puzzle-match3-standard-swap",
|
||
"description": "可信标准 Match-3 binding 提升一次有效交换义务。",
|
||
"interactionProfileId": "match3.orthogonal-swap-v1",
|
||
"requireObligationIds": ["puzzle.match3-valid-swap"]
|
||
}
|
||
],
|
||
"briefOptionalRules": [
|
||
{
|
||
"id": "puzzle-hint",
|
||
"description": "brief 提到卡壳提示时提升提示义务。",
|
||
"when": {
|
||
"anyKeywords": [
|
||
"卡壳",
|
||
"提示",
|
||
"hint"
|
||
]
|
||
},
|
||
"requireObligationIds": [
|
||
"puzzle.hint-shown"
|
||
]
|
||
},
|
||
{
|
||
"id": "puzzle-progression",
|
||
"description": "brief 提到逐关递进或下一关时提升递进义务。",
|
||
"when": {
|
||
"anyKeywords": [
|
||
"逐关递进",
|
||
"多关",
|
||
"下一关",
|
||
"规则递进"
|
||
]
|
||
},
|
||
"requireObligationIds": [
|
||
"puzzle.next-level-entered"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"sim-business.recipe-fulfillment": {
|
||
"id": "sim-business.recipe-fulfillment",
|
||
"genre": "sim-business",
|
||
"templateRoute": "_template-shop",
|
||
"description": "配方履约经营:读取订单、按单选择、成功交付、获得正营收并形成一致结算。",
|
||
"obligations": [
|
||
{
|
||
"id": "sim-business.order-read",
|
||
"title": "读取一份有效订单",
|
||
"description": "出现带配方要求的订单。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "order",
|
||
"title": "读取订单",
|
||
"event": {
|
||
"type": "sim-business.order-presented",
|
||
"predicates": [
|
||
{
|
||
"path": "/orderId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/recipeId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag",
|
||
"wait"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图可读出当前订单的配方要求。"
|
||
},
|
||
{
|
||
"id": "sim-business.recipe-selected",
|
||
"title": "按订单完成配方选择",
|
||
"description": "选择事件包含订单和配方标识。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "recipe",
|
||
"title": "选择配方",
|
||
"event": {
|
||
"type": "sim-business.recipe-selected",
|
||
"predicates": [
|
||
{
|
||
"path": "/orderId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/recipeId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示已选项,Judge 与订单画面核对一致。"
|
||
},
|
||
{
|
||
"id": "sim-business.delivery-succeeded",
|
||
"title": "成功交付正确商品",
|
||
"description": "订单、配方选择和成功交付按序发生。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "order",
|
||
"title": "读取订单",
|
||
"event": {
|
||
"type": "sim-business.order-presented",
|
||
"predicates": [
|
||
{
|
||
"path": "/orderId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/recipeId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag",
|
||
"wait"
|
||
]
|
||
},
|
||
{
|
||
"stepId": "recipe",
|
||
"title": "选择配方",
|
||
"event": {
|
||
"type": "sim-business.recipe-selected",
|
||
"predicates": [
|
||
{
|
||
"path": "/orderId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/recipeId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
},
|
||
{
|
||
"stepId": "serve",
|
||
"title": "成功交付",
|
||
"event": {
|
||
"type": "sim-business.order-served",
|
||
"predicates": [
|
||
{
|
||
"path": "/orderId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/recipeId",
|
||
"op": "exists"
|
||
},
|
||
{
|
||
"path": "/success",
|
||
"op": "equals",
|
||
"value": true
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
],
|
||
"sameValue": [
|
||
{
|
||
"path": "/orderId",
|
||
"stepIds": [
|
||
"order",
|
||
"recipe",
|
||
"serve"
|
||
]
|
||
},
|
||
{
|
||
"path": "/recipeId",
|
||
"stepIds": [
|
||
"order",
|
||
"recipe",
|
||
"serve"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示顾客满意、订单完成或商品被接收。"
|
||
},
|
||
{
|
||
"id": "sim-business.revenue-positive",
|
||
"title": "成功订单产生正营收",
|
||
"description": "成功交付后产生正营收。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "revenue",
|
||
"title": "获得正营收",
|
||
"event": {
|
||
"type": "sim-business.order-served",
|
||
"predicates": [
|
||
{
|
||
"path": "/revenueDelta",
|
||
"op": "gt",
|
||
"value": 0
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示金额或成功订单数大于零。"
|
||
},
|
||
{
|
||
"id": "sim-business.settlement-consistent",
|
||
"title": "结算与业务事件一致",
|
||
"description": "成功交付后进入含正订单数与金额的结算,跨事件一致性由 Judge 核对。",
|
||
"defaultRequired": true,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "serve",
|
||
"title": "成功交付",
|
||
"event": {
|
||
"type": "sim-business.order-served",
|
||
"predicates": [
|
||
{
|
||
"path": "/success",
|
||
"op": "equals",
|
||
"value": true
|
||
},
|
||
{
|
||
"path": "/dayId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
},
|
||
{
|
||
"stepId": "settlement",
|
||
"title": "形成结算",
|
||
"event": {
|
||
"type": "sim-business.settlement-recorded",
|
||
"predicates": [
|
||
{
|
||
"path": "/served",
|
||
"op": "gt",
|
||
"value": 0
|
||
},
|
||
{
|
||
"path": "/currency",
|
||
"op": "gt",
|
||
"value": 0
|
||
},
|
||
{
|
||
"path": "/dayId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag",
|
||
"wait"
|
||
]
|
||
}
|
||
],
|
||
"sameValue": [
|
||
{
|
||
"path": "/dayId",
|
||
"stepIds": [
|
||
"serve",
|
||
"settlement"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "结算截图的订单数和金额与业务事件账一致。"
|
||
},
|
||
{
|
||
"id": "sim-business.product-unlocked",
|
||
"title": "收入解锁新品",
|
||
"description": "brief 要求新品时出现可见解锁。",
|
||
"defaultRequired": false,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "product",
|
||
"title": "解锁新品",
|
||
"event": {
|
||
"type": "sim-business.product-unlocked",
|
||
"predicates": [
|
||
{
|
||
"path": "/productId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示新品从锁定变为可用。"
|
||
},
|
||
{
|
||
"id": "sim-business.equipment-unlocked",
|
||
"title": "收入解锁自动设备",
|
||
"description": "brief 要求设备时出现设备解锁。",
|
||
"defaultRequired": false,
|
||
"evidence": {
|
||
"sequence": [
|
||
{
|
||
"stepId": "equipment",
|
||
"title": "解锁设备",
|
||
"event": {
|
||
"type": "sim-business.equipment-unlocked",
|
||
"predicates": [
|
||
{
|
||
"path": "/equipmentId",
|
||
"op": "exists"
|
||
}
|
||
]
|
||
},
|
||
"postScreenshotRequired": true,
|
||
"allowedActionTypes": [
|
||
"tap",
|
||
"key",
|
||
"drag"
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"visualCheck": "截图显示自动设备已解锁或启用。"
|
||
}
|
||
],
|
||
"interactionOptionalRules": [],
|
||
"briefOptionalRules": [
|
||
{
|
||
"id": "sim-business-product-unlock",
|
||
"description": "brief 提到新品解锁时提升新品义务。",
|
||
"when": {
|
||
"anyKeywords": [
|
||
"解锁新品",
|
||
"新品",
|
||
"新配方"
|
||
]
|
||
},
|
||
"requireObligationIds": [
|
||
"sim-business.product-unlocked"
|
||
]
|
||
},
|
||
{
|
||
"id": "sim-business-equipment-unlock",
|
||
"description": "brief 提到自动设备时提升设备义务。",
|
||
"when": {
|
||
"anyKeywords": [
|
||
"自动出杯",
|
||
"自动设备",
|
||
"设备升级"
|
||
]
|
||
},
|
||
"requireObligationIds": [
|
||
"sim-business.equipment-unlocked"
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
}
|