Repository navigation
iPaper 1.13.1 — 阅读笔记可靠性收尾(R1–R8)
iPaper 1.13.1 逐项收尾 1.13.0 独立验收的 R1–R8:不放宽任何修订校验,优先修好会丢失笔记的保存与冲突路径,再补齐四类批注、编辑/撤销、幂等、来源回访与额度边界。仅 Web 变化,Worker 复用 1.2.0。
R1 自动保存与编辑版本绑定
- 单调编辑版本 + 串行保存泵:同一时刻只有一个 PUT;只记录"想要的文本",响应返回后继续发送最新文本。
- 只有"确认版本 == 当前编辑版本"才显示「已保存」;慢响应、重复响应、切换论文/账号后的响应都不能改写新编辑器(请求带论文/账号纪元)。
- 修复 1.13.0 受控 textarea 未回写本地状态的缺陷(此前实际无法连续输入)。
R2 失败草稿的可靠生命周期
- 未提交文本按
owner + paper存在会话级草稿表:切换问答/批注/笔记、收起侧栏、切换原文/译文后仍可恢复;重新挂载自动取回。 - 「重试保存」+ 有界自动重试(3 次,3/8/20 秒);重试前先 GET 对账:服务器已有相同文本 → 直接确认已保存;修订已前进 → 转为冲突,不用旧草稿覆盖。
- 有未保存内容时关闭页面有离开提醒;退出登录/账号变化清空该 owner 草稿;不写入无边界 localStorage、不落日志。
R3 冲突解决绑定所见修订并保留双方
- 409 后立即重取笔记并展示服务器版本与我的草稿,笔记页签与批注面板都有「保留服务器版本 / 保留我的草稿」。
- 解决请求必须带用户所见的
revision;期间第三次写入 → 409stale_decision并把未见内容另存为冲突副本;选择草稿时被替换的服务器版本同样另存。冲突记录不再删除(已应用标记resolved:<choice>)。
R4 四类内容逐一修通
- 版式译文改用该 document 自身受控文件校验(所有权/路径/指纹),不再拿原文哈希代替。
- 结构批注按
documentId查询(此前用 result id,保存成功但列表为空);结果与文档对应关系服务端核验。 translationRevision接受现有字符串身份并核验确为该块当前译文修订;锚点校验块/字段/范围。
R5 批注编辑、改色、删除与撤销闭环
- 删除成功后用服务器返回的新修订更新撤销记录;失败不显示已删除、撤销失败保留重试;后端继续拒绝旧修订。
- 新增「编辑」:改文字 + 四色改色,保存/冲突/失败有状态;修改后刷新与回访仍正确。
R6 依据稳定身份判重
- 回答按
(owner, paper, session, message)、摘录按(owner, paper, annotation)判重,正文用不可见身份标记;多行/列表/公式回答重复保存返回 200 且只保留一份,不再 503。
R7 真实来源、版本与阅读顺序
- 回答来源保存完整对象(标签、sourceId、可解析的页/块)并可在笔记面板点击回访;摘录来源含内容类型、页/块与译文修订。
_source_state比较文档哈希、结果修订、译文修订,并逐字比较完整摘录;重解析/重译/替换文件后不画旧位置,保留摘录并说明。- 批注分页(默认 100,最大 200)返回
nextCursor/total/orderKey,按文档内阅读顺序展示并可加载更多;无文字层时提供手写页级记录;导出含论文标识、内容类型、页/块与来源语义且剥离内部标记;兼容 1.13.0 已产生的记录。
R8 子单元已缓存时不再被时间额度拦住
- 只在确实有待发请求时检查执行时间;块子单元已缓存仅待发布时不再拦截(真实请求仍经受时间保护的
reserve_attempt)。 - 计划与执行同语义,识别四种剩余状态;复用检查点不重复调用、不清零用量;确有待发请求且时间耗尽仍拒绝并要求增额;保留 1.12.1 的部署上限、重译估算、逐维度用量与 429 余量。
验证
- 后端
tests/test_paper_notes.py15 项、tests/test_translation_budget.py33 项;浏览器frontend/unified-tests/notes.spec.ts9 项(慢响应、失败草稿恢复重试、冲突即时控件与双方保留、撤销用新修订、编辑改色、结构原文保存后立即可见等)。 - 独立验收 6 项后端复现中 5 项通过;
test_undo_using_revision_kept_by_current_ui保留为失败诊断(模拟旧 UI 旧修订,后端仍应拒绝),常驻测试断言"旧修订 409、删除返回的新修订可撤销"。 - 门禁:Docker 非集成 568 passed + 84 subtests;前端类型/20 单元/构建;全部浏览器套件(统一 16、topics 2、daily 1、keywords 3、metadata 2、reading-tools 3、structured 1、understanding 1、额度 3、笔记 9);4×pip-audit 0;Trivy 源码 0;三镜像 0 HIGH/CRITICAL;dev/main CI success。
组件
| 仓库 | 版本 | Registry 摘要 |
|---|---|---|
ifzzh520/ipaper |
1.13.1 | sha256:f8460a1873b4f4e7f793e842b30c64f5585a66845643dbb4871c6b5c801fe6aa |
ifzzh520/ipaper-translation-worker |
1.2.0 | sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003 |
ifzzh520/ipaper-document-worker |
1.2.0 | sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298 |
源码提交 ac82ea1。
限制与回退
- 不含全库笔记工作区、双链、知识图谱、跨论文检索、自动生成笔记与带批注 PDF 导出。
- 结构高亮以存下的范围与完整摘录校验为准,无法匹配时只显示块级来源与说明。
- 回退基线 Web 1.13.0 + Workers 1.2.0;回退会重新暴露 1.13.0 的笔记可靠性缺陷(慢保存覆盖、草稿丢失、冲突覆盖、批注断路),用户新增的笔记与冲突草稿仍然保留,不会被旧数据库覆盖。