Files

17 KiB
Raw Permalink Blame History

2026-10-08 QA 记录

环境:Mac mini,Python 3.14,Calibre 9.15;测试阶段依用户要求用 Luna 子 agent,未调用外部收费翻译 API。

工程验证

  • 29 项回归测试通过:标签/实体/MathML/图片/脚注往返、希腊字母 φ、占位符缺失/重复/嵌套错位、未验证 HTML、重复输出 ID、网络失败、术语别名/家族语境、断点续译、异常 HTML、列表/表格、锚点、CSS 和资源保留。
  • 仓库 input/ 的 11 本书共抽取 27,321 个单元;原文占位符还原失败 0,EPUB 往返新增结构问题 0。此项验证的是提取、格式与封装,不是全书译文质量。
  • 《To Explain the World》首次发现 15 段数学 φ 与协议分隔符冲突,改为保护原文字面 φ 后通过。
  • Luna 只读复核发现人物别名误伤 Son family,以及未校验译文静默跳过;均补充测试并修正。

真实译文样例

《Gambling Man》第 1 章连续 10 段,约 6,343 英文字符;由 Luna 子 agent 生成译文。孙正义、祖父和孙家按语境区分,脚注占位符原样保存。这是 10/1,575 个抽取单元的部分样例;没有声称该书完整翻译或所有人物别名都已覆盖。巴菲特术语有自动测试和示例配置,本轮真实书段未出现巴菲特。

本地证据保存在 .work/luna-qa/(译文和语言复核)与 .work/luna-final/(最新封装、完整覆盖清单、视觉 QA)。这些输出不提交到 Git,以避免提交书籍摘录和大文件。

视觉流程:Calibre 将测试章节转成 PDF,Poppler 生成 PNG,Codex 查看图片;源书的目录/脚注结构另由完整 EPUB 审计检查。发现原书 p.ot::first-letter 会放大中文“20 世纪”中的首个数字,已在译文样式中仅重置首字伪元素,原文保持原设计。

最终视觉复查:最新译文 PNG 共 4 页,原文对照 3 页;逐页查看后未发现中文缺字、重叠或截断,首个数字的放大已消除。原生 Calibre 阅读器已打开最新双语样例,通过目录搜索跳转至 Chapter 1: Roots;中文段落中的脚注 1 点击后显示对应注释内容。最终视觉结论仅限这些样例页,不能推广为全书译文质量合格。

CLI 主流程使用自制小 EPUB 完成无 API 冒烟验证;新增的输出预算、截断响应和串号测试也通过。真实供应商 API 的整书翻译没有在本轮调用。

目前边界

自动术语扫描依赖模型判断。完整名字和明确别名可约束;同姓人物、间接指称、未列入表的其他译名仍须语言 QA。exclude_contexts 与较长术语优先处理能减少误判,不能代替全书语义消歧。

HTML5 解析可以修复结构,不能自动判断出版者本意;特别的固定版式、复杂 SVG/脚本内容和阅读器差异仍需具体样本。正常主流程遇到新增结构错误会停止并留下报告。原书问题单独留存,不用“没有新增问题”宣称原书符合所有 EPUB 标准。

第二轮:中文缩进与标题目录同步

  • 新增标题目标映射:NAV、NCX 和明确的书内目录链接解析到原文件/锚点;章号、标题、副标题的相邻块精确绑定,各块仍各自翻译和回填。目录复用实际标题译文,不另行生成章标题。
  • 中文章号统一为“第一章”,Part 对应“第一部”。兼容数字、罗马数字和常见英文数字词,保留数字所在 span 的样式;双语模式保留原英文标题。
  • 中文正文首行缩进 2em,包括原书使用 noindent 的章首段。清除中文段落的内联 text-indent,英文段落不修改;图注、引文、注释、居中段落和标题排除。Calibre 转换产生的正文 div 也适用。
  • 41 项离线测试通过,覆盖双语/中文模式、拆分标题、NAV/NCX/书内目录的一致性、链接及层级、反复回填、内联 CSS、标题缓存上下文更新,以及标题首词 Two/I 的误判回归。
  • 第二轮 11 本书共 27,219 单元、467 个目录目标:原文格式还原失败 0,新增结构问题 0。其中 403 个目标绑定实际标题,64 个不确定目标保留独立标签翻译并记录 binding_note。多数是封面、扉页或装饰标题,仍有复杂章节结构;不声称所有书的标题已经自动同步。Empire of AI 的原有 1 项源文件问题仍记录在报告中。

Luna 样书与视觉范围

Luna 翻译了 Gambling Man 的 45 个标题单元,45/45 占位符校验通过;沿用第一轮 10 段正文,合计 55/1,582 单元。本轮没有做全书正文翻译,也没有验证实际外部 API 的整本吞吐。封面、扉页和版权这三个导航标签采用独立译文,其余目录目标均可绑定章节/部标题。

最终文件位于 .work/navigation-final-v4/:bilingual-sample.epub、target_only-sample.epub、完整 manifest,以及 qa-chapter/ 和 qa-bilingual/ 对照证据。这些局部 QA 样例不提交到 Git。

实际检查了中文版第 1–3 页、双语版第 1–4 页与相应原文页面:部标题、章号、主标题、中文首段/后续段缩进、英文 drop cap、上下标、强调与正文排列没有重叠或截断。PDF 页面是辅助视图;中文 EPUB 另外在 Calibre 9.15 阅读器中打开,确认中文目录“第一章:根源”跳转到对应章节、第一部到第五部层级保留、第一条注释弹窗内容正确。继续进入尾注页,点击第一章第 1 条尾注的返回链接,阅读器显示对应中文正文弹窗,再返回正文主视图;原锚点及返回链接正常。

脚注/尾注全文仍按原有提取策略跳过;本轮翻译的是其目录名称和目录所指的页面标题。尾注内部按章分组的标题仍可能是英文。这一范围不能误报为注释全文已译。

渲染期间有一次 Calibre PDF 进程 SIGSEGV,重新生成后的最终两组输出成功。自动报告仍为 visual_review: pending,人工/agent 观察记录单独保存为 visual-review.json;截图生成本身不表示整本视觉验收通过。

OCR、扫描页图文提取、版面中间结构与可点击目录的后续大版本方案见 doc/OCR_EPUB_ROADMAP.md。

第三轮:Part 父级目录跳转修复

用户反馈点击“第 X 部:XX”时报“目的不存在”。原因是预处理给带子目录的 Part 链接添加了生成的 span,形成 li > span > a;href 本身存在,但 Calibre 将该父项解析成无目标的目录分组。此前检查了链接地址和目录层级,遗漏了阅读器对父项目标的实际解析。

现在 NAV 保留直接的 li > a + ol 结构,旧缓存中的生成包装也会在导航预处理时移除,保留链接内部的原有强调样式。已有译文可直接重新封装,无需重新调用翻译模型;已生成的旧 EPUB 需要重新构建。

  • 45 项测试通过,新增旧缓存修复及 Calibre 实际解析的中文/双语回归;未安装 Calibre 时这两项集成测试明确跳过。
  • 11 本书再次往返检查:格式还原失败 0,新增结构问题 0。
  • Calibre 解析修复后的 Gambling Man 中文和双语样例,五个 Part 的目标均存在;在原生阅读器中实际点击第一部和第五部,均跳转到对应部标题,无错误弹窗。
  • 新样例位于 .work/part-link-fixed/,沿用已验证译文,仍为 55/1,582 个单元的局部翻译;旧的 .work/navigation-final-v4/ 仅保留为此前 QA 证据。

第四轮:部号统一样式与完整书籍翻译准备

原书将 PART 后面的阿拉伯数字单独设为 1.5em 和黑色。翻译为“第四部”后,这个样式只作用在“四”上。回填现在标记中文部号中的数字 span,使其继承所在标题的字体、字号、颜色和基线;主标题的块级样式及原文数字不改动。Calibre 原生阅读器实际打开第四部,确认“第四部”统一为灰色同字号,主标题正常;PDF 辅助渲染也确认该样式。证据目录 .work/part-ordinal-fixed/qa-part4/,仍为此前 Luna 局部样例。

50 项测试通过,覆盖中文/双语部号、完整模式提取非 spine 尾注、Zenmux 凭据优先级,以及术语冲突记录、扫描中断和续扫。默认模式继续保留原有跳过策略;完整模式将尾注、参考文献、索引和版权页等文字纳入翻译。

真实 Sonnet 5.5 全书运行中发现,单批术语返回同一别名的不同译名会中止全书。现在自动扫描逐条校验建议,保留已确定译名并记录冲突,每批原子保存结果及进度。手工术语表的冲突仍严格报错。两本书的实际运行结果将在完成后单独记录;本节不代表已完成全书译文验收。

追加验证:两本书完整模式共 6,782 个单元,原文格式往返失败 0、新增结构问题 0。《House of Huawei》的 Part I/II/III 只有编号,没有副标题,原绑定算法去掉编号后得到空标题,导致未绑定;现允许明确的 h1–h6 纯编号标题匹配,同文字的普通段落仍不匹配。目录和正文复用同一译文,并将“第一部分”规范为“第一部”。累计 51 项测试通过。

术语复核发现,Sun Microsystems/David Sun、Fuji Bank/Fuji TV、Kazuo Noda/Yoshihiko Noda 分别共享 Sun、Fuji、Noda 短别名。现保留各完整名称及其译名,同时从双方删除歧义短别名,并持久化禁止再次自动加入这些别名。裸姓氏留给模型按上下文消歧,明确全名仍做术语校验。累计 52 项测试通过。House of Huawei 新绑定去掉了 3 个重复的独立 Part 导航标签,完整清单为 2,837 单元;缓存迁移核对了旧源摘要及已扫描批次文字完全相同后保留扫描进度。

全文运行发现 WHO/who、Jobs/jobs、Arm/arm 被忽略大小写规则混淆,会对普通代词、就业或分部描述强制套用机构/人物译名。单个带大写字母的 Latin 名称标记现按大小写匹配,完整短语和普通术语继续兼容大小写;匹配策略加入缓存指纹版本。累计 54 项测试通过。两书共 17 个疑似受旧规则影响的单元被重新加入翻译队列,其余已验证缓存迁移到新规则。

自动表进一步收紧:Father/Dad 不作为 Otosan 广告角色的全局别名;carry 不作为 carried interest 的全局别名;WHO 等同时是普通词的短标记不强制套用机构名,即使正文为装饰性全大写。没有被模型显式列为别名的 Sun Yafang 也能揭示 Sun Microsystems 的 Sun 歧义。普通小写单词的不同词义不强制使用一种译法;用户手工表不套用自动筛选规则。累计 55 项测试通过,过滤记录及被重新翻译的单元保存在本地 QA 目录。

自动短别名仅保留有明确昵称说明的称呼和缩写,完整名称继续校验;月份、国籍词和缺乏消歧依据的单个姓名不作为全书硬约束。Masa 的显式昵称说明仍保留。术语正则表达式缓存避免大量术语反复编译。累计 56 项测试通过。

第五轮:Sonnet 5.5 完整译本与额度中断

本轮真实 API 为 Zenmux anthropic/claude-sonnet-5.5。密钥从本机环境读取,未写入仓库。

  • House of Huawei:2,837/2,837 个单元完成,生成纯中文和中英对照 EPUB;完整模式包含源 EPUB 中可提取的全部文字、目录、图片说明、版权及索引。
  • 两版均通过独立格式还原和术语校验,新增 EPUB 结构问题 0。Calibre 实际解析的 49 个目录条目与原书目标及片段相同,原有效目标全部有效。
  • 45 个图片/字体资源与原书逐字节一致。Calibre PDF 对照抽查第一部、第一章的标题/副标题/正文、选定照片与图注、图片来源列表以及作者说明。检查范围为抽样,没有宣称逐页审校或全书语义零错误。
  • 视觉检查发现 role=doc-credits 区域的中文来源列表被强加正文缩进,现依据 EPUB 语义排除 credits、index、bibliography、endnote/footnote 等区域,并验证保留原有内联缩进。重新生成译本、重新渲染来源列表后确认与英文列表对齐。
  • 原书作者说明明确尾注位于 www.houseofhuawei.com/endnotes;书内注号指向作者说明页。译本保留原链接与说明,没有把不存在于源 EPUB 的网站尾注当作已翻译内容。
  • 原书人物表的 Zhou Daiqi 中文写作“周代期”,按华为官方 2011 年报 校正为“周代琪”,译文中共 17 处,原文对照保留源书内容。另校对作者说明的一处标点与写作休假用语,记录保存在本地 QA 文件。
  • 原生阅读器检查在此轮因 Mac 锁屏而未能执行;此前第四部部号修复已在 Calibre 原生界面实际确认。本轮以 Calibre 渲染证据和真实 TOC 解析验收所抽查的排版及链接,不将 PDF 渲染替代为原生点击的证据。
  • Gambling Man:Zenmux 返回 HTTP 402 quote_exceeded(订阅额度耗尽),暂停请求。当前保留 1,350/3,942 个通过最新规则的真实译文;一处受新增歧义筛选影响的缓存重新待译。不生成或标记全书完成译本。额度恢复后沿原清单继续,无需重译已验收的缓存。

新增提供商额度/权限错误的明确异常:HTTP 401/402/403 不进行自动重试,并取消排队任务、保存已完成译文。瞬时网络错误仍按原策略重试。累计 60 项测试通过。自动别名筛选也覆盖带冠词的普通短称,例如国内期刊的“the journal”不能被全局强制译成《华尔街日报》。

本地证据:.work/House of Huawei/full-book-qa.json、.work/full-sonnet55/qa-house-opening/、qa-house-photos-notes/、qa-house-author-note/、Gambling Man-status.json。译本存于 output/sonnet55/,未推送书籍文件。

第六轮:Skill、headless QA 与 Luna 独立完整测试

本轮没有启动 Sonnet 或其他付费翻译 API。新增 skills/epub-translate/,通过 skill-creator 校验,并用符号链接安装到本机 Codex skills 目录。skill 负责术语/语义审校、分类修复和验收范围;脚本负责确定性格式、完整度、回填和链接检查。独立 Luna agent 按 skill 操作,不预先提供预期结论。

headless_qa.py 的基础层不增加依赖;可选层仅需 Playwright + 官方 Chromium headless shell,Linux 的运行库及 CJK 字体依部署环境提供。服务仅监听 loopback,不解包执行书内代码,禁用书内 JavaScript、service worker 和外网请求。Chromium 的连续 XHTML 视口不等于阅读器分页。渲染失败退出 2,不静默降级为通过;生成证据后视觉/语义状态仍需独立审核记录。

  • House of Huawei:新语义审计识别原书 1,099 个注号集中指向作者按语,并发现外部尾注 URL。两版遵循源书方式;实际 headless 点击第一部和第一章的注号到达作者按语,但 embedded_note_reached=false,不会混淆“链接可达”和“书内注释可达”。纯中文完整清单 2,837/2,837 匹配源文件,新工程问题 0;查看第一部/第一章截图确认中文、章号、副标题、两格缩进与原文风格可读。
  • Luna 原创完整测试书 The Lantern Ledger:9 个 spine 文档、48 个翻译单元,含两个 Part、四章、人物全名/Masa 昵称、原创 SVG、图注、书内脚注与返回链接、索引和版权。Luna 独立生成两版,48/48 通过;目录目标/层级、资源摘要及源文件匹配,新问题 0。实际浏览器注号和返回链接到达对应目标;agent 查看全书文档采样截图,记录语义抽查与视觉范围,没有宣称对长篇真实书籍全书逐句审校。
  • 前向测试发现 QA 把 OPF 相对清单路径当作 ZIP 根路径,误报未回填;已按 package_base 修复。发现 loopback HTML 未声明 UTF-8 导致中文乱码,已修复并实际重渲染。原创夹具还修正图片相对路径和注释语义属性,分别记录为夹具问题,未以改动真实源书来掩盖输入缺陷。
  • 检查不只相信 manifest:缺失源单元、未重建的旧 EPUB、NCX 标题漂移和 NAV 链接包装都会触发新增问题。agent harness 拒绝旧源摘要和模型混用;格式坏的重试不会毁掉旧有效译文,但拒绝项单独记录并退出 1,避免误称修复已应用。

Luna 测试证据:.work/luna-skill-test/work/review-record.json、qa-chinese-render/、qa-bilingual-render/;真实书证据 .work/headless-house-baseline/、.work/headless-house-render/。原书及译本留在本地,仓库只保存流程、脚本和回归测试。Gambling Man 的 Sonnet 缓存保持暂停;后续全书测试采用 Luna 新工作目录。

最终回归:71 项无需浏览器的测试通过;1 项可选真实 Chromium UTF-8 回归单独通过(共 72 项)。首次浏览器回归的自动权限审查超时,按工具提示重试一次后获准执行并通过。两版 Luna 完整测试书又以最终代码重新做基础检查,0 项新增问题。