docs(.agents): 蒸馏 WU-A 后续对照验证 harness 范式

新 skill gen-path-parity-harness:两条生成路对照验证(parity)的可复用范式。
核心铁律 = 对照公平靠驱动器 held constant(每品类金标 play-spec 喂两路,
把驱动器从对照变量摘掉);金标只对 tap-targets 族公平(key-cycle 按键是
生成侧自由选择、不在 forensics 契约,需输入键契约);注入 = 生成与 play
拆步 + 金标覆写 staged 真路径(非 evidence);判据 = 两层 + 逐品类绝对地板
+ 双低标红(防 flaky 基线假等价);成功定义钉死「金标 spec 下」≠生产许可;
端口池 + 线程前台有界并发。WU-A 后续 cheap-worker/compare_node.py 实证、
双评审揪四坑固化成铁律。README 索引同步。
This commit is contained in:
lili 2026-06-26 11:48:45 -07:00
parent 04dbd0608b
commit 0b34b4eb57
2 changed files with 70 additions and 0 deletions

View File

@ -58,6 +58,7 @@
| `skills/game-e2e-cdp-harness.md` | Canvas 游戏 e2e 证据 harness编排形制/驱动器六律/出厂红线/四件套口径T1b-α 实证§7 = W-G1 生成游戏真玩九门 = 假绿守卫 G 门 + H 机制/latch + I 控制手感 + 自产 gatespec |
| `skills/cheap-model-game-generation.md` | 便宜模型new-api DeepSeek/MiniMax直出可真玩轻游戏 L1 worker链路/模型与成本/L1 纪律/坑红线/latch 套壳/design agent 自产 gatespec/质量三层W-G1 HJ-GEN-001 实证)。**注2026-06-26**reframe 后便宜档生成已迁 `cheap-worker/`Python/AgentScope`agentscope-2.0-facts` 实现速查 + memory `amodel-generation-build-state`);本条 W-G1 gamedef/factory/worker-loop 路已退役,仅成本/代理坑/模型画像/质量三层跨路有效(详见篇首状态注) |
| `skills/agentic-amodel-generation.md` | **agentic A-model 生成 harnessReAct+M3 已实证·生产形态)**scaffold→工具循环read/write/list/check/build/done→循环外 play链路/5 文件/运行配方/8 坑write 前缀·compaction·停机纪律·防假绿·bundle.tick·boot envelope·路径深度/M3 3-玩法自闭环实证/主流定性;取代旧 gamedef 单次产线HJ-AGI-003 |
| `skills/gen-path-parity-harness.md` | **两条生成路对照验证(parity) harness 范式**:验「换实现后生成质量没回退」(Node→Python 重写/换模型/换框架)。对照公平铁律=驱动器 held constant(每品类金标 play-spec 喂两路)/ 金标只对 tap-targets 族公平(key-cycle 按键是生成侧自由选择不在 forensics 契约,需输入键契约)/ 注入=生成与 play 拆步+金标覆写 staged 真路径(非 evidence)/ 两层判据+逐品类绝对地板+双低标红(防 flaky 基线假等价)/ 成功定义钉死「金标 spec 下」≠生产许可/ 端口池+线程前台有界并发WU-A 后续 cheap-worker/compare_node.py 实证(双评审揪四坑) |
| `skills/saa-graph-orchestration.md` | SAASpring AI Alibaba裸 StateGraph 生成编排:拓扑/加节点/接 new-api(剥 /v1 坑)/checkpoint(含 saved_at 无 tiebreaker 框架坑+显式 checkPointId 修法)/observation/最小依赖集/派发契约/验证门HJ-AGI-002 实证) |
| `skills/doc-organizer.md` | 文档整理助手(创始人手动触发):增量(上次清理→现在)+**两阶段审批门**——发起分析 Workflow→编清理计划→评审→批准后才执行三轴=过期档清理(归档/压缩)/核心设计档措辞对齐现行真相/主任务总账回填;底层 `tools/doc-organizer.{sh,-analyze.mjs,-state.json}`(检测自动·判断留人·脚本不自删·最新日在飞档不碰) |
| `skills/drive-remote-claude-tmux.md` | 远程驱动交互式 Claude Codessh + tmux双向通道 send-keys 派活 + capture-pane 读屏,不走 ACP/headless每设备配置块 + onboarding 侦察配方 + 专用会话(独立 worktree 防撞树) + bypass-perms + 安全红线;**完成判据=git push 非读屏**(创始人 2026-06-18 拍板·多设备复用) |

View File

@ -0,0 +1,69 @@
---
name: gen-path-parity-harness
description: 两条生成路对照验证(parity)harness 范式——验证「换实现后生成质量没回退」Node→Python 重写 / 换模型 / 换框架)。核心=对照公平铁律(驱动器 held constant)+ 金标 spec 注入 + 两层判据 + 端口池并发。WU-A 后续(cheap-worker/compare_node.py)实证。
node_type: skill
---
# 生成路对照验证 harness 范式
## 何时用
要回答「把生成实现换了一套质量有没有回退」——Node 重写成 Python、换个模型、换个框架。区别于「每条路各自能不能跑」对照验证比的是**两条路产出的游戏质量是否等价**给「旧路可以退役」这种迁移决策当硬证据。WU-A 框架收敛的 R1 头号风险(把在产主力整条重写)就靠它兜。
## 对照公平铁律:驱动器必须 held constant
游戏质量用九门过门率衡量,而九门要靠一份 play-spec 驱动游戏去玩。**两条路若各用各自自动产的 play-spec过门率差就掺进了驱动器质量差、不可归因于生成。** 所以对照时把每个品类的 play-spec 钉成**一份金标、喂两路共用**,把驱动器从对照变量里摘掉——这样过门率差才只反映生成质量。
只精化单侧的 play-spec 是最隐蔽的陷阱:它看着是「让对照更准」,实则把驱动器质量偏向了被精化的那一路,制造新的不公平。
## 金标 spec 只对一部分驱动器家族公平
能不能「一份金标 spec 通吃两路同品类游戏」,取决于驱动器怎么找操作目标:
- **tap-targets 族**(点击 occupied 目标:点击得分 / 打地鼠 / 经营点客):驱动器从游戏自报的 `_forensicsView().state().targets` 里读坐标再点,坐标与具体游戏实现无关 → 一份金标 spec 公平驱动两路,**成立**。
- **key-cycle 族**方向键2048 / 躲避):驱动器按 spec 里硬编码的 `driver.keys` 逐键轮发,而**按哪个键是生成侧 LLM 写 game-logic 时的自由选择、不在 forensics 契约里**。两路独立生成完全可能绑不同键,一份固定按键的金标对绑定一致那路驱得动、对另一路驱不动 → 公平不成立。这类要先立一道「两路绑同一套输入键」的契约(生成侧约束),或让 spec 从每路自报的输入映射派生键集,才能纳入对照。
一句话分界:**forensics 契约保证的是可观测性(读得到 targets/score不是可驱动性同一份 driver 配置能把两路都开起来)。** 别把两者当一回事——这是对照覆盖面的真实边界,硬来会把按键绑定的分叉冤判成生成质量差。
## 注入机制:把生成与 play 拆开,金标覆写 staged 路径
1. **拆步**:每路把「生成」和「九门 play」拆成两步。若某条生成路内部已经把 play 一气做完(如 `run_studio` 收口含 play给它加一个 generation-only 开关(`run_gates=False`)只生成到 stage、不 play。
2. **注入点 = staged 路径**:金标 spec 强制覆写到 `games/_wg1-gen/<id>/play-spec.json`——这是 `play.cdp.cjs` **真实读取**的位置,**不是** evidence 目录(最常踩的错)。
3. **覆写时机**:在 stage 之后、play 之前写入。gen-only 路靠「自动产 spec 的已存在不覆盖」语义即可让金标留住;已经自动产了 spec 的路(如 Node `gen.mjs` done 门)要**强制覆写**。
4. 再各自单独跑九门 play。
## 判据:两层 + 逐品类绝对地板 + 双低标红
当基线本身 flaky如旧路五款只 3/5 真可玩),只用「新路不低于旧路」会把「两路都没真玩起来」或「两路都勉强平庸」判成等价坐实。要四道一起兜:
- **相对层**:新路过门率不低于旧路。
- **绝对层**:旧路本身过不了可玩门的品类,要新路**真过**该品类可玩门driven 且进展门 H 过)才算坐实,不能靠「一起烂」蒙混。
- **逐品类绝对地板**:坐实的品类,新路真玩比例要带余量过线(如 ≥0.6),不只是 ≥旧路。
- **双低标红**:两路同卡菜单 / 同低分的品类显式标红、不计入坐实。
判据在**品类层聚合**多局(单局生成 flake 不拖垮整品类,且单局两路同等的 flake 是公平的、不算回退)。
## 成功定义钉死「金标 spec 下」
对照证据是在手写金标驱动器下采的;生产里新路将用自动产的 play-spec 驱动。两个驱动器不是同一个,而金标通常比自动 spec 更干净。所以**对照等价 ≠ 生产退役/切换许可**:面向生产的退役授权要另 gate 在「生产自动 spec 达到金标同等过门率」auto-vs-golden delta。产物命名直接标「金标 spec 下」,免得被当成生产许可。
## 并发(可选,提速)
并发的真约束不是产物隔离gameId 前缀已隔离),是九门 play/smoke 的固定端口 + Chrome 实例。
- **端口池**:每并发槽一对独立 `(server_port, cdp_port)`server 段与 cdp 段不重叠。
- **每对一线程**:用线程跑整对(线程内生成路自带 event loop信号量或端口池 size 天然限并发。
- **前台进程内有界并发**,不是后台子代理 task / tail 监视 / 自我唤醒重试——后者会失控撞同名产物、杀进程触发重试死循环、token 泄漏)。
- 前提:引擎工具端口可参数化(`gen.mjs --port/--cdp``play.mjs {port,cdpPort}` 各自独立 spawn server+Chrome+userDataDir
便宜档生成的资源/并发上限画像另见相应容量记录M3 推理远程、本地瓶颈是 Chrome/esbuild 的 CPU 突发、并发上限 ≤15
## 实现指针
- `cheap-worker/compare_node.py``judge_genre`(两层判据)/ `inject_golden` + `_write_spec_atomic`(金标覆写 staged/ `run_pair_sync`生成→注入→play 整对)/ `run_multi`(端口池 + 线程 + 限并发)/ `_port_pool`
- `cheap-worker/fixtures/golden-specs/`:每品类一份金标 play-spec。
- 九门 harness 本体(驱动器家族 / play.cdp.cjs / 出厂红线)见 [game-e2e-cdp-harness](game-e2e-cdp-harness.md)AgentScope 2.0.2 便宜档实现 API 见 [agentscope-2.0-facts](../knowledge/agentscope-2.0-facts.md)。
## 实证
WU-A 后续2026-06-26`docs/plans/2026-06-26-002-feat-cheap-worker-multi-genre-plan.md`):三 tap-targets 品类 n=3 对照 Python 新路 vs Node 旧路全 equivalent坐实范式未回退。Codex + Opus 双评审揪出的四个真坑都在本范式里固化成了铁律注入路径错evidence 而非 staged、品类族判错点击得分是 occupied 反应族不是放置族)、判据缺绝对地板(双低被判等价)、只精化单侧 spec 污染对照。