固化七月迭代审计治理进展以隔离线上热修

Constraint: 切换 main 前必须保存当前七月分支全部项目进展,套餐生效提案仅属于 Iteration/7-11。

Rejected: 将七月套餐修复直接移植到 main | 两个分支的可靠投递架构不同。

Confidence: medium

Scope-risk: broad

Directive: 不得将本提交整体 cherry-pick 到 main;main 套餐热修必须基于其纯 Asynq 代码独立实施。

Tested: git diff --check;openspec validate fix-package-activation-starvation --strict。

Not-tested: 按用户要求未运行自动化测试;go build ./... 因当前审计改造中的 Enterprise 模型字面量和 role.recordFailure 参数类型错误未通过。
This commit is contained in:
2026-08-03 09:47:22 +08:00
parent cf2ff0ac1c
commit b3499adfca
114 changed files with 16961 additions and 2782 deletions

View File

@@ -318,7 +318,7 @@ HTTP 中间件只构造 Audit Context操作者、来源、IP、User-Agent、
### 12. 旧日志只停写,不迁移到新审计中心
1. **Expand**先创建新表、Registry、Writer、统一 Query 和主体活动接口;旧 Writer 继续服务未迁移用例。
2. **Migrate**:按完整纵向用例迁移调用方,每个切片同时完成资源快照、成功/失败/拒绝查询可见性和测试;同一用例不得长期双写。
2. **Migrate**:按完整纵向用例迁移调用方,每个切片同时完成资源快照、成功/失败/拒绝查询可见性核对;同一用例不得长期双写。
3. **Contract**:生产装配和静态清单证明旧账号/资产 Writer 调用归零后停止旧表新增;旧表原样保留,不删除、不在线回填、不转换、不进入统一 Query。
新审计中心的时间范围和完整性从切换点开始。旧账号/资产历史仍由原表和既有独立查询能力承担;不为兼容新 DTO 解析中文描述、补造资源、结果、风险或 correlation。现有旧资产 operation-log 接口可收缩为平台历史入口,代理/企业改用新的安全资源活动接口,但该旧接口不会并入 `/api/admin/audit/*`
@@ -327,11 +327,13 @@ HTTP 中间件只构造 Audit Context操作者、来源、IP、User-Agent、
### 13. 不可变性、性能与验证策略
本 Change 明确禁止新增、修改或运行任何自动化测试也不创建测试任务。后续实现不得以补充单元、集成、HTTP 或端到端测试为由扩大改动范围。
Audit 业务 Repository 只有 Append/Read应用运行账号不获得审计 Update/Delete 路径Retention Worker 使用独立最小权限删除入口。后续业务修正通过新的业务动作产生新事件并以 correlation/parent 关联原链路,第一阶段不提供专用 `audit_event.corrected` 写接口。`content_hash` 基于清理、标准化后的主事件和资源内容计算,不包含数据库自增 ID。单个 JSON 字段设置有界大小,超限保存截断标志、原字节数和摘要;批量明细进入子事件或原业务任务表。
主要索引覆盖事件时间、actor、action/result/risk、request、correlation、parent、scope以及资源 type+id/key+event time。Query 先分页事件 ID 再批量加载资源和必要业务投影,禁止逐事件 N+1公共关键词只查有索引的编码、名称和 Key不对 JSONB 全表模糊搜索。目标仍为数据库查询 <50ms、API P95<200ms、P99<500ms。
验证按风险分层Writer 单元测试覆盖 Registry、资源约束、标准化、凭据删除、哈希和截断真实 PostgreSQL 集成测试覆盖同事务回滚、失败短事务、幂等和索引HTTP 集成测试覆盖统一响应、平台身份、代理/企业归属、字段隔离、入参来源和所有查询视角;跨链路场景覆盖换货、多卡设备、支付回调、退款资金、批量资产和系统任务。实施结束前执行格式化、静态覆盖门禁、目标测试、构建 OpenAPI 两条生成路径验证
按用户确认,本 Change 的完成证据仅使用代码格式化、LSP/静态扫描、Registry 与覆盖基线比对、数据库结构和抽样数据核对、迁移检查、EXPLAIN/性能观测、接口人工调用、业务页面跳转核对、构建以及 OpenAPI 两条生成路径。
## Risks / Trade-offs

View File

@@ -6,6 +6,7 @@
## What Changes
- 明确本 Change 禁止新增、修改或运行任何自动化测试,也不得创建测试任务;完成证据仅使用静态检查、数据核对、接口人工核对及既定制品检查。
- 新建统一 `Audit Event + Event Resource` 写入能力:所有非查询业务操作,以及已识别主要业务资源后的成功、失败、拒绝、部分成功、系统自动状态变化和外部回调引发的内部变化,均按明确事务策略记录;普通查询和参数解析前失败不产生 Audit EventAction Registry 明确登记的敏感读取除外。
- 建立动作、资源类型、资源角色、结果、风险、来源和外部可见性注册契约;每个事件至少关联一个主要资源,多资源操作为各资源保存事件发生时的业务标识快照及各自的前后变化。
- 建立平台多视角审计调查接口,覆盖全局事件、操作者、资源时间线、请求链路、业务关联链路、资金审计和风险事件;平台账号第一阶段均可读取完整业务审计数据,不实施细粒度权限码或平台数据范围过滤。

View File

@@ -1,120 +1,117 @@
## 0. 测试与现行契约准备
> 实施约束:本 Change 禁止新增、修改或运行任何自动化测试,也不得创建测试任务;完成证据仅使用静态检查、数据核对、接口人工核对及既定制品检查。
- [ ] 0.1 重新扫描当前 RouteSpec、Application、旧 Service、Worker、Scheduler、Callback、Outbox、Integration Log 和旧 Writer生成逐入口领域/动作/资源/事务/可见性矩阵,并逐项标明 Audit Event、Domain Ledger、Integration Log、Outbox 或 N/A 理由;旧 490 项仅用于遗漏比对,并增量维护 `.scratch/tech-global-audit/审计覆盖基线.md`。【主治理边界当前生产写入口及敏感读取不迁移业务实现验证清单无空白、敏感读取已单列、Setter/普通查询/装配误报已剔除并经业务/研发/安全复核】
- [ ] 0.2 为不可变事件、多资源约束、Action/Resource Registry、`subject_data` 白名单、安全凭据删除、内容哈希、JSON 大小限制、成功同事务、敏感读取失败关闭和失败短事务生成单元及真实 PostgreSQL 集成测试暂不实现生产代码。【主Infrastructure + Application边界统一写入闭环不迁移领域调用方验证运行目标测试并确认因能力缺失全部 FAIL】
- [ ] 0.3 为平台全局/操作者/资源/request/correlation/资金/风险查询、Integration overview/list/detail/attempts及代理/企业安全活动生成 Fiber + GORM 集成测试并覆盖筛选输入、视角跳转、认证上下文和服务端派生四类入参来源。【主Query/API边界第一阶段只读接口不迁移旧 operation log、前端页面与导出验证运行目标测试并确认路由或查询缺失导致 FAIL
- [ ] 0.4 为账号权限、设备多卡槽、换货旧新资产、钱包扣款退款、支付回调、批量部分成功、系统任务和企业资源授权生成端到端业务流程测试,断言 HTTP 响应、Audit Event、Event Resource、Domain Ledger、Integration/Outbox 关联及外部安全投影。【主:验收|边界:代表性跨领域流程|不迁移:未触碰业务规则|验证:运行流程测试并确认审计断言 FAIL、既有业务断言保持现状】
- [ ] 0.5 固化第一阶段测试基线:记录所有新增测试的预期失败原因,确认没有因编译错误、环境误配或既有回归造成的伪失败,并冻结后续逐切片转绿顺序。【主:测试门禁|边界:新增审计测试|不迁移:生产代码|验证:测试报告逐项对应 specs Requirement/Scenario】
- [ ] 0.6 为 Audit/Integration 每日归档、manifest/hash、重复任务、Integration 月度最终 revision、缺日、对象损坏、月度物理删除阻断、断点续删和在线窗口错误生成单元及真实 PostgreSQL/对象存储集成测试暂不实现生产代码。【主Infrastructure + Application边界冷归档与留存闭环不迁移Access Log、对象存储历史查询/恢复|验证:运行目标测试并确认因能力缺失全部 FAIL既有日志写入不受影响】
## 0. 现行契约准备
- [x] 0.1 重新扫描当前 RouteSpec、Application、旧 Service、Worker、Scheduler、Callback、Outbox、Integration Log 和旧 Writer生成逐入口领域/动作/资源/事务/可见性矩阵,并逐项标明 Audit Event、Domain Ledger、Integration Log、Outbox 或 N/A 理由;旧 490 项仅用于遗漏比对,并增量维护 `.scratch/tech-global-audit/审计覆盖基线.md`。【主治理边界当前生产写入口及敏感读取不迁移业务实现验证清单无空白、敏感读取已单列、Setter/普通查询/装配误报已剔除并经业务/研发/安全复核
## 1. 统一 Audit Event 首个纵向闭环
- [ ] 1.1 以“受控系统配置更新”为首个简单写纵向切片交付无外键迁移、Audit Event/Event Resource Model、Action/Resource Registry、凭据删除、不可变 Append Writer、结构体注入和同事务失败回滚配置凭据只记录 `credentials_configured` 等安全事实。【主:简单写 + Application/Port/AdapterInfrastructure边界系统配置更新 + 公共写接缝|不迁移:其他配置页面与其他领域|验证:迁移 up/down、Registry/哈希/凭据测试和配置事务集成测试 PASSLSP 无诊断】
- [ ] 1.2 以“Outbox 人工恢复裁决”为第二个高风险纵向切片,接入操作者、原因、批次、事件前后状态和 Audit Event 同事务失败关闭证明多资源与高风险策略可复用。【主Application + Port/AdapterInfrastructure边界既有 Outbox 恢复用例不迁移Outbox Relay 与消费者|验证:成功、重复恢复、有效租约拒绝、审计失败回滚测试 PASSLSP 无诊断】
- [ ] 1.3 交付已确定主要业务资源后的 `failed/denied` 独立短事务和二次失败 critical 日志/指标,以系统配置非法更新及 Outbox 不可恢复事件为代表用例;资源 ID 可空但必须有稳定 Key/快照,只有 actor 而无资源时进入 Access/Security Log不使用裸 goroutine。【主ApplicationInfrastructure/Observability边界失败审计公共接缝不迁移全局错误处理语义验证原业务错误保留、primary 约束、无资源分流、短事务失败指标测试 PASSLSP 无诊断】
- [ ] 1.4 交付 HTTP、OpenAPI、Worker、Scheduler 和 Callback 的 Audit Context 及 `request_id/correlation_id/parent_event_id` 传播接缝,以一个 HTTP→Outbox→Worker 流程证明系统子事件不伪造人工操作者。【主Application + Port/AdapterMiddleware/Asynq边界审计上下文与链路字段不迁移业务状态机验证上下文、载荷结构、父子链路和真实 actor 测试 PASSLSP 无诊断】
- [ ] 1.5 交付批次根事件、资源子事件和 `partial` 统计接缝以现有设备批量分配或资产批量购包小场景验证每个实际变化资源进入自身时间线未处理项不伪造成功。【主ApplicationAsynq/Infrastructure边界公共批量审计形态不迁移批量业务规则验证根子计数、父子链路、部分成功和幂等测试 PASSLSP 无诊断】
- [x] 1.1 以“受控系统配置更新”为首个简单写纵向切片交付无外键迁移、Audit Event/Event Resource Model、Action/Resource Registry、凭据删除、不可变 Append Writer、结构体注入和同事务失败回滚配置凭据只记录 `credentials_configured` 等安全事实。【主:简单写 + Application/Port/AdapterInfrastructure边界系统配置更新 + 公共写接缝|不迁移:其他配置页面与其他领域|验证:迁移 up/down、Registry/哈希/凭据和配置事务数据核对通过LSP 无诊断】
- [x] 1.2 以“Outbox 人工恢复裁决”为第二个高风险纵向切片,接入操作者、原因、批次、事件前后状态和 Audit Event 同事务失败关闭证明多资源与高风险策略可复用。【主Application + Port/AdapterInfrastructure边界既有 Outbox 恢复用例不迁移Outbox Relay 与消费者|验证:成功、重复恢复、有效租约拒绝、审计失败回滚核对通过LSP 无诊断】
- [x] 1.3 交付已确定主要业务资源后的 `failed/denied` 独立短事务和二次失败 critical 日志/指标,以系统配置非法更新及 Outbox 不可恢复事件为代表用例;资源 ID 可空但必须有稳定 Key/快照,只有 actor 而无资源时进入 Access/Security Log不使用裸 goroutine。【主ApplicationInfrastructure/Observability边界失败审计公共接缝不迁移全局错误处理语义验证原业务错误保留、primary 约束、无资源分流、短事务失败指标核对通过LSP 无诊断】
- [x] 1.4 交付 HTTP、OpenAPI、Worker、Scheduler 和 Callback 的 Audit Context 及 `request_id/correlation_id/parent_event_id` 传播接缝,以一个 HTTP→Outbox→Worker 流程证明系统子事件不伪造人工操作者。【主Application + Port/AdapterMiddleware/Asynq边界审计上下文与链路字段不迁移业务状态机验证上下文、载荷结构、父子链路和真实 actor 核对通过LSP 无诊断】
- [x] 1.5 交付批次根事件、资源子事件和 `partial` 统计接缝以现有设备批量分配或资产批量购包小场景验证每个实际变化资源进入自身时间线未处理项不伪造成功。【主ApplicationAsynq/Infrastructure边界公共批量审计形态不迁移批量业务规则验证根子计数、父子链路、部分成功和幂等核对通过LSP 无诊断】
## 2. 平台基础审计调查纵向切片
- [ ] 2.1 交付平台身份保护的事件列表和详情纵向切片,包含组合筛选、稳定分页、操作者/入口/结果/风险、多资源角色、身份快照及资源级 before/after平台不做数据行过滤代理/企业/个人后端拒绝。【主QueryAPI/Infrastructure边界全局事件与详情不迁移细粒度权限码、导出和修改验证Fiber 响应、身份隔离、筛选、分页、无 N+1 和数据库 <50ms 测试 PASSLSP 无诊断】
- [ ] 2.2 交付操作者行为视角支持人工账号、OpenAPI、系统任务和外部系统 actor返回历史名称快照及 action/result/risk/resource 筛选。【主Query边界actor 时间线|不迁移:用户画像或风控处置|验证:账号改名/删除、系统 actor、不伪造发起人和稳定分页测试 PASSLSP 无诊断】
- [ ] 2.3 交付 Resource Registry 搜索与通用资源时间线,以卡 ICCID/VirtualNo、设备 VirtualNo/IMEI/SN、店铺、订单和退款为首批 resolver资源删除或换号后使用事件快照解释历史。【主QueryResource Resolver边界注册资源精确/索引搜索与 timeline不迁移任意 JSON 模糊搜索和关系图验证资源搜索、primary/affected/reference、历史快照、稳定分页和查询计划测试 PASSLSP 无诊断】
- [ ] 2.4 新增平台审计 Handler/DTO/RouteSpec 并完成生产结构体注入、路由注册、共享文档 Handler、`cmd/api/docs.go``cmd/gendocs/main.go` 和中文错误码/文档;按 design 8.1-8.4 固化卡、设备、设备卡槽、统一资产、分配、换货、账号、店铺、企业、订单、退款、充值和钱包页面的 `response.data` 字段到目标接口参数映射,并冻结 `investigation_refs` 与降级规则,保证两条 OpenAPI 生成路径包含全部基础调查接口。【主API/Infrastructure边界2.1-2.3 Handler 契约|不迁移:前端实现|验证:逐矩阵 HTTP 参数映射、缺字段隐藏、伪造身份、调查节点跳转、静态/动态路由顺序、两份 OpenAPI 和构建检查 PASSLSP 无诊断】
- [ ] 2.5 交付 Action Registry 标记的敏感读取审计,以受控审计详情或明文业务凭证读取为代表:返回结果前写入读取者、目标资源和字段类别,写入失败则不返回结果;普通列表/详情仍按 N/A 契约执行。【主Query + Application/Port边界敏感读取例外不迁移细粒度权限码与敏感二次查看 UI验证成功读取、审计失败关闭、普通读取不写和安全凭据永不返回测试 PASSLSP 无诊断】
- [x] 2.1 交付平台身份保护的事件列表和详情纵向切片,包含组合筛选、稳定分页、操作者/入口/结果/风险、多资源角色、身份快照及资源级 before/after平台不做数据行过滤代理/企业/个人后端拒绝。【主QueryAPI/Infrastructure边界全局事件与详情不迁移细粒度权限码、导出和修改验证Fiber 响应、身份隔离、筛选、分页、无 N+1 和数据库 <50ms 核对通过LSP 无诊断】
- [x] 2.2 交付操作者行为视角支持人工账号、OpenAPI、系统任务和外部系统 actor返回历史名称快照及 action/result/risk/resource 筛选。【主Query边界actor 时间线|不迁移:用户画像或风控处置|验证:账号改名/删除、系统 actor、不伪造发起人和稳定分页核对通过LSP 无诊断】
- [x] 2.3 交付 Resource Registry 搜索与通用资源时间线,以卡 ICCID/VirtualNo、设备 VirtualNo/IMEI/SN、店铺、订单和退款为首批 resolver资源删除或换号后使用事件快照解释历史。【主QueryResource Resolver边界注册资源精确/索引搜索与 timeline不迁移任意 JSON 模糊搜索和关系图验证资源搜索、primary/affected/reference、历史快照、稳定分页和查询计划核对通过LSP 无诊断】
- [x] 2.4 新增平台审计 Handler/DTO/RouteSpec 并完成生产结构体注入、路由注册、共享文档 Handler、`cmd/api/docs.go``cmd/gendocs/main.go` 和中文错误码/文档;按 design 8.1-8.4 固化卡、设备、设备卡槽、统一资产、分配、换货、账号、店铺、企业、订单、退款、充值和钱包页面的 `response.data` 字段到目标接口参数映射,并冻结 `investigation_refs` 与降级规则,保证两条 OpenAPI 生成路径包含全部基础调查接口。【主API/Infrastructure边界2.1-2.3 Handler 契约|不迁移:前端实现|验证:逐矩阵 HTTP 参数映射、缺字段隐藏、伪造身份、调查节点跳转、静态/动态路由顺序、两份 OpenAPI 和构建检查 PASSLSP 无诊断】
- [x] 2.5 交付 Action Registry 标记的敏感读取审计,以受控审计详情或明文业务凭证读取为代表:返回结果前写入读取者、目标资源和字段类别,写入失败则不返回结果;普通列表/详情仍按 N/A 契约执行。【主Query + Application/Port边界敏感读取例外不迁移细粒度权限码与敏感二次查看 UI验证成功读取、审计失败关闭、普通读取不写和安全凭据永不返回核对通过LSP 无诊断】
## 3. Integration Log 只读调查中心
- [ ] 3.1 交付 Integration Log 组合筛选列表与稳定 `integration_id` 详情纵向切片,返回 identity/resource/trigger/result/content/linkage/timestamps 分组、原始结果、中文名和派生类别,不直接暴露 GORM Model。【主QueryAPI边界现有 Integration Log 只读投影不迁移Writer 业务语义与恢复操作|验证:全部筛选、空页、不存在、统一响应和无 N+1 测试 PASSLSP 无诊断】
- [ ] 3.2 交付受时间范围约束的 Integration overview覆盖总量、结果/provider/direction、异常、unknown、陈旧 pending、状态变化、平均/P95 耗时与趋势,严格区分 success、processing、indeterminate、failed 和 not_sent。【主Query边界固定聚合维度不迁移告警处置和自动恢复验证聚合语义、时间边界、completed 不计 success 和查询计划测试 PASSLSP 无诊断】
- [ ] 3.3 交付显式 `trigger_series + attempt` 尝试序列,并增量修正新外呼的 series/correlation 传播、correlation 长度、真实资源 ID 和安全可读错误摘要;历史缺字段时标记受限,旧 `request_summary/response_summary/metadata` 返回前按白名单和凭据删除规则重新清理,禁止直接透传或按相似资源/时间猜测重试。【主Infrastructure Adapter + Query边界Integration 链路可解释性与历史读取安全不迁移历史伪回填与多资源子表验证序列排序、correlation 非重试、ICCID hash 兼容、历史 fidelity、敌对历史 JSON 和凭据不返回测试 PASSLSP 无诊断】
- [ ] 3.4 为现有 Integration 表补受控 B-tree 索引并交付 overview/list/detail Handler、RouteSpec、生产装配和两条 OpenAPI 生成入口;明确筛选来自调查输入或关联视角跳转、`integration_id` 来自列表/通知 target/调查节点、身份来自认证上下文,只注册 GET不提供重试、补偿、确认、绑定、恢复、修改、删除或导出路由。【主Query/API + Migration边界Integration 调查中心不迁移JSONB GIN 与任意全文搜索|验证:迁移 up/down、索引命中、通知 `target_key→integration_id`、不可用目标、HTTP/OpenAPI、只读路由扫描和性能目标 PASSLSP 无诊断】
- [x] 3.1 交付 Integration Log 组合筛选列表与稳定 `integration_id` 详情纵向切片,返回 identity/resource/trigger/result/content/linkage/timestamps 分组、原始结果、中文名和派生类别,不直接暴露 GORM Model。【主QueryAPI边界现有 Integration Log 只读投影不迁移Writer 业务语义与恢复操作|验证:全部筛选、空页、不存在、统一响应和无 N+1 核对通过LSP 无诊断】
- [x] 3.2 交付受时间范围约束的 Integration overview覆盖总量、结果/provider/direction、异常、unknown、陈旧 pending、状态变化、平均/P95 耗时与趋势,严格区分 success、processing、indeterminate、failed 和 not_sent。【主Query边界固定聚合维度不迁移告警处置和自动恢复验证聚合语义、时间边界、completed 不计 success 和查询计划核对通过LSP 无诊断】
- [x] 3.3 交付显式 `trigger_series + attempt` 尝试序列,并增量修正新外呼的 series/correlation 传播、correlation 长度、真实资源 ID 和安全可读错误摘要;历史缺字段时标记受限,旧 `request_summary/response_summary/metadata` 返回前按白名单和凭据删除规则重新清理,禁止直接透传或按相似资源/时间猜测重试。【主Infrastructure Adapter + Query边界Integration 链路可解释性与历史读取安全不迁移历史伪回填与多资源子表验证序列排序、correlation 非重试、ICCID hash 兼容、历史 fidelity、敌对历史 JSON 和凭据不返回核对通过LSP 无诊断】
- [x] 3.4 为现有 Integration 表补受控 B-tree 索引并交付 overview/list/detail Handler、RouteSpec、生产装配和两条 OpenAPI 生成入口;明确筛选来自调查输入或关联视角跳转、`integration_id` 来自列表/通知 target/调查节点、身份来自认证上下文,只注册 GET不提供重试、补偿、确认、绑定、恢复、修改、删除或导出路由。【主Query/API + Migration边界Integration 调查中心不迁移JSONB GIN 与任意全文搜索|验证:迁移 up/down、索引命中、通知 `target_key→integration_id`、不可用目标、HTTP/OpenAPI、只读路由扫描和性能目标 PASSLSP 无诊断】
## 4. 代理/企业安全资源活动与旧历史入口隔离
- [ ] 4.1 交付代理资源活动纵向切片:按当前资源店铺及自身/下级店铺范围校验卡、设备、分配、换货、店铺和归属企业,读取 `subject_result/subject_detail`,完全隐藏 `internal_only`、平台操作者、内部原因/备注、风险、内部 before/after、Audit Event ID 和 Integration 内容。【主QueryAPI/数据权限|边界:代理范围资源活动|不迁移:平台审计 DTO 与权限码|验证:各类稳定 identifier、有权、越权/不存在同错、分配详情独立归属、无事件存在性泄露、多资源部分可见测试 PASSLSP 无诊断】
- [ ] 4.2 交付企业资源活动纵向切片:卡与设备分别复用当前有效企业授权关系,禁止在企业缺少 SubordinateShopIDs 时退化为全量撤销授权后不可继续读取资源活动。【主QueryAPI/授权 Store边界企业卡/设备活动|不迁移:企业授权业务规则|验证:有效/撤销授权、无权同错、设备关联卡和安全字段测试 PASSLSP 无诊断】
- [ ] 4.3 交付资源关系级 `internal_only/subject_result/subject_detail`、稳定 `subject_summary` 和 Registry 白名单约束的 `subject_data` 写入契约,以平台退款处理、主体自身操作、内部补偿和外部回调为代表场景,查询时不读取内部 before/after 后删字段生成外部结果。【主Application + Query边界主体可见性快照不迁移前端文案系统验证三种级别、subject_data 白名单、平台过程不可感知、最终业务结论正确和凭据缺失测试 PASSLSP 无诊断】
- [ ] 4.5 新增 `GET /api/admin/agent/resource-activities/{resource_type}/{identifier}``GET /api/admin/enterprise/resource-activities/{resource_type}/{identifier}` 的 Handler/DTO/RouteSpec冻结 `page/page_size`、资源摘要和 activity 字段;按 design 8.1 复用卡 ICCID、设备 VirtualNo、分配单号、换货单号、店铺编号、企业编号及企业受权资产列表字段主体范围只来自认证上下文缺少 identifier 时不展示入口。先上线安全接口,再把旧资产 operation-logs 收缩为仅平台历史入口,并同步生产装配、共享文档 Handler、两个 OpenAPI 生成入口和中文接口文档。【主API/Query边界expand 阶段兼容切换不迁移旧日志迁移、删除旧路由验证design 8.1 全部主体映射、企业禁止 resolve、缺字段隐藏、伪造范围、分配详情独立归属、不可见字段、授权撤销、旧接口身份收缩、两份 OpenAPI 和构建检查 PASSLSP 无诊断】
- [x] 4.1 交付代理资源活动纵向切片:按当前资源店铺及自身/下级店铺范围校验卡、设备、分配、换货、店铺和归属企业,读取 `subject_result/subject_detail`,完全隐藏 `internal_only`、平台操作者、内部原因/备注、风险、内部 before/after、Audit Event ID 和 Integration 内容。【主QueryAPI/数据权限|边界:代理范围资源活动|不迁移:平台审计 DTO 与权限码|验证:各类稳定 identifier、有权、越权/不存在同错、分配详情独立归属、无事件存在性泄露、多资源部分可见核对通过LSP 无诊断】
- [x] 4.2 交付企业资源活动纵向切片:卡与设备分别复用当前有效企业授权关系,禁止在企业缺少 SubordinateShopIDs 时退化为全量撤销授权后不可继续读取资源活动。【主QueryAPI/授权 Store边界企业卡/设备活动|不迁移:企业授权业务规则|验证:有效/撤销授权、无权同错、设备关联卡和安全字段核对通过LSP 无诊断】
- [x] 4.3 交付资源关系级 `internal_only/subject_result/subject_detail`、稳定 `subject_summary` 和 Registry 白名单约束的 `subject_data` 写入契约,以平台退款处理、主体自身操作、内部补偿和外部回调为代表场景,查询时不读取内部 before/after 后删字段生成外部结果。【主Application + Query边界主体可见性快照不迁移前端文案系统验证三种级别、subject_data 白名单、平台过程不可感知、最终业务结论正确和凭据缺失核对通过LSP 无诊断】
- [x] 4.5 新增 `GET /api/admin/agent/resource-activities/{resource_type}/{identifier}``GET /api/admin/enterprise/resource-activities/{resource_type}/{identifier}` 的 Handler/DTO/RouteSpec冻结 `page/page_size`、资源摘要和 activity 字段;按 design 8.1 复用卡 ICCID、设备 VirtualNo、分配单号、换货单号、店铺编号、企业编号及企业受权资产列表字段主体范围只来自认证上下文缺少 identifier 时不展示入口。先上线安全接口,再把旧资产 operation-logs 收缩为仅平台历史入口,并同步生产装配、共享文档 Handler、两个 OpenAPI 生成入口和中文接口文档。【主API/Query边界expand 阶段兼容切换不迁移旧日志迁移、删除旧路由验证design 8.1 全部主体映射、企业禁止 resolve、缺字段隐藏、伪造范围、分配详情独立归属、不可见字段、授权撤销、旧接口身份收缩、两份 OpenAPI 和构建检查 PASSLSP 无诊断】
## 5. 账号、权限、组织与主体写入口迁移
- [ ] 5.1 迁移账号创建、基础资料更新、启停和软删除纵向用例到统一 Writer关联账号、店铺/企业和实际角色资源,已定位账号的失败/拒绝进入短事务;逐用例转绿后停止对应旧 account operation log 写入。【主:简单写/Application + 旧 Service Adapter边界账号生命周期不迁移凭据和第三方绑定验证各状态操作、资源快照、失败/拒绝、旧写逐项归零和 HTTP 测试 PASSLSP 无诊断】
- [ ] 5.2 迁移改密、手机号安全操作、企微绑定及登录/登出安全状态纵向用例记录账号与认证资源但删除密码、验证码、Token、Cookie 等凭据。【主:简单写/Application + 旧 Service Adapter边界账号安全操作不迁移认证协议重构验证成功/拒绝/失败、凭据数据库抽样、actor/request 关联和旧写归零测试 PASSLSP 无诊断】
- [ ] 5.3 迁移角色 CRUD、权限 CRUD 和角色权限配置纵向用例,保存角色/权限 code/name 和前后差异,高风险成功与业务事实同事务。【主:简单写 + Application边界角色权限配置不迁移账号角色分配与新权限体系验证CRUD/拒绝、before/after、同事务和资源时间线测试 PASSLSP 无诊断】
- [ ] 5.4 迁移账号角色、店铺角色的分配与移除纵向用例,分别关联目标账号、角色和店铺并停止对应旧账号日志写入。【主:简单写 + Application边界主体授权关系不迁移权限码重构验证分配/移除/重复/拒绝、资源角色、旧写归零和 actor 查询测试 PASSLSP 无诊断】
- [ ] 5.5 迁移店铺创建、基础资料和层级变更纵向用例,保存店铺编码/名称/上级/层级及操作者,不借审计改变层级规则。【主:简单写 + Application边界店铺身份与层级不迁移状态、业务员和登录限制验证创建/更新/层级拒绝、历史快照和店铺时间线测试 PASSLSP 无诊断】
- [ ] 5.6 迁移店铺启停、删除、业务员绑定和 C 端登录限制纵向用例,主体活动仅输出允许感知结论,逐用例停止旧账号日志借用写入。【主:简单写 + Application边界店铺状态与关键配置不迁移全模块 DDD验证状态/绑定/拒绝、subject 投影、旧写归零测试 PASSLSP 无诊断】
- [ ] 5.7 迁移企业创建、资料/状态/凭据管理纵向用例,关联企业和 owner shop保持现有企业规则并删除安全凭据。【主简单写 + Application边界企业生命周期不迁移资产授权验证CRUD/启停/改密、凭据删除、actor/scope 和时间线测试 PASSLSP 无诊断】
- [ ] 5.8 迁移企业卡授权/回收纵向用例关联企业、owner shop、卡和授权记录并保持现有有效授权语义。【主简单写 + Application边界企业卡授权不迁移设备授权验证授权/撤销/重复/越权、卡活动和企业范围测试 PASSLSP 无诊断】
- [ ] 5.9 迁移企业设备授权/回收纵向用例,关联企业、设备及实际随设备处理的绑定卡,保持现有授权语义。【主:复杂写或简单写事务脚本|边界:企业设备授权|不迁移:卡槽绑定规则|验证:多卡设备授权/撤销/越权、资源关系和企业活动测试 PASSLSP 无诊断】
- [ ] 5.10 迁移个人客户资料、手机号和微信主体纵向用例,记录真实个人 actor不把普通查询或 Token 刷新误记为业务操作。【主:简单写 + Application边界个人客户身份资料不迁移资产绑定验证资料/手机号/微信变更、失败、凭据删除和 subject_detail 测试 PASSLSP 无诊断】
- [ ] 5.11 迁移个人客户卡/设备绑定、解绑和换货绑定迁移纵向用例,关联客户、资产和绑定记录。【主:简单写或复杂写 Application边界客户资产关系不迁移换货其他资金/套餐步骤|验证:绑定/解绑/迁移、资源快照、越权和多资源活动测试 PASSLSP 无诊断】
- [x] 5.1 迁移账号创建、基础资料更新、启停和软删除纵向用例到统一 Writer关联账号、店铺/企业和实际角色资源,已定位账号的失败/拒绝进入短事务;逐用例核对完成后停止对应旧 account operation log 写入。【主:简单写/Application + 旧 Service Adapter边界账号生命周期不迁移凭据和第三方绑定验证各状态操作、资源快照、失败/拒绝、旧写逐项归零和 HTTP 核对通过LSP 无诊断】
- [x] 5.2 迁移改密、手机号安全操作、企微绑定及登录/登出安全状态纵向用例记录账号与认证资源但删除密码、验证码、Token、Cookie 等凭据。【主:简单写/Application + 旧 Service Adapter边界账号安全操作不迁移认证协议重构验证成功/拒绝/失败、凭据数据库抽样、actor/request 关联和旧写归零核对通过LSP 无诊断】
- [x] 5.3 迁移角色 CRUD、权限 CRUD 和角色权限配置纵向用例,保存角色/权限 code/name 和前后差异,高风险成功与业务事实同事务。【主:简单写 + Application边界角色权限配置不迁移账号角色分配与新权限体系验证CRUD/拒绝、before/after、同事务和资源时间线核对通过LSP 无诊断】
- [x] 5.4 迁移账号角色、店铺角色的分配与移除纵向用例,分别关联目标账号、角色和店铺并停止对应旧账号日志写入。【主:简单写 + Application边界主体授权关系不迁移权限码重构验证分配/移除/重复/拒绝、资源角色、旧写归零和 actor 查询核对通过LSP 无诊断】
- [x] 5.5 迁移店铺创建、基础资料和层级变更纵向用例,保存店铺编码/名称/上级/层级及操作者,不借审计改变层级规则。【主:简单写 + Application边界店铺身份与层级不迁移状态、业务员和登录限制验证创建/更新/层级拒绝、历史快照和店铺时间线核对通过LSP 无诊断】
- [x] 5.6 迁移店铺启停、删除、业务员绑定和 C 端登录限制纵向用例,主体活动仅输出允许感知结论,逐用例停止旧账号日志借用写入。【主:简单写 + Application边界店铺状态与关键配置不迁移全模块 DDD验证状态/绑定/拒绝、subject 投影、旧写归零核对通过LSP 无诊断】
- [x] 5.7 迁移企业创建、资料/状态/凭据管理纵向用例,关联企业和 owner shop保持现有企业规则并删除安全凭据。【主简单写 + Application边界企业生命周期不迁移资产授权验证CRUD/启停/改密、凭据删除、actor/scope 和时间线核对通过LSP 无诊断】
- [x] 5.8 迁移企业卡授权/回收纵向用例关联企业、owner shop、卡和授权记录并保持现有有效授权语义。【主简单写 + Application边界企业卡授权不迁移设备授权验证授权/撤销/重复/越权、卡活动和企业范围核对通过LSP 无诊断】
- [x] 5.9 迁移企业设备授权/回收纵向用例,关联企业、设备及实际随设备处理的绑定卡,保持现有授权语义。【主:复杂写或简单写事务脚本|边界:企业设备授权|不迁移:卡槽绑定规则|验证:多卡设备授权/撤销/越权、资源关系和企业活动核对通过LSP 无诊断】
- [x] 5.10 迁移个人客户资料、手机号和微信主体纵向用例,记录真实个人 actor不把普通查询或 Token 刷新误记为业务操作。【主:简单写 + Application边界个人客户身份资料不迁移资产绑定验证资料/手机号/微信变更、失败、凭据删除和 subject_detail 核对通过LSP 无诊断】
- [ ] 5.11 迁移个人客户卡/设备绑定、解绑和换货绑定迁移纵向用例,关联客户、资产和绑定记录。【主:简单写或复杂写 Application边界客户资产关系不迁移换货其他资金/套餐步骤|验证:绑定/解绑/迁移、资源快照、越权和多资源活动核对通过LSP 无诊断】
## 6. 卡、设备、绑定、分配与换货迁移
- [ ] 6.1 迁移 IoT 卡创建/导入落库、基础资料、删除纵向用例,快照含 ID/ICCID/VirtualNo/MSISDN/运营商/店铺/系列/generation。【主简单写 + 旧 Service Adapter边界卡身份生命周期不迁移状态与外部命令验证创建/更新/删除、历史快照、凭据规则和旧资产写归零测试 PASSLSP 无诊断】
- [ ] 6.2 迁移 IoT 卡分配、回收和系列绑定纵向用例,关联分配记录、来源/目标店铺、系列和必要设备关系。【主:复杂写或简单写事务脚本|边界:卡归属与系列|不迁移:卡状态/Gateway验证分配/回收/拒绝、多资源、主体活动和旧写归零测试 PASSLSP 无诊断】
- [ ] 6.3 迁移 IoT 卡停复机、实名策略/状态、限速和人工刷新纵向用例,实际外部尝试写 Integration Log内部状态变化写 Audit Eventunknown 不伪装失败或成功。【主:复杂写 + Gateway Adapter边界卡状态与外部命令不迁移卡归属验证success/failed/denied/unknown、Integration/Audit 分界、主体结论和旧写归零测试 PASSLSP 无诊断】
- [ ] 6.4 迁移设备创建/导入落库、基础资料和删除纵向用例,快照含 ID/VirtualNo/IMEI/SN/型号/店铺/系列/generation。【主简单写 + 旧 Service Adapter边界设备身份生命周期不迁移状态、卡槽与 Gateway验证创建/更新/删除、历史快照和旧资产写归零测试 PASSLSP 无诊断】
- [ ] 6.5 迁移设备分配、回收和系列/实名策略纵向用例,关联分配记录、来源/目标店铺及实际连带卡。【主:复杂写或简单写事务脚本|边界:设备归属与策略|不迁移:设备外部命令|验证:分配/回收/策略、设备卡关系、主体活动和旧写归零测试 PASSLSP 无诊断】
- [ ] 6.6 迁移设备停复机、Wi-Fi、切卡模式、重启和重置纵向用例外部尝试写 Integration Log实际内部变化写 Audit Event。【主复杂写 + Gateway Adapter边界设备外部命令不迁移设备归属与卡槽绑定验证success/failed/unknown、设备时间线、安全结论和旧写归零测试 PASSLSP 无诊断】
- [ ] 6.7 迁移设备绑卡、解绑和当前卡切换纵向用例,把设备、目标卡、旧/新当前卡及每个 binding 作为一等资源,保存 slot/is_current。【主复杂写边界设备卡槽关系完整用例不迁移设备/卡其他状态机验证1-4 卡槽、旧新卡角色、资源双向时间线、事务和主体范围测试 PASSLSP 无诊断】
- [ ] 6.8 迁移单笔资产分配/回收纵向用例,关联分配记录、来源/目标店铺、设备及实际连带卡。【主:复杂写 Application边界单笔资产流转不迁移批量分配和企业授权验证卡/设备流转、多资源、越权和每资源时间线测试 PASSLSP 无诊断】
- [ ] 6.9 迁移批量设备分配纵向用例,批次根事件与每台实际变化设备/绑定卡子事件计数一致。【主:复杂写 + Application/Asynq边界批量设备流转不迁移其他批量任务验证success/partial/failed、根子计数、幂等和店铺范围测试 PASSLSP 无诊断】
- [ ] 6.10 迁移卡换货完整用例,记录换货单、旧/新卡 ICCID+VirtualNo、客户绑定、钱包/流水、套餐权益、店铺和状态变化。【主:复杂写 Domain/ApplicationOutbox/Query边界卡换货创建至完成/取消/迁移|不迁移:设备换货|验证:资金/套餐/客户迁移、失败回滚、多资源时间线和外部安全结论测试 PASSLSP 无诊断】
- [ ] 6.11 迁移设备换货完整用例,记录旧/新设备 VirtualNo+IMEI+SN、实际绑定卡/卡槽、客户绑定、钱包/流水、套餐权益、店铺和换货单。【主:复杂写 Domain/ApplicationOutbox/Query边界设备换货完整流程不迁移无关订单规则验证多卡设备换货、资金/套餐/客户迁移、失败回滚和所有资源时间线测试 PASSLSP 无诊断】
- [ ] 6.1 迁移 IoT 卡创建/导入落库、基础资料、删除纵向用例,快照含 ID/ICCID/VirtualNo/MSISDN/运营商/店铺/系列/generation。【主简单写 + 旧 Service Adapter边界卡身份生命周期不迁移状态与外部命令验证创建/更新/删除、历史快照、凭据规则和旧资产写归零核对通过LSP 无诊断】
- [ ] 6.2 迁移 IoT 卡分配、回收和系列绑定纵向用例,关联分配记录、来源/目标店铺、系列和必要设备关系。【主:复杂写或简单写事务脚本|边界:卡归属与系列|不迁移:卡状态/Gateway验证分配/回收/拒绝、多资源、主体活动和旧写归零核对通过LSP 无诊断】
- [ ] 6.3 迁移 IoT 卡停复机、实名策略/状态、限速和人工刷新纵向用例,实际外部尝试写 Integration Log内部状态变化写 Audit Eventunknown 不伪装失败或成功。【主:复杂写 + Gateway Adapter边界卡状态与外部命令不迁移卡归属验证success/failed/denied/unknown、Integration/Audit 分界、主体结论和旧写归零核对通过LSP 无诊断】
- [ ] 6.4 迁移设备创建/导入落库、基础资料和删除纵向用例,快照含 ID/VirtualNo/IMEI/SN/型号/店铺/系列/generation。【主简单写 + 旧 Service Adapter边界设备身份生命周期不迁移状态、卡槽与 Gateway验证创建/更新/删除、历史快照和旧资产写归零核对通过LSP 无诊断】
- [ ] 6.5 迁移设备分配、回收和系列/实名策略纵向用例,关联分配记录、来源/目标店铺及实际连带卡。【主:复杂写或简单写事务脚本|边界:设备归属与策略|不迁移:设备外部命令|验证:分配/回收/策略、设备卡关系、主体活动和旧写归零核对通过LSP 无诊断】
- [ ] 6.6 迁移设备停复机、Wi-Fi、切卡模式、重启和重置纵向用例外部尝试写 Integration Log实际内部变化写 Audit Event。【主复杂写 + Gateway Adapter边界设备外部命令不迁移设备归属与卡槽绑定验证success/failed/unknown、设备时间线、安全结论和旧写归零核对通过LSP 无诊断】
- [ ] 6.7 迁移设备绑卡、解绑和当前卡切换纵向用例,把设备、目标卡、旧/新当前卡及每个 binding 作为一等资源,保存 slot/is_current。【主复杂写边界设备卡槽关系完整用例不迁移设备/卡其他状态机验证1-4 卡槽、旧新卡角色、资源双向时间线、事务和主体范围核对通过LSP 无诊断】
- [ ] 6.8 迁移单笔资产分配/回收纵向用例,关联分配记录、来源/目标店铺、设备及实际连带卡。【主:复杂写 Application边界单笔资产流转不迁移批量分配和企业授权验证卡/设备流转、多资源、越权和每资源时间线核对通过LSP 无诊断】
- [ ] 6.9 迁移批量设备分配纵向用例,批次根事件与每台实际变化设备/绑定卡子事件计数一致。【主:复杂写 + Application/Asynq边界批量设备流转不迁移其他批量任务验证success/partial/failed、根子计数、幂等和店铺范围核对通过LSP 无诊断】
- [ ] 6.10 迁移卡换货完整用例,记录换货单、旧/新卡 ICCID+VirtualNo、客户绑定、钱包/流水、套餐权益、店铺和状态变化。【主:复杂写 Domain/ApplicationOutbox/Query边界卡换货创建至完成/取消/迁移|不迁移:设备换货|验证:资金/套餐/客户迁移、失败回滚、多资源时间线和外部安全结论核对通过LSP 无诊断】
- [ ] 6.11 迁移设备换货完整用例,记录旧/新设备 VirtualNo+IMEI+SN、实际绑定卡/卡槽、客户绑定、钱包/流水、套餐权益、店铺和换货单。【主:复杂写 Domain/ApplicationOutbox/Query边界设备换货完整流程不迁移无关订单规则验证多卡设备换货、资金/套餐/客户迁移、失败回滚和所有资源时间线核对通过LSP 无诊断】
## 7. 套餐、交易与资金纵向迁移
- [ ] 7.1 迁移套餐系列、套餐商品、店铺系列/套餐分配、批量定价和关键价格配置纵向用例,关联店铺、系列、套餐和价格历史,保持现有上架/分配规则。【主:简单写 + Application边界套餐配置与授权不迁移套餐购买流程验证before/after、批量根子、店铺时间线、凭据规则和旧 account 借用写归零测试 PASSLSP 无诊断】
- [ ] 7.2 迁移套餐权益激活、排队、流量重置/扣减、退款失效、资产失效和换货迁移纵向用例,系统任务使用真实 actor权益、订单、套餐和资产作为独立资源。【主复杂写 Domain/ApplicationWorker/Outbox边界package_usage 生命周期|不迁移:套餐列表 Query验证状态条件、重复任务幂等、系统 actor、父子链路和资源时间线测试 PASSLSP 无诊断】
- [ ] 7.3 迁移订单创建、后台代购、C 端/OpenAPI 购买、取消、钱包支付和过期关闭纵向用例,关联买家/操作者、资产、套餐、金额、支付方式、钱包/流水和购买角色。【主:复杂写 Domain/ApplicationOutbox边界订单状态与支付准备不迁移订单只读列表验证各入口 actor、成功/拒绝/失败、资金同事务、系统过期和链路测试 PASSLSP 无诊断】
- [ ] 7.4 迁移支付创建、微信/支付宝/富友预下单、查单和回调确认纵向用例:每次外部尝试写 Integration Log实际改变支付/订单/充值事实时写 Audit Event关联支付单、业务单、渠道交易号和 correlation。【主复杂写 + Infrastructure Adapter边界支付外部与内部终态不迁移渠道协议重构验证success/unknown/迟到回调/重复回调、series/correlation、Domain Ledger 和时间线测试 PASSLSP 无诊断】
- [ ] 7.5 迁移退款申请、审批终态、钱包回充、佣金失效、套餐/资产后处理和通知纵向用例,关联退款、审批、订单、资产、钱包、原扣款/退款流水、佣金和套餐权益,资金事实与审计同事务。【主:复杂写 Domain/ApplicationOutbox/Integration边界退款完整业务链不迁移原路退款等未实现能力验证通过/拒绝/重提/重复终态/失败回滚、资金时间线和代理安全结论测试 PASSLSP 无诊断】
- [ ] 7.6 迁移个人资产充值和代理在线/线下充值纵向用例,关联充值单、提交人、店铺/资产、支付或审批、钱包、交易流水和自动购包;外部回调与系统恢复使用真实 actor。【主复杂写 Domain/ApplicationPayment/Approval/Outbox边界充值创建至入账不迁移新充值渠道验证在线/线下、回调/审批、重复入账、unknown、资金同事务和主体投影测试 PASSLSP 无诊断】
- [ ] 7.7 迁移代理主钱包订单扣款和预占/释放/完成纵向用例,关联订单、钱包、预占、唯一流水和余额前后值。【主:复杂写 Domain/ApplicationOutbox边界订单资金占用与扣款不迁移充值/退款/信用额度|验证:乐观锁/状态条件、唯一业务键、审计失败回滚和失败短事务测试 PASSLSP 无诊断】
- [ ] 7.8 迁移代理主钱包充值入账、人工调整、退款回充和信用额度纵向用例,逐项关联业务单、原流水/新流水和余额前后值。【主:复杂写 Domain/ApplicationOutbox边界代理钱包正向及回退资金不迁移资产钱包与佣金提现验证重复入账/退款上限/人工原因/信用变更、同事务和资金查询测试 PASSLSP 无诊断】
- [ ] 7.9 迁移卡/设备资产钱包充值、扣款、退款和换货迁移纵向用例,关联资产完整标识、钱包、业务单和唯一流水。【主:复杂写 Domain/Application边界资产钱包资金不迁移代理主钱包验证卡/设备、换货、重复业务键、余额前后值和资源时间线测试 PASSLSP 无诊断】
- [ ] 7.10 迁移佣金计算/入账/失效和提现申请/审批/驳回纵向用例,关联店铺、订单、系列、佣金记录、提现单、钱包/流水和金额状态。【主:复杂写 Domain/ApplicationWorker/Outbox边界佣金与提现完整状态机不迁移统计 Query验证计算幂等、审批终态、资金同事务、失败短事务和资金时间线测试 PASSLSP 无诊断】
- [ ] 7.1 迁移套餐系列、套餐商品、店铺系列/套餐分配、批量定价和关键价格配置纵向用例,关联店铺、系列、套餐和价格历史,保持现有上架/分配规则。【主:简单写 + Application边界套餐配置与授权不迁移套餐购买流程验证before/after、批量根子、店铺时间线、凭据规则和旧 account 借用写归零核对通过LSP 无诊断】
- [ ] 7.2 迁移套餐权益激活、排队、流量重置/扣减、退款失效、资产失效和换货迁移纵向用例,系统任务使用真实 actor权益、订单、套餐和资产作为独立资源。【主复杂写 Domain/ApplicationWorker/Outbox边界package_usage 生命周期|不迁移:套餐列表 Query验证状态条件、重复任务幂等、系统 actor、父子链路和资源时间线核对通过LSP 无诊断】
- [ ] 7.3 迁移订单创建、后台代购、C 端/OpenAPI 购买、取消、钱包支付和过期关闭纵向用例,关联买家/操作者、资产、套餐、金额、支付方式、钱包/流水和购买角色。【主:复杂写 Domain/ApplicationOutbox边界订单状态与支付准备不迁移订单只读列表验证各入口 actor、成功/拒绝/失败、资金同事务、系统过期和链路核对通过LSP 无诊断】
- [ ] 7.4 迁移支付创建、微信/支付宝/富友预下单、查单和回调确认纵向用例:每次外部尝试写 Integration Log实际改变支付/订单/充值事实时写 Audit Event关联支付单、业务单、渠道交易号和 correlation。【主复杂写 + Infrastructure Adapter边界支付外部与内部终态不迁移渠道协议重构验证success/unknown/迟到回调/重复回调、series/correlation、Domain Ledger 和时间线核对通过LSP 无诊断】
- [ ] 7.5 迁移退款申请、审批终态、钱包回充、佣金失效、套餐/资产后处理和通知纵向用例,关联退款、审批、订单、资产、钱包、原扣款/退款流水、佣金和套餐权益,资金事实与审计同事务。【主:复杂写 Domain/ApplicationOutbox/Integration边界退款完整业务链不迁移原路退款等未实现能力验证通过/拒绝/重提/重复终态/失败回滚、资金时间线和代理安全结论核对通过LSP 无诊断】
- [ ] 7.6 迁移个人资产充值和代理在线/线下充值纵向用例,关联充值单、提交人、店铺/资产、支付或审批、钱包、交易流水和自动购包;外部回调与系统恢复使用真实 actor。【主复杂写 Domain/ApplicationPayment/Approval/Outbox边界充值创建至入账不迁移新充值渠道验证在线/线下、回调/审批、重复入账、unknown、资金同事务和主体投影核对通过LSP 无诊断】
- [ ] 7.7 迁移代理主钱包订单扣款和预占/释放/完成纵向用例,关联订单、钱包、预占、唯一流水和余额前后值。【主:复杂写 Domain/ApplicationOutbox边界订单资金占用与扣款不迁移充值/退款/信用额度|验证:乐观锁/状态条件、唯一业务键、审计失败回滚和失败短事务核对通过LSP 无诊断】
- [ ] 7.8 迁移代理主钱包充值入账、人工调整、退款回充和信用额度纵向用例,逐项关联业务单、原流水/新流水和余额前后值。【主:复杂写 Domain/ApplicationOutbox边界代理钱包正向及回退资金不迁移资产钱包与佣金提现验证重复入账/退款上限/人工原因/信用变更、同事务和资金查询核对通过LSP 无诊断】
- [ ] 7.9 迁移卡/设备资产钱包充值、扣款、退款和换货迁移纵向用例,关联资产完整标识、钱包、业务单和唯一流水。【主:复杂写 Domain/Application边界资产钱包资金不迁移代理主钱包验证卡/设备、换货、重复业务键、余额前后值和资源时间线核对通过LSP 无诊断】
- [ ] 7.10 迁移佣金计算/入账/失效和提现申请/审批/驳回纵向用例,关联店铺、订单、系列、佣金记录、提现单、钱包/流水和金额状态。【主:复杂写 Domain/ApplicationWorker/Outbox边界佣金与提现完整状态机不迁移统计 Query验证计算幂等、审批终态、资金同事务、失败短事务和资金时间线核对通过LSP 无诊断】
## 8. 审批、配置、批量与自动入口迁移
- [ ] 8.1 迁移通用审批和企微申请提交、回调同步、主动恢复及终态分发纵向用例,记录真实提交人、外部系统/系统任务 actor、审批实例、业务单、Integration Log 和 Outbox不伪造本地审批人。【主复杂写 Domain/ApplicationWeCom Adapter/Outbox边界审批完整链路不迁移新审批引擎验证提交、unknown、回调、恢复、重复终态、actor/correlation 和资源时间线测试 PASSLSP 无诊断】
- [ ] 8.2 迁移支付配置、运营商、企微应用/成员/场景及其他关键连接配置纵向用例,记录配置身份、状态和“凭据是否已配置”,不记录 Secret、Token、AESKey、私钥或证书正文。【主简单写 + Infrastructure Adapter边界外部连接配置不迁移配置 UI 与渠道业务协议验证CRUD/启停/校验失败、同事务、凭据删除和平台完整业务字段测试 PASSLSP 无诊断】
- [ ] 8.3 迁移卡/设备导入、资产套餐批购、订单套餐失效和导出任务创建/取消纵向用例,记录任务、文件名/目标/操作者和批量根子结果;对象存储签名 URL 不入审计审计中心自身仍不提供导出。【主Application + AsynqObject Storage边界现有导入批量和业务导出任务动作不迁移导出 DataSource 内容|验证:结构化 payload、幂等、partial、凭据删除和任务/资源时间线测试 PASSLSP 无诊断】
- [ ] 8.4 迁移通知生成、投递、单条/全部已读和清理纵向用例,低风险写仍登记 action系统清理使用系统 actorAudit Event 不替代通知或 Outbox 投递事实。【主:简单写/Application + Worker边界通知状态变化不迁移通知查询验证人工/系统 actor、低风险默认展示、Outbox 幂等和资源关联测试 PASSLSP 无诊断】
- [ ] 8.5 迁移轮询配置、并发配置、告警规则、人工触发/取消和状态变化纵向用例;手动轮询表继续承担进度/结果,实际 Gateway 尝试写 Integration Log人工触发动作另写 Audit Event。【主Application + AdapterScheduler/Query边界轮询配置与人工动作不迁移删除手动任务表和普通运行查询验证配置/触发/拒绝、任务 ledger 保留、Integration/Audit 分界和 actor 测试 PASSLSP 无诊断】
- [ ] 8.6 迁移支付、运营商实名和企微等外部 Callback 中实际改变内部事实的入口,使用 external actor无状态变化只保留 Integration Log。【主Application/Infrastructure Adapter边界当前外部回调不迁移渠道协议验证逐回调 action、幂等、资源解析、Integration/Audit 分界和链路测试 PASSLSP 无诊断】
- [ ] 8.1 迁移通用审批和企微申请提交、回调同步、主动恢复及终态分发纵向用例,记录真实提交人、外部系统/系统任务 actor、审批实例、业务单、Integration Log 和 Outbox不伪造本地审批人。【主复杂写 Domain/ApplicationWeCom Adapter/Outbox边界审批完整链路不迁移新审批引擎验证提交、unknown、回调、恢复、重复终态、actor/correlation 和资源时间线核对通过LSP 无诊断】
- [ ] 8.2 迁移支付配置、运营商、企微应用/成员/场景及其他关键连接配置纵向用例,记录配置身份、状态和“凭据是否已配置”,不记录 Secret、Token、AESKey、私钥或证书正文。【主简单写 + Infrastructure Adapter边界外部连接配置不迁移配置 UI 与渠道业务协议验证CRUD/启停/校验失败、同事务、凭据删除和平台完整业务字段核对通过LSP 无诊断】
- [ ] 8.3 迁移卡/设备导入、资产套餐批购、订单套餐失效和导出任务创建/取消纵向用例,记录任务、文件名/目标/操作者和批量根子结果;对象存储签名 URL 不入审计审计中心自身仍不提供导出。【主Application + AsynqObject Storage边界现有导入批量和业务导出任务动作不迁移导出 DataSource 内容|验证:结构化 payload、幂等、partial、凭据删除和任务/资源时间线核对通过LSP 无诊断】
- [ ] 8.4 迁移通知生成、投递、单条/全部已读和清理纵向用例,低风险写仍登记 action系统清理使用系统 actorAudit Event 不替代通知或 Outbox 投递事实。【主:简单写/Application + Worker边界通知状态变化不迁移通知查询验证人工/系统 actor、低风险默认展示、Outbox 幂等和资源关联核对通过LSP 无诊断】
- [ ] 8.5 迁移轮询配置、并发配置、告警规则、人工触发/取消和状态变化纵向用例;手动轮询表继续承担进度/结果,实际 Gateway 尝试写 Integration Log人工触发动作另写 Audit Event。【主Application + AdapterScheduler/Query边界轮询配置与人工动作不迁移删除手动任务表和普通运行查询验证配置/触发/拒绝、任务 ledger 保留、Integration/Audit 分界和 actor 核对通过LSP 无诊断】
- [ ] 8.6 迁移支付、运营商实名和企微等外部 Callback 中实际改变内部事实的入口,使用 external actor无状态变化只保留 Integration Log。【主Application/Infrastructure Adapter边界当前外部回调不迁移渠道协议验证逐回调 action、幂等、资源解析、Integration/Audit 分界和链路核对通过LSP 无诊断】
- [ ] 8.7 迁移当前 Worker 中实际改变内部业务事实的入口,使用 system_task actor 并传播 correlation/parent纯投递或技术装配按清单 N/A。【主Application/Asynq边界当前 Worker 写入口不迁移Scheduler 与 Callback验证逐 Worker 覆盖、幂等、失败重试和未登记动作门禁 PASSLSP 无诊断】
- [ ] 8.8 迁移当前 Scheduler 中实际创建任务、改变配置/状态或产生业务事实的入口,使用 scheduled_job actor实施时以当前清单为准不硬编码历史数量。【主Application/Scheduler边界当前计划任务不迁移Worker 消费逻辑|验证:逐 Scheduler 覆盖、重复调度幂等、父子链路和 N/A 理由 PASSLSP 无诊断】
- [ ] 8.9 迁移当前 Outbox 消费者中实际形成新业务事实的入口,保留 Outbox 投递事实并为内部变化写 system_task Audit Event不把投递成功伪装成业务成功。【主Application/Outbox Consumer边界当前可靠事件消费者不迁移Relay 实现|验证:逐消费者覆盖、至少一次幂等、业务/投递结果分离和 correlation 测试 PASSLSP 无诊断】
- [ ] 8.9 迁移当前 Outbox 消费者中实际形成新业务事实的入口,保留 Outbox 投递事实并为内部变化写 system_task Audit Event不把投递成功伪装成业务成功。【主Application/Outbox Consumer边界当前可靠事件消费者不迁移Relay 实现|验证:逐消费者覆盖、至少一次幂等、业务/投递结果分离和 correlation 核对通过LSP 无诊断】
## 9. 跨视角调查与性能收口
- [ ] 9.1 交付 request 和 correlation 组合时间线,按 `record_source` 组合 Audit Event、Integration Log、Outbox/Asynq 摘要及 Domain Ledger 引用,不扫描 Access Log、不猜测历史链路或技术重试。【主Query边界跨事实只读投影不迁移Access Log 存储与关系图|验证:支付、退款、审批、异步链路、历史缺字段和稳定排序测试 PASSLSP 无诊断】
- [ ] 9.2 交付资金调查时间线,按店铺、钱包、订单、支付、退款、充值、审批、交易号、操作者、时间和 correlation 查询并明确金额权威来自钱包流水及业务表。【主Query边界资金多源投影不迁移资金重算或状态修改验证余额变化、退款、充值、佣金、来源冲突和权限身份测试 PASSLSP 无诊断】
- [ ] 9.3 交付风险 overview/events聚合高风险、资金、安全、失败、拒绝、partial 和 unknown支持跳转事件、资源、actor 和 correlation不建设处置工单或自动封禁。【主Query边界固定风险调查视角不迁移风控决策系统验证计数/趋势、低风险排除、跳转和时间范围性能测试 PASSLSP 无诊断】
- [ ] 9.4 为事件、资源、actor、action/result/risk、scope、request、correlation、parent 及跨视角常用过滤补最小索引,使用先分页 ID 后批量投影避免 N+1不为第一阶段增加 JSONB 任意模糊搜索或 Redis 结果缓存。【主Query/Infrastructure + Migration边界已确认查询路径不迁移数据库月分区与冷热联合查询验证迁移 up/down、EXPLAIN/基准、数据库 <50ms、API P95/P99 和并发分页测试 PASSLSP 无诊断】
- [ ] 9.1 交付 request 和 correlation 组合时间线,按 `record_source` 组合 Audit Event、Integration Log、Outbox/Asynq 摘要及 Domain Ledger 引用,不扫描 Access Log、不猜测历史链路或技术重试。【主Query边界跨事实只读投影不迁移Access Log 存储与关系图|验证:支付、退款、审批、异步链路、历史缺字段和稳定排序核对通过LSP 无诊断】
- [ ] 9.2 交付资金调查时间线,按店铺、钱包、订单、支付、退款、充值、审批、交易号、操作者、时间和 correlation 查询并明确金额权威来自钱包流水及业务表。【主Query边界资金多源投影不迁移资金重算或状态修改验证余额变化、退款、充值、佣金、来源冲突和权限身份核对通过LSP 无诊断】
- [ ] 9.3 交付风险 overview/events聚合高风险、资金、安全、失败、拒绝、partial 和 unknown支持跳转事件、资源、actor 和 correlation不建设处置工单或自动封禁。【主Query边界固定风险调查视角不迁移风控决策系统验证计数/趋势、低风险排除、跳转和时间范围性能核对通过LSP 无诊断】
- [ ] 9.4 为事件、资源、actor、action/result/risk、scope、request、correlation、parent 及跨视角常用过滤补最小索引,使用先分页 ID 后批量投影避免 N+1不为第一阶段增加 JSONB 任意模糊搜索或 Redis 结果缓存。【主Query/Infrastructure + Migration边界已确认查询路径不迁移数据库月分区与冷热联合查询验证迁移 up/down、EXPLAIN/基准、数据库 <50ms、API P95/P99 和并发分页核对通过LSP 无诊断】
- [ ] 9.5 完成跨视角 Handler/DTO/RouteSpec、生产装配、共享文档 Handler、`cmd/api/docs.go``cmd/gendocs/main.go` 和中文功能/API 文档,前端契约必须逐行呈现 design 8.1-8.4 的源页面、前置接口、`response.data` 字段、入口名称/可见条件、目标接口、参数映射和降级行为,不得只罗列审计 API。【主API/Documentation边界9.1-9.3 查询接口|不迁移:前端页面实现|验证:以资产详情、订单、退款、钱包、通知、风险节点逐条演示完整调用链,两条 OpenAPI、README 索引和构建检查 PASSLSP 无诊断】
## 10. 每日冷归档与月初受控清理
- [ ] 10.1 交付 Audit Event + Event Resource 每日归档纵向切片:新增无外键 `tb_log_archive_run`、按 `Asia/Shanghai` 前一完整自然日读取、事件携带完整 resources 的 JSONL+gzip、manifest/SHA-256、对象 metadata 复核、稳定对象 Key 与重复任务幂等;复用现有对象存储和 Asynq不阻塞业务 Writer。【主Infrastructure + Application/Asynq边界Audit 每日冷归档完整闭环不迁移Integration、Access、清理与归档查询验证迁移 up/down、空日/大日、事件资源计数、对象损坏、重复投递、存储故障和业务写入隔离测试 PASSLSP 无诊断】
- [ ] 10.2 交付 Integration Log 每日归档及月度最终 revision 纵向切片:每日保存创建日快照,月初按数据库当前内容复核可变记录,内容变化时创建不可变新 revisionpending 或不一致阻止清理不覆盖旧对象。【主Infrastructure + Application/Asynq边界Integration 冷归档最终性不迁移Integration Writer 语义、恢复和对象存储查询验证pending→success/unknown、跨月更新、hash 变化、重复复核、无法终结和对象版本测试 PASSLSP 无诊断】
- [ ] 10.3 交付月初整月数据库物理删除纵向切片:先完成上月最后一天归档,再校验全部日期的 Audit/Integration manifest、Audit 事件与资源数、Integration 最终 revision、对象大小和 SHA-256通过后使用 GORM、索引和有界批次按先 Event Resource 后 Event、再 Integration 的受控流程物理 `DELETE` PostgreSQL 上月数据,任务可从 ledger 断点继续,并写当前月 `retention_worker` Audit Event审计 Model 不含 `gorm.DeletedAt`不写归档状态、不迁移数据库历史表、不删除对象存储备份。【主Application + Infrastructure/Asynq边界归档门禁与 PostgreSQL 上月数据物理删除不迁移Access Log、Domain Ledger、Outbox、旧 operation log、对象存储生命周期、分区改造和人工清表验证缺日/hash 不一致/部分对象/pending 全部阻断,物理行数归零、批次中断续跑、窗口隔离、对象长期保留、清理事件和数据库膨胀指标测试 PASSLSP 无诊断】
- [ ] 10.4 为平台 Audit/Integration 及代理/企业活动 DTO 增加 `retention{online_from,archived_before,timezone}`显式时间范围早于或跨越在线边界时返回稳定已归档错误默认只查在线窗口ID-only 不存在仍按资源不存在处理不访问对象存储也不新增下载或恢复路由。【主Query/API边界在线查询留存语义不迁移冷热联合查询和前端页面实现验证在线、已归档、跨边界、默认范围、空在线月、路由/OpenAPI 无归档读写能力测试 PASSLSP 无诊断】
- [ ] 10.1 交付 Audit Event + Event Resource 每日归档纵向切片:新增无外键 `tb_log_archive_run`、按 `Asia/Shanghai` 前一完整自然日读取、事件携带完整 resources 的 JSONL+gzip、manifest/SHA-256、对象 metadata 复核、稳定对象 Key 与重复任务幂等;复用现有对象存储和 Asynq不阻塞业务 Writer。【主Infrastructure + Application/Asynq边界Audit 每日冷归档完整闭环不迁移Integration、Access、清理与归档查询验证迁移 up/down、空日/大日、事件资源计数、对象损坏、重复投递、存储故障和业务写入隔离核对通过LSP 无诊断】
- [ ] 10.2 交付 Integration Log 每日归档及月度最终 revision 纵向切片:每日保存创建日快照,月初按数据库当前内容复核可变记录,内容变化时创建不可变新 revisionpending 或不一致阻止清理不覆盖旧对象。【主Infrastructure + Application/Asynq边界Integration 冷归档最终性不迁移Integration Writer 语义、恢复和对象存储查询验证pending→success/unknown、跨月更新、hash 变化、重复复核、无法终结和对象版本核对通过LSP 无诊断】
- [ ] 10.3 交付月初整月数据库物理删除纵向切片:先完成上月最后一天归档,再校验全部日期的 Audit/Integration manifest、Audit 事件与资源数、Integration 最终 revision、对象大小和 SHA-256通过后使用 GORM、索引和有界批次按先 Event Resource 后 Event、再 Integration 的受控流程物理 `DELETE` PostgreSQL 上月数据,任务可从 ledger 断点继续,并写当前月 `retention_worker` Audit Event审计 Model 不含 `gorm.DeletedAt`不写归档状态、不迁移数据库历史表、不删除对象存储备份。【主Application + Infrastructure/Asynq边界归档门禁与 PostgreSQL 上月数据物理删除不迁移Access Log、Domain Ledger、Outbox、旧 operation log、对象存储生命周期、分区改造和人工清表验证缺日/hash 不一致/部分对象/pending 全部阻断,物理行数归零、批次中断续跑、窗口隔离、对象长期保留、清理事件和数据库膨胀指标核对通过LSP 无诊断】
- [ ] 10.4 为平台 Audit/Integration 及代理/企业活动 DTO 增加 `retention{online_from,archived_before,timezone}`显式时间范围早于或跨越在线边界时返回稳定已归档错误默认只查在线窗口ID-only 不存在仍按资源不存在处理不访问对象存储也不新增下载或恢复路由。【主Query/API边界在线查询留存语义不迁移冷热联合查询和前端页面实现验证在线、已归档、跨边界、默认范围、空在线月、路由/OpenAPI 无归档读写能力核对通过LSP 无诊断】
- [ ] 10.5 先以“只归档、不清理”开关运行并验收一个完整自然月记录每日成功率、积压、对象大小、压缩率、hash/计数差异、Integration revision、清理预估耗时和告警只有月度演练全部通过后才启用清理开关。【主Release/Observability边界留存能力灰度启用不迁移Access Log、自动恢复和分区改造验证完整月 manifest、故障重试、月度 dry-run、监控阈值、操作手册和启停回滚证据齐全】
## 11. 旧 Writer Contract 与发布门禁
- [ ] 11.1 完成账号、资产及借用旧 account audit 的充值/套餐/支付配置等调用清单逐项归零,删除生产组合根对旧 Writer 的注入和所有裸/双重 goroutine 审计写入;旧表原样保留且不接入新审计 Query既有旧资产历史入口与手动轮询运行写入显式白名单。【主Infrastructure/Governance边界旧 operation log contract不迁移旧数据回填/转换、删除旧表和历史数据|验证:静态扫描、生产装配、统一 Query 无旧表依赖、真实业务写入和旧表无新增测试 PASSLSP 无诊断】
- [ ] 11.1 完成账号、资产及借用旧 account audit 的充值/套餐/支付配置等调用清单逐项归零,删除生产组合根对旧 Writer 的注入和所有裸/双重 goroutine 审计写入;旧表原样保留且不接入新审计 Query既有旧资产历史入口与手动轮询运行写入显式白名单。【主Infrastructure/Governance边界旧 operation log contract不迁移旧数据回填/转换、删除旧表和历史数据|验证:静态扫描、生产装配、统一 Query 无旧表依赖、真实业务写入和旧表无新增核对通过LSP 无诊断】
- [ ] 11.2 执行最终 Action/Resource Registry 与当前代码覆盖比对并增量更新 `.scratch/tech-global-audit/审计覆盖基线.md`,确认所有非查询写入口和 Registry 标记的敏感读取均登记、普通查询/N/A 有理由,多资源/设备卡槽/换货/批量/资金/自动入口无遗漏未注册动作或资源使门禁失败。【主治理边界全仓当前入口不迁移未来未提交功能验证覆盖门禁、Registry 清单、基线文件和业务/研发/安全签字证据齐全】
- [ ] 11.3 执行安全与身份发布门禁:平台接口仅 SuperAdmin/Platform、代理店铺层级、企业有效授权、internal_only 不泄露、业务字段平台完整、所有系统安全凭据在库和响应中均不存在、无用户审计导出、对象存储查询/恢复或业务删除路由。【主Security/API边界第一阶段访问与字段契约不迁移细粒度权限码验证敌对 HTTP 场景、数据库抽样、路由/OpenAPI 扫描全部 PASS】
- [ ] 11.4 执行事务、幂等与跨链路发布门禁关键成功审计失败回滚、失败短事务保留原错、批量根子计数一致、correlation/parent/series 正确、Audit/Integration/Domain Ledger/Outbox 边界没有混用。【主Verification边界高风险和代表性流程不迁移业务规则优化验证全部验收测试和业务流程测试 PASS,已知错误为零】
- [ ] 11.4 执行事务、幂等与跨链路发布门禁关键成功审计失败回滚、失败短事务保留原错、批量根子计数一致、correlation/parent/series 正确、Audit/Integration/Domain Ledger/Outbox 边界没有混用。【主Verification边界高风险和代表性流程不迁移业务规则优化验证代表性业务流程的接口、数据库与日志证据核对通过,已知错误为零】
- [ ] 11.5 执行迁移、性能、OpenAPI、归档留存和回滚演练增量迁移可在无事实环境 down业务回滚保留在线窗口内事实归档失败阻止清理清理后不恢复旧 Writer或伪造在线历史记录监控阈值和操作手册。【主Release/Infrastructure边界一次 contract 发布|不迁移:数据库分区、冷热联合查询与自动恢复|验证:迁移演练、性能目标、归档 dry-run、两份文档生成、构建、监控和回滚演练全部 PASS】
## 12. 最终文档与交付确认
- [ ] 12.1 在 `docs/feature-504-multi-view-audit-center/` 编写中文总结,包含四类事实边界、字段字典、当前领域/资源/动作矩阵、各资源快照、所有查询视角与 DTO、平台和主体可见性、多卡设备/换货/资金/批量样例、每日归档与月度清理、在线窗口、异常闭环、发布回滚、监控和明确未实现项,并更新 README 索引。【主Documentation边界本 Change 完整交付不迁移旧历史评审文档验证文档逐项引用实现、OpenAPI 和验收证据,无过时字段或路径】
- [ ] 12.2 汇总测试、静态扫描、LSP、迁移、构建、OpenAPI、数据库性能、API P95/P99、身份隔离、凭据抽样、旧写归零、归档完整性、月度清理 dry-run 和业务流程证据,逐条核对 proposal/design/specs/tasks只有全部完成且无已知错误时才标记 Change 可归档。【主:最终验收|边界:全部能力|不迁移:后续权限码、用户导出、对象存储历史查询/恢复、分区、风险处置和自动恢复|验证:全部验收测试 PASS + 全部流程测试 PASS + OpenSpec strict validate PASS】
- [ ] 12.2 汇总静态扫描、LSP、迁移、构建、OpenAPI、数据库性能、API P95/P99、身份隔离、凭据抽样、旧写归零、归档完整性、月度清理 dry-run 和业务流程证据,逐条核对 proposal/design/specs/tasks只有全部完成且无已知错误时才标记 Change 可归档。【主:最终验收|边界:全部能力|不迁移:后续权限码、用户导出、对象存储历史查询/恢复、分区、风险处置和自动恢复|验证:制品与人工/数据证据核对通过 + OpenSpec strict validate PASS】

View File

@@ -175,7 +175,7 @@
### B3-01 UR34 代理充值
- [ ] 4.1 交付在线/线下充值共用的状态模型、幂等指纹、支付/审批/处理三套状态、迁移与 Query 投影。【主:复杂写 + Query不迁移C 端支付全模块依赖2.32】
- [ ] 4.2 交付代理当前店铺可用支付方式与在线充值创建100 元100 万元、新 request_id 新业务单/支付单、微信 Native/支付宝 PreCreate、结果未知恢复和 qr_content 原样返回。【主:复杂写 + Payment Adapter不迁移二维码图片/多通道池依赖2.29、2.57】
- [ ] 4.2 交付代理当前店铺可用支付方式与在线充值创建100 元100 万元、新 request_id 新业务单/支付单、按当前配置使用微信 v3 H5 或 v2 MWEB、复用支付宝 WAP 支付 URL、结果未知恢复和 qr_content 原样返回。【主:复杂写 + Payment Adapter不迁移二维码图片/多通道池依赖2.29、2.57】
- [ ] 4.3 交付支付回调与受控查单共用确认用例:渠道/配置/金额/交易号/业务关联校验,迟到成功优先,支付事实与入账 Outbox 同事务。【主复杂写Integration Log/Outbox不迁移前端轮询触发查单依赖4.2】
- [ ] 4.4 交付钱包入账 Worker唯一流水、版本、处理租约、状态恢复和目标主账号/真实提交人到账通知,支付已成功时失败不得回滚收款事实。【主:复杂写 Wallet Application不迁移人工重复入账依赖2.29、2.8、4.3】
- [ ] 4.5 交付平台/超管线下代充值业务核心:后端计算固定金额、保存 15 付款凭证原件和请求快照,通过 Approval Port 创建通用审批实例;消费标准决策完成通过入账、拒绝/删除/撤销终结和通过后撤销分流,旧 offline-pay/reject 仅在渠道装配可用后停机下线。【主:复杂写 Application/DomainApproval Port/Worker边界线下代充规则和终态处理不迁移企微 SDK/DTO/`sp_no`/状态码不建本地审批流引擎或操作密码依赖2.92.12、2.29、4.1、4.4】
@@ -243,7 +243,7 @@
- [ ] 6.1 恢复并完成所有单元、集成、HTTP、业务流程、并发、迁移、权限、性能与回归自动化补齐本轮未新增的 `_test.go`,运行完整 `go test ./...` 并保留最终代码证据。
- [ ] 6.2 完成真实企业微信模板、平台本人绑定、代理固定成员、附件、提交、加密回调、轮询、同意/拒绝/撤销/删除/结果未知恢复,以及退款和线下充值终态验收。
- [ ] 6.3 完成真实 PostgreSQL、Redis/Asynq、对象存储、微信 Native、支付宝 PreCreate/TradeQuery/回调、支付成功未入账恢复与导出文件验收。
- [ ] 6.3 完成真实 PostgreSQL、Redis/Asynq、对象存储、微信 v3 H5/v2 MWEB、支付宝 WAP/TradeQuery/回调、支付成功未入账恢复与导出文件验收。
- [ ] 6.4 完成真实 Gateway 限速账号/运营商档位、设备当前卡、失败/结果未知,以及移动/联通/电信运营商回调和 19/20 位 ICCID 验收。
- [x] 6.5 明确全局 Audit Event 治理移出本 Change不实现 Writer、业务覆盖、历史投影、审计中心、敏感读取/导出/保留或一次性切换门禁,不阻塞本次实际上线;未来如需建设另开独立 Change。
- [ ] 6.6 完成后台、代理端、C 端全部页面与真实人工验收矩阵,包括异步部分成功、权限空态、通知、临期、换货历史抽样、余额预警和状态展示。

View File

@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-08-03

View File

@@ -0,0 +1,120 @@
## Context
线上诊断得到旧孤儿扫描窗口 `scanned_count=100``skipped_as_occupied=100``waiting_realname=0`。这证明“先取前 100 条待生效记录,再在 Go 中逐条排除占位载体”的实现会让窗口之外的真实孤儿永久饥饿。
七月迭代分支虽然仍保留旧 `enqueueActivationTask`,但已经具备更合适的本地接续边界:`ActivationService.ActivateNextPendingMainPackage` 负责载体锁、队首选择、条款快照、状态事务和提交后复机;实际激活事务还会原子追加 `card.observation.series.requested` Outbox。套餐状态推进本身是本地数据库用例不需要再经过一次 Asynq 才能执行。
本设计仅适用于 `Iteration/7-11`,不包含任何 `main` 分支兼容、纯 Asynq 热修或跨分支移植决策。
## Goals / Non-Goals
**Goals:**
- 每轮最多 100 个恢复名额只用于无占位主套餐的真实孤儿载体,同一载体只选择队首套餐。
- 旧主套餐过期事实提交后,直接调用七月分支现有接续能力推进下一套餐。
- 孤儿恢复直接复用同一接续能力,不再创建第二条异步激活链。
- 套餐激活状态与既有卡观测 Outbox 保持同一事务,后续观测继续可靠投递。
- 日志准确区分实际激活、幂等、锁冲突和业务条件未满足。
**Non-Goals:**
- 不涉及 `main`,不生成可向 `main` cherry-pick 的修复提交。
- 不新增套餐激活 Outbox 事件、消费者、迁移或队列类型。
- 不删除仍可能被其他旧入口使用的 `TaskTypePackageQueueActivation` 和 Handler只停止过期接续与孤儿恢复继续走该路径。
- 不修改购买、优先级分配、实名激活、流量扣减、退款失效和停复机规则。
- 不新增 API、DTO、路由、依赖、数据库字段或索引。
- 按用户要求,不新增、修改或运行自动化测试。
## Decisions
### 决策 1数据库先选择真实孤儿队首再执行 LIMIT
孤儿查询通过 GORM 执行 PostgreSQL CTE/窗口查询:
1.`status=0 AND master_usage_id IS NULL AND deleted_at IS NULL` 按卡或设备载体分组。
2. 每个载体按 `priority ASC, created_at ASC, id ASC` 选择唯一队首。
3. 通过相关 `NOT EXISTS` 排除仍有 `status IN (1,2)` 主套餐的载体。
4. 对真实孤儿稳定排序后执行 `LIMIT 100`
查询结果直接进入同步接续循环,删除逐条 `Count` 和 Go map 二次分组。
**拒绝:仅增大 LIMIT。** 数据增长后仍会复现,并放大 N+1。
**拒绝:游标扫描所有待生效记录。** 需要维护扫描状态,复杂度高于一次正确查询。
### 决策 2过期事务提交后同步调用现有接续服务
`processExpiredPackage` 的事务继续负责旧主套餐 `status=3` 和关联加油包 `status=4`。事务成功提交后Handler 调用 `ActivateNextPendingMainPackage(ctx, carrierType, carrierID)`,不再调用 `activateNextPackage` 投递 Asynq。
若进程在两次事务之间退出,数据库会留下“无占位主套餐 + 有待生效套餐”的持久状态,下一轮修正后的孤儿扫描会直接调用同一接续能力恢复,最长增加一个轮询周期。
**拒绝:事务内直接投递 Asynq。** 消费者可能早于事务提交读取旧状态。
**拒绝:新增套餐激活 Outbox。** 状态推进是本地同步用例,现有服务已经具备完整事务;新增事件只会形成第二套调度和消费状态。需要可靠投递的后续卡观测已经由激活事务写入现有 Outbox。
### 决策 3孤儿恢复同步调用同一接续服务
每个真实孤儿候选只携带载体类型和 ID调用 `ActivateNextPendingMainPackage`。服务在事务内重新检查占位状态和队首,避免依赖扫描快照执行写操作;载体级 Redis 锁防止多个轮询实例并发激活。
锁冲突返回现有 `CodePackageActivationConflict`。轮询记录原因后结束本次候选,下一轮扫描继续恢复,不依赖 Asynq 重试。
### 决策 4复用现有卡观测 Outbox
成功激活仍通过 `appendActivationObservation` 在套餐激活事务内追加稳定事件:
- 事件类型:`card.observation.series.requested`
- 稳定事件 ID`card-observation:package-usage:{usage_id}:activated`
- 同步类型:实名、流量、网络
- 资源:实际卡或设备载体
Outbox 写入失败时套餐激活事务回滚避免状态已生效但后续观测请求丢失。不新增套餐激活事件、Relay 或消费者。
### 决策 5日志以实际结果为准
`ActivateNextPendingMainPackage` 已返回 `activated bool`。调用方仅在 `activated=true` 时记录本轮成功;`false,nil` 表示幂等或条件暂不满足,记录明确结果;锁冲突和数据库错误按错误路径记录,不伪造成功。
### 决策 6公共能力决定
- **Audit EventN/A。** 系统自动生命周期推进,不是人工敏感操作。
- **Domain LedgerN/A。** `tb_package_usage` 是套餐状态、激活和到期的权威事实。
- **Integration LogN/A。** 本修复不新增外部请求。
- **Outbox复用。** 成功激活继续在同一事务写 `card.observation.series.requested`;不新增事件类型。
实施时增量维护 `.scratch/tech-global-audit/审计覆盖基线.md`
### 决策 7不包含自动化测试
按用户明确要求,本 Change 不创建、修改或运行自动化测试。验证使用:
- `gofmt` 和现有静态检查;
- `go build ./...`
- 只读候选 SQL及 `EXPLAIN (ANALYZE, BUFFERS)`
- 日志顺序和激活结果核验;
- 激活事务与卡观测 Outbox 记录的一致性查询。
## Risks / Trade-offs
- **[风险] 候选查询扫描大量待生效记录** → 用现有索引和查询计划验证;没有性能证据前不新增索引。
- **[风险] 旧套餐提交后、接续调用前进程退出** → 下一轮真实孤儿扫描从数据库权威状态恢复。
- **[风险] 多实例重复处理同一载体** → 服务内载体级 Redis 锁、事务内占位复检和状态幂等共同收敛。
- **[风险] 同步接续增加单轮耗时** → 单轮最多 100 个真实孤儿,接续仅执行本地 Redis/数据库事务;记录耗时后再决定是否需要批次调整。
- **[权衡] 保留旧 Asynq Handler** → 避免扩大未触碰调用方;本 Change 只让过期和孤儿两条路径停止使用它。
- **[权衡] 不新增自动化测试** → 遵循用户边界以构建、SQL、查询计划和日志证据替代。
## Migration Plan
1.`Iteration/7-11` 实施真实孤儿查询和同步接续调用。
2. 更新审计覆盖基线与功能总结,执行格式化、静态检查和 `go build ./...`
3. 用只读 SQL/查询计划验证候选公平性,用运行日志和数据库事实核验同步接续及卡观测 Outbox。
4. 形成七月分支专属 Lore commit该提交不面向 `main` 移植。
5. 发布七月迭代时观察至少两个轮询周期,确认真实孤儿收敛且卡观测 Outbox 正常投递。
### 回滚
- 无数据库迁移,回滚七月专属修复提交并重新部署 Worker。
- 已正确激活的套餐保持业务事实,不执行反向 SQL。
- 回滚后出现孤儿时,使用带状态条件的单卡修复 SQL逐条处理。
## Open Questions
无。本 Change 明确仅属于七月迭代分支。

View File

@@ -0,0 +1,36 @@
## Why
功能 ID`feature-505-package-activation-recovery`
生产环境已第二次出现“原主套餐已过期、队首待生效主套餐仍停留在 `status=0`”的问题。只读数据证明旧孤儿扫描每轮固定读取的 100 条记录全部仍有占位主套餐,真实孤儿因此永久无法进入恢复窗口;七月迭代分支需要按其现有同步接续能力和卡观测 Outbox 架构消除同类缺陷,避免未来覆盖发布后继续复现。
## What Changes
- 将孤儿恢复改为由 PostgreSQL 在限流前完成“每个载体只选队首套餐”和“排除仍有 `status IN (1,2)` 占位主套餐”的筛选,避免固定前 100 条造成永久饥饿,并删除逐条占位检查的 N+1 查询。
- 七月分支的过期接续不再投递 `package:queue:activation` Asynq 任务:旧套餐过期事务提交后,直接调用现有 `ActivateNextPendingMainPackage` 推进队首套餐。
- 孤儿恢复同样直接调用 `ActivateNextPendingMainPackage`,复用载体级 Redis 锁、状态幂等、购买条款快照和激活事务。
- 套餐激活事务继续原子写入现有 `card.observation.series.requested` Outbox由七月分支公共 Outbox 可靠驱动后续实名、流量和网络观测;不新增第二种套餐激活事件。
- 收紧结果日志:只有实际推进套餐状态时记录激活成功,锁冲突、占位阻塞、等待实名和幂等跳过分别记录稳定原因。
- 按用户明确要求,本 Change 不新增、修改或运行自动化测试;使用全量构建、只读 SQL、查询计划和运行日志完成验证。
## Capabilities
### New Capabilities
无。
### Modified Capabilities
- `package-queue-activation`:将七月迭代的过期接续与孤儿恢复收口为同步应用调用,并补充真实孤儿公平扫描和既有卡观测 Outbox 一致性要求。
## Impact
- **适用分支**:仅 `Iteration/7-11`;本 Change 不描述、不实施、不引用 `main` 线上热修。
- **架构通道**:主通道为套餐生命周期复杂写,沿用 `Polling Handler → Package Activation Service → GORM transaction`;辅助通道为 PostgreSQL 候选查询、Redis 载体锁和既有卡观测 Outbox。完整边界只覆盖“旧套餐过期后接续队首套餐及孤儿恢复”不迁移购买、实名、流量、退款和停复机用例。
- **主要代码**`internal/polling/package_activation_handler.go`、必要时最小调整 `internal/service/package/activation_service.go` 的结果日志;复用现有 `internal/infrastructure/cardobservation/series_event.go` 和公共 Outbox 装配。
- **数据库**:不新增表、字段、索引或迁移;只调整现有 `tb_package_usage` 查询和调用顺序。
- **API/前端**无接口、DTO、路由和前端改动。
- **依赖**:不新增依赖,继续使用 GORM、PostgreSQL、Redis、Zap 及七月分支已有 Outbox。
- **性能**:孤儿扫描从“最多 100 条候选 + 最多 100 次占位查询”收敛为一次数据库候选查询和最多 100 次有业务意义的同步激活调用;使用 `EXPLAIN (ANALYZE, BUFFERS)` 验证查询成本。
- **审计与可靠性**Audit Event N/A系统自动生命周期推进`tb_package_usage` 是状态权威事实Integration Log N/A本修复不新增外呼复用现有 `card.observation.series.requested` Outbox不新增事件类型。
- **验证**:不写自动化测试;执行 `gofmt`、现有静态检查、`go build ./...`、只读 SQL、查询计划和日志核验。

View File

@@ -0,0 +1,99 @@
## MODIFIED Requirements
### Requirement: 当前主套餐过期后自动激活下一个
系统 SHALL 在生效中或已用完的主套餐到期时,先提交旧主套餐和关联加油包的状态变化,再通过现有套餐激活应用能力同步推进同一载体的队首待生效主套餐;过期接续路径 MUST NOT 在旧主套餐事务内投递 `package:queue:activation` 任务。
成功激活队首套餐时,系统 SHALL 在套餐激活事务内同步追加现有 `card.observation.series.requested` Outbox任一写入失败时激活事务 MUST 回滚。
#### Scenario: 旧主套餐提交过期后同步接续队首套餐
- **WHEN** 轮询处理一个已到期的 `status=1``status=2` 主套餐,且同载体存在队首待生效套餐
- **THEN** 系统先提交旧主套餐 `status=3` 和关联加油包失效的数据库事务
- **AND** 事务提交后调用现有套餐激活应用能力
- **AND** 应用能力在新事务内重新校验占位状态并激活队首套餐
- **AND** 过期接续路径不投递 `package:queue:activation` 任务
#### Scenario: 激活与卡观测 Outbox 原子提交
- **WHEN** 队首套餐满足激活条件
- **THEN** 系统在同一事务内把套餐推进为 `status=1`并写入激活、到期及适用的重置时间
- **AND** 同一事务追加稳定的 `card.observation.series.requested` Outbox
- **AND** Outbox 写入失败时套餐状态回滚为待生效
#### Scenario: 过期事务失败时不接续
- **WHEN** 更新旧主套餐或级联失效加油包的事务失败
- **THEN** 事务回滚
- **AND** 系统不得调用队首套餐激活能力
- **AND** 下一轮过期扫描仍可重新处理该旧主套餐
#### Scenario: 提交后进程退出由孤儿扫描恢复
- **WHEN** 旧主套餐过期事务已经提交,但进程在调用接续能力前退出
- **THEN** 待生效套餐保持 `status=0`
- **AND** 下一轮孤儿扫描识别该载体并直接调用同一套餐激活能力
#### Scenario: 无待生效套餐时保持无套餐状态
- **WHEN** 旧主套餐过期事务提交后,同载体不存在有效的 `status=0` 主套餐
- **THEN** 套餐激活应用能力不推进任何记录
- **AND** 载体进入无主套餐状态并沿用既有停机检查流程
## ADDED Requirements
### Requirement: 孤儿待生效套餐必须公平恢复
系统 SHALL 在数据库中先选出每个卡或设备载体唯一的队首待生效主套餐,并排除仍存在 `status IN (1,2)` 占位主套餐的载体,最后才对真实孤儿结果执行单轮上限;系统 MUST NOT 先从全库待生效记录截取固定窗口再逐条判断占位状态。
队首顺序 SHALL 为 `priority ASC, created_at ASC, id ASC`。单轮最多处理 100 个真实孤儿载体,同一载体不得占用多个恢复名额。每个候选 SHALL 直接调用现有套餐激活应用能力,不投递 `package:queue:activation` 任务。
#### Scenario: 前一百条待生效记录均有占位套餐
- **WHEN** 全库排序靠前的 100 条待生效记录所属载体均存在 `status IN (1,2)` 主套餐,且窗口之后存在一条无占位主套餐的真实孤儿
- **THEN** 数据库先排除这 100 条非孤儿记录
- **AND** 真实孤儿进入本轮恢复候选
- **AND** 系统直接调用套餐激活应用能力推进其队首套餐
#### Scenario: 同一载体存在多条待生效套餐
- **WHEN** 一个无占位主套餐的载体存在多条 `status=0` 主套餐
- **THEN** 本轮只选择 `priority` 最小、其次 `created_at` 最早、最后 `id` 最小的一条
- **AND** 该载体只占用一个恢复名额
- **AND** 后续套餐继续保持排队状态
#### Scenario: 生效中和已用完套餐均属于占位
- **WHEN** 待生效套餐所属载体仍有 `status=1``status=2` 的主套餐
- **THEN** 该载体不得进入孤儿恢复候选
- **AND** 待生效套餐保持排队状态
#### Scenario: 单轮真实孤儿超过上限
- **WHEN** 数据库存在超过 100 个真实孤儿载体
- **THEN** 系统按稳定顺序选择前 100 个载体调用接续能力
- **AND** 未选中的真实孤儿在后续轮询中继续具备候选资格
### Requirement: 同步接续结果必须准确记录
系统 SHALL 仅在套餐激活应用能力返回 `activated=true` 时记录本轮激活成功。锁冲突、占位状态变化、等待实名和已完成幂等结果不得记录为新的激活成功。
#### Scenario: 本轮成功激活
- **WHEN** 指定载体无占位主套餐且队首套餐满足激活条件
- **THEN** 应用能力返回 `activated=true`
- **AND** 轮询记录包含套餐使用记录、载体和触发来源的成功结果
#### Scenario: 激活锁冲突
- **WHEN** 同步接续未获得载体级 Redis 激活锁
- **THEN** 应用能力返回现有套餐激活冲突错误
- **AND** 本轮不得记录激活成功
- **AND** 下一轮过期或孤儿扫描继续恢复
#### Scenario: 条件暂不满足
- **WHEN** 应用能力复检发现载体已有占位主套餐或队首仍等待实名
- **THEN** 应用能力不修改套餐状态
- **AND** 轮询记录明确原因
- **AND** 后续扫描仍可重新判断

View File

@@ -0,0 +1,29 @@
## 0. 七月分支基线与边界
- [ ] 0.1 在 `Iteration/7-11` 记录套餐激活相关代码、现有卡观测 Outbox 装配和工作树状态,确认本 Change 只覆盖“旧套餐过期后接续队首套餐及孤儿恢复”,不涉及 `main`、线上纯 Asynq 热修或其他套餐用例。验证:相关文件差异摘要不包含跨分支移植计划。
- [ ] 0.2 保存生产故障只读基线 `100/100/0`,准备真实孤儿候选 SQL和 `EXPLAIN (ANALYZE, BUFFERS)`;所有 SQL 仅允许读取。验证SQL 能区分占位记录、真实孤儿和每个载体的稳定队首。
- [ ] 0.3 增量更新 `.scratch/tech-global-audit/审计覆盖基线.md`Audit 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 一致性、发布观察、回滚和未执行自动化测试声明。验证:文档不出现 `main`、cherry-pick 或纯 Asynq 热修步骤。
- [ ] 3.4 复核七月分支差异并使用中文 Lore commit 提交修复。验证:提交不包含线上 `main` 提案或实现,可独立 revert`openspec validate fix-package-activation-starvation --strict` 通过。
## 4. 七月迭代发布观察
- [ ] 4.1 部署前记录真实孤儿数量、最老等待时间、同载体重复生效检查和卡观测 Outbox 待投递状态部署后观察至少两个轮询周期。验证真实孤儿持续收敛、无重复生效、Outbox 正常投递。
- [ ] 4.2 准备回滚说明:无数据库迁移,仅 revert 七月专属修复提交并重新部署 Worker已正确激活的套餐不反向修改。验证说明包含观察停止条件和带状态保护的单卡人工恢复边界。