Files
soft_quay/docs/current-state.md
T

10 KiB
Raw Blame History

当前实现状态

本文是可覆盖的项目级快照,记录代码与任务的现实状态,帮助 AI coding agent 避免只看计划而忽略仓库现状。 执行记录写进各任务文件(docs/tasks/T-<编号>.md)的 ## 执行记录,不要在本文重复维护完整执行日志。

职责边界

  • tasks/(docs/tasks/T-<编号>.md):任务规格、依赖、状态(frontmatter)和执行记录,一任务一文件。
  • 06-tasks.md:只读路线图,维护阶段划分、里程碑和待办池。
  • ../progress.md:可选历史归档 / 项目级大事记,不逐任务追加。
  • current-state.md:当前快照,可覆盖更新当前目录、当前命令、已完成摘要和下一步。

当前快照

  • 日期:2026-07-19
  • 阶段:Phase 2 已完成(T-201~T-204);Phase 3 的 T-301 可恢复下载队列、T-302 安装流程整合、T-303 失败处理/磁盘预检查与 T-615 staging 输出 I/O/磁盘满诊断整改已完成;审核整改 T-604~T-614 与 Phase 4 的 T-401 进程检测、受控启动和切换临界区复查、T-402 子软件更新编排、T-403 受限盒子自更新事务已完成
  • 技术栈:根 Go 1.25 workspace 只纳入 core/app-modern,app-win7/go.work 独立纳入 core/app-win7;版本闸门证明 modern Gio v0.10.1 与 win7 Gio v0.6.0 不交叉解析
  • 生产代码:core 已有 Catalog/本地状态/存储、共享 Windows 安全相对路径策略与静态跨实现 canonicalization/Ed25519 vector corpus(拒绝非法 surrogate、-0 和非唯一 Base64 signature,大整数保持 token)、安全 ZIP 解压/回滚原型及 T-302/T-303/T-615 安装 use case(core/application/install.InstallService 只取已过滤 Catalog entry + architecture,强制注入 disk/storage-failure/target-state checker;Extractor.ExtractVerifiedFileWithCheck 在同一普通文件句柄按 size→SHA-256→EOCD/ZIP64→严格 app.json→已规划 payload 的 staging 前预检→安全 staging 的顺序处理,空间要求为 payload+64 MiB,ZIP 输入错误与 staging 创建/write/sync/close 错误分界并保留原始 I/O 链;平台可识别的后者磁盘满返回 disk_full,其余输出 I/O 返回稳定 code 且不触发 switch;清理失败可观察,Recover 仅删除已验证 layout 内的残留 staging;每个实际 payload 文件 hash 与受验证 entrypoint/working directory/min_os/requires_admin 写入 installed-app;health 或记录写失败经 Switcher 回滚;更新 current→backup 紧邻前复查精确 entrypoint,明确运行/检测故障保持旧版本并清理 staging),transaction/switch/rollback/recovery 的 journal、rename、清理经统一 fail-closed 耐久栅栏,Windows 使用目录句柄 FlushFileBuffers)、纯 core application/launch(只接收 app ID、受控 current/普通 entrypoint/兼容/授权/运行状态/启动器接口全部 fail closed)、双端 Toolhelp 完整映像路径检测/Win7 可用系统版本判断/无参数受控启动与非 Windows fail-closed stub、发布稳定只读 generation 的无 IO 软件列表模型、按 key in-flight + 流式有界读取 + 32 MiB/256-key LRU 的可信图标缓存、图标 Load/Decode 事件发布用例、有界 application event relay,以及默认并发 2 的持久可恢复下载队列;modern/win7 主循环已接 relay/Invalidate,AppShell 已实现搜索/分类/视图、惰性列表、详情右栏、完整图标失败 identity 生命周期与仅 unsafe_cache 可见的安全 locator/人工恢复提示,并按 root/header/catalog/detail/style 同 package 镜像职责拆文件
  • T-402 更新用例:core/application/update 只接收外层可信的 install selection,验证已装版本/旧 entrypoint后,运行中才请求关闭确认并以 1 秒~10 分钟上限等待自然退出,随后委托已有 InstallService 的双重运行复查与 rollback;取消、超时、Toolhelp 检测错误和安装错误均保留稳定 code/错误链,不强杀且不改 data/、licenses/。两端 platform 对齐 WaitForExit 契约,Windows 固定短轮询完整路径,非 Windows 返回明确不支持。
  • T-403 自更新:core/updater 只接受正 PID、真实 <root>/app 与同 root <root>/staging/<safe-request-id>,先等待旧 PID 自然退出,随后恢复遗留 journal 或以 prepared → target_backed_up → staging_activated → launched → committed 切换;目录 rename、原子 JSON 和目录 durability 均由受限路径与平台同步栅栏保护。助手只启动固定 <root>/app/SoftBox.exe --softbox-update-health <request-id>,主程序在 Gio Layout 前从自身 EXE 写最小 health 确认;失败优先恢复旧 app,Windows 锁阻止恢复时保留 backup/journal,不强杀。两端有无 Gio cmd/softboxupdater,非 Windows 平台边界 fail closed;没有自更新下载、签名消费、版本选择或 UI 触发器。
  • 测试:core 覆盖 Catalog 静态 canonicalization/Ed25519 vectors、非法 surrogate/-0/Base64 fail-closed、列表快照 generation/零复制、SemVer/12 状态、本地安装记录、Windows dot-space/设备名/Unicode 折叠路径攻击、ZIP destination 包含性与 EOCD/ZIP64 原始包/中央目录/条目数预扫描、T-302/T-303/T-615 同句柄 package size/SHA、严格/有界 app.json、verified payload 预检 hook、容量精确阈值/故障、程序运行/状态故障、稳定安装失败码、staging write/sync/close ENOSPC 与普通输出 I/O 原因保留、CRC 输入分界、清理失败/受控恢复、payload hash 与启动元数据记录、Catalog 选择拒绝、transaction recovery、health/记录写失败回滚、switch 临界区复查、受控启动的旧 metadata/unsafe layout/缺文件/兼容/授权/运行/启动失败、payload/staging tree/journal/rename/rollback/recovery/cleanup 耐久顺序及错误注入、Windows 原生目录 FlushFileBuffers、图标并发/取消/读取边界/LRU、真实目录/symlink fail-closed 与 cache→unsafe_cache event、relay 背压与关闭、下载并发/暂停/取消/重试/Range/断连/恢复/事件失败与文件身份替换;两个 app 覆盖 Toolhelp snapshot full-path collision/error seam、OS version 判断和非 Windows fail-closed stub,以及 Editor/视图/分类/行/恢复/关闭接线、500 项 viewport、AppID 控件与分类控件生命周期、详情上下文、空状态语义、UI drain 前后、图标失败身份生命周期与 unsafe_cache 详情语义;安装恢复矩阵保持通过
  • 数据:schemas/ 已有 manifest/app.json/installed-app.json/download-task.json v1 Schema并注明 Windows 路径运行时权威规则;testdata/catalog/ 有公开虚构清单样例和 v1 静态 canonicalization/Ed25519 corpus;testdata/zip/ 与 testdata/download/ 记录运行时生成的攻击/传输矩阵
  • 标准启动路径:./init.sh / ./init.ps1(同步依赖、执行完整 Phase 0 闸门、打印双目标构建命令)
  • 标准验证路径:bash scripts/verify_phase0.sh / ./scripts/verify_phase0.ps1
  • 版本管理:git 已初始化,main 分支,远端 origin 为 Gitea opc/soft_quay;harness 文档已提交
  • 当前 blocker:dist/SoftBox.exe 只创建空 Gio shell,尚未向 AppShell.SetItems 投递已验证 Catalog/cache 快照;T-616 已正式落成以补齐后台投递和稳定空态诊断。真实 Catalog URL/公钥/发布配置仍未入库,不得用 testdata、未签名本地文件或 allow-all verifier 伪装可用列表。可信自更新包下载/签名、版本选择、许可证策略与完整端到端 cmd/UI 编排也仍未装配。T-614 的外部 softbox-catalog 消费 corpus CI 证据仍需跨仓库协调;物理断电、文件锁/杀毒软件干扰和真实图形环境仍需 T-601 的目标 Windows VM/真机故障注入

当前目录要点

路径 状态 说明
docs/ 已有 harness coding 文档集(本次初始化完成)
docs/tasks/ 已有 Phase 0~2、T-301~T-303、T-604~T-615、T-401~T-403 已完成;T-616 已正式落成,正在执行
scripts/ 已有 harness 治理、core 边界、Go 版本检查与 Phase 0 双平台验证入口
core/ 已建 Go 1.20 兼容;已有正式 Catalog、本地状态/存储、共享 Windows safepath、列表模型、有界并发图标缓存、图标事件/relay、可恢复下载队列与 Phase 1 安装安全原型
app-modern/ 已建 Go 1.25.0 + Gio v0.10.1;Modern AppShell 已接入虚拟列表、详情、图标事件 drain/过期拒绝和内存 ImageOp,并拆为五类 shell 职责文件
app-win7/ 已建 Go 1.20 + Gio v0.6.0;Legacy AppShell 已接入低成本列表、详情、图标事件 drain/过期拒绝和内存 ImageOp,并保持同名职责文件与版本差异
schemas/ 已建 manifest.schema.json、app.schema.json、installed-app.schema.json 与 download-task.schema.json
testdata/ 已建 包含 Catalog 假数据、ZIP 恶意矩阵与下载协议测试说明;后续任务继续扩展

任务状态

任务状态以 docs/tasks/ 各任务文件 frontmatter 的 status 为准。本节只写项目级摘要:

  • 已完成:Phase 0 的 T-001~T-004;Phase 1 的 T-101、T-102、T-103;Phase 2 的 T-201~T-204;Phase 3 的 T-301~T-303 与 T-615;审核整改 T-604~T-614;Phase 4 的 T-401~T-403。
  • 正在进行:T-616(依赖 T-204/T-607 已完成);完成、验证并提交后,再按路线图正式落成 Phase 5 的 T-501。T-601 的物理断电与干扰故障注入仍保留为发布前环境验证。

当前可运行内容

# 统一依赖同步 + 完整 Phase 0 验证:
./init.sh
# Windows PowerShell 使用 ./init.ps1

# 直接运行验证闸门:
bash scripts/verify_phase0.sh
# Windows PowerShell 使用 ./scripts/verify_phase0.ps1

开始编码前检查

开始任意任务前:

  1. 读仓库级 agent 规则文件 AGENTS.md。
  2. 读 docs/00-ai-start-here.md。
  3. 读 docs/05-coding-rules.md。
  4. 在 docs/tasks/ 找到 frontmatter status: TODO 且依赖均 DONE 的任务文件;暂无任务时,先按 docs/06-tasks.md 路线图落成任务文件。
  5. 在独立分支 / worktree 把任务改为 DOING。

维护规则

当实际代码状态发生变化时,同步更新本文件:

  • 新增或移动入口文件。
  • 初始化框架或模块。
  • 新增可运行命令。
  • 发现文档和代码现实不一致。
  • 阶段、项目级 blocker 或可领取任务摘要发生需要跨会话保留的变化。

同时注意:

  • 任务长期状态改在对应任务文件的 frontmatter;每轮执行记录、验证命令、阻塞点和关键决策写进该任务文件的 ## 执行记录。
  • 本文件只保留当前快照,不保留完整历史。