# L2 学习闭环实测报告（人工修正 → 记忆 → 下次建议生效）

> 执行者：验收方（DeepSeek Harness）　时间：2026-10-16 19:5x
> 目的：验证目标里的「长期自我优化」是否真的闭环
> 结论：**闭环成立且可测量**；同时明确了防退化评测的缺失（已开 P2-06）

## 1. 机制

```
NX 几何事实(model_facts/hole_diameter)
   → 规则引擎给出 L1 建议（8 条业务红线强制生效）
   → 工艺员人工修正
   → 写入本地记忆(feedback.py, procedural, success_rate=1.0, 带溯源)
   → 下次生成同一个 canonical key 的上下文时，精确命中并覆盖规则值
```

canonical key：`op=<工序>|mat=<ISO材料组>|tool=<刀型>|d=<直径保留1位>`
**刻意不含 NX 版本** —— 经验属于工艺，跨版本复用。

## 2. 实测对照（真实零件：后盖铝板-LQD80-镜像-175电机.prt）

| 阶段 | roughing D12 ap | rpm | source |
|---|---|---|---|
| 基线（--no-learn） | 4.8 | 2387.3 | SpeedFeedTable(钢件-粗铣-平底刀) |
| 记录修正 | — | — | `ap_mm=3.0, rpm=2200`，原因"45钢退火开粗震刀" |
| 重新生成 | **3.0** | **2200.0** | **human-corrected(99a5c952)** |

同时：
- MRR 被自动重算：14.85 → **9.28** cm³/min（保持内部一致）
- 对照组 finishing D8：ap 仍为 4.0，source 仍为预设表 → **未被污染**
- `capability_level` 自动升级：`L1-rule-driven` → `L1-rule-driven + L2-learned`
- `learned_corrections` 字段记录了 `ap_mm: 4.8→3.0`、`rpm: 2387.3→2200.0` 的完整对照

## 3. 防误用设计（这是关键，比"能学"更重要）

`feedback.py self-test` **PASSED 9/9**，覆盖：

| 用例 | 目的 |
|---|---|
| 空库不命中 | 没有经验时不乱给建议 |
| 记录后可命中 | 基本功能 |
| 命中带溯源 | 必须能回答"这条经验谁在什么时候因为什么加的" |
| **换刀径不误命中** | D12 的经验不得套到 D10 上 |
| **换工序不误命中** | 粗铣的经验不得套到精铣上 |
| **换材料不误命中** | 钢的经验不得套到不锈钢上 |
| 多字段覆盖生效 | 支持同时改 ap 与 rpm |
| 非法字段被拒 | 不允许写进非参数字段（防污染） |
| list 可列出 | 经验可审计 |

即：**只做精确 key 匹配，宁可不用，也不张冠李戴。**

## 4. 仍然缺什么（已开 P2-06）

闭环里"学"和"用"都通了，但缺**安全带的另一半**：
1. **采集入口**：目前只能命令行 `record`，工序员无法在日常工作流里改
2. **防退化评测**：没有金标回归集，无法回答"这东西比上个月更准还是更蠢"
   —— 这与总体规划里的红线一致：*没有离线评测就会越学越蠢*
3. **冲突可见**：同一 key 多条修正时，当前是静默取最新

## 5. 对目标的意义

| 目标要素 | 之前 | 现在 |
|---|---|---|
| AI 自动编程能力 | L1 工序链闭合 | **L1 + L2**：人工修正会被精确复用 |
| 云端长期记忆与自我优化闭环 | 本地"存"通了 | **本地"存→取→生效"全通**；云端同步(P1-06)与评测(P2-06)待做 |

一句话：**从"每次都给同样的建议"变成了"改过一次就记住"** —— 这是"越用越准"的第一块可测量证据。