Skip to content

Harden CMP review and recovery workflow - #2

Merged
xiaoyumuxi merged 1 commit into
masterfrom
codex/harden-cmp-review-workflow
Jul 16, 2026
Merged

Harden CMP review and recovery workflow#2
xiaoyumuxi merged 1 commit into
masterfrom
codex/harden-cmp-review-workflow

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Jul 16, 2026

Copy link
Copy Markdown
Owner

背景

本次修改集中处理 CMP 校对与写回流程中的完整性、并发一致性和可恢复性问题,同时改善章节解析、前端审校效率及自动化测试覆盖。

此前存在以下风险:

  • CMP 的受保护元数据被修改后,可能影响任务身份和重复写回判断;
  • 应用内表格可能覆盖外部编辑器刚保存的 CMP;
  • 源指纹只覆盖提取后的英文条目,无法发现非翻译区域变化;
  • 限流重试可能覆盖已经人工补译的内容;
  • chapters 模式依赖正则提取,容易受到嵌套结构、注释和字符串内伪字段影响;
  • HTTP 错误可能携带第三方响应正文进入错误链或日志;
  • 进程异常退出后,translating 状态缺少安全、可解释的恢复流程;
  • 前端缺少审校线索、工作流测试和过期事件防护。

主要修改

CMP 完整性与并发保护

  • 新生成的 CMP 增加 protected_hash,覆盖:
    • CMP 元数据;
    • 文件归属;
    • 条目 ID;
    • JSON Pointer;
    • 英文原文;
    • 条目状态。
  • 右侧译文不参与 protected_hash,仍允许正常人工校对。
  • 增加整文件 cmp_revision 乐观锁,防止旧页面覆盖外部编辑器修改。
  • 保存、验证和应用 CMP 时均检查 revision。
  • 保持旧 CMP v1 兼容:缺少 task_idprotected_hash 或使用旧式源指纹时仍可读取。

源文件与写回安全

  • 源指纹升级为 v2:
    • 覆盖解析管线版本;
    • 源文件相对路径;
    • 完整源文件字节;
    • 提取后的条目身份。
  • 写回前继续重新扫描并验证任务书、英文原文、文件归属和回填位置。
  • CMP、设置、缓存、报告和翻译诊断文件改为同目录原子写入。
  • 修复历史列表静默忽略数据库读取错误的问题。

章节解析

  • chapters/*.snbt 提取从正则替换为轻量 token/span walker。
  • 正确处理:
    • 嵌套 compound/list;
    • 单双引号;
    • 转义;
    • 注释;
    • URL 中的 //
    • 字符串中的伪字段;
    • 目标列表中的嵌套富文本字段。
  • 继续保留原字节位置和引号类型,写回时不重新序列化整个章节文件。

限流重试与提供商错误

  • 只重试状态为 rate_limited 且译文仍等于原文的条目。
  • 人工补译后的失败条目转为 review,不会再次发送或被覆盖。
  • HTTP 重试限制为:
    • 408;
    • 429;
    • 5xx。
  • 支持数值型 Retry-After,等待时间最高 60 秒。
  • 第三方非成功响应正文会被消费但不会进入错误信息或日志。
  • OpenAI 兼容缓存键加入规范化接口地址,防止同模型跨端点误用缓存。

任务状态恢复

  • 增加活动任务状态诊断接口,返回任务状态、更新时间和是否可恢复。
  • 只允许显式恢复早于当前进程启动时间的 translating 记录。
  • 本次进程后的翻译记录视为可能仍在运行,不允许恢复。
  • applying 状态始终不会自动解锁,避免任务书被二次覆盖。
  • 前端会展示具体任务编号和更新时间,并提示检查备份与诊断日志。

前端审校体验

  • 新增 CMP 审校线索:
    • 状态需确认;
    • 同源多译;
    • 保持英文;
    • 疑似未汉化。
  • 支持点击计数或使用下拉框筛选对应条目。
  • 审校线索仅用于人工检查,不参与后端写回权限判断,也不代表语义准确率。
  • 修复:
    • 过期翻译事件污染当前任务;
    • 扫描和 CMP 加载结果竞态;
    • Toast 定时器互相覆盖;
    • CMP 切换后的分页越界;
    • 忙碌状态下仍可切换目录的问题。
  • 写回完成后会向界面展示附属数据保存告警。

测试、CI 与版本

  • 新增前端纯逻辑测试:
    • 审校线索聚合;
    • 同源多译定位;
    • 中断任务恢复决策。
  • 新增 CmpTable Vite SSR 组件测试。
  • 增加浅色/深色视觉 fixture。
  • CI 新增:
    • 前端测试;
    • manifest 版本一致性检查。
  • 项目版本统一更新为 0.2.2

用户影响

  • 人工校对的内容不会被限流重试静默覆盖。
  • 外部编辑 CMP 后,旧页面无法继续覆盖或应用过期内容。
  • 修改任务书的非翻译区域也会使旧 CMP 安全失效。
  • 章节模式能更可靠地处理真实任务书中的嵌套结构和注释。
  • 异常退出后的翻译任务可以显式恢复,同时保持写回阶段的保守锁定。
  • 审校人员可以更快定位同源多译和疑似未完成的译文。

兼容性

  • 已有有效用户设置继续按保存值加载。
  • 旧 CMP v1 文件保持读取兼容。
  • 默认 DeepSeek 地址可以迁移旧 OpenAI 兼容缓存。
  • 自定义 OpenAI 兼容地址不会读取可能属于其他端点的旧缓存。
  • API Key 仍只保存在系统凭证管理器中,不写入 CMP、日志、报告或项目文件。

验证

  • cargo fmt --manifest-path src-tauri/Cargo.toml -- --check
  • cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets --all-features -- -D warnings
  • cargo test --manifest-path src-tauri/Cargo.toml
    • Rust:209 passed
    • 真实网络 smoke test:2 ignored
    • 0 failed
  • npm run test:frontend
    • 5 passed
    • 0 failed
  • npm run build
  • npm run check:versions
  • git diff --check
  • CMP 审校面板浅色/深色视觉检查
  • “同源多译”筛选交互检查

未包含的验证

  • 未运行依赖第三方服务的真实网页翻译 smoke test;
  • 未构建或人工安装检查 macOS/Windows 安装包;
  • 未把启发式审校线索作为语义准确率评估。

@xiaoyumuxi
xiaoyumuxi merged commit be1b2c2 into master Jul 16, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant