完善公共基础接入与全局审计闭环

This commit is contained in:
2026-07-23 19:10:30 +09:00
parent 17782d5f8e
commit 7e0171a8b4
32 changed files with 295 additions and 26 deletions

View File

@@ -18,6 +18,8 @@ Access Log 当前只递归脱敏请求体,响应体仍原样记录,登录 To
本次切换覆盖全部现有敏感写操作:新旧业务统一使用 Audit Writer旧账号、资产和手动轮询审计表停止新增不双写历史数据保留原表并通过 Query 只读投影到新审计中心。切换准备或验证失败则本次版本整体不放量,不能以局部模块继续写旧表作为中间态。
“全部现有敏感写操作”以仓库级《审计覆盖基线》为可验收证据,不以七月迭代需求清单代替。基线必须覆盖所有状态变更、敏感读取、关键拒绝和失败入口,并对 Audit Event、Domain Ledger、Integration Log、Outbox 或 N/A 作出逐入口决定。
## User Stories
1. 作为审计人员,我希望回答谁在什么入口对哪些资源做了什么,结果、风险和前后变化是什么。
@@ -53,6 +55,7 @@ Access Log 当前只递归脱敏请求体,响应体仍原样记录,登录 To
### 动作注册表与写入可靠性
- 实现 Writer 前先完成全仓审计面盘点。每个 Handler、Application、Service、Worker、定时任务和回调入口都必须登记业务所有者、动作、资源、事务边界、失败策略和确认测试N/A 必须写明理由并经评审。
- 建立 Action Registry定义稳定动作编码、中文名称、类别、默认风险、允许的资源类型和敏感字段规则DTO 枚举说明、筛选项和前端名称都从同一注册表生成。
- 至少覆盖账号/角色/权限、店铺、资产、套餐、钱包/资金、订单/退款/充值、企微、支付与系统配置、数据同步、导入导出及登录安全的本期动作。未经注册的动作不得写入生产审计。
- 钱包余额、人工退款结果、代理钱包回退、线下充值入账、账号角色/权限、支付/企微/关键系统配置、人工卡状态、敏感店铺业务员归属及手工绑定企微审批号等成功事件必须与业务变更同事务 `AppendWithTx`;审计失败则业务事务回滚。
@@ -61,6 +64,7 @@ Access Log 当前只递归脱敏请求体,响应体仍原样记录,登录 To
- 异步系统事件与状态变化通过原业务事务或 Outbox 可靠关联,不使用 `go func()`。Asynq/Outbox 载荷必须传递 `event_id/request_id/correlation_id/parent_event_id`
- `request_id` 由现有中间件生成并贯穿同一 HTTP 请求;`correlation_id` 在退款、充值、审批、钱包、卡状态等跨请求业务起点生成并贯穿 Outbox/Asynq/Integration Log`parent_event_id` 表示直接因果,不用于替代 correlation。
- 对全部旧审计调用建立切换清单和自动检查。发布产物中禁止继续调用旧 `account_audit/asset_audit` 写服务或直接 Create 旧日志模型;启动装配不再注入旧 Writer。
- 系统配置更新和 Outbox 人工恢复必须在各自 Application 组合根注入正式 Audit Writer业务事实与审计同事务未装配或审计失败时失败关闭不得回退到空 Adapter、临时表或裸 goroutine。
### Integration Log
@@ -131,6 +135,8 @@ Access Log 当前只递归脱敏请求体,响应体仍原样记录,登录 To
- 领域/Application 测试覆盖事件不可变、多资源至少一个 primary、动作注册、风险默认值、内容哈希稳定、16KB 截断和禁止字段删除。
- PostgreSQL 集成测试验证唯一/查询索引、关键业务与 Audit Event 同事务、审计写入失败回滚、失败/拒绝短事务、重复事件幂等和资源时间线。
- 对账号、角色权限、资产、套餐、钱包、退款、充值、配置、导入导出、登录安全和手动同步建立切换清单;自动测试或静态检查证明生产装配不再调用旧 Writer旧三表发布后无新增。
- 覆盖基线测试或静态检查证明仓库内全部状态变更、敏感读取、关键拒绝和失败入口均已分类;新增敏感入口未登记、动作未注册或 N/A 缺少理由时门禁失败。
- 公共基础 Adapter 集成测试覆盖系统配置更新和 Outbox 人工恢复的成功同事务、审计失败整体回滚、敏感值不落库、恢复原因与批次留痕以及生产组合根装配。
- 历史投影测试使用旧账号/资产/手动轮询样本,验证 `UNION ALL` 的字段映射、确定性历史键、分页排序、`record_source` 和新旧交界时间无重复/漏项。
- Integration 测试覆盖 outbound 成功/失败/响应未知、inbound 回调、未发送的 merged/rate_limited/completed、同序列 0/3/5、状态变化关联 Audit Event 和重复回调。
- Access Log 测试覆盖嵌套 JSON、数组、非 JSON、登录/Token、支付/企微/运营商回调、上传下载和响应体,证明 Token、Secret、操作密码、签名 URL、Authorization、Cookie 等不落盘且 50KB 生效。
@@ -154,6 +160,7 @@ Access Log 当前只递归脱敏请求体,响应体仍原样记录,登录 To
## Further Notes
- 用户已明确确认一次性全局切换,覆盖标准稿中的“旧写停止、不双写、历史只读投影”口径;这不是可由实现阶段改回渐进双写的建议项。
- 全系统覆盖由 `00-full-audit-surface-inventory.md` 建立基线,系统配置由 `20-system-config-audit-adapter.md` 接入Outbox 恢复由 `21-outbox-recovery-audit-adapter.md` 接入,最终统一由 19 号票验收;后续业务 PRD 也必须增量维护该基线,不能把“公共审计已完成”理解为新业务自动获得审计。
- 当前已核实旧账号/资产审计使用裸 goroutineAccess Log 响应体未脱敏;这两项是发布前必须消除的现存缺陷。
- 当前手动轮询日志兼做进度存储,切断旧表时必须先由公共异步任务状态承接,不得违反 UR#94“轮询管理外部行为保持现状”的确认结论。
- 本需求较大,进入实现前应依据本 Spec 拆成可独立验证的纵向切片,但不得按“先建表、再 Service、再 Handler”的水平层级拆分也不得改变一次停机切换这一最终发布门禁。

View File

@@ -0,0 +1,18 @@
# 00 — 建立全系统审计面与公共能力决策基线
**What to build:** 对整个现有系统而非仅七月迭代执行一次可复核的审计面盘点,形成动作注册表输入和机器可检查的覆盖基线。每个状态变更、敏感读取、关键拒绝或失败入口都必须明确 Audit Event、Domain Ledger、Integration Log、Outbox 的使用决策或给出不适用理由,后续需求以此基线增量维护。
**Blocked by:** None — can start immediately
**Status:** ready-for-agent
**架构通道:** 主通道为 Infrastructure 治理,辅助通道为 Query 验证。
**完整业务边界:** 本票收口 Handler、Application、Domain、Service、Worker 和回调入口的全仓审计分类、动作编码、事务策略、资源关系、失败策略和测试责任人。明确不迁移任何业务代码、不改变已评审业务规则、不把 Access Log、Audit Event、Domain Ledger 和 Integration Log 合并。
- [ ] 盘点全部 HTTP/Worker/定时任务/回调入口,至少覆盖创建、修改、删除、状态流转、资金、权限、关键配置、导入导出、人工恢复、敏感读取、拒绝和关键失败;记录代码入口与业务所有者。
- [ ] 每个入口明确 `Audit Event / Domain Ledger / Integration Log / Outbox / N/A` 决策;选择 N/A 必须写明原因,禁止空白或“以后处理”。
- [ ] 对需要审计的入口填写稳定动作编码、中文名称、风险、主要及受影响资源、操作者与来源、前后数据、事务边界、失败策略和自动化测试接缝。
- [ ] 建立可被静态检查或测试读取的动作注册与覆盖基线,未经登记的新敏感操作不能通过发布门禁。
- [ ] 对旧账号、资产、手动轮询 Writer 及全部直接写旧日志表的位置建立准确清单,作为 0409 迁移票和 19 号切换票的输入。
- [ ] 更新《审计覆盖基线》,经业务、研发和安全评审确认不存在未分类入口;评审只确认覆盖与分类,不借机扩大各业务 PRD 范围。

View File

@@ -2,7 +2,10 @@
**What to build:** 业务用例可以通过统一 Audit Writer 写入不可变、多资源、可串联且默认脱敏的审计事件。成功事件能够与业务事实共用事务,失败或拒绝事件使用独立短事务保留;未注册动作、缺少主要资源或审计写入失败时按明确策略阻止错误事实落地。
**Blocked by:** `.scratch/tech-public-foundation/issues/01-public-migration-ownership-and-gates.md` — 01 — 建立公共迁移所有权与检查门禁
**Blocked by:**
- 00 — 建立全系统审计面与公共能力决策基线
- `.scratch/tech-public-foundation/issues/01-public-migration-ownership-and-gates.md` — 01 — 建立公共迁移所有权与检查门禁
**Status:** ready-for-agent

View File

@@ -4,6 +4,7 @@
**Blocked by:**
- 00 — 建立全系统审计面与公共能力决策基线
- 03 — 完成 Access Log 全路由敏感信息防泄漏
- 04 — 迁移账号、角色与权限敏感操作到统一审计
- 05 — 迁移卡资产生命周期操作到统一审计
@@ -20,6 +21,8 @@
- 16 — 交付审计导出与字段授权快照
- 17 — 交付审计保留、清理和运行监控
- 18 — 冻结审计中心跨仓前端契约与验收包
- 20 — 接入公共系统配置正式审计 Adapter
- 21 — 接入 Outbox 人工恢复正式审计 Adapter
- `.scratch/tech-public-foundation/issues/12-foundation-release-gate-and-integration-contract.md` — 12 — 建立公共基础发布门禁和下游接入契约
**Status:** ready-for-agent
@@ -30,6 +33,7 @@
- [ ] 停机顺序明确覆盖暂停流量与 Worker、前置检查、增量迁移、权限初始化、新 Writer 装配、旧写护栏、历史对账、Worker 恢复和开放流量。
- [ ] 自动切换清单证明生产产物不再调用旧账号/资产审计 Writer、不再直接 Create 旧三表、启动装配不再注入旧 Writer旧表意外新增会立即告警或失败。
- [ ] 《审计覆盖基线》的全部入口均已分类且无空白项;所有 Audit Event 动作已注册,所有 N/A 均有评审理由,系统配置更新和 Outbox 人工恢复已装配正式 Audit Writer。
- [ ] 门禁覆盖关键业务与审计同事务、审计失败回滚、失败短事务、Integration 结果未知、历史新旧交界、Access Log 敏感矩阵和权限隔离。
- [ ] Query 性能验证常用过滤使用索引、无 JSONB 全表模糊扫描、无资源/操作者 N+1并满足项目 P95/P99 目标。
- [ ] 任一迁移、旧写清单、样本对账、事务、安全、权限、性能、监控或跨仓验收失败均在开放流量前整体终止发布,不能让局部模块继续写旧表。

View File

@@ -0,0 +1,20 @@
# 20 — 接入公共系统配置正式审计 Adapter
**What to build:** 在系统配置更新的 Application 组合根注入正式 Audit Writer Adapter使关键配置变更进入统一 Audit Event并按公共基础已经确认的事务边界失败关闭。由真实全局审计替换公共基础的未装配占位不创建临时审计表或旁路 goroutine。
**Blocked by:**
- 01 — 交付不可变 Audit Event 写入闭环
- `.scratch/tech-public-foundation/issues/08-controlled-system-config-update.md` — 08 — 交付系统配置更新、权限和审计闭环
**Status:** ready-for-agent
**架构通道:** 主通道为 Application + Port/Adapter辅助通道为 Infrastructure。
**完整业务边界:** 本票仅收口公共系统配置更新既有用例的正式审计装配、事务一致性、脱敏和测试。明确不新增配置 Key、不建设配置前端页面、不迁移其他业务审计。
- [ ] 注册系统配置更新的稳定动作编码、中文名称、风险等级及允许资源类型,并写入全系统审计覆盖基线。
- [ ] 系统配置更新的业务事实与 Audit Event 使用同一 GORM 事务;审计失败时配置更新回滚,敏感配置只记录“是否配置”和安全摘要,不记录原值。
- [ ] 组合根显式注入正式 Audit Writer Adapter未装配时失败关闭禁止回退到空实现、旧审计表或裸 goroutine。
- [ ] PostgreSQL 集成测试覆盖成功同事务、审计失败整体回滚、敏感值不落库和未装配失败关闭。
- [ ] 发布检查能证明生产组合根已装配正式 Adapter并由 19 号一次性切换门禁纳入停机演练。

View File

@@ -0,0 +1,20 @@
# 21 — 接入 Outbox 人工恢复正式审计 Adapter
**What to build:** 在 Outbox 人工恢复的 Application 组合根注入正式 Audit Writer Adapter使每次受控恢复完整记录操作者、原因、批次和状态变化并与恢复事实同事务失败关闭。由真实全局审计替换公共基础的未装配占位不创建临时审计表或旁路 goroutine。
**Blocked by:**
- 01 — 交付不可变 Audit Event 写入闭环
- `.scratch/tech-public-foundation/issues/04-outbox-observability-and-recovery.md` — 04 — 提供 Outbox 监控和受控恢复能力
**Status:** ready-for-agent
**架构通道:** 主通道为 Application + Port/Adapter辅助通道为 Infrastructure。
**完整业务边界:** 本票仅收口 Outbox 人工恢复既有用例的正式审计装配、事务一致性和测试。明确不改变恢复资格与租约规则、不建设 Outbox 前端页面、不迁移其他业务审计。
- [ ] 注册 Outbox 人工恢复的稳定动作编码、中文名称、风险等级及允许资源类型,并写入全系统审计覆盖基线。
- [ ] Outbox 状态变更与 Audit Event 使用同一 GORM 事务;记录操作者、中文原因、恢复批次、事件标识及恢复前后状态,审计失败时恢复回滚。
- [ ] 组合根显式注入正式 Audit Writer Adapter未装配时失败关闭禁止回退到空实现、旧审计表或裸 goroutine。
- [ ] PostgreSQL 集成测试覆盖成功同事务、审计失败整体回滚、重复恢复裁决、有效租约不可恢复和未装配失败关闭。
- [ ] 发布检查能证明生产组合根已装配正式 Adapter并由 19 号一次性切换门禁纳入停机演练。

View File

@@ -0,0 +1,33 @@
# 全系统审计覆盖基线
状态:待 00 号票完成全仓扫描与评审
## 使用规则
本基线覆盖整个系统,不限于七月迭代。任何新增或修改的状态变更、敏感读取、关键拒绝或失败,在进入实现前都必须登记审计分类;选择不审计必须填写可评审的 N/A 理由。实现和发布评审不得只检查“是否调用了日志”,还要检查动作编码、操作者、资源、前后变化、事务边界、失败策略和测试接缝。
| 业务面 | 当前迁移责任票 | Audit Event | Domain Ledger | Integration Log | Outbox | 当前状态 |
|---|---|---|---|---|---|---|
| 账号、角色、权限 | 04 | 必须 | N/A | N/A | 按业务事件决定 | 待盘点 |
| 卡与资产生命周期 | 05 | 必须 | 既有资产事实 | 按外部调用决定 | 按业务事件决定 | 待盘点 |
| 设备与资产导入 | 06 | 必须 | 导入任务/明细 | 按外部调用决定 | 按业务事件决定 | 待盘点 |
| 店铺、套餐、关键配置 | 07 | 必须 | 既有业务事实 | N/A | 按业务事件决定 | 待盘点 |
| 资金、订单、退款、充值 | 08 | 必须 | 必须,以领域流水为准 | 按支付交互决定 | 按业务事件决定 | 待盘点 |
| 手动轮询与同步 | 09 | 状态变化、人工触发和异常必须 | 任务状态 | 必须 | 按可靠投递决定 | 待盘点 |
| 系统配置更新 | 20 | 必须、同事务 | 配置事实 | N/A | N/A | 待接入 |
| Outbox 人工恢复 | 21 | 必须、同事务 | Outbox 状态事实 | N/A | 自身为投递事实 | 待接入 |
| 敏感值二次查看 | 15 | 必须 | N/A | N/A | N/A | 待接入 |
| 审计导出 | 16 | 必须 | 导出任务/制品 | N/A | 按任务通知决定 | 待接入 |
## 00 号票必须补齐的逐入口字段
- 代码入口与业务所有者;
- 动作编码、中文名称、类别和风险;
- 操作者、来源、主要资源、受影响资源;
- 前后数据、敏感字段策略和内容上限;
- 成功同事务、失败短事务或 N/A 的理由;
- Domain Ledger、Integration Log、Outbox 的关联标识;
- 单元、PostgreSQL、HTTP 或静态检查的确认测试接缝;
- 对应迁移票、发布门禁和评审结论。
在逐入口清单完成并评审前,本文件不能作为“全系统已覆盖”的证明。

View File

@@ -99,6 +99,11 @@ Status: ready-for-agent
- 未来短信或企微消息使用独立 Delivery 消费同一业务事件;不得在 Notification Handler/Worker 写完站内消息后同步循环调用外部渠道。
- 新增管理端和 C 端 Handler 后同步注册路由和两个 OpenAPI 文档生成器;公共通知能力先于 UR#33、UR#97 和企微结果通知启用。
## 公共能力发布依赖
- 实现阶段复用公共 Outbox 与异步任务,不自行复制表或状态机;最终 08 号发布票必须阻塞于公共基础 12 号票和全局审计 19 号票。
- 每个下游通知生产者仍须登记事件类型、载荷版本、消费者幂等键、接收人、失败明细和通知策略;“通知基础完成”不代表业务生产者已经接入。
## Testing Decisions
- Application/Worker 测试覆盖重复事件、多个接收人、接收人去重、停用/删除接收人、无接收人、模板字段缺失、Outbox/Asynq 重试和过期时间。

View File

@@ -10,6 +10,8 @@
- 05 — 交付通知受控目标解析与权限复核
- 06 — 交付通知保留清理与失败可观测闭环
- 07 — 冻结后台与 C 端通知前端契约及验收包
- `.scratch/tech-public-foundation/issues/12-foundation-release-gate-and-integration-contract.md` — 12 — 建立公共基础发布门禁和下游接入契约
- `.scratch/tech-global-audit/issues/19-one-time-audit-cutover-gate.md` — 19 — 执行一次性审计切换与停机发布门禁
**Status:** ready-for-agent

View File

@@ -208,6 +208,12 @@ Status: ready-for-agent
- 列表和详情按 `approval_source` 展示:`none` 审批列为“-”;`wecom` 展示只读企微状态;`legacy` 展示“历史审批”且无操作按钮。代理界面不展示审批人列或内部意见。
- 加载、空、网络失败、支付方式为空、支付创建失败、支付已成功但入账失败、企微提交中/失败、审批拒绝和异常撤销均有独立展示,不由前端自行推导或改写服务端状态。
## 公共能力发布依赖
- 最终发布票必须明确阻塞于公共基础 12 号票、全局审计 19 号票、公共通知 08 号票、UR#37 企微发布 14 号票和 UR#38 钱包切换 10 号票。
- 充值事件必须登记载荷版本、消费者幂等键、失败明细和通知策略;资金结论以 Domain Ledger 为准Audit Event 记录操作者与前后变化,企微/支付外部事实进入 Integration Log。
- 当前 PRD 尚未拆票;生成 tickets 时必须把上述依赖落到最终发布门禁,不得只写“依赖公共基础”。
## Testing Decisions
### 最高公共测试接缝

View File

@@ -203,6 +203,11 @@ Status: ready-for-agent
- 回滚时先关闭前端入口和任务创建,等待或人工处置已领取任务,再回滚应用。已经创建的标准订单、钱包流水、套餐使用、任务和审计均作为业务事实保留,不做反向删除。
- 不在仍有待处理或处理中任务时删除新表或上传用途;数据库降级迁移不是常规应用回滚步骤。
## 公共能力发布依赖
- 最终 11 号发布票阻塞于公共基础 12 号票、全局审计 19 号票和 UR#38 钱包切换 10 号票;公共能力未完成不阻止独立切片开发,但阻止生产放量。
- 批量任务必须登记事件类型、载荷版本、Worker 幂等键和逐行失败明细;订单与钱包仍以各自 Domain Ledger 为权威,任务创建、终态及人工操作进入 Audit Event。
## Testing Decisions
### 可复用 Agent 集成测试规范与工具

View File

@@ -6,6 +6,9 @@
- `.scratch/ur36-bulk-package-purchase/issues/03-real-dependency-integration-harness.md` — 03 — 建立批量任务真实依赖的集成测试 Harness
- `.scratch/ur36-bulk-package-purchase/issues/10-bulk-purchase-task-queries.md` — 10 — 提供任务汇总与逐行明细查询
- `.scratch/tech-public-foundation/issues/12-foundation-release-gate-and-integration-contract.md` — 12 — 建立公共基础发布门禁和下游接入契约
- `.scratch/tech-global-audit/issues/19-one-time-audit-cutover-gate.md` — 19 — 执行一次性审计切换与停机发布门禁
- `.scratch/ur38-agent-main-wallet-credit/issues/10-credit-wallet-cutover-gate.md` — 10 — 完成信用钱包停机切换与发布门禁
**Status:** ready-for-agent

View File

@@ -214,6 +214,11 @@ Status: ready-for-agent
- 已结束的历史本地审批保留为 `legacy` 只读事实,不伪造企微实例。发布时仍未结束的退款/线下充值按创建人类型形成真实企微审批;缺少平台绑定、固定代理身份或创建人事实的记录进入迁移待处理清单,不能继续使用旧本地审批接口。
- 回滚应用时保留已经形成的企微实例、提交人/身份快照、Integration Log 和 Audit Event。已有企微申请进入运行后不得恢复旧本地审批动作只能继续同步或人工处置。
## 公共能力发布依赖
- 最终 14 号真实企微发布票阻塞于公共基础 12 号票、全局审计 19 号票和公共通知 08 号票;退款业务消费者还必须替换为 UR#35 的具体纵向 Ticket。
- 审批终态事件必须登记版本和消费者幂等键;审批实例是领域事实,企微请求/回调进入 Integration Log提交、人工同步和状态变化进入 Audit Event。
## Testing Decisions
- 主要自动化接缝采用最高公共行为边界Fiber HTTP 路由与认证 → Application/Domain/Query → GORM → 开发 PostgreSQL、Redis 和 Asynq 可控队列;企业微信网络统一替换为可编程 WeCom Adapter。测试不直接断言私有函数或目录结构。

View File

@@ -18,6 +18,8 @@
- 12 — 交付历史审批与待处理数据迁移接缝
- 13 — 冻结企微后台与个人中心前端契约
- `.scratch/tech-public-foundation/issues/12-foundation-release-gate-and-integration-contract.md` — 12 — 建立公共基础发布门禁和下游接入契约
- `.scratch/tech-global-audit/issues/19-one-time-audit-cutover-gate.md` — 19 — 执行一次性审计切换与停机发布门禁
- `.scratch/tech-inapp-notifications/issues/08-notification-release-gate.md` — 08 — 完成公共通知发布门禁与下游接入契约
- UR#35 退款企微审批的“退款创建接入公共审批并消费终态事件”纵向 TicketUR#35 拆票后必须在本票实施前替换为其具体文件引用
**Status:** ready-for-agent

View File

@@ -154,6 +154,11 @@ GET /api/admin/shops/fund-summary
- 开放普通访问前,保持历史钱包信用关闭,验证普通现金支付、信用扣款、冻结、回充、调额和并发场景。之后再由授权平台人员配置角色模板和既有代理额度。
- 尚未启用信用且未产生负余额时可以回滚应用和可逆字段;一旦出现负余额,不得回滚到不理解信用额度的旧写入逻辑,也不得删除字段或强制关闭信用,必须先清偿欠款或继续保留新资金逻辑。
## 公共能力发布依赖
- 最终 10 号切换票阻塞于公共基础 12 号票和全局审计 19 号票,不能只以 Outbox Relay 可用替代业务事件消费者、审计 Adapter 和停机验收。
- 余额、冻结与信用额度以钱包 Domain Ledger 为权威;高风险资金变更必须同事务写 Audit Event可靠事件必须登记类型、版本、消费者和业务幂等键。
## Testing Decisions
- 领域测试覆盖关闭/0、开启/正数、负额度、开启/0、关闭/非0、普通现金、使用部分信用、用尽信用、超过信用以及每个算术溢出边界。

View File

@@ -12,7 +12,8 @@
- `.scratch/ur38-agent-main-wallet-credit/issues/07-unified-agent-wallet-credit-posting.md` — 07 — 统一代理主钱包充值入账与人工调整
- `.scratch/ur38-agent-main-wallet-credit/issues/08-unified-agent-wallet-refund.md` — 08 — 统一代理订单退款回充
- `.scratch/ur38-agent-main-wallet-credit/issues/09-fund-summary-credit-query.md` — 09 — 资金概况返回信用、总可用金额与欠款
- `.scratch/tech-public-foundation/issues/03-outbox-at-least-once-delivery.md`03完成 Outbox 到 Asynq 的至少一次投递闭环
- `.scratch/tech-public-foundation/issues/12-foundation-release-gate-and-integration-contract.md`12建立公共基础发布门禁和下游接入契约
- `.scratch/tech-global-audit/issues/19-one-time-audit-cutover-gate.md` — 19 — 执行一次性审计切换与停机发布门禁
**Status:** ready-for-agent

View File

@@ -245,6 +245,12 @@ POST /api/admin/export-tasks
- 恢复服务后监控权限解析失败、零字段拒绝、各 Scene 任务失败、附件本地化缺失及 Count/Fetch 行数差异。
- 回滚时先停止新任务,处理新版本未完成任务,再回滚 Worker/API/前端和数据库;已经生成的导出文件仍按附件落地页的当前鉴权访问。
## 公共能力发布依赖
- 最终发布票必须明确阻塞于公共基础 12 号票和全局审计 19 号票;涉及企微审批导出时还必须引用 UR#37 14 号发布票。
- 导出任务复用公共五态并保留业务失败明细;敏感字段查看和导出均进入 Audit Event导出文件与任务是业务事实不把明细塞入审计 JSON。
- 当前 PRD 尚未拆票;生成 tickets 时必须把上述依赖落到最终发布门禁,不得只写“依赖公共基础”。
## Testing Decisions
- 字段权限单元/集成测试覆盖超级管理员全目录、单角色、多角色并集、账号角色与店铺角色既有解析规则、软删除/禁用角色关联、空授权、陈旧字段 key 和权限存储异常。

View File

@@ -136,6 +136,11 @@ Status: ready-for-agent
- 前后端同批切换 `/orders/create` 必填字段和 `/pay` 不可换方式契约。发布窗口应阻断旧前端继续创建缺少方式的新订单。
- 回滚应用时保留系统配置、订单快照、支付记录和审计事实;不得通过回滚迁移删除已产生数据。
## 公共能力发布依赖
- 新增 05 号发布票,阻塞于公共基础 12 号票、全局审计 20 号系统配置 Adapter 接入票和全局审计 19 号切换票。
- UR#48 负责注册正式支付配置 Key系统配置更新的 Audit Event 与配置事实同事务,支付方式以订单快照为业务事实。公共配置接口存在不等于前端现在就新增配置页面。
## Testing Decisions
- 配置单元测试覆盖卡/设备默认集合、合法自定义、钱包不可移除、空数组、未知值、重复值、非法 JSON、缺失记录和未知资产类型。

View File

@@ -0,0 +1,22 @@
# 05 — 完成资产支付方式公共能力接入与发布门禁
**What to build:** 发布负责人可以验证 UR#48 的支付方式配置已通过公共受控系统配置注册、正式审计 Adapter 和订单快照链路接入生产组合根,并在接口、权限、缓存、审计或回滚检查失败时阻止放量。
**Blocked by:**
- 04 — 订单按支付方式快照完成支付与取消闭环
- `.scratch/tech-public-foundation/issues/12-foundation-release-gate-and-integration-contract.md` — 12 — 建立公共基础发布门禁和下游接入契约
- `.scratch/tech-global-audit/issues/20-system-config-audit-adapter.md` — 20 — 接入公共系统配置正式审计 Adapter
- `.scratch/tech-global-audit/issues/19-one-time-audit-cutover-gate.md` — 19 — 执行一次性审计切换与停机发布门禁
**Status:** ready-for-agent
**架构通道:** 主通道为 Infrastructure 发布验收,辅助通道为 Application 与 Query 验收。
**完整业务边界:** 本票只收口 UR#48 正式配置 Key、支付方式策略、订单快照、审计装配、接口契约和发布回滚。明确不新增公共配置页面、不改变已评审支付规则、不建设 Outbox 运维前端、不迁移其他支付模块。
- [ ] UR#48 拥有的配置 Key 已在代码注册表声明类型、默认值、值域、只读和敏感策略,未注册 Key 不可写。
- [ ] 系统配置更新通过正式 Audit Writer 与配置事实同事务,能追踪操作者、动作和前后变化且不记录敏感原值;未装配或审计失败时更新回滚。
- [ ] `GET /api/admin/system-configs``PUT /api/admin/system-configs/{key}` 的权限、缓存失效、错误语义和 OpenAPI 与真实路由一致;前端只消费 UR#48 注册的配置项。
- [ ] 真实 Fiber、PostgreSQL 和 Redis 验收覆盖按资产类型读取、配置更新、订单方式快照、支付、取消、并发和回滚边界。
- [ ] 发布顺序为公共迁移与门禁、全局审计及 Adapter、UR#48 后端、前端;任一正式装配或审计样本失败均阻止放量。

View File

@@ -149,6 +149,11 @@ Status: ready-for-agent
- 发布前核查重复 IMEI并验证平台、代理、直属下级和系列授权的数据范围不自动修改历史设备数据。
- 回滚应用时保留已经产生的任务、资产分配记录与审计事实;不得通过回滚删除已经完成的设备归属或系列变更。
## 公共能力发布依赖
- 最终 05 号发布票阻塞于公共基础 12 号票和全局审计 19 号票Worker、监控和消费者未就绪前不得开放前端入口。
- 批量分配任务复用公共五态,逐行失败留在业务任务明细;任务创建、人工操作和资产归属变化进入 Audit Event可靠事件登记版本与消费者幂等键。
## Testing Decisions
- CSV 解析测试覆盖 UTF-8、UTF-8 BOM、LF、CRLF、中文表头、引号、空行、空值、额外列、非法引号、非 UTF-8、控制字符、公式前缀、科学计数法、超长标识、1000/1001 行和 10MB 边界。

View File

@@ -6,6 +6,8 @@
- 04 — 交付设备管理页 CSV 双入口与任务结果交互
- [.scratch/ur36-bulk-package-purchase/issues/03-real-dependency-integration-harness.md](../../ur36-bulk-package-purchase/issues/03-real-dependency-integration-harness.md) — 03 — 建立批量任务真实依赖的集成测试 Harness
- [.scratch/tech-public-foundation/issues/12-foundation-release-gate-and-integration-contract.md](../../tech-public-foundation/issues/12-foundation-release-gate-and-integration-contract.md) — 12 — 建立公共基础发布门禁和下游接入契约
- [.scratch/tech-global-audit/issues/19-one-time-audit-cutover-gate.md](../../tech-global-audit/issues/19-one-time-audit-cutover-gate.md) — 19 — 执行一次性审计切换与停机发布门禁
**Status:** ready-for-agent

View File

@@ -102,6 +102,11 @@ Status: ready-for-agent
- 发布前记录并对比当前启用的轮询配置、队列深度、卡级开关和监控结果;发布后这些调度事实应保持一致。
- 回调 URL 需在测试环境用运营商原始样例验证后再配置到运营商平台;正式启用顺序按运营商逐个灰度,单个 Adapter 可独立关闭而不影响事件和轮询兜底。
## 公共能力发布依赖
- 最终 13 号发布票阻塞于公共基础 12 号票和全局审计 19 号票生产者放量前必须确认事件消费者、Integration Log、Audit Writer 和监控同时装配。
- 每个卡状态事件登记稳定类型、载荷版本和消费者幂等键;卡状态是领域事实,运营商请求/回调进入 Integration Log状态变化、人工触发及连续失败进入 Audit Event。
## Testing Decisions
- 领域单元测试覆盖实名首次成功/重复成功/逆转确认、流量正增量/跨月/运营商重置/异常下降、网络状态映射/未知状态/运营商停机原因,以及每类观测不变时不重复发布副作用。

View File

@@ -11,6 +11,8 @@
- 10 — 接入电信实名回调
- 11 — 接入移动实名成功回调
- 12 — 接入联通解除实名留痕回调
- `.scratch/tech-public-foundation/issues/12-foundation-release-gate-and-integration-contract.md` — 12 — 建立公共基础发布门禁和下游接入契约
- `.scratch/tech-global-audit/issues/19-one-time-audit-cutover-gate.md` — 19 — 执行一次性审计切换与停机发布门禁
**Status:** ready-for-agent

View File

@@ -73,6 +73,12 @@ Status: ready-for-agent
- 发布依赖统一钱包变更边界、公共 Outbox、公共站内通知和 UR#96 业务员关系;依赖尚未完成时可以先完成领域事件,但不得另建临时通知表或直接发消息。
- 存量低余额钱包不批量补发,避免上线瞬间产生大量无业务变更通知;上线后只监听新提交的跨阈值事务。
## 公共能力发布依赖
- 最终发布票必须明确阻塞于公共基础 12 号票、全局审计 19 号票、公共通知 08 号票和 UR#38 钱包切换 10 号票。
- 低余额事件必须登记载荷版本、消费者幂等键、通知接收人和防重策略;钱包 Domain Ledger 是余额权威,通知事实不替代资金审计。
- 当前 PRD 尚未拆票;生成 tickets 时必须把上述依赖落到最终发布门禁,不得只写“依赖公共基础”。
## Testing Decisions
- 领域单元测试覆盖 `10100→10000``10001→10000``10000→9999``9000→8000``9000→10100→10000`,验证只在严格跨越时发事件。