Constraint: 在线热修前必须保存当前迭代分支全部有效代码进展 Confidence: medium Scope-risk: broad Directive: 后续修改需保持审计事件与业务事务边界一致 Tested: git diff --cached --check Not-tested: 未运行全量测试,提交用于切换分支前保存既有工作
4.3 KiB
4.3 KiB
0. 七月分支基线与边界
- 0.1 在
Iteration/7-11记录套餐激活相关代码、现有卡观测 Outbox 装配和工作树状态,确认本 Change 只覆盖“旧套餐过期后接续队首套餐及孤儿恢复”,不涉及其他套餐用例。验证:相关文件差异摘要不包含跨分支移植计划。 - 0.2 保存生产故障只读基线
100/100/0,准备真实孤儿候选 SQL和EXPLAIN (ANALYZE, BUFFERS);所有 SQL 仅允许读取。验证:SQL 能区分占位记录、真实孤儿和每个载体的稳定队首。 - 0.3 增量更新
.scratch/tech-global-audit/审计覆盖基线.md:Audit Event N/A、Domain Ledger N/A、Integration Log N/A,Outbox 明确复用card.observation.series.requested且不新增事件类型。验证:四类公共能力均有明确决定。
1. 真实孤儿公平恢复切片
- 1.1 修改
findAndActivateOrphanPackages:通过 GORM 执行 PostgreSQL CTE/窗口查询,先按卡或设备选择priority ASC, created_at ASC, id ASC的唯一队首,再用NOT EXISTS排除status IN (1,2)的占位载体,最后限制 100 个真实孤儿;删除逐条Count和 Go map 二次分组。验证:只读 SQL 在前 100 条全部被占位时仍返回窗口后的真实孤儿,同一载体只返回一条队首。 - 1.2 对每个真实孤儿直接调用
ActivateNextPendingMainPackage,根据activated bool和错误记录实际结果,不调用enqueueActivationTask。验证:孤儿路径不存在package:queue:activation投递,锁冲突和条件未满足不记录成功。 - 1.3 执行候选 SQL和
EXPLAIN (ANALYZE, BUFFERS),记录真实孤儿数量、执行耗时和扫描行数;没有性能证据时不新增索引。验证:候选查询无逐载体 N+1,单轮最多返回 100 个载体。
2. 过期接续与 Outbox 一致性切片
- 2.1 修改
processExpiredPackage:事务内只提交旧主套餐过期和关联加油包失效,事务成功后直接调用ActivateNextPendingMainPackage;删除该路径对activateNextPackage/enqueueActivationTask的调用。验证:旧状态未提交时不会执行新套餐激活,提交后进程退出可由孤儿扫描恢复。 - 2.2 核对同步接续成功事务继续调用
appendActivationObservation,并由现有 Writer 原子追加card.observation.series.requested;不得新增套餐激活 Outbox 事件或消费者。验证:激活状态和卡观测事件同事务成功或回滚,稳定事件 ID仍基于 package usage ID。 - 2.3 收紧轮询日志:仅
activated=true记录本轮成功;锁冲突、无队首、占位变化、等待实名和幂等分别记录明确结果。验证:日志包含载体类型、载体 ID、套餐使用记录或可定位的候选信息和触发来源。
3. 七月分支验证与文档
- 3.1 对受影响 Go 文件执行
gofmt、现有静态检查和go build ./...;按用户要求不新增、修改或运行自动化测试。验证:全量构建退出码为 0,无临时调试标记。 - 3.2 使用只读数据库事实核验:真实孤儿进入候选、同步接续后队首变为
status=1、同一载体无第二条生效主套餐、对应卡观测 Outbox 与激活事务一致。验证:保存 SQL、预期和实际结果,不执行批量修复。 - 3.3 新建
docs/feature-505-package-activation-recovery/功能总结.md并更新 README 功能索引,记录七月专属架构、根因、SQL、Outbox 一致性、发布观察、回滚和未执行自动化测试声明。验证:文档只描述当前分支架构和发布步骤。 - 3.4 复核七月分支差异并保留在当前工作树,不创建提交。验证:差异仅包含本 Change,
openspec validate fix-package-activation-starvation --strict通过。
4. 七月迭代发布观察
- 4.1 部署前记录真实孤儿数量、最老等待时间、同载体重复生效检查和卡观测 Outbox 待投递状态;部署后观察至少两个轮询周期。验证:真实孤儿持续收敛、无重复生效、Outbox 正常投递。
- 4.2 准备回滚说明:无数据库迁移,发布后仅回退七月专属修复代码并重新部署 Worker;已正确激活的套餐不反向修改。验证:说明包含观察停止条件和带状态保护的单卡人工恢复边界。