Files
junhong_cmp_fiber/docs/feature-504-multi-view-audit-center/多视角审计中心功能总结.md
break c64f3d8b80
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m31s
全局审计完成
2026-08-07 11:02:52 +08:00

268 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 多视角审计中心功能总结
本文汇总 `build-multi-view-audit-center` 第一阶段已经交付的能力、边界和验收依据。实现以当前 Action/Resource Registry 和覆盖基线为准;旧账号、旧资产 operation log 只保留独立历史查询,不回填、不转换、不进入新审计中心。
## 1. 交付范围
- 统一不可变 `Audit Event + Event Resource`,记录真实操作者、入口、动作、结果、风险、多资源关系、资源快照、前后变化和跨步骤链路。
- 平台提供全局事件、操作者、资源、request、correlation、资金、风险和 Integration Log 调查视角。
- 代理和企业使用独立安全资源活动投影,只查看当前有权资源的允许业务结论。
- Audit Event 与 Integration Log 按 `Asia/Shanghai` 完整自然日归档;整月完整性门禁通过后,可受控物理清理 PostgreSQL 上月在线数据。
- 现行覆盖门禁已登记 692 个源码入口、219 个 Action Registry 动作、61 个 Resource Registry 类型、146 个已使用资源角色和 5 组敏感读取。
实现入口:`internal/infrastructure/audit/``internal/query/audit/``internal/query/integration/``internal/application/auditarchive/``internal/handler/admin/audit.go``internal/routes/audit.go`。完整逐入口决定见 [审计覆盖基线](../../.scratch/tech-global-audit/审计覆盖基线.md)。
## 2. 四类事实边界
| 事实 | 回答的问题 | 权威内容 | 明确不承担 |
|---|---|---|---|
| Access Log | 这次 HTTP 请求收发了什么、耗时多久 | method、path、query、status、duration、request/response body、request_id 等调试信息 | 不证明业务事实成功,不进入审计数据库查询,不上传本次冷归档 |
| Audit Event | 谁从什么入口,对哪些资源做了什么,结果如何 | 操作者、动作、结果、风险、多资源关系、资源快照、before/after、request/correlation/parent | 不替代订单、钱包流水等业务账本,不替代外部交互或可靠投递事实 |
| Integration Log | 系统与外部系统实际发生或未发生了哪次交互 | provider、direction、operation、result、attempt、外部状态、受控请求/响应摘要 | 不把投递成功或外呼成功伪装成内部业务成功,不承担人工恢复 |
| Domain Ledger | 金额、状态、权益最终以什么为准 | 订单、支付、退款、充值、钱包流水、审批、套餐权益、佣金等业务表 | 不负责解释完整操作者上下文,不被 Audit Event 重算或覆盖 |
Outbox/Asynq/手动轮询是可靠副作用和任务运行事实跨视角时间线可展示其摘要或引用但仍保持独立生命周期。Outbox `delivered` 只表示投递事实,不表示消费者业务成功;手动轮询表继续保存进度和结果。
链路字段固定语义:`request_id` 关联一次 HTTP 请求;`correlation_id` 关联跨请求、Outbox、Asynq、回调和后续业务步骤`parent_event_id` 表示直接因果Integration 的 `trigger_series + attempt` 才表示技术尝试序列。
## 3. 核心字段字典
### 3.1 Audit Event
| 字段组 | 字段 | 语义 |
|---|---|---|
| 身份 | `event_id``occurred_at``created_at` | 稳定公开事件 ID、真实发生时间、持久化时间 |
| 动作 | `category``action_code``action_name``summary` | 稳定动作类别/编码、中文名称快照和内部摘要 |
| 操作者 | `actor_kind/id/name``actor_shop_id/name``actor_enterprise_id/name` | 事件发生时的真实人工、OpenAPI、系统任务、计划任务或外部系统身份快照 |
| 入口 | `source``request_path/method``ip_address``user_agent` | admin/personal/openapi/worker/scheduler/callback 等来源及 HTTP 摘要 |
| 范围 | `scope_type/id/name` | 平台、店铺、企业、个人等本次主要业务范围快照 |
| 结果 | `result``risk_level``error_code``error_summary` | `success/failed/denied/partial/unknown`、风险和安全错误摘要 |
| 链路 | `request_id``correlation_id``parent_event_id` | 请求、业务链路和直接父事件 |
| 批量 | `batch_total``success_count``fail_count` | 批次根统计;子事件通过 parent/correlation 关联 |
| 完整性 | `metadata``content_hash` | 有界安全业务参数和标准化内容 SHA-256 |
### 3.2 Event Resource
| 字段 | 语义 |
|---|---|
| `resource_type/id/key/display_name` | Registry 类型、可空内部 ID、事件时稳定业务 Key 和展示名 |
| `relation` | `primary``affected``reference`;每个事件必须且只能按动作契约确定主要资源 |
| `role` | `old_card/new_card/bound_card/entry_device/order/wallet_transaction` 等稳定业务角色 |
| `identity_snapshot` | 事件发生时资源身份,不依赖当前业务表是否删除、更名、换号 |
| `before_data/after_data` | 该资源本次真实涉及的字段,不使用事件级万能 JSON |
| `subject_visibility` | `internal_only``subject_result``subject_detail` |
| `subject_summary/subject_data` | 写入时生成的主体安全结论及 Registry 白名单字段 |
| `sort_order/created_at` | 稳定展示顺序和落库时间 |
### 3.3 Integration Log
| 字段组 | 字段 | 语义 |
|---|---|---|
| 身份 | `integration_id``provider``direction``operation``external_id` | 稳定交互身份、提供方、方向、动作和外部业务标识 |
| 资源 | `resource_type/id/key` | 本次外部交互的直接主资源;其他资源通过关联 Audit Event 展开 |
| 触发 | `trigger_source/scene/series``attempt` | 来源、业务场景和显式技术尝试序列 |
| 结果 | `result``http_status``provider_code/message``duration_ms``state_changed` | 原始结果、安全可读摘要、耗时和是否改变本地事实 |
| 内容 | `request_summary``response_summary``metadata``content_hash` | 写入和返回前均经过白名单及凭据删除的结构化摘要 |
| 链路 | `request_id``correlation_id``audit_event_id` | 与请求、业务链路和内部状态变化事件的稳定关联 |
派生结果类别固定为:`pending→processing``success→succeeded``unknown→indeterminate`、明确失败结果→`failed``ignored/merged/rate_limited/completed/cancelled→not_sent``completed` 不计外部请求成功。
### 3.4 留存与调查引用
| 结构 | 字段 | 语义 |
|---|---|---|
| `retention` | `online_from``archived_before``timezone` | 当前 PostgreSQL 在线窗口、已归档边界、`Asia/Shanghai` 时区 |
| `investigation_refs` | `event_id``actor_ref``resource_refs[]``request_id``correlation_id``integration_refs[]` | 平台各调查视角唯一允许使用的稳定跳转引用 |
| `tb_log_archive_run` | source/date/instance/schema/revision/status/is_final、range、object/manifest key、数量、字节、SHA-256、attempt、cleanup 时间 | 归档与清理轻量 ledger不保存日志正文 |
## 4. 当前领域、资源与动作矩阵
下表按领域归并当前 Registry。动作列使用稳定编码前缀及代表动作219 个动作的唯一权威清单是 `pkg/constants/audit.go``internal/infrastructure/audit/registry.go`,逐入口事务和 N/A 决定以覆盖基线为准。
| 领域 | 主要资源 | 已接入动作范围 | 权威事实/边界 |
|---|---|---|---|
| 账号与认证 | account、authentication、role、permission | `account.*``auth.*``role.*``permission.*` | 账号、角色权限和认证状态表密码、Token、Cookie 不入审计 |
| 店铺与企业 | shop、enterprise、企业卡/设备授权 | `shop.*``enterprise.*``enterprise_card.*``enterprise_device.*` | 店铺层级和当前有效授权关系 |
| 个人客户 | personal_customer、手机号、OpenID、资产绑定 | `personal_customer.*` | 客户及绑定表;外部主体标识按 Registry 快照 |
| IoT 卡 | iot_card、批次、分配记录、Integration | `iot_card.*`,含创建、删除、分配/回收、系列、实名、停复机、刷新、限速、Worker 同步 | 卡表保存本地事实Gateway 尝试进入 Integration Log限速审计记录谁操作、谁被限速、档位及外部结果 |
| 设备与卡槽 | device、iot_card、device_sim_binding、分配记录 | `device.*`,含分配/回收、绑解绑、切当前卡、Wi-Fi、模式、重启、重置、Worker 观测 | 设备、卡及卡槽均为一等资源,多卡逐张关联 |
| 换货 | exchange_order、旧新卡/设备、绑定、客户、钱包、权益 | `exchange.card.*``exchange.device.*` | 换货状态机、资产/钱包/权益等业务表;不压缩为单一资产标识 |
| 套餐配置 | package_series、package、店铺授权、价格历史、批次 | `package_series.*``package.*``shop_series_grant.*``shop_package.*` | 套餐、授权和价格历史表 |
| 套餐权益 | package_usage、订单、套餐、资产、退款 | `package_usage.*`,含激活、到期、扣减/重置、退款/资产失效、队列及迁移 | `tb_package_usage` 和流量业务表为权威 |
| 订单与支付 | order、payment、资产、套餐、钱包/流水 | `order.*``payment.*` | 订单/支付状态、渠道流水;每次渠道尝试另写 Integration Log |
| 退款 | refund、订单、审批、钱包/流水、佣金、权益、通知 | `refund.*` | 退款、钱包流水、佣金和权益事实同事务收口 |
| 充值与钱包 | agent_recharge、recharge_order、agent/asset wallet、流水、预占 | `agent_recharge.*``asset_recharge.*``agent_wallet.*` | 金额和余额以钱包流水/业务单为权威;审计只解释操作者和动作 |
| 佣金与提现 | commission_record、commission_withdrawal、钱包/流水 | `commission.*``commission_withdrawal.*` | 佣金、提现、钱包和流水状态机 |
| 审批与企微 | approval_instance、业务单、Integration、Outbox | `approval.*``wecom.*` | 本地审批事实、企微交互和可靠终态分发各自保留 |
| 系统与连接配置 | system_config、payment_config、carrier、wecom_application/scene | `system_config.*``payment_config.*``carrier.*``wecom.*` | 配置表权威;只记录 `credentials_configured` 等安全事实 |
| 导入、批量与导出任务 | 各 task、批次资源、实际业务资源 | `*_import_task.*``asset_package_batch_order_task.*``order_package_invalidate_task.*``export_task.*` | 任务表保存进度;实际变化资源另有子事件;审计中心本身不导出 |
| 通知 | notification、read/cleanup batch、业务目标 | `notification.deliver/read/read_all/cleanup/cleanup_item` | 通知正文和已读状态以通知表为准 |
| 轮询与监控 | polling_config/concurrency/alert/manual_trigger、卡 | `polling_config.*``polling_concurrency.*``polling_alert.*``polling_manual_trigger.*` | 人工触发写 Audit每次 Gateway 尝试写 Integration手动任务表继续保存运行事实 |
| 可靠事件与留存 | outbox_event、log_archive_month | `outbox.*``audit.retention_cleanup` | Outbox 投递、归档 ledger、对象存储事实保持独立 |
普通列表、详情、统计和装配入口为 N/ARegistry 标记的敏感读取在返回结果前写审计,写入失败则不返回敏感结果。
## 5. 各资源身份快照
| 资源 | 最小可读快照 |
|---|---|
| 账号/角色/权限 | ID、用户名、手机号、账号类型、店铺/企业、企微身份;角色 ID/名称/类型;权限 code/name |
| 店铺/企业 | ID、编码、名称、上级或 owner shop、层级 |
| 个人客户 | ID、昵称、手机号、微信主体标识及资产绑定标识 |
| IoT 卡 | ID、ICCID、VirtualNo、MSISDN、运营商、店铺、系列、generation |
| 设备 | ID、VirtualNo、IMEI、SN、名称/型号、店铺、系列、generation |
| 设备卡槽 | binding ID、设备标识、slot_position、卡 ICCID/VirtualNo、is_current |
| 分配/换货 | 分配单号或换货单号、资产类型/ID/完整标识、来源/目标主体、旧新资产、店铺、状态 |
| 套餐/权益 | 套餐/系列 ID、编码、名称、期限、价格、状态权益 ID、订单、资产、generation、激活/到期时间 |
| 订单/支付 | 订单/支付 ID 和单号、买家、资产、套餐、金额、支付方式/状态、渠道交易号、配置 ID |
| 退款/充值 | 业务单号、订单/资产/店铺、申请/批准金额、审批、支付方式、状态 |
| 钱包/流水/预占 | 钱包 ID/类型、店铺或资产、币种、流水/预占 ID、reference、amount、balance before/after |
| 佣金/提现 | 记录或申请 ID、店铺、订单、系列、金额、状态、结算周期 |
| 审批 | 实例 ID、业务类型/ID、提交人、provider、external ref、correlation、状态 |
| 配置 | 配置 Key/模块或 ID/name/provider、状态、`credentials_configured`;不保存密钥正文 |
| 任务/通知/轮询 | 任务 ID/单号、文件名、目标、操作者、统计;通知 event/接收人/类别/ref轮询配置/触发 ID、资产、任务类型 |
| Integration/Outbox | integration ID/provider/operation/resource/external IDevent ID/type/aggregate |
手机号、IP、ICCID、VirtualNo、金额和交易号对平台按已存业务值完整展示密码、验证码、Token、Secret、私钥、支付密钥、回调凭据、Authorization、Cookie、签名 URL 和完整第三方原始正文从持久化前删除。
## 6. 查询视角与 DTO
| 视角/API | 请求 DTO 重点 | 响应 DTO 重点 |
|---|---|---|
| `GET /audit/events` | 时间、action/category、actor、source/result/risk、scope、resource、request/correlation、分页 | `EventPage{total,page,page_size,items[],retention}` |
| `GET /audit/events/{event_id}` | 稳定 event ID | `EventDetail`:完整 `EventView`、全部 `ResourceView`、retention |
| `GET /audit/actors/{kind}/{id}/events` | actor、action/result/risk/resource、时间、分页 | 与事件列表相同的稳定分页投影 |
| `GET /audit/resources/search` | 首批 `iot_card/device/shop/order/refund`、精确 keyword、分页 | `ResourceCandidate{type,id,key,display_name,identity_snapshot,historical}` |
| `GET /audit/resources/{type}/{id}/timeline` | Registry type、内部稳定 ID、时间、action/result、分页 | 资源以任意 relation 参与的 `EventPage` |
| `GET /audit/requests/{request_id}/timeline` | 稳定 request ID | `LinkTimeline`、Access Log 检索 ID、按 `record_source` 分组节点 |
| `GET /audit/correlations/{correlation_id}/timeline` | 稳定 correlation ID | Audit、Integration、Outbox、任务摘要和 Domain Ledger 引用节点 |
| `GET /audit/finance/timeline` | shop/wallet/order/payment/refund/recharge/approval/trade/actor/correlation/time 任一稳定条件 | `FinanceTimelineNode`、amount/balance、权威表字段、调查引用 |
| `GET /audit/risks/overview` | 最长 31 天时间范围、risk/result/action/source | signals、risks、results、actions、sources、trend、retention |
| `GET /audit/risks/events` | 总览同源筛选及分页 | 风险范围内的 `EventView` 分页 |
| `GET /audit/integrations/overview` | 时间、bucket 及 Integration 组合筛选 | 总量、异常/unknown/陈旧 pending/状态变化、平均/P95、分布、趋势、retention |
| `GET /audit/integrations` | provider/direction/operation/result/category/resource/series/linkage 等组合筛选、分页 | `ListItem` 稳定编码/中文名、资源、结果、耗时、链路 |
| `GET /audit/integrations/{integration_id}` | 稳定 integration ID | identity/resource/trigger/result/content/linkage/timestamps/attempts/fidelity/retention |
| `GET /agent/resource-activities/{type}/{identifier}` | 业务稳定 identifier、时间、分页范围来自认证上下文 | 资源摘要、`SubjectActivity[]`、retention |
| `GET /enterprise/resource-activities/{type}/{identifier}` | 企业仅支持当前有效授权卡/设备 | 与代理相同安全 DTO不含内部调查引用 |
所有完整路径均以 `/api/admin` 开头。`request_id/correlation_id` 生命周期、15 条接口入参与返回、页面字段来源和降级规则统一见[审计链路与前端接入指南](跨视角调查与前端导航契约.md);专题说明见[平台基础审计调查接口](平台基础审计调查接口.md)、[外部集成调查接口](外部集成调查接口.md)和[主体资源活动接口](主体资源活动接口.md)。OpenAPI 权威制品为 `docs/admin-openapi.yaml` 和运行时生成的 `logs/openapi.yaml`
平台调查节点统一使用 `investigation_refs`。字段不存在时隐藏跳转;只有稳定 Key、没有内部 ID 时先精确资源搜索,零命中或多命中均不自动选择,禁止按名称、时间、中文描述或编号前缀猜测关系。
## 7. 平台与主体可见性
| 身份 | 可见能力 | 不可见能力 |
|---|---|---|
| 超级管理员/平台账号 | 全部 `/api/admin/audit/*` 在线数据完整已存业务字段、操作者、风险、before/after、Integration 安全摘要 | 系统安全凭据、归档对象读取、修改/删除/导出/恢复/风险处置 |
| 代理 | 自己及下级店铺当前有权资源的 `subject_result/subject_detail` | 平台 actor、内部原因/备注/风险/before/after、event ID、request/correlation、Integration 内容、`internal_only` |
| 企业 | 当前有效授权卡/设备的安全活动;授权撤销后立即不可读 | 平台接口、企业 ID 伪造范围、分配/换货独立内部调查、所有内部字段 |
| 个人客户 | 不开放本审计中心调查接口 | 平台及主体资源活动接口 |
代理/企业查询先验证当前资源归属,再读主体投影;不存在、不支持、越权或授权撤销统一返回“无权限操作该资源或资源不存在”,不泄露资源或事件是否存在。`subject_data` 必须在写入时按 Registry 白名单生成Query 不从内部 before/after 临时删字段拼装。
## 8. 代表性业务样例
### 多卡设备
操作设备第二卡槽的卡时,目标卡是 primary/affected入口设备是 reference绑定关系保存 `slot_position=2` 和当时 `is_current`。切换当前卡同时关联设备、旧卡、新卡和两个 binding分别写各自前后状态因此设备、两张卡和绑定关系时间线都能定位该事件。
### 换货
卡换货按角色关联换货单、旧卡、新卡、旧新钱包、流水、套餐权益和客户绑定,并分别保存旧新卡 ICCID/VirtualNo。设备换货保存旧新设备 VirtualNo/IMEI/SN并逐张关联实际涉及的绑定卡和卡槽不会用一个 `asset_identifier` 掩盖多资源关系。
### 资金
订单钱包扣款、退款回充、充值入账、预占/释放、佣金和提现的成功审计与钱包、唯一流水、业务单及必要 Outbox 同一 GORM 事务;审计失败则业务回滚。资金时间线返回 `amount_authority`,金额与余额冲突时以钱包流水及业务表为准,不修改历史 Audit Event。
### 批量
批量分配、批量配置、导入购包等写一条根事件,记录 total/success/fail 和 `success/partial/failed`;每个实际变化或已识别失败资源写子事件,共享 correlation 并以根 event 为 parent。未命中、未处理和幂等无变化项不伪造成功子事件。
## 9. 异常闭环与事务策略
| 场景 | 处理 |
|---|---|
| 关键成功或 partial 且改变业务事实 | Audit 与 Domain Ledger/必要 Outbox 同事务;审计失败整体回滚 |
| 已定位主要资源的业务拒绝 | 业务不落地,随后用独立短事务写 `denied` |
| 已定位主要资源后的执行失败 | 保留原业务错误,独立短事务写 `failed` |
| 失败审计二次失败 | 不覆盖原错误;写 critical 日志并递增监控计数 |
| 参数解析前失败或无法定位主要资源 | 不造无资源 Audit Event只进入 Access/Security Log |
| 外部交互未改变内部事实 | 只写 Integration Log |
| Callback/Worker 改变内部事实 | 保留 Integration/任务事实,并以真实 external/system actor 写 Audit Event |
| 普通查询 | N/A不写 Audit Event |
| Registry 敏感读取 | 返回敏感结果前写 Audit失败关闭不返回结果 |
Writer 对未知 action、未知 resource/role、缺少主要资源、资源关系不完整、安全凭据未清理和不符合事务要求的动作保持 fail-closed。业务修正通过新的受控动作产生新事件不更新旧事件。
## 10. 每日归档、月度清理与在线窗口
1. 每日任务按 `Asia/Shanghai` 前一完整自然日半开区间归档。
2. Audit 对象使用 UTF-8 JSONL+gzip每行一个事件及完整 `resources[]`Integration 每行一条结构化持久化事实。
3. 每个对象有 manifest、SHA-256、对象 metadata 和 `tb_log_archive_run` ledger内容变化创建新 revision不覆盖旧对象。
4. 月初先完成上月最后一天归档,并用数据库当前内容形成 Integration 最终 revision任何 pending、缺日、数量/hash/对象不一致都阻止整月清理。
5. 门禁通过后Retention Worker 以 1000 行有界批次按 Event Resource → Audit Event → Integration Log 顺序物理删除目标月 PostgreSQL 数据,并通过 cleanup 时间断点续跑。
6. 清理任务在当前月写 `audit.retention_cleanup`,不写回被清理月份;对象和 manifest 长期保留,不被该任务删除。
默认生产开关为 `JUNHONG_WORKER_AUDIT_RETENTION_CLEANUP_ENABLED=false`。灰度、仿真、SQL 观测、告警和启停步骤见[审计归档灰度操作手册](归档灰度操作手册.md)。
所有在线调查 DTO 返回 `retention`。显式范围早于在线边界或跨越边界时返回 `CodeAuditDataArchived`ID-only 详情在线库不存在仍按资源不存在处理。接口不扫描对象存储,也不返回误导性的成功空结果或部分历史。
## 11. 发布、回滚与监控
发布前要求迁移版本 `205``dirty=false`,旧 Writer 生产调用为 0Registry/覆盖门禁通过,两份 OpenAPI 可生成,生产物理清理开关保持关闭。
回滚只影响后续流量:保留当前在线 Audit、Integration、Domain Ledger、Outbox、归档 ledger 和已校验对象;不得恢复旧账号/资产 Writer不得用 migration down 删除已有事实,不得从对象存储回填 PostgreSQL 伪造在线历史。错误事实通过前向业务动作修正。
| 监控项 | 阈值 |
|---|---|
| 关键成功审计写入失败 | 任一失败即 critical |
| failed/denied 短事务二次失败 | 增量必须为 0 |
| 未注册 action/resource/role | 必须为 0 |
| 安全凭据落库或响应命中 | 必须为 0 |
| 批量根子计数、parent/correlation 差异 | 必须为 0 |
| 旧 Writer 生产写调用 | 必须为 0 |
| 数据库受控查询 | < 50ms |
| 审计读接口 | P95 < 200msP99 < 500ms发布后用既有 Access Log 观测 |
| 每日归档缺失/失败、对象或 manifest 不一致、月度非 final | critical阻止清理 |
## 12. 明确未实现项
- 细粒度平台审计权限码和平台数据行过滤。
- 面向用户的审计导出、归档下载、对象存储历史查询或恢复。
- PostgreSQL 冷热联合查询、归档回填和月分区。
- 审计事件修改、删除、专用纠错 APIRetention Worker 的受控整月清理是唯一删除例外。
- Integration Log 重试、补偿、结果确认、外部单号绑定、人工恢复、修改或删除。
- 风险处置工单、自动封禁和自动恢复。
- 任意关系图、任意 JSONB/JSONPath 搜索、JSONB GIN 和 Redis 查询缓存。
- 将旧 operation log 回填、转换或拼入新审计中心。
- 从 Access Log、相近时间、相似资源或中文描述猜测业务链路和技术重试。
## 13. 验收依据
- 实现:`internal/model/audit_event.go``internal/model/integration_log.go``internal/model/log_archive_run.go``internal/infrastructure/audit/``internal/query/audit/``internal/query/integration/``internal/application/auditarchive/`
- API`internal/handler/admin/audit.go``internal/routes/audit.go``internal/model/dto/audit_dto.go``docs/admin-openapi.yaml``logs/openapi.yaml`
- 覆盖:`.scratch/tech-global-audit/审计覆盖基线.md``.scratch/tech-global-audit/审计覆盖清单.json``cmd/audit-coverage`
- 发布与留存:[审计归档灰度操作手册](归档灰度操作手册.md)。测试环境完整月仿真为 `2001-02`56/56 归档成功Integration 28/28 final清理后三张目标日志表归零6 条边界哨兵和对象归档全部保留。
- 性能只读观测:事件列表 0.315ms、资源时间线 0.116ms、Integration 列表 0.186ms、风险聚合 0.123msAPI P95/P99 使用既有 9.4 证据及发布后 Access Log 阈值,不执行接口压测。
- 本 Change 按明确约束不新增、修改或运行自动化测试;交付验证使用 OpenAPI 生成、覆盖静态门禁、编译、LSP、迁移/数据核对、只读性能观测和文档一致性检查。
## 14. 最终验收结论
2026-08-07 按 proposal、design、8 份 delta spec 和 77 项 tasks 完成最终核对:
| 门禁 | 最终证据 | 结论 |
|---|---|---|
| 静态覆盖 | `cmd/audit-coverage` 重新生成 692 条当前入口Action/Resource Registry、敏感读取、N/A 和旧 Writer 白名单无未登记项 | PASS |
| LSP 与构建 | 变更 Go 文件 `gopls check` 无诊断;`go build ./...` 退出码 0 | PASS |
| 迁移 | `.env.local` 测试库只读核对版本 205、未标 dirty无事实隔离 schema 已完成 `000199``000205` up/down现有事实库未执行破坏性 down | PASS |
| OpenAPI | `cmd/gendocs` 与运行时生成成功;两份制品各含 15 条平台调查及代理/企业活动路径且契约一致;固定请求/响应枚举已生成真实 `enum`,审计相关公开 schema 无缺失字段说明RouteSpec 已写明业务页字段、调查引用和通知目标映射 | PASS |
| 前端接入文档 | [审计链路与前端接入指南](跨视角调查与前端导航契约.md) 已覆盖 request/correlation/parent/integration/series 生命周期、数据库落点、自动与人工轮询边界、15 条接口全部入参与主要返回字段、现有业务页面入口矩阵和完整调用链OpenAPI 48 个请求参数名无遗漏 | PASS |
| 数据库与 API 性能 | 四条代表性数据库查询均小于 1ms且低于 50msAPI P95/P99 复用 9.4 既有证据,发布后以 Access Log 按 200ms/500ms 阈值持续观测 | PASS |
| 身份与凭据 | 平台、代理店铺层级、企业有效授权和 `internal_only` 边界已核对;数据库/响应凭据抽样为 0 命中,无审计导出、归档读取/恢复或业务删除路由 | PASS |
| 事务与业务链路 | 关键成功同事务、失败短事务保留原错、批量根子计数、真实 actor、request/correlation/parent/series 及四类事实边界证据已在 11.4 收口 | PASS |
| 旧写切换 | 旧账号/资产 Writer 生产写为 0旧表、旧资产历史查询和手动轮询运行 ledger 按契约保留 | PASS |
| 归档与清理 | `2001-02` 共 56/56 归档成功、Integration 28/28 finaldry-run 后测试库目标月三表归零6 条边界哨兵、56 条断点及全部对象/manifest 保留,生产清理开关关闭 | PASS |
| 制品一致性 | `git diff --check` 无错误;`openspec validate build-multi-view-audit-center --strict` PASS | PASS |
验收范围内已知错误为零77 项任务全部完成Change 可归档。未实现项仍严格保持第 12 节边界,不因验收扩展。