## 1. 迁移与模型存储 - [x] 1.1 新增成对迁移 `000228_add_polling_priority_queue`:优先项表(卡、任务类型、状态、触发类型、来源订单/套餐使用记录、触发次数、来源集合、尝试次数、失败原因、人工原因与操作者、店铺快照、各时间列、软删列)、活动项部分唯一索引 `(card_id, task_type)`(仅覆盖待执行/执行中且未软删)、状态与时间索引、全列注释 - [x] 1.2 down 迁移守卫:存在活动项或未终态行时拒绝回滚并给出中文原因;与 up 严格成对 - [x] 1.3 新增优先项模型与状态/触发类型取值常量,字段长度、可空与迁移一致;不新增外键与关联标签 - [x] 1.4 新增存储层:合并插入(显式插入 + 唯一冲突识别,不用 OnConflict 打部分唯一索引)、条件认领、超租约接管、终态更新、按卡批量活动项查询、列表筛选与分页 - [x] 1.5 新增常量:触发类型枚举、状态枚举、最大尝试次数(3)、认领租约(90 秒)、优先提示通道键生成函数 ## 2. 触发事件与 Worker 注册 - [x] 2.1 新增优先轮询请求事件类型与载荷版本常量;载荷含资源类型、资源 ID、冻结卡快照、触发类型、来源订单、来源套餐使用记录 - [x] 2.2 新增事件 Writer:只在原业务事务内追加、幂等键稳定;观测结果驱动的业务评估上下文下短路不写 - [x] 2.3 新增事件消费者:逐卡建立优先项(含合并语义)并下发执行提示;重复投递只合并 - [x] 2.4 在 Worker 组装处注册该事件类型的消费者,保持事件类型唯一注册 ## 3. 生效触发点接入 - [x] 3.1 主套餐购买后立即生效路径:仅在生效状态分支追加事件;新购/续购按同载体更早套餐使用记录的存在性判定触发类型 - [x] 3.2 排队主套餐顺延生效路径:条件更新命中一行后追加事件(触发类型 `queue_activated`) - [x] 3.3 加油包生效路径:以生效状态提交后追加事件(触发类型 `addon_activated`) - [x] 3.4 在 API 与 Worker 两个组装入口注入事件 Writer - [x] 3.5 确认支付失败、已取消与未支付到账路径不追加事件 ## 4. 无有效套餐触发 - [x] 4.1 在套餐轮询评估命中「无有效套餐」处增加判定:该载体存在待生效套餐使用记录时追加事件(触发类型 `no_valid_package`),否则不追加 - [x] 4.2 该场景按资产解析绑定状态有效的全部在用卡(独立卡为自身),在触发事务内冻结快照,不使用当前卡槽口径 ## 5. 互斥接缝与执行前校验 - [x] 5.1 轮询共享基类新增认领接缝:活动项索引探测 → 待执行条件认领 / 执行中跳过并延后 / 无活动项时完全等价既有行为 - [x] 5.2 四个纳入集合的轮询 Handler 接入接缝(取并发信号量之后、调用上游之前),成功、失败、跳过分支统一收口 - [x] 5.3 实现认领租约与崩溃接管:执行中且超过 90 秒租约的项允许相邻执行接管 - [x] 5.4 执行前轮询范围校验(卡自身与绑定设备的轮询开关),不满足时失败终态且不发起上游调用 - [x] 5.5 尝试次数只在真正发起执行后累加;未达上限回活动态并按既有间隔重排;达上限失败终态并保留安全原因;业务校验类失败不重试 - [x] 5.6 确认未引入通用卡级锁与 Redis 活动标记,且分片队列的出队、入队与移除路径未被改动 ## 6. 提示通道与调度先排空 - [x] 6.1 队列管理新增优先提示下发:每任务类型独立键,不复用手动触发队列键 - [x] 6.2 调度器在同一周期内先排空优先提示、再排空手动触发队列;提示排空不受分片背压跳过影响 - [x] 6.3 确认未新建调度设施、未新增异步任务类型或队列 ## 7. 人工入队、读侧接口与路由装配 - [x] 7.1 抽取既有人工触发权限判定为同包共享函数(超管/平台放行、代理限自身与下级、平台卡不可见、企业拒绝),判定语义不变 - [x] 7.2 人工优先入队用例:解析资产标识、权限校验、原因必填、写事实并合并、下发提示、写审计;不受每日次数上限与 24 小时去重约束 - [x] 7.3 读侧列表与详情用例:筛选、分页、按数据范围下推,越权与不存在响应不可区分 - [x] 7.4 Handler 与路由注册(RouteSpec 摘要、标签、入参与出参类型),仅挂在既有后台认证中间件下 - [x] 7.5 同步文档装配三处:文档工厂、API 组装与文档生成入口 - [x] 7.6 事实表冗余卡所属店铺快照,供数据范围下推使用 ## 8. 审计常量与注册 - [x] 8.1 新增轮询优先队列审计动作与资源常量(入队、领取、失败、重试、完成、失败出队、人工拒绝) - [x] 8.2 按(操作者类型,来源)注册动作定义,人工侧与 Worker 侧均能通过来源校验 - [x] 8.3 接入写入点:人工侧复用既有轮询审计输入与失败短事务模式;系统侧复用既有 Worker 审计上下文 ## 9. 验证 - [x] 9.1 在受控隔离环境执行迁移 up/down/up;确认 down 守卫在有活动项时拒绝回滚 - [x] 9.2 验证三种生效触发、无有效套餐(含无待同步业务不入队)、支付失败与取消不入队、重复回调与事件重放幂等 - [x] 9.3 验证合并(人工 + 自动)、同卡不同任务类型互不干扰、普通轮询互斥不产生第二次上游调用 - [x] 9.4 验证认领租约接管、提示通道丢失兜底、执行前轮询范围校验、尝试上限与终态出队 - [x] 9.5 验证权限矩阵:超管/平台全量、代理限自身与下级、范围外与平台卡不可见、企业拒绝 - [x] 9.6 验证触发类型枚举:新购/续购判定、加油包、排队顺延、无有效套餐、人工 - [x] 9.7 验证通道阈值边界:持锁卡的优先执行不复机且保留既有拒绝事实 - [x] 9.8 运行 `gofmt -w`、`go build ./cmd/api ./cmd/worker`、`go run cmd/gendocs/main.go`、`openspec validate add-priority-polling-queue --strict`、`openspec doctor --json`、`./scripts/context-health.sh`;自动化测试按项目决策为 N/A