Files
HexTrails/docs/level-board.html
T
cabinwandClaude Opus 5 acc374e276 feat(levels): two-sided endgame release, and a board to track the 50-level run
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>
2026-09-14 16:22:08 +08:00

222 lines
16 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">第 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>