@agentunion/fastaun 0.5.21 → 0.5.23
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 +58 -1
- package/_packed_docs/CHANGELOG.md +58 -1
- package/_packed_docs/INDEX.md +469 -453
- package/_packed_docs/KITE_DOCS_GUIDE.md +169 -164
- 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 +307 -67
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +41 -15
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +5 -5
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +30 -8
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +669 -666
- package/_packed_docs/sdk/0.5.22-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +212 -0
- package/_packed_docs/sdk/0.5.22-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +199 -0
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +16 -0
- package/_packed_docs/sdk/09-group-rpc-manual.md +10 -0
- package/_packed_docs/sdk/09-storage-rpc-manual.md +64 -7
- package/_packed_docs/sdk/09-/345/207/255/350/257/201/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +3 -1
- package/_packed_docs/sdk/09-/347/273/204/347/273/207/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +2 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +138 -134
- package/_packed_docs/sdk/INDEX.md +255 -239
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +939 -930
- package/_packed_docs/sdk/Ownership2.1-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +312 -363
- package/_packed_docs/sdk/Ownership2.1-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +322 -553
- package/_packed_docs/sdk/Ownership2.1-TDD/345/210/206/351/230/266/346/256/265/345/256/236/346/226/275/350/256/241/345/210/222.md +4 -4
- package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +484 -480
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +190 -97
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +158 -127
- package/dist/agent-md.d.ts +16 -2
- package/dist/agent-md.js +59 -23
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +1 -0
- package/dist/aid-store.js +43 -8
- package/dist/aid-store.js.map +1 -1
- package/dist/auth.d.ts +7 -0
- package/dist/auth.js +222 -70
- package/dist/auth.js.map +1 -1
- package/dist/client/delivery.d.ts +28 -0
- package/dist/client/delivery.js +399 -44
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.js +3 -0
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/rpc-pipeline.js +28 -2
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.js +109 -39
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +3 -0
- package/dist/client.js +114 -26
- package/dist/client.js.map +1 -1
- package/dist/group-fs.d.ts +1 -0
- package/dist/group-fs.js +37 -19
- package/dist/group-fs.js.map +1 -1
- package/dist/org-protocol.d.ts +11 -0
- package/dist/org-protocol.js +154 -19
- package/dist/org-protocol.js.map +1 -1
- package/dist/ownership-v21.d.ts +21 -3
- package/dist/ownership-v21.js +135 -37
- package/dist/ownership-v21.js.map +1 -1
- package/dist/ownership-workflow.d.ts +7 -2
- package/dist/ownership-workflow.js +173 -17
- package/dist/ownership-workflow.js.map +1 -1
- package/dist/storage/lowlevel.d.ts +6 -0
- package/dist/storage/lowlevel.js +24 -7
- package/dist/storage/lowlevel.js.map +1 -1
- package/dist/storage/read-cache.d.ts +70 -0
- package/dist/storage/read-cache.js +625 -0
- package/dist/storage/read-cache.js.map +1 -0
- package/dist/storage/vfs.d.ts +2 -0
- package/dist/storage/vfs.js +50 -15
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +21 -1
- package/dist/tools/cross-sdk-agent.js +301 -19
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.js +6 -2
- package/dist/transport.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# AUN 分布式测试运行指南
|
|
2
2
|
|
|
3
|
-
本文档负责三套本地 Docker 环境:三节点单域、本地真实域名双域 `agentid.pub/agentid.cn`、隔离双域 federation `dist-aid.com/dist-aid.net`。默认 `agentid.pub` 单域、默认四语言 Tester 和默认 cross-SDK 统一见 [AUN 测试运行指南](aun测试运行指南.md)。公网 `agentid.pub/agentid.cn` 复测是本地跨域通过后的独立验证层,不属于本地双域 Docker。
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
本文档负责三套本地 Docker 环境:三节点单域、本地真实域名双域 `agentid.pub/agentid.cn`、隔离双域 federation `dist-aid.com/dist-aid.net`。默认 `agentid.pub` 单域、默认四语言 Tester 和默认 cross-SDK 统一见 [AUN 测试运行指南](aun测试运行指南.md)。公网 `agentid.pub/agentid.cn` 复测是本地跨域通过后的独立验证层,不属于本地双域 Docker。
|
|
4
|
+
|
|
5
|
+
**AUN 分布式 2.0 入口:** [P0—P9 双形态验收与回滚](#aun-dist2)。该专节单独规定 2.0 的执行、证据与签收要求;以下历史单实例、三节点和双域章节保留各自适用范围,不代表 2.0 已通过。
|
|
6
|
+
|
|
7
|
+
本轮跨域验收范围仅为本机 Docker 中的 `agentid.pub` ↔ `agentid.cn`。测试请求必须经本地 `kite-agentid-federation-net` 在两个本地 Kite 容器之间完成;本轮禁止运行公网测试入口、访问线上 `agentid.pub` / `agentid.cn` 服务或把公网结果计入结论。`dist-aid.com` / `dist-aid.net` 章节仅保留为独立环境参考,本轮不得启动或运行该隔离 federation,也不得将其结果计入本轮跨域结论。
|
|
6
8
|
|
|
7
9
|
本指南只认当前 worktree `D:\modelunion\kite`。当前分支已经包含完整的默认单实例、三节点分布式、两套双域环境、服务端源码和四语言 SDK;服务端镜像、Tester、Cross-SDK、`data-dist` 与部署包都必须从这个 worktree 生成和运行。
|
|
8
10
|
|
|
@@ -23,7 +25,7 @@ D:\modelunion\kite\aun-sdk-core\docs\aun公网测试运行指南.md
|
|
|
23
25
|
- 当前 worktree:`D:\modelunion\kite`
|
|
24
26
|
- 三节点单域集群:`D:\modelunion\kite\docker-deploy\docker-compose.distributed.yml`
|
|
25
27
|
- 本地真实域名双域:两域基础 Compose + 域覆盖 + `D:\modelunion\kite\docker-deploy\docker-compose.agentid-federation.yml`,当前不加载 Mail overlay
|
|
26
|
-
- 隔离双域 federation(本轮不执行):`D:\modelunion\kite\docker-deploy\federation-test\docker-compose.yml`
|
|
28
|
+
- 隔离双域 federation(本轮不执行):`D:\modelunion\kite\docker-deploy\federation-test\docker-compose.yml`
|
|
27
29
|
- 分布式 Tester:`D:\modelunion\kite\docker-deploy\docker-compose.distributed-testers.yml`
|
|
28
30
|
- 分布式 Cross-SDK:`D:\modelunion\kite\aun-sdk-core\tests\cross-sdk\docker-compose.cross-sdk.distributed.yml`
|
|
29
31
|
- 本地 TLS 证书:只用于本地测试,SDK 侧统一 `AUN_ENV=development`、`AUN_VERIFY_SSL=0`
|
|
@@ -45,7 +47,7 @@ D:\modelunion\kite\aun-sdk-core\docs\aun公网测试运行指南.md
|
|
|
45
47
|
|
|
46
48
|
## 本地真实域名双域与公网环境边界
|
|
47
49
|
|
|
48
|
-
`agentid.pub` 与 `agentid.cn` 在本机各运行一套“分布式控制模型的单节点形态”,共同组成当前真实域名双域 Docker 跨域环境。两域复用同一无 Mail 服务镜像,但各自拥有独立 Issuer CA、12 个服务 AID、MySQL、Redis、workspace、Compose project 和宿主端口;只共享 `kite-agentid-federation-net` 上的 Kite 业务节点。默认双域不创建 PostgreSQL、不加载 Mail;服务镜像固定使用 `python:3.11-bookworm`,最终镜像不包含 `uvloop`,Compose 默认 `AUN_GATEWAY_USE_UVLOOP=0`。
|
|
50
|
+
`agentid.pub` 与 `agentid.cn` 在本机各运行一套“分布式控制模型的单节点形态”,共同组成当前真实域名双域 Docker 跨域环境。两域复用同一无 Mail 服务镜像,但各自拥有独立 Issuer CA、12 个服务 AID、MySQL、Redis、workspace、Compose project 和宿主端口;只共享 `kite-agentid-federation-net` 上的 Kite 业务节点。默认双域不创建 PostgreSQL、不加载 Mail;服务镜像固定使用 `python:3.11-bookworm`,最终镜像不包含 `uvloop`,Compose 默认 `AUN_GATEWAY_USE_UVLOOP=0`。
|
|
49
51
|
|
|
50
52
|
- `D:\modelunion\kite\docker-deploy\agentid.pub`:引用固定 `data`,project 为 `kite-single`,应用容器为 `kite-app`。
|
|
51
53
|
- `D:\modelunion\kite\docker-deploy\agentid.cn`:引用固定 `data-agentid-cn`,project 为 `kite-agentid-cn-local`,应用容器为 `kite-agentid-cn-local-app`。
|
|
@@ -63,8 +65,8 @@ D:\modelunion\kite\aun-sdk-core\docs\aun公网测试运行指南.md
|
|
|
63
65
|
| 三节点分布式 | `dist-agentid.pub` | `D:\modelunion\kite\docker-deploy\data-dist` | `kite-main-dist-worktree` | `kite-main-dist-aun-control`, `kite-main-dist-aun-node-a`, `kite-main-dist-aun-node-b` | `https://localhost:39876` |
|
|
64
66
|
| 分布式 SDK Tester | `dist-agentid.pub` | `...\data-dist\sdk-testers` | `kite-main-dist-sdk-testers` | `main-dist-python-sdk-tester`, `main-dist-go-sdk-tester`, `main-dist-ts-sdk-tester`, `main-dist-js-sdk-tester` | Docker internal |
|
|
65
67
|
| 分布式 cross-SDK | `dist-agentid.pub` | `...\aun-sdk-core\tests\cross-sdk\data-dist` | `kite-main-dist-cross-sdk` | `main-dist-cross-sdk-*` | Docker internal |
|
|
66
|
-
| 本地真实域名双域 A | `agentid.pub` | `...\docker-deploy\data` | `kite-single` | `kite-app`, `kite-mysql`, `kite-redis` | Gateway `20001`、Console `19876` |
|
|
67
|
-
| 本地真实域名双域 B | `agentid.cn` | `...\docker-deploy\data-agentid-cn` | `kite-agentid-cn-local` | `kite-agentid-cn-local-app`, `-mysql`, `-redis` | Gateway `42001`、Console `42876`、NameService `42443`、Storage `42470`、Group `42480`、MySQL `8406` |
|
|
68
|
+
| 本地真实域名双域 A | `agentid.pub` | 应用 `...\docker-deploy\data`;MySQL 命名卷 `org-pub-mysql-logical14-20261023-015854-855e` | `kite-single` | `kite-app`, `kite-mysql`, `kite-redis` | Gateway `20001`、Console `19876` |
|
|
69
|
+
| 本地真实域名双域 B | `agentid.cn` | 应用 `...\docker-deploy\data-agentid-cn`;MySQL 独立 bind `data-agentid-cn/mysql-repaired-20260903-v2` | `kite-agentid-cn-local` | `kite-agentid-cn-local-app`, `-mysql`, `-redis` | Gateway `42001`、Console `42876`、NameService `42443`、Storage `42470`、Group `42480`、MySQL `8406` |
|
|
68
70
|
| 隔离双域 federation | `dist-aid.com`, `dist-aid.net` | `...\docker-deploy\federation-test\data-dist` | `kite-main-dist-federation` | `main-dist-federation-kite-a`, `main-dist-federation-kite-b`, `main-dist-client-a`, `main-dist-client-b` | `41876`, `42876` |
|
|
69
71
|
|
|
70
72
|
`dist-*` 环境使用全新域名,默认不复制真实域数据库。其 CA、AID、TLS 材料只生成或复制到当前 worktree 的 `data-dist`,不要与 `docker-deploy/data`、`docker-deploy/data-agentid-cn` 或其他 worktree 共享运行时目录。
|
|
@@ -79,7 +81,7 @@ D:\modelunion\kite\aun-sdk-core\docs\aun公网测试运行指南.md
|
|
|
79
81
|
- 目标 `data-dist` 必须不存在或为空。整套冷克隆至少包含 `mysql`、`postgres`、`CA`、`certs`、`AIDs`、`control`、`aun-node-a`、`aun-node-b`、`storage-shared`、`sdk-tester-aun` 和 `sdk-testers`;不得只复制 CA、证书、AID、MySQL 或节点目录中的一部分。
|
|
80
82
|
- `.env.distributed` 不得被 example 覆盖。保留当前文件前要逐项比对 Issuer、MySQL/PostgreSQL 凭据、控制令牌、镜像、project/container/network 前缀、子网和端口;当前 worktree 必须保持 `kite-main-dist-*`、`172.31.89.0/24` 与新端口,不能沿用来源 worktree 的 Docker 命名空间。
|
|
81
83
|
- 克隆完成后,来源与目标成为两套独立资产。后续不得共享目录、交叉挂载或同时用同一容器名接管;每次启动都执行“运行时来源强制核验”。
|
|
82
|
-
- 启动业务服务前,先只读核对根 CA/Registry CA 哈希、十二个内置服务证书的 SHA-256,以及证书在克隆后 MySQL `aun_cert.agentid_cert` 中的 `lifecycle_state=active_signing`、`cert_state=1` 记录。任一不一致即停止,不得补登记、重签、清库或局部重复制。
|
|
84
|
+
- 启动业务服务前,先只读核对根 CA/Registry CA 哈希、十二个内置服务证书的 SHA-256,以及证书在克隆后 MySQL `aun_cert.agentid_cert` 中的 `lifecycle_state=active_signing`、`cert_state=1` 记录。任一不一致即停止,不得补登记、重签、清库或局部重复制。
|
|
83
85
|
|
|
84
86
|
整套冷克隆会继承来源环境的历史业务数据,适合当前分支接管并继续回归。只有明确需要全新隔离身份和空业务库时,才在用户授权后运行 `prepare_dist_materials.py` 并完成新证书注册验收;“新建空目录 + 复制旧证书”不是合法初始化方式。
|
|
85
87
|
|
|
@@ -503,7 +505,7 @@ docker compose --env-file ../docker-deploy/.env.distributed -f tests/cross-sdk/d
|
|
|
503
505
|
|
|
504
506
|
### 定位与验收边界
|
|
505
507
|
|
|
506
|
-
这是当前真实域名的**本机 Docker 双域跨域测试环境**。两域都是分布式控制模型的单节点部署,已迁移服务默认使用 Go:Auth、CA、Gateway、Message、Group、Storage、Stream、NameService、Leaderboard、Service Proxy;AID Custody 仍使用 Python。两域必须使用同一个无 Mail 的 `docker-deploy-kite:latest` 镜像,避免把镜像差异误判为跨域问题。本阶段的 SDK runner 只加入本地 `kite-agentid-federation-net`,不使用公网 DNS、线上服务器或公网测试 runner。
|
|
508
|
+
这是当前真实域名的**本机 Docker 双域跨域测试环境**。两域都是分布式控制模型的单节点部署,已迁移服务默认使用 Go:Auth、CA、Gateway、Message、Group、Storage、Stream、NameService、Leaderboard、Service Proxy;AID Custody 仍使用 Python。两域必须使用同一个无 Mail 的 `docker-deploy-kite:latest` 镜像,避免把镜像差异误判为跨域问题。本阶段的 SDK runner 只加入本地 `kite-agentid-federation-net`,不使用公网 DNS、线上服务器或公网测试 runner。
|
|
507
509
|
|
|
508
510
|
本环境验证的是本地完整调用链:
|
|
509
511
|
|
|
@@ -519,7 +521,7 @@ docker compose --env-file ../docker-deploy/.env.distributed -f tests/cross-sdk/d
|
|
|
519
521
|
|
|
520
522
|
### 每轮执行顺序
|
|
521
523
|
|
|
522
|
-
每轮开始和结束都重新阅读 [AUN 测试运行指南](aun测试运行指南.md),确认身份保护、镜像重建和测试串行规则没有变化。固定顺序为:只读材料校验 -> 必要时构建镜像 -> 启动两域 -> 来源与 Go runtime 核验 -> 双向发现 -> 联邦身份边界 -> Notify -> Stream -> P2P -> Read State -> Group -> Group FS -> Collab -> Storage OSS -> 采集两域日志。当前明确跳过 Mail 和 reconnect,因此不得加载 `docker-compose.mail.yml`。任一前置门禁失败即停止,不得用重签证书、`setup_aids.py`、清库或删除 SDK 身份绕过。
|
|
524
|
+
每轮开始和结束都重新阅读 [AUN 测试运行指南](aun测试运行指南.md),确认身份保护、镜像重建和测试串行规则没有变化。固定顺序为:只读材料校验 -> 必要时构建镜像 -> 启动两域 -> 来源与 Go runtime 核验 -> 双向发现 -> 联邦身份边界 -> Notify -> Stream -> P2P -> Read State -> Group -> Group FS -> Collab -> Storage OSS -> 采集两域日志。当前明确跳过 Mail 和 reconnect,因此不得加载 `docker-compose.mail.yml`。任一前置门禁失败即停止,不得用重签证书、`setup_aids.py`、清库或删除 SDK 身份绕过。
|
|
523
525
|
|
|
524
526
|
### 材料校验与镜像构建
|
|
525
527
|
|
|
@@ -531,7 +533,7 @@ docker image inspect docker-deploy-kite:latest mysql:8.0 redis:7-alpine | Out-Nu
|
|
|
531
533
|
if ($LASTEXITCODE -ne 0) { throw '双域基础镜像未准备完成,停止测试' }
|
|
532
534
|
```
|
|
533
535
|
|
|
534
|
-
`domain_materials.py validate` 会只读核对域名、Issuer CA 指纹、12 个服务 AID、TLS
|
|
536
|
+
`domain_materials.py validate` 会只读核对域名、Issuer CA 指纹、12 个服务 AID、TLS 与原始数据库材料的 `server-uuid`。任一不匹配都应停止测试并核查,不得自动修复;当前运行库还要按主指南“默认单实例测试前强制核验”分别比对两域 MySQL 挂载的 `Type`、命名卷 `Name` 或 bind `Source`,不能仅凭材料目录校验认定运行库正确。
|
|
535
537
|
|
|
536
538
|
只有服务端源码、Go 依赖、manifest 或 Dockerfile 变化时,才在依赖准备阶段构建;业务测试阶段不得临时联网补依赖:
|
|
537
539
|
|
|
@@ -665,10 +667,10 @@ agentid.cn: D:\modelunion\kite\docker-deploy\data-agentid-cn\sdk-testers\python
|
|
|
665
667
|
|
|
666
668
|
```powershell
|
|
667
669
|
cd D:\modelunion\kite\docker-deploy
|
|
668
|
-
$phases = @(
|
|
669
|
-
'federation-boundary', 'notify', 'stream', 'p2p', 'read-state',
|
|
670
|
-
'group', 'group-fs', 'collab', 'storage'
|
|
671
|
-
)
|
|
670
|
+
$phases = @(
|
|
671
|
+
'federation-boundary', 'notify', 'stream', 'p2p', 'read-state',
|
|
672
|
+
'group', 'group-fs', 'collab', 'storage'
|
|
673
|
+
)
|
|
672
674
|
foreach ($phase in $phases) {
|
|
673
675
|
$testSince = (Get-Date).ToUniversalTime().ToString('o')
|
|
674
676
|
$stamp = (Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmss')
|
|
@@ -723,9 +725,9 @@ $tsCases = @(
|
|
|
723
725
|
'federation-service-proxy.test.ts'
|
|
724
726
|
)
|
|
725
727
|
foreach ($case in $tsCases) {
|
|
726
|
-
docker exec -e AUN_TEST_ISSUER_A=agentid.pub -e AUN_TEST_ISSUER_B=agentid.cn `
|
|
727
|
-
-e AUN_VERIFY_SSL=0 -w /workspace/ts kite-ts-tester bash -lc `
|
|
728
|
-
"node --max-opt=0 node_modules/vitest/vitest.mjs run tests/integration/$case --pool forks --no-file-parallelism --maxWorkers=1 --reporter=verbose"
|
|
728
|
+
docker exec -e AUN_TEST_ISSUER_A=agentid.pub -e AUN_TEST_ISSUER_B=agentid.cn `
|
|
729
|
+
-e AUN_VERIFY_SSL=0 -w /workspace/ts kite-ts-tester bash -lc `
|
|
730
|
+
"node --max-opt=0 node_modules/vitest/vitest.mjs run tests/integration/$case --pool forks --no-file-parallelism --maxWorkers=1 --reporter=verbose"
|
|
729
731
|
if ($LASTEXITCODE -ne 0) { throw "TS federation 失败: $case" }
|
|
730
732
|
}
|
|
731
733
|
```
|
|
@@ -735,24 +737,24 @@ foreach ($case in $tsCases) {
|
|
|
735
737
|
浏览器 JS federation 必须使用 Playwright,按文件串行执行。先构建一次,再分别运行 `federation.spec.ts` 与 `notify.spec.ts`;`AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1` 使浏览器使用共享 Docker DNS,不把域名 pin 到宿主机回环地址:
|
|
736
738
|
|
|
737
739
|
```powershell
|
|
738
|
-
docker exec -e AUN_TEST_ISSUER_A=agentid.pub -e AUN_TEST_ISSUER_B=agentid.cn `
|
|
739
|
-
-e AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1 -e AUN_VERIFY_SSL=0 `
|
|
740
|
-
-w /workspace/js kite-js-tester bash -lc "npm run build"
|
|
740
|
+
docker exec -e AUN_TEST_ISSUER_A=agentid.pub -e AUN_TEST_ISSUER_B=agentid.cn `
|
|
741
|
+
-e AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1 -e AUN_VERIFY_SSL=0 `
|
|
742
|
+
-w /workspace/js kite-js-tester bash -lc "npm run build"
|
|
741
743
|
if ($LASTEXITCODE -ne 0) { throw 'JS federation 构建失败' }
|
|
742
744
|
|
|
743
745
|
$jsCases = @('federation.spec.ts', 'notify.spec.ts')
|
|
744
746
|
foreach ($case in $jsCases) {
|
|
745
|
-
docker exec -e AUN_TEST_ISSUER_A=agentid.pub -e AUN_TEST_ISSUER_B=agentid.cn `
|
|
746
|
-
-e AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1 -e AUN_VERIFY_SSL=0 `
|
|
747
|
-
-w /workspace/js kite-js-tester bash -lc `
|
|
748
|
-
"node --max-opt=0 node_modules/@playwright/test/cli.js test --config=playwright.agentid-local.config.ts tests/e2e-browser/$case --reporter=line"
|
|
747
|
+
docker exec -e AUN_TEST_ISSUER_A=agentid.pub -e AUN_TEST_ISSUER_B=agentid.cn `
|
|
748
|
+
-e AUN_TEST_DISABLE_LOCAL_DOCKER_PIN=1 -e AUN_VERIFY_SSL=0 `
|
|
749
|
+
-w /workspace/js kite-js-tester bash -lc `
|
|
750
|
+
"node --max-opt=0 node_modules/@playwright/test/cli.js test --config=playwright.agentid-local.config.ts tests/e2e-browser/$case --reporter=line"
|
|
749
751
|
if ($LASTEXITCODE -ne 0) { throw "JS Playwright federation 失败: $case" }
|
|
750
|
-
}
|
|
751
|
-
```
|
|
752
|
-
|
|
753
|
-
若 Docker Tester 中 Playwright 以 `139`/`SIGSEGV` 退出,保留该文件日志并切换到主指南的宿主机 Node 备选命令,仍使用同一套 `agentid.pub ↔ agentid.cn` Docker 服务端;宿主机模式不要设置 `AUN_TEST_DISABLE_LOCAL_DOCKER_PIN`,由 `playwright.agentid-local.config.ts` 将两域宿主端口映射给浏览器。已通过文件无需重复运行。
|
|
754
|
-
|
|
755
|
-
失败后不得重复已通过文件;如果只需重跑 Notify,可将 `$jsCases` 改为 `@('notify.spec.ts')`。隔离 federation 运行时将两处 `agentid.pub/agentid.cn` 同时替换为 `dist-aid.com/dist-aid.net`。
|
|
752
|
+
}
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
若 Docker Tester 中 Playwright 以 `139`/`SIGSEGV` 退出,保留该文件日志并切换到主指南的宿主机 Node 备选命令,仍使用同一套 `agentid.pub ↔ agentid.cn` Docker 服务端;宿主机模式不要设置 `AUN_TEST_DISABLE_LOCAL_DOCKER_PIN`,由 `playwright.agentid-local.config.ts` 将两域宿主端口映射给浏览器。已通过文件无需重复运行。
|
|
756
|
+
|
|
757
|
+
失败后不得重复已通过文件;如果只需重跑 Notify,可将 `$jsCases` 改为 `@('notify.spec.ts')`。隔离 federation 运行时将两处 `agentid.pub/agentid.cn` 同时替换为 `dist-aid.com/dist-aid.net`。
|
|
756
758
|
|
|
757
759
|
除 `federation-boundary` 外,runner 在进入业务阶段前会用全新的运行目录分别完成两域固定身份登录。`auth.aid_login1` 必须依次通过 CA 的 `verify_chain`、`get_cert` 和 `ocsp_query` 数据库查询,因此登录成功就是 CA/Auth 数据库调用链可用的证据;日志必须先出现两条 `DOMAIN_READY ... evidence=aid_login`。`ca.status` 属于域内诊断 RPC,普通 AID 被 Gateway 拒绝是正确权限边界,不得为了预检放宽。任一域登录失败时,runner 会汇总两域结果并在业务 RPC 前停止;此时应先检查对应 MySQL 容器状态和 CA/Auth 重连日志,不能把 `ca.verify_chain: database not connected` 归因于联邦身份边界。
|
|
758
760
|
|
|
@@ -760,7 +762,11 @@ foreach ($case in $jsCases) {
|
|
|
760
762
|
|
|
761
763
|
先在冷启动诊断实例中执行目标表的全索引扫描、`CHECK TABLE ... EXTENDED` 和行数校验,再对冷副本、逻辑重建副本做相同负载与配置 A/B。只有同一文件/页在冷副本上稳定复现,或离线/冷启动校验也失败,才可归为持久化物理损坏;若冷启动校验完整、非法页号每次变化甚至呈现业务字符串字节,则继续检查 `dict_stats_thread` 等后台栈、MySQL 版本对照和宿主机 WHEA,不能归咎前台 SQL。
|
|
762
764
|
|
|
763
|
-
|
|
765
|
+
当前 PUB 使用 Linux 命名卷 `org-pub-mysql-logical14-20261023-015854-855e`,由隔离恢复副本完整逻辑导入,保留原有身份与证书登记记录;实际挂载必须为 `Type=volume`,用 `docker volume inspect` 查看 Linux Mountpoint,不能按 Windows bind 路径核验。此前 25 个废弃故障及诊断卷已按用户授权删除,本轮旧故障卷仍保留,完整逻辑导出和日志仍保留;原 `data/mysql` 不得再启动或覆盖。CN 仍使用独立 Windows bind `data-agentid-cn/mysql-repaired-20260903-v2`,由该域 `AUN_MYSQL_DATA_ROOT` 明确指定;两域不共享数据库文件。
|
|
766
|
+
|
|
767
|
+
2026-10-22 的新故障发生在 Linux 命名卷:已确认持久化 redo 的索引字段长度元数据异常,原块 CRC 仍有效;尚未确定异常的产生原因,不能据此归因 Windows bind 或宣称换卷即可杜绝。恢复必须验证正常模式启动、完整导出,以及干净逻辑导入后的逐表内容和索引一致性;本次 28 个库、491 张表的结构和行数、471 张业务表 checksum 及消息库四个索引均通过。PUB 和 CN 当前均保持 MySQL 8.0.44,并在各域 Compose 设置 `--innodb-purge-threads=1`;PUB 三轮合成 purge 负载、固定身份和新增业务记录核验、60 秒冷启动均通过,CN 按用户授权正常重启后参数读回通过。该配置是本地恢复措施,不等于已确认根因,不得据此推广到生产环境。`innodb_force_recovery` 下的部分导出曾缺行或重复,不能作为完整恢复源。原始证据见 `docker-deploy/test-artifacts/org-20261021/mysql-salvage-20261022/`。
|
|
768
|
+
|
|
769
|
+
在 Linux named volume 与 Windows bind 之间恢复时,必须初始化目标实例并逻辑导出/导入,不能直接搬运 MySQL 物理文件。本次已确认两种存储的 `lower_case_table_names=0/2` 与数据字典不兼容会导致拒绝启动;这不等于已确定 InnoDB 页越界退出的根因。只有错误栈已收敛到 InnoDB 自动统计线程时,才可在故障域的 `local.env` 临时设置 `MYSQL_INNODB_STATS_AUTO_RECALC=OFF`;默认值保持 `ON`,不得未经 A/B 验证扩散到另一域或生产环境。
|
|
764
770
|
|
|
765
771
|
每个方向都必须出现对应标志,最后还必须有该阶段 `PASS phase=...`:
|
|
766
772
|
|
|
@@ -769,9 +775,9 @@ foreach ($case in $jsCases) {
|
|
|
769
775
|
| `federation-boundary` | `FEDERATION_MUTUAL_AUTH_OK`,以及 unauth/signature/issuer/RPC/event/Group-FS marker 的全部 `DENIED` |
|
|
770
776
|
| `notify` | `NOTIFY_CROSS_DOMAIN_OK` |
|
|
771
777
|
| `stream` | `STREAM_CREATED_EVENT_OK`、`STREAM_TARGET_BINDING_OK`、`STREAM_CLOSED_EVENT_OK` |
|
|
772
|
-
| `p2p` | `P2P_ONLINE_OK`、`P2P_ACK_OK`、`P2P_OFFLINE_RECONNECT_SKIPPED` |
|
|
773
|
-
| `read-state` | `READ_STATE_P2P_OK`、`READ_STATE_GROUP_OK`、`READ_STATE_CROSS_DEVICE_OK` |
|
|
774
|
-
| `group` | `GROUP_AUTHORITY_MEMBER_OK`、`GROUP_REMOTE_PULL_OK`、`GROUP_DIRECTORY_OK`、`GROUP_DIRECTORY_RECONNECT_SKIPPED`、`GROUP_MESSAGE_ONLINE_PULL_OK`、`GROUP_LEAVE_OK`、`GROUP_AID_CERT_OK` |
|
|
778
|
+
| `p2p` | `P2P_ONLINE_OK`、`P2P_ACK_OK`、`P2P_OFFLINE_RECONNECT_SKIPPED` |
|
|
779
|
+
| `read-state` | `READ_STATE_P2P_OK`、`READ_STATE_GROUP_OK`、`READ_STATE_CROSS_DEVICE_OK` |
|
|
780
|
+
| `group` | `GROUP_AUTHORITY_MEMBER_OK`、`GROUP_REMOTE_PULL_OK`、`GROUP_DIRECTORY_OK`、`GROUP_DIRECTORY_RECONNECT_SKIPPED`、`GROUP_MESSAGE_ONLINE_PULL_OK`、`GROUP_LEAVE_OK`、`GROUP_AID_CERT_OK` |
|
|
775
781
|
| `group-fs` | `GROUP_FS_OWNER_AREA_OK`、`GROUP_FS_NON_MEMBER_DENIED`、`GROUP_FS_MEMBERDATA_DIRECT_OK`、`GROUP_FS_OTHER_MEMBERDATA_DENIED`、`GROUP_FS_STORAGE_BYPASS_DENIED`、`GROUP_FS_MEMBERDATA_OK`、`GROUP_FS_REMOTE_COPY_OK`、`GROUP_FS_ACL_PRE_GRANT_DENIED`、`GROUP_FS_ACL_GRANTED`、`GROUP_FS_ACL_REVOKED_DENIED`、`GROUP_FS_ADMIN_DEFAULT_WRITE_OK`、`GROUP_FS_SHORT_AID_DENIED`、`GROUP_FS_AFTER_LEAVE_DENIED` |
|
|
776
782
|
| `collab` | `COLLAB_CROSS_DOMAIN_READ_OK`、`COLLAB_NON_MEMBER_DENIED`、`COLLAB_STORAGE_BYPASS_DENIED` |
|
|
777
783
|
| `storage` | `STORAGE_LIST_OK`、`STORAGE_RECONNECT_SKIPPED`、`STORAGE_PRIVATE_DENIED_OK`、`STORAGE_TOKEN_OK`、`STORAGE_CROSS_OWNER_ROUTING_OK`、`STORAGE_CLEANUP_OK` |
|
|
@@ -789,35 +795,35 @@ Notify 必须双向验证公开 SDK `notify()` 经过 Gateway 联邦事件转发
|
|
|
789
795
|
3. 当前 `--skip-reconnect` 范围明确不执行离线重连回补,必须输出 `P2P_OFFLINE_RECONNECT_SKIPPED`;恢复 reconnect 验收时,才要求接收端离线发送、再上线 pull 并 ACK。
|
|
790
796
|
4. receiver AID 的 issuer 必须决定远端 Gateway;本域 Message 不得把异域 receiver 当成本地收件人查询后返回 not found。
|
|
791
797
|
|
|
792
|
-
成功标准是发送响应、远端接收、pull/ack 和两域日志中的同一 trace/message ID 全部闭合。仅有 `message.send` 返回成功不算通过;远端超时必须返回明确的 federation unavailable/timeout,不能伪装成接收方不存在。
|
|
793
|
-
|
|
794
|
-
### 跨设备已读未读验收
|
|
795
|
-
|
|
796
|
-
本阶段只使用本地真实域 `agentid.pub` 与 `agentid.cn` 的固定身份,验证 Message P2P、Group 消息和同一 AID 多设备的已读状态同步。不得使用 `federation-test` 的 `dist-aid.com` / `dist-aid.net` 身份或 `cross_domain_read_state.py` 作为本轮跨域验收证据;隔离 federation 仅在本指南末尾的独立参考章节中运行。
|
|
797
|
-
|
|
798
|
-
在完成 `p2p` 阶段后执行:
|
|
799
|
-
|
|
800
|
-
```powershell
|
|
801
|
-
$runId = "agentid-read-state-" + (Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmss')
|
|
802
|
-
docker run --rm --network kite-agentid-federation-net `
|
|
803
|
-
-v "D:\modelunion\kite\aun-sdk-core\python\src:/sdk/src:ro" `
|
|
804
|
-
-v "D:\modelunion\kite\docker-deploy\tests\agentid_cross_domain_e2e.py:/tests/agentid_cross_domain_e2e.py:ro" `
|
|
805
|
-
-v "D:\modelunion\kite\docker-deploy\data\extended-acceptance\group-management:/identities/pub:ro" `
|
|
806
|
-
-v "D:\modelunion\kite\docker-deploy\data-agentid-cn\sdk-testers\python-fixed:/identities/cn:ro" `
|
|
807
|
-
-e PYTHONPATH=/sdk/src `
|
|
808
|
-
-e AUN_E2E_PUB_IDENTITY_ROOT=/identities/pub `
|
|
809
|
-
-e AUN_E2E_CN_IDENTITY_ROOT=/identities/cn `
|
|
810
|
-
-e AUN_E2E_CN_ENCRYPTION_SEED=cross-domain-e2e-v1 `
|
|
811
|
-
-e AUN_E2E_RUN_ROOT=/tmp/aun-e2e `
|
|
812
|
-
-e AUN_SDK_UVLOOP=0 -e AUN_CLI_UVLOOP=0 -e AUN_BENCH_UVLOOP=0 `
|
|
813
|
-
-e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
|
|
814
|
-
aun-sdk-tester:latest python /tests/agentid_cross_domain_e2e.py `
|
|
815
|
-
--phase read-state --skip-reconnect --run-id $runId
|
|
816
|
-
```
|
|
817
|
-
|
|
818
|
-
该阶段必须输出 `READ_STATE_P2P_OK`、`READ_STATE_GROUP_OK`、`READ_STATE_CROSS_DEVICE_OK` 和 `PASS phase=read-state`。P2P 与 Group 的状态上报、重复上报幂等、查询结果及跨域消息 ID 必须在同一轮中闭合;跨设备部分必须使用同一 AID 的两个不同 `device_id`,并验证在线 `message.read_changed` 事件及查询补偿。失败后只从 `read-state` 阶段继续,不重复已通过的 `federation-boundary`、Notify、Stream 和 P2P 阶段。
|
|
819
|
-
|
|
820
|
-
### Group 跨域验收
|
|
798
|
+
成功标准是发送响应、远端接收、pull/ack 和两域日志中的同一 trace/message ID 全部闭合。仅有 `message.send` 返回成功不算通过;远端超时必须返回明确的 federation unavailable/timeout,不能伪装成接收方不存在。
|
|
799
|
+
|
|
800
|
+
### 跨设备已读未读验收
|
|
801
|
+
|
|
802
|
+
本阶段只使用本地真实域 `agentid.pub` 与 `agentid.cn` 的固定身份,验证 Message P2P、Group 消息和同一 AID 多设备的已读状态同步。不得使用 `federation-test` 的 `dist-aid.com` / `dist-aid.net` 身份或 `cross_domain_read_state.py` 作为本轮跨域验收证据;隔离 federation 仅在本指南末尾的独立参考章节中运行。
|
|
803
|
+
|
|
804
|
+
在完成 `p2p` 阶段后执行:
|
|
805
|
+
|
|
806
|
+
```powershell
|
|
807
|
+
$runId = "agentid-read-state-" + (Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmss')
|
|
808
|
+
docker run --rm --network kite-agentid-federation-net `
|
|
809
|
+
-v "D:\modelunion\kite\aun-sdk-core\python\src:/sdk/src:ro" `
|
|
810
|
+
-v "D:\modelunion\kite\docker-deploy\tests\agentid_cross_domain_e2e.py:/tests/agentid_cross_domain_e2e.py:ro" `
|
|
811
|
+
-v "D:\modelunion\kite\docker-deploy\data\extended-acceptance\group-management:/identities/pub:ro" `
|
|
812
|
+
-v "D:\modelunion\kite\docker-deploy\data-agentid-cn\sdk-testers\python-fixed:/identities/cn:ro" `
|
|
813
|
+
-e PYTHONPATH=/sdk/src `
|
|
814
|
+
-e AUN_E2E_PUB_IDENTITY_ROOT=/identities/pub `
|
|
815
|
+
-e AUN_E2E_CN_IDENTITY_ROOT=/identities/cn `
|
|
816
|
+
-e AUN_E2E_CN_ENCRYPTION_SEED=cross-domain-e2e-v1 `
|
|
817
|
+
-e AUN_E2E_RUN_ROOT=/tmp/aun-e2e `
|
|
818
|
+
-e AUN_SDK_UVLOOP=0 -e AUN_CLI_UVLOOP=0 -e AUN_BENCH_UVLOOP=0 `
|
|
819
|
+
-e HTTP_PROXY= -e HTTPS_PROXY= -e ALL_PROXY= -e NO_PROXY=* `
|
|
820
|
+
aun-sdk-tester:latest python /tests/agentid_cross_domain_e2e.py `
|
|
821
|
+
--phase read-state --skip-reconnect --run-id $runId
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
该阶段必须输出 `READ_STATE_P2P_OK`、`READ_STATE_GROUP_OK`、`READ_STATE_CROSS_DEVICE_OK` 和 `PASS phase=read-state`。P2P 与 Group 的状态上报、重复上报幂等、查询结果及跨域消息 ID 必须在同一轮中闭合;跨设备部分必须使用同一 AID 的两个不同 `device_id`,并验证在线 `message.read_changed` 事件及查询补偿。失败后只从 `read-state` 阶段继续,不重复已通过的 `federation-boundary`、Notify、Stream 和 P2P 阶段。
|
|
825
|
+
|
|
826
|
+
### Group 跨域验收
|
|
821
827
|
|
|
822
828
|
先由 `.agentid.pub` 成员创建群并加入 `.agentid.cn` 成员,再反向创建一次。每个方向都必须验证:
|
|
823
829
|
|
|
@@ -992,9 +998,9 @@ foreach ($phase in 'p2p', 'group', 'storage') {
|
|
|
992
998
|
|
|
993
999
|
公网日志应从两台服务器按本轮开始时间分别采集。若仍保存到 `docker-deploy/agentid.pub/latest.log` 和 `docker-deploy/agentid.cn/latest.log`,必须同时记录日志来源是“本地 Docker”还是“公网服务器”;文件名相同不能证明环境。没有远端日志访问权限时,只能给出客户端 E2E 结论,不能声称已完成服务端调用链闭环。
|
|
994
1000
|
|
|
995
|
-
## 隔离双域 federation(dist-aid.com / dist-aid.net;本轮不执行)
|
|
996
|
-
|
|
997
|
-
本节仅供单独获准的隔离环境回归参考,不属于本轮 `agentid.pub` ↔ `agentid.cn` 跨域验收;本轮不得按本节启动容器或执行测试。
|
|
1001
|
+
## 隔离双域 federation(dist-aid.com / dist-aid.net;本轮不执行)
|
|
1002
|
+
|
|
1003
|
+
本节仅供单独获准的隔离环境回归参考,不属于本轮 `agentid.pub` ↔ `agentid.cn` 跨域验收;本轮不得按本节启动容器或执行测试。
|
|
998
1004
|
|
|
999
1005
|
### 准备并启动
|
|
1000
1006
|
|
|
@@ -1209,3 +1215,237 @@ docker compose --env-file ../.env.distributed -f docker-compose.yml down
|
|
|
1209
1215
|
- URL 返回 loopback:服务端 URL 生成逻辑有问题,应返回 `gateway.{issuer}`、`storage.{issuer}`、`group.{issuer}` 这类 Docker network alias。
|
|
1210
1216
|
- TLS 报错:本地分布式环境使用自签名材料,确认测试容器内有 `AUN_ENV=development` 和 `AUN_VERIFY_SSL=0`。
|
|
1211
1217
|
- 来源冲突:检查 Compose label 和 bind mount 是否全部位于 `D:\modelunion\kite`;只看 `dist-*` 容器名不足以证明来源。
|
|
1218
|
+
|
|
1219
|
+
<a id="aun-dist2"></a>
|
|
1220
|
+
|
|
1221
|
+
## AUN 分布式 2.0:P0—P9 双形态验收与回滚
|
|
1222
|
+
|
|
1223
|
+
本节对应 [分阶段 TDD 实施计划](../../extensions/services/docs/aun分布式2.0/AUN分布式2.0分阶段TDD实施计划.md)、[详细设计](../../extensions/services/docs/aun分布式2.0/AUN分布式2.0详细设计方案.md)及[开发部署草案](../../extensions/services/docs/aun分布式2.0/AUN分布式2.0开发部署草案.md)。阶段执行事实写入[执行账本](../../extensions/services/docs/aun分布式2.0/AUN分布式2.0执行账本.md),命令、变更、故障注入与恢复操作写入[执行操作审计日志](../../extensions/services/docs/aun分布式2.0/AUN分布式2.0执行操作审计日志.md)。当前 P0 进行中,P1—P9 未开始;本节是运行规范,不是验收结果,也不授予启动环境或修改核心机制、接口的额外许可。
|
|
1224
|
+
|
|
1225
|
+
### 2.0 环境准备与历史证据边界
|
|
1226
|
+
|
|
1227
|
+
1. 准备同一业务代码 revision、镜像 digest、协议/状态模型的两个独立对照环境:All-in-One 为一个 AUN 运行节点混部 control、Gateway 和业务独立进程;多节点池为独立 control、三个 worker,以及独立生命周期的入口和状态层。分别隔离 issuer、cluster、数据库/Redis 键空间、对象命名空间、身份、卷、Tester 和端口,不共享可变测试数据。
|
|
1228
|
+
2. 现有 `docker-deploy/docker-compose.distributed.yml` 只有 control 加两个 worker。旧“三节点 smoke”不能代替三个业务 worker,也不能证明多副本、跨 Gateway 或生产 HA。2.0 已新增 `docker-deploy/docker-compose.dist2.infra.yml`、`docker-compose.dist2.worker.yml`、`coredns/Corefile.dist2`、`nginx/dist2.conf.template` 和 `.env.dist2.example`;入口仍按固定单活放置路由,各节点目录独立,配置落地不代表运行验收通过。
|
|
1229
|
+
3. 用户最新明确大文件继续外部OSS,仅将小对象localfs替换为内部部署S3,优先MinIO,不可得时提出内部替代品。P0/P1仍保留单实例小对象localfs基线并准备内部S3;实际迁移属P2,不能自动跳阶段,也不能以“配置了S3”代替backend、摘要与跨副本读取证据。各worker本地目录独立。
|
|
1230
|
+
4. 公共 URL 使用 `{svc}.{issuer}` 等稳定域名,内部使用实际私网实例 endpoint;先保留现有 HTTP/WS、权限、设备/slot、E2EE 与错误契约。P0 明确多副本目标清单及允许单实例的职责,后续逐服务准入,不能为跑测试一次性解除保护。
|
|
1231
|
+
5. P1—P4 分别准备本阶段所需跨主机私网、证书名称/信任链、TLS、ACL、watch 恢复与拟用 MySQL/Redis/MinIO 客户端及切换环境。旧章节的 `AUN_VERIFY_SSL=0`、`--skip-reconnect`、reconnect/mail 排除及本地同宿主成功只保留历史含义;不能抵消 2.0 必须验证的 TLS、生命周期或业务覆盖。必要用例未执行、skip 或失败均不能签收。
|
|
1232
|
+
6. 每阶段开始前冻结命令清单、运行目录、目标Tester/域名、用例ID、预期结果、容量/时间预算、故障与恢复命令、回滚版本和数据兼容性。依赖缺失先独立准备,不在业务验收途中安装依赖、重建身份或清库。用户已明确授权“把这两套环境跑起来确保正常”,Codex可在本次隔离环境范围继续启动排障,无需重复申请;不授权进入P1—P9。容量目标为消息发送每秒1万次,ACK/pull另计;用户已授权P0规划画像(10万稳态连接/30万峰值、1KiB典型/1MiB最大、峰值15分钟+稳定观察60分钟、每接收投递设备各1 ACK+1 pull、单聊80%/群聊20%、群20/1000、RPO=0、RTO≤60秒、余量至少30%、在线发送到接收方P99<1秒),以上仅为推算冻结的计划输入,P0另核本地验收预算与夹具可执行性,P9真实压测实测;总队列/最老积压/增长与重连等未冻结生产细项仍列后续待办,不作为P0本地技术验收前置条件。
|
|
1233
|
+
|
|
1234
|
+
两个隔离环境的独立验收之外,P2 起另设第三个受控切换数据集/键空间,不污染前述两套环境:切换期间保留该数据集同一 issuer、cluster、权威后端和控制权威,执行 All-in-One → 多节点池 → All-in-One。先停止新工作、排空原形态并取得快照,再改变放置;目标接流前核对消息/序号/ACK、对象 ID/版本/引用/摘要,恢复写入及原幂等请求重试。切换允许明确中断,不允许两个独立 control 集群同时管理该数据集;P8 起按有效租约交接。切换结果不能替代前述两个隔离环境各自通过。
|
|
1235
|
+
|
|
1236
|
+
### P0 实际配置、启动授权与运行断点
|
|
1237
|
+
|
|
1238
|
+
用户已授权Codex把两套隔离环境运行起来,分段执行、失败即停、不重签固定身份、不输出runtime.env;最新明确“当前验证1DH即可。完了最后整个工作区未提交变更提交到作为P0成果提交。”当前实际服务tag为docker-deploy-kite-dist2:p0-20261019-ready-event-id、Image ID为sha256:57d4bc6dcbf2b64f6d023e67329cc3717b0de3cb296dc5e2bae903ef6ecf9394;独立SDK冻结manifest SHA699163e1…、522文件/恰8授权overlay(SDK5+catalog/TLS3)用于最终验收,后改未重建入57d4服务镜像;host .env.dist2.example及既有unit已同步tag并独立留证。双形态基线/全15容器撤回恢复、NS退休/旧87a兼容恢复见0016–0053;0054记录Org/Cred ready event_id4文件TDD/全模块Org322+Cred133 PASS及vet、57d4两域6stage回滚恢复/4次同Kernel局部重启、每域15 Message/Group facts、两域共8次strict SQL和每域15 ready。catalog/TLS最终12 PASS、Ruff/Pyright0及legacy内嵌语法,runner22 PASS、Ruff18/Pyright9→0;SDK生命周期14/群206(432 deselected)/aid_store41分别PASS,5文件Ruff147/Pyright646逐条前后相同/新增0但exit1,有限行为回归及新增差异审查通过,不称全库静态全绿。独立SDK最终C2两域各6 PASS,verify/continue各一次、旧各4facts深prefix到5、同object私/公Storage v4→v5;最终18facts capture-only+29引用/每域61checks离线对账另记。03保留标准双协议/双scope能力而走真实默认1DH+aid,两域10007签名锚点sv1→5→6、复用冻结三成员旧targets、按移除后sv6/epoch0当前签名锚点构造负例并精确返回recipient_wrap_stale(-32000;非原sv5旧包原样重放)后显式fresh向Charlie解密/正ACK,共享root重连保持,SQL/日志留存后解散,清理后18facts strict保持。默认1DH wire与membership_snapshot固定3DH声明分别捕获;3DH/SPK兼容实现、异步尽力轮换/失败nonfatal/无全员屏障、无严格禁fallback开关、服务端未逐消息强校AAD sv/hash/chain、-32000与指定-330xx自动重试不匹配均保留,不宣称双路径全验或自动rewrap。历史10004原base/commit、10006失败proposal参数缺口及旧raw event_id缺失不因新路径成功倒推归因。runtime.env仅AUN_IMAGE已持久目标tag、其它字节/35CRLF及5app锚点保持、无重启/desired变更;122.56623秒最终静默及两域diagnostics通过,最终日志已分类并保留来源缺口。NS snapshot_pending 9/8不等于同步任务SQL pending0/retirement1;audit metrics404 unsupported及累计async send_error各5保留。45是已验专项子集;76项P0交付集(67项tracked变更+9项新文件)已核,排除CA运行CT日志及120639项运行/备份/身份/临时产物,仅留本地不删除;本交付集随本版本提交,提交/普通推送结果以实际Git及远端分支为准,线上AIO观察仍待;额外工作区7服务11个受影响Go包在Windows宿主test/vet均exit0,3166项顶层PASS、fail0、真实skip2(Console opt-in MySQL、Group需Linux的fsync);2077子事件不累计为独立用例,来源前后不变,索引R/current-workspace-selected-go-index-01.json(SHA9d4cb116e49285e0c49a41cb607f76419cca98a0982ed579eca5875992533375),额外源码尚未部署,不扩大已验57d4专项覆盖;线上对应日志确认待;P0默认1DH有限范围本地技术验收通过,历史证据/静态非零及日志来源缺口旁列,P1–P9、七天保留及内部小对象S3未实施,大文件继续外部OSS。;新增e2e_test_pull_backlog.py的catalog phase仅完成本地自检及真实AST异常分支模拟,直接相关异常捕获已最小修正;历史静态诊断仍非零、同范围新增0,证据backlog-script-final-review.json(SHA1a8e2008…)及backlog-default-typecheck-delta.json(SHA047374bf…);该脚本未部署、未live业务验收,不扩大1DH专项范围。
|
|
1239
|
+
|
|
1240
|
+
| 配置 | All-in-One | 多节点池 |
|
|
1241
|
+
| --- | --- | --- |
|
|
1242
|
+
| issuer / cluster | `aio-dist2.agentid.pub` / `aun-dist2-aio` | `pool-dist2.agentid.pub` / `aun-dist2-pool` |
|
|
1243
|
+
| infra project / 数据根 | `aun-dist2-aio-infra` / `./data-dist/dist2-aio` | `aun-dist2-pool-infra` / `./data-dist/dist2-pool` |
|
|
1244
|
+
| external network / 子网 | `aun-dist2-aio-net` / `172.31.91.0/24` | `aun-dist2-pool-net` / `172.31.90.0/24` |
|
|
1245
|
+
| CoreDNS / 入口 IP | `172.31.91.53` / `172.31.91.5` | `172.31.90.53` / `172.31.90.5` |
|
|
1246
|
+
| control / supervisor | `dist2-aio-control` / `auto` | `dist2-pool-control` / `report_only` |
|
|
1247
|
+
| NS HTTP / HTTPS、Gateway、Console | `48080` / `48443`、`50001`、`48876` | `58080` / `58443`、`60001`、`59876` |
|
|
1248
|
+
| Storage、Group、Stream | `49470`、`49480`、`49490` | `59470`、`59480`、`59490` |
|
|
1249
|
+
| Proxy、Leaderboard、Custody | `48890`、`48882`、`48630` | `59890`、`59882`、`58630` |
|
|
1250
|
+
|
|
1251
|
+
保留MinIO多源失败记录;官方同版binary 118849720字节及完整SHA-256已验,内部tag `aun-dist2-minio:RELEASE.2025-04-22T22-12-26Z-official-binary`已填两域runtime.env的AUN_MINIO_IMAGE(example默认仍原tag)。新pycache镜像最终ID `sha256:5e279a30730509b0d5389fd390c0adfffb68b588d77675b6ec5642a9078c7e30`,两域Docker healthy/streak0、真实readiness/S3及原marker同卷重建GET/List通过;不扩大为整体系停启、AUN Storage接入或P2迁移完成。以下仅核对现有镜像/网络,不重建网络。AIO因Windows excluded ports将49876/49890/49882改为48876/48890/48882,pool不变。
|
|
1252
|
+
|
|
1253
|
+
```powershell
|
|
1254
|
+
docker image inspect mysql:8.0 redis:7-alpine nginx:1.27-alpine coredns/coredns:1.11.3 docker-deploy-kite-dist2:p0-20261019-group-bootstrap --format '{{.Id}}'
|
|
1255
|
+
if ($LASTEXITCODE -ne 0) { throw '镜像核对失败,停止准备' }
|
|
1256
|
+
docker network inspect aun-dist2-aio-net --format '{{json .IPAM.Config}}'
|
|
1257
|
+
if ($LASTEXITCODE -ne 0) { throw 'aio 网络核对失败' }
|
|
1258
|
+
docker network inspect aun-dist2-pool-net --format '{{json .IPAM.Config}}'
|
|
1259
|
+
if ($LASTEXITCODE -ne 0) { throw 'pool 网络核对失败' }
|
|
1260
|
+
docker image inspect aun-dist2-minio:RELEASE.2025-04-22T22-12-26Z-official-binary --format '{{.Id}}'
|
|
1261
|
+
if ($LASTEXITCODE -ne 0) { throw '内部MinIO镜像核对失败,停止准备' }
|
|
1262
|
+
```
|
|
1263
|
+
|
|
1264
|
+
下列命令仅保留首轮infra启动形态(当时不含MinIO):control旧pyc问题用Compose新prefix绕开,随后严格TLS管理请求、实际业务进程与放置已核对;Audit advertise及按需w1 AIDs可写后已recreate退出0。SDK Tester也须新prefix,覆盖无需重建app镜像。MinIO后续同卷recreate及健康/原marker已通过,五app正常停启持久恢复已过,完整停用恢复与最终C2已证,MinIO原marker及最终日志已通过,当前继续C7收尾/旧同步任务残留与整体就绪门禁,不重复首启或重签。Nginx标准80/443仅本域网络监听,同宿主不证明跨主机/TLS。原始证据根 `C:/Users/ready/AppData/Local/Temp/aun-p0-runtime-9cgur0wq/`,详见审计0016至0050。
|
|
1265
|
+
|
|
1266
|
+
```powershell
|
|
1267
|
+
foreach ($dist2Mode in @('aio', 'pool')) {
|
|
1268
|
+
docker compose --env-file "./data-dist/dist2-$dist2Mode/runtime.env" -f ./docker-compose.dist2.infra.yml up -d mysql redis aun-dns nginx aun-control
|
|
1269
|
+
if ($LASTEXITCODE -ne 0) { throw "infra 启动失败:$dist2Mode" }
|
|
1270
|
+
}
|
|
1271
|
+
```
|
|
1272
|
+
|
|
1273
|
+
两Console已通过本域CA与公开高端口严格TLS登录及四管理GET;token只在内存。All-in-One不启动worker,push已toggle stopped(版本svc-toggle-1792399484518)。pool control保持report_only,通过现有 `POST /api/v1/desired-states/nodes/dist2-pool-control` 成功写入完整16项slots(每项slot_id=service_name),仅aun_console running、其余15项stopped,版本p0-pool-control-only。服务清单仍以Go managedServices为准,不用空清单/report_only代替;这些结果不代表业务/C2通过。
|
|
1274
|
+
|
|
1275
|
+
三个worker启动前分别写入完整16项全stopped desired(版本p0-worker-stopped-{1,2,3}),初始unmanaged且0进程已证实;随后enabled均managed健康,实际单活放置已核对。下列仅保留首启形态,不重复启停;三个项目ID/目录独立,不使用--scale:
|
|
1276
|
+
|
|
1277
|
+
```powershell
|
|
1278
|
+
try { foreach ($dist2Worker in 1..3) {
|
|
1279
|
+
$env:AUN_NODE_ID = "dist2-pool-w$dist2Worker"
|
|
1280
|
+
$env:AUN_DIST2_WORKER_PROJECT = "aun-dist2-pool-w$dist2Worker"
|
|
1281
|
+
$env:AUN_DIST2_AIDS_MOUNT_MODE = if ($dist2Worker -eq 1) { 'rw' } else { 'ro' }
|
|
1282
|
+
docker compose --env-file ./data-dist/dist2-pool/runtime.env -f ./docker-compose.dist2.worker.yml up -d --pull never
|
|
1283
|
+
if ($LASTEXITCODE -ne 0) { throw "worker 启动失败:$dist2Worker" }
|
|
1284
|
+
} } finally { Remove-Item Env:AUN_NODE_ID, Env:AUN_DIST2_WORKER_PROJECT, Env:AUN_DIST2_AIDS_MOUNT_MODE -ErrorAction SilentlyContinue }
|
|
1285
|
+
```
|
|
1286
|
+
|
|
1287
|
+
动态 worker 默认 disabled/unmanaged,先留证其不接任务,再通过控制中心逐个 enabled/managed,按下表逐服务配置单实例 running,核对 desired/observed、注册记录与真实进程收敛后再继续。服务名使用控制存储中的小写 `ca`;CA/Auth 同在 w1,保留现有身份本地目录耦合。
|
|
1288
|
+
|
|
1289
|
+
| 节点 | P0 单实例放置 |
|
|
1290
|
+
| --- | --- |
|
|
1291
|
+
| `dist2-pool-control` | 只运行管理面 `aun_console`;全部业务 stopped |
|
|
1292
|
+
| `dist2-pool-w1` | `gateway,auth,ca,org,credential,audit` |
|
|
1293
|
+
| `dist2-pool-w2` | `nameservice,group,aid_custody` |
|
|
1294
|
+
| `dist2-pool-w3` | `message,storage,stream,leaderboard,service_proxy` |
|
|
1295
|
+
|
|
1296
|
+
两形态均保持 `push` stopped,不开启 `multi_instance_enabled`。pool 固定入口目标必须与上表一致;All-in-One 的全部入口目标为 `control-internal.aio-dist2.agentid.pub`。这里的单活放置不是多副本准入。新87a09263目标、完整desired、真实schema和保留消息/双游标/对象持久基线已冻结;完整撤回恢复仍须对照该目标核验,不得把来源未核实的旧镜像作为回滚版本。
|
|
1297
|
+
|
|
1298
|
+
从零准备须在接流前通过现有 Console CA `GET /api/aun/ca/service-certs` 核对org/credential三个存在字段,仅全false时才单项`POST /api/aun/ca/service-certs/{aid}/generate`并重读。NameService不在该CA接口白名单,GET不列出且POST会拒绝,不能套用此方法;已获准仅在`prepare_dist_materials.py`的BUILTIN_SERVICES补nameservice并由既有TDD验证,再用原issuer只补缺身份、不加force,借CA启动时ImportCertificateDirectories导入并核对DB/文件/证书链;两域active P-256/signing、DB/文件hash与serial、keypair及链已匹配,重启后约4min错误0但不单独证明sync调用成功。当前org/credential已补齐;不得generate-all、覆盖原材料或重建Alice/Bob,部分存在须停止核查。输出只用字段allowlist,禁止打印runtime.env整行或凭据。
|
|
1299
|
+
|
|
1300
|
+
### P0 C2:隔离 Tester、TLS 与断点续跑
|
|
1301
|
+
|
|
1302
|
+
两形态分别执行以下准备与检查;先设 `$dist2Mode = 'aio'`,完成该形态后再改为 `'pool'` 重建参数。测试容器使用同一 AUN 镜像中的 Python,显式只读挂载现有 runner、SDK 源码及本域 CA bundle,只写本域 `acceptance` 目录;不复用历史默认跳过 TLS 的 Tester。下列准备不会向测试容器注入 `runtime.env` 或服务端私钥。
|
|
1303
|
+
|
|
1304
|
+
```powershell
|
|
1305
|
+
$dist2Mode = 'aio'
|
|
1306
|
+
$dist2Issuer = "$dist2Mode-dist2.agentid.pub"
|
|
1307
|
+
$dist2Root = (Resolve-Path "./data-dist/dist2-$dist2Mode").Path
|
|
1308
|
+
$dist2Acceptance = Join-Path $dist2Root 'acceptance'
|
|
1309
|
+
New-Item -ItemType Directory -Force -Path $dist2Acceptance | Out-Null
|
|
1310
|
+
$dist2Dns = if ($dist2Mode -eq 'aio') { '172.31.91.53' } else { '172.31.90.53' }
|
|
1311
|
+
$dist2Ports = if ($dist2Mode -eq 'aio') { @(48443,48876,50001,49470,49480,49490,48890,48882,48630) } else { @(58443,59876,60001,59470,59480,59490,59890,59882,58630) }
|
|
1312
|
+
$dist2Runner = (Resolve-Path ./tests/public_single_instance_acceptance.py).Path
|
|
1313
|
+
$dist2Sdk = (Resolve-Path ../aun-sdk-core/python/src).Path
|
|
1314
|
+
```
|
|
1315
|
+
|
|
1316
|
+
```powershell
|
|
1317
|
+
$dist2Docker = @('run','--rm','-i','--network',"aun-dist2-$dist2Mode-net",'--dns',$dist2Dns,
|
|
1318
|
+
'-e','SSL_CERT_FILE=/certs/aun-ca-bundle.crt','-e','REQUESTS_CA_BUNDLE=/certs/aun-ca-bundle.crt','-e','PYTHONPATH=/workspace/python/src','-e','PYTHONPYCACHEPREFIX=/tmp/runtime-pycache','-e','AUN_ACCEPTANCE_INSECURE_SKIP_TLS_VERIFY=0',
|
|
1319
|
+
'--mount',"type=bind,source=$dist2Root/certs/aun-ca-bundle.crt,target=/certs/aun-ca-bundle.crt,readonly",'--mount',"type=bind,source=$dist2Acceptance,target=/acceptance",
|
|
1320
|
+
'--mount',"type=bind,source=$dist2Runner,target=/runner/public_single_instance_acceptance.py,readonly",'--mount',"type=bind,source=$dist2Sdk,target=/workspace/python/src,readonly",
|
|
1321
|
+
'--workdir','/runner','--entrypoint','python','docker-deploy-kite-dist2:p0-20261019-group-bootstrap')
|
|
1322
|
+
'import aiohttp, cryptography, websockets, yaml; from aun_core import AIDStore, AUNClient; print(1)' | docker @dist2Docker -X utf8 -
|
|
1323
|
+
if ($LASTEXITCODE -ne 0) { throw 'Tester 依赖预检失败,停止验收' }
|
|
1324
|
+
```
|
|
1325
|
+
|
|
1326
|
+
按上表端口显式构造全部 URL;其中 Group 保留现有 HTTP 契约,其余入口验证 TLS。SDK 初次注册/连接仍会按本域标准 `443` 发现,因此测试容器必须连接本域网络与 CoreDNS,不能在宿主无参执行 runner。
|
|
1327
|
+
|
|
1328
|
+
```powershell
|
|
1329
|
+
$dist2Urls = @(
|
|
1330
|
+
'--nameservice-url',"https://${dist2Issuer}:$($dist2Ports[0])",'--console-url',"https://aun-console.${dist2Issuer}:$($dist2Ports[1])",
|
|
1331
|
+
'--gateway-url',"wss://gateway.${dist2Issuer}:$($dist2Ports[2])/aun",'--storage-url',"https://storage.${dist2Issuer}:$($dist2Ports[3])",
|
|
1332
|
+
'--group-url',"http://group.${dist2Issuer}:$($dist2Ports[4])",'--stream-url',"https://stream.${dist2Issuer}:$($dist2Ports[5])",
|
|
1333
|
+
'--proxy-url',"https://proxy.${dist2Issuer}:$($dist2Ports[6])",'--leaderboard-url',"https://leaderboard.${dist2Issuer}:$($dist2Ports[7])",
|
|
1334
|
+
'--custody-url',"https://aid-custody.${dist2Issuer}:$($dist2Ports[8])")
|
|
1335
|
+
```
|
|
1336
|
+
|
|
1337
|
+
runner 的 `network` 检查仍固定旧服务端口,不适用于本夹具,不能记为通过。先用其现有 `_probe_endpoint` 对标准发现入口和实际 URL 逐一检查 DNS/TCP/TLS,任一异常即停止并留存原始输出;该检查不代表业务、MinIO 或跨主机验收通过。
|
|
1338
|
+
|
|
1339
|
+
```powershell
|
|
1340
|
+
$dist2Probe = @'
|
|
1341
|
+
import json, sys
|
|
1342
|
+
from urllib.parse import urlparse
|
|
1343
|
+
from public_single_instance_acceptance import _probe_endpoint
|
|
1344
|
+
for endpoint in sys.argv[1:]:
|
|
1345
|
+
parsed = urlparse(endpoint)
|
|
1346
|
+
print(json.dumps({"endpoint": endpoint, "probe": _probe_endpoint(parsed.hostname, parsed.port or 443, parsed.scheme in ("https", "wss"), 8)}, ensure_ascii=False))
|
|
1347
|
+
'@
|
|
1348
|
+
$dist2Probe | docker @dist2Docker -X utf8 - "https://$dist2Issuer" "https://accept-alice.$dist2Issuer" "https://accept-bob.$dist2Issuer" "https://gateway.$dist2Issuer" @($dist2Urls | Where-Object { $_ -notlike '--*' })
|
|
1349
|
+
if ($LASTEXITCODE -ne 0) { throw '实际端口或 TLS 检查失败,停止验收' }
|
|
1350
|
+
```
|
|
1351
|
+
|
|
1352
|
+
首次建立本域固定Alice/Bob基线身份才显式允许创建;若首败发生创建前、确认从未有成功身份事实,续跑可沿用原初次创建授权。一旦已建立身份,后续停启/回滚/续跑删除 `--allow-create-identities`,复用同一identity-root,私钥丢失应失败。每次报告用新路径,不跳过TLS。aun_console校验必要服务注册/健康及十个Go服务,应在完整放置收敛后执行;AIO03首次建立两身份、pool04复用原身份,后续两域均禁用创建参数。历史注册type首败及正常消费ACK修复保留见审计0022–0025。
|
|
1353
|
+
|
|
1354
|
+
```powershell
|
|
1355
|
+
$dist2Checks = 'nameservice,aun_console,gateway_auth_ca,message,group,storage'
|
|
1356
|
+
$dist2Attempt = 'p0-c2-01'
|
|
1357
|
+
docker @dist2Docker -X utf8 /runner/public_single_instance_acceptance.py --target-mode local --domain $dist2Issuer --data-root /acceptance --artifact-root /acceptance/reports --identity-root /acceptance/identities --alice-aid "accept-alice.$dist2Issuer" --bob-aid "accept-bob.$dist2Issuer" --checks $dist2Checks --fail-fast --output "/acceptance/reports/$dist2Attempt.json" --allow-create-identities @dist2Urls
|
|
1358
|
+
if ($LASTEXITCODE -ne 0) { throw "C2 失败或未完成:$dist2Mode / $dist2Attempt" }
|
|
1359
|
+
```
|
|
1360
|
+
|
|
1361
|
+
`--checks`按顺序执行,`--fail-fast`遇FAIL/SKIP即停,后续所选项记NOT_RUN,任一失败/跳过/未执行均退出1。修复后从失败项及后续未执行项续跑;例如Group失败,改checks为`gateway_auth_ca,group,storage`并换新attempt。每进程须先gateway_auth_ca重建会话,仅选业务项会SKIP;未受影响的已通过项不重复。原始注册type、sender_aid/peer ACK及force历史只读造成clamp0失败均保留见审计0022–0025;现有runner等待pull仅传sender_aid/limit、正常消费后按seq>baseline和marker筛,baseline可force只读,最终单元22通过,Ruff/Pyright当时错误未增加但仍退出1,历史失败保留不豁免;本轮两runner文件Ruff18/Pyright9→0、22单测PASS(0.25s,final-summary记录实际tool输出,未另存pytest原始log),当前源码hash匹配;catalog/TLS三文件补修legacy worker TLS后最终冻结复验12PASS(0.96s)、静态0/内嵌语法已证,有限清单已闭合,历史/来源缺口旁列,当前默认1DH有限本地验收通过、Git/线上待。AIO04/pool05的Group/Storage三项续跑及历史NS/Console/Message结果保留为分轮证据;第二轮撤回恢复后,AIO05/pool06分别6 PASS、0 FAIL/SKIP/NOT_RUN、严格TLS且两身份created=false,见审计0047。失败群10000保留,本轮10001按runner成功路径解散/撤销,Storage临时对象删除;独立持久基线与恢复后完整C2已经另证,MinIO原marker及最终日志已通过,旧任务退休及有限本地就绪已证,最新状态见0054。
|
|
1362
|
+
|
|
1363
|
+
C2 不替代持久停启/回滚基线:runner 正常成功路径会解散临时 Group、删除 Storage 对象;两域失败群10000保留,另有持久群10002、Message SQL精确peer正ACK与旧消息、Group双join/双ACK及Storage旧对象摘要。五app正常停启前后SQL原行、SDK旧事实读回/继续写及schema保持已通过;完整C7仍须保留这些事实。Group非标准端口既有缺口继续如实登记,不用同宿主高端口成功证明P1跨主机/TLS。GW/NS必要修复、准备脚本TDD和NS材料匹配已过,首轮仅5app的C7部分演练恢复了desired/放置;第二轮全project停用/恢复、旧事实/继续写及最终完整六项C2已证,MinIO原marker及最终日志已通过,旧任务退休及有限本地就绪已证,最新状态见0054。从空库重建不算回滚。用户最终明确“按阶段执行:P0退休,7天保留单独实施”,群解散后业务数据保留七天的目标已确认;当前Group首次解散事务仍按stateGroupID立即删除列明的19张内容表,既有七天GC按消息/事件自身年龄计算,尚未实现从解散起算的七天保留。P0仅实施NameService同步任务终态退休:权威确认群为dissolved后,在同一事务持久归档终态原因并按sub_aid、document_sha256、document_updated_at、revision四字段CAS移除pending,不删除群业务数据或NS文档。七天保留和到期物理清理须后续调整Group事务与GC、核对身份墓碑/别名/未完成效果回执并独立验收;本轮不得记为已实现或验收通过。 终态退休实现367 PASS/真实MySQL1 SKIP、四包vet及新e294afe2镜像离线11项源hash/ELF验证通过;两域before快照pending各1/归档表不存在,NS正文hash/updated与旧任务一致、群终态/owner匹配并冻结完整墓碑行hash;现已完成两域升级→旧87a兼容回滚→恢复、各stage退休SQL与fresh003严格对账、最终C2各6 PASS及真实Storage v3读回/同object v4继续写,最终旧10001归档精确1/pending0及NS正文/完整群墓碑/旧3表结构/归一化DDL保持。新0069最终SQL为capture-only且reference_checked=false,另有两域26checks离线对账通过;不写成旧ref strict通过。fresh10005两域显式V2/签名状态/SQL/清理及pool重复confirm闭环已证,旧10004不逆推、完整窗非0;14:30 Pool Org/Credential HTTP200但instances空/no_active_instances的首FAIL保留;57d4两域分段部署/局部重启后15 ready已证,03默认1DH/清理及持久复验已证、最终默认1DH有限本地验收通过,Git/线上待,P0仍未签收。两域ignored runtime.env现仅AUN_IMAGE单行持久为ready-event-id,35CRLF/其它字节及5app锚点一致,无重启/desired变更,不入Git源码;当前45为已验专项子集,全工作区Git交付范围待审。
|
|
1364
|
+
|
|
1365
|
+
### P0 C7:撤回新增隔离部署与保留数据恢复(执行前门禁)
|
|
1366
|
+
|
|
1367
|
+
P0现已因真实Group首败获准补Gateway/NameService必要业务修复,必要GW/NS修复及准备脚本TDD已过;NS实际材料DB/文件/链匹配及约4min错误0已证(非sync成功证明),本轮已核Org/Cred4文件、catalog/TLS新增2项及SDK5文件,当前45项为已验专项子集,来源分列;用户授权整个工作区未提交成果P0提交,最终Git清单待审;旧87a目标schema无变更;本轮终态退休新增`agent_md_sync_retirements`归档表,additive schema已完成两域实际创建、旧87a兼容回滚及新e294恢复,旧3表结构/归一化DDL与归档/原事实保持;不是本轮全库DDL完全相同,不能沿用旧版本无变更结论。程序与schema不得合并标N/A。预P0没有这些新增隔离project,本次不是向既有线上AIO升级;程序部署撤回通过“停用两套隔离环境本阶段新增project(2个infra及3个worker)的全部15容器→保留容器/卷/身份,恢复本轮新目标镜像及P0部署”实现。不使用已知Group创建不就绪的旧候选或兼容证明不足的旧app7binary降级。撤回窗口新环境不可服务,不宣称在线无损;既有两套AIO始终不动,仅停5app后原样启动只算部分演练;以新revision关闭全部业务、停用全部project容器并按冻结目标恢复可验程序部署撤回,不要求删除容器。
|
|
1368
|
+
|
|
1369
|
+
1. 本次C7本地预算已冻结(审计0035):stopped收敛/依赖health/恢复后readiness各180s、graceful stop60s、每域持久verify/continue120s、C2单RPC20s(runner每check外层80s);非生产SLO。旧87a09263两形态目标快照及真实schema已冻结(审计0031):AIO14库185对象、pool14库177对象,仅AIO历史Push多8表,公共DDL一致;恢复分别前后对照,不能互相比hash。执行前分别补齐/核对目标T:镜像ID、当前Compose/runtime配置hash、schema指纹、完整desired/revision与pool 6/3/5放置、所有节点卷/身份及成功事实。持久断言必须包含Message SQL旧消息及`message_peer_slot_cursor(owner_aid,device_id,slot_id,sender_aid,ack_seq,head_seq)`精确旧行/正ACK,global `message_slot_cursor`仅safe兼容、不代表peer事实;另含Group消息/事件双join与正ACK、旧Storage对象ID/内容摘要及本域MinIO marker,不能只依赖会清理临时对象的C2。资料缺失先补齐,不开始撤回。
|
|
1370
|
+
2. 撤回时先停止新业务,通过现有 `POST /api/v1/desired-states/nodes/{node_id}` 为每节点发布**新revision、完整16 slots**:所有业务stopped,control的aun_console保留running至最后。核对每业务observed stopped且无实际进程、必要排空已完成,再按三个worker独立project各执行 `docker compose --env-file ./data-dist/dist2-pool/runtime.env -f ./docker-compose.dist2.worker.yml stop --timeout 60`(逐项目注入原AUN_NODE_ID/AUN_DIST2_WORKER_PROJECT);最后各自infra执行 `docker compose --env-file ./data-dist/dist2-{aio或pool}/runtime.env -f ./docker-compose.dist2.infra.yml stop --timeout 60`。必须停用每个新增project的全部容器,infra含MySQL/Redis/MinIO/入口/DNS;保留容器、卷、身份、数据目录和external network,不执行down删除容器或-v/--volumes,记录撤回后不可服务窗口及原AIO未受影响。
|
|
1371
|
+
3. 恢复时先以冻结T镜像/配置分批启动状态层/入口/Console;保留原卷/身份,pool control仍report_only,AIO保持已写入的业务stopped目标直到控制面可用。再以**新revision**重发T的完整desired及pool 6/3/5单活放置,分批恢复workers和业务;不倒退旧revision、不复活失效运行身份。若任一步失败立即停止后续动作并保留原证据。
|
|
1372
|
+
4. 恢复后先在连接SDK前逐形态核对schema指纹、Message精确peer旧行/正ACK与Group双join/正ACK,防止SDK初始化/读取补建零游标掩盖丢失;再读旧消息、Storage旧对象与MinIO原marker,验证继续写入。撤回/恢复影响整套业务,两形态须各完整执行恢复后的最终C2及适用专项;只有该轮首败后才从失败点续跑,不能沿用撤回前通过项。核对实际放置/desired-observed/健康与正常读写,分别记录撤回、保留事实和恢复结果;首轮仅desired停/恢复和5app停启已恢复实际15实例及pool control1+6/3/5,未停infra全部依赖,只记部分演练;第二轮已停用全15容器、恢复10依赖及control/新desired/worker,SQL-before-app/before-SDK保持,旧事实/继续写及post SQL通过;恢复后schema/身份材料/最终完整C2及readiness收敛已证;MinIO原marker及最终日志已通过,本轮新增退休实现已完成两域新→旧87a→新与原事实保持,退休专项终点e294及对应C2/持久/MinIO/诊断通过;当前57d4/独立SDK最终C2/持久/03/清理及配置已证;fresh10005 V2补证通过后的Pool首FAIL保留;57d4两域分段就绪已证,03默认1DH/清理及持久复验已证、最终默认1DH有限本地验收通过,Git/线上待,不预记P0本地验收通过。
|
|
1373
|
+
|
|
1374
|
+
### 2.0 共同门禁与执行记录
|
|
1375
|
+
|
|
1376
|
+
| 门禁 | 每阶段必须准备、断言和记录的事实 |
|
|
1377
|
+
| --- | --- |
|
|
1378
|
+
| C1 版本与隔离 | 代码 revision/工作区差异、镜像 digest、schema/config revision、issuer/cluster、Compose/挂载来源和数据隔离;测试实际镜像对应本次实现 |
|
|
1379
|
+
| C2 共同业务冒烟 | P0 固定身份/连接、P2P 发送/pull/ACK、Group、对象 put/get、公开发现和管理链路;后续能力累计加入,不逐阶段删减 |
|
|
1380
|
+
| C3 真实路径 | 实际 Gateway、业务运行实例、节点、owner/运行代际及路由;跨副本用例证明不同实例处理,不能仅记录容器数或请求成功 |
|
|
1381
|
+
| C4 接流与退出 | warming 可 attach 而不接客户端;draining 拒绝新工作但保留已有 owner/必要事件;记录本地门禁、传播预算、在途与排空结果,强退不算优雅退出 |
|
|
1382
|
+
| C5 成功与恢复 | 分开记录接纳、共享持久化、推送和设备 ACK;冻结设备信箱/群消息/群事件独立排序范围,验证幂等、受众隔离和已成功事实恢复 |
|
|
1383
|
+
| C6 兼容性 | 外部 RPC/HTTP、错误、设备/slot、E2EE 和数据格式兼容;适用的 Python/Node.js/Binary 及 Windows/Linux/macOS 路径分别留证 |
|
|
1384
|
+
| C7 回滚与证据 | 两形态分别完成下述回滚演练,保留成功共享事实;失败、skip、未执行和限制单列,缺证据不得完成 |
|
|
1385
|
+
| C8 同数据集切换 | P2 起双向形态切换,按阶段追加对象、消息/ACK、多 Gateway、owner 和控制权威证据 |
|
|
1386
|
+
| C9 背压与容量 | P0 冻结预算;P2 起记录在途字节、pending/发送队列、outbox、慢消费者及恢复;P4 起记录 G×B 连接、重连上限与演进门限 |
|
|
1387
|
+
| C10 真实部署 | P1—P4 完成本阶段跨主机私网/TLS、状态层客户端/切换专项,P8 控制权威切换,P9 完整主机故障域、入口/数据 HA、容量与灾备 |
|
|
1388
|
+
|
|
1389
|
+
每个 STEP 按“行为与影响范围 → 有效 Red → 最小 Green → 受影响单元测试/语言检查 → 实际镜像部署 → 双形态专项 → 回滚演练 → 恢复目标版本并最终就绪”执行。环境连接失败不充当功能 Red。pytest 使用 `-x` 并保存 node ID;Go 按包串行调用 `-failfast` 并保存包及测试名,当前包失败即停止后续命令,不能把 `go test ./... -failfast` 当成跨包自动停止。首次失败立即停止后续验收,记录失败点,修复后从该用例及其后未执行项续跑;只重跑受修改影响的已通过项。
|
|
1390
|
+
|
|
1391
|
+
`docker-deploy/tests/public_single_instance_acceptance.py` 已支持真实的 `--checks` 和 `--fail-fast`,P0 C2 按上一节执行。其他历史直接 Python 脚本没有统一的阶段选择/断点参数,部分主循环捕获失败后继续;不得给它们虚构 `--start-case`、`--fail-fast` 等参数,也不得将一次聚合运行当作合规的断点续跑。执行前核定真实 runner:能用 pytest node ID 的按单用例执行;缺失安全单用例/failfast 能力的先列为待补。退出码为零仍须核对内部失败、skip 或未执行项。
|
|
1392
|
+
|
|
1393
|
+
每个用例在执行账本分配测试 ID(含阶段、STEP、形态与尝试次数),关联审计 ID 和原始日志位置。至少记录:准入策略;版本、形态和数据集;运行目录、脱敏命令、开始/结束时间、耗时、退出码及结果;实际实例/owner;持久事实和容量断言;异常/故障注入、恢复与回滚动作;续跑起点及受影响回归项;最终工作就绪证据。令牌、私钥和明文凭据不进入账本或日志。
|
|
1394
|
+
|
|
1395
|
+
### 2.0 现有测试入口与使用方式
|
|
1396
|
+
|
|
1397
|
+
下表路径均为现有入口;它们提供可复用基线,尚不能直接组成 P0—P9 完整验收套件。仓库相对路径以 `D:\modelunion\kite` 为根;SDK 脚本位于 `aun-sdk-core/python/tests/`,在对应隔离环境的 Tester 中使用其实际挂载路径执行。每阶段须先核定所列入口的目标域、身份与副作用,固定旧拓扑、自动构建/重建或重启其他环境的入口不能直接用于 2.0。
|
|
1398
|
+
|
|
1399
|
+
| 入口 | 已核对路径与命令形态 | 证据边界 |
|
|
1400
|
+
| --- | --- | --- |
|
|
1401
|
+
| E0 部署静态基线 | 仓库根运行 `python -X utf8 -m pytest -x tests/unit/test_docker_distributed_compose.py tests/unit/test_docker_distributed_smoke_script.py tests/unit/test_distributed_single_instance_migration.py -q --tb=short`;P0 定向选择首个文件的 `-k dist2` | 已有 `test_dist2_*` 覆盖 infra/worker 隔离、入口/TLS/端口与 CT 写目录;静态测试不证明实际三 worker 或双形态运行通过 |
|
|
1402
|
+
| E1 身份、控制和发现 | 仓库根 pytest 入口:`extensions/services/codex-unit/test_stage0_runtime_identity.py`、`extensions/services/codex-unit/aun_console/test_stage1_control_plane.py`、`extensions/services/codex-unit/aun_console/test_control_plane_cluster_isolation.py`、`tests/unit/test_control_registry_watch.py`、`extensions/services/aun_console/test_control_plane_store_sql.py` | 使用 `python -X utf8 -m pytest -x 路径 -q --tb=short`,按 node ID 续跑;新运行代际、跨 control watch/readiness 与租约专项待补 |
|
|
1403
|
+
| E2 原业务脚本 | `integration_test_message_ack.py`、`integration_test_group_sync.py`、`integration_test_storage.py`、`integration_test_notify.py`、`integration_test_p0_common_gaps.py`、`e2e_test_v2_multi_device.py` | 真实直接脚本入口为 `python -X utf8 /workspace/python/tests/文件名`;`p0_common_gaps` 是历史命名,不代表 2.0 P0 已覆盖;按前述规则补齐单用例执行后使用 |
|
|
1404
|
+
| E3 服务 Go 单元测试 | 在 `extensions/services/{storage,auth,message,group,gateway,nameservice,stream,service_proxy}/go` 分别用 `go list ./...` 核对包,再逐包执行 `go test 包路径 -failfast -count=1`;续跑可用 `-run 测试名` | 花括号表示已存在的目录清单,逐目录执行,不是 shell 直接展开命令;每包检查退出码后才继续,跨进程/跨主机专项仍需独立验证 |
|
|
1405
|
+
| E4 Storage/HTTP 补充 | `extensions/services/storage/test_storage_go_contract.py`、SDK `e2e_test_group_fs_sdk.py` 为 pytest 入口;SDK `integration_test_nameservice_snapshot.py` 为直接脚本 | 对象、Group FS 与发现兼容基线;MinIO 迁移、跨副本竞争、动态 Nginx、ticket/Range 与故障专项待补 |
|
|
1406
|
+
| E5 Stream/Proxy/重连 | SDK `integration_test_stream.py`、`e2e_test_service_proxy_docker.py`、`integration_test_reconnect.py` 为直接脚本;服务 Go 入口见 E3 | 原业务和重连参考;执行前核定重启目标及恢复方式;SDK `integration_test_service_proxy.py` 是本地假客户端测试,不能替代真实 owner/隧道验收 |
|
|
1407
|
+
| E6 生命周期和准入 | 仓库根 pytest 入口:`tests/unit/test_launcher_control_supervisor.py`、`tests/unit/test_launcher_lifecycle_race.py`、`tests/unit/test_launcher_controlled_startup.py`、`extensions/services/codex-unit/aun_console/test_stage5_service_admission.py` | 本地执行/准入基线;节点 3→4→3、服务副本独立伸缩、主机失联及 fencing 尚须阶段专项 |
|
|
1408
|
+
| E7 旧三节点 smoke | `docker-deploy/tests/test_distributed_cluster_smoke.py`,现有参数有 `--compose-file`、`--env-file`、`--control-url`、`--service`、`--target-node`、`--timeout`、`--dry-run` | 默认仍固定旧节点/DNS,并可能构建/重建或迁移服务;只供已核定环境复用,不能直接充当 2.0 runner、三 worker、多活或回滚证明 |
|
|
1409
|
+
|
|
1410
|
+
|
|
1411
|
+
P0本地准备入口E8已于2026-10-19执行,以下5组均PASS;仓库根为 `D:\modelunion\kite`,每行单独执行并检查退出码,首次失败立即停止,修复后从该行续跑。证据为运行根 `p0-local-fixtures-verification.json`(含原始命令、目录、耗时和5项日志SHA)。这些现成单元/harness不调用业务服务,不构成负载、跨主机TLS、状态HA或生产RPO/RTO证明。
|
|
1412
|
+
|
|
1413
|
+
| E8本地夹具 | 执行目录(相对仓库根) | 已执行命令 |
|
|
1414
|
+
| --- | --- | --- |
|
|
1415
|
+
| backlog账本自检 | 仓库根 | `python -X utf8 aun-sdk-core/python/tests/e2e_test_pull_backlog.py --self-check` |
|
|
1416
|
+
| Message队满/排空 | `extensions/services/message/go` | `go test ./internal/rpc -failfast -count=1 -run '^(TestQueuedDispatcherReturnsBusyWhenQueueFull|TestQueuedDispatcherDrainingRejectsNewWorkAndWaitsForInflight)$'` |
|
|
1417
|
+
| Message排序/背压 | `extensions/services/message/go` | `go test ./internal/walqueue -failfast -count=1 -run '^(TestV2PendingPullSortsOutOfOrder|TestPendingPeerPredecessorIncludesAcceptedCommitRows|TestReserveTimeoutReturnsBackpressureError)$'` |
|
|
1418
|
+
| Group持久序号下界 | `extensions/services/group/go` | `go test ./internal/store -failfast -count=1 -run '^TestReserveGroupSeqsForLockedTxNeverFallsBelowDurableFloor$'` |
|
|
1419
|
+
| Gateway重连预算 | `extensions/services/gateway/go` | `go test ./internal/kernelrpc -failfast -count=1 -run '^(TestReconnectPolicyPingTimeoutUsesIndependentBudgetAndJitter|TestReconnectPolicyRateLimitUsesFixedCooldownAndFatalFifthAttempt)$'` |
|
|
1420
|
+
|
|
1421
|
+
服务实现变更后先构建和部署实际被测镜像,再运行集成/E2E;未完成部署的本地测试不能代表容器中新行为。四语言和 cross-SDK 的原入口见本指南历史章节,但须替换为该形态经核验的独立目标;旧用例仅在版本和影响范围仍有效时复用证据。
|
|
1422
|
+
|
|
1423
|
+
### 2.0 各阶段准备、验收与回滚专项
|
|
1424
|
+
|
|
1425
|
+
P0 可从现有代码、指南和部署文件开始;P1—P9 必须先取得上一阶段完整签收及普通推送证据,由用户线上运行、Codex 审阅对应版本和运行窗口日志,再收到用户继续指令。下表每行都须分别执行 All-in-One 和多节点池验收,适用的累计门禁持续有效。“待补”是执行工作,不能记为已覆盖或跳过通过;两个形态完成回滚并恢复本阶段目标版本、通过最终冒烟及专项、工作就绪后可记录本地技术验收通过;阶段Git交付和线上AIO观察/日志放行分别记录,P1及后续阶段仍等待对应线上审阅及用户继续指令。
|
|
1426
|
+
|
|
1427
|
+
| 阶段 | 可执行准备与现有入口 | 本阶段双形态验收重点及待补项 | 回滚演练专项 |
|
|
1428
|
+
| --- | --- | --- | --- |
|
|
1429
|
+
| P0 双形态基线 | infra/worker Compose、固定单活路由和隔离材料已落地;按前文补齐镜像、网络、control stopped 与 worker 准入;冻结 C2/确认/排序/容量、持久基线、回滚目标和快照;MinIO 可达;运行 E0、E1 与真实 C2 runner | All-in-One 正常停启后持久基线可读;池中三 worker 注册托管并证明真实放置;未托管节点不接任务、环境不串数据;五app正常停启持久恢复已过;首轮C7仅5app部分演练,第二轮全15容器停用、10依赖/control/新desired/worker恢复及SQL-before-app/before-SDK一致及旧事实/继续写/post SQL已证;恢复后schema/身份材料/最终完整C2及readiness收敛已证;MinIO原marker及最终日志已通过;NS退休代码367 PASS/真实MySQL1 SKIP及vet已证;新e294两域真实退休/旧87a回滚/恢复、最终C2各6 PASS、持久Storage v3→v4/正ACK及MinIO/诊断已过;fresh10005 V2/签名状态/SQL/清理及pool重复confirm闭环通过,原Pool Org/Cred首FAIL及历史10004/10006证据缺口保留;57d4双形态回滚恢复/局部重启、独立SDK最终C2/持久v4→v5、03默认1DH路径/清理/严格对账与配置持久化已证,最终日志已分类并保留来源缺口,P0默认1DH有限范围本地技术验收通过,Git/线上待;七天保留/物理清理尚未实施,Group非标准端口缺口保留 | 按已冻结快照以新 revision 恢复基线配置/desired/放置,保留身份与各节点数据卷;版本回退先核对 schema/事实兼容;最终恢复目标版本并就绪,不清库或重建身份 |
|
|
1430
|
+
| P1 运行身份/版本/readiness | 完成 P0;准备旧 heartbeat/deregister/stop、watch 断流/乱序/补拉、warming/draining 与真实私网 TLS 夹具;E1、E3 的 Gateway/发现测试、E6 | 单服务重启产生新运行身份,旧操作不能影响新实例;warming 业务 attach 不形成启动环或客户端接流;watch 追平;多节点合法运行记录及真实 endpoint/TLS 证据;缺失代际/矩阵用例先补 | 回退程序保留精确身份清理及新字段读取;配置回滚发布新 revision,旧记录/命令不能重新生效 |
|
|
1431
|
+
| P2 小对象 MinIO | 完成 P1;准备 localfs 全路径迁移清单/摘要、对象版本屏障、MySQL/MinIO 私网 TLS 和慢/断后端夹具;E2 Storage、E3 Storage、E4 | 两形态实际 MinIO;池中 S1 写 S2 读、并发版本/引用/配额/GC、旧节点永久退出仍可读;HTTP 不跳内网不可达 URL;在途字节背压及 C8 双向切换;迁移/故障/切换用例待补 | 使用仍能读取迁移对象及新写 MinIO 对象的兼容程序;保留迁移清单和旧文件,不能只改回 localfs 或撤销新元数据 |
|
|
1432
|
+
| P3 共享状态与可靠确认 | 完成 P2;冻结 Auth 临时状态、Message 临时信箱/ACK、Group 排序范围与四层成功映射;准备提交切点、DB/Redis 切换和积压夹具;E2、E3 Auth/Message/Group | 池中创建/消费、发送/pull/ACK 落在不同副本;永久丢失写入节点本地目录后已成功事实恢复;乱序/空洞、幂等/outbox、慢设备与背压;两形态 C8 保持消息/序号/ACK;共享状态和故障专项待补 | 回退兼容共享接纳、schema、outbox、幂等、序号和 ACK,不把成功事实退回仅本地 WAL;排空旧派发/claim 后恢复,重复请求不新增副作用 |
|
|
1433
|
+
| P4 多 Gateway | 完成 P3;准备至少两个跨节点 Gateway、业务全 Gateway attach、固定客户端落点/实际身份、目录代际、重连/G×B 预算和真实 Redis 切换夹具;E2 多设备/ACK、E3 Gateway、E5 重连 | All-in-One 单候选仍执行相同目录/claim;池中 A/G1 与 B/G2 的 P2P/Group/E2EE 和设备/slot 隔离成立;加入/正常退出/强停及节奏重连;跨 Gateway、目录故障和 C8 专项待补 | 缩回单 Gateway 前排空其他连接,按代际收敛 claim 并验证重连/pull/ACK;入口更新不宣称已有 WS 已迁移 |
|
|
1434
|
+
| P5 HTTP 动态发现 | 完成 P4;列出稳定公开 URL、Host/泛域名/TLS/Upgrade/ticket/Range;准备入口候选快照、watch 丢失、无效配置与平滑加载恢复;E3 NameService/Storage/Gateway、E4 | 两形态公开 URL/权限保持;池中加入退出自动更新 upstream,未 ready/draining 不接新 HTTP,watch 重启可恢复;动态 Nginx、陈旧预算、keep-alive 门禁与 C8 专项待补 | 恢复上一个已校验入口配置与当前仍合法的候选,保持稳定 URL/鉴权;既有长连接继续按排空协议处理 |
|
|
1435
|
+
| P6 资源 owner 与服务准入 | 完成 P5;逐服务核定状态、owner、独占任务/外部副作用和能力限制;准备 Stream/Proxy 创建、定向、结束与失联租约夹具;E3 Stream/Proxy、E5、E6 准入 | 单副本同样校验 owner;池中新资源跨 owner 分配,后续定向正确,退出不提前删已有路由,重入不双 owner;当前协议不支持续接的资源记录明确失败/重建;资源与 C8 专项待补 | 先结束/接替或按既有协议重建活动资源,再撤回副本准入;保留有效 owner 代际,不能只修改 owner 记录伪装连接迁移 |
|
|
1436
|
+
| P7 调度与生命周期 | 完成 P6;冻结加入/传播/排空/恢复预算和容量,准备节点 3→4→3、副本 1→2→3→2、分区/重入与滚动失败夹具;E6、E5 及累计 E2/E3 | All-in-One 精确 slot 串行停启和允许中断后的恢复;池中独立副本伸缩、优雅退出/强退区分、永久节点丢失无成功事实丢失、旧 stop 不误杀;真实生命周期及 C8 专项待补 | 以新目标版本恢复先前放置/兼容镜像,检查承接容量和排空;旧 stop/claim 不影响新实例,强退后的异常恢复另留证 |
|
|
1437
|
+
| P8 control 池与接管 | 完成 P7;准备共享 revision/watch、单有效调度者租约/term、目标 fencing、普通收敛与独占授权;准备暂停执行、迟到 stop、分区及 MySQL 切换夹具;E1、E6 | 单 control 仍使用同租约/fencing;池中至少两个 API 一致读写/watch,接管后旧 Leader 不能写目标,独占副作用无双 owner;控制权威切换、授权期限与 C8 专项待补 | 先完成控制租约交接/旧授权失效再回退单 control;使用可读新控制事实的版本,不能启动独立控制集群并管同一数据集 |
|
|
1438
|
+
| P9 生产故障域与容量 | 完成 P8 及 P1—P4 真实部署专项;准备真实入口/数据 HA、跨主机计算池与真实故障域、容量和 RPO/RTO、备份恢复/灾备演练;按最终生产命令清单运行累计 E2—E6 与各阶段专项 | 真实网络下两个形态均通过累计业务、优雅/异常主机故障、入口/control/状态层切换、容量/背压、备份恢复及 C8;本地 Docker 或旧性能门禁不替代生产证据,缺生产夹具记待补 | 兼容版本/配置回滚后成功共享事实保持;备份恢复在受控隔离环境验证冻结 RPO/RTO,不覆盖运行中已成功的新事实;恢复阶段目标生产版本并重新验证 |
|
|
1439
|
+
|
|
1440
|
+
### 2.0 回滚后恢复、最终就绪与签收
|
|
1441
|
+
|
|
1442
|
+
每阶段在两个独立对照环境分别演练回滚,不能只用一次同数据集形态切换代替。开始前记录兼容回滚程序/镜像、schema 与配置版本、准入/放置、数据快照和已成功事实清单;在阶段目标版本产生消息/序号/ACK、对象版本/引用等适用的新事实后,按该阶段流程停止新工作并排空,再发布兼容版本/配置。按本阶段已交付机制,回滚内容与恢复目标内容都以新 revision 发布,不倒退适用的 revision/term、消息序号或 ACK;P1 起新运行不复用旧运行身份,适用的 claim/授权不得复活已失效代际,其他仍有效实例的 owner/claim 按原设计保留。验证原数据与新成功事实均可读取/继续处理、幂等重试无重复副作用、权限/受众未扩大。禁止清库、删除卷、重新创建身份或丢弃新事实后重新跑通,冒充回滚成功;没有兼容回退程序或无法保持事实时,记录阻塞,不签收。
|
|
1443
|
+
|
|
1444
|
+
回滚演练完成后,重新部署**本阶段目标版本**及目标 schema/config/准入/放置,关闭故障注入,恢复正常网络、状态层、入口和控制权威,撤销仅为测试设置的临时路由/配置。再在 All-in-One、多节点池各运行最终 C2 和本阶段专项(受恢复动作影响的累计项同步回归),核对实际实例/owner、readiness、watch/desired-observed 收敛、在途/积压在冻结预算内;留下稳定服务域名可用、正常读写继续、无未处理异常或失效授权遗留的工作就绪证据。不可停在回滚版本、故障注入状态或“测试通过但环境未就绪”。
|
|
1445
|
+
|
|
1446
|
+
- [ ] P0 具备进入条件;P1—P9 的上一阶段签收有效且阶段版本已推送,用户线上运行后的对应版本和运行窗口日志已经 Codex 审阅,并已收到用户继续指令;本阶段 STEP 的 Red/Green、检查、实际镜像与适用 C1—C10 证据齐全。
|
|
1447
|
+
- [ ] All-in-One 独立验收、回滚、恢复目标版本及最终工作就绪全部通过。
|
|
1448
|
+
- [ ] 多节点池独立验收、回滚、恢复目标版本及最终工作就绪全部通过,真实实例/owner 路径可核查。
|
|
1449
|
+
- [ ] P2 起 C8 双向形态切换通过;P1—P4/P8/P9 对应真实部署专项通过。
|
|
1450
|
+
- [ ] 失败、未执行、skip、缺覆盖、强退与受限项如实列明;任何必需项缺证据则阶段保持未完成。
|
|
1451
|
+
- [ ] 执行账本关联测试 ID、操作审计 ID、原始命令/日志、耗时、恢复/回滚和最终就绪记录;本阶段双形态验收、回滚、恢复目标版本及最终工作就绪全部通过后,仅将本阶段相关变更独立 commit 并普通 push,记录分支、远端、推送时间及结果,提交hash以Git记录和最终回复标识,不为回填自身hash新增提交,然后停止。用户线上运行后,由 Codex 审阅对应版本和运行窗口日志,记录审阅结论,再收到用户继续指令后才进入下一阶段。推送失败保留原提交重试,交付保持未完成,不重跑无影响的已通过验收。
|