逐页 QA 硬约束:让校验不可跳过,质量才有保障

校验可被跳过时,缺陷就会逃逸

在调优一个多 agent PPT 生成流水线时,我遇到一个特别典型的缺陷。

跑 bench 用例 bench / 2603,最终 PPTX 的第 10 页出现元素重叠。回头查发现:这一页在生成时跳过了 QA 校验,没有产出 QA 产物。校验没拦,缺陷就一路流到了最终 PPTX。

问题不是」校验规则写错了」,而是」校验根本没跑」。本质是:校验是可选项时,它就一定会被跳过。只要存在跳过的可能,压力一大、用例一多,总会有页漏掉。

这跟」测试可跳过」是同一个道理:一个测试如果可以不跑,它在 CI 里就等于不存在。要让校验真正保障质量,它必须是硬约束,不是可选项。

逐页 QA 硬约束闭环

解法是把校验做成逐页闭环,且 QA 产物是硬约束:

flowchart TD
    A[生成单页HTML] --> B[QA校验]
    B -->|通过| C[下一页]
    B -->|失败| D[定位问题]
    D --> E[修复HTML]
    E --> B
    C --> A

三个要点:

  • 每一页都要跑 QA,产出 QA 产物,没有例外。没有 QA 产物的页,就是缺陷逃逸点。
  • QA 是硬约束,不是参考项。参考项给 agent 做上下文建议,校验项是产物必须满足的条件。这两类必须分清,混在一起会让 agent 无所适从。
  • 失败必须回修再校验,通过才进下一页。闭环不能断在」失败」这一步。

为什么是逐页,而不是全部生成完再统一校验?因为逐页闭环能把缺陷限制在单页范围内,定位快、回修成本低。全部生成完再校验,缺陷之间的相互影响会让定位变得困难。

从两个真实案例看闭环怎么运作

闭环跑了几个真实用例,这两个最能说明问题。

案例一:<p> 元素不能有 border。

Slide 4 QA 失败,报错:<p> 元素不能有 border,需要把 p.insight 改为 div.insight

修复思路:

  • 把 insight 外层从 <p> 换成 <div>,border 放在 <div> 上。
  • insight 文本仍用 <p> 包裹(<p> 不带 border,合规)。
  • 同步更新 global.css 里的选择器。

改完 QA 通过,继续下一页。

案例二:文本框距底部边缘太近。

Slide 10 QA 失败,报错:文本框距底部边缘 0.45」,小于阈值 0.5」。

修复:调整布局,减少间距让内容上移,确保底部留出足够空间。改完 QA 通过。

这两个案例的共同点:QA 报的是 具体、可定位 的问题(哪个元素、哪个尺寸),不是」这页有问题」。校验规则越具体,agent 回修越快。模糊的校验(」布局不好看」)没法自动化;具体的校验(」<p> 不能有 border」」底部留白 < 0.5」」)能直接 grep、能直接修。

这周还从这些失败里提炼出一个更前置的需求:HTML 书写规范要前置。与其等 QA 失败再回来改标签,不如在 designer 生成 HTML 时就约束允许 / 禁止的标签和属性。校验是兜底,规范是源头,两头都要抓。

本周其他工程产出

除了 QA 硬约束,本周还做了这些,各点到为止:

  • 一体机部署:服务器代理 + 连网后跑通 ppt skill,完成答辩。工程落地最后一公里。
  • 渲染层问题清单:截断(卡片不校验最终长度)、覆盖(纯色覆盖字样)、字体(渲染失败)、公式溢出(文本框未留余量)。
  • reader 降级:图片理解直接截断,不耗时长爬。
  • diff 纯净审计:每次 diff 纯净 → 局部纯净审计 → 全局纯净,不事后补救。
  • 并行子 agent:快速读上下文 + 任务隔离防幻觉,不只是快,更是隔离。
  • 允许 agent 犯错:犯错时即时给提示纠正,比追求一次做对更现实,关键是反馈闭环要快。

参考资料