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

27 KiB
Raw Blame History

多视角审计中心功能总结

本文汇总 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.gointernal/routes/audit.go。完整逐入口决定见 审计覆盖基线

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_idoccurred_atcreated_at 稳定公开事件 ID、真实发生时间、持久化时间
动作 categoryaction_codeaction_namesummary 稳定动作类别/编码、中文名称快照和内部摘要
操作者 actor_kind/id/nameactor_shop_id/nameactor_enterprise_id/name 事件发生时的真实人工、OpenAPI、系统任务、计划任务或外部系统身份快照
入口 sourcerequest_path/methodip_addressuser_agent admin/personal/openapi/worker/scheduler/callback 等来源及 HTTP 摘要
范围 scope_type/id/name 平台、店铺、企业、个人等本次主要业务范围快照
结果 resultrisk_levelerror_codeerror_summary success/failed/denied/partial/unknown、风险和安全错误摘要
链路 request_idcorrelation_idparent_event_id 请求、业务链路和直接父事件
批量 batch_totalsuccess_countfail_count 批次根统计;子事件通过 parent/correlation 关联
完整性 metadatacontent_hash 有界安全业务参数和标准化内容 SHA-256

3.2 Event Resource

字段 语义
resource_type/id/key/display_name Registry 类型、可空内部 ID、事件时稳定业务 Key 和展示名
relation primaryaffectedreference;每个事件必须且只能按动作契约确定主要资源
role old_card/new_card/bound_card/entry_device/order/wallet_transaction 等稳定业务角色
identity_snapshot 事件发生时资源身份,不依赖当前业务表是否删除、更名、换号
before_data/after_data 该资源本次真实涉及的字段,不使用事件级万能 JSON
subject_visibility internal_onlysubject_resultsubject_detail
subject_summary/subject_data 写入时生成的主体安全结论及 Registry 白名单字段
sort_order/created_at 稳定展示顺序和落库时间

3.3 Integration Log

字段组 字段 语义
身份 integration_idproviderdirectionoperationexternal_id 稳定交互身份、提供方、方向、动作和外部业务标识
资源 resource_type/id/key 本次外部交互的直接主资源;其他资源通过关联 Audit Event 展开
触发 trigger_source/scene/seriesattempt 来源、业务场景和显式技术尝试序列
结果 resulthttp_statusprovider_code/messageduration_msstate_changed 原始结果、安全可读摘要、耗时和是否改变本地事实
内容 request_summaryresponse_summarymetadatacontent_hash 写入和返回前均经过白名单及凭据删除的结构化摘要
链路 request_idcorrelation_idaudit_event_id 与请求、业务链路和内部状态变化事件的稳定关联

派生结果类别固定为:pending→processingsuccess→succeededunknown→indeterminate、明确失败结果→failedignored/merged/rate_limited/completed/cancelled→not_sentcompleted 不计外部请求成功。

3.4 留存与调查引用

结构 字段 语义
retention online_fromarchived_beforetimezone 当前 PostgreSQL 在线窗口、已归档边界、Asia/Shanghai 时区
investigation_refs event_idactor_refresource_refs[]request_idcorrelation_idintegration_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.gointernal/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 条接口入参与返回、页面字段来源和降级规则统一见审计链路与前端接入指南;专题说明见平台基础审计调查接口外部集成调查接口主体资源活动接口。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 观测、告警和启停步骤见审计归档灰度操作手册

所有在线调查 DTO 返回 retention。显式范围早于在线边界或跨越边界时返回 CodeAuditDataArchivedID-only 详情在线库不存在仍按资源不存在处理。接口不扫描对象存储,也不返回误导性的成功空结果或部分历史。

11. 发布、回滚与监控

发布前要求迁移版本 205dirty=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.gointernal/model/integration_log.gointernal/model/log_archive_run.gointernal/infrastructure/audit/internal/query/audit/internal/query/integration/internal/application/auditarchive/
  • APIinternal/handler/admin/audit.gointernal/routes/audit.gointernal/model/dto/audit_dto.godocs/admin-openapi.yamllogs/openapi.yaml
  • 覆盖:.scratch/tech-global-audit/审计覆盖基线.md.scratch/tech-global-audit/审计覆盖清单.jsoncmd/audit-coverage
  • 发布与留存:审计归档灰度操作手册。测试环境完整月仿真为 2001-0256/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 已完成 000199000205 up/down现有事实库未执行破坏性 down PASS
OpenAPI cmd/gendocs 与运行时生成成功;两份制品各含 15 条平台调查及代理/企业活动路径且契约一致;固定请求/响应枚举已生成真实 enum,审计相关公开 schema 无缺失字段说明RouteSpec 已写明业务页字段、调查引用和通知目标映射 PASS
前端接入文档 审计链路与前端接入指南 已覆盖 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 节边界,不因验收扩展。