# 05 — 套餐激活与队列接续只消费购买快照

**What to build:** 套餐首次激活、实名后激活、前一主套餐结束后的排队接续及退款后的下一套餐接续，都只使用套餐使用记录保存的购买快照决定起算条件和周期时长。历史旧记录缺少快照时可以通过明确、可观测的兼容路径继续运行；UR#55 上线后产生的新记录缺少快照则被识别为数据异常，不能静默读取可变套餐配置。

**Blocked by:**

- `.scratch/ur55-package-expiry-base/issues/03-snapshot-synchronous-package-purchases.md` — 03 — 同步购买链路创建不可变套餐计时快照
- `.scratch/ur55-package-expiry-base/issues/04-snapshot-auto-purchase-package-usages.md` — 04 — 自动购包链路复用不可变套餐计时快照

**Status:** completed

- [x] 架构主通道为复杂写，Infrastructure 负责历史数据读取和可观测设施；完整收口套餐激活与接续用例，不实现 UR#46 最终到期展示、UR#33 临期能力或未触碰的套餐管理 CRUD。
- [x] 首次激活、实名后激活、前一主套餐到期后的排队接续和退款后的接续，共享同一套餐生命周期规则，并只从使用记录快照读取生效条件、周期类型、月数和天数。
- [x] `from_purchase` 与 `from_activation` 的起算语义由使用记录快照决定；购买后修改套餐默认值、周期、时长或分配覆盖，不改变已有记录的激活时间、到期计算或队列接续结果。
- [x] 正式主套餐和加油包的激活均消费各自快照；加油包继续遵守既有主套餐关联规则，不借本票改变其生命周期范围。
- [x] 仅 UR#55 上线前形成且快照缺失的历史记录允许显式回退套餐当前值；每次回退都记录可定位使用记录的结构化告警和指标。
- [x] UR#55 上线后形成的新记录缺少或包含非法快照时，必须拒绝或标记异常并告警，不得静默进入历史回退路径。
- [x] 移除触碰用例中直接读取套餐当前 `expiry_base`、周期或时长的生产分支；不得保留“行业卡永远直接激活”等绕过统一实名规则的特殊判断。
- [x] 重复激活和重复接续通过状态条件保证幂等；事务失败不会留下部分状态、错误到期时间或重复激活下一套餐。
- [x] 领域与集成测试覆盖首次购买即生效、等待实名后生效、连续排队、退款接续、历史回退、新记录缺失快照、重复执行及购买后修改全部相关配置。
- [x] 发布验证遵循“兼容读取应用先就绪，再执行迁移并在同一维护窗口切换所有写入路径”；窗口结束后确认没有新增空快照，并能观测历史回退数量。
