# L2 学习层：接进工作流 + 防退化评测

> 背景：验收方已实现并**实测验证** L2 学习闭环（证据见 `D:\NX_AI\docs\P2-02_L2学习闭环实测.md`）。
> 本卡补齐闭环缺失的两块：**人工修正的采集入口** 与 **防退化评测（安全带）**。

---

### P2-06 把 L2 接进工作流，并建"防退化"金标评测

```text
【任务 P2-06】L2 学习层接线 + 防退化评测

验收方已实现并验证的部分（**不要重写，只在其上加**）：
  D:\NX_AI\core\feedback.py       人工修正的采集与精确复用（canonical key 精确匹配）
  D:\NX_AI\core\propose_plan.py   已接入 apply_learned_correction()

实测证据（2026-10-16 19:5x，真实零件 后盖铝板-LQD80-镜像-175电机.prt）：
  基线（--no-learn）  roughing D12: ap=4.8  rpm=2387.3  source=SpeedFeedTable(钢件-粗铣-平底刀)
  记录修正            ap_mm=3.0  rpm=2200  原因"45钢退火开粗震刀"
  重新生成              roughing D12: ap=3.0  rpm=2200.0  source=human-corrected(99a5c952)
                        MRR 自动重算 14.85 → 9.28
  对照组                finishing D8: ap=4.0  source=SpeedFeedTable(...)  ← 未被污染
  capability_level      自动升级为 "L1-rule-driven + L2-learned"
  feedback.py self-test PASSED 9/9（含"换刀径/换工序/换材料都不误命中""非法字段被拒"）

canonical key 规则（**不许改**，已有 9/9 自测覆盖）：
  op=<工序>|mat=<ISO材料组>|tool=<刀型>|d=<直径保留1位>
  刻意不含 NX 版本 —— 经验属于工艺，跨版本要能复用。

请完成：

1. 【采集入口】把人工修正接进实际工作流，两条途径都要有：
   a. `feedback.py` 增加 `--from-file`：支持从一个 JSON 文件批量导入修正，格式例如
      [{"op":"roughing","material":"P","tool":"end_mill_flat","diameter":12.0,
        "set":{"ap_mm":3.0,"rpm":2200},"why":"退火开粗震刀"}]。
      （工序单是人工审核的载体，批量化导入是真实产线的用法）
   b. 提供 `D:\NX_AI\tools\correct.bat` + 配套脚本：双击后交互式询问
      工序/材料/刀具/直径/新值/原因，调用 record 写入；写完回显 canonical key 与新值。
      要求：输入非法（字段名不在允许列表、直径非数字）时给出清晰提示且不写库。

2. 【防退化评测】建金标回归集与评测脚本（这是"自我优化"的安全带，缺了迟早越学越蠢）：
   - `D:\NX_AI\tests\golden\golden_cases.json`：20~50 条真实任务，每条含
     上下文（工序/材料/刀具/直径）+ 期望着值（可由工艺员给定，或先用规则输出冻结为基线）
   - `D:\NX_AI\tests\run_eval.py`：
     ① 跑全部金标，输出**命中率**（建议与期望一致的比例）
     ② 分别跑 `--no-learn` 与默认（含学习）两种模式，对比命中率
     ③ 输出**负向指标**：生成工序数、未匹配刀具数、红线条数(按 level 分)、
        建议来源分布（规则/人工修正）、被执行的学习修正条数与冲突条数
     ④ **断言**：学习后命中率 >= 学习前；不满足则退出码非零并打印退化了哪些用例
   - 产出 `D:\NX_AI\状态\eval_report.json` + 人类可读摘要

3. 【冲突可见】同一 canonical key 有多条修正时，报告必须显示
   "取最新 + 存在 N 条冲突修正"，**不允许静默覆盖**。
   同时提供 `feedback.py conflicts` 子命令列出所有冲突 key。

4. 写 `D:\NX_AI\docs\P2-06_L2闭环与评测.md`：
   - 数据流：NX 几何 → 规则建议 → 人工修正 → 记忆 → 下次建议
   - 评测口径：什么算命中、什么算退化、负向指标怎么读
   - 明确"什么样的情况算越学越蠢"以及拦截手段

约束：
- 不许改 canonical_key 的格式与精确匹配语义（宁可不用，也不能张冠李戴）
- 人工修正的 success_rate 起始必须是 1.0（人工确认=真值），不要改成 0.5
- 所有写入必须带溯源（memory_id / created_at / why），并在报告里可见

验收标准：
  `python D:\NX_AI\tests\run_eval.py` 能跑出报告且断言生效；
  `correct.bat` 能交互式写入一条修正并在 `feedback.py lookup` 里查到；
  `feedback.py conflicts` 能列出构造出的冲突；文件全部 UTF-8 with BOM（PS）或 UTF-8（PY）。
```

---

## 附：为什么"评测"比"学习"更重要

验收方在总体规划里把这条列为红线：

> 任何自动写入必须**可溯源、可灰度、可一键回滚**；没有离线评测就会"越学越蠢"。

本轮实测已经证明了**学得对**（修正精确命中、不误伤其它上下文）。
但"学得对"只在这一次、这一个 key 上被验证过。要让它**长期**成立，必须有：
固定金标集 + 每次发布的对照跑 + 负向指标。否则半年后没人能回答
"这东西到底比上个月更准还是更蠢"。
