# 08 — 完成接口契约、跨入口验收与发布门禁

**What to build:** 发布负责人可以通过自动化测试、OpenAPI、中文联调说明和发布检查，验证套餐商城不暴露下架套餐，当前套餐与套餐历史正确提供续费资格，个人客户可以按当前价格续费，而后台、代理、自动购买和批量订购均无法绕过下架限制。前端仅消费后端资格契约，不承担资格推导。

**Blocked by:**

- 02 — 套餐商城只展示正常在售套餐
- 03 — 当前套餐提供下架续费入口
- 04 — 套餐历史提供下架续费入口
- 05 — C 端创建订单按写时事实完成下架续费
- 06 — 封堵后台代购与自动购包的下架绕过
- 07 — 接入下架续费成功与拒绝审计
- `.scratch/ur36-bulk-package-purchase/issues/04-unified-admin-package-purchasability.md` — 04 — 统一后台与批量入口的套餐可售策略

**Status:** ready-for-agent

**架构通道:** 主通道为 Infrastructure，辅助通道为 Query 与 Application 验收。

**完整业务边界:** 本票收口 UR#40 的后端接口契约、真实链路验收、性能验证、中文功能总结、README、发布与回滚门禁。本仓库不实现前端页面；前端内容只描述如何消费 `can_purchase`、`purchase_mode`、`disabled_reason` 和 `current_package_id` 以及资格失效后的刷新交互，不扩展为跨仓前端任务。

- [ ] OpenAPI 完整描述套餐商城、资产信息、套餐历史和创建订单的最终契约，包含 `current_package_id`、`can_purchase`、`purchase_mode=normal|renew_only|disabled`、稳定中文原因及统一响应包装，生成校验无漂移。
- [ ] 真实 Fiber、认证、Handler、Query/Application、GORM/PostgreSQL 集成验收覆盖商城永不返回下架套餐、当前套餐下架续费、待生效/生效中/已用完/已过期历史续费、禁用和无历史资格。
- [ ] 入口矩阵验证个人 C 端可以续费，而平台后台普通订单、平台或代理代购、自动购包及 UR#36 批量订购对同一下架套餐全部拒绝；各入口正常上架购买不回归。
- [ ] 竞态验收覆盖展示后套餐禁用、渠道分配禁用/删除、资产解绑/转手、generation 变化、历史退款/失效和价格非法，创建订单始终按写时事实拒绝。
- [ ] 价格验收证明平台和代理渠道使用下单时当前零售价，不复用历史价格；代理零售价低于当前成本时拒绝。
- [ ] PostgreSQL 查询计划验证历史资格使用适用索引，商城与历史列表批量投影没有逐行查询；目标接口满足项目分页与性能要求。
- [ ] 后端联调文档明确前端只根据资格字段渲染：商城只展示后端返回项，`normal` 使用原动作，`renew_only` 显示“续费”和下架提示，`disabled` 隐藏或禁用并展示原因；提交只携带资产标识和套餐 ID，失败后展示后端中文错误并刷新数据。
- [ ] 中文功能总结和 README 说明策略边界、接口契约、错误闭环、索引或迁移结论、测试方式、监控、发布顺序和回滚限制；不承诺前端页面实现。
- [ ] 发布前只读核验套餐与代理分配状态、当前世代使用记录、订单退款一致性及查询计划；发现退款完成但使用记录仍有效的异常时必须修复或由策略显式排除后才能发布。
- [ ] 回滚只恢复“下架全部拒绝”的应用行为，保留已合法产生的订单、套餐使用和审计事实，不回填资格、不删除历史数据，也不反向修改套餐上下架状态。
