Files
matrix-screen-controller/各种归档/20260908_OTA1.1.0运行目录修复验收

1.1.0 OTA 运行目录修复验收

2026-09-08 已在测试设备实际完成 1.0.6 → 1.1.0。磁盘 VERSION、运行 API 均为 1.1.0,OTA worker Result=success,用户数据 421 个非 OTA 文件摘要完全一致,frpc 二进制摘要保持,服务仍 inactive / disabled。组件完整性校验通过,恢复事务、临时保护、恢复 unit/helper、上传包与工作目录均已清理。

正式产物为 发布更新相关/OTA数据包/1.1.0/matrix-screen-controller-1.1.0.ota,27998979 字节,SHA-256 为 7f33a417181633e1f4c77f48a3030d33f6c6e9578002e22f3b0487aff535eef8。发布时直接复制实机验收候选,逐字节确认一致,未重新构建。VERSION 保持 1.1.0,FEATURE_UPDATED_AT 为 2026-09-08T10:19+08:00。旧包摘要 379f80a30157e23d717157005ea246fa822529010c0f0295dcad5db3ceff42c5,完整旧产物和旧发布记录归档位置见根发布记录的 repairs 字段。

故障与修复

原 1.1.0 安装过程中,旧 unit 的 RuntimeDirectoryPreserve=restart 在独立 stop 时删除共享 /run 目录,升级日志和回滚日志连续 FileNotFoundError;独立组件监护恢复了 1.0.6。因此显示 1.0.6 代表升级失败恢复,不能宣称升级成功。

主服务改为 Preserve=yes。候选迁移入口在停止旧服务之前创建标准运行期 drop-in、daemon-reload 并核验有效策略;保护直到提交或恢复完成,随后清理。日志目录丢失会重建,写入失败保留有限缓冲,避免日志异常阻止恢复。该约束已写入 AGENTS.md、源码 README、稳定需求和测试流程。

首轮修复候选发现保护残留检查位置错误,安装后校验误拒绝本次事务保护。该候选未发布;完整板端测试 420 passed / 2 skipped 后进入迁移失败恢复,421 个用户文件和 frp 状态保持,原始失败原因和日志保留,临时事务清理通过。随后将残留检查移至事务开始之前,并新增组件校验允许本事务保护的回归测试。

验证及证据

  • 最终候选隔离目录完整 pytest:414 passed、9 skipped;完整其他离线依赖复制后验证,未引用历史镜像导出目录。最初仅解包 OTA 的隔离目录缺少镜像构建材料,已补全离线依赖后重新完整测试通过,无跳过失败用例。
  • 最终候选前端测试:76 passed;本机完整前端和 JavaScript 语法、文案目录检查通过。隔离目录重新打包通过,其测试构建不用于发布。
  • 最终实机 OTA 的完整 pytest:421 passed、2 skipped,358.28 秒。跳过为源码 OTA 不含镜像材料及已登记平台条件;保留完整测试门槛。
  • 真实 systemd 专用临时 unit 复现 restart 在独立 stop 时删除目录,生产保护函数验证 stop、restart、启动失败后请求/进度/日志字节不变,测试 unit 清理通过。该项未使用 systemctl 替身。
  • 实际 OTA 采样 7 次观察到临时保护存在、有效 Preserve=yes,请求/状态/日志均存在;最终保护清理成功。见 ota-evidence.json。
  • 从原 1.0.3 镜像已只读提取的真实解析器再次校验和解包最终候选通过,仅 software / wheelhouse 顶层,恰好一份 frpc 离线二进制。
  • 原有组件失败恢复、升级门槛、日志故障、同版本发布与发布失败原产物保留回归均包含在完整 pytest 中。原 1.0.3 worker 的隔离故障矩阵证据仍保留在 20260907 归档,该矩阵使用过 systemctl 替身,不替代此次真实 systemd 与真实 OTA 验收。

本次没有执行人工实屏视觉、断电或整机重启验收,不把软件成功等同于这些结果通过。升级前完整持久数据备份仅在设备受限临时目录保存,验收及发布完成后清理,不复制用户配置或凭据到普通归档。

设备临时验证目录及受限备份已清理。本机 如何测试/本机测试环境/work/ota-runtime-repair/ 的递归清理被自动安全策略拒绝(blocked by policy,未提供更具体原因),因此仍保留候选和隔离测试文件;它们不属于正式产物,不被后续构建引用。