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

79 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OpenNexus 验收报告(2026-09-08
结论:**全量生产验收未通过;Sync 独立 HTTP 测试服务已部署并通过本轮服务集成检查。**
代码基线为 `e064f46`,工作树为 `G:\OSProject\NotesAgent-phase3`。部署中修复了 Dockerfile 系统用户名冲突;部署镜像标识为 `opennexus-sync:e064f46-audit1`。用户明确要求临时测试环境,无需 HTTPS。个人 Vault 的三处已有改动未纳入验收或提交。
验收标准采用[第三阶段生产化规划](../architecture/第三阶段生产化工程规划与验收目标.md),逐 ID 结果见[机器可读报告](OpenNexus验收报告-2026-09-08.json)。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](../../frontend/src-tauri/src/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](../../frontend/src/services/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 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: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 尚未验收。不得把当前服务协议测试称为完整客户端同步通过。