7.2 KiB
OpenNexus 验收报告(2026-09-08)
结论:全量生产验收未通过;Sync 独立 HTTP 测试服务已部署并通过本轮服务集成检查。
代码基线为 e064f46,工作树为 G:\OSProject\NotesAgent-phase3。部署中修复了 Dockerfile 系统用户名冲突;部署镜像标识为 opennexus-sync:e064f46-audit1。用户明确要求临时测试环境,无需 HTTPS。个人 Vault 的三处已有改动未纳入验收或提交。
验收标准采用第三阶段生产化规划,逐 ID 结果见机器可读报告。30 个完整验收 ID 中,0 个具备该行全部断言的通过证据;这是发布门禁结果,不表示所有已实现功能失效。统一生产验收 runner 尚未交付,本次没有声称执行该 runner。
已执行检查
| 检查 | 结果 |
|---|---|
| AI Core 后端 | 894 项通过,0 skip |
| Sync 隔离协议测试 | 23 项通过,SQLite,不替代下方真实服务检查 |
| Community | 13 项通过 |
| 前端首轮 | 497 通过、1 失败:EditorPane 源码编辑器等待渲染超时 |
| 前端复跑 | --maxWorkers=2,498 项全部通过;首轮失败记录保留 |
| 前端类型 / 生产构建 | 通过;仍有既有大分块构建警告 |
| Rust desktop 全目标 | 21 项通过:库 15、桌面命令 3、包校验 1、真实 Core 集成 2 |
| Rust fmt / Clippy | 通过,Clippy 使用 --features desktop --all-targets --locked -- -D warnings |
| 打包 Core | 独立可执行文件的 4 项测试通过 |
| 三服务隔离冒烟、文档链接、代码 diff 检查 | 通过,diff 排除个人 Vault |
| 新增桌面取消 / 超时探针 | 2 项失败,见 F-02 |
| 新增凭据并发写入探针 | 1 项失败,见 F-01 |
本地 Windows GNU 工具链为 1.98.1;未将其作为 MSVC 签名发布证据。首轮同时运行 Rust 编译和前端测试,前端限并发复跑成功与负载有关,但单次复跑不能证明该等待问题已消除。
阻塞问题
F-01 / P1:多个已解锁凭据实例会丢失已提交记录
两个 CredentialBroker 打开同一快照后,A 写入 first 并成功返回,B 写入 second 并成功返回。重新解锁快照,first 已不存在。新验收探针复现失败,输入均为临时目录中的虚构秘密。
代码位置:credentials.rs 的 unlock、put 和 persist 调用。当前仅有实例内内存快照与 Mutex,没有保险库跨实例写锁或磁盘版本冲突检测。桌面 Host 未限制整个应用为单实例,因此这不是仅通过测试构造才能出现的使用方式。
修复退出条件:同一保险库最多一个写入拥有者,或持久化前执行不可绕过的版本 CAS;并发、迁移和改密冲突必须拒绝或合并,已成功提交记录不得丢失。关联 B-04 和凭据发布安全门。
F-02 / P1:普通桌面请求忽略取消和自定义超时
在调用前已 abort 的 POST 仍进入 hostInvoke('core_request') 并返回成功;设置 1 ms 超时、模拟 Host 30 ms 后响应,仍得到成功结果。两项独立探针均失败。
代码位置:apiClient.ts 的 desktop 分支。AbortController 仅连接 Web fetch,原生命令没有取消标识或截止时间;超时标记只在异常分支检查。SSE 的独立取消测试通过,不能覆盖常规 JSON/二进制请求。
修复退出条件:调用前取消不得发出请求;在途取消由 Host 跟踪;超时必须返回稳定错误;已经提交的变更提供可查询操作结果,不能依靠自动重试掩盖结果未知。关联 A-03。
F-03 / 已修复:Dockerfile 无法构建
真实基础镜像已包含系统用户 sync,useradd ... sync 返回 exit 9。将服务用户改为 opennexus,保留 UID 10001。修复后镜像构建成功并以非 root 用户运行,以下部署检查均使用修复后的镜像。
Sync 测试部署与真实服务结果
- 地址:
http://yui.kronecker.cc:18080。这是 API 服务,不包含桌面同步客户端或网页管理界面。 - 服务器:Debian 13 x64,Docker Compose;独立项目
opennexus-sync-test,配置目录/opt/opennexus-sync。未修改原 Nginx 站点,未占用其他应用的 8080。 - Sync 运行两个 Uvicorn worker,共享持久 staging;仅 18080 对外发布。PostgreSQL 和 MinIO 无宿主机公开端口。
- 私有 Bucket,Sync 使用独立、非 root 的对象存储账号;历史对象没有 DeleteObject 授权,删除权限仅用于 health-probe 前缀。
- 服务器
.env与/opt/opennexus-sync/test-account.json为 root 所有、权限 600。后者含本轮独立随机测试账号,可由服务器管理员读取。SSH 密码未写入仓库、配置或报告。
| 真实服务操作 | 实测结果 |
|---|---|
| 从当前工作机访问公开 health / ready | 200,ready schema=1 |
| 100 MiB 对象上传、每 10 MiB 查询 offset、另一设备下载 | 长度 104857600,SHA-256 一致 |
| 上述对象重复 complete 100 次 | 全部成功;本次往返加重试用时 5.611 秒,不作为性能基准 |
| 20 个并发客户端线程,共 100 次同 file/base 不同 operation_id 提交 | 1 成功,99 次 409 |
| 成功提交再重复 100 次 / 复用同键改变 payload | 返回相同修订,changes 仍只有 1 条 / 改 payload 返回 409 |
| 未认证访问对象 100 次 | 全部 401 |
| 撤销第二设备后的下一次访问 | 401 |
| 暂停该测试栈 MinIO,随后恢复 | 首次观察到 ready=503 为 3.005 秒;恢复后首次 200 为 0.767 秒;未覆盖所有 worker、DB/staging 故障矩阵 |
| 重启 Sync 容器 | 6.339 秒后 ready=200;已提交 100 MiB 对象长度与摘要仍一致 |
镜像锁定记录:PostgreSQL 为 postgres@sha256:00bc86618629af00d2937fdc5a5d63db3ff8450acf52f0636ec813c7f4902929;MinIO 为 minio/minio@sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e;Sync 镜像 ID 为 sha256:073e4da92f1d15a8548b25ba85a095a8db34386036b136e1fa5d47e4f3c2d0f9。尚未完成漏洞扫描、生产 TLS、备份恢复及 30 分钟负载门禁。
运维检查:sudo docker compose -f /opt/opennexus-sync/compose.json ps。只停止该测试服务可执行 sudo docker compose -f /opt/opennexus-sync/compose.json stop sync;保留 volumes,不使用 down -v。故障测试结束时 MinIO 已恢复,三个服务均运行。
证据与剩余范围
原始命令、耗时、日志、JUnit、探针源码位于工作树 .build/acceptance/e064f46/。checks.json 保留首次前端失败;frontend-retry.xml 是独立复跑结果;transport-probe.log 和 credential-probe.log 保留三项失败断言。服务器对应记录为 /opt/opennexus-sync/acceptance.log、acceptance-results.json、fault-results.log。本地 .build 为忽略目录,不属于 Git 发布产物,也没有远端 CI 180 天留存保证。
完整 AI Vault 接入、OS 沙箱、Rust 扩展安装与回滚、Rust 同步 push/pull 和冲突 UI 仍未实现。生产备份恢复、所有故障边界、签名安装更新包和两台独立桌面设备 E-01–05 尚未验收。不得把当前服务协议测试称为完整客户端同步通过。