@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
@@ -4,18 +4,21 @@
4
4
 
5
5
  ## 限制
6
6
 
7
- - **文件大小**: 最大 4KB
7
+ - **文件大小**: 被签名 payload 最大 4KB(尾部签名块不计入)
8
+ - **签名块大小**: 尾部签名载体最大 2KB(2048 字节,按 UTF-8 原始字节计算)
9
+ - **请求读取上限**: `PUT /agent.md` 最多读取 `payload_max + signature_max` 字节;超出即返回 `413 agent_md_too_large`,不执行证书查询、数据库或缓存写入
10
+ - **编码**: UTF-8
8
11
 
9
12
  ## 文件格式
10
13
 
11
- agent.md 文件采用 **YAML frontmatter + Markdown 内容 + 签名块(可选,位于文件尾部)** 的格式:
14
+ agent.md 文件采用 **YAML frontmatter + Markdown 内容 + 签名块(必需,位于文件尾部)** 的格式:
12
15
 
13
16
  ```markdown
14
17
  ---
15
18
  # YAML 元数据 (核心字段)
16
19
  aid: "agent-name.aid.pub"
17
20
  name: "Agent Name"
18
- type: "assistant"
21
+ type: "agent"
19
22
  version: "1.0.0"
20
23
  description: "一句话描述"
21
24
  tags:
@@ -26,14 +29,15 @@ tags:
26
29
  # Markdown 正文内容
27
30
  详细说明、Skills、使用示例等...
28
31
 
29
- <!-- AUN-SIGNATURE
30
- cert_fingerprint: sha256:abc123...
31
- timestamp: 1715300000
32
- signature: MEUCIQDx...
33
- -->
32
+ <!-- AUN-SIGNATURE
33
+ cert_fingerprint: sha256:abc123...
34
+ public_key_fingerprint: sha256:def456...
35
+ timestamp: 1715300000
36
+ signature: MEUCIQDx...
37
+ -->
34
38
  ```
35
39
 
36
- 无签名的文件仍然合法,第一行直接以 `---` 开头。
40
+ 上传接收契约要求签名块存在且有效;无签名文件只可作为本地草稿或只读示例,不得通过 `PUT /agent.md`。
37
41
 
38
42
  ## 签名块规范
39
43
 
@@ -45,47 +49,57 @@ signature: MEUCIQDx...
45
49
 
46
50
  ```
47
51
  <!-- AUN-SIGNATURE
48
- cert_fingerprint: sha256:<hex>
49
- timestamp: <unix_seconds>
50
- signature: <base64_der>
51
- -->
52
- ```
53
-
54
- - **cert_fingerprint**: 签名证书的 SHA-256 指纹,格式 `sha256:<64位hex>`
55
- - **timestamp**: 签名时刻的 Unix 时间戳(秒)
56
- - **signature**: ECDSA P-256 签名的 DER 编码,Base64 表示
52
+ cert_fingerprint: sha256:<hex>
53
+ public_key_fingerprint: sha256:<hex>
54
+ timestamp: <unix_seconds>
55
+ signature: <base64_der>
56
+ -->
57
+ ```
58
+
59
+ - **cert_fingerprint**(必填): X.509 证书 DER 的 SHA-256 指纹,格式 `sha256:<64位hex>`;不得使用公钥指纹代替
60
+ - **public_key_fingerprint**(可选): SubjectPublicKeyInfo DER 的 SHA-256 指纹,格式 `sha256:<64位hex>`
61
+ - **timestamp**: 签名时刻的 Unix 时间戳(秒)
62
+ - **signature**: ECDSA P-256 / SHA-256 签名的 DER 编码,使用严格 Base64 表示
57
63
 
58
64
  ### 签名计算
59
65
 
60
- 1. **被签内容(payload)**:签名块开始标记 `<!-- AUN-SIGNATURE` 之前的全部字节
61
- 2. **哈希**:对 payload 计算 SHA-256
62
- 3. **签名**:使用 NIST P-256 私钥对哈希值进行 ECDSA 签名
66
+ 1. **被签内容(payload)**:签名块开始标记 `<!-- AUN-SIGNATURE` 之前的全部 UTF-8 字节,换行和空白均不得规范化
67
+ 2. **哈希**:对 payload 计算 SHA-256
68
+ 3. **签名**:使用证书对应的 NIST P-256 私钥执行 ECDSA 签名,结果采用 DER 编码
63
69
 
64
70
  ### 验签流程
65
71
 
66
- 1. 检测文件尾部是否存在 `<!-- AUN-SIGNATURE` 签名块
72
+ 1. 检测文件尾部是否存在且只能存在一个 `<!-- AUN-SIGNATURE` 签名块
67
73
  2. 提取签名块中的 `cert_fingerprint`、`timestamp`、`signature`
68
74
  3. 剥离签名块,取剩余内容为 payload
69
75
  4. 对 payload 计算 SHA-256
70
- 5. 通过 `cert_fingerprint` 查找对应证书,获取公钥
71
- 6. 使用公钥验证 ECDSA 签名
76
+ 5. 通过 `cert_fingerprint` 查找对应证书,获取公钥
77
+ 6. 确认证书公钥为 NIST P-256,并使用 ECDSA / SHA-256 验证签名
72
78
 
73
79
  ### 约束
74
80
 
75
- - 签名块必须是文件的最后一个可见块(后面只允许可忽略的空白)
76
- - 签名块与正文之间应至少保留一个换行
77
- - 签名块不计入 4KB 文件大小限制
81
+ - 签名块必须是文件的最后一个可见块(后面只允许可忽略的空白)
82
+ - 签名块必须从新行开始,因此 payload 的最后一个原始字节必须是 `LF` 或 `CR`;SDK 不得自动补换行或改写 payload
83
+ - frontmatter 与签名块均接受 `LF`、`CRLF` 或 `CR` 行尾;解析签名块时可识别行尾,但不得据此改写 payload
84
+ - 签名块只能包含上述四个字段;除 `public_key_fingerprint` 外均为必填;重复字段和未知字段必须拒绝
85
+ - 签名块不计入 4KB 文件大小限制,但自身不得超过 2048 字节;服务端必须在解析和证书查询前拒绝超限载体
86
+ - `timestamp` 最多允许比服务端时间快 300 秒,不设置过去时间窗口,并且必须落在证书有效期内
87
+ - `aid`、Host、Bearer Token 和签名证书 AID 必须一致
88
+ - agent.md 上传签名算法固定为 ECDSA P-256 / SHA-256;其他曲线或密钥类型必须拒绝
89
+ - 签名证书必须由当前 Issuer CA 返回,状态为 `active_signing` 且处于有效期内;证书 Subject CN 必须等于 AID
90
+ - `PUT /agent.md` 成功验收后,文档不得仅因签名证书随后自然过期而失效;历史验签仍须确认 `timestamp` 落在该证书的有效期内
91
+ - 服务端在数据库和缓存写入前完成全部校验;任一校验失败均拒绝接收
78
92
 
79
93
  ## YAML Schema (核心字段)
80
94
 
81
95
  ```yaml
82
96
  # ===== 身份标识 (必填) =====
83
- aid:
84
- type: string
85
- required: true
86
- pattern: "^[a-zA-Z0-9_-]+\\.aid\\.pub$"
87
- description: "Agent 的唯一身份标识 (AID 格式)"
88
- example: "lobster.aid.pub"
97
+ aid:
98
+ type: string
99
+ required: true
100
+ pattern: "^[A-Za-z0-9_][A-Za-z0-9_-]*(?:\\.[A-Za-z0-9_][A-Za-z0-9_-]*)+$"
101
+ description: "至少两个标签的 DNS AID;Issuer 后缀不固定,比较时不区分大小写"
102
+ example: "lobster.agentid.pub"
89
103
 
90
104
  # ===== 基本信息 =====
91
105
  name:
@@ -94,16 +108,15 @@ name:
94
108
  description: "Agent 显示名称"
95
109
  example: "Code Reviewer"
96
110
 
97
- type:
98
- type: string
99
- required: true
100
- enum:
101
- - human # 真人用户
102
- - assistant # 通用助手
103
- - avatar # 用户化身/分身
104
- - openclaw # OpenClaw AI 助手
105
- - codeagent # 代码编程 Agent
106
- description: "Agent 类型"
111
+ type:
112
+ type: string
113
+ required: true
114
+ predefined_values: # 预设值,不是封闭枚举
115
+ - human # 真人用户
116
+ - agent # AI 助手
117
+ - group # 群组
118
+ allow_extensions: true
119
+ description: "Agent 类型;允许使用未预设的扩展值"
107
120
 
108
121
  version:
109
122
  type: string
@@ -127,24 +140,36 @@ tags:
127
140
  description: "用于分类和检索"
128
141
  ```
129
142
 
130
- ## Agent Type 说明
131
-
132
- | Type | 用途 | 示例 |
133
- |------|------|------|
134
- | `human` | 真人用户 | 开发者、管理员、终端用户 |
135
- | `assistant` | 通用对话助手 | 聊天机器人、客服 |
136
- | `avatar` | 用户分身 | 代表用户行动的 agent |
137
- | `openclaw` | OpenClaw AI 助手 | 本地个人助手、ACP 桥接 |
138
- | `codeagent` | 代码编程 Agent | Claude Code、Cursor Agent |
143
+ ## Agent Type 说明
144
+
145
+ `type` 是可扩展字符串。下表只定义当前预设值;解析方必须保留并容忍未知类型,不得因其不在预设列表中拒绝 agent.md。
146
+
147
+ | 预设 Type | 用途 | 示例 |
148
+ |------|------|------|
149
+ | `human` | 真人用户 | 开发者、管理员、终端用户 |
150
+ | `agent` | 通用 Agent | 对话助手、代码 Agent、自动化 Agent |
151
+ | `group` | 群组身份 | 项目团队、协作群组 |
139
152
 
140
153
  ## 示例文件
141
154
 
142
- | 文件 | Type | AID | 说明 |
143
- |------|------|-----|------|
144
- | [human-developer.md](examples/human-developer.md) | `human` | `zhangsan.aid.pub` | 全栈开发者 |
145
- | [openclaw-lobster.md](examples/openclaw-lobster.md) | `openclaw` | `lobster.aid.pub` | OpenClaw AI 助手(无签名) |
146
- | [signed-openclaw-lobster.md](examples/signed-openclaw-lobster.md) | `openclaw` | `lobster.aid.pub` | OpenClaw AI 助手(带签名) |
147
- | [codeagent-claudecode.md](examples/codeagent-claudecode.md) | `codeagent` | `claudecode.aid.pub` | Claude Code 编程助手 |
155
+ | 文件 | Type | AID | 说明 |
156
+ |------|------|-----|------|
157
+ | [human-developer.md](examples/human-developer.md) | `human` | `zhangsan.aid.pub` | 全栈开发者 |
158
+ | [openclaw-lobster.md](examples/openclaw-lobster.md) | `agent` | `lobster.aid.pub` | OpenClaw AI 助手(无签名) |
159
+ | [signed-openclaw-lobster.md](examples/signed-openclaw-lobster.md) | `agent` | `lobster.aid.pub` | OpenClaw AI 助手(带签名) |
160
+ | [codeagent-claudecode.md](examples/codeagent-claudecode.md) | `agent` | `claudecode.aid.pub` | Claude Code 编程助手 |
161
+ | [群组-开发团队.md](examples/群组-开发团队.md) | `group` | `dev-team.aid.pub` | 开发团队协作群组 |
162
+
163
+ 表中无签名文件仅用于展示 payload 格式,不符合 `PUT /agent.md` 接收契约;静态签名示例也不代表可由线上 CA 验证的有效身份材料。
164
+
165
+ ## `PUT /agent.md` 接收顺序
166
+
167
+ 1. SDK 在联网前校验 UTF-8、payload 大小、frontmatter Schema;失败时不得签名或发起 HTTP 请求。
168
+ 2. SDK 使用当前 AID 的签名私钥追加签名块,再执行一次完整 Schema 校验和本地验签;失败时不得上传。
169
+ 3. Name Service 完成 Bearer Token 与 Host 绑定校验、完整 Schema 校验、CA 证书查询和验签。
170
+ 4. 只有全部校验成功后,Name Service 才能写入数据库并失效缓存。
171
+
172
+ 接收失败使用稳定的机器可读错误:格式或签名无效返回 `400 invalid_agent_md`,payload 超限返回 `413 agent_md_too_large`,CA 不可用返回 `503 certificate_verification_unavailable`,数据库不可用返回 `503 database_unavailable`。
148
173
 
149
174
  ## Markdown 部分建议内容
150
175
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  aid: "claudecode.aid.pub"
3
3
  name: "Claude Code"
4
- type: "codeagent"
4
+ type: "agent"
5
5
  version: "1.0.0"
6
6
  description: "Anthropic 官方代码助手,终端内的 AI 编程伙伴"
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  aid: "lobster.aid.pub"
3
3
  name: "Lobster"
4
- type: "openclaw"
4
+ type: "agent"
5
5
  version: "1.0.0"
6
6
  description: "OpenClaw 个人 AI 助手,支持 ACP 协议通信"
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  aid: "lobster.aid.pub"
3
3
  name: "Lobster"
4
- type: "openclaw"
4
+ type: "agent"
5
5
  version: "1.0.0"
6
6
  description: "OpenClaw 个人 AI 助手,支持 ACP 协议通信"
7
7
 
@@ -0,0 +1,366 @@
1
+ # AUN 服务 Go 化重构精细化源码审查与修复结论
2
+
3
+ > 初始审查日期:2026-07-18
4
+ > 修复复审日期:2026-07-19
5
+ > 审查对象:当前工作树中的 10 个 Go 化 AUN 服务及对应 Python 实现
6
+ > 服务范围:`auth`、`ca`、`gateway`、`group`、`leaderboard`、`message`、`nameservice`、`service_proxy`、`storage`、`stream`
7
+ > 基线:`ce56814a110e07497c7ee393b4673c1068badcc5` 加本轮工作树修复
8
+ > 测试约束:Go 只在 Docker/Linux 中编译和测试,未使用宿主机 Go 或 Windows 可执行文件
9
+
10
+ ## 1. 最终结论
11
+
12
+ 本报告初审和对 Claude Code 报告的复审中,能够由当前源码确认的安全、并发、性能、功能和字段级差异均已完成源码修复或被证实为误报。对本报告列出的已知问题,当前开放状态为:
13
+
14
+ | 严重度 | 修复前代表问题 | 当前开放数 |
15
+ | --- | --- | ---: |
16
+ | P0 | 短 SHA panic、签名 canonicalization 阻断、audit wrap 绕过 | 0 |
17
+ | P1 | 鉴权绕过、数据一致性、死锁/竞态、关键功能和破坏性字段 gap | 0 |
18
+ | P2 | 默认值、错误码、附加/缺失字段、资源边界和极端输入差异 | 0 |
19
+
20
+ 最终判定:
21
+
22
+ 1. 在已审查的调用链、功能和 RPC/request/response/event 字段范围内,未发现仍可由当前源码确认的 Go/Python 破坏性 gap。
23
+ 2. 已发现的双版本共同缺陷也同时修复,未通过“与 Python 一致”保留 Python 侧已知错误。
24
+ 3. 十个 Go 服务均在 `golang:1.24-bookworm` 中通过全包 `go test -race`、`go vet` 和 `gofmt` 检查。
25
+ 4. 对应 Python 服务的 `codex-unit` 与服务根目录测试在 Linux 容器中合计通过 `2345` 条,没有跳过项。
26
+ 5. 本结论是源码审查和容器单元/组件测试结论,不等价于真实 MySQL、Redis、对象存储、单域和双域 federation 的运行证明。按照工程规则,本轮没有启动 Kite;动态 E2E 边界见第 8 节。
27
+
28
+ ## 2. 审查方法与调用链
29
+
30
+ 审查不以历史报告为事实来源。Claude Code 报告仅作为检查清单,每条结论重新回到当前 Go/Python 源码、生产 wiring 和测试验证。
31
+
32
+ 每个服务均按下列层次检查:
33
+
34
+ 1. 启动、配置、控制中心发现和 Gateway service-plane attach。
35
+ 2. HTTP/WS/JSON-RPC 入口、请求解析、身份注入、方法授权和 dispatcher。
36
+ 3. service、repository、DB/Redis、WAL、文件系统和外部 RPC。
37
+ 4. response、event、异步队列、重试、重连和关闭路径。
38
+ 5. request/response/event 的字段名、类型、null/空值、默认值、错误码和处理时点。
39
+ 6. goroutine/task、channel/queue、mutex、文件句柄、事务和网络超时边界。
40
+
41
+ | 服务 | 核心调用链 |
42
+ | --- | --- |
43
+ | Auth | `service.attach -> auth RPC -> CA/证书校验 -> token repository/fallback -> response` |
44
+ | CA | `service.attach -> issue/renew/rekey/revoke/CT -> issuer/repository -> response/event` |
45
+ | Gateway | `client/service WS -> auth/ACL/dispatcher -> local service/federation -> response/event fanout` |
46
+ | Group | `group RPC -> membership/E2EE/duty/Group FS -> store/WAL -> push/event` |
47
+ | Leaderboard | `ingest event -> pending journal -> batch aggregate -> metric repository -> query/status` |
48
+ | Message | `send/v2.send -> auth/rate/audit -> WAL/transaction -> inbox/push -> pull/ack/recall` |
49
+ | NameService | `HTTP/RPC -> name/Agent.md validation/repository/cache -> snapshot/proxy -> response` |
50
+ | Service Proxy | `public HTTP/WS -> route/wakeup -> provider tunnel/frame queue -> client response` |
51
+ | Storage | `RPC/data HTTP -> auth/ACL/mount/symlink -> repository/blob/collab -> event` |
52
+ | Stream | `create -> WS push -> history/puller queue -> SSE pull -> created/closed event` |
53
+
54
+ ## 3. Service By Service 修复结论
55
+
56
+ ### 3.1 Auth
57
+
58
+ - attach 握手失败时立即关闭局部 WebSocket,重试不再泄漏连接和文件描述符。
59
+ - Gateway business 连接关闭时先让最后一帧 handler 获得一次调度;Go attach 的 drain 先释放写锁再等待在途请求,消除同连接回调造成的互锁;draining 检查和 inflight admission 由同一把锁线性化,关闭后不会再放入新请求。
60
+ - `create_aid` 的 already-exists 恢复链可达;CA chain 失败采用与 Python 相同的降级语义。
61
+ - DB 健康时以 DB 为权威,不再让 JSONL fallback 遮蔽撤销状态;refresh consume 增加并发 fence。
62
+ - DB pool 增加连接数、空闲数和寿命边界。
63
+ - `auth.verify(method=aid)` 明确调用 `verifyAID`,不会额外签发 refresh token或触发续证。
64
+ - 登录证书比较、token prefix、identity 状态、renew/rekey 错误码和 response aliases 已与 Python 基准对齐;停止态统一返回 `-32020`。
65
+
66
+ 结论:Auth 已审查链路没有开放 gap。
67
+
68
+ ### 3.2 CA
69
+
70
+ - Dispatch 只在锁内获取不可变状态快照,不再持 `RLock` 跨 DB/Gateway I/O。
71
+ - Gateway business 连接关闭时先让最后一帧 handler 获得一次调度;Go attach 的 drain 锁顺序与 Auth 对齐,不再持锁等待在途回调,draining 与 inflight admission 同样线性化。
72
+ - P-384 CT 使用 SHA-384;CT canonical JSON、Unicode、浮点和微秒时间格式与 Python 对齐。
73
+ - renew/rekey 的 `key_purpose`、`aid_type`、chain 和证书字段语义统一。
74
+ - `get_cert` 的 lifecycle、curve、purpose、排序、CA 自身证书和历史十进制 serial fallback 对齐。
75
+ - verify-chain、generate-service-cert、revoke 幂等和 CRL 时间字段的错误/response 契约对齐。
76
+ - service signature 证书强制校验 NotBefore/NotAfter;CT signer 失败向上传播,不再生成空签名记录。
77
+ - service signature nonce 保持单次消费;Python/Go 重放表均使用锁保护、默认 100000 的硬容量和按过期时间有序的 FIFO,满时 fail-closed 且不驱逐未过期 nonce,正常消费摊还 O(1);测试签名器也改为每次生成唯一 nonce。
78
+
79
+ 结论:CA 已审查链路没有开放 gap。
80
+
81
+ ### 3.3 Gateway
82
+
83
+ - 客户端签名采用排序、紧凑、非 HTML 转义 canonical JSON,并兼容 Python legacy hash 规则。
84
+ - Python relay `Session` 补齐 `module_id`,StatsTap 不再因 `AttributeError` 静默丢弃 leaderboard ingest。
85
+ - service-plane 同时执行模块能力矩阵和 attach 声明方法 ACL;方法名大小写敏感,`collab` 只接受完整 `collab.*` 声明。
86
+ - stale attach、同 instance 接管和连接 ownership 使用实例身份校验,旧连接不能删除新连接。
87
+ - Kernel/event 队列改为有界、可唤醒、可配置的异步扇出;成功发送后才登记 dedup。
88
+ - Python StatsTap 修复错误 session 属性;Go StatsTap 测试不再并发替换全局 stdout,消除测试竞态。
89
+ - federation insecure 仅允许显式测试环境,生产 fail-closed;出站连接、connecting 状态和目标数均有上限及清理。
90
+ - discovery TTL/stale、canary、least-pending、attach weight 校验、nonce TTL和状态字段已统一。
91
+ - 在线 client signature 只接受当前 `active_signing` 生命周期证书;跨域按 AID 拉取对端当前证书,再对声明和实际指纹做常量时间比较,不能用 fingerprint 直接选中历史证书。
92
+
93
+ 结论:Gateway 已审查链路没有开放 gap。
94
+
95
+ ### 3.4 Group
96
+
97
+ - async dispatch、WAL batch appender 和 shutdown 的关闭顺序改为幂等、可取消,不再 send-on-closed、nil channel 阻塞或无限等待。
98
+ - `.group` baseline、protected 标记、owner/admin role ACL和 `baseline_role_acls_synced` 已对齐。
99
+ - ban/admin、邀请码消费回滚、aid_cert、transfer history和 rekey state-chain 已对齐;过期 owner transfer 同时校验 pending.old_owner 和当前 owner 仍为 actor,陈旧 pending 不能覆盖后来所有权。
100
+ - recall 默认窗口、重复 ID 事务语义、recent cache 清理和 fallback event 已对齐;Go production wiring 读取 `recall_window_seconds`,环境变量显式 `0` 可关闭窗口。
101
+ - `v2.pull` 可见性 floor、设备游标、`has_more`、ack 上界和 Redis highwater 采用 fail-closed/单调策略。
102
+ - `v2.pull` 的 legacy/plain 分支也执行与 Python `_member_can_receive_message` 等价的 join sequence、`min_read_epoch` 和成员可见性过滤。
103
+ - duty 副作用移到成员、ban、active 和限流校验之后;在线管理员按群实时解析。
104
+ - pull、pull_events、ack、state、invite、device、ban 等 response 补齐 `group_id`、`group_aid`、`cursor`、`e2ee_epoch_floor`;事件补齐 `group_aid`。
105
+ - `fs.namespace_ready` 等 Group FS 确认写入校验当前 `group_identity` 证书指纹,不能用历史或非当前群身份证书签名确认 namespace。
106
+ - `add_member` 及 open join、审批、邀请码等实际入群路径对本域 AID 执行 verified certificate 注册校验;缺失、过期或身份不匹配均 fail-closed,跨域保持 Python 的容错语义。
107
+ - checkpoint replace、RESP bulk read和 slot/device 隔离键处理已修复跨平台及短读边界。
108
+
109
+ 结论:Group 已审查链路没有开放 gap。
110
+
111
+ ### 3.5 Leaderboard
112
+
113
+ - ingest 使用真实内存聚合和批量提交,不再每个事件独立 insert/locking transaction。
114
+ - 增加周期 pending recovery loop,临时 DB 故障不必等进程重启。
115
+ - 实时 flush 和 recovery 均在事务内锁定并确认 event 状态;混合 processed/pending 快照不写入不可拆分的内存聚合,而从 durable `raw_json` 精确恢复,避免跨实例双计或永久卡住。
116
+ - event ID、agent、group 和 edge 均按稳定主键顺序加锁/写入;Go recovery 与实时批次共用排序,Python 失败标记也按 event ID 排序,消除多实例交叉锁死顺序。
117
+ - 已由其他实例处理的快照返回实际 applied 数,不再虚增 processed/flush 指标。
118
+ - agent/group/edge 水位按事件时间和 ID 单调推进,乱序旧事件不能回退最新水位。
119
+ - attach dispatch worker 可取消,避免连接级队头阻塞和关闭泄漏。
120
+ - status/health 不再对全部 pending payload 做 O(N) JSON decode;DB 探测和恢复边界收口。
121
+
122
+ 结论:Leaderboard 已审查链路没有开放 gap。
123
+
124
+ ### 3.6 Message
125
+
126
+ - Gateway pending response、断线清理和 fatal wakeup 改为锁外非阻塞通知,消除满 channel 持锁死锁。
127
+ - WAL fsync/rotate 串行化;soft/hard latency backpressure、fatal 唤醒和 checkpoint 行为对齐。
128
+ - 有事务执行器时,多设备 legacy 写入的查询、序号分配和写入位于同一事务;非事务 executor 明确为受控降级。
129
+ - `v2.send` 强制 audit wrap,设备 wrap 只要求当前活跃目标,不错误拒绝历史 wrap。
130
+ - pull/ack 的 device/slot 严格绑定认证上下文;recent cache 使用真实 KnownMaxSeq。
131
+ - 普通 send 的 protected headers、headers、context和 client signature 进入 envelope;跨域 metadata 同样保留。
132
+ - recall TTL 由服务端策略计算,成功和无 tombstone 路径都发布对齐事件。
133
+ - pending rate limit 已接真实 Gateway attach `PendingCount`;legacy/V2 send 均在背压时原子预占,无背压成功后也记录窗口,不再由 WAL 状态误判或让 V2 绕过;push worker 增加 wakeup,并对齐 EMA、重试优先级和队列 floor。
134
+ - Redis sequence allocator 只在 pair 首次使用或 Redis key 被驱逐时回查 durable floor,后续号段分配不再每个 block 往返 MySQL。
135
+ - WAL 开关读取 `message_config.json` 的 `wal_enabled`;仅非空 `AUN_MESSAGE_WAL_ENABLED` 覆盖配置,显式 `0` 可关闭,空值回退配置,与 Python 优先级一致。
136
+
137
+ 结论:Message 已审查链路没有开放 gap。
138
+
139
+ ### 3.7 NameService
140
+
141
+ - host-root reverse proxy 增加完整 header/body/upstream timeout。
142
+ - Agent.md 仅经 `PUT /agent.md` 完成严格校验后写入 DB 并更新缓存;DB 故障 GET/PUT 分别返回对齐的服务错误,不使用文件镜像降级。
143
+ - snapshot 和 Agent.md 覆盖替换使用平台实现;Linux 使用原子 rename,Windows 使用 replace 语义。
144
+ - snapshot 全量按 `aid`、增量按 `(updated_at, aid)` 做 keyset 分页,避免 OFFSET 漂移和大表退化。
145
+ - cache、证书缓存和 runtime reconnect 竞态已收口;proxy diagnostics 使用可注入时钟,补齐 `connection_id` trace/filter、稳定排序和汇总,host-root 事件也进入诊断,URL 敏感参数统一脱敏。
146
+ - Python `/health` 补齐 `database_ready`,Go/Python 状态字段和 redirect 语义对齐。
147
+ - Python `_init_db()` 增加幂等保护,ASGI startup 不会用未连接实例覆盖测试或生产 wiring 已注入、已连接的 DB。
148
+
149
+ 结论:NameService 已审查链路没有开放 gap。
150
+
151
+ ### 3.8 Service Proxy
152
+
153
+ - provider frame queue 同时限制条数和字节;超限在单 queue 锁内原子注入 request-scoped terminal frame,只终止对应请求,不再断开 provider 并连带失败其他 HTTP/WS 请求。
154
+ - HTTP request body、response header/body和 WS frame 都有 deadline/size 边界;provider HTTP status 与 WS close code 在两种实现中均先校验,Python 接受合法私有区间 `4000..4999`。
155
+ - `lastWakeup` 增加 TTL和容量清理;provider services 读写统一加锁。
156
+ - host-root routing 字符集、private client allowlist和 loopback 规则对齐。
157
+ - wakeup event 补齐 `request_id`、`trace_id`、`_trace`;诊断字段执行白名单。
158
+ - 生命周期、Gateway RPC timeout和 provider 断开清理均可取消。
159
+
160
+ 结论:Service Proxy 已审查链路没有开放 gap。
161
+
162
+ ### 3.9 Storage
163
+
164
+ - `complete_upload(skip_blob=true)` 在构造 CAS key 前验证 64 位十六进制 SHA-256,短值不能 panic。
165
+ - share Bearer 必须经 verifier 解析为 AID;空 `allowed_aids` 被拒绝,owner 访问不误消费无关 token。
166
+ - 群 public/private 读取都验证实时 membership;群自有区写入已接当前 `group_identity` 指纹验证。
167
+ - 系统路径、memberdata、ACL/token、legacy move/delete、symlink repoint和 collab target 统一执行 owner/root 守卫。
168
+ - mount lease 保存 requester;锁前执行 `epoch -> fresh membership -> epoch`,锁内复核本地 mount/volume epoch,且不持 DB 锁跨 Gateway RPC。
169
+ - LocalFS 下载流式处理 Range;stable URL resolver 已接生产 wiring;resolver 热切换使用同步保护。
170
+ - cleanup 接入磁盘阈值,补删除事件/副作用;legacy 缺 SHA 对象也清理物理 blob。
171
+ - collab diff 输出合法 unified diff,show/merge/restore 统一守卫并记录 error audit。
172
+ - 群 collab root 的 authority/group identity 可按 Python 语义绕过不存在的 self-membership 行;普通请求者仍要求实时 membership。
173
+ - `collab.set_acl/remove_acl` 仅由解析后的 storage owner 管理,不再额外要求该 owner 当前仍是群成员。
174
+ - console owner limit 与 Python 对齐为 500,default bucket 按最近更新时间选择。
175
+
176
+ 结论:Storage 已审查链路没有开放 gap。跨服务撤权语义为:通过 preflight 的在途请求允许完成,撤权后的新请求被拒绝;不宣称跨服务事务可取消已提交写入。
177
+
178
+ ### 3.10 Stream
179
+
180
+ - history 和每个 puller queue 都有总字节预算,超限行为可预测。
181
+ - Gateway business 断连清理先让已接收的最后一帧获得一次调度,再取消未完成 task,避免合法 `get_info` 等请求被静默丢弃。
182
+ - SSE history/live 交界按 seq 去重,同一 chunk 不重复交付。
183
+ - 自动 seq 在 MaxInt64 前拒绝溢出。
184
+ - metadata 使用紧凑 JSON 字节数计限并做嵌套深拷贝,调用方后续修改不会并发污染 stream 状态;空 `content_type` 和 nullable `target_aid` 与 Python 对齐。
185
+ - completed retention 默认值和配置语义对齐;活跃 puller/每次输出都会 touch,idle cleanup 不会误关慢消费者。
186
+
187
+ 结论:Stream 已审查链路没有开放 gap。
188
+
189
+ ## 4. RPC 字段级对齐结果
190
+
191
+ 下表列出本轮发生过破坏性差异的主要字段。字段“已对齐”表示请求接受范围、response/event 字段及默认/null 语义已按 Python 基准修复;诊断性附加字段仅在不破坏调用方时保留。
192
+
193
+ | 服务/接口 | Request 对齐 | Response 对齐 | Event 对齐 |
194
+ | --- | --- | --- | --- |
195
+ | Auth create/renew/rekey/verify | method、purpose、证书和 fallback 语义 | `created`、`cert`、`cert_sn/serial`、chain、token prefix、错误码 | token/证书状态不再因 fallback 产生陈旧结果 |
196
+ | CA cert/CT/revoke | curve、purpose、lifecycle、serial、canonical hash | `aid_type`、`key_purpose`、chain、时间和 found/null | CT/SCT 输入、撤销事件时间一致 |
197
+ | Gateway attach/client RPC | namespace/method、weight、nonce、签名 hash | stale instance、状态/统计字段一致 | dispatch trace、dedup、超时和重试一致 |
198
+ | Group pull/admin/state | device metadata、recall、invite、ack floor | `group_id`、`group_aid`、`cursor`、`has_more`、`e2ee_epoch_floor` | message/state/recall/membership 事件补齐群标识 |
199
+ | Leaderboard ingest/status | 批量 ingest 和事件时间 | processed/queued、水位和 backlog 语义一致 | 乱序事件不回退水位 |
200
+ | Message send/pull/ack/recall | auth device/slot、audit wrap、metadata、TTL | ack/count/floor 和错误码一致 | envelope metadata、recall 和跨域字段一致 |
201
+ | NameService Agent.md/health | DB 故障、keyset cursor、redirect | HTTP 状态、`database_ready`、缓存状态一致 | snapshot/诊断不暴露敏感值 |
202
+ | Service Proxy route/wakeup | service 名、allowlist、body/frame 限制 | timeout、断开和错误语义一致 | `request_id`、`trace_id`、`_trace` 补齐 |
203
+ | Storage upload/share/fs/collab | SHA、Bearer、membership、lease、target | stable URL、Range、console limit/default、delete 字段 | object delete、collab error和 volume 通知一致 |
204
+ | Stream create/push/pull | metadata 字节、content type、seq | retention、queue overflow和 pull cursor 一致 | nullable target、created/closed 字段一致 |
205
+
206
+ ## 5. 安全、并发与性能闭合
207
+
208
+ | 风险簇 | 修复结果 |
209
+ | --- | --- |
210
+ | 远程 panic | Storage SHA 在切片前完成长度和 hex 校验,并有回归测试 |
211
+ | 鉴权/授权 | Gateway service-plane ACL、Storage share/group/collab、Message audit、Group 本域入群证书、CA service signature 均 fail-closed |
212
+ | 重放/签名 | canonical JSON 跨语言一致;nonce 单次消费、有 TTL、硬容量和摊还 O(1) FIFO 清理,容量洪泛不能驱逐未过期记录 |
213
+ | 死锁/永久阻塞 | Gateway/Message pending、Group dispatch/WAL、可取消 attach worker 均使用锁外通知和幂等关闭;Leaderboard 跨实例事务按稳定主键顺序加锁 |
214
+ | 数据竞态 | resolver、provider map、StatsTap、缓存和 ownership 热切换均已同步;十服务 `-race` 通过 |
215
+ | 事务/一致性 | Message 多设备事务、Storage lease epoch、Group cursor/highwater、Leaderboard event 状态/水位均保证单调或 fail-closed,跨实例 recovery 不双计 |
216
+ | 内存/队列 | Gateway event、Proxy frame、Stream history/puller、CA nonce 和 federation 连接均有条数/字节/并发上限 |
217
+ | 慢连接 | HTTP body/header、WS frame、Gateway fanout和 service RPC 均有 deadline/cancel |
218
+ | 大表性能 | NameService keyset pagination、Leaderboard batch、Storage streaming Range和 status O(1) 路径已落地 |
219
+ | 文件可靠性 | WAL fsync/rotate、snapshot replace、cleanup 和 legacy blob 删除边界已修复;Agent.md 不使用文件副本 |
220
+
221
+ 当前源码未见新的锁顺序环、持锁网络 I/O、send-on-closed-channel 或无界外部输入队列。
222
+
223
+ ## 6. 历史结论与 Claude Code 报告复审
224
+
225
+ ### 6.1 本报告原问题编号
226
+
227
+ | 服务 | 原编号 | 当前状态 |
228
+ | --- | --- | --- |
229
+ | Auth | AUTH-1..5 | 全部修复 |
230
+ | CA | CA-1..4 | 全部修复 |
231
+ | Gateway | GATEWAY-1、REVIEW-P0-1 | 全部修复 |
232
+ | Group | GROUP-1..11 | 全部修复或由更严格生产 wiring 消除条件 |
233
+ | Leaderboard | LEADERBOARD-1..6 | 源码缺陷全部修复;真实 DB failover 仍属动态验证 |
234
+ | Message | MESSAGE-1..6、REVIEW-P0-2 | 全部修复 |
235
+ | NameService | NAMESERVICE-1..4 | 全部修复 |
236
+ | Service Proxy | SERVICE-PROXY-1..6 | 全部修复 |
237
+ | Storage | STORAGE-1..8、REVIEW-P1-01 | 全部修复 |
238
+ | Stream | STREAM-1..4 | Go/Python 共同缺陷同步修复 |
239
+
240
+ ### 6.2 Claude 60 条已确认项
241
+
242
+ Claude 原统计为 P0×3、P1×31、P2×26。重新读源码后的修复前判断是:
243
+
244
+ - 59 条事实有效:原 P0 #3 因有“已持群身份”前提降为 P1,但仍需修复。
245
+ - 1 条已经过时:原 P1 #4 `auth.verify(method=aid)` 在复审前已改走 `verifyAID`。
246
+ - 59 条有效问题现在均已关闭;过时项继续不计缺陷。
247
+ - Claude 自行驳回的 4 条经复审仍为误报,不因本轮修复重新计数。
248
+
249
+ 其中 P2 F01-F24、F26 的破坏性接受范围、字段或资源差异均已修复;F25 是 Go 可配置 retention 的附加能力,默认行为已经对齐,不构成兼容 bug。
250
+
251
+ ### 6.3 Claude 76 条候选
252
+
253
+ 修复前逐条复审统计经本轮源码再核修正为:4 条上调 P1、58 条确认/条件性 P2、6 条并入已存在根因、7 条驳回或不构成 bug、1 条待动态验证。此前草稿将 C71、C72 列为驳回,属于分类错误。
254
+
255
+ 当前处理结果:
256
+
257
+ | 类别 | 编号/数量 | 当前状态 |
258
+ | --- | --- | --- |
259
+ | 上调 P1 | C26、C27、C48、C74 | federation、highwater、collab guard 已修复 |
260
+ | 确认/条件性 P2 | 58 条(含 C71、C72) | 可操作源码差异已修复;C64 Redis 号段仅首次/驱逐时回查 durable floor,C71 群 collab-root authority 和 C72 ACL mutation 额外成员门槛均已按 Python 语义修复 |
261
+ | 合并根因 | C10、C14、C31、C42、C50、C53 | 对应 CT、签名、Group 字段、Leaderboard batch、Message rate limit 根因已修复 |
262
+ | 驳回/非 bug | C01、C02、C20、C41、C49、C61、C76 | 维持驳回,不计修复数 |
263
+ | 原待动态 C70 | Windows replace | 已实现平台专用 replace;服务端目标为 Linux,本轮未运行 Windows 服务 |
264
+
265
+ 因此,Claude 的“60 条确认 + 76 条候选”没有作为数量直接叠加;合并项、误报、过时项和同根因只处理一次。当前没有从该清单遗留的已知源码缺陷。
266
+
267
+ ### 6.4 修复过程中新增发现
268
+
269
+ 修复时额外发现并关闭:
270
+
271
+ - Gateway StatsTap 测试并发替换 `os.Stdout` 的 race。
272
+ - Gateway attach 方法声明大小写和 `collab.*` 完整方法名边界。
273
+ - NameService OFFSET 分页在并发更新下跳行/重复及大表退化。
274
+ - NameService ASGI startup 重复初始化覆盖已注入 DB 的生命周期缺陷。
275
+ - Storage mount membership 检查持 DB 锁跨 Gateway RPC 的潜在锁放大。
276
+ - Storage console default bucket 与 Python“最近更新”语义不一致。
277
+ - CA 测试签名器固定 nonce 与生产重放保护冲突。
278
+ - Python Gateway 旧测试未声明新增的 service-plane 能力。
279
+ - Message WAL 开关忽略 `message_config.json`,只读取环境变量。
280
+ - Group 实际入群路径缺少 Python 已有的本域 AID CA 注册校验。
281
+ - Gateway federation batch/event fanout 先为每个输入创建 task/goroutine、再进入 semaphore,16 MiB 帧内突发小请求仍可耗尽调度器;两端改为固定 worker 分片并保持结果顺序。
282
+ - Gateway Python rate/diagnostic/federation 动态 map 只有时间清理没有硬 key 上限;补充容量上限、TTL 淘汰和 `_other` 聚合,Go/Python 统计字段保持兼容。
283
+ - Message Kernel 入站 `system.require_init` 与 observed event 原先脱离连接级任务预算;补充去重、任务集合、预算丢弃和断开/关闭等待回收。
284
+ - Service Proxy Python 对未知 provider `request_id` 会新建 pending stream queue;改为仅接受已登记且未完成的请求,并限频记录丢弃。
285
+ - Storage S3/OSS/COS 在安全读取上限之后才构造 Range,可能仍向后端请求超大范围;改为先 clamp、校验整数溢出和 nil body,再读取有界内容。
286
+ - Auth、Storage 及其他服务的随机 ID/nonce 生成路径曾忽略熵源失败的安全边界;统一采用可检查的 `io.ReadFull` 和 fail-closed/唯一性回退,并补故障测试。
287
+ - Auth/CA/Gateway/Message/Service Proxy/Stream 的 WebSocket 入站帧缺少统一上限;按 Python 语义补充 16 MiB(Stream 数据面保留 64 MiB)限制。
288
+ - Auth/CA/Stream/Gateway Python business/service-plane 关闭路径存在最后一帧 task 竞态;统一增加一次事件循环让渡并补回归测试。
289
+ - Auth/CA Go gatewayattach 的 drain 曾持写锁等待在途请求,而在途 handler 可能反向调用同连接 `Call`;改为锁外等待并加入同连接回调死锁测试。
290
+ - Gateway Python `Session.module_id` 缺失会使 StatsTap 记录异常被吞;补齐字段、边界测试和事件计数回归。
291
+ - Gateway Python `entry.py` 消息循环存在一处不可编译的缩进;已按事件/RPC 分支恢复正确层级,并通过十服务 `compileall`。
292
+ - 上述 Python 关闭让渡在外层取消时会先回收已创建 task 再传播 `CancelledError`,避免修复断连竞态后留下后台 task。
293
+ - Auth/CA Go attach 的 draining 检查与 inflight 增量之间仍有 admission 窗口;改为同锁线性化,drain 开始后不再接纳新请求。
294
+ - CA service signature 证书曾缺 NotBefore/NotAfter 校验,nonce 表只有 TTL 且每次全表扫描;两种实现同步补证书有效期、并发保护、硬容量和有序过期队列。
295
+ - Gateway Go 跨域在线签名 resolver 曾按调用方 fingerprint 拉取历史证书;改为拉取对端当前证书后再比较实际指纹。
296
+ - Group 过期 owner transfer 只检查 actor、未确认 pending.old_owner 与当前 owner;Go recall window 也未接 production 配置,均已修复。
297
+ - Leaderboard 多实例实时 flush/recovery 曾可能双计、卡住混合状态批次或以不同 metric row 顺序形成数据库死锁;两种实现统一状态锁、durable recovery 和稳定锁顺序。
298
+ - Message pending rate limit 曾错误依赖 WAL 且 V2 路径可绕过;改为读取 Gateway attach pending,并统一 legacy/V2 预占和成功记账。
299
+ - Service Proxy frame queue 溢出曾断开整个 provider;改为 request-scoped 终止,并补 provider HTTP status/WS close code 输入校验。
300
+ - Stream metadata 只复制顶层 map,调用方修改嵌套值可与服务读并发;改为深拷贝隔离,并由 `codex-unit/stream/test_stream_entry.py::test_stream_session_metadata_isolated_from_callers_and_info_consumers` 覆盖构造入参和 `to_info()` 返回值的嵌套 mutation。
301
+
302
+ 这些问题均已修复并纳入容器回归。
303
+
304
+ ## 7. Docker/Linux 验证证据
305
+
306
+ ### 7.1 Go
307
+
308
+ 环境:
309
+
310
+ - 镜像:`golang:1.24-bookworm`
311
+ - 源码:只挂载工作树
312
+ - module cache:`C:\go\pkg\mod -> /go/pkg/mod:ro`
313
+ - `GOPROXY=off`、`GOTOOLCHAIN=local`
314
+ - 未调用宿主机 `go`,未生成或运行 Windows exe
315
+
316
+ 对以下十个服务逐一执行:
317
+
318
+ ```text
319
+ go test -race ./... -count=1 -timeout=300s # 大包使用 600s 上限
320
+ go vet ./...
321
+ gofmt -l .
322
+ ```
323
+
324
+ 结果:Auth、CA、Gateway、Group、Leaderboard、Message、NameService、Service Proxy、Storage、Stream 全部退出码 0;`gofmt -l` 无输出。
325
+
326
+ ### 7.2 Python
327
+
328
+ 环境:`aun-sdk-tester:latest` Linux Python 测试容器;临时测试容器内安装 `asyncmy`、`aiomysql` 和 `fakeredis`。`codex-unit` 与存在测试的服务根目录分别使用独立 pytest 进程;服务根目录套件通过容器 `--network host` 连接测试 MySQL。此隔离避免不同服务的同名 `tests.conftest` 和进程级 nonce/cache 相互污染。
329
+
330
+ | 服务 | `codex-unit` passed | 服务根目录 passed | 合计 passed | skipped |
331
+ | --- | ---: | ---: | ---: | ---: |
332
+ | Auth | 64 | - | 64 | 0 |
333
+ | CA | 66 | 29 | 95 | 0 |
334
+ | Gateway | 270 | 61 | 331 | 0 |
335
+ | Group | 275 | 434 | 709 | 0 |
336
+ | Leaderboard | 19 | 2 | 21 | 0 |
337
+ | Message | 133 | 270 | 403 | 0 |
338
+ | NameService | 89 | - | 89 | 0 |
339
+ | Service Proxy | 123 | - | 123 | 0 |
340
+ | Storage | 150 | 225 | 375 | 0 |
341
+ | Stream | 50 | 85 | 135 | 0 |
342
+ | 合计 | **1239** | **1106** | **2345** | **0** |
343
+
344
+ 十服务 `compileall` 同样在该 Linux 容器中通过,本轮没有 skip。FastAPI/Starlette/aiohttp 和 `datetime.utcnow()` deprecation warning 不影响本轮断言,但应在依赖升级任务中单独处理。Message 根目录套件首次启动时 Python 3.13 在 `pytest_asyncio` collection 内发生一次原生段错误,业务测试尚未执行;随后两个全新 pytest 进程均为 `270 passed`,表中只计一轮,保留为测试运行器/依赖稳定性风险而非服务断言失败。
345
+
346
+ ## 8. 动态验证边界
347
+
348
+ 以下不是当前已确认 bug,而是源码和隔离测试无法证明的运行边界:
349
+
350
+ 1. 真实 MySQL/Redis 故障、重连、主从切换和长事务下的时序。
351
+ 2. 单域/双域 federation 的真实证书、DNS、连接池和断网恢复。
352
+ 3. S3/OSS、大文件 Range、磁盘水位和长时间 cleanup。
353
+ 4. Python/Go 混合服务逐 RPC 的在线 golden capture。
354
+ 5. 高并发撤权与跨服务在途请求的实际线性化窗口。
355
+
356
+ 工程规则禁止本轮直接启动 Kite,因此没有运行需要重建并启动完整服务编排的集成/E2E。发布前应由用户按 Docker 测试指南重建服务镜像并执行单域、双域和故障注入;失败应作为新的运行证据回到对应调用链,而不回退本报告已经由源码和 race 测试闭合的结论。
357
+
358
+ ## 9. 最终判定
359
+
360
+ 截至 2026-07-19 当前工作树:
361
+
362
+ - 本报告和 Claude Code 清单中成立的已知源码 gap/bug 已全部修复。
363
+ - 当前开放 P0/P1/P2 为 `0/0/0`。
364
+ - Go 与 Python 在已审查接口和默认行为上达到源码级等价。
365
+ - Go 十服务已满足 Docker/Linux 单元、竞态、vet 和格式化门槛;Python 对应测试全部通过。
366
+ - 是否允许生产全量切换,最后仍取决于第 8 节的真实 Docker Compose 单域/双域 E2E,而不是继续保留已经修复的静态缺陷。