# 01 — 建立统一套餐可售决策与真实历史资格

**What to build:** 系统可以基于调用主体、资产当前归属与世代、套餐、销售渠道和操作场景，统一给出 `normal`、`renew_only` 或 `disabled` 的购买决策、稳定中文原因及当前有效价格。下架续费资格只来自当前客户在同一资产、当前世代、同一套餐上的真实有效购买历史，不会被退款、撤销、转手或异常使用记录误放行。

**Blocked by:** None — can start immediately

**Status:** ready-for-agent

**架构通道:** 主通道为复杂写前置 Domain Policy，辅助通道为 Infrastructure Port/Adapter；查询侧只能消费同一策略能力进行投影。

**完整业务边界:** 本票收口 UR#40 的套餐可售决策、真实历史资格与当前渠道定价语义，为 C 端 Query、C 端创建订单及其他购买入口提供唯一接缝。明确不迁移未触碰的订单创建、支付、退款、资产生命周期或套餐管理用例，不新增资格表、缓存、快照或续费订单类型。

- [ ] 策略输入显式包含 actor、asset、当前 generation、package、sales channel 和 operation context，不使用 `is_renewal` 等隐式布尔开关，也不信任调用方提供的客户、资产类型、店铺或上下架结论。
- [ ] 套餐全局禁用时固定返回 `disabled`；平台渠道读取套餐上下架状态，代理渠道要求当前资产店铺对应的分配记录存在、未软删除、已启用，并读取其独立上下架状态。
- [ ] 正常在售且满足既有系列、赠送套餐、主套餐/加油包组合及价格规则时返回 `normal`；渠道下架时仅个人客户本人在 C 端续费场景可以进入历史资格判断，其他主体和场景固定拒绝。
- [ ] 有效历史通过 `EXISTS` 或等价批量查询判断，只接受当前资产、当前世代、同一套餐、未软删除且状态为待生效、生效中、已用完或已过期的使用记录；已失效记录不产生资格。
- [ ] 历史资格同时联合订单与退款事实：待支付、取消、退款、已有 `refund_id`、撤销后失效、赠送、后台发放或其他无真实个人购买事实的记录均不得产生资格，不能只依赖单个可能滞后的状态字段。
- [ ] 平台渠道使用下单时套餐当前有效零售价；代理渠道使用当前有效分配零售价并校验不低于当前授权成本价；历史订单价格和使用记录实付金额不参与定价。
- [ ] 决策返回稳定原因，至少覆盖套餐已禁用、套餐已下架仅历史用户可续费、当前资产无该套餐有效历史、当前渠道未授权该套餐、套餐价格配置异常及既有主套餐/加油包限制，调用方不需要解析文案推导状态。
- [ ] 单元与 PostgreSQL 集成测试覆盖平台/代理、启用/禁用、上架/下架、分配缺失/禁用/软删除、价格异常、赠送，以及历史状态、退款撤销、资产、套餐、客户和世代隔离矩阵。
- [ ] 使用真实查询计划核验历史资格查询；只有确认现有生产结构缺少适用索引时，才通过可升降级迁移补充覆盖资产、世代、套餐、状态和软删除条件的普通或部分索引，且不建立外键。
