diff --git a/docs/bench-reliability.html b/docs/bench-reliability.html index d418405..6973cdb 100644 --- a/docs/bench-reliability.html +++ b/docs/bench-reliability.html @@ -103,11 +103,12 @@ footer{margin-top:64px;padding-top:22px;border-top:1px solid var(--rule);color:v
HEX TRAILS · 关卡实验台

Agent 评级里,哪些数字真能拿来做关卡

同一批关卡、同一个模型、同一套盘面,跑两遍。能重现的指标才配进流程——这份报告把每个指标逐个检验了一遍,结论和直觉相反。

-

生成于 2026-09-14 14:57 GMT+8 · 数据来自 bench/runs 的 157 局 · 关卡集 levels/prototypes/d5.json(18 关)

+

生成于 2026-09-14 15:37 GMT+8 · 数据来自 bench/runs 的 175 局 · 关卡集 levels/prototypes/d5.json(18 关)

01参与检验的批次

每一批用 agent 字段标识,不靠文件名猜来源。「旧盘面」指擦碰只报第一个阻挡者的版本,「新盘面」指修复后全部列出的版本。

+

模型名以 CLI 启动时打印的解析结果为准,而不是提示词里让 agent 自报的名字——有一批 18 局曾被标成 codex-spark,实际是配置在运行前被改掉、跑成了 gpt-6-astra/low,存档已按日志头更正。

@@ -115,10 +116,11 @@ footer{margin-top:64px;padding-top:22px;border-top:1px solid var(--rule);color:v - - + + +
批次关数通关空点擦碰空点盲转转错多转单局均每决策
grok-4.6 · 新盘面 · 第 1 次1818/18212182255 s3.9 s
grok-4.6 · 新盘面 · 第 2 次1818/180025102849 s3.9 s
codex-spark · 旧盘面66/60022215 s1.4 s
codex-spark · 新盘面1818/18102182241 s7.0 s
kimi-k3 · 新盘面1818/18002182248 s5.2 s
gpt-6-astra · low · 新盘面1818/18102182241 s7.0 s
codex-spark · xhigh · 新盘面1817/18002172121 s1.8 s
kimi-k3 · high · 新盘面1818/18002182248 s5.2 s
-

所有批次通关率都是 100%。这本身就是一条结论:通关率在这批内容上毫无区分度,任何流程都不该建立在通过/失败上。

+

已完成的对局通关率全部是 100%(个别批次仍有对局在进行中,未计入)。通关率在这批内容上毫无区分度,任何流程都不该建立在通过/失败上。

02信度检验:跑两遍还一样吗

@@ -236,38 +238,38 @@ footer{margin-top:64px;padding-top:22px;border-top:1px solid var(--rule);color:v

下表是同一套盘面下所有批次的 多转 / 盲转 / 转错方向。不同厂商的模型、不同 harness、各自独立跑——如果这些数字真的由关卡决定,它们就该一样。

-
逐关完全一致
17 / 18
三项数字一个不差
-
参与批次
4
grok新① · grok新② · kimi · spark新
+
逐关完全一致
16 / 18
三项数字一个不差
+
参与批次
5
grok新① · grok新② · kimi · astra · spark新
- + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +
关家族grok新①grok新②kimispark新一致
关家族grok新①grok新②kimiastraspark新一致
L1switchback0/0/00/0/00/0/00/0/0✔
L2switchback1/1/11/1/11/1/11/1/1✔
L3weave0/0/00/0/00/0/00/0/0✔
L4switchback1/1/11/1/11/1/11/1/1✔
L5weave1/1/11/1/11/1/11/1/1✔
L6weave0/0/00/0/00/0/00/0/0✔
L7petals0/0/00/0/00/0/00/0/0✔
L8petals0/0/00/0/00/0/00/0/0✔
L9weave2/1/02/1/02/1/02/1/0✔
L10petals0/0/00/0/00/0/00/0/0✔
L11petals0/0/00/0/00/0/00/0/0✔
L12switchback1/1/11/1/11/1/11/1/1✔
L13orbits4/4/110/8/34/4/14/4/1✘
L14crossing0/0/00/0/00/0/00/0/0✔
L15orbits4/4/14/4/14/4/14/4/1✔
L16orbits0/0/00/0/00/0/00/0/0✔
L17spiral4/4/14/4/14/4/14/4/1✔
L18spiral4/4/14/4/14/4/14/4/1✔
L1switchback0/0/00/0/00/0/00/0/00/0/0✔
L2switchback1/1/11/1/11/1/11/1/11/1/1✔
L3weave0/0/00/0/00/0/00/0/00/0/0✔
L4switchback1/1/11/1/11/1/11/1/11/1/1✔
L5weave1/1/11/1/11/1/11/1/11/1/1✔
L6weave0/0/00/0/00/0/00/0/00/0/0✔
L7petals0/0/00/0/00/0/00/0/00/0/0✔
L8petals0/0/00/0/00/0/00/0/00/0/0✔
L9weave2/1/02/1/02/1/02/1/02/1/0✔
L10petals0/0/00/0/00/0/00/0/00/0/0✔
L11petals0/0/00/0/00/0/00/0/00/0/0✔
L12switchback1/1/11/1/11/1/11/1/11/1/1✔
L13orbits4/4/110/8/34/4/14/4/14/4/1✘
L14crossing0/0/00/0/00/0/00/0/00/0/0✔
L15orbits4/4/14/4/14/4/14/4/14/4/1✔
L16orbits0/0/00/0/00/0/00/0/00/0/0✔
L17spiral4/4/14/4/14/4/14/4/14/4/1✔
L18spiral4/4/14/4/14/4/14/4/13/4/0✘
-

这是全份报告里最硬的一条结论。17/18 关上,独立运行的不同模型给出了完全相同的旋转三元组。这意味着规则机器人 12 秒扫出来的这三个数,等价于大模型跑几小时的结果——这个维度完全不需要 agent。

+

这是全份报告里最硬的一条结论。16/18 关上,独立运行的不同模型给出了完全相同的旋转三元组。这意味着规则机器人 12 秒扫出来的这三个数,等价于大模型跑几小时的结果——这个维度完全不需要 agent。

不一致的关:不是难,是不稳定

下面这些关在不同运行之间给出了不同的数字。排除模型差异后,剩下的解释是同一关的体验取决于起手方向——两个玩家玩同一关,一个觉得还行,一个觉得这关有毛病。这比"稳定地难"更值得处理。

-
L13 orbits:4/4/1 / 10/8/3 / 4/4/1 / 4/4/1
+
L13 orbits:4/4/1 / 10/8/3 / 4/4/1 / 4/4/1 / 4/4/1
L18 spiral:4/4/1 / 4/4/1 / 4/4/1 / 4/4/1 / 3/4/0

04家族结构:机械指标指向同一个地方

把「多转」按路线家族平均。这是关卡结构问题,不是玩家问题——两批 grok、以及 spark,在这一点上给出一致的结果。

@@ -340,7 +342,7 @@ footer{margin-top:64px;padding-top:22px;border-top:1px solid var(--rule);color:v 0.3 -

codex-spark · 新盘面 · 各家族平均多转

+

gpt-6-astra · low · 新盘面 · 各家族平均多转

spiral2 关 4.0
@@ -360,7 +362,27 @@ footer{margin-top:64px;padding-top:22px;border-top:1px solid var(--rule);color:v 0.0
-

kimi-k3 · 新盘面 · 各家族平均多转

+

codex-spark · xhigh · 新盘面 · 各家族平均多转

+
spiral2 关 + + 3.5
+
orbits3 关 + + 2.7
+
switchback4 关 + + 0.8
+
weave4 关 + + 0.8
+
petals4 关 + + 0.0
+
crossing1 关 + + 0.0
+ +

kimi-k3 · high · 新盘面 · 各家族平均多转

spiral2 关 4.0
@@ -386,7 +408,7 @@ footer{margin-top:64px;padding-top:22px;border-top:1px solid var(--rule);color:v

05Agent 说了什么

评分是 1–5 的数字,worst 是它自己写的一句话。下面按反复出现的主题归类——价值在重复模式,不在单条内容。

-

擦碰看不出来 · 27 次提及

+

擦碰看不出来 · 28 次提及

L1 switchback(grok旧):开局 t2/t11 路上看着没人其实会擦到,差点空点;只剩 t0 和 t3 对堵时短暂以为卡住了
L3 weave(grok旧):t5走后(第9步)t2和t3都像能出界,其实互相擦碰,只能再转
L3 weave(grok新①):朝向1时 t2 和 t3 互相擦碰、t0 被 t2 压着,短暂不确定是再转还是还有能点的
@@ -398,7 +420,7 @@ footer{margin-top:64px;padding-top:22px;border-top:1px solid var(--rule);color:v
L2 switchback(spark旧):第 8-9 步清掉 t5,t4,t2 后只剩 t0/t3 互压,朝向2不再有出口,开始不确定该是继续走还是转哪边
L3 weave(spark旧):第 5 步:第一轮转盘前所有可见线路都被压住/擦边,必须停下来判断该往哪个方向转
-

长路线读不动 · 22 次提及

+

长路线读不动 · 23 次提及

L1 switchback(kimi):第 10 步后 t0/t2/t3/t10 四枚互相压成环,盘面上看不出解法,只能靠旋转试出新朝向
L6 weave(grok新①):开局 t0/t1 路线三十多格绕完全盘,只能靠路上有谁的摘要,看不出线实际怎么走
L7 petals(grok旧):开局 t0/t3 各 19 格 15 弯还叠着好几枚,文字路线太长,分不清该先解哪一层
@@ -409,7 +431,7 @@ footer{margin-top:64px;padding-top:22px;border-top:1px solid var(--rule);color:v
  1. 生成期硬门槛 · 零成本

    用已有求解器,在生成时就卡掉:最少旋转 ≥ 2、开局锁住率 ≤ 90%、首转两个方向都能推进、无死局状态。不合格的根本不进候选池。

  2. 规则机器人全量扫 · 1000 关 12 秒

    产出盲转 / 多转 / 转错方向。按 盲转 ≥ 2 或 多转 ≥ 2 打标。这条规则在 D5 上正好命中 orbits+spiral 那几关,和两个大模型跑两小时得到的结论一致。

  3. -
  4. Agent 只跑被标记的 + 5% 随机抽样

    不是 1000 关全跑。收集三样东西:difficulty(r=0.93,可用来给 1000 关排序)、stuck(r=0.85,体感无解的直接信号)、以及 worst 文字(重复模式能挖出系统性缺陷)。丢掉 rotation / clarity / fun——复测 r 只有 0.32 / 0.19 / 0.56,是模型噪声。按实测 48 s/关、4 路并行,150 关约半小时。

  5. +
  6. Agent 只跑被标记的 + 5% 随机抽样

    不是 1000 关全跑。收集三样东西:difficulty(r=0.93,可用来给 1000 关排序)、stuck(r=0.85,体感无解的直接信号)、以及 worst 文字(重复模式能挖出系统性缺陷)。丢掉 rotation / clarity / fun——复测 r 只有 0.32 / 0.19 / 0.56,是模型噪声。按实测 43 s/关、4 路并行,150 关约半小时。

  7. 真人标定锚点 · 5–10 关

    Agent 的难度排序可信(复测 r=0.93),但绝对值可能整体偏移——它觉得「刚好」的关,真人可能觉得太简单。所以真人只需要玩少数几关当锚点,把 agent 的相对排序映射到真实难度刻度上,不必逐关评。这比原本设想的省很多人力。

diff --git a/scripts/build-bench-report.mjs b/scripts/build-bench-report.mjs index 68045ef..146a478 100644 --- a/scripts/build-bench-report.mjs +++ b/scripts/build-bench-report.mjs @@ -31,13 +31,15 @@ const BATCHES = [ { tag: 'pi · Grok 4.6 xhigh', label: 'grok-4.6 · 新盘面 · 第 1 次', short: 'grok新①', format: 'new' }, { tag: 'pi · Grok 4.6 xhigh · 复测', label: 'grok-4.6 · 新盘面 · 第 2 次', short: 'grok新②', format: 'new' }, { tag: 'Codex CLI · xhigh', label: 'codex-spark · 旧盘面', short: 'spark旧', format: 'old' }, - { tag: 'Codex CLI · xhigh · 新盘面', label: 'codex-spark · 新盘面', short: 'spark新', format: 'new' }, - { tag: 'Kimi CLI · k3 high', label: 'kimi-k3 · 新盘面', short: 'kimi', format: 'new' }, + { tag: 'Codex CLI · gpt-6-astra low', label: 'gpt-6-astra · low · 新盘面', short: 'astra', format: 'new' }, + { tag: 'Codex CLI · spark xhigh', label: 'codex-spark · xhigh · 新盘面', short: 'spark新', format: 'new' }, + { tag: 'Kimi CLI · k3 high', label: 'kimi-k3 · high · 新盘面', short: 'kimi', format: 'new' }, ]; // Batches run under the fixed board format, i.e. everything that can be // compared across models without the format change confounding it. -const NEW_TAGS = ['pi · Grok 4.6 xhigh', 'pi · Grok 4.6 xhigh · 复测', 'Kimi CLI · k3 high', 'Codex CLI · xhigh · 新盘面']; +const NEW_TAGS = ['pi · Grok 4.6 xhigh', 'pi · Grok 4.6 xhigh · 复测', 'Kimi CLI · k3 high', + 'Codex CLI · gpt-6-astra low', 'Codex CLI · spark xhigh']; const runs = readdirSync(RUNS).filter(f => f.endsWith('.json') && f !== 'index.json') .map(f => { try { return JSON.parse(readFileSync(resolve(RUNS, f), 'utf8')); } catch { return null; } }) @@ -78,7 +80,7 @@ const METRICS = [ ]; function pair(tagA, tagB) { - const A = byTag[tagA], B = byTag[tagB]; + const A = byTag[tagA] || {}, B = byTag[tagB] || {}; const shared = Object.keys(A).filter(k => B[k]).map(Number).sort((a, b) => a - b); return { shared, A, B }; } @@ -172,7 +174,6 @@ function batchSummary(b) { const summaries = present.map(batchSummary).filter(Boolean); const clean = reliability('pi · Grok 4.6 xhigh', 'pi · Grok 4.6 xhigh · 复测'); const confounded = reliability('Grok Build CLI · xhigh', 'pi · Grok 4.6 xhigh'); -const sparkPair = reliability('Codex CLI · xhigh · 新盘面', 'pi · Grok 4.6 xhigh'); // worst-step notes, grouped by the theme they name const THEMES = [ @@ -340,6 +341,7 @@ footer{margin-top:64px;padding-top:22px;border-top:1px solid var(--rule);color:v

01参与检验的批次

每一批用 agent 字段标识,不靠文件名猜来源。「旧盘面」指擦碰只报第一个阻挡者的版本,「新盘面」指修复后全部列出的版本。

+

模型名以 CLI 启动时打印的解析结果为准,而不是提示词里让 agent 自报的名字——有一批 18 局曾被标成 codex-spark,实际是配置在运行前被改掉、跑成了 gpt-6-astra/low,存档已按日志头更正。

批次关数通关空点擦碰空点盲转转错多转单局均每决策