ADR-0092:有损输出从当前文件重建恢复模型
- 状态:已采纳
- 日期:2026-10-27
背景
标准文件恢复禁止在有损导出后保留较丰富的源模型,否则删除、丢弃或脱敏的内容可能从隐藏副本中返回。原实现因此只允许拒绝保存恢复信息,或显式丢弃恢复信息后写普通文件。复杂文档转换为 HTML/Markdown 时,即使调用方接受了损失,也无法保存转换结果的可编辑模型。
决定
XmlModelRecovery.SaveRequest.reimportOnLoss(FallbackReader) 显式提供当前目标文件读取器。只有本次目标编码发生损失且 MODEL_RECOVERY 选择 WARN/IGNORE + DEGRADE 时,恢复层才调用一次读取器。它收到准备好的准确标准输出字节的防御副本,以及本次保存策略;返回实际导入后的模型、注释与 ACTUAL 损失报告。
恢复 ZIP 保存返回的当前文件模型,不再保存导出前候选。原输出字节保持不变;清单仍使用 version 1,将模型/资源摘要绑定到这些准确字节。模板模块不依赖具体导入器,调用方显式选择对应格式的可信读取器,并保留其解析、权限、预算、取消及零外联约束。读取器不得读取旧源模型或隐式获取资源。
ERROR 在读取前失败;WARN/IGNORE + DISCARD 保持普通文件且不调用读取器;DEGRADE 缺少读取器失败;PRESERVE 等没有实现的处理不能放行。XML 无法保存读取器返回模型时仍拒绝,不能改存更丰富候选或吞掉 XML 损失。历史损失不触发本次重导入。
损失与资源
导入、编辑及当前导出历史先保留,再增加 TARGET_EXPORT_LOSS / CURRENT_FILE_REIMPORT 和实际重导入损失。后续无损转换继承这些实际诊断,不因新策略为严格而重算或删除历史。WARN 与 IGNORE 的处理一致,后者只隐藏警告呈现。
恢复资源仅重新收集当前模型使用的图片;显式字体及许可按原资源契约传递,不复制旧源码、片段和未使用图片。读取器可以进一步降级:例如未显式登记的 HTML/Markdown 图片变成替代文字,并返回导入损失。恢复模型此时只代表该受限导入结果,不能宣称与可见文件完全等价或无损。
验证与边界
HTML 导出为显式列表标记增加版本为 1 的 data-export4j-marker 和明确层级。导入只识别经过验证的首个 span.marker;一级简单标记从正文中分离,保留独立样式和重启编号,避免多轮重复前缀。复杂标记按真实 LIST_MARKER 损失降为普通段落或丢弃;仅有同名 CSS class 的外来文字不自动删除。表格列组几何与单段重复表头的结构变化分别报告 TABLE_COLUMNS 和 TABLE_HEADER_PARAGRAPH,不把浏览器几何伪装成已保留模型。
验证读取器的单次调用、准确字节和防御副本、实际诊断、注释和资源、多轮历史、失败旧目标保护及执行作用域恢复;用真实 HTML/Markdown 导入器验收复杂输出和隔离 Maven 调用方。格式矩阵明确区分直接模型恢复、当前文件受限导入及视觉结果。
该能力不补充任意格式识别、一般 PDF/图片语义提取或第三方应用保存保证。格式容器和可选内嵌沿用既有设计。API 见恢复指南,证据见阶段八十七。