feat(bench): fit difficulty from a played round, and report when it cannot
refit-weights regresses the weights select-50 scores with against what agents actually experienced, so a round of play is a flag on the next selection rather than an edit. Ridge, because seven collinear features on fifty levels otherwise hand back large coefficients that cancel. Most of the work here is in refusing to produce a number. The response averages the difficulty rating with two continuous measures of the same thing, and a component with no spread is dropped by name instead of being silently averaged in as zeros — which is what the first version did, reporting R² = 0.75 for a fit that never saw a rating. When the rating is flat the script now says so and says what the remaining fit is really measuring, which is board size. legibility() asks what it costs to know what you may tap: how far the eye must follow the cheapest free piece, and how many pieces are held by somebody their line never touches. It was built to explain why ratings came back flat. It does not — it correlates -0.02 with them — so it stays a measurement, printed on the review sheet beside the longest route on the board, and gates nothing. prototype-d5 takes --seedFrom so a wide sweep shards across cores. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+21
-14
@@ -98,28 +98,32 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
|
||||
<header class="head">
|
||||
<div class="eyebrow">HEX TRAILS · 关卡调优</div>
|
||||
<h1>调出 50 关难度合适、好玩的关卡,交付人工审核</h1>
|
||||
<p class="meta mono">第 0 轮 · 更新于 09-14 16:45 · 本页每 60 秒自动刷新</p>
|
||||
<p class="meta mono">第 1 轮 · 更新于 09-14 16:45 · 本页每 60 秒自动刷新</p>
|
||||
<div class="progress">
|
||||
<div class="bar"><i style="width:43%"></i></div>
|
||||
<div class="lbl"><span>9 / 21 项完成</span><span class="mono">43%</span></div>
|
||||
<div class="bar"><i style="width:62%"></i></div>
|
||||
<div class="lbl"><span>13 / 21 项完成</span><span class="mono">62%</span></div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<h2><span class="num">A</span>现在的状态</h2>
|
||||
<div class="grid">
|
||||
<div class="tile "><div class="k">候选关卡</div><div class="v">18 <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">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">4.96</div><div class="n">目标 ≥3.0(不无脑)</div></div>
|
||||
<div class="tile ok"><div class="k">猴子 动作÷棋子</div><div class="v">6.53</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>3 转</td><td class="n">18</td><td class="sub">浅</td></tr>
|
||||
<tr><td colspan="3" class="sub">旋转深度没有梯度——生成器把最少旋转写死了,这正是「太简单」的根因</td></tr>
|
||||
<tr><td>1 转</td><td class="n">3</td><td class="sub">浅</td></tr>
|
||||
<tr><td>2 转</td><td class="n">10</td><td class="sub">浅</td></tr>
|
||||
<tr><td>3 转</td><td class="n">31</td><td class="sub">浅</td></tr>
|
||||
<tr><td>4 转</td><td class="n">3</td><td class="sub">中</td></tr>
|
||||
<tr><td>5 转</td><td class="n">3</td><td class="sub">中</td></tr>
|
||||
|
||||
</tbody></table></div>
|
||||
<p class="sub">路线家族分布:switchback ×4 · weave ×4 · petals ×4 · orbits ×4 · crossing ×2 终局可走朝向分布:{"2":7,"3":11}</p>
|
||||
<p class="sub">路线家族分布:v05 ×13 · switchback ×7 · weave ×18 · orbits ×10 · spiral ×2 终局可走朝向分布:{"1":5,"2":22,"3":21,"4":1,"5":1}</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>
|
||||
@@ -168,17 +172,17 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
|
||||
<div class="phase">
|
||||
<h3><span class="pid">P2</span>标定:把机械指标映射到真实难度</h3>
|
||||
<ul class="tasks">
|
||||
<li class="todo"><div class="t"><span class="tid">T2.1</span><span class="tt">grok 抽样跑候选池,收集 difficulty / stuck</span><span class="tag idle">待办</span></div><div class="note">分层抽样,覆盖各旋转档与各家族</div></li>
|
||||
<li class="todo"><div class="t"><span class="tid">T2.2</span><span class="tt">拟合 difficulty ~ 机械特征</span><span class="tag idle">待办</span></div><div class="note">候选特征:旋转数、锁住率、猴子 APT、棋子数、路线长度、终局路口数</div></li>
|
||||
<li class="todo"><div class="t"><span class="tid">T2.3</span><span class="tt">用模型给全部候选打分并按曲线选 50 关</span><span class="tag idle">待办</span></div></li>
|
||||
<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="todo"><div class="t"><span class="tid">T3.1</span><span class="tt">第 1 轮:grok 全量跑 50 关</span><span class="tag idle">待办</span></div></li>
|
||||
<li class="todo"><div class="t"><span class="tid">T3.2</span><span class="tt">按实测曲线调整选关,重选</span><span class="tag idle">待办</span></div></li>
|
||||
<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="doing"><div class="t"><span class="tid">T3.2</span><span class="tt">按实测曲线调整选关,重选</span><span class="tag live">进行中</span></div><div class="note">按 R1 唯一可用的总体读数「偏易」调整:扩池到 400 种子后把旋转深度整体上推,而不是按关排名重选</div></li>
|
||||
<li class="todo"><div class="t"><span class="tid">T3.3</span><span class="tt">第 2 轮验证</span><span class="tag idle">待办</span></div></li>
|
||||
<li class="todo"><div class="t"><span class="tid">T3.4</span><span class="tt">收敛判定(难度曲线单调、stuck 达标)</span><span class="tag idle">待办</span></div></li>
|
||||
</ul>
|
||||
@@ -188,7 +192,7 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
|
||||
<h3><span class="pid">P4</span>交付</h3>
|
||||
<ul class="tasks">
|
||||
<li class="todo"><div class="t"><span class="tid">T4.1</span><span class="tt">50 关关卡集</span><span class="tag idle">待办</span></div></li>
|
||||
<li class="todo"><div class="t"><span class="tid">T4.2</span><span class="tt">人工审核页(可直接试玩每一关)</span><span class="tag idle">待办</span></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="todo"><div class="t"><span class="tid">T4.3</span><span class="tt">后续关卡制作流程的优化总结</span><span class="tag idle">待办</span></div></li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -200,6 +204,7 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
|
||||
<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>R1 · grok xhigh</td><td class="n">39</td><td class="n">2.05</td><td class="n">1.36</td><td class="n">0.15</td><td class="n">0.18</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>
|
||||
@@ -214,6 +219,8 @@ footer{margin-top:56px;padding-top:20px;border-top:1px solid var(--rule);color:v
|
||||
|
||||
<h2><span class="num">F</span>日志</h2>
|
||||
<ul class="log">
|
||||
<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>
|
||||
|
||||
+225
-35
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user