# 回归质量门（QUALITY-GATE）

> L0 物理通道目前是 **v0.1 未标定版**。本文档记录质量门设计、首轮实算数据与标定欠账清单。
> 刻意不为了「数字好看」而乱调系数 —— 所有偏差登记留待用 RMxprt 批量结果回归后收紧。

---

## 一、运行方式

```bash
node scripts/regression.mjs                     # 跑门（比对基线）
node scripts/regression.mjs --update-baseline   # 重新生成基线快照
node scripts/regression.mjs --strict            # DEBT 也按失败计
node scripts/regression.mjs --json              # 机器可读输出
```

---

## 二、两道门 + 一个诊断

| 门 | 判据 | 阻断 |
|---|---|---|
| **A 物理边界门** | 效率落进该功率档 IE1~IE4 能效带、温升不越绝缘设计限值 | 由 `benchmarks/gate.sanity_blocking` 控制，**当前 false** |
| **B 回归门** | 与 `baseline.json` 逐指标比较，允许 0.5pt / 2K / 5% 劣化 | **是**（首次运行无基线时放行） |
| **诊断 divergence** | L0 物理通道 vs L1 仿真 proxy 的 Δη / ΔT | 否（仅记录） |

### 为什么 divergence 不阻断

`_run_simulated`（`motor_tools.py:750-756`）是在 ~180mm / 8 极 / 3000rpm 附近标定的线性式，
套到 200kW/22000rpm 会推出 80% 效率 —— 比 IE1 地板还低，是**仿真模型自身失真**。
强行把 L0 对齐到它等于把 L0 一起带偏。

故只有落在 `SIM_VALID_DOMAIN`（120~260mm / 4~8 极 / 500~4000rpm）内的案例才计入 2pt 预算，
域外标记 `out_of_domain`、可见但不计分。

---

## 三、已知偏差根因（5 项）

1. **铁损**：Steinmetz 用单一等效磁密（默认 1.2T），未区分齿部/轭部；`kh/ke` 系数未标定
2. **铜损**：槽面积由几何推算，缺少「匝数 × 电流」的电路约束；槽满率 0.45 与电密 5.5 A/mm² 均为经验值
3. **机械损**：`MECH_LOSS_K = 5` 未标定，仅保证量级正确
4. **温升**：散热面积按**光滑**机座外表面积计，未计散热筋；`COOLING_COEFFICIENT` 为单点标定
5. **效率封顶**：`efficiencyCap=96` 是为与 `_run_simulated` 同口径的权宜值，对高效高速机会低估

---

## 四、首轮实算结论（2026-09-21）

**判定：DEBT**（sanity 6/6 越界，但按配置不阻断；无回归）。

| 案例 | L0 η | 参考带 | Δη | L0 ΔT | 考核/设计限值 | 仿真 proxy | 域内? |
|---|---|---|---|---|---|---|---|
| y160m4 15kW/4极 | 86.65% | 87~94% | −0.35pt | 88.4K | 80/105K ⚠ | 83.4% | 是（超预算 3.25pt） |
| y200l4 30kW/4极 | 86.65% | 89~95% | −2.35pt | 113.8K | 80/105K ✗ | 86.08% | 否 |
| hs200kw 200kW/22000rpm | 96%（cap） | 95~98% | 0 | 113.3K | 105/105K ✗ | 80% | 否 |
| mine75kw 75kW/660V | 89.59% | 91~96% | −1.41pt | 131K | 80/105K ✗ | 89% | 否 |
| small55kw 5.5kW/2极 | 81.04% | 84~91% | −2.96pt | 108.8K | 80/105K ✗ | 80% | 否 |
| fan110kw 110kW/2极 | 90.13% | 92~97% | −1.87pt | 87.1K | 105/105K ✓ | 85.32% | 否 |

欠账集中在两点：**效率系统性偏低 1.4~3pt**（损耗三项未标定）、**温升系统性偏高**（散热筋未计 + 损耗高估）。
根因与第三节 5 项一致，属待标定项，不是实现缺陷。

### 独立探针（`scripts/verify.mjs` 之外）

| 案例 | 工况 | L0 物理通道 | 参照 | 偏差 |
|---|---|---|---|---|
| A | Y160M-4：15kW / 1460rpm / 4极 / OD260 / L155 / 风冷 | η 86.63%，温升 88.6K | IE1 88.5% / IE3 91.5%；B级允许温升 80K | η 偏低 1.9~4.9pt，温升偏高约 9K |
| B | 现场工况：200kW / 22000rpm / 2极 / 液冷 / SmCo | η 96%（受 cap 封顶，推算值约 97.5%），温升 107.2K | 同类高速 PMSM 典型 96.5~97.5% | 数值合理，但 cap=96 造成低估 |

> 诊断列 `l1_efficiency_proxy` / `l1_temp_proxy` 就是为标定准备的：
> 案例 B 中它给出 80%，与 L0 的 96% 相差 16pt —— 这不是 bug，
> 而是把「Python 仿真经验式在高速区失真」这件事显性暴露了出来。

---

## 五、待校准清单（W4 三件事）

- [ ] 用 RMxprt 批量结果做 native vs L1 回归，拟合 `kh/ke`、`MECH_LOSS_K`、`COOLING_COEFFICIENT`
- [ ] 回归目标：标定域内 `|Δη| ≤ 2pt`、`|Δ温升| ≤ 10K`
- [ ] 校准完成后重新评估 `efficiencyCap` 是否需要放宽（当前 96 对高速高效机偏保守）

### 翻转判据

6 个案例全部落进参考带且温升不越考核限值后，
必须把 `benchmarks/l0-benchmarks.json` 的 `gate.sanity_blocking` 改为 `true`，
否则门形同虚设。
