fix(九门): latch 终态口径修法 — 命名同义 + 限时类有进展降 advisory

便宜档当前 HEAD 九门真实基线诊断(n=5 收敛环):harness 健康、3/5 真可玩;
0/5 主因 = latch 终态词表 bug(只认 gameover、漏 over/win/lose)+ 限时类
driver 玩不到终局。按创始人 2026-06-25 口径修 play.cdp.cjs:
- latch 认 gameover/over/win/lose 同义(对齐 driver 家族 runTapTargets)
- 未达终态但有真进展的限时/无快速失败态类 → latch 降 advisory(不致命),
  无进展仍致命(不放水)
- 验证:base1-5 重跑 0/5→3/5(base1/4/5 真可玩转绿,base2/3 卡 menu 无进展仍正确挂)

SoT① §5.4 同步 latch 口径演进(文档↔代码兑现)。
附:docs/内网凭据与端点.md 登记 glm-5.2(opus 高级档/512K,作复杂档证路高级档)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
lili 2026-06-25 22:26:37 -07:00
parent f3d4bc1f24
commit 8b491d1330
3 changed files with 18 additions and 11 deletions

View File

@ -377,7 +377,7 @@ L1 的主体是九门,每门在真浏览器里真玩一局取确定性证据:A_b
九门是超休闲单局的机制地板,不查跨系统接线;富游戏的难点恰在跨系统,所以在九门之上补三道 tier2 专属的确定性门。**三联动门**证三个系统真耦合而非孤岛:订单要的物品必须能被合成系统产出(从合成链静态推到订单的跨表可达性检查)、合成链必须是有向无环图(拓扑检查不许成环)、完成订单时必须真调资源系统加金币、合成消耗时必须真调扣食材。**经济门**用真输入把两条路驱动到终态:可盈利路径(金币从开局攒到目标判赢)、可破产路径(连续若干订单流失判输),关键约束是两条路都得被 harness 的真输入序列驱动跑到终态——能在数据表里算出来和能被真玩到是两回事。**latch 门**管终态落定不回弹、宿主能读到终局,承接的是"游戏无 emit 通道、终态焊成可轮询 latch、宿主轮询读"这条现行装载约束。九门加这三门合起来全绿,才算 tier2 的富游戏机制地板通过。
两道条件门靠 **driven 感知的 advisory 分级**自动切换:一个 play-spec 既没有 driver 也没有非空输入序列时,判定 driven=false,E_live 与 H_progress 降为 advisory(仍跑仍报告,但不计入 pass),硬门只剩七道;一旦给了 driver 或输入序列,driven=true,两门自动恢复致命、九门全计入——不改一行代码。理由很朴素:没人给输入时画面本就静、机制本就没进展,硬判这两门是冤枉它。这正是 observe→enforce 范式的源头,tier2 修 latch 门与经营门复用它。这套分级已落(A-model 分支与 tier2 的 play-phaser 引擎分支都字面实现了 driven 两态),创始人 2026-06-22 裁定;A-model 已合入 dev/2.0.0,合并后接缝以合并版对账。
两道条件门靠 **driven 感知的 advisory 分级**自动切换:一个 play-spec 既没有 driver 也没有非空输入序列时,判定 driven=false,E_live 与 H_progress 降为 advisory(仍跑仍报告,但不计入 pass),硬门只剩七道;一旦给了 driver 或输入序列,driven=true,两门自动恢复致命、九门全计入——不改一行代码。理由很朴素:没人给输入时画面本就静、机制本就没进展,硬判这两门是冤枉它。这正是 observe→enforce 范式的源头,tier2 修 latch 门与经营门复用它。这套分级已落(A-model 分支与 tier2 的 play-phaser 引擎分支都字面实现了 driven 两态),创始人 2026-06-22 裁定;A-model 已合入 dev/2.0.0,合并后接缝以合并版对账。latch 子项 2026-06-25 沿同一「不冤枉」理路再细化两点:终态名认 gameover / over / win / lose 同义(与 driver 家族统一,治游戏把终态叫 over 却被判终态不可达的误杀);限时与无快速失败态类——driver 在轮询窗口内玩不到终局、但机制断言证有真进展的——latch 降 advisory 不致命,无进展则仍致命,既不强求每款玩到 gameover、也不给卡在菜单的空壳放水。这条经便宜档五款真实基线验证:命名误杀与限时类合计让通过率从假象的全黑回到真实的三过两挂,两挂正是卡菜单未进玩法的空壳、被无进展这一条挡住。
spike 第二段放开让 agent 自产或扩展 driver 时,会撞上一个 Goodhart 雷:**写者不能写判自己游戏的那张卷子**——agent 既造游戏又造判它的 driver,会把 driver 写成只走它走过的路、只读不暴露真实力的字段,然后全绿假绿。隔离办法是拆开写卷人与判卷人,走三层:平台先按 schema 加白名单编译(非白名单或越界字段直接拒)、再交一个不向着被评对象、专找漏洞的独立 adversarial 评审(查它是否覆盖真实玩家路径、是否读了作弊字段)、三层全过才入验收。配套采两个指标:自产 driver 被独立评审打回的比例、driver 被修改的次数(防靠反复改 driver 逃避卡死探测)。

View File

@ -16,6 +16,9 @@
- **接入铁律2026-06-22 纠正旧口径)**:统一出口 = new-api 网关baseUrl + `NEWAPI_KEY`),统一计费 / 密钥 / 审计;**协议与 SDK 不锁**——OpenAI 兼容 / Anthropic 原生 / 厂商 SDK 均可,只要 baseUrl 落 new-api、key 用 `NEWAPI_KEY`。**作废**「唯一 OpenAI 兼容出口 / 绝不直连厂商 SDK」旧表述new-api 只是统一端点,不锁协议)。
- **用途**`SaaFullGraphE2eTest``-Dsaa.e2e=1`/ 生成产线 / **gameDefinition 路 cutover ≥60% 量测**003-U1 第一步)都用它。
- **上游 channel keys**new-api 配的各 provider key,非调网关 token`game-cloud/huijing-server/src/main/resources/application.yaml``channels.*.api-key`(行 ~207-290
- **可用模型档(对比测试 / 证路用 · 2026-06-25 补)**
- **`glm-5.2`** —— **Anthropic message 协议**(走 `/v1/messages`),定位 **opus 高级模型档**,上下文 **512K**。后续作**高级档对比测试 / 强模型 cross-check 证路**用,填补复杂档「真强模型证路」此前缺 opus 档的空缺(原 deepseek-v4-pro 跨族证路力弱)。
- 便宜档生成主力 = **MiniMax-M3**Anthropic 原生分离 thinking,见上「协议端点」);其余 provider 模型见 application.yaml `channels.*`
---

View File

@ -1065,24 +1065,28 @@ async function main() {
verdict.guards.H_progress = { pass: false, err: '声明了机制门但游戏未经 _forensicsView() 导出可观测状态(可测性红线未满足)', state0, state1 };
} else {
const checks = asserts.map((a) => checkAssertion(a, state0, state1));
const progressPass = checks.every((c) => c.pass);
// 终态同义词集:与 driver 家族runTapTargets:242统一口径治「游戏终态叫 over/win/lose 而 latch 只认 gameover」的误判2026-06-25 base5 实证:真玩到 over、score↑却判终态不可达
const isTerminal = (p) => p === 'gameover' || p === 'over' || p === 'win' || p === 'lose';
let latch = null;
if (expectLatch) {
// 停止输入后轮询等进入 gameover无失败态/永不结束=终态不可达=判否);最多 ~4.2s。
// 停止输入后轮询等进入终态(无失败态/永不结束=终态不可达);最多 ~4.2s。
let phaseNow = state1.phase;
for (let i = 0; i < 14 && phaseNow !== 'gameover'; i++) { await delay(300); const s = await readGameState(cdp); phaseNow = s ? s.phase : null; }
if (phaseNow !== 'gameover') {
latch = { pass: false, reason: '真玩未到达 gameover 终态(终态不可达/无失败态/play-spec 未驱动到结束)', phaseNow };
for (let i = 0; i < 14 && !isTerminal(phaseNow); i++) { await delay(300); const s = await readGameState(cdp); phaseNow = s ? s.phase : null; }
if (!isTerminal(phaseNow)) {
// 未到终态:限时/无快速失败态类倒计时、目标多driver 在 ~4.2s 窗口内玩不到终局——有真进展assertAfterPlay 全过)则 latch 降 advisory不致命无进展才致命真空壳。创始人 2026-06-25 口径:不一刀切要求玩到 gameover但不放水仍须真进展 + 八门)。
latch = { pass: false, advisory: progressPass, reason: progressPass ? '未驱动到终态但有真进展(限时/无快速失败态类→advisory' : '真玩未到达终态且无进展(终态不可达/空壳)', phaseNow };
} else {
// latch 驻留校验:再等 600msphase 必须仍 'gameover'(瞬时终态/自动重开=违约,宿主 500ms 轮询会漏读)。
// latch 驻留校验:再等 600msphase 必须仍是终态(瞬时终态/自动重开=违约,宿主 500ms 轮询会漏读)。
await delay(600);
const s2 = await readGameState(cdp);
const dwell = !!(s2 && s2.phase === 'gameover');
latch = { pass: dwell, dwelledMs: 600, after: s2 ? s2.phase : null, reason: dwell ? '' : 'gameover 未驻留(下帧自动重开/复位=latch 违约)' };
const dwell = !!(s2 && isTerminal(s2.phase));
latch = { pass: dwell, dwelledMs: 600, after: s2 ? s2.phase : null, reason: dwell ? '' : '终态未驻留(下帧自动重开/复位=latch 违约)' };
}
}
const progressPass = checks.every((c) => c.pass);
const latchPass = !expectLatch || !!(latch && latch.pass);
verdict.guards.H_progress = { pass: progressPass && latchPass, checks, latch, state0, state1 };
// latch 致命性:仅「未达终态且无真进展」让 H 挂未达终态但有真进展→latch 降 advisory限时类口径驻留违约仍致命。
const latchHardFail = expectLatch && latch && !latch.pass && !latch.advisory;
verdict.guards.H_progress = { pass: progressPass && !latchHardFail, checks, latch, state0, state1 };
}
// 首局门断言③60s 品类核心闭环可达——从 H 门结果派生 coreLoopReached复用 H 判定,几乎零新判定)。