# 路线图与现状（v2 · 2026-10-18 10:30）

> 这份文档回答一个问题：**目标里那四件事，到底做到哪一步了，凭什么说做到了。**
> 每条结论后面都跟着可复现的证据命令或产物路径，不接受"已完成"式表述。

---

## 一、总览

| 目标项 | 状态 | 一句话依据 |
|---|---|---|
| ① 调研 + 可长期执行的规划 | ✅ 完成 | `00~13_*.md` 规划包 + 台账 54KB（26 节，含每个决策与踩坑） |
| ② NX 版本自动识别与自由切换 | ✅ 完成 | 注册表探测两版本；`nxai list` / `nxai run -Version 2212\|2412` 均实测成功 |
| ③ NX Open / Journal 桥接层 | ✅ 完成 | 进程级环境注入 + `run_journal` 批处理 + 自检「全局变量零改动」；双版本 journal 均 OK |
| ④ AI 自动编程能力 | ✅ 原型可用 | L1 规则 + L2 精确修正 + L3 归并经验；工序单可出，含孔径分诊与红线检查 |
| ⑤ 云端长期记忆 + 自我优化闭环 | ✅ 打通 | 自建云服务已上线（`/nxai/v1/healthz` 200 JSON）；飞轮 采集→归并→发布→消费 全链实测 |
| ⑥（用户另加）刀路生成 | 🟡 施工中 | 卡 `P4-01` 已投给 Trae；CAM API 签名已探明并写入卡内 |

---

## 二、逐项证据

### ② NX 版本识别与切换

```
powershell -File D:\NX_AI\nxai.ps1 list
  -> 2212  E:\Program Files\Siemens\NX2212  RunJournalOk=True
     2412  E:\Program Files\Siemens\NX2412  RunJournalOk=True
```

`nxai run -Version 2412 -Task hello` → `PY_JOURNAL OK  NX=2412  Python=3.11.9`，exit 0
`nxai run -Version 2212 -Task hello` → `PY_JOURNAL OK  NX=2212  Python=3.10.6`，exit 0
`nxai verify -TaskId <id>` → 产物 SHA256 逐个一致，exit 0

### ③ 桥接层

- 启动器 `core\nx_launch.ps1`：进程级环境注入，跑完自检「全局（机器级/用户级）NX 变量无一被改动」
- 红线遵守：不设 `UGII_VENDOR_DIR` / `UGII_LOCAL_USER_DEFAULTS`，不写系统级变量
- 双版本 Python 差异已踏平：2212→3.10.6、2412→3.11.9，journal 侧代码一致

### ④ 自动编程能力（L1/L2/L3）

```
python D:\NX_AI\core\propose_plan.py --facts 状态\_demo_facts.json --material N
  -> 材料 6061铝合金 (ISO N)；roughing D12 S=6366 F=2292 ap=4.8 ae=5.4
     finishing D8 ap=0.3（RL-009 clamp 生效）；drilling 按孔径分诊
     sanitize 命中 185 处已脱敏
```

- **L1**：规则引擎 + 9 条红线（RL-001~009），红线违规逐条报出
- **L2**：`feedback.py` 精确键匹配（材料组+刀型+直径+工序全一致才命中）
- **L3**：`flywheel` 归并经验（本轮新接通），实测把 rpm 由 9549.3 改成 1770.0，
  `capability_level` 变 `L1-rule-driven + L3-merged-experience`，来源可追溯到候选 id
- **安全硬门槛**：L3 要求材料组/工序/刀型完全一致 + 直径相似度≥0.85
  （因为相似度公式会白送 0.5 分，实测「铝N/钻削/φ8」与「钢H/开粗/φ20」相似度仍有 0.72）
- **孔径分诊**：drill_ready / need_tooling / over_capability / suspect 四桶，
  每桶不同处置建议（不再用一句"需备刀"糊过去）

### ⑤ 云端记忆 + 自我优化闭环

**自建云服务（P1-06）**：stdlib 零依赖，HMAC 签名 + nonce 防重放 + 每设备密钥 + TLS 指纹固定 + 任务白名单
```
https://ldeh.asia/nxai/v1/healthz -> 200  56B  {"ok":true,"service":"nxai-cloud","pending_jobs":0}
```
- 只监听 `127.0.0.1:8790`（公网 8000/8001/8765/8790 全部不可达）
- 自启：`NxaiCloudBoot` / `NxaiRelayBoot`（SYSTEM，开机 + 每 5 分钟自愈）
  实测杀掉进程 → 3~4 分钟自动拉起，`health` 恢复正常

**闭环三段**（全部有生产入口）：
```
① 采集  core\feedback.py record          -> 自动投飞轮事件
② 归并  tools\flywheel_merge.py          -> run / approve / publish / rollback（默认只读）
③ 消费  core\propose_plan.py             -> apply_flywheel_experience（L3）
```
实测：4 条事件 → 候选 support=4 → 审批 → 发布 → 工序单 rpm 被改成 1770.0，来源带
候选 id / similarity / support / applied 明细。

### ⑥ 刀路生成（施工中）

CAM API 已取证（`cam_probe.py/2/3.py` + `状态\cam_probe*.jsonl`），两版本一致：
`part.CAMSetup.CAMOperationCollection`（不是 Operations）、
`CreateHoleDrillingBuilder(None)`、`Create(parentProgramGroup,...)`、
`NCGroupCollection` 有 40+ 个 `Create*ToolBuilder`、builder 有 `Commit/FeedsBuilder/CutParameters/Geometry`。
**不存在**：`Operation.Generate`、`Operation.Commit`、`CAMSession.GetSession`。
坑：`run_journal` 启动时 `Parts.Work` 为 None，必须先 `OpenBaseDisplay(part_path)`。

---

## 三、质量基线（可复跑的护栏）

| 门禁 | 现状 | 命令 |
|---|---|---|
| 语法门禁 | 67 个 `.py`，0 错误 0 预警 | `python tools\check_py_syntax.py` |
| 评测门禁 | 断言 **21/21**、36 个特征化上下文、漂移 0、意外退化 0 | `python tests\run_eval.py` |
| 测试套件 | **13 个测试文件全通过** | 逐个跑 `tests\test_*.py` |
| 严格漂移 | `--strict-drift` 也 0 漂移 | `python tests\run_eval.py --strict-drift` |

评测里几条关键的"独立"断言（不拿引擎结果对自己）：
- 丝锥螺距 = **标准粗牙表**（M3=0.5 … M12=1.75）
- 钻孔 feed = rpm × fz（逐上下文，齿数强制 1）
- 攻丝 feed = rpm × 螺距（逐上下文）
- 精加工 ap ∈ [0.1, 0.3] 绝对值（逐上下文）
- **无静默全 0 参数**（返回全 0 必须同时给出显式违规）
- 基线覆盖率 ≥30 且全部可解析到刀具

---

## 四、已知缺口（如实列出，未修）

| # | 缺口 | 影响 | 处置 |
|---|---|---|---|
| 1 | `parameters.json` 的 tapping 预设只覆盖 P/M/K，缺 N(铝)/S(钛)/H(淬硬钢) | 这三组攻丝时引擎按 RL-004 **正确拒绝回落**并报 error，但用户只看到"没有参数" | 卡 `P4-09`（要求必须有出处，拿不到就 blocked，禁止编造） |
| 2 | 刀具库钻头只到 φ12；真实零件有 φ18/φ20.69/φ30.56 | 大直径孔必然配不到刀 | 卡 `P4-06`（`data_lint` 查覆盖）+ `P4-08`（铣削/预钻兜底方案） |
| 3 | `hole_diameter.py` 把"圆柱面"等同于"孔" | φ44~φ96 那 34 处到底是孔/沉台/外轮廓，程序判断不了，只能标"需确认" | 卡 `P4-07`（NX 内取轴向/边数/相邻面/法向，拿不到写 unavailable） |
| 4 | 服务器 DISM 坏（`0x80040154` 缺 COM 类） | WinSxS 8.2 GB 无法回收 | 需重装系统组件或忽略；磁盘已从 5.69→8.35 GB |
| 5 | 服务器 50 GB 盘 | 长期是硬伤 | 扩盘或把数据外移 |
| 6 | 本机 DISM 需管理员（错误 740） | 本机 WinSxS 9.4 GB 未回收 | 以管理员跑 `Dism /Online /Cleanup-Image /StartComponentCleanup` |

---

## 五、下一步路线

**近期（Trae 在做）**：P4-01 刀路生成 → P4-06 数据自检 → P4-07 孔判据 → P4-08 铣削兜底 → P4-09 攻丝预设。

**中期（我做验收 + 生产）**：
1. 每张卡验收：复跑它声称的 verify + 两道门禁 + 全量测试
2. 刀路生成上真机：两版本各跑一次，确认 `ops_after > ops_before`
3. 把高频孔（φ8.5×21、φ11×16）的缺刀问题给工艺决策建议

**长期（产品化，尚未排期）**：
1. 安装程序（`installer\` 已有雏形，需与 `deploy.ps1` 四动作打通）
2. NX 内菜单/工具条（极薄桥接已完成，UI 入口还没做）
3. 刀具库/材料库的企业化维护流程
4. 多用户与权限（现在是单机单用户假设）

---

## 六、怎么用（最小上手）

```powershell
# 看版本
powershell -File D:\NX_AI\nxai.ps1 list
# 跑一次自检（真启动 NX，约 45 秒）
powershell -File D:\NX_AI\nxai.ps1 run -Version 2412 -Task hello
# 真实零件全链路演示（约 65 秒）
python D:\NX_AI\tools\demo_end_to_end.py
# 出工序单
python D:\NX_AI\core\propose_plan.py --facts D:\NX_AI\状态\_demo_facts.json --material N --json
# 记录人工修正 -> 归并 -> 发布 -> 自动复用
python D:\NX_AI\core\feedback.py record --op drilling --material N --tool D11 --diameter 11 --set rpm=1800
python D:\NX_AI\tools\flywheel_merge.py run --write
python D:\NX_AI\tools\flywheel_merge.py approve --id <id> ; python D:\NX_AI\tools\flywheel_merge.py publish --id <id>
```
详细说明见 `docs\使用手册.md`（12 KB，11 章，每条命令都实测过）。

---

## 七、对账能力（2026-10-18 新增，这是判断"我们准不准"的唯一硬标准）

```text
工具：tools\cam_extract.py（把零件里已有的真实工序抽成数据集）
      tools\cam_reconcile.py（真实程序 vs AI 工序单，逐项对账）
产物：状态\cam_ops.jsonl、状态\cam_ops_report.md、状态\cam_reconcile.md

实测（后盖铝板-LQD80-镜像-175电机，真实程序 20 道工序）：
  真实钻的直径 : φ5  φ6.8  φ7  φ8.5  φ9.8  φ10  φ11
  我们建议钻的 : φ1.71 φ5 φ5.64 φ6 φ6.8 φ7 φ8.5 φ10 φ11 φ11.5
  命中 6/7，唯一漏的：φ9.8    <- 补刀清单只有一根
  真实攻丝 M8×1、M8×1.25，我们 0 道（原因见下）
  真实用 D6/D7 铣刀做沉孔铣削，与我们 mill_bore 兜底建议方向一致

对账暴露的两个真实缺口：
  1. 攻丝工序根本没生成 —— propose_plan 只从孔径生成钻孔，缺
     『螺纹规格 ↔ 底孔直径』对照表；不是补 Vc 预设就够的。
  2. φ9.8 钻头缺货。
```