@agentunion/fastaun-browser 0.5.4 → 0.5.6
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.
- package/CHANGELOG.md +130 -94
- 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
- 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
- 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
- package/_packed_docs/CHANGELOG.md +130 -94
- package/_packed_docs/INDEX.md +127 -69
- package/_packed_docs/KITE_DOCS_GUIDE.md +63 -29
- 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
- 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 +227 -0
- 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 +1004 -0
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +999 -0
- package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +6 -4
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +58 -20
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +219 -247
- package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +14 -14
- package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +3 -3
- 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
- package/_packed_docs/protocol/README.md +1 -0
- package/_packed_docs/protocol/aun-docs-guide.md +7 -4
- package/_packed_docs/protocol/index.md +25 -19
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +62 -17
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +22 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +67 -78
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +6 -2
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +50 -14
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +18 -5
- package/_packed_docs/sdk/09-group-rpc-manual.md +312 -282
- package/_packed_docs/sdk/09-message-rpc-manual.md +142 -103
- package/_packed_docs/sdk/09-payload-reference.md +1 -1
- package/_packed_docs/sdk/09-stream-rpc-manual.md +8 -8
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +26 -17
- package/_packed_docs/sdk/INDEX.md +42 -34
- package/_packed_docs/sdk/README.md +7 -6
- 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
- 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
- package/dist/agent-md.d.ts +4 -5
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +66 -43
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +2 -6
- package/dist/aid-store.d.ts.map +1 -1
- package/dist/aid-store.js +20 -14
- package/dist/aid-store.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +30 -11
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +3297 -1023
- package/dist/client/delivery.d.ts +75 -8
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +1419 -245
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.d.ts.map +1 -1
- package/dist/client/group-state.js +27 -24
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/lifecycle.d.ts.map +1 -1
- package/dist/client/lifecycle.js +48 -4
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/mention-mode.d.ts +7 -0
- package/dist/client/mention-mode.d.ts.map +1 -0
- package/dist/client/mention-mode.js +184 -0
- package/dist/client/mention-mode.js.map +1 -0
- package/dist/client/peers.d.ts +1 -1
- package/dist/client/peers.d.ts.map +1 -1
- package/dist/client/peers.js +26 -3
- package/dist/client/peers.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +22 -1
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +309 -74
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +25 -2
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +606 -97
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +24 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +404 -215
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -1
- package/dist/errors.js.map +1 -1
- package/dist/facades.d.ts +3 -0
- package/dist/facades.d.ts.map +1 -1
- package/dist/facades.js +91 -53
- package/dist/facades.js.map +1 -1
- package/dist/group-index.d.ts +6 -1
- package/dist/group-index.d.ts.map +1 -1
- package/dist/group-index.js +44 -25
- package/dist/group-index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/keystore/index.d.ts +10 -5
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.d.ts +0 -12
- package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.js +0 -60
- package/dist/keystore/indexeddb-identity-store.js.map +1 -1
- package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.js +9 -5
- package/dist/keystore/indexeddb-shared.js.map +1 -1
- package/dist/keystore/indexeddb-token-store.d.ts +3 -1
- package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-token-store.js +47 -2
- package/dist/keystore/indexeddb-token-store.js.map +1 -1
- package/dist/register-flow.d.ts.map +1 -1
- package/dist/register-flow.js +28 -3
- package/dist/register-flow.js.map +1 -1
- package/dist/seq-tracker.d.ts +28 -8
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +218 -61
- package/dist/seq-tracker.js.map +1 -1
- package/dist/storage/vfs.d.ts +1 -0
- package/dist/storage/vfs.d.ts.map +1 -1
- package/dist/storage/vfs.js +26 -2
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.js +376 -10
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +12 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +218 -101
- package/dist/transport.js.map +1 -1
- package/dist/v2/session/session.d.ts.map +1 -1
- package/dist/v2/session/session.js +3 -4
- package/dist/v2/session/session.js.map +1 -1
- package/dist/v2/state/commitment.d.ts.map +1 -1
- package/dist/v2/state/commitment.js +1 -2
- package/dist/v2/state/commitment.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -5
- package/dist/group-resources.d.ts +0 -98
- package/dist/group-resources.d.ts.map +0 -1
- package/dist/group-resources.js +0 -635
- package/dist/group-resources.js.map +0 -1
- package/dist/keystore/indexeddb.d.ts +0 -179
- package/dist/keystore/indexeddb.d.ts.map +0 -1
- package/dist/keystore/indexeddb.js +0 -2031
- package/dist/keystore/indexeddb.js.map +0 -1
- package/dist/namespaces/auth.d.ts +0 -98
- package/dist/namespaces/auth.d.ts.map +0 -1
- package/dist/namespaces/auth.js +0 -992
- package/dist/namespaces/auth.js.map +0 -1
- package/dist/namespaces/custody.d.ts +0 -51
- package/dist/namespaces/custody.d.ts.map +0 -1
- package/dist/namespaces/custody.js +0 -302
- package/dist/namespaces/custody.js.map +0 -1
- package/dist/namespaces/meta.d.ts +0 -109
- package/dist/namespaces/meta.d.ts.map +0 -1
- package/dist/namespaces/meta.js +0 -549
- package/dist/namespaces/meta.js.map +0 -1
|
@@ -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 repository/cache/mirror -> 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 DB/cache/mirror 更新采用可恢复顺序;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/Agent.md replace、cleanup和 legacy blob 删除边界已修复 |
|
|
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,而不是继续保留已经修复的静态缺陷。
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# AUN 公网测试运行指南
|
|
2
|
+
|
|
3
|
+
本文说明如何对 `evolagent.cn`、`agentid.pub` 或同拓扑的其他公网 issuer domain 运行 Python SDK integration/E2E。公网测试与本地 Docker 单域、分布式 `data-dist` 完全分离,不复用其身份、临时文件或报告目录。
|
|
4
|
+
|
|
5
|
+
## 1. 测试入口与边界
|
|
6
|
+
|
|
7
|
+
Python SDK 公网入口:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
python/run-public-tests.py
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
它只编排可通过公网协议完成的 SDK 用例,不读取服务端 MySQL/Redis,不操作 Docker 网络,也不重启远端服务。公网 `full` 覆盖 50 个去重后的 integration/E2E,用例按顺序逐个在独立子进程中运行。
|
|
14
|
+
|
|
15
|
+
服务端主要模块的公网验收入口另为:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
../docker-deploy/tests/public_single_instance_acceptance.py
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
该脚本补充 AUN Console、Leaderboard、AID Custody、服务注册状态和端口/TLS 等服务端检查。它与 SDK runner 不是重复关系,完整验收时应先跑服务端验收,再跑 SDK `smoke` 或 `full`。
|
|
22
|
+
|
|
23
|
+
## 2. 数据隔离
|
|
24
|
+
|
|
25
|
+
SDK runner 默认只使用仓库下的 `.public-test-data/`:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
.public-test-data/
|
|
29
|
+
├── identities/<domain>/<identity-prefix>/
|
|
30
|
+
│ ├── persistent/
|
|
31
|
+
│ └── service-proxy-provider/
|
|
32
|
+
└── runs/<domain>/<run-id>/
|
|
33
|
+
├── logs/
|
|
34
|
+
├── artifacts/
|
|
35
|
+
├── tmp/
|
|
36
|
+
├── home/
|
|
37
|
+
├── pycache/
|
|
38
|
+
└── report.json
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- `identities/` 跨运行保留测试私钥、证书和 token,避免每次重复注册固定测试 AID。
|
|
42
|
+
- `runs/` 每轮独立保存日志、临时目录、HOME、CLI 状态和 JSON 报告。
|
|
43
|
+
- 每个用例还有独立的 `HOME`、`TEMP/TMP/TMPDIR`、CLI 配置和 Python bytecode 目录。
|
|
44
|
+
- runner 默认串行执行,避免同一测试身份的槽位、在线状态和游标相互干扰。
|
|
45
|
+
|
|
46
|
+
runner 会拒绝与下列目录重叠的数据根:
|
|
47
|
+
|
|
48
|
+
- `../docker-deploy/data`
|
|
49
|
+
- `../docker-deploy/data-aun-pub`
|
|
50
|
+
- `../docker-deploy/data-evolagent-cn`
|
|
51
|
+
- `../docker-deploy/federation-test/data-dist`
|
|
52
|
+
- 仓库中的旧 `.aun*`
|
|
53
|
+
- 用户真实的 `~/.aun`
|
|
54
|
+
|
|
55
|
+
服务端公网验收建议使用 `../docker-deploy/public-test-data/` 和 `../docker-deploy/public-test-artifacts/`,不要与 SDK 的 `.public-test-data/` 混用。
|
|
56
|
+
|
|
57
|
+
## 3. 前置条件
|
|
58
|
+
|
|
59
|
+
- 目标域的公网 DNS、证书和服务端口已配置完成。
|
|
60
|
+
- Python 3.11 以上;推荐使用已构建的 `aun-sdk-tester:latest` 容器。
|
|
61
|
+
- 目标至少可访问 NameService 443、Gateway 20001、Storage 9470、Group 9480、Stream 9490 和 Service Proxy 19890。
|
|
62
|
+
- 用于新身份的加密 seed 通过环境变量 `AUN_TEST_ENCRYPTION_SEED` 注入;同一 `identity-prefix` 后续必须使用同一个 seed。
|
|
63
|
+
- 公网测试会创建 AID、消息、群、对象、agent.md 和 Service Proxy 注册,不能使用真实用户 AID。
|
|
64
|
+
|
|
65
|
+
实际执行必须显式传入 `--allow-create-identities`。遗漏该参数时 runner 会在联网前退出;`--list` 和 `--dry-run` 不需要该确认。
|
|
66
|
+
|
|
67
|
+
## 4. 先检查命令
|
|
68
|
+
|
|
69
|
+
在 `aun-sdk-core/python` 目录执行:
|
|
70
|
+
|
|
71
|
+
```powershell
|
|
72
|
+
python -X utf8 run-public-tests.py --list
|
|
73
|
+
python -X utf8 run-public-tests.py `
|
|
74
|
+
--domain evolagent.cn `
|
|
75
|
+
--suite full `
|
|
76
|
+
--identity-prefix public-ci `
|
|
77
|
+
--dry-run
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`dry-run` 会验证域名、目录安全规则、用例名称和所有测试文件,只打印命令,不创建目录、不连接公网、不创建身份。
|
|
81
|
+
|
|
82
|
+
切换域名只需修改 `--domain`:
|
|
83
|
+
|
|
84
|
+
```powershell
|
|
85
|
+
python -X utf8 run-public-tests.py --domain agentid.pub --suite smoke --dry-run
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 5. 推荐:在一次性 Docker 容器中运行
|
|
89
|
+
|
|
90
|
+
以下 PowerShell 命令从 `aun-sdk-core` 根目录执行。容器使用默认 bridge 网络访问公网,不加入本地 `kite-net`,代码只读挂载,公网测试数据单独挂载:
|
|
91
|
+
|
|
92
|
+
```powershell
|
|
93
|
+
$repo = (Get-Location).Path
|
|
94
|
+
$env:AUN_TEST_ENCRYPTION_SEED = "使用固定的公网测试 seed"
|
|
95
|
+
|
|
96
|
+
docker run --rm `
|
|
97
|
+
-v "${repo}\python:/workspace/python:ro" `
|
|
98
|
+
-v "${repo}\.public-test-data:/public-test-data" `
|
|
99
|
+
-e AUN_TEST_ENCRYPTION_SEED `
|
|
100
|
+
-w /workspace/python `
|
|
101
|
+
aun-sdk-tester:latest `
|
|
102
|
+
python -X utf8 run-public-tests.py `
|
|
103
|
+
--domain evolagent.cn `
|
|
104
|
+
--suite smoke `
|
|
105
|
+
--data-root /public-test-data `
|
|
106
|
+
--identity-prefix public-ci `
|
|
107
|
+
--allow-create-identities `
|
|
108
|
+
--fail-fast
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
确认 `smoke` 通过后,把 `--suite smoke` 改成 `--suite full`。Linux/macOS 使用相同挂载关系,将 PowerShell 续行符替换为 `\` 即可。
|
|
112
|
+
|
|
113
|
+
## 6. 宿主机直接运行
|
|
114
|
+
|
|
115
|
+
宿主机已安装当前 Python SDK 依赖时,可在 `aun-sdk-core/python` 下执行:
|
|
116
|
+
|
|
117
|
+
```powershell
|
|
118
|
+
$env:AUN_TEST_ENCRYPTION_SEED = "使用固定的公网测试 seed"
|
|
119
|
+
python -X utf8 run-public-tests.py `
|
|
120
|
+
--domain evolagent.cn `
|
|
121
|
+
--suite full `
|
|
122
|
+
--identity-prefix public-ci `
|
|
123
|
+
--allow-create-identities
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
可用 `--data-root D:\aun-public-tests` 改变公网数据根,但仍会经过受保护目录重叠检查。
|
|
127
|
+
|
|
128
|
+
## 7. 套件矩阵
|
|
129
|
+
|
|
130
|
+
| 套件 | 用例数 | 主要范围 |
|
|
131
|
+
| --- | ---: | --- |
|
|
132
|
+
| `smoke` | 9 | Auth/Gateway token、CA 指纹、Message ACK、Group 管理/index、Storage、Stream、Echo、Service Proxy |
|
|
133
|
+
| `integration` | 28 | 消息、群、Storage/FS、Stream、NameService、Collab、签名、同步与失败契约 |
|
|
134
|
+
| `e2e` | 23 | Echo/trace/refresh、V2 E2EE、多设备、thought、Group FS、CLI FS、Collab、Notify、Service Proxy |
|
|
135
|
+
| `full` | 50 | `integration + e2e` 去重;不自动包含压力测试 |
|
|
136
|
+
| `stress` | 3 | Gateway quota、slot-id storm、长短连接 CLI 压力 |
|
|
137
|
+
|
|
138
|
+
`full` 的主要业务覆盖:
|
|
139
|
+
|
|
140
|
+
- Auth/CA/Gateway:身份注册、认证、token/Gateway 缓存复用、正式 refresh、PKI DER/SPKI 指纹、长短连接和 quota。
|
|
141
|
+
- Message:P2P 明文/E2EE、ACK、在线状态、notify、replay guard、失败路径、push seq、gap fill、inbox、thought、多设备。
|
|
142
|
+
- Group:生命周期、角色、邀请/审批/封禁、设置、搜索、撤回、游标同步、在线未读、签名审计和 `group.index`。
|
|
143
|
+
- Storage/Group FS/Collab:控制面与数据面、ACL、配额、分享、VFS P1-P4、CLI P1-P6、群目录及协作链路。
|
|
144
|
+
- Stream:RPC、token、HTTP、SSE、WebSocket、回放、多拉流端和输入校验。
|
|
145
|
+
- NameService:agent.md 上传、同步、认证边界和快照下载。
|
|
146
|
+
- Service Proxy:公网发现、provider 隧道、HTTP/SSE/WebSocket 和并发访问。
|
|
147
|
+
|
|
148
|
+
指定少量用例时可重复使用 `--case`;此时 `--case` 覆盖套件默认清单:
|
|
149
|
+
|
|
150
|
+
```powershell
|
|
151
|
+
python -X utf8 run-public-tests.py `
|
|
152
|
+
--domain evolagent.cn `
|
|
153
|
+
--case integration-message-ack `
|
|
154
|
+
--case e2e-v2-p2p `
|
|
155
|
+
--identity-prefix public-debug `
|
|
156
|
+
--allow-create-identities
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## 8. 明确不纳入公网套件的用例
|
|
160
|
+
|
|
161
|
+
- `e2e_test_group_index.py`:只是 `integration_test_group_index.py` 的包装入口,`full` 按同一 `group-index` 用例去重。
|
|
162
|
+
- `integration_test_reconnect.py`:会操作 Docker 网络并重启 Gateway。
|
|
163
|
+
- `integration_test_mail*.py`:当前公网单实例未启用 Mail/SMTP/IMAP/Mailpit。
|
|
164
|
+
- `integration_test_p0_common_gaps.py`:包含 loopback 和本地故障注入。
|
|
165
|
+
- `integration_test_service_proxy.py`:加载服务端源码并启动进程内本地服务;公网使用 `e2e_test_service_proxy_docker.py`。
|
|
166
|
+
- `test_integration_auth_flow.py`:主要验证本地 mock CA/Gateway,不是公网 E2E。
|
|
167
|
+
- `local_real_sms_e2e.py`:会调用真实短信网关,必须单独授权。
|
|
168
|
+
|
|
169
|
+
这些排除项可通过 `--list` 查看,runner 不提供绕过开关,避免 `full` 意外影响本地容器或外部系统。
|
|
170
|
+
|
|
171
|
+
## 9. TLS 规则
|
|
172
|
+
|
|
173
|
+
公网 runner 固定设置 `AUN_ENV=production`、`KITE_ENV=production`,并默认启用控制面和数据面的证书校验。SDK、AIDStore、Storage、Stream、NameService 和 Service Proxy 使用同一测试 TLS 开关。
|
|
174
|
+
|
|
175
|
+
只有临时测试域证书尚未就绪时才使用:
|
|
176
|
+
|
|
177
|
+
```powershell
|
|
178
|
+
python -X utf8 run-public-tests.py `
|
|
179
|
+
--domain temporary.example.com `
|
|
180
|
+
--suite smoke `
|
|
181
|
+
--insecure-skip-tls-verify `
|
|
182
|
+
--allow-create-identities
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
该运行会在 `report.json` 中记录 `verify_ssl: false`,不能作为正式公网 TLS 验收结果。
|
|
186
|
+
|
|
187
|
+
## 10. 报告与排障
|
|
188
|
+
|
|
189
|
+
每个用例实时输出到控制台,同时写入:
|
|
190
|
+
|
|
191
|
+
```text
|
|
192
|
+
.public-test-data/runs/<domain>/<run-id>/logs/<case>.log
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
整轮结构化结果位于:
|
|
196
|
+
|
|
197
|
+
```text
|
|
198
|
+
.public-test-data/runs/<domain>/<run-id>/report.json
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
常用参数:
|
|
202
|
+
|
|
203
|
+
- `--run-id <id>`:固定本轮目录名;已存在且非空时拒绝覆盖。
|
|
204
|
+
- `--timeout-seconds <n>`:每个用例独立超时,默认 1800 秒。
|
|
205
|
+
- `--fail-fast`:首个失败或超时后停止,报告中的 `not_run` 会记录未执行数量。
|
|
206
|
+
- `--identity-prefix <prefix>`:隔离不同域、人员或 CI 任务;固定角色会生成为 `<prefix>-alice.<domain>` 等 AID。
|
|
207
|
+
|
|
208
|
+
失败时先查看对应 case 日志,再核对公网 DNS、证书 SAN、端口和 NameService 公告地址。切换域名后,不要复制另一个域的 identity 目录;应使用同一数据根下按 domain 自动分开的目录。
|
|
209
|
+
|
|
210
|
+
## 11. 服务端公网验收
|
|
211
|
+
|
|
212
|
+
SDK 测试前,可从 `aun-sdk-core` 根目录运行服务端验收:
|
|
213
|
+
|
|
214
|
+
```powershell
|
|
215
|
+
$repo = (Get-Location).Path
|
|
216
|
+
$env:PYTHONPATH = "${repo}\python\src"
|
|
217
|
+
$env:AUN_ACCEPTANCE_ENCRYPTION_SEED = "使用独立的服务端验收 seed"
|
|
218
|
+
|
|
219
|
+
python -X utf8 ..\docker-deploy\tests\public_single_instance_acceptance.py `
|
|
220
|
+
--target-mode public `
|
|
221
|
+
--domain evolagent.cn `
|
|
222
|
+
--data-root ..\docker-deploy\public-test-data `
|
|
223
|
+
--artifact-root ..\docker-deploy\public-test-artifacts `
|
|
224
|
+
--allow-create-identities
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
该验收必须 12 项全部 PASS,重点补齐 SDK runner 不直接覆盖的 AUN Console、服务注册健康、Leaderboard 和 AID Custody。服务端验收与 SDK runner 使用不同默认 AID 和不同本地数据目录,可连续运行。
|