# Devlog · G2 重大更正:两个"负结果"都错了——真凶是我们自己的两个 bug

> 日期:2026-06-10 · 更正对象:[g2-layout-enhancer devlog](2026-06-10-g2-layout-enhancer.md) 的负结果一与负结果二
> 教训先行:**两次静默替换失败**(python str.replace 因 cargo fmt 改写而不匹配,无报错)导致基于"未生效代码"的评测得出错误结论。已立规:结构性代码改动一律用精确 Edit 并 grep 验证落盘。

## 更正一:"hayro 渲染损坏" → 是我们的透明背景 bug

hayro `RenderSettings` 默认 `bg_color: TRANSPARENT`;premultiplied RGBA 的透明像素在 RGB 视图下全黑。`normal_4pages` 因页面自画白底矩形而碰巧正常,2206 没有 → "整页黑"。**设 `bg_color = WHITE` 后 2206 渲染完美**(标题/作者/双栏/图全对,3.78% 暗像素)。hayro 平反;坏渲染守卫保留(防真坏页)。

## 更正二:"分组无效、宏观序本就一致" → 分组代码根本没接上

`reconstruct_lines` 的阅读组分流当时静默替换失败,从未生效——"全零增量"的真实原因。真正接上(+单测钉死分组覆盖宏观序)+ 渲染修复后,**enhancement 全面点火**,真实结果:

| 文档 | NID 前 → 后 | 判定 |
|---|---|---|
| `amt_handbook_sample` | 0.660 → **0.840**(+0.180) | ⬆ 设计感版面大赢 |
| `normal_4pages`(CJK) | 0.580 → **0.708**(+0.128) | ⬆ 原"区域级救不了 CJK"的结论部分翻案 |
| `skipped_*` | 不变 | 覆盖率门正确拒绝(区域盖不住散落小块) |
| `2203` | 0.945 → 0.656(−0.289) | ⬇ clean 双栏:模型宏观序不如我们的几何 |
| `2206`/`redp5110`/`multi_page` | −0.075/−0.032/−0.029 | ⬇ 同上 |

## 新结论(数据支撑)

版面模型**赢在设计感/散落版面,输在 clean 学术双栏**(确定性 XY-cut 本就更准)。`--layout` 保持手动 opt-in、记分牌默认不开(零回归);**自动路由判据是下一个研究项**——已试"行填充率"(失败:粗分行被双栏并宽,赢输家不可分),候选:XY-cut 不可切区域占比(读序歧义分)、区域数/类分布、画像信号组合。

## 附带修复

- `TextChunk.font` 现在是 PostScript 名(BaseFont)而非资源名("F7")——关掉老 TODO,为 G8a 等宽检测铺路;
- 覆盖率门(<70% 归组即放弃)防部分覆盖打乱页面;87 单测、clippy 零 warning、三件套与默认记分牌零回归。

## 续:自动路由判据——三个几何假设全部试败(2026-06-10 晚)

把 +0.18 的收益自动化需要"这页该信几何还是信模型"的判据。三个假设全部数据否决:

1. **行填充率**(prose 行宽填栏、设计页行短散):粗分行被双栏并宽,赢/输家全在 0.37–0.40,不可分;
2. **读序歧义分**(XY-cut 不可切混合区域 chunk 占比):子词级行间隙本就小于切割阈值,整栏皆为 base 区域——clean 学术页也 0.93+,不可分(实现后已回退,不留误导性死代码);
3. **左缘对齐度**(top-2 左边距覆盖率):有信号但重叠区大(赢家 amt 0.74 落在输家 0.40–0.92 区间内),单特征不可分。

**现状**:`--layout` 保持文档级手动 opt-in(用户可见的"设计感版面开、学术论文关"本身是合理产品面);自动路由的下一候选:多特征组合(画像+几何)小分类器、或交给 VLM 判页型(G8b 顺带)。
