@agentunion/fastaun-browser 0.5.4 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CHANGELOG.md +177 -67
  2. package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/216/245/345/205/245/344/270/216/346/274/224/347/244/272/346/214/207/345/215/227.md +290 -0
  3. package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/234/215/345/212/241/346/236/266/346/236/204/344/270/216/350/257/246/347/273/206/345/256/236/347/216/260/350/256/241/345/210/222-codex.md +994 -0
  4. package/_packed_docs/AUN/347/246/273/347/272/277/346/216/250/351/200/201/346/234/215/345/212/241/350/277/220/347/273/264/344/270/216/345/217/221/345/270/203/346/214/207/345/215/227.md +144 -0
  5. package/_packed_docs/CHANGELOG.md +177 -67
  6. package/_packed_docs/INDEX.md +124 -65
  7. package/_packed_docs/KITE_DOCS_GUIDE.md +65 -30
  8. package/_packed_docs/agent.md/SCHEMA.md +83 -58
  9. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +1 -1
  10. package/_packed_docs/agent.md/examples/openclaw-lobster.md +1 -1
  11. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +1 -1
  12. package/_packed_docs/audit/AUN/346/234/215/345/212/241Go/345/214/226/351/207/215/346/236/204/347/262/276/347/273/206/345/214/226/346/272/220/347/240/201/345/256/241/346/237/245-20260718.md +366 -0
  13. package/_packed_docs/aun/345/205/254/347/275/221/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +234 -0
  14. package/_packed_docs/aun/345/210/206/345/270/203/345/274/217/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +1095 -0
  15. package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +1199 -0
  16. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +6 -4
  17. package/_packed_docs/group-message-rpc-alignment-gaps.md +741 -0
  18. package/_packed_docs/message-online-push-alignment.md +572 -0
  19. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +58 -20
  20. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +219 -247
  21. package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +14 -14
  22. package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +3 -3
  23. package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +165 -421
  24. package/_packed_docs/protocol/README.md +1 -0
  25. package/_packed_docs/protocol/aun-docs-guide.md +7 -4
  26. package/_packed_docs/protocol/index.md +25 -19
  27. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +63 -18
  28. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +22 -0
  29. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +93 -84
  30. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +6 -2
  31. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +73 -34
  32. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +3 -3
  33. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +21 -9
  34. package/_packed_docs/sdk/09-group-rpc-manual.md +319 -285
  35. package/_packed_docs/sdk/09-message-rpc-manual.md +144 -103
  36. package/_packed_docs/sdk/09-payload-reference.md +1 -1
  37. package/_packed_docs/sdk/09-storage-rpc-manual.md +14 -3
  38. package/_packed_docs/sdk/09-stream-rpc-manual.md +8 -8
  39. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +34 -23
  40. package/_packed_docs/sdk/CHANGELOG-0.5.6.md +73 -0
  41. package/_packed_docs/sdk/INDEX.md +45 -37
  42. package/_packed_docs/sdk/README.md +11 -9
  43. package/_packed_docs//345/217/221/345/270/203/346/212/245/345/221/212-0.5.6.md +260 -0
  44. package/_packed_docs//346/266/210/346/201/257/345/220/214/346/255/245/344/270/216/345/216/206/345/217/262/346/213/211/345/217/226/344/273/243/347/240/201/345/256/241/346/237/245/351/227/256/351/242/230/346/270/205/345/215/225.md +229 -0
  45. package/_packed_docs//346/266/210/346/201/257/345/220/214/346/255/245/344/270/216/345/216/206/345/217/262/346/213/211/345/217/226/346/224/271/351/200/240/346/226/271/346/241/210.md +750 -0
  46. package/dist/agent-md-schema.d.ts +14 -0
  47. package/dist/agent-md-schema.d.ts.map +1 -0
  48. package/dist/agent-md-schema.js +103 -0
  49. package/dist/agent-md-schema.js.map +1 -0
  50. package/dist/agent-md.d.ts +11 -5
  51. package/dist/agent-md.d.ts.map +1 -1
  52. package/dist/agent-md.js +295 -53
  53. package/dist/agent-md.js.map +1 -1
  54. package/dist/aid-store.d.ts +7 -7
  55. package/dist/aid-store.d.ts.map +1 -1
  56. package/dist/aid-store.js +46 -18
  57. package/dist/aid-store.js.map +1 -1
  58. package/dist/aid.d.ts +2 -0
  59. package/dist/aid.d.ts.map +1 -1
  60. package/dist/aid.js +29 -7
  61. package/dist/aid.js.map +1 -1
  62. package/dist/auth.d.ts.map +1 -1
  63. package/dist/auth.js +31 -11
  64. package/dist/auth.js.map +1 -1
  65. package/dist/bundle.js +29920 -19719
  66. package/dist/cert-utils.d.ts +1 -0
  67. package/dist/cert-utils.d.ts.map +1 -1
  68. package/dist/cert-utils.js +36 -16
  69. package/dist/cert-utils.js.map +1 -1
  70. package/dist/client/delivery.d.ts +106 -11
  71. package/dist/client/delivery.d.ts.map +1 -1
  72. package/dist/client/delivery.js +1925 -374
  73. package/dist/client/delivery.js.map +1 -1
  74. package/dist/client/group-state.d.ts.map +1 -1
  75. package/dist/client/group-state.js +27 -24
  76. package/dist/client/group-state.js.map +1 -1
  77. package/dist/client/lifecycle.d.ts +15 -1
  78. package/dist/client/lifecycle.d.ts.map +1 -1
  79. package/dist/client/lifecycle.js +477 -132
  80. package/dist/client/lifecycle.js.map +1 -1
  81. package/dist/client/mention-mode.d.ts +7 -0
  82. package/dist/client/mention-mode.d.ts.map +1 -0
  83. package/dist/client/mention-mode.js +184 -0
  84. package/dist/client/mention-mode.js.map +1 -0
  85. package/dist/client/peers.d.ts +1 -1
  86. package/dist/client/peers.d.ts.map +1 -1
  87. package/dist/client/peers.js +26 -3
  88. package/dist/client/peers.js.map +1 -1
  89. package/dist/client/rpc-pipeline.d.ts +34 -2
  90. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  91. package/dist/client/rpc-pipeline.js +503 -99
  92. package/dist/client/rpc-pipeline.js.map +1 -1
  93. package/dist/client/runtime.d.ts +1 -3
  94. package/dist/client/runtime.d.ts.map +1 -1
  95. package/dist/client/runtime.js +4 -7
  96. package/dist/client/runtime.js.map +1 -1
  97. package/dist/client/v2-e2ee.d.ts +43 -2
  98. package/dist/client/v2-e2ee.d.ts.map +1 -1
  99. package/dist/client/v2-e2ee.js +931 -138
  100. package/dist/client/v2-e2ee.js.map +1 -1
  101. package/dist/client.d.ts +46 -15
  102. package/dist/client.d.ts.map +1 -1
  103. package/dist/client.js +785 -304
  104. package/dist/client.js.map +1 -1
  105. package/dist/errors.d.ts.map +1 -1
  106. package/dist/errors.js +4 -1
  107. package/dist/errors.js.map +1 -1
  108. package/dist/facades.d.ts +26 -1
  109. package/dist/facades.d.ts.map +1 -1
  110. package/dist/facades.js +142 -60
  111. package/dist/facades.js.map +1 -1
  112. package/dist/group-id.d.ts.map +1 -1
  113. package/dist/group-id.js +2 -17
  114. package/dist/group-id.js.map +1 -1
  115. package/dist/group-index.d.ts +6 -1
  116. package/dist/group-index.d.ts.map +1 -1
  117. package/dist/group-index.js +44 -25
  118. package/dist/group-index.js.map +1 -1
  119. package/dist/index.d.ts +5 -4
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +3 -2
  122. package/dist/index.js.map +1 -1
  123. package/dist/keystore/index.d.ts +10 -5
  124. package/dist/keystore/index.d.ts.map +1 -1
  125. package/dist/keystore/indexeddb-identity-store.d.ts +0 -12
  126. package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
  127. package/dist/keystore/indexeddb-identity-store.js +0 -60
  128. package/dist/keystore/indexeddb-identity-store.js.map +1 -1
  129. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  130. package/dist/keystore/indexeddb-shared.js +9 -5
  131. package/dist/keystore/indexeddb-shared.js.map +1 -1
  132. package/dist/keystore/indexeddb-token-store.d.ts +3 -1
  133. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  134. package/dist/keystore/indexeddb-token-store.js +47 -2
  135. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  136. package/dist/register-flow.d.ts.map +1 -1
  137. package/dist/register-flow.js +28 -3
  138. package/dist/register-flow.js.map +1 -1
  139. package/dist/seq-tracker.d.ts +28 -8
  140. package/dist/seq-tracker.d.ts.map +1 -1
  141. package/dist/seq-tracker.js +224 -61
  142. package/dist/seq-tracker.js.map +1 -1
  143. package/dist/storage/vfs.d.ts +1 -0
  144. package/dist/storage/vfs.d.ts.map +1 -1
  145. package/dist/storage/vfs.js +26 -2
  146. package/dist/storage/vfs.js.map +1 -1
  147. package/dist/tools/cross-sdk-agent.js +399 -11
  148. package/dist/tools/cross-sdk-agent.js.map +1 -1
  149. package/dist/transport.d.ts +12 -0
  150. package/dist/transport.d.ts.map +1 -1
  151. package/dist/transport.js +226 -102
  152. package/dist/transport.js.map +1 -1
  153. package/dist/v2/session/session.d.ts.map +1 -1
  154. package/dist/v2/session/session.js +3 -4
  155. package/dist/v2/session/session.js.map +1 -1
  156. package/dist/v2/state/commitment.d.ts.map +1 -1
  157. package/dist/v2/state/commitment.js +1 -2
  158. package/dist/v2/state/commitment.js.map +1 -1
  159. package/dist/validators.d.ts.map +1 -1
  160. package/dist/validators.js +8 -14
  161. package/dist/validators.js.map +1 -1
  162. package/dist/version.d.ts +1 -1
  163. package/dist/version.js +1 -1
  164. package/package.json +11 -9
  165. package/dist/group-resources.d.ts +0 -98
  166. package/dist/group-resources.d.ts.map +0 -1
  167. package/dist/group-resources.js +0 -635
  168. package/dist/group-resources.js.map +0 -1
  169. package/dist/keystore/indexeddb.d.ts +0 -179
  170. package/dist/keystore/indexeddb.d.ts.map +0 -1
  171. package/dist/keystore/indexeddb.js +0 -2031
  172. package/dist/keystore/indexeddb.js.map +0 -1
  173. package/dist/namespaces/auth.d.ts +0 -98
  174. package/dist/namespaces/auth.d.ts.map +0 -1
  175. package/dist/namespaces/auth.js +0 -992
  176. package/dist/namespaces/auth.js.map +0 -1
  177. package/dist/namespaces/custody.d.ts +0 -51
  178. package/dist/namespaces/custody.d.ts.map +0 -1
  179. package/dist/namespaces/custody.js +0 -302
  180. package/dist/namespaces/custody.js.map +0 -1
  181. package/dist/namespaces/meta.d.ts +0 -109
  182. package/dist/namespaces/meta.d.ts.map +0 -1
  183. package/dist/namespaces/meta.js +0 -549
  184. package/dist/namespaces/meta.js.map +0 -1
@@ -0,0 +1,229 @@
1
+ # 消息同步与历史拉取代码审查问题清单
2
+
3
+ ## 1. 审查结论
4
+
5
+ - 审查基准:`docs/消息同步与历史拉取改造方案.md`。
6
+ - 事实来源:Python/Go 服务端、Gateway、Python/TypeScript/Go/JavaScript SDK 当前工作区代码;方案只作为验收口径,不作为“已实现”的证据。
7
+ - 结论:功能尚未完整;Python/Go 服务端未完全一致,四个 SDK 也未完全一致,并存在多项跨语言共同缺陷。
8
+ - Group 迁移口径:迁移期已经结束,Python `group_inbox` inbox-only 行为是基准;Go Group 继续合并旧表属于待对齐问题。
9
+ - 本清单是静态只读审查结果,未运行服务或测试。优先级按数据永久丢失/跨 Gap ACK、安全与一致性、可恢复性和性能影响排序。
10
+
11
+ ## 2. P0:可能永久漏消息或跨 Gap ACK
12
+
13
+ ### P0-1 四个 SDK 的 ACK 上界错误地使用 `max_seen/H`,而不是已提交的 `A`
14
+
15
+ Push/Tail 只能证明实时窗口上界,不能证明中间 Gap 已补齐。当前公共 ACK 出口允许调用者把 ACK 提到 `max_seen`,因此 `A=10,T=91,H=100` 时传入 100 会确认尚未补齐的 11..90,服务端随后可回收这些消息。
16
+
17
+ 证据:
18
+
19
+ - Python:[delivery.py](../python/src/aun_core/_client/delivery.py#L1111)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1828)
20
+ - TypeScript:[delivery.ts](../ts/src/client/delivery.ts#L1676)
21
+ - Go:[client_delivery.go](../go/client_delivery.go#L1968)
22
+ - JavaScript:[delivery.ts](../js/src/client/delivery.ts#L1641)
23
+
24
+ ### P0-2 四个 SDK 混淆 retention floor 与 Group Forward 可见性下界
25
+
26
+ `earliest_available_*`、`join_seq` 和业务可见性边界不代表服务端已物理删除连续前缀,禁止写回或命名为 retention floor。但它们在普通 Group Message/Event Forward 中是当前成员永久不可读前缀的权威证明:`visibility_floor=max(join_seq, earliest_available_*-1)`,A 应推进到 `max(A, retention_floor_*, visibility_floor)`。P2P 只能使用显式 retention floor;Group Tail 也只能独立应用 retention clamp,History 完全不修改 A/T/H。
27
+
28
+ 服务端必须保持两个字段族分离:`retention_floor_*` 只表示已提交 GC;Group Forward 的 `earliest_available_*` 则返回 `max(retention_floor, join/epoch visibility floor)+1`。四端消费时取最大值是兼容与防御,不得把成员可见性写入服务端 GC floor。
29
+
30
+ 证据:
31
+
32
+ - Python:[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1290)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L3342)
33
+ - TypeScript:[rpc-pipeline.ts](../ts/src/client/rpc-pipeline.ts#L889)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1742)
34
+ - Go:[client_rpc_pipeline.go](../go/client_rpc_pipeline.go#L1242)、[client_rpc_pipeline.go](../go/client_rpc_pipeline.go#L1306)
35
+ - JavaScript:[rpc-pipeline.ts](../js/src/client/rpc-pipeline.ts#L843)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1470)
36
+
37
+ ### P0-3 Forward 的提交、持久化和应用交付顺序不能保证崩溃恢复
38
+
39
+ TypeScript、Go、JavaScript 存在先推进 A、后解密/发布的路径;Go 的持久化还由延迟批处理完成。水位落盘后、应用回调前崩溃会令重启从新 A 之后继续,当前页永久不再交付。持久化失败时部分路径只记录日志,仍继续 ACK,也会令服务端状态前移而本地恢复到旧状态。
40
+
41
+ 证据:
42
+
43
+ - TypeScript:[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1073)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1652)
44
+ - Go:[client_v2_e2ee.go](../go/client_v2_e2ee.go#L1412)、[v2_group.go](../go/v2_group.go#L615)、[client_delivery.go](../go/client_delivery.go#L2244)、[v2_routing.go](../go/v2_routing.go#L143)
45
+ - JavaScript:[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1044)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1388)
46
+
47
+ ### P0-4 Python、TypeScript、JavaScript 的 Tail 先提交/ACK,后解密和交付
48
+
49
+ 三端先持久化 T/H;窗口与 A 接壤时还会立即 ACK 合并后的 A,之后才逐条解密并发布。ACK 成功后进程崩溃或回调失败,服务端可删除应用从未收到的消息。Go 的对应 Tail 路径没有这一特定顺序差异。
50
+
51
+ 证据:
52
+
53
+ - Python:[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1060)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1120)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L3035)
54
+ - TypeScript:[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L960)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L972)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1489)
55
+ - JavaScript:[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L951)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L963)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1271)
56
+
57
+ ### P0-5 四个 SDK 对 Forward 原始页的校验过于宽松
58
+
59
+ 非对象、非法 seq、过期 seq 和重复 seq 被静默丢弃;同 seq 内容冲突时保留第一条,而后仍按过滤后的最大 seq 推进 A。Python 的有序 pending 与强制推进组合还可在 `[5,7,6]` 等乱序状态下越过尚未正确交付的 6。服务端损坏、跨源冲突或恶意响应会被转换为“成功扫描”。
60
+
61
+ 证据:
62
+
63
+ - Python:[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L64)、[v2_e2ee.py](../python/src/aun_core/_client/v2_e2ee.py#L1412)
64
+ - TypeScript:[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L63)、[v2-e2ee.ts](../ts/src/client/v2-e2ee.ts#L1073)
65
+ - Go:[message_window_support.go](../go/message_window_support.go#L123)、[client_v2_e2ee.go](../go/client_v2_e2ee.go#L1333)
66
+ - JavaScript:[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L62)、[v2-e2ee.ts](../js/src/client/v2-e2ee.ts#L1044)
67
+
68
+ ### P0-6 四个 SDK 缺少身份、slot 与存储 generation 校验
69
+
70
+ Tail/Forward/Gate 异步任务未绑定连接代际。断线重连、切换 AID/device/slot 或更换存储后,旧任务仍可写入共享 SeqTracker,并在执行 ACK 时使用新会话身份。Go 调用链可直接闭合:任务只捕获旧 AID,但 ACK 和持久化读取执行时的当前身份。
71
+
72
+ 证据:
73
+
74
+ - Go:[client_rpc_pipeline.go](../go/client_rpc_pipeline.go#L219)、[client_runtime.go](../go/client_runtime.go#L334)、[v2_routing.go](../go/v2_routing.go#L79)、[client_delivery.go](../go/client_delivery.go#L2338)
75
+ - Python:[delivery.py](../python/src/aun_core/_client/delivery.py#L2538)
76
+ - TypeScript:[delivery.ts](../ts/src/client/delivery.ts#L1316)
77
+ - JavaScript:[delivery.ts](../js/src/client/delivery.ts#L1281)
78
+
79
+ ### P0-7 Go/TypeScript 的损坏持久化状态可被修复成跨 Gap ACK
80
+
81
+ 存储层在交给 SeqTracker 前就把非法窗口折叠到较大值。例如 `A=100,T=-1,H=1000` 可被改成 `A=T=H=1000`,从而确认 101..999。Python 对非法状态失败关闭;JavaScript 按 A 折叠,因此四端恢复语义不一致。
82
+
83
+ 证据:
84
+
85
+ - Go:[aid_db.go](../go/keystore/aid_db.go#L489)、[aid_db.go](../go/keystore/aid_db.go#L590)、[seq_tracker.go](../go/seq_tracker.go#L656)
86
+ - TypeScript:[aid-db.ts](../ts/src/keystore/aid-db.ts#L237)
87
+ - Python 基准:[seq_tracker.py](../python/src/aun_core/seq_tracker.py#L487)
88
+ - JavaScript 基准:[seq-tracker.ts](../js/src/seq-tracker.ts#L420)
89
+
90
+ ## 3. P1:功能不可用、确定漏读、竞态或严重性能问题
91
+
92
+ ### P1-1 Tail/History 反向快照不完整或跨代
93
+
94
+ - Python Message 只查 DB/迁移旧表,遗漏已经成功进入 WAL/pending/recent cache、尚未 flush 的消息;Push 后立即 Tail/History 会漏读并返回滞后的 head。[entry.py](../../extensions/services/message/entry.py#L11203)、[entry.py](../../extensions/services/message/entry.py#L13426)、[db.py](../../extensions/services/message/db.py#L4773)
95
+ - Go Message 在 DB 事务快照建立后才调用 pending lookup,writer 交接窗口可使一条消息既不在事务快照,也不在 pending;Recent 来源也没有纳入反向快照。[tail_history_snapshot.go](../../extensions/services/message/go/internal/store/tail_history_snapshot.go#L118)
96
+ - Python/Go Group 都把 pending freeze 与 DB RR 快照分开。冻结旧正文后再发生 writer 提交与 Recall,旧 pending 可覆盖 DB tombstone,重新返回已撤回正文。[message_store.py](../../extensions/services/group/message_store.py#L3184)、[reverse_messages.go](../../extensions/services/group/go/internal/service/reverse_messages.go#L111)、[reverse_message_snapshot.go](../../extensions/services/group/go/internal/repository/reverse_message_snapshot.go#L58)
97
+
98
+ ### P1-2 Python/Go Message 与 Group 的 Tail 都没有证明固定 head/band
99
+
100
+ 实现把 head 缩成当前可见物理行的最大 seq,并在首个数值空号处截断。永久空号、设备不可见行或未 flush pending 会缩小 H/W,制造额外 Gap,违反 Tail 固定扫描窗口语义。
101
+
102
+ 证据:[Message Python](../../extensions/services/message/db.py#L4926)、[Message Go](../../extensions/services/message/go/internal/store/tail_history_snapshot.go#L215)、[Group Python](../../extensions/services/group/message_store.py#L3325)、[Group Go](../../extensions/services/group/go/internal/repository/reverse_message_snapshot.go#L140)
103
+
104
+ ### P1-3 History 终页契约在服务端和四 SDK 间不一致
105
+
106
+ 服务端可在 `has_older=false` 时仍返回非空 `next_before_seq`,或返回边界字段为 `null` 的空页;四 SDK 又要求边界成对出现、相等且空页不得带边界,因而拒绝合法终页或产生一次额外翻页。
107
+
108
+ 证据:[Python Message](../../extensions/services/message/db.py#L4948)、[Go Message](../../extensions/services/message/go/cmd/message-go/tail_history.go#L206)、[Go Group](../../extensions/services/group/go/internal/service/reverse_messages.go#L209)、[Python SDK](../python/src/aun_core/_client/v2_e2ee.py#L102)、[TypeScript SDK](../ts/src/client/v2-e2ee.ts#L89)、[Go SDK](../go/message_window_support.go#L183)、[JavaScript SDK](../js/src/client/v2-e2ee.ts#L88)
109
+
110
+ ### P1-4 Group 在分页之后做业务可见性过滤,会截断 History
111
+
112
+ Python/Go 都先按物理行取 `limit` 并计算分页边界,之后才按 join/epoch/Recall 可见性过滤。最新物理页全不可见、但更老处仍有可见消息时,Python会错误返回 `has_older=false`;Go 会返回空页但 `has_older=true`。两端都没有形成一致、可继续且不漏读的契约。
113
+
114
+ 证据:[Python store](../../extensions/services/group/message_store.py#L3353)、[Python service](../../extensions/services/group/service.py#L5596)、[Python entry](../../extensions/services/group/entry.py#L5031)、[Go snapshot](../../extensions/services/group/go/internal/repository/reverse_message_snapshot.go#L173)、[Go filter](../../extensions/services/group/go/internal/service/reverse_messages.go#L158)
115
+
116
+ ### P1-5 Python Message 实现了 History,但没有向 Gateway 声明
117
+
118
+ 本地 dispatcher 注册了 `history`,生产 `service.attach` 的方法列表却缺失它;Gateway 按能力选择实例时必然返回 `method_not_declared`。因此“有 handler”不等于功能可用,且 Python/Go Message 行为不一致。
119
+
120
+ 证据:[entry.py](../../extensions/services/message/entry.py#L4851)、[entry.py](../../extensions/services/message/entry.py#L14718)、[entry.py](../../extensions/services/message/entry.py#L15092)、[service_plane.py](../../extensions/services/gateway/service_plane.py#L383)、[Go 声明](../../extensions/services/message/go/internal/gatewayattach/attach.go#L23)
121
+
122
+ ### P1-6 512 KiB 响应上限没有形成硬约束
123
+
124
+ Python Message Tail/History 没有裁剪;已有裁剪函数与 Python/Go Group 都保证至少保留一条,并只累计 message JSON,不含响应外壳。单条合法消息可超过 512 KiB,所以各路径都可能发送超限帧。Tail 裁剪时还必须同步右移 W,当前实现不统一。
125
+
126
+ 证据:[Python Message](../../extensions/services/message/entry.py#L529)、[Python Message Tail](../../extensions/services/message/entry.py#L11231)、[Python Message History](../../extensions/services/message/entry.py#L13458)、[Python Group](../../extensions/services/group/entry.py#L5004)、[Go Group](../../extensions/services/group/go/internal/service/reverse_messages.go#L181)
127
+
128
+ ### P1-7 四 SDK 的调度、`has_more` 与失败重试不完整
129
+
130
+ 四端都主要以“返回条数达到 limit”判断续页,忽略字节裁剪后仍为 `has_more=true` 的非满页,导致 Gap Fill 提前停止。Tail/Forward 失败后没有退避重试;没有后续 Push 时 Gap 可永久停留。
131
+
132
+ 证据:[Python](../python/src/aun_core/_client/v2_e2ee.py#L1477)、[TypeScript](../ts/src/client/v2-e2ee.ts#L1183)、[Go](../go/v2_routing.go#L172)、[JavaScript](../js/src/client/v2-e2ee.ts#L1141)、[Go 重试入口](../go/client_delivery.go#L1628)
133
+
134
+ ### P1-8 Pull Gate key、长任务占用及 Go 锁反转
135
+
136
+ 四端 Gate 折叠 key 未包含完整请求语义,忽略 piggy ACK、device、slot 和外部游标所有权,不同请求可错误共享首请求结果。一次 Gate 还包住最多 100 页 Forward,放大 3 秒旁路并发。Go 另有 `seqTrackerPersistMu -> c.mu` 与 `c.mu -> seqTrackerPersistMu` 的确定性锁顺序反转。
137
+
138
+ 证据:[Python key](../python/src/aun_core/_client/rpc_pipeline.py#L481)、[TypeScript key](../ts/src/client/rpc-pipeline.ts#L599)、[Go key](../go/client_rpc_pipeline.go#L858)、[JavaScript key](../js/src/client/rpc-pipeline.ts#L619)、[Go Gate](../go/client_rpc_pipeline.go#L284)、[Go 锁 1](../go/client_delivery.go#L2338)、[Go 锁 2](../go/client_lifecycle.go#L241)
139
+
140
+ ### P1-9 Message/Group GC 会被永久 seq 空号卡死
141
+
142
+ 序号先分配,后续 WAL/reserve/enqueue 失败不会回滚 allocator,也没有永久洞标记;GC 又只允许 `floor+1` 连续推进。一个空号即可让其后的全部过期消息永久无法删除,floor 永不前移。
143
+
144
+ 证据:[Python Group allocator](../../extensions/services/group/message_store.py#L1773)、[Python Group GC](../../extensions/services/group/message_store.py#L1452)、[Go Group allocator](../../extensions/services/group/go/internal/store/plain_pending_sql.go#L87)、[Go Group GC](../../extensions/services/group/go/internal/store/retention_gc.go#L343)
145
+
146
+ ### P1-10 WAL/barrier/reservation/cache 存在资源泄漏和失效问题
147
+
148
+ - Python/Go Group 在 WAL append 成功后 fsync/enqueue 失败时不释放 reservation,记录既不进入当前 writer,又永久占用 pending 容量和 GC barrier,重启后还会幽灵回放。[Python plain](../../extensions/services/group/message_store.py#L1850)、[Python queue](../../extensions/services/group/pending_write_queue.py#L269)、[Go plain](../../extensions/services/group/go/internal/store/plain_pending_pipeline.go#L115)、[Go queue](../../extensions/services/group/go/internal/walqueue/queue.go#L468)
149
+ - Go Group Recent V2 body cache 只增不删,GC 后密文仍驻留内存。[recent_v2_cache.go](../../extensions/services/group/go/internal/messages/recent_v2_cache.go#L77)、[retention_gc.go](../../extensions/services/group/go/internal/store/retention_gc.go#L249)
150
+ - Go Group GC 的 `batchSize` 只限制内存计算边界,`FOR UPDATE` 仍可锁定全部候选物理行,形成长事务和 OOM 风险。[retention_gc.go](../../extensions/services/group/go/internal/store/retention_gc.go#L137)、[retention_gc.go](../../extensions/services/group/go/internal/store/retention_gc.go#L303)
151
+
152
+ ### P1-11 Python Group 改变了普通 Forward 与 Group Event 的旧语义
153
+
154
+ 无 `window_mode` 的普通 Pull 和 Event Pull 把 `cursor.current_seq` 固定成 ACK,不再按已提交 retention floor 更新与持久化;响应字段也发生变化。这违反“旧 Forward/Event 请求、响应、游标行为保持不变”的兼容要求。
155
+
156
+ 证据:[普通消息](../../extensions/services/group/service.py#L5801)、[Group Event](../../extensions/services/group/service.py#L12084)
157
+
158
+ ### P1-12 Go Message 的 V1 Tail 返回形状走了 V2 转换路径
159
+
160
+ `message.pull` 的 Tail 分支与 V2 共用 snapshot handler,而 handler 固定把行转换成 V2 message 形状;Python 对 V1/V2 分别转换。旧 SDK 调 `message.pull(window_mode=tail)` 时会收到不兼容字段。
161
+
162
+ 证据:[Go dispatcher](../../extensions/services/message/go/cmd/message-go/main.go#L4735)、[Go Tail handler](../../extensions/services/message/go/cmd/message-go/tail_history.go#L145)、[Python 分流](../../extensions/services/message/entry.py#L11231)
163
+
164
+ ### P1-13 Python、TypeScript、Go 调试日志会泄漏完整消息内容
165
+
166
+ 调试路径可记录完整明文或完整密文/envelope,违反日志扫描门禁;JavaScript 未发现同等 `message.debug` 路径,因此四端不一致。
167
+
168
+ 证据:[Python](../python/src/aun_core/_client/delivery.py#L798)、[TypeScript](../ts/src/client/delivery.ts#L606)、[Go](../go/client.go#L253)
169
+
170
+ ### P1-14 JavaScript History 会触发实时路径副作用
171
+
172
+ History 虽不发布实时事件,但复用了实时解密路径,仍可能更新/调度密钥、会话或补拉相关状态;这违反 History 对实时状态无副作用的要求,并与其他 SDK 不一致。
173
+
174
+ 证据:[JavaScript History](../js/src/client/v2-e2ee.ts#L88)、[JavaScript Group 解密路径](../js/src/client/v2-e2ee.ts#L853)
175
+
176
+ ## 4. P2:跨语言差异、可观测性和次级性能问题
177
+
178
+ ### P2-1 Go Group 必须对齐 Python 的 inbox-only 基准
179
+
180
+ 迁移期已结束,新消息只写 `group_inbox`。Python 普通 Forward/Tail/History 以 inbox 结果为权威并禁止后续旧表 fallback;Go 普通 Forward 仍读取、合并 legacy,Tail/History 还硬编码 `IncludeLegacy=true`。残留旧行可填洞、制造 seq 冲突,并导致两服务端返回不同结果。
181
+
182
+ 证据:[Go legacy max/query](../../extensions/services/group/go/internal/repository/pull_sql_backend.go#L928)、[Go Forward merge](../../extensions/services/group/go/internal/service/v2_pull.go#L225)、[Go reverse](../../extensions/services/group/go/internal/service/reverse_messages.go#L126)、[Python inbox snapshot](../../extensions/services/group/message_store.py#L3015)、[Python authoritative](../../extensions/services/group/entry.py#L7345)
183
+
184
+ ### P2-2 四端在相同 head 的迟到 Tail 上都会右移 T
185
+
186
+ 当 `head` 与当前 H 相同、`window_start` 更大时,四端把 T 右移,主动丢弃已有的更宽可靠窗口并扩大 Gap。该规则需要与方案正文统一后再实现,当前四端虽一致,但一致地存在语义风险。
187
+
188
+ 证据:[Python](../python/src/aun_core/seq_tracker.py#L146)、[TypeScript](../ts/src/seq-tracker.ts#L127)、[Go](../go/seq_tracker.go#L199)、[JavaScript](../js/src/seq-tracker.ts#L112)
189
+
190
+ ### P2-3 Message Tail 的 `server_ack_seq` 恒为 0
191
+
192
+ Python Tail 没有把 slot 传给 snapshot,DB reverse 也不读 ACK;入口对缺失字段默认 0。Go reverse snapshot 同样没有 ACK 来源。不会直接回退本地 A,但冷启动和恢复会产生多余 Forward,且丢失旧 Pull 已有的 ACK 元数据。
193
+
194
+ 证据:[Python call](../../extensions/services/message/entry.py#L11203)、[Python response](../../extensions/services/message/entry.py#L11253)、[Go snapshot](../../extensions/services/message/go/internal/store/tail_history_snapshot.go#L153)
195
+
196
+ ### P2-4 四 SDK 的 API、Gate、附件和返回结构仍不一致
197
+
198
+ 已确认的代表性差异:Go Group History 结果缺 `group_id`;Python Group 明文 Tail/History 丢 `attachments`;Go Group 参数校验接受带空白模式、整数浮点和字符串布尔,而 Python 严格拒绝;部分 Gate 分类及公开 API 返回字段也不同。
199
+
200
+ 证据:[Go History](../go/message_window_support.go#L281)、[Python Group 附件转换](../../extensions/services/group/entry.py#L7070)、[Go 参数校验](../../extensions/services/group/go/internal/rpc/message_window_validation.go#L22)、[Python 参数校验](../../extensions/services/group/entry.py#L4950)
201
+
202
+ ### P2-5 Gateway proximity、Tail/History 诊断和 LOG-02 尚未完整闭环
203
+
204
+ Python/Go Gateway 已把 History 纳入 session-auth 和能力路由,但 proximity 只装饰实时事件,Tail/History 转发没有能证明边界字段未被改写的成功诊断;Message/Group 服务端日志也缺来源计数、真实 UTF-8 响应字节、裁剪结果、耗时和无副作用确认。发生跨域或裁剪问题时无法仅靠日志还原链路。
205
+
206
+ 证据:[Python Gateway auth](../../extensions/services/gateway/relay.py#L536)、[Go Gateway auth](../../extensions/services/gateway/go/internal/httpserver/server.go#L536)、[Go proximity](../../extensions/services/gateway/go/internal/httpserver/server.go#L12115)、[Python Message 日志](../../extensions/services/message/entry.py#L11240)、[Go Message 日志](../../extensions/services/message/go/cmd/message-go/tail_history.go#L166)、[Python Group 日志缺口](../../extensions/services/group/entry.py#L4984)、[Go Group 日志](../../extensions/services/group/go/internal/service/reverse_messages.go#L142)
207
+
208
+ ## 5. 横向一致性结论
209
+
210
+ | 对照项 | 结论 |
211
+ | --- | --- |
212
+ | Python Message vs Go Message | 不一致:Python 未声明 History;两端反向快照来源、V1 Tail 形状、终页与诊断行为不同 |
213
+ | Python Group vs Go Group | 不一致:Go 未收口 inbox-only;两端 History 空页、参数校验、GC 批次和缓存行为不同 |
214
+ | 四 SDK 状态机 | 不一致,且 ACK 上界、非权威 floor、Forward 校验、generation、`has_more` 等存在共同缺陷 |
215
+ | Python vs TypeScript vs JavaScript | TypeScript/JavaScript 结构接近但持久化等待、History 副作用和部分返回语义不同 |
216
+ | Go SDK vs 其他 SDK | 另有锁反转、损坏状态修复、群并行解密与签名失败后 ACK 等特有问题 |
217
+
218
+ ## 6. 修复顺序
219
+
220
+ 1. 先冻结并修复全部 P0:ACK 只能到 A;只有权威 retention floor 能推进 A;提交、持久化、交付、ACK 按崩溃安全顺序重排;所有任务增加 generation。
221
+ 2. 再修服务端可靠窗口与快照:固定 head/band、合并完整来源、统一 History 终页和 Group 可见性分页。
222
+ 3. 然后修 Gate、`has_more`、重试、GC/WAL/cache 与 512 KiB 硬上限。
223
+ 4. 最后收口跨语言差异和 LOG-02;其中 Go Group inbox-only 对齐 Python 是明确口径,不再保留迁移期兼容分支。
224
+
225
+ ## 7. 已排除的误报
226
+
227
+ - Python Group Tail/History 已由外层统一 federation 路由覆盖,不存在跨域路由缺失。
228
+ - Python Group inbox-only 是迁移完成后的正确基准,不是缺陷;缺陷是 Go Group 尚未对齐。
229
+ - Python Group Tail/History 已执行 512 KiB 裁剪;问题是该裁剪不是硬上限,而不是“完全没有裁剪”。