分页游标要继承未推进实体的位置

**多实体共用一个复合游标时,next cursor 必须「继承输入 positions + 仅覆盖本页真正返回边界的实体」。只编码本页边界,会让先耗尽的实体位置丢失 —— 它从 epoch 重放,其他实体继续翻页时重复下发数据。**

缺陷形态

nextState 只写入本页返回了行的那几个实体:

  • 实体 A 第 1 页就取完了 → 本页返回 0 行 → A 没有边界 → 若 next cursor 不含 A 的位置,A 就被重置到起点。
  • 后续页里 A 又从头返回一遍。数据看起来"没丢",但增量同步变成重复同步。

正确做法

paginateEntities(..., positions):

  1. 以输入的 positions 为基线;
  2. 本页返回了边界行的实体 → 覆盖为新的边界;
  3. 没返回边界(耗尽/无数据)的实体 → 保留输入里的位置。

这样最终 hasMore = false 的那次 cursor 仍包含全部实体的已知位置。

配套测试

  • 不对称多页(不同实体在不同页耗尽);
  • 最终增量 cursor 的回归断言;
  • 首屏从 epoch 开始时,"从未有过数据的实体"没有位置是正确行为,不是丢位置。

相关