修「gate 通过≠人能玩」盲区(feie-005 实证:过九门+富三门却棋盘渲染空 + 8s 耐心人玩不了)。 补齐 D 族三层校验,全 advisory(写 verdict 不碰 decision;自带 Goodhart 守护:advisory 全挂也不翻 decision): - 人可玩门(play-phaser.cdp.cjs):render-reflects-state(状态有 item→该格 canvas 像素须非空) + render-sanity(无 [object Object]/undefined/NaN 漏底文本)+ human-timing(订单耐心 ≥ HUMAN_MIN_PATIENCE_MS=12000·★directional) - L2 设计符合 full(run.py compute_l2_signals):systemsPresent/mergeDag/ordersReachable/economyConsistent 四硬判据, 从落盘源工程确定性算(替桩) - L3 升门判据(run.py derive_l3_egregious + studio.py):消费 humanPlayability 的恶性渲染失败→suggestFatal 信号 - schema additive:humanPlayability 段 + L2.mismatches + L3.egregiousRenderFailure 离线验证:py_compile / node --check / JSON 合法 / 24 断言单测(含 Goodhart 守护:advisory 全挂 decision 字节不变)/ 金标 L2 离线 passed=True + 反例精确报错。 **fatal 提升 + 金标冒烟集成验证待 mini-desktop**:确认金标仍 ACCEPT(新检查不抛、全 pass)+ feie-005 被挂后, 逐条提 fatal(品类限定有 board/orders 档)。校准数据:金标 patience=16-20s / feie-005=8s / 阈值候选 12s。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
350 lines
24 KiB
JSON
350 lines
24 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://wanxiang.ai/contracts/agent-loop/tier2-verdict.schema.json",
|
|
"title": "Tier2Verdict",
|
|
"description": "tier2 富游戏自治生成线的验收终判契约(A5)。【为什么 fork 而非扩】现行 verdict.schema.json 死锁在 Tier0/1 模板闭环:round enum[0,1](tier2 ReAct 多轮远超 1)、structureOk 语义=config 通过模板 schema、全篇 additionalProperties:false → 根本无法 additive 扩(design §A5)。故 fork 一份独立 schema,与 A3 另立独立 source-project schema 同口径。【保留的 verdict 元协议·引擎无关不让步】decision 三值 accept/fix/kill + severity 分级 + 机器判禁自评纪律——由裁决引擎 judge 纯代码产出(无 LLM;铁律『出题的和被考的绝不能是同一只模型』、『agent 自述一律不作证据』,所有 playReport/gate 结果均由编排器代码对 CDP 捕获原始数据计算,截图只取证绝不进硬门判定)。【放开/换掉的】round 放开为多轮(≥0 无上限,ReAct cur_iter);structureOk 换成源工程校验(tier2-source-project.schema.json 通过 + esbuild 构建通过,非模板 schema);加三层校验 L1/L2/L3 段(创始人定:L1 硬约束必解循环 / L2 设计符合尽量解 observe→enforce / L3 效果只评分绝不阻塞防 Goodhart);加富游戏专属三门(三联动/经济/latch)。【初期只焊 L1】spike 初期 decision 只由 L1(九门+富游戏三门全绿)裁定;L2 observe-only(不计 pass)、L3 永不当门。状态=建(待 0号 spike;plan003 U6)。详见 docs/architecture/架构/生成引擎/tier2细节图说-D-三层校验与九门.md。",
|
|
"type": "object",
|
|
"required": ["designId", "taskId", "decision", "structureOk", "runnableOk", "round", "layerResults", "findings", "reasons", "evidence"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"designId": {
|
|
"description": "对应设计稿 id(sha256 64 位小写 hex),账本幂等重放键。口径同现行 verdict.designId。",
|
|
"type": "string",
|
|
"pattern": "^[a-f0-9]{64}$"
|
|
},
|
|
"taskId": {
|
|
"description": "后端生成任务 ID。JSON 传输形态兼容数字与字符串(防 JS 精度丢失),两形态均合法。",
|
|
"type": ["integer", "string"]
|
|
},
|
|
"versionId": {
|
|
"description": "游戏版本 ID,可选:仅回调落库成功后存在;decision=accept 时必含(顶层 allOf 强制)。tier2 长生命周期项目同一 gameId 改源重建会产出多个 versionId(对接 A3.5 版本寻址)。",
|
|
"type": ["integer", "string"]
|
|
},
|
|
"decision": {
|
|
"description": "终判三值(verdict 元协议·引擎无关不让步):accept=structureOk∧runnableOk∧L1 全绿(九门+富游戏三门)∧无 P0/P1 残留,进发布段;fix=有可修问题(L1 未过/对抗 P1),回 ReAct 循环让 agent 改、不计为成败终态(round 不设硬上限,由四道熔断兜底);kill=源工程多次构建不过/对抗 P0 即杀/熔断触发(步数硬顶/预算闸/卡死/超时)/实玩重试后仍不可运行。注意:tier2 多轮自治下 fix 是循环内常态(agent 自调工具改),最终落 accept 或 kill。",
|
|
"type": "string",
|
|
"enum": ["accept", "fix", "kill"]
|
|
},
|
|
"structureOk": {
|
|
"description": "结构层判定(换掉 Tier0/1 的『config 通过模板 schema』):源工程通过 tier2-source-project.schema.json 校验(fileTree/entry/import 图无环)∧ 各文件 node --check 语法通过 ∧ esbuild 构建通过。由 judge 纯代码确定性产出。",
|
|
"type": "boolean"
|
|
},
|
|
"runnableOk": {
|
|
"description": "可运行层判定(L1 九门聚合):真浏览器真玩,九门(A_boot/B_uncaught/C_frame/D_render/E_live/F_wiring/G_input/H_progress/I_control)全绿(advisory 门按 driven 感知分级,见 gateResults)。由编排器对 CDP 捕获原始数据计算,零 LLM、零 agent 自评。",
|
|
"type": "boolean"
|
|
},
|
|
"round": {
|
|
"description": "终判时的 ReAct 轮次(cur_iter,放开为多轮:≥0 无 enum 上限,对照现行 verdict 的 enum[0,1] 已废)。实玩重试不计入。tier2 自治多轮的轮次记录,熔断步数硬顶(建议单系统≤8 轮/整局≤40 轮)由 middleware 另判,不在本字段约束。",
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"layerResults": {
|
|
"description": "三层校验结果(创始人三层口径)。L1 硬约束(必解、确定性、归机器);L2 设计符合(尽量解、observe→enforce 渐进赋拒发权);L3 效果(只评分、M3 软检、绝不阻塞拒发、防 Goodhart)。decision 由 L1 裁(spike 初期);L2 spike 期 observe-only(enforced=false);L3 永不参与 decision。",
|
|
"type": "object",
|
|
"required": ["L1", "L2", "L3"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"L1": {
|
|
"description": "L1 硬约束层:编译/启动/运行错误必须解决、循环逼到解决。判据全确定性(构建日志/console/CDP 错误/九门+富游戏三门探针),机器说了算、零 LLM。passed 即 L1 机制地板通过。",
|
|
"type": "object",
|
|
"required": ["passed", "gateResults"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"passed": {
|
|
"description": "L1 是否全绿(九门所有致命门 + 富游戏三门全过)。decision=accept 的硬前置。",
|
|
"type": "boolean"
|
|
},
|
|
"gateResults": {
|
|
"description": "九门逐门结果。每门:测什么的判定值 + 是否致命(advisory 门按 driven 感知分级:无 driver/inputs 时 E_live、H_progress 降 advisory 不计 pass,有则恢复致命——design D4,A-model 已落待合并对账)。",
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/gateResult" }
|
|
},
|
|
"richGameGates": {
|
|
"description": "富游戏专属确定性门(D3,九门之上补的接线地板)。三门:三联动(跨系统接线)/ 经济(盈利破产双路径到终态)/ latch(终态落定不回弹)。九门+三门全绿 = 富游戏 L1 机制地板通过。",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"tripleLink": { "$ref": "#/$defs/richGameGate", "description": "三联动门:证三系统真耦合非孤岛。判据=订单 requires 可被合成产出满足(跨表可达性,静态 mergeChains→orders)∧ 合成链 DAG 无环(拓扑检查)∧ 完单真调资源 addCoins ∧ 合成消耗真调 consumeIngredient。" },
|
|
"economy": { "$ref": "#/$defs/richGameGate", "description": "经济门:数值闭环可赢可输,harness 真输入把两条路驱动到终态。盈利路=金币开局 20 经正循环攒到 100 判赢;破产路=连续 3 订单流失判输。约束=两路都能被真输入驱动跑到终态(能算≠能玩到)。" },
|
|
"latch": { "$ref": "#/$defs/richGameGate", "description": "latch 门:赢/输落定不回弹且宿主可读。承接现行宿主装载约束——游戏无 emit 通道,终态焊成可轮询 latch(phase='gameover' 驻留),宿主每帧轮询读、非游戏 emit(对接 A4 装载协议 latch 终态轮询)。" }
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"L2": {
|
|
"description": "L2 设计符合层:玩法/关卡/UI vs 设计、品类约定。处置=尽量解非死循环。拒发权 observe→enforce:先只观测积累信号,判据证准才赋拒发权。九门里 H_progress 落本层。【full 计算(零 LLM)】passed/signals/mismatches 由 judge 纯代码从已落盘源工程(data/datatable.gold.json + src/systems/)确定性算出:① 设计声明的三系统(资源/合成/订单)在数据表与源文件中都建出;② mergeChains 构成 DAG 无环;③ 每个 order.requires 可被合成产出∪开局库存满足(可达性);④ 经济胜负条件可达且自洽(赢线在 开局金币+订单 reward 之和 内可达、输线连续流失阈值≥1 且订单有有限耐心)。passed=①~④ 全 ok。spike 期 enforced=false(observe-only)。金标 fixture(mini-fei-e)先天满足 ①~④,故金标 L2 必 passed=true——这是将来提门时『金标必须过』的校准基线。",
|
|
"type": "object",
|
|
"required": ["enforced"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"enforced": {
|
|
"description": "本层是否已赋拒发权(spike 初期=false,observe-only 不计入 decision;证准后转 true)。",
|
|
"type": "boolean"
|
|
},
|
|
"passed": {
|
|
"description": "L2 设计符合度判定结果(确定性信号,= 上述 ①~④ 全 ok);enforced=false 时仅观测、不影响 decision。",
|
|
"type": ["boolean", "null"]
|
|
},
|
|
"signals": {
|
|
"description": "L2 观测信号明细(设计符合度逐项,供 observe→enforce 积累)。full 计算下含通过项的人读信号 + 以 '[不符]' 前缀列出的不符项摘要。",
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
},
|
|
"mismatches": {
|
|
"description": "L2 设计不符项明细(人读;additive·可选):声明的系统未建出 / 合成链空或成环 / 订单不可达 / 经济胜负不自洽等。仅观测,不影响 decision(enforced=false)。",
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"L3": {
|
|
"description": "L3 效果层:特效/美观/好不好玩。处置=只评分、绝不解决、绝不阻塞拒发(铁律)。工具=M3 多模态视觉软检(看截图打分),产出只进质量趋势/告警/给人工终审减负。【为何死活不当门】扩确定性门判好玩→可被刷的代理指标;纯 LLM 当裁判→Goodhart 红线(优化代理指标偏离真目标)。永不参与 decision。",
|
|
"type": "object",
|
|
"required": ["scoreOnly"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"scoreOnly": {
|
|
"description": "恒为 true 的不变量:本层只评分、绝不当门(schema 焊死纪律,防 L3 退化成阻塞门)。",
|
|
"const": true
|
|
},
|
|
"score": {
|
|
"description": "M3 软检评分(0-100,可空;只进质量趋势,不影响 decision)。",
|
|
"type": ["number", "null"]
|
|
},
|
|
"notes": {
|
|
"description": "M3 软检/player panel 的劣化信号备注(可达性、空内容等确定性可逼近的;给人门减负,非判定)。也并入下方 egregiousRenderFailure 命中的人读条目。",
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
},
|
|
"egregiousRenderFailure": {
|
|
"description": "【L3 升门准备(advisory·additive·可选)】确定性『恶性渲染失败』判据,吃单元 A 的 humanPlayability.renderSanity / renderReflectsState 结果(漏底文本 [object Object]/undefined/NaN、或有 item 的格子画成空棋盘)。与 L3 主观打分分开——这两类是机器可确定性判定的恶性失败,非『好不好玩』。【纪律不让步】本字段绝不改变 scoreOnly(恒 true)、绝不参与 decision/runnableOk/L1.passed——egregious=true 时 suggestFatal=true 只是给主会话的升门信号,真提 fatal 须由主会话在 mini-desktop 实测金标(mini-fei-e)仍 ACCEPT、坏样本(feie-005)被正确挂后再据判据落门。",
|
|
"type": ["object", "null"],
|
|
"additionalProperties": false,
|
|
"required": ["egregious", "suggestFatal"],
|
|
"properties": {
|
|
"egregious": {
|
|
"description": "是否检出确定性恶性渲染失败(漏底文本 或 空棋盘)。observe-only,不改 decision。",
|
|
"type": "boolean"
|
|
},
|
|
"suggestFatal": {
|
|
"description": "升门信号:egregious=true 时为 true,建议主会话校准后把『egregious 即 fatal』提成门(当前仍 advisory)。",
|
|
"type": "boolean"
|
|
},
|
|
"reasons": {
|
|
"description": "恶性判定的人读理由明细(命中了哪类:render-sanity 漏底 / render-reflects-state 空棋盘)。",
|
|
"type": "array",
|
|
"items": { "type": "string" }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"playReport": {
|
|
"description": "玩家取证报告(归一化产物,编排器对 CDP 捕获原始数据计算)。可空:未到实玩阶段即终判(结构 kill/构建 kill/对抗 P0 kill)时为 null;decision=accept 必为对象。tier2 富游戏的语义 state(coins/orders 等)按 A6 per-品类 state 导出约定读取。",
|
|
"type": ["object", "null"],
|
|
"additionalProperties": true,
|
|
"properties": {
|
|
"loaded": { "description": "是否捕获 boot 就绪(A_boot)。", "type": "boolean" },
|
|
"drivenInputs": { "description": "harness 实际派发的真输入次数(CDP 注入,禁 evaluate_script 篡改游戏状态)。", "type": "integer", "minimum": 0 },
|
|
"reachedTerminal": { "description": "是否驱动到终态(赢/输 latch)。", "type": "boolean" },
|
|
"terminalPhase": { "description": "捕获到的终态 phase(如 'win'/'lose'/'gameover';未到终态为 null)。", "type": ["string", "null"] },
|
|
"consoleErrors": { "description": "console error 级条目(已排网络噪声白名单);CDP 异常亦归入。", "type": "array", "items": { "type": "string" } },
|
|
"stateSnapshot": { "description": "终局语义 state 快照(per-品类,如经营档 {coins, ingredients, orders};经 A6 readState 导出,judge 据此判经济门)。", "type": ["object", "null"] }
|
|
}
|
|
},
|
|
"findings": {
|
|
"description": "对抗评审产出(独立 adversarial 评审,不向着被评对象、专找漏洞;含自产 driver 的 Goodhart 隔离审查)。P0=违规/敏感/年龄不适/写者写判自己的卷(即杀);P1=题文不符/设计矛盾/文案占位(回炉);P2=建议(留档不判)。对抗评审不可见任何试玩数据。",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["severity", "issue", "suggestion"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"severity": { "description": "严重级:P0=即杀 / P1=可修回炉 / P2=仅留档建议。", "type": "string", "enum": ["P0", "P1", "P2"] },
|
|
"issue": { "description": "问题描述(简体中文,非空)。", "type": "string", "minLength": 1 },
|
|
"suggestion": { "description": "修改建议(简体中文)。", "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"reasons": {
|
|
"description": "裁决理由,受控词表(便于批报告聚合)。固定值:structure_invalid(源工程校验/构建不过)/runnable_fail(九门/富游戏门未过)/p1_fix_round(回炉)/p0_kill(对抗即杀)/circuit_break(熔断触发,见 breakerKind)/accept;前缀模式:gate_<门名>(某门失败,如 gate_tripleLink)、infra_<类别>(基础设施失败不计分母)。",
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": {
|
|
"anyOf": [
|
|
{ "type": "string", "enum": ["structure_invalid", "runnable_fail", "p1_fix_round", "p0_kill", "circuit_break", "accept"] },
|
|
{ "type": "string", "pattern": "^gate_.+" },
|
|
{ "type": "string", "pattern": "^infra_.+" }
|
|
]
|
|
}
|
|
},
|
|
"breakerKind": {
|
|
"description": "熔断类型(decision=kill 且 reasons 含 circuit_break 时存在;对接 C3 四道熔断):step_cap=步数硬顶 / budget=预算闸 / stuck=卡死探测 / timeout=双层超时。其余 kill 无本字段。",
|
|
"type": ["string", "null"],
|
|
"enum": ["step_cap", "budget", "stuck", "timeout", null]
|
|
},
|
|
"evidence": {
|
|
"description": "证据索引:traceId 贯穿生成任务链路(对接 A2.5 统一 trace 契约);四件套证据路径(render→截图时序→驱动→verdict,复用 game-e2e-cdp-harness)。",
|
|
"type": "object",
|
|
"required": ["traceId"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"traceId": { "description": "生成任务 trace_id(贯穿、对账、成本关联键;成本权威口径在 new-api 计费行,经 traceId 关联,verdict 不携金额)。", "type": "string", "minLength": 1 },
|
|
"evidenceDir": { "description": "四件套证据落盘目录(截图序列/驱动日志/帧 hash 等)。", "type": "string" },
|
|
"promptVersions": { "description": "prompt id → 版本号映射(eval 回流路由用)。", "type": "object", "additionalProperties": { "type": "string" } }
|
|
}
|
|
},
|
|
"humanPlayability": {
|
|
"description": "【人可玩 advisory 段(additive·可选)】修『gate 通过≠人能玩』盲区:九门用 driver 按布局坐标点(不看屏幕)且点得飞快,抓不到『渲染不反映状态/漏底实现细节文本/反应窗口只为机器人调』这三类人玩不了但机器能过的缺陷。本段三项检查全部 advisory——只写进 verdict 供人审与后续校准,【绝不参与 decision 的 accept/fix/kill,也不计入 runnableOk / L1.passed】。提 fatal 须先由主会话在 mini-desktop 实测确认金标 fixture(mini-fei-e)仍过、坏样本(feie-005)被正确挂,再据金标实测值定阈值。状态=建(advisory;待主会话校准阈值后再议是否提 fatal)。",
|
|
"type": ["object", "null"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"advisory": {
|
|
"description": "恒为 true 的不变量:本段全部 advisory,只报告不阻塞(防 Goodhart;与 L3 scoreOnly 同纪律,焊死『不当门』)。",
|
|
"const": true
|
|
},
|
|
"renderReflectsState": {
|
|
"description": "渲染反映状态检查:对 state.board 里每个『有 item 的格子』,按其 (x,y)+CELL 取 canvas 像素区域,与空格子基线区域比对(像素方差/与背景色差);若有 item 的格子区域与空格子无法区分→记 violation(feie-005 即此症:state 有原料但画空格子)。pass=无此类格子。",
|
|
"type": ["object", "null"],
|
|
"additionalProperties": false,
|
|
"required": ["pass"],
|
|
"properties": {
|
|
"pass": { "description": "是否所有有 item 的格子都在渲染上区别于空格子。", "type": "boolean" },
|
|
"checked": { "description": "实际比对的有 item 格子数。", "type": "integer", "minimum": 0 },
|
|
"emptyButShouldHaveItem": {
|
|
"description": "有 item 却渲染成空的格子明细。",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["i", "j", "item"],
|
|
"additionalProperties": true,
|
|
"properties": {
|
|
"i": { "type": "integer" },
|
|
"j": { "type": "integer" },
|
|
"item": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"note": { "description": "执行说明(如无法取像素/无 board 时的降级原因;非判定来源)。", "type": "string" }
|
|
}
|
|
},
|
|
"renderSanity": {
|
|
"description": "渲染漏底检查:扫描渲染出的文本(页面 DOM textContent + host 暴露的 canvas 文本若有)是否含 [object Object]/undefined/NaN 这类漏底实现细节。pass=无漏底文本。",
|
|
"type": ["object", "null"],
|
|
"additionalProperties": false,
|
|
"required": ["pass"],
|
|
"properties": {
|
|
"pass": { "description": "是否无漏底实现细节文本。", "type": "boolean" },
|
|
"violations": {
|
|
"description": "命中的漏底标记明细。",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["marker"],
|
|
"additionalProperties": true,
|
|
"properties": {
|
|
"marker": { "description": "命中的漏底标记(如 [object Object])。", "type": "string" },
|
|
"sample": { "description": "命中处的文本片段(截断)。", "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"note": { "description": "执行说明(非判定来源)。", "type": "string" }
|
|
}
|
|
},
|
|
"humanTiming": {
|
|
"description": "人类反应窗口检查:读数据表(经 state 或 datatable.gold.json)订单 patience 及任何反应窗口,记录 min/max/各单 patience;低于候选人类最小阈值 HUMAN_MIN_PATIENCE_MS(★ directional 待主会话用金标实测校准)的订单记 advisory violation(feie-005 即此症:8 秒耐心给机器人调的、人来不及)。",
|
|
"type": ["object", "null"],
|
|
"additionalProperties": false,
|
|
"required": ["pass"],
|
|
"properties": {
|
|
"pass": { "description": "是否所有反应窗口都 ≥ 候选人类最小阈值。", "type": "boolean" },
|
|
"minPatienceMs": { "description": "最短订单耐心(毫秒)。", "type": ["number", "null"] },
|
|
"maxPatienceMs": { "description": "最长订单耐心(毫秒)。", "type": ["number", "null"] },
|
|
"thresholdMs": { "description": "本次采用的候选人类最小阈值(HUMAN_MIN_PATIENCE_MS;★ directional)。", "type": "number" },
|
|
"patiencesMs": {
|
|
"description": "各订单耐心明细(毫秒)。",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["patienceMs"],
|
|
"additionalProperties": true,
|
|
"properties": {
|
|
"orderId": { "type": "string" },
|
|
"patienceMs": { "type": "number" },
|
|
"belowThreshold": { "type": "boolean" }
|
|
}
|
|
}
|
|
},
|
|
"violations": {
|
|
"description": "低于阈值的订单明细(advisory)。",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["patienceMs"],
|
|
"additionalProperties": true,
|
|
"properties": {
|
|
"orderId": { "type": "string" },
|
|
"patienceMs": { "type": "number" }
|
|
}
|
|
}
|
|
},
|
|
"note": { "description": "执行说明(如数据表来源/无 patience 字段时的降级;非判定来源)。", "type": "string" }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"$defs": {
|
|
"gateResult": {
|
|
"type": "object",
|
|
"description": "单门结果(九门之一)。passed 由 judge 纯代码产出;fatal 标该门此次是否致命(advisory 门 driven=false 时 fatal=false 仅报告不计 pass)。",
|
|
"required": ["gate", "passed", "fatal"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"gate": {
|
|
"description": "门名:A_boot/B_uncaught/C_frame/D_render/E_live/F_wiring/G_input/H_progress/I_control。",
|
|
"type": "string",
|
|
"enum": ["A_boot", "B_uncaught", "C_frame", "D_render", "E_live", "F_wiring", "G_input", "H_progress", "I_control"]
|
|
},
|
|
"passed": { "description": "本门是否通过(确定性,零自评)。", "type": "boolean" },
|
|
"fatal": { "description": "本门此次是否致命(advisory 分级:E_live/H_progress 在 driven=false 时为 false=降 advisory)。", "type": "boolean" },
|
|
"detail": { "description": "判定细节/原始观测摘要(供 debug,非判定来源)。", "type": "string" }
|
|
}
|
|
},
|
|
"richGameGate": {
|
|
"type": "object",
|
|
"description": "富游戏专属门单门结果(三联动/经济/latch 之一)。passed 由 judge 纯代码确定性产出(静态+真玩混合)。",
|
|
"required": ["passed"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"passed": { "description": "本门是否通过。", "type": "boolean" },
|
|
"checks": {
|
|
"description": "本门子检查逐项结果(如三联动门:requiresReachable/dagAcyclic/callsAddCoins/callsConsumeIngredient)。",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name", "ok"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"name": { "description": "子检查名。", "type": "string", "minLength": 1 },
|
|
"ok": { "description": "子检查是否通过。", "type": "boolean" },
|
|
"detail": { "description": "子检查细节(非判定来源)。", "type": "string" }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"allOf": [
|
|
{
|
|
"if": { "properties": { "decision": { "const": "accept" } }, "required": ["decision"] },
|
|
"then": {
|
|
"required": ["versionId", "playReport"],
|
|
"properties": { "playReport": { "type": "object" } }
|
|
}
|
|
}
|
|
]
|
|
}
|