Files
NotesAgentic/docs/development/OpenNexus验收报告-2026-09-08.md

7.2 KiB
Raw Permalink Blame History

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=2498 项全部通过;首轮失败记录保留
前端类型 / 生产构建 通过;仍有既有大分块构建警告
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.rsunlockputpersist 调用。当前仅有实例内内存快照与 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 无法构建

真实基础镜像已包含系统用户 syncuseradd ... sync 返回 exit 9。将服务用户改为 opennexus,保留 UID 10001。修复后镜像构建成功并以非 root 用户运行,以下部署检查均使用修复后的镜像。

Sync 测试部署与真实服务结果

  • 地址:http://yui.kronecker.cc:18080。这是 API 服务,不包含桌面同步客户端或网页管理界面。
  • 服务器:Debian 13 x64Docker Compose;独立项目 opennexus-sync-test,配置目录 /opt/opennexus-sync。未修改原 Nginx 站点,未占用其他应用的 8080。
  • Sync 运行两个 Uvicorn worker,共享持久 staging;仅 18080 对外发布。PostgreSQL 和 MinIO 无宿主机公开端口。
  • 私有 BucketSync 使用独立、非 root 的对象存储账号;历史对象没有 DeleteObject 授权,删除权限仅用于 health-probe 前缀。
  • 服务器 .env/opt/opennexus-sync/test-account.json 为 root 所有、权限 600。后者含本轮独立随机测试账号,可由服务器管理员读取。SSH 密码未写入仓库、配置或报告。
真实服务操作 实测结果
从当前工作机访问公开 health / ready 200ready schema=1
100 MiB 对象上传、每 10 MiB 查询 offset、另一设备下载 长度 104857600SHA-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:00bc86618629af00d2937fdc5a5d63db3ff8450acf52f0636ec813c7f4902929MinIO 为 minio/minio@sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936eSync 镜像 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.logcredential-probe.log 保留三项失败断言。服务器对应记录为 /opt/opennexus-sync/acceptance.logacceptance-results.jsonfault-results.log。本地 .build 为忽略目录,不属于 Git 发布产物,也没有远端 CI 180 天留存保证。

完整 AI Vault 接入、OS 沙箱、Rust 扩展安装与回滚、Rust 同步 push/pull 和冲突 UI 仍未实现。生产备份恢复、所有故障边界、签名安装更新包和两台独立桌面设备 E-01–05 尚未验收。不得把当前服务协议测试称为完整客户端同步通过。