Files
junhong_cmp_fiber/openspec/changes/fix-package-activation-starvation/tasks.md
break 5e552d99bc 收口审计治理与套餐任务进展
Constraint: 在线热修前必须保存当前迭代分支全部有效代码进展
Confidence: medium
Scope-risk: broad
Directive: 后续修改需保持审计事件与业务事务边界一致
Tested: git diff --cached --check
Not-tested: 未运行全量测试,提交用于切换分支前保存既有工作
2026-08-05 14:30:54 +08:00

4.3 KiB
Raw Blame History

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/审计覆盖基线.mdAudit Event N/A、Domain Ledger N/A、Integration Log N/AOutbox 明确复用 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 复核七月分支差异并保留在当前工作树,不创建提交。验证:差异仅包含本 Changeopenspec validate fix-package-activation-starvation --strict 通过。

4. 七月迭代发布观察

  • 4.1 部署前记录真实孤儿数量、最老等待时间、同载体重复生效检查和卡观测 Outbox 待投递状态部署后观察至少两个轮询周期。验证真实孤儿持续收敛、无重复生效、Outbox 正常投递。
  • 4.2 准备回滚说明:无数据库迁移,发布后仅回退七月专属修复代码并重新部署 Worker已正确激活的套餐不反向修改。验证说明包含观察停止条件和带状态保护的单卡人工恢复边界。