# 双实例放行前检查单(协作存储 U7) 协作存储方案 §5 U7 的放行出口要求:**单实例团队、双进程、双主机分别出具 结果;CI 身份/链接/SHA 或独立 REPLAY 可核验才用于放行,本地 SELF 只作辅助。** 本检查单列出每一放行条件、其证据来源与当前状态;未全部满足前,第二实例 不得承接写请求、双主机部署不得开工。 状态图例:✅ 已满足(证据可核验)|⏳ 入口就绪、待执行窗口|❌ 未开始。 ## A. 正确性与故障矩阵(代码与 CI 可覆盖) | # | 条件 | 证据(命令/测试) | 状态 | |---|---|---|---| | A1 | 单实例全链路(mock):认证/项目/会话/SSE/检索/卡片 | backend `go test ./...`(CI job `test`,SQLite 档 35+ 包) | ✅ CI 绿 | | A2 | 真 PG/Redis 全量 | `make test-backend-pg`(CI job `test-pg`,AGENT_PG_TEST_DSN 必跑) | ✅ CI 绿 | | A3 | 磁盘满清楚拒绝、零残留、可恢复 | backend `TestUploadRejectsCleanlyWhenObjectDirUnwritable`、`TestArtifactOverwriteRejectsCleanlyWhenObjectDirUnwritable` | ✅ CI 绿 | | A4 | 恢复隔离(未知副作用不自动重跑) | backend `recovery_hold_test.go`(U3) | ✅ CI 绿 | | A5 | 库级多实例语义(争抢/围栏/命令/跨实例 resolve 不落卡) | backend `runmgr/multi_instance_test.go`(真库门控) | ✅ CI 绿 | | A6 | **双进程 HTTP 级验收**(跨实例读/SSE/409/HITL/取消/崩溃恢复/重启不变量) | `make test-multi-instance`(CI job `test-pg`;本地 `tests/integration/multi-instance/README.md`) | ✅ CI 绿 | | A7 | 权限矩阵重放(撤权零泄漏:请求/SSE/检索/下载/工具) | backend `resource_authz_test`、`shared_*_test`、`sse_gap_test`、`pgvector_test`(U3/U6) | ✅ CI 绿 | ## B. 容量与负载合同(需要实测窗口,本地入口已就绪) | # | 条件 | 证据(命令) | 状态 | |---|---|---|---| | B1 | 冒烟压测通过(入口可复核、不变量零违反) | `tests/load/collaboration/run_load.sh --profile smoke` | ✅ 已跑通(SELF,2026-10-12:读 P95<1ms、SSE P95≈18ms、对账 0 违反) | | B2 | 阶梯负载 10→30→100 用户,读 P95≤300ms、P99≤1s、非预期失败≤0.1% | 同上 `--profile ladder`(k6 需安装:`brew install k6`) | ⏳ 待窗口 | | B3 | 60 分钟稳定负载 + 2 小时混合长稳 | `--profile sustained60m` / `--profile sustained2h` | ⏳ 待窗口(约 3h 机时) | | B4 | SSE 持久事件可见延迟 P95≤1s | 同上套件自动执行(sse_probe,断言即退出码) | ✅ 冒烟档已证机制;正式窗口随 B3 | | B5 | 数据量档(100 万消息/10 万知识分块/多项目交叉授权) | `run_load.sh --seed tiny\|contract`(`tests/load/collaboration/seed/`;tiny 冒烟 ✅;contract 满量待窗口) | ⏳ 入口就绪 | | B6 | 数据库基线(pgbench 只测 DB 能力,不替代业务验收) | `pgbench` 对隔离实例(只读参考) | ❌ 未执行 | | B7 | 容量数字绑定组件 SHA/配置/数据集归档 | results// 目录 + 报告引用 SHA | ⏳ 随 B2/B3 产出 | ## C. 双进程与双主机放行(分布式出口) | # | 条件 | 证据 | 状态 | |---|---|---|---| | C1 | 双进程共享 PG:正确性矩阵全过(A6) | `make test-multi-instance` | ✅ | | C2 | 双进程**负载**下互相不拖累(热点会话/命令时延) | `run_load.sh --instances 2`(VU 粘滞 + 跨实例读 + 热点 409;smoke 入口 ✅;正式阶梯/长稳待窗口) | ⏳ 入口就绪 | | C3 | 双主机(跨机网络)验证:同套验收在两台主机执行 | A6 的 AGENT_BIN/DSN 指向远端;需用户指定第二主机 | ❌ 待资源 | | C4 | 故障演练:PG 断连/Redis 断连恢复(RTO≤15min) | backend ratelimit/recovery 测试 + 运维手册演练记录 | ⏳ 代码级 ✅;运维演练待窗口 | | C5 | 备份恢复演练(RPO≤5min/RTO≤60min,pg_dump+物理备份) | U4 迁移演练已过;定期备份恢复演练属运维,待排期 | ⏳ | ## 放行结论(当前) - **单实例团队档**:A1–A7 全绿 + B1 冒烟通过。正式容量结论待 B2/B3 窗口; 在此之前按「已验收功能、未承诺容量」运营。 - **双进程档**:正确性已证(A5/A6/C1),负载与运维演练(C2/C4)未过, **不放行第二实例承接写请求**。 - **双主机档**:未开始(C3),不放行。 ## 已知边界与诚实声明 - U7 期间经双进程验收发现并修复三个跨实例缺陷(详见 `tests/integration/multi-instance/README.md`):HITL resolve 落卡短路命令、 cancel 命令空会话 ID、CancelRun 假成功。修复均已入 CI 回归。 - k6 首次冒烟使用临时二进制(v2.3.0)验证后删除;正式窗口前按 `brew install k6` 装固定位。 - B5 seed(tiny/contract)与 C2 `--instances 2` 入口已就绪;满量 contract 与双实例 正式阶梯/长稳仍待用户指定窗口,入口不预填容量结论。