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>
This commit is contained in:
cabinw
2026-09-14 17:23:53 +08:00
co-authored by Claude Opus 5
parent 4aa0c28cef
commit 85af37b1f7
4 changed files with 35 additions and 25 deletions
+11 -9
View File
@@ -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)}
<h2>两轮之间改了什么,效果如何</h2>
<p>第一轮唯一可用的读数是「整批偏易」,加上抱怨里反复出现的「转了没反应」。据此只改了两件事:给<b>连续空转</b>设闸门(最多一次转动没反应,此前有 11 关能连着两次),以及把难度曲线<b>写成旋转深度的配额</b>而不是指望它从排序里自己长出来。第三轮又只改了一件:桶内改按<b>反差</b>取。每轮一个变量,才看得出是哪个变量起的作用。</p>
<table>
<thead><tr><th>同一个规则机器人,两套关卡集</th><th class="n">第一版</th><th class="n">第二版</th></tr></thead>
<thead><tr><th>同一个规则机器人,三套关卡集</th>${BOTS.map(([n]) => `<th class="n">${n}</th>`).join('')}</tr></thead>
<tbody>
${botOld && botNew ? `
<tr><td>盲转 / 关</td><td class="n">${f2(botOld.blind)}</td><td class="n yes">${f2(botNew.blind)}</td></tr>
<tr><td>最长连续盲转</td><td class="n">${botOld.streak}</td><td class="n yes">${botNew.streak}</td></tr>
<tr><td>空点 / 关</td><td class="n">${f2(botOld.dead)}</td><td class="n">${f2(botNew.dead)}</td></tr>
<tr><td>决策 / 关(要做的事)</td><td class="n">${f1(botOld.dec)}</td><td class="n">${f1(botNew.dec)}</td></tr>
` : '<tr><td colspan="3">规则机器人数据缺失</td></tr>'}
${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]) => `<tr><td>${label}</td>${BOTS.map(([, v], i) =>
`<td class="n ${better && i > 0 && get(v) < get(BOTS[0][1]) ? 'yes' : ''}">${get(v)}</td>`).join('')}</tr>`).join('\n')
: '<tr><td colspan="4">规则机器人数据缺失</td></tr>'}
</tbody>
</table>
<p>要做的事一样多,浪费掉的动作少了一半。这是同一个玩家的对照,所以变的是关卡不是模型的心情。</p>
<p>要做的事一样多,浪费掉的动作少了一半,而且第三版保住了这个成绩。这是同一个玩家的对照,所以变的是关卡不是模型的心情——一次 50 关的全量验收 1 秒跑完,这也是为什么全量验收该交给它而不是 agent。</p>
<table>
<thead><tr><th>grok 实测,按档(每关计一次,与它自己玩的那一版对齐)</th>${present.map(id => `<th class="n" colspan="2">${id}</th>`).join('')}</tr>
<tr><th></th>${present.map(() => '<th class="n">难度</th><th class="n">无解感</th>').join('')}</tr></thead>