Qualified Notes on Papers

每条评论都有着落。
每次评审都能收尾。

行级精确的文档评审——只有当一切不再悬而未决,评审才算完成。

围绕标题的工作流场景:一份带有高亮段落和锚定批注的渲染文档、评审者的评论气泡、批注随新版本重新锚定的版本跳转、一条被接受的决定,以及一张零未决批注的定稿卡片——由一条流动的线串联,沿途是评审者的头像。

这种卡住你的流程,你早就熟悉了。

文档评审往往发生在工具之间的缝隙里——每道缝隙都要付出一条评论、一个版本或一个下午的代价。

  • 没有 qnop: 文档作为邮件附件发出去。

    五位评审者、五份副本、五套评论,得有人手动合并。

    有了 qnop: 一份文档、一次评审,所有评审者都在同一个地方。

  • 没有 qnop: 反馈以“第 4 页第二段第三行”的形式出现。

    改的人找段落花的时间比改动本身还长。

    有了 qnop: 批注精确锚定在它们所指的行和区域上。

  • 没有 qnop: 新版本一出,旧版本上的评论全部失去着落。

    于是最稳妥的做法是评审结束前不更新文档。

    有了 qnop: 新版本会重新锚定既有批注,而不是丢弃它们。

  • 没有 qnop: 没人说得清评审到底完成了没有。

    “完成”的意思是有人不再回复讨论串,而不是工作已经收尾。

    有了 qnop: 只有零未决批注时,评审才能定稿。

该精确的地方精确,该有结构的地方有结构。

三件事承担了重活:精确锚定、不离原处的讨论,以及让对话延续的版本机制。

标注那一行,而不是那一页。

在渲染后的 PDF 上选中精确的行和区域,用 Markdown 在讨论串中评论。多层锚定会保存文字引用、位置和版面——批注始终指向它想表达的内容,而不是某个今天恰好在那里的坐标。

  • 行级、区域级的精确选择
  • 支持回应表情的 Markdown 评论
  • 在文档与讨论之间一键跳转
锚定在选中段落上的批注

讨论始终不离原处。

每条批注都带着自己的讨论串:回复、回应,以及一个真正有含义的状态。未决、已讨论,然后被接受或拒绝——决定就留在它所针对的段落上,而不是躺在某个人的收件箱里。

  • 每条批注独立的回复讨论串
  • 接受或拒绝是明确的决定
  • 可选的评审者匿名机制
一条已解决的批注讨论串

新版本延续既有对话。

内容变更会创建不可变的新版本——旧版本从不被改写。既有批注通过模糊匹配重新锚定到新版本上,版本间差异视图精确展示哪些内容移动了。

  • 不可变、完整保留的版本历史
  • 跨版本的模糊重锚定
  • 用于对比视图的版本间差异
跨版本保留下来的批注

一次能亲口告诉你它已完成的评审。

qnop 把评审建模为显式状态机,而不是一条请大家自觉遵守的约定。只要还有未完成的工作,最终状态就无法到达。

  1. 未决

    批注被放在某个段落上,归属于必须回应它的人。

  2. 已讨论

    讨论串在推进:回复、回应,以及做决定所需的上下文。

  3. 已接受 / 已拒绝

    决定记录在批注本身上,并进入审计日志。

  4. 已定稿

    只有零未决批注时才能到达。没有任何事项悄悄掉出清单。

把评审当作一场竞技

评审吞吐量,终于看得见。

评审是没人排进日程的工作。qnop 让这份投入清晰可见:连续纪录、排行榜、成就和玩家卡片档案,把完成评审变成习惯,而不是负担。

  • 玩家卡片

    一份档案,展示某人真正为评审做了什么。

  • 连续纪录与任务

    看得见的势头,就在工作所在的仪表盘上。

  • 团队段位

    按团队的进度与领导力段位,来自真实的评审活动。

带连续纪录与成就的评审者档案卡片

你的文档始终在你的掌控之下。

qnop 以自托管为第一设计目标:一个容器运行 REST API 和内嵌的 Web 界面,加上 PostgreSQL 和任意兼容 S3 的对象存储——全部在你自己的基础设施上。

  • qnop API + Web 界面
  • PostgreSQL 关系型数据
  • 兼容 S3 的对象存储 文档

你的基础设施

没有不安全的默认配置

缺少必需的密钥或密钥仍是占位符时,服务器会立即启动失败。不存在会被遗忘的“先凑合用”配置。

企业级登录

带邮箱验证的本地账户,或 OIDC 单点登录。JWT 会话配合轮换刷新令牌,认证端点有速率限制。

默认可追责

每个相关操作都进入审计日志,可由专设的审计员角色查阅——这个角色正是为此而存在。

贴合现实的角色

全局的管理员、成员和审计员角色,加上按团队的负责人——流程需要时,评审还可以在评审者匿名的情况下进行。

把评审真正做完。这次是真的。

自托管、行级精确,说完成时才算完成。