diff --git a/bench/board.json b/bench/board.json
index 809e078..b4deb1c 100644
--- a/bench/board.json
+++ b/bench/board.json
@@ -1,7 +1,7 @@
{
"goal": "调出 50 关难度合适、好玩的关卡,交付人工审核",
"updated": "09-14 16:45",
- "round": 2,
+ "round": 3,
"definition": {
"title": "「难度合适且好玩」的操作定义",
"why": "旋转是免费的、是这个游戏的特色,玩家应该频繁做——所以不该限制旋转次数。该限制的是每一次旋转值不值:转了有没有棋子出来、能不能看出来该转哪、以及转完之后有没有「原来这么简单」的反差。评分里只有 difficulty(复测 r=0.93)和 stuck(r=0.85)可信,rotation / clarity / fun 是噪声(0.32 / 0.19 / 0.56),所以「好玩」全部换成机械代理。 另外,演出本身就是奖励——棋子沿弯路走出去的那几秒是减压点,所以开局必须有得看,而不是只有两枚贴边棋子和 0.3 秒。",
@@ -196,8 +196,8 @@
{
"id": "T3.4",
"title": "收敛判定(难度曲线单调、stuck 达标)",
- "status": "doing",
- "note": "机械面已收敛:空点 0、不可解态 0、连续空转≤1、终局朝向≥3。难度未达标:后档 2.40 vs 目标 3。瓶颈是深关卡供给(见 T1.6),正在扫第二批种子。注意逐关评分复测 r=0.55 且同轨迹会打出不同分,只有按档≈20 局才可读"
+ "status": "done",
+ "note": "收敛判定完成。机械面:空点 0、不可解态 0、连续空转≤1、终局朝向≥3、三轮全部通关。难度面:三档 2.00 / 2.05 / 2.17,单调但后档低于「刚刚好」的 3 分——上限由深关卡供给决定(见 T1.6),且这项评分复测 r=0.55,本身不足以再往下调。剩下的交人工审核"
}
]
},
@@ -263,6 +263,14 @@
{
"at": "供给瓶颈",
"text": "扩池两轮共 720 种子、1113 候选,深度≥4 的过闸门后只有 23 个(2%)。种子翻倍只让深关卡从 16 涨到 23,说明 growDeepLevel 难以造出需要四转以上的关卡——这是后档难度的硬上限"
+ },
+ {
+ "at": "R3 结果",
+ "text": "第三轮只改一个变量:桶内按反差取关。后档反差 27.9→28.5、旋转深度不变,后档评分 2.39→2.17。以 r=0.55 的复测可信度,十几关上的这点差距分不出胜负——记为「未证实」,第三版保留的理由是设计面的(反差是策划点名的好玩机制)与家族均衡(两家族 30/50 → 26/50)"
+ },
+ {
+ "at": "一个差点报错的对照",
+ "text": "levels/campaign-50-r2.json 本应是 R2 玩的那一版,实际只含 28 个 R2 盘面、46 个 R3 盘面——select-50 原地覆盖同一路径,中间跑过的选关实验把它换掉了。改为从 run 反建(run 自带完整盘面与序号),并删掉该快照"
}
]
}
\ No newline at end of file
diff --git a/docs/level-board.html b/docs/level-board.html
index 50cfec4..dcd311f 100644
--- a/docs/level-board.html
+++ b/docs/level-board.html
@@ -98,10 +98,10 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
@@ -184,7 +184,7 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
T3.1第 1 轮:grok 全量跑 50 关完成
50 关全部跑完;机械面干净:空点 0、盲转 ~0.3/关、全部通关。总体读数:整批偏易一档(2 分 vs 刚好的 3 分)
T3.2按实测曲线调整选关,重选完成
连续空转设闸门(≤1)+ 难度曲线改为按旋转深度配额。同一规则机器人对照:盲转 0.24→0.12,最长连续盲转 4→1,决策数不变
T3.3第 2 轮验证完成
R2:99 局覆盖 50 关,全部通关,空点 0。难度按档 2.00 / 2.05 / 2.40,无解感 1.21 / 1.15 / 1.74 —— 评分第一次出现梯度
-T3.4收敛判定(难度曲线单调、stuck 达标)进行中
机械面已收敛:空点 0、不可解态 0、连续空转≤1、终局朝向≥3。难度未达标:后档 2.40 vs 目标 3。瓶颈是深关卡供给(见 T1.6),正在扫第二批种子。注意逐关评分复测 r=0.55 且同轨迹会打出不同分,只有按档≈20 局才可读
+T3.4收敛判定(难度曲线单调、stuck 达标)完成
收敛判定完成。机械面:空点 0、不可解态 0、连续空转≤1、终局朝向≥3、三轮全部通关。难度面:三档 2.00 / 2.05 / 2.17,单调但后档低于「刚刚好」的 3 分——上限由深关卡供给决定(见 T1.6),且这项评分复测 r=0.55,本身不足以再往下调。剩下的交人工审核
@@ -205,7 +205,7 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
| 批次 | 关数 | difficulty | stuck | 盲转/关 | 多转/关 |
| R2 · grok xhigh | 100 | 2.16 | 1.37 | 0.12 | 0.24 |
-| R3 · grok xhigh | 50 | 2.08 | 1.32 | 0.14 | 0.26 |
+| R3 · grok xhigh | 53 | 2.08 | 1.32 | 0.13 | 0.25 |
| R1 · grok xhigh | 50 | 2.10 | 1.44 | 0.24 | 0.38 |
| Codex CLI · gpt-6-astra low | 18 | 2.44 | 1.44 | 1.17 | 1.22 |
| Codex CLI · spark xhigh | 18 | 3.11 | 2.28 | 1.17 | 1.17 |
@@ -221,6 +221,8 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
F日志
+- 一个差点报错的对照levels/campaign-50-r2.json 本应是 R2 玩的那一版,实际只含 28 个 R2 盘面、46 个 R3 盘面——select-50 原地覆盖同一路径,中间跑过的选关实验把它换掉了。改为从 run 反建(run 自带完整盘面与序号),并删掉该快照
+- R3 结果第三轮只改一个变量:桶内按反差取关。后档反差 27.9→28.5、旋转深度不变,后档评分 2.39→2.17。以 r=0.55 的复测可信度,十几关上的这点差距分不出胜负——记为「未证实」,第三版保留的理由是设计面的(反差是策划点名的好玩机制)与家族均衡(两家族 30/50 → 26/50)
- 供给瓶颈扩池两轮共 720 种子、1113 候选,深度≥4 的过闸门后只有 23 个(2%)。种子翻倍只让深关卡从 16 涨到 23,说明 growDeepLevel 难以造出需要四转以上的关卡——这是后档难度的硬上限
- R2 结果难度评分按档 2.00/2.05/2.40(R1 是三档全平),无解感 1.21/1.15/1.74。意外把每关跑了两次,得到 45 对复测:84% 重放了完全相同的动作序列,机械指标 r=1.00,难度评分 r=0.55——且评分分歧的那几对全是同轨迹。结论:agent 近乎确定性,同一关不必跑两遍
- R2 依据后段 14 条抱怨里两类:路线太长(感知,已对照 v0.5 基线否掉)与「转了没反应」(机械,可设闸门)。只改后者:endgameMinOpen 2→3、doubleDead 无闸门→≤2。两条合计只留 16% 候选,所以先扩池
diff --git a/docs/level-process.html b/docs/level-process.html
index 7ff2bb7..718b667 100644
--- a/docs/level-process.html
+++ b/docs/level-process.html
@@ -72,17 +72,15 @@ a{color:var(--rail)}
两轮之间改了什么,效果如何
第一轮唯一可用的读数是「整批偏易」,加上抱怨里反复出现的「转了没反应」。据此只改了两件事:给连续空转设闸门(最多一次转动没反应,此前有 11 关能连着两次),以及把难度曲线写成旋转深度的配额而不是指望它从排序里自己长出来。第三轮又只改了一件:桶内改按反差取。每轮一个变量,才看得出是哪个变量起的作用。
-| 同一个规则机器人,两套关卡集 | 第一版 | 第二版 |
+| 同一个规则机器人,三套关卡集 | 第一版 | 第二版 | 第三版 |
-
-| 盲转 / 关 | 0.24 | 0.12 |
-| 最长连续盲转 | 4 | 1 |
-| 空点 / 关 | 0.00 | 0.00 |
-| 决策 / 关(要做的事) | 10.3 | 10.3 |
-
+| 盲转 / 关 | 0.24 | 0.12 | 0.14 |
+| 最长连续盲转 | 4 | 1 | 1 |
+| 空点 / 关 | 0.00 | 0.00 | 0.00 |
+| 决策 / 关(要做的事) | 10.3 | 10.3 | 9.8 |
-要做的事一样多,浪费掉的动作少了一半。这是同一个玩家的对照,所以变的是关卡不是模型的心情。
+要做的事一样多,浪费掉的动作少了一半,而且第三版保住了这个成绩。这是同一个玩家的对照,所以变的是关卡不是模型的心情——一次 50 关的全量验收 1 秒跑完,这也是为什么全量验收该交给它而不是 agent。
| grok 实测,按档(每关计一次,与它自己玩的那一版对齐) | R1 | R2 | R3 |
| 难度 | 无解感 | 难度 | 无解感 | 难度 | 无解感 |
diff --git a/scripts/build-process-report.mjs b/scripts/build-process-report.mjs
index 3bbc7a4..9468545 100644
--- a/scripts/build-process-report.mjs
+++ b/scripts/build-process-report.mjs
@@ -108,7 +108,7 @@ const BOT = tag => { const v = bot(tag); return v.length ? {
n: v.length, blind: mean(v.map(r => r.m.blindRotations ?? 0)), dead: mean(v.map(r => r.m.deadTaps ?? 0)),
streak: Math.max(...v.map(r => r.m.longestBlindStreak ?? 0)), dec: mean(v.map(r => r.m.decisions ?? 0)),
} : null; };
-const botOld = BOT('r1bot-'), botNew = BOT('r2bot-');
+const BOTS = [['第一版', BOT('r1bot-')], ['第二版', BOT('r2bot-')], ['第三版', BOT('r3bot-')]].filter(([, v]) => v);
// The rules, each with the observation that forced it. A rule without one is a
// preference, and preferences do not belong in a process document.
@@ -209,17 +209,19 @@ a{color:var(--rail)}
两轮之间改了什么,效果如何
第一轮唯一可用的读数是「整批偏易」,加上抱怨里反复出现的「转了没反应」。据此只改了两件事:给连续空转设闸门(最多一次转动没反应,此前有 11 关能连着两次),以及把难度曲线写成旋转深度的配额而不是指望它从排序里自己长出来。第三轮又只改了一件:桶内改按反差取。每轮一个变量,才看得出是哪个变量起的作用。
-| 同一个规则机器人,两套关卡集 | 第一版 | 第二版 |
+| 同一个规则机器人,三套关卡集 | ${BOTS.map(([n]) => `${n} | `).join('')}
-${botOld && botNew ? `
-| 盲转 / 关 | ${f2(botOld.blind)} | ${f2(botNew.blind)} |
-| 最长连续盲转 | ${botOld.streak} | ${botNew.streak} |
-| 空点 / 关 | ${f2(botOld.dead)} | ${f2(botNew.dead)} |
-| 决策 / 关(要做的事) | ${f1(botOld.dec)} | ${f1(botNew.dec)} |
-` : '| 规则机器人数据缺失 |
'}
+${BOTS.length ? [
+ ['盲转 / 关', v => f2(v.blind), true],
+ ['最长连续盲转', v => String(v.streak), true],
+ ['空点 / 关', v => f2(v.dead), false],
+ ['决策 / 关(要做的事)', v => f1(v.dec), false],
+].map(([label, get, better]) => `| ${label} | ${BOTS.map(([, v], i) =>
+ `${get(v)} | `).join('')}
`).join('\n')
+: '| 规则机器人数据缺失 |
'}
-要做的事一样多,浪费掉的动作少了一半。这是同一个玩家的对照,所以变的是关卡不是模型的心情。
+要做的事一样多,浪费掉的动作少了一半,而且第三版保住了这个成绩。这是同一个玩家的对照,所以变的是关卡不是模型的心情——一次 50 关的全量验收 1 秒跑完,这也是为什么全量验收该交给它而不是 agent。
| grok 实测,按档(每关计一次,与它自己玩的那一版对齐) | ${present.map(id => `${id} | `).join('')}
| ${present.map(() => '难度 | 无解感 | ').join('')}