# 变更审查表 (Change Request)
## 1. 基本信息
| **变更 ID** | CR-20260820-002 |
| **变更标题** | 添加变更治理门禁机制和策略层检测 |
| **提交人** | EvoRule Team |
| **提交日期** | 2026-08-20 |
| **审查状态** | 已批准 |
## 2. 变更层级判定(必填)
### 2.1 变更层级声明
**本次变更属于**: ✅ **机制层 (Mechanism)**
### 2.2 判定理由
```
本次变更提供通用的变更治理基础设施,可被任何机制层代码复用。
```
### 2.3 机制层判定标准检查
**✅ 机制层变更的特征**:
- [x] 提供通用基础设施能力
- [x] 不包含任何特定业务语义
- [x] 可被任何业务场景无差别复用
## 3. 变更分类
- **变更类型**: A - 新增机制
- **影响模块**: evorule-cli
## 4. 变更详情
### 3.1 变更理由
添加变更治理门禁,防止未经审查的修改和策略层代码混入机制层。
### 3.2 变更范围
- build.rs: 添加 CHANGE_REQUEST.md 验证逻辑和策略检测
- CHANGE_REQUEST.md: 更新为新模板
### 3.3 破坏性分析
无破坏性变更。
### 3.4 影响评估
构建时间略有增加,对运行时性能无影响。
### 3.5 测试计划
- [x] CHANGE_REQUEST.md 验证通过
- [x] 策略检测通过
- [x] CLI 命令测试通过
### 3.6 回滚方案
删除 build.rs 中的验证代码即可回滚
## 5. 审查清单
### 层级审查
- [x] 变更层级声明为"机制层"
- [x] 判定理由充分
- [x] 代码中无策略层反模式
### 技术审查
- [x] CLI 功能测试通过
- [x] 代码质量检查通过
### 架构审查
- [x] 变更符合规则分类体系
- [x] 符合"机制不染指控制流"原则
---
## 6. 变更记录 CR-20260826-001: G-A1 审计锚点签名(v0.3.2 新增)
### 6.1 基本信息
| **变更 ID** | CR-20260826-001 |
| **变更标题** | G-A1 审计锚点签名(anchor-keygen / verify-anchors) |
| **提交人** | EvoRule Team |
| **提交日期** | 2026-08-26 |
| **审查状态** | 已批准 |
### 6.2 变更层级声明
**本次变更属于**: ✅ **机制层 (Mechanism)**
### 6.3 判定理由
```
ed25519 确定性签名 + 审计锚点链式校验是通用安全原语,不包含任何业务语义,
可被任何审计/合规场景无差别复用(真实性/防抵赖)。
```
### 6.4 变更详情
- 新增 `signing` 模块(`AuditSigner` / `verify_signature`,复制自 evorule-governance 最小实现,遵循 CLI 不引入 governance 的架构约束)
- 新增 `anchor-keygen` 子命令:生成 G-A1 审计锚点 ed25519 密钥对(一次性运维)
- 新增 `verify-anchors` 子命令:离线校验审计锚点链式链接 + 签名真实性
- `Cargo.toml` 新增依赖:`ed25519-dalek` / `getrandom`(仅密钥生成一次性运维用,不进入确定性执行路径)
- 私钥不落盘审计资产/规则库,由调用方注入 32 字节种子
### 6.5 测试计划
- [x] `signing` 单元测试(确定性签名 / 验签 / 篡改检测 / hex 往返 / 密钥生成)
- [x] `verify_anchors` 单元测试(链式链接 / 篡改 / 断链 / 错误公钥)
- [x] `anchor-keygen` 冒烟测试通过
- [x] 构建通过(CR 门禁 + 策略层检测 PASSED)
---
## 7. 变更记录 CR-20260830-001: build.rs 门禁状态机生命周期撇号判别修复
### 7.1 基本信息
| **变更 ID** | CR-20260830-001 |
| **变更标题** | build.rs 门禁状态机生命周期撇号判别修复(strip_test_mod 误报消除) |
| **提交人** | EvoRule Team |
| **提交日期** | 2026-08-30 |
| **审查状态** | 已批准 |
### 7.2 变更层级声明
**本次变更属于**: ✅ **机制层 (Mechanism)**
### 7.3 判定理由
```
本变更只修改 build.rs 门禁自身实现,不触及任何 src/ 执行语义:
- strip_test_mod/find_inline_lbrace/match_brace 状态机在撇号处新增
char_lit_starts() 判别(字符字面量 vs 生命周期),新增 skip_lifetime() 跳过
- 修复前 'static 等生命周期撇号被误判为字符态开头,吞掉后续所有花括号,
令 match_brace 永不闭合、tests 模块整体不被剥离、门禁对测试代码全量误报
- 五仓(tcb/reactor/governance/cli/server)同一份实现同步修复,
每仓 build.rs 内含 3 个单元测试(探针 crate 验证)
- 不新增/删除任何扫描模式,语言规范能力不变
```
### 7.4 变更详情
- build.rs:新增 `char_lit_starts`/`skip_lifetime` 两个函数;`find_inline_lbrace`/
`match_brace` 撇号入口处按判别结果分流;新增 `#[cfg(test)] mod tests`(3 个测试)
- 根 `GATE_REFERENCE.md`:登记修复说明与 evorule-server S 系列条目
- 门禁判定结果只会更精确(减少误报),不会放行任何原本被拦截的生产代码模式
### 7.5 测试计划
- [x] build.rs 内嵌 3 个单元测试(match_brace 生命周期/剥离存活/判别规则)
- [x] 探针 crate 以 lib.rs 方式加载真实 build.rs 运行(cargo test 不运行 build script 测试)
- [x] 核心四仓串行 cargo build 门禁 PASSED + evorule-server 全 workspace 编译通过
回滚:git revert 本提交即恢复旧状态机。
---
## 8. 变更记录 CR-20260901-001: executor 最终 payload 直接返回 + Stable 新结构适配(UV-032 O(n²) 修复配套)
### 8.1 基本信息
| 字段 | 值 |
|------|------|
| **变更 ID** | CR-20260901-001 |
| **变更标题** | executor 最终 payload 直接返回 + Stable 新结构适配 |
| **提交人** | EvoRule Team |
| **提交日期** | 2026-09-01 |
| **审查状态** | 已批准 |
### 8.2 变更层级声明
**本次变更属于**: ✅ **机制层 (Mechanism)**
### 8.3 判定理由
```
本变更适配 tier1 Fact::Stable 瘦身(快照字段移除,CR-20260901-001),
CLI 单次运行结果的取值路径从事实链改为执行器返回值——机制层取值路径
调整,不含任何业务语义。
```
### 8.4 变更详情
- `executor.rs`:`execute()` 返回值 `Vec<Fact>` → `(Vec<Fact>, JsonValue)`,
最终 payload 由执行器持有并直接返回(不经事实链);内部新增 version
计数(每条 StateTransition +1,对齐 reactor 语义),Stable 发射
`version` 字段
- `run.rs` / `examples/programmatic_run.rs`:解构新返回值
- `fact_log.rs` / `output.rs` / `diff.rs` / `verify_chain.rs` / `hash.rs`:
测试构造适配(Stable 用 version);`fact_to_human` Stable 行显示
`version=N`;fact_log 保留旧格式字符串样例兼作向后兼容解析测试
- `tests/cli_test.rs`:FIFO 断言从"末行 Stable 快照"改为"最后一条
StateTransition 的 new_payload"
### 8.5 测试计划
- [x] `cargo test -p evorule-cli` 全绿(61 lib + 20 集成)
- [x] 旧格式(≤0.3.x 含 final_snapshot)fact log 解析兼容性测试保留通过
- [x] FIFO / 确定性加载 / verify-chain / diff 端到端命令回归通过
回滚:git revert 本提交即恢复快照取值路径。
---
> 注意:这是机制层变更,后续每次修改都需要更新此文件。