The chain built its own worst moment: hero and tail deadlock at orientations 0
and +2 and open only at +1, with +3/+4/+5 left entirely to chance. That is why
some levels released at exactly one of six orientations, and why every model
kept writing "I don't know which way to turn" — at +2 one direction was right
and the other five were dead ends.
createDeepLock now traces candidates at all six orientations and requires the
tail to also release at +3, certified with the real swept tracer. A player
stuck at +2 turns either way and something moves. Measured by the rule bot
over the regenerated set: blind rotations, wrong-way turns and extra rotations
all go to zero, from 1.17 / 0.44 / 1.22 per level. Endgame orientation counts
shift from {1:4, 2:10, 3:4} to {2:3, 3:13, 4:1}.
It costs yield: switchback r3 and crossing r3 now produce nothing, and the set
comes out at 17 levels rather than 18. The test witnesses moved with it — a
witness is whichever seed still satisfies the construction, so they are
re-derived from the sweep rather than pinned.
docs/level-board.html is the task board for getting to 50 levels. Task state is
in bench/board.json; every number on the page — candidate count, rotation
quota, blind turns, monkey actions-per-piece, the agent batches — is measured
from the level set and the run archive at build time.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
222 lines
16 KiB
HTML
222 lines
16 KiB
HTML
<!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">第 0 轮 · 更新于 09-14 16:21 · 本页每 60 秒自动刷新</p>
|
||
<div class="progress">
|
||
<div class="bar"><i style="width:18%"></i></div>
|
||
<div class="lbl"><span>3 / 17 项完成</span><span class="mono">18%</span></div>
|
||
</div>
|
||
</header>
|
||
|
||
<h2><span class="num">A</span>现在的状态</h2>
|
||
<div class="grid">
|
||
<div class="tile "><div class="k">候选关卡</div><div class="v">17 <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">5.07</div><div class="n">目标 ≥3.0(不无脑)</div></div>
|
||
</div>
|
||
|
||
<div class="scroll"><table>
|
||
<thead><tr><th>旋转数</th><th class="n">目标关数</th><th class="n">现有</th><th>缺口</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>0 转</td><td class="n">5</td><td class="n">0</td><td><span class="tag idle">还差 5</span></td></tr>
|
||
<tr><td>1 转</td><td class="n">12</td><td class="n">0</td><td><span class="tag idle">还差 12</span></td></tr>
|
||
<tr><td>2 转</td><td class="n">15</td><td class="n">0</td><td><span class="tag idle">还差 15</span></td></tr>
|
||
<tr><td>3 转</td><td class="n">18</td><td class="n">17</td><td><span class="tag live">还差 1</span></td></tr>
|
||
</tbody></table></div>
|
||
<p class="sub">路线家族分布:weave ×4 · switchback ×1 · petals ×4 · orbits ×4 · crossing ×2 · spiral ×2 终局可走朝向分布:{"2":3,"3":13,"4":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 的复测 r 只有 0.32 / 0.19 / 0.56,是模型噪声,不能拿来调参。所以「好玩」必须换成机械代理。</p></div>
|
||
<ul class="rules sub">
|
||
<li><b>难度</b>:agent 的 difficulty 评分沿关号上升,末档逼近 3.0(3 = 刚刚好),全程不超过 3.2<span class="how">(grok 抽样评分)</span></li>
|
||
<li><b>不挫败</b>:stuck ≤ 2.0,盲转 = 0,转错方向 = 0<span class="how">(规则机器人全量扫,12 秒)</span></li>
|
||
<li><b>不无脑</b>:猴子玩家 动作÷棋子 ≥ 3.0(v0.5 全库 1.67 = 乱点就能过)<span class="how">(生成时算)</span></li>
|
||
<li><b>旋转是主线</b>:0 旋转关 ≤ 5 关(10%),且随关号推进旋转数递增<span class="how">(求解器)</span></li>
|
||
<li><b>不重复</b>:50 关盘面签名互不相同,路线家族分布不偏科<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>0–1 转</td><td class="mono">1.5 – 2.0</td></tr>
|
||
<tr><td>L13–L32</td><td>1–2 转</td><td class="mono">2.0 – 2.6</td></tr>
|
||
<tr><td>L33–L50</td><td>2–3 转</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="todo"><div class="t"><span class="tid">T1.1</span><span class="tt">深锁关(3 转)扩产到 ≥60 个候选</span><span class="tag idle">待办</span></div><div class="note">当前 14 种子出 17 关,需扩大种子与半径扫描</div></li>
|
||
<li class="todo"><div class="t"><span class="tid">T1.2</span><span class="tt">中档(2 转)生成路径</span><span class="tag idle">待办</span></div><div class="note">deep-lock 固定 3 转,v0.5 最多 2 转 —— 中档要么放宽锁链,要么从 v0.5 筛</div></li>
|
||
<li class="todo"><div class="t"><span class="tid">T1.3</span><span class="tt">简单档(0–1 转)候选池</span><span class="tag idle">待办</span></div><div class="note">从 v0.5 筛,但必须过猴子 APT 门槛(v0.5 全库中位 1.67,大部分会被刷掉)</div></li>
|
||
<li class="todo"><div class="t"><span class="tid">T1.4</span><span class="tt">去重与家族均衡</span><span class="tag idle">待办</span></div><div class="note">6 个路线家族不能偏科;v0.5 曾出现 1000 关只有 30 个模板</div></li>
|
||
</ul>
|
||
</div>
|
||
|
||
<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>
|
||
</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="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>
|
||
</div>
|
||
|
||
<div class="phase">
|
||
<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="todo"><div class="t"><span class="tid">T4.3</span><span class="tt">后续关卡制作流程的优化总结</span><span class="tag idle">待办</span></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>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>已完成前置工作:擦碰漏报修复(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> |