--- id: T-002 title: 建立 domain 状态模型与 application 事件总线 phase: 0 deps: [T-001] status: DONE created: 2026-07-16 issue: null context_ref: cf9fc01c68476ba3ee4f69525958f2e62ba2d6ce claim_branch: null work_branch: agent/codex/T-002 write_paths: - docs/tasks/T-002.md - core/domain/ - core/application/ - docs/current-state.md --- ## 问题 / 背景 T-001 只建立了可编译骨架。后续清单、下载、安装、启动和 UI 都需要共享、稳定的软件状态模型,后台任务也需要通过统一事件通道与 UI 解耦。 ## 方案 1. 在 `core/domain` 定义 `docs/04-architecture.md` 已列出的 12 个软件状态及显式迁移表。 2. 提供状态合法性与迁移校验 API,非法迁移返回包含起止状态的稳定错误。 3. 在 `core/application` 定义 `docs/api.md` 已列出的事件类型与通用 `Event` 信封。 4. 建立带缓冲事件通道、上下文取消与关闭信号的 `Runtime` 骨架;关闭后拒绝新事件。 5. 使用表驱动测试覆盖合法/非法状态迁移、未知状态、事件发布、取消与关闭。 ## 验收要点 - 软件状态枚举与架构文档一致,不新增未定义状态。 - 表驱动测试至少覆盖 `not_installed → installed`、`running → downloading` 等非法迁移。 - application 事件类型与 `docs/api.md` 一致;未知类型不能发布。 - runtime 可以发布/消费事件,阻塞发布可由 context 取消,关闭后返回稳定错误。 - `cd core && go vet ./... && go test -count=1 ./...` 通过。 - modern 与 win7 两个目标继续可编译。 ## 边界(不改什么) - 不实现清单、下载、安装、授权等具体用例。 - 不引入 Gio、Windows API 或第三方依赖。 - 不修改 app UI 与平台层。 ## 协作约束 未启用 Gitea;本任务在 `agent/codex/T-002` 分支串行执行。新增写路径前必须确认不越过本文件声明范围。 ## 执行记录 - 2026-07-16:在 `core/domain/status.go` 落地架构文档中的 12 个软件状态、显式迁移表、状态合法性与迁移校验错误。 - 2026-07-16:表驱动测试覆盖正常下载/安装/运行/回滚路径,并覆盖跳过安装链、运行中下载、未知状态和同状态迁移等非法情况。 - 2026-07-16:在 `core/application` 落地 `docs/api.md` 已定义的 12 个事件类型、通用 Event 信封及支持缓冲、context 取消、幂等关闭的 Runtime 事件总线骨架。 - 验证通过:`cd core && go vet ./... && go test -count=1 ./...`。 - 验证通过:Go 1.20.14 + `GOWORK=off` 执行 core vet/test,确认共享核心兼容基线。 - 验证通过:modern Go 1.25.0 与 win7 Go 1.20.14 两个 Windows amd64 目标重新编译。 - 验证通过:`python scripts/validate_agent_context.py`、`python scripts/validate_harness_governance.py`。