Skip to content

iPaper 1.13.1 — 阅读笔记可靠性收尾(R1–R8)

Choose a tag to compare

@ifzzh ifzzh released this 22 Sep 03:45
· 22 commits to main since this release

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;期间第三次写入 → 409 stale_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.py 15 项、tests/test_translation_budget.py 33 项;浏览器 frontend/unified-tests/notes.spec.ts 9 项(慢响应、失败草稿恢复重试、冲突即时控件与双方保留、撤销用新修订、编辑改色、结构原文保存后立即可见等)。
  • 独立验收 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 的笔记可靠性缺陷(慢保存覆盖、草稿丢失、冲突覆盖、批注断路),用户新增的笔记与冲突草稿仍然保留,不会被旧数据库覆盖。