Files
HexTrails/docs/level-board.html
T
cabinwandClaude Opus 5 85af37b1f7 docs(process): three sets through one rule bot, three rounds through one agent
The rule-bot table carries the third set now, which is the point of having a
rule bot at all: a full 50-level acceptance pass takes one second, so every
selection change can be checked against the previous one before any agent time
is spent. Blind rotations 0.24 → 0.12 → 0.14, worst streak 4 → 1 → 1, dead taps
zero throughout.

The band table shows all three rounds side by side, each against the levels it
actually played. Round 3 is reported as what it is: an unconfirmed hypothesis.
It raised contrast and held rotation depth, and the back band's rating did not
follow. On a rating that retests at 0.55 that settles nothing either way, so
the page says the two are indistinguishable and names the design reasons the
third set is the one being handed over — rather than quoting whichever number
makes the last change look good.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 17:23:53 +08:00

243 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="refresh" content="60">
<title>50 关任务看板</title>
<style>
:root{
--ground:#EEF1F4; --surface:#FFFFFF; --inset:#E3E8ED; --panel:#F7F9FA;
--ink:#141E28; --ink2:#48596A; --ink3:#6B7A88;
--rule:#D3DAE1; --rule2:#BFC9D2;
--rail:#435F78; --rail-soft:#8FA6BA;
--bad:#B23A26; --bad-soft:#F2DDD8;
--warn:#8A5C0F; --warn-soft:#F4E9D4;
--good:#236E64; --good-soft:#D9EDEA;
--live:#1F6FB2; --live-soft:#DCE9F4;
--shadow:0 1px 2px rgba(20,30,40,.06),0 6px 18px rgba(20,30,40,.05);
color-scheme:light;
}
@media (prefers-color-scheme:dark){:root:not([data-theme=light]){
--ground:#0F161C; --surface:#141D25; --inset:#0A1015; --panel:#141D25;
--ink:#E4EAEF; --ink2:#AEBDC9; --ink3:#8494A2;
--rule:#28343F; --rule2:#35434F;
--rail:#8CB0CC; --rail-soft:#4E6577;
--bad:#E4836C; --bad-soft:#3A211B;
--warn:#E0AE5E; --warn-soft:#33280F;
--good:#4FC7B7; --good-soft:#11302C;
--live:#6BB3EE; --live-soft:#12283A;
--shadow:0 1px 2px rgba(0,0,0,.3),0 6px 18px rgba(0,0,0,.28);
color-scheme:dark;
}}
*{box-sizing:border-box}
body{margin:0;background:var(--ground);color:var(--ink);
font-family:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",ui-sans-serif,system-ui,-apple-system,sans-serif;
line-height:1.7;-webkit-font-smoothing:antialiased}
.wrap{max-width:1080px;margin:0 auto;padding:0 24px 80px}
code,.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
header.head{padding:48px 0 26px;border-bottom:1px solid var(--rule);margin-bottom:30px}
.eyebrow{font-size:11.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink3);margin-bottom:12px}
h1{font-size:clamp(26px,4vw,38px);line-height:1.2;margin:0 0 14px;letter-spacing:-.02em;text-wrap:balance}
.meta{font-size:12.5px;color:var(--ink3)}
.progress{margin:22px 0 0}
.progress .bar{height:10px;background:var(--inset);border-radius:6px;overflow:hidden}
.progress .bar i{display:block;height:100%;background:var(--good);border-radius:6px;transition:width .4s}
.progress .lbl{display:flex;justify-content:space-between;font-size:12.5px;color:var(--ink2);margin-top:7px}
h2{font-size:21px;margin:44px 0 6px;letter-spacing:-.01em}
h2 .num{color:var(--rail-soft);font-family:ui-monospace,monospace;font-size:14px;margin-right:9px}
p{margin:0 0 12px;max-width:74ch}
.sub{color:var(--ink2);font-size:14px}
.card{background:var(--surface);border:1px solid var(--rule);border-radius:12px;padding:18px 20px;box-shadow:var(--shadow);margin:16px 0}
.callout{border-left:3px solid var(--rail);background:var(--panel);border-radius:0 10px 10px 0;padding:14px 18px;margin:16px 0}
.callout p:last-child{margin-bottom:0}
.grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(176px,1fr));margin:16px 0}
.tile{background:var(--surface);border:1px solid var(--rule);border-radius:12px;padding:14px 16px}
.tile .k{font-size:11px;letter-spacing:.06em;color:var(--ink3);text-transform:uppercase}
.tile .v{font-family:ui-monospace,monospace;font-size:25px;font-weight:600;line-height:1.25;margin-top:3px}
.tile .n{font-size:12px;color:var(--ink2);margin-top:2px}
.tile.ok .v{color:var(--good)} .tile.miss .v{color:var(--bad)} .tile.warn .v{color:var(--warn)}
table{width:100%;border-collapse:collapse;font-size:13.5px;margin:14px 0}
th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--rule)}
th{font-size:11px;letter-spacing:.06em;color:var(--ink3);text-transform:uppercase;font-weight:600;white-space:nowrap}
td.n,th.n{text-align:right;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;white-space:nowrap}
.scroll{overflow-x:auto}
.tag{display:inline-block;font-size:11px;padding:2px 9px;border-radius:20px;font-weight:600;white-space:nowrap}
.tag.good{background:var(--good-soft);color:var(--good)}
.tag.bad{background:var(--bad-soft);color:var(--bad)}
.tag.live{background:var(--live-soft);color:var(--live)}
.tag.idle{background:var(--inset);color:var(--ink3)}
.phase{margin:24px 0}
.phase h3{font-size:15.5px;margin:0 0 4px;display:flex;align-items:center;gap:10px}
.phase h3 .pid{font-family:ui-monospace,monospace;font-size:11.5px;color:var(--surface);background:var(--rail);border-radius:5px;padding:2px 7px}
.tasks{list-style:none;margin:10px 0 0;padding:0;border-left:2px solid var(--rule);margin-left:6px}
.tasks li{position:relative;padding:9px 0 9px 22px}
.tasks li::before{content:'';position:absolute;left:-6px;top:17px;width:10px;height:10px;border-radius:50%;
background:var(--ground);border:2px solid var(--rule2)}
.tasks li.done::before{background:var(--good);border-color:var(--good)}
.tasks li.doing::before{background:var(--live);border-color:var(--live);box-shadow:0 0 0 4px var(--live-soft)}
.tasks li.blocked::before{background:var(--bad);border-color:var(--bad)}
.tasks .t{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.tasks .tid{font-family:ui-monospace,monospace;font-size:11.5px;color:var(--ink3)}
.tasks .tt{font-size:14.5px;font-weight:500}
.tasks li.done .tt{color:var(--ink2)}
.tasks .note{font-size:12.5px;color:var(--ink3);margin-top:1px}
.rules li{margin-bottom:8px}
.rules b{font-weight:650}
.rules .how{font-size:12px;color:var(--ink3);margin-left:6px}
.log{list-style:none;padding:0;margin:12px 0}
.log li{padding:8px 0 8px 16px;border-left:2px solid var(--rule);font-size:13.5px;color:var(--ink2)}
.log li b{color:var(--ink);font-weight:600;font-family:ui-monospace,monospace;font-size:12px;margin-right:8px}
footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:var(--ink3);font-size:12px}
@media(max-width:640px){.wrap{padding:0 16px 60px}}
</style>
</head>
<body>
<div class="wrap">
<header class="head">
<div class="eyebrow">HEX TRAILS · 关卡调优</div>
<h1>调出 50 关难度合适、好玩的关卡,交付人工审核</h1>
<p class="meta mono">第 3 轮 · 更新于 09-14 16:45 · 本页每 60 秒自动刷新</p>
<div class="progress">
<div class="bar"><i style="width:90%"></i></div>
<div class="lbl"><span>19 / 21 项完成</span><span class="mono">90%</span></div>
</div>
</header>
<h2><span class="num">A</span>现在的状态</h2>
<div class="grid">
<div class="tile ok"><div class="k">候选关卡</div><div class="v">50 <span style="font-size:14px;color:var(--ink3)">/ 50</span></div><div class="n">当前关卡集</div></div>
<div class="tile ok"><div class="k">盲转 / 关</div><div class="v">0.00</div><div class="n">目标 0</div></div>
<div class="tile ok"><div class="k">转错方向 / 关</div><div class="v">0.00</div><div class="n">目标 0</div></div>
<div class="tile ok"><div class="k">猴子 动作÷棋子</div><div class="v">6.11</div><div class="n">目标 ≥3.0(不无脑)</div></div>
</div>
<div class="scroll"><table>
<thead><tr><th>最少旋转数</th><th class="n">候选关数</th><th>说明</th></tr></thead>
<tbody>
<tr><td>1 转</td><td class="n">5</td><td class="sub">浅</td></tr>
<tr><td>2 转</td><td class="n">5</td><td class="sub">浅</td></tr>
<tr><td>3 转</td><td class="n">26</td><td class="sub">浅</td></tr>
<tr><td>4 转</td><td class="n">10</td><td class="sub">中</td></tr>
<tr><td>5 转</td><td class="n">4</td><td class="sub">中</td></tr>
</tbody></table></div>
<p class="sub">路线家族分布:v05 ×10 · spiral ×5 · switchback ×13 · orbits ×9 · weave ×13 终局可走朝向分布:{"3":44,"4":6}</p>
<h2><span class="num">B</span>什么叫「难度合适且好玩」</h2>
<div class="callout"><p class="sub">旋转是免费的、是这个游戏的特色,玩家应该频繁做——所以不该限制旋转次数。该限制的是每一次旋转值不值:转了有没有棋子出来、能不能看出来该转哪、以及转完之后有没有「原来这么简单」的反差。评分里只有 difficulty(复测 r=0.93)和 stuck(r=0.85)可信,rotation / clarity / fun 是噪声(0.32 / 0.19 / 0.56),所以「好玩」全部换成机械代理。 另外,演出本身就是奖励——棋子沿弯路走出去的那几秒是减压点,所以开局必须有得看,而不是只有两枚贴边棋子和 0.3 秒。</p></div>
<ul class="rules sub">
<li><b>旋转要深</b>:难度来自「需要转很多次」,不是「转错受罚」。旋转数随关号上升,不设上限<span class="how">(求解器最少旋转数)</span></li>
<li><b>每转都有回报</b>:每一次旋转至少放出 2 枚棋子;无效转动 = 0<span class="how">(deepLevelStats.releasePerTurn / 规则机器人)</span></li>
<li><b>演出是回报</b>:开局就要有得看:可点 ≥3 枚、其中最好的一条离场演出 ≥0.9s;全关长巡游(≥0.9s)≥3 次<span class="how">(showStats,用真实动画计时)</span></li>
<li><b>反差感</b>:平均反差 ≥12:棋子在某个朝向看着像噩梦(长路线多弯),转过去就是几步走出(代价 = 格数 + 2×弯数)<span class="how">(六朝向逐棋子代价差)</span></li>
<li><b>不无脑</b>:猴子 动作÷棋子 ≥3.0(v0.5 全库 1.67 = 乱点就能过)<span class="how">(生成时算)</span></li>
<li><b>不挫败</b>:stuck ≤2.0;终局任一朝向卡住时,左右转都能开<span class="how">(grok 抽样 + 求解器)</span></li>
<li><b>不重复</b>:盘面签名互不相同,路线家族分布不偏科<span class="how">(deepLevelKey)</span></li>
</ul>
<div class="scroll"><table>
<thead><tr><th>关号区间</th><th>旋转数</th><th>目标 difficulty 评分</th></tr></thead>
<tbody>
<tr><td>L1–L12</td><td>2–3 转</td><td class="mono">1.5 – 2.0</td></tr>
<tr><td>L13–L32</td><td>3–5 转</td><td class="mono">2.0 – 2.6</td></tr>
<tr><td>L33–L50</td><td>5–8 转</td><td class="mono">2.6 – 3.0</td></tr>
</tbody></table></div>
<h2><span class="num">C</span>任务</h2>
<div class="phase">
<h3><span class="pid">P0</span>判据:先说清楚什么叫「好」</h3>
<ul class="tasks">
<li class="done"><div class="t"><span class="tid">T0.1</span><span class="tt">难度曲线与旋转配额定义</span><span class="tag good">完成</span></div><div class="note">50 关分三档,0 转关卡死 10% 上限(用户硬要求)</div></li>
<li class="done"><div class="t"><span class="tid">T0.2</span><span class="tt">机械验收门槛</span><span class="tag good">完成</span></div><div class="note">盲转=0、转错=0、终局可走朝向≥2 —— 前两项已由改锁结构达成</div></li>
<li class="done"><div class="t"><span class="tid">T0.3</span><span class="tt">「好玩」的机械代理指标</span><span class="tag good">完成</span></div><div class="note">猴子 APT ≥3.0。fun 评分复测 r=0.56 不可用,改用「乱点过不了」当代理</div></li>
</ul>
</div>
<div class="phase">
<h3><span class="pid">P1</span>产能:解除旋转上限,把反差感做进筛选</h3>
<ul class="tasks">
<li class="done"><div class="t"><span class="tid">T1.1</span><span class="tt">growDeepLevel 扩展到 6 个朝向</span><span class="tag good">完成</span></div><div class="note">现在只在朝向 0/1/2 插棋子,所以最少旋转恒等于 3 —— 这是「太简单」的根因</div></li>
<li class="done"><div class="t"><span class="tid">T1.2</span><span class="tt">解除 rotations===3 的硬限制,允许 4/5/6+</span><span class="tag good">完成</span></div></li>
<li class="done"><div class="t"><span class="tid">T1.3</span><span class="tt">反差感指标进 deepLevelStats 并作门槛</span><span class="tag good">完成</span></div><div class="note">contrastStats 已进 deepLevelStats 并作门槛;实测 weave 22–33、switchback 29、spiral 18–24、orbits 12–17,petals 仅 2.0–5.7、crossing 3.8–5.5</div></li>
<li class="done"><div class="t"><span class="tid">T1.4</span><span class="tt">每转释放 ≥2 枚的门槛</span><span class="tag good">完成</span></div><div class="note">改为按朝向配额插棋(每个朝向 ≥2 枚在等),取代原来的随机比例——随机比例会留下空转的朝向</div></li>
<li class="done"><div class="t"><span class="tid">T1.5</span><span class="tt">扩产到 ≥120 候选并去重、家族均衡</span><span class="tag good">完成</span></div><div class="note">两批共 720 个种子 → 1113 个候选 → 过闸门 369 关(原 228)。家族 weave 262 / switchback 58 / orbits 39 / spiral 10</div></li>
<li class="blocked"><div class="t"><span class="tid">T1.6</span><span class="tt">终局三枚互锁(hero+gate+tail)</span><span class="tag bad">受阻</span></div><div class="note">量化了:扫 1113 个候选,过闸门后深度≥4 的只有 23 个(2%)。第二次扩池把种子数翻倍,深关卡只从 16 涨到 23 —— 难度上限是构造的供给瓶颈,不是筛选问题。后档平均 4.0 转就是这个供给能支撑的上限</div></li>
<li class="done"><div class="t"><span class="tid">T1.7</span><span class="tt">开局展示位(快速爽到)</span><span class="tag good">完成</span></div><div class="note">实测整个构造的开局中位只有 2 枚可点、最佳演出 0.57s——锁链开局全锁死。在构造里预留 2 个开局位(立即可点且路线长到值得看),实测开局可点 2→3 枚、最佳演出 0.72s→1.12s</div></li>
<li class="done"><div class="t"><span class="tid">T1.8</span><span class="tt">离场演出封顶</span><span class="tag good">完成</span></div><div class="note">计时原本线性无上限,最长一次 17.4s,正式关 18.8% 超过 2s。拐点 2.4s 以下完全不变,以上加速逼近 3.2s 上限。labs/exit-timing 可同步对比</div></li>
</ul>
</div>
<div class="phase">
<h3><span class="pid">P2</span>标定:把机械指标映射到真实难度</h3>
<ul class="tasks">
<li class="done"><div class="t"><span class="tid">T2.1</span><span class="tt">grok 抽样跑候选池,收集 difficulty / stuck</span><span class="tag good">完成</span></div><div class="note">R1:grok-4.6 xhigh 全量跑 50 关,收齐 difficulty / stuck / 机械指标与自由文本抱怨</div></li>
<li class="blocked"><div class="t"><span class="tid">T2.2</span><span class="tt">拟合 difficulty ~ 机械特征</span><span class="tag bad">受阻</span></div><div class="note">做不成,且不是样本量问题:27 关里 26 关 difficulty 都打 2 分,响应几乎无方差,回归的是常数。根因在 bench 本身——文字盘面把每颗棋子的路线、挡路者、紧贴者直接列成清单,agent 不必用眼睛顺线走,而那正是这游戏的难点。agent 原话:「挡路名单已经写全,不用顺着格子数」。为解释它另建的 legibility 指标与评分相关 -0.02,同样无效,已记录为负结果不采用</div></li>
<li class="done"><div class="t"><span class="tid">T2.3</span><span class="tt">用模型给全部候选打分并按曲线选 50 关</span><span class="tag good">完成</span></div><div class="note">select-50 按机械特征打分并均匀铺开,家族上限 36%。权重是设计假设而非拟合结果(见 T2.2),由人工审核裁定</div></li>
</ul>
</div>
<div class="phase">
<h3><span class="pid">P3</span>迭代:跑几轮把曲线调平</h3>
<ul class="tasks">
<li class="done"><div class="t"><span class="tid">T3.1</span><span class="tt">第 1 轮:grok 全量跑 50 关</span><span class="tag good">完成</span></div><div class="note">50 关全部跑完;机械面干净:空点 0、盲转 ~0.3/关、全部通关。总体读数:整批偏易一档(2 分 vs 刚好的 3 分)</div></li>
<li class="done"><div class="t"><span class="tid">T3.2</span><span class="tt">按实测曲线调整选关,重选</span><span class="tag good">完成</span></div><div class="note">连续空转设闸门(≤1)+ 难度曲线改为按旋转深度配额。同一规则机器人对照:盲转 0.24→0.12,最长连续盲转 4→1,决策数不变</div></li>
<li class="done"><div class="t"><span class="tid">T3.3</span><span class="tt">第 2 轮验证</span><span class="tag good">完成</span></div><div class="note">R2:99 局覆盖 50 关,全部通关,空点 0。难度按档 2.00 / 2.05 / 2.40,无解感 1.21 / 1.15 / 1.74 —— 评分第一次出现梯度</div></li>
<li class="done"><div class="t"><span class="tid">T3.4</span><span class="tt">收敛判定(难度曲线单调、stuck 达标)</span><span class="tag good">完成</span></div><div class="note">收敛判定完成。机械面:空点 0、不可解态 0、连续空转≤1、终局朝向≥3、三轮全部通关。难度面:三档 2.00 / 2.05 / 2.17,单调但后档低于「刚刚好」的 3 分——上限由深关卡供给决定(见 T1.6),且这项评分复测 r=0.55,本身不足以再往下调。剩下的交人工审核</div></li>
</ul>
</div>
<div class="phase">
<h3><span class="pid">P4</span>交付</h3>
<ul class="tasks">
<li class="done"><div class="t"><span class="tid">T4.1</span><span class="tt">50 关关卡集</span><span class="tag good">完成</span></div><div class="note">levels/campaign-50.json + src/levels-c50.js,已注册为可玩版本 c50,198 项测试全绿</div></li>
<li class="done"><div class="t"><span class="tid">T4.2</span><span class="tt">人工审核页(可直接试玩每一关)</span><span class="tag good">完成</span></div><div class="note">docs/review-50.html:50 张开局盘面缩略图 + 机械指标 + agent 实测 + 试玩直达;并标注「哪些数字能信」,把感知类问题(路线长度、紧贴)显式交给人眼</div></li>
<li class="done"><div class="t"><span class="tid">T4.3</span><span class="tt">后续关卡制作流程的优化总结</span><span class="tag good">完成</span></div><div class="note">docs/level-process.html:两轮对照、复测可信度表(本批现算)、五条规则各带证据、被否掉的做法清单</div></li>
</ul>
</div>
<h2><span class="num">E</span>已有的 agent 实测</h2>
<div class="scroll"><table>
<thead><tr><th>批次</th><th class="n">关数</th><th class="n">difficulty</th><th class="n">stuck</th><th class="n">盲转/关</th><th class="n">多转/关</th></tr></thead>
<tbody>
<tr><td>R2 · grok xhigh</td><td class="n">100</td><td class="n">2.16</td><td class="n">1.37</td><td class="n">0.12</td><td class="n">0.24</td></tr>
<tr><td>R3 · grok xhigh</td><td class="n">53</td><td class="n">2.08</td><td class="n">1.32</td><td class="n">0.13</td><td class="n">0.25</td></tr>
<tr><td>R1 · grok xhigh</td><td class="n">50</td><td class="n">2.10</td><td class="n">1.44</td><td class="n">0.24</td><td class="n">0.38</td></tr>
<tr><td>Codex CLI · gpt-6-astra low</td><td class="n">18</td><td class="n">2.44</td><td class="n">1.44</td><td class="n">1.17</td><td class="n">1.22</td></tr>
<tr><td>Codex CLI · spark xhigh</td><td class="n">18</td><td class="n">3.11</td><td class="n">2.28</td><td class="n">1.17</td><td class="n">1.17</td></tr>
<tr><td>Grok Build CLI · xhigh</td><td class="n">18</td><td class="n">2.39</td><td class="n">1.83</td><td class="n">1.17</td><td class="n">1.22</td></tr>
<tr><td>pi · Grok 4.6 xhigh</td><td class="n">18</td><td class="n">2.39</td><td class="n">1.89</td><td class="n">1.17</td><td class="n">1.22</td></tr>
<tr><td>pi · Grok 4.6 xhigh · 复测</td><td class="n">18</td><td class="n">2.44</td><td class="n">1.78</td><td class="n">1.39</td><td class="n">1.56</td></tr>
<tr><td>pi · Grok 4.6 xhigh · 新门槛</td><td class="n">18</td><td class="n">2.11</td><td class="n">1.39</td><td class="n">0.28</td><td class="n">0.33</td></tr>
<tr><td>Kimi CLI · k3 high</td><td class="n">18</td><td class="n">2.94</td><td class="n">1.83</td><td class="n">1.17</td><td class="n">1.22</td></tr>
<tr><td>Codex · high reasoning</td><td class="n">10</td><td class="n">3.00</td><td class="n">1.90</td><td class="n">0.40</td><td class="n">0.50</td></tr>
<tr><td>Codex CLI · xhigh</td><td class="n">6</td><td class="n">3.00</td><td class="n">2.17</td><td class="n">0.33</td><td class="n">0.33</td></tr>
</tbody></table></div>
<p class="sub">difficulty 3 = 刚刚好;stuck 越低越好。这两项是评分里唯二复测可信的(r = 0.93 / 0.85)。</p>
<h2><span class="num">F</span>日志</h2>
<ul class="log">
<li><b>一个差点报错的对照</b>levels/campaign-50-r2.json 本应是 R2 玩的那一版,实际只含 28 个 R2 盘面、46 个 R3 盘面——select-50 原地覆盖同一路径,中间跑过的选关实验把它换掉了。改为从 run 反建(run 自带完整盘面与序号),并删掉该快照</li>
<li><b>R3 结果</b>第三轮只改一个变量:桶内按反差取关。后档反差 27.9→28.5、旋转深度不变,后档评分 2.39→2.17。以 r=0.55 的复测可信度,十几关上的这点差距分不出胜负——记为「未证实」,第三版保留的理由是设计面的(反差是策划点名的好玩机制)与家族均衡(两家族 30/50 → 26/50)</li>
<li><b>供给瓶颈</b>扩池两轮共 720 种子、1113 候选,深度≥4 的过闸门后只有 23 个(2%)。种子翻倍只让深关卡从 16 涨到 23,说明 growDeepLevel 难以造出需要四转以上的关卡——这是后档难度的硬上限</li>
<li><b>R2 结果</b>难度评分按档 2.00/2.05/2.40(R1 是三档全平),无解感 1.21/1.15/1.74。意外把每关跑了两次,得到 45 对复测:84% 重放了完全相同的动作序列,机械指标 r=1.00,难度评分 r=0.55——且评分分歧的那几对全是同轨迹。结论:agent 近乎确定性,同一关不必跑两遍</li>
<li><b>R2 依据</b>后段 14 条抱怨里两类:路线太长(感知,已对照 v0.5 基线否掉)与「转了没反应」(机械,可设闸门)。只改后者:endgameMinOpen 2→3、doubleDead 无闸门→≤2。两条合计只留 16% 候选,所以先扩池</li>
<li><b>未擅自改动</b>agent 33 条抱怨里两大主题是路线太长(68 格 27 弯)与紧贴易看漏。但已上线的 v0.5 在这两项上更严重(最长 88 格 vs 84 格),属于游戏本来的性格;且文字盘面会同时夸大和缩小感知问题。因此只在审核页标出,不擅自设闸门</li>
<li><b>R1 结论</b>难度评分在这批关卡上无区分度(26/27 都是 2 分),原因是文字 bench 把判断白送给了 agent。结论:agent 轮次用于抓缺陷(死局、盲转、空点、演出),难度排序只能靠机械假设 + 人工审核。这条改变了后续流程的设计</li>
<li><b>演出</b>离场动画封顶定稿(拐点 2.4s / 上限 3.2s),最长 17.4s→3.5s;拐点以下手感不变。同时发现开局演出是结构性缺陷并在构造里修掉</li>
<li><b>P1 进展</b>旋转深度打开:生成分布从「全部恒为3」变成 {3,4,5,6,7,8,9}。两次结构性猜测失败并已撤回(插入端多朝向出口过滤实测零效果)。深关卡的瓶颈定位为终局三枚互锁,改用扩大扫描量应对</li>
<li><b>方向修正</b>旋转配额的思路被推翻:旋转免费且是核心特色,不该限次数,该限的是每次旋转的回报与可读性。实测发现 17 关最少旋转全部恒为 3(生成器写死),且 petals/crossing 两个家族几乎没有反差感(平均 2.0–5.7 对比 weave 的 22–33)</li>
<li><b>起点</b>已完成前置工作:擦碰漏报修复(113/581 例)、终局单出口门槛、锁结构改为双向可开 —— 规则机器人盲转/转错/多转已全部归零</li>
</ul>
<footer>
<p class="mono">看板状态:bench/board.json · 生成:node scripts/build-board.mjs · 页面数字(候选数、盲转、猴子 APT、agent 实测)由脚本从关卡集与 bench/runs 直接测得,不是手写</p>
</footer>
</div>
</body>
</html>