# Devlog · H6 续:背景模型建成,确证架构边界——同色检测与"不渲染"冲突

> 2026-06-12 · 里程碑 H6(见 [hardening-iteration.md](../plans/hardening-iteration.md))· 状态:✅ 结论性回退(架构边界)

承接 [前一篇](2026-06-12-h6-hidden-text-attempt.md)(白底假设误杀反白文本)。
本轮做了正确解——**完整局部背景模型**——并据其结果下结论。

## 这轮建了什么

interpreter 增加同色检测的背景模型,逐层覆盖背景来源:
1. **fill 色追踪**:`g`/`rg`/`k` 设备色随 q/Q 入栈;`sc`/`scn`/`cs` 非设备色 → `None`(不判);
2. **device 色填充块**:任意填充路径(不只 `re`,含圆角/多边形)的 bbox + 色 → `bg_rects`;文本背景取最近覆盖块色;
3. **图像背景**:`Do` 图像 bbox → 记为 `None`(不确定,不判);
4. **非设备色填充**(Pattern/Separation/ICC)→ `None`;
5. **渐变 sh**:出现即把整页标 `None`(不确定);
6. 同色判定:文本中心找最近覆盖块——`Some(c)` 比色、`None` 不判、无覆盖 fallback 白页比色。

零误杀的设计是"**背景不确定就不判**"。

## 结果:修好一类,长尾无尽

| 文档 | 现象 | 背景模型效果 |
|---|---|---|
| 合成白底白字注入 | 注入被标 hidden、可见正文保留 | ✅ 拦截 |
| bialetti 财报(白底版误杀 313) | hidden 归 **0** | ✅ device 色块修正,误杀消除 |
| **normal_4pages 韩文封面** | 白色大标题(`이슈와 논점`/`제1695호`,fs 14-26pt,页内) | ❌ 仍误杀 7 个 |

normal_4pages 逐层加保险都没救回:不是矩形(加了 path bbox)、不是图像(标了
uncertain)、不是渐变(加了 sh 整页保险)。最后诊断内容流:封面用了 **Form
XObject(1)+ Shading(1)+ 图像(3)+ scn(20)**——标题在 form 里,背景 banner
在主流,**form 递归用独立 `bg_rects`,跨上下文看不到背景**。

## 结论:架构边界,不是基建量问题

每修一类背景(device 块→图像→非设备→渐变→form 隔离→clip→Pattern tiling…),
都暴露下一类。它们是**同一个根本问题的不同表现:不渲染就无法确知某点的背景
像素**。"完整确定背景色" ≡ "渲染该点",与 docparse-rs"结构提取、不渲染像素"
的核心身份直接冲突。

这比前一篇"需背景模型"更进一步——**我这轮真的把背景模型建出来了**,它能修
device 色块同色(bialetti),但 born-digital 设计页(封面/海报)的反白标题
经 form/渐变/复杂背景产生,是不渲染下无法消除的长尾误杀。

**可零误杀的子集**(仅"文本在已知 device 色块内且同色"、去掉白底 fallback)
在真实语料零检出(没有这种块内隐写样本),只在合成有效;而放弃白底 fallback
= 放弃最常见的白底白字注入,检测价值所剩无几。故不保留半成品。

**最终决策**:H6 同色文本检测**回退、列为架构边界不做**。隐藏文本注入的主流
手法——不可见 render mode(`Tr 3`/`Tr 7`)——已被现有检测覆盖;off-page、
sub-readable 同样覆盖。同色与图像遮挡这两个剩余盲区都需要"某点最终可见色/
覆盖物"的判定,即渲染,留给可插拔的渲染增强路径(若将来确有需求,在
docparse-raster 的按需渲染域做,而非确定性核心)。

## 经验

- **负结论也要建到能下结论的程度**:前一篇"白底假设误杀"只够说"需背景模型";
  这轮真把模型建出来,才看清是"架构边界"而非"工作量"。把探索做到能区分
  "没做对" vs "做不到"才算结论。
- **零误杀的安全特性,边界要靠真实语料逼出来**:合成白底白字过了、bialetti
  修好了,都没暴露问题;normal_4pages 韩文封面(form+渐变反白标题)才是真实
  世界的反例。安全特性的验收语料必须含设计页/封面/多语种,不能只有学术 PDF。
- CLAUDE.md 经验②再次印证:更"完整"的实现(背景模型)反被参照口径(MHS)
  如实检验——做对了 bialetti、做不到 normal_4pages,数据不骗人。
