# P2-01 集成冒烟报告：单入口 nxai + 真实零件双版本冒烟

**日期**：2026-10-16
**交付物**：`D:\NX_AI\nxai.ps1`（单入口）、`nx_launch.ps1` 透传增强、`tools\bodies_probe.py`（92 vs 2 验证探针）
**约束遵守**：未启动 NX、未写全局环境变量、未改 NX 安装目录；真实零件运行列入第四节人工执行清单。

---

## 一、nxai 单入口使用说明

```
powershell -ExecutionPolicy Bypass -File D:\NX_AI\nxai.ps1 <子命令> [参数]
```

| 子命令 | 说明 | 退出码 |
|---|---|---|
| `nxai list` | 注册表探测本机全部 NX 版本（只读），刷新 `状态\versions.json` 并列表 | 0 |
| `nxai run -Version <2212\|2412\|latest> -Task <open-part\|hello> [-Part <prt路径>] [-DryRun]` | 提交任务引擎 → P0-03 启动器跑 journal → 成功判定 → 产物归档 + 哈希清单 → 回写 tasks.db | 0 成功 / 1 失败 / 2 用法错 |
| `nxai verify -TaskId <id>` | 重算 `状态\artifacts\<id>\` 下全部文件 SHA256 并与 manifest 比对 | 0 完整 / 1 异常 |

`run` 的内部流程（与任务卡第 38 行一致）：
1. 版本探测（`core\nx_versions.ps1` 产物，缓存复用）
2. `core\task_engine.py submit` 提交任务（tasks.db，pending）
3. `core\nx_launch.ps1 -Mode journal`（进程级环境注入，`-AssertNoGlobalChange` 默认开）
   → `tools\run_journal_probe.ps1` → `run_journal.exe <journal>`
   - `hello` → `tools\hello_journal.py`，成功标记 `journal_result.txt` 新增 `PY_JOURNAL OK`
   - `open-part` → `tools\open_part_probe.py -args <零件>`，成功标记 `part_probe_result.txt` 新增 `PART_PROBE OK`
4. 产物归档 `状态\artifacts\<task_id>\`（journal 日志 + 结果文件副本 + `manifest.json` SHA256 清单）
5. 回写 tasks.db（state=done/failed、result、artifact_paths、log_path）

## 二、施工方自测证据（本轮真实执行，全部只读/工程内/无 NX）

| 验证 | 命令 | 结果 |
|---|---|---|
| 版本列表 | `nxai list` | ✅ 退出 0，列出 2212（E:\...\NX2212）与 2412（E:\...\NX2412），RunJournalOk 均 True |
| DryRun·开零件 | `nxai run -Version 2412 -Task open-part -DryRun` | ✅ 退出 0，打印 5 步执行计划，零副作用 |
| DryRun·hello | `nxai run -Version latest -Task hello -DryRun` | ✅ 退出 0，latest 正确解析为 2412 |
| verify 正路 | 自造 `_selftest-verify` 产物 → `nxai verify` | ✅ 退出 0，2 文件哈希一致 |
| verify 负路 | 篡改 b.txt 后再 verify | ✅ 退出 1，报 `[DIFF] b.txt 哈希不符` |
| 任务引擎链路 | submit → python -c update → list | ✅ id 解析正确，cancelled 状态落库（自测任务 b9ecaede 已留痕） |

**自测中抓到并修复的 2 个真 bug**：
1. `versions.json` 顶层键是 `NxVersions`（非 `versions`），且 `@($null)` 计数为 1 掩盖了解析失败 → list 误报"未探测到任何 NX 安装"；已改为显式属性探测。
2. PS 5.1 调原生 exe 不转义内嵌双引号，`--params {...}` 到 python 变残缺 JSON（`Expecting property name...`）→ Submit-Task 内手工 `\"` 转义。

**`nx_launch.ps1` 增强**（备份 `backup\nx_launch.ps1.before_P201_20261016_212546`）：
新增可选 `-JournalArgs` / `-LogDir` 透传给 `run_journal_probe.ps1`；默认空时行为与旧版完全一致。

## 三、验收方先行实测（地面真相，引自任务卡，非本轮重跑）

| 观察 | NX2212 | NX2412 |
|---|---|---|
| run_journal + Python journal + 打开真实零件 | ✅ 13–15 秒 | ✅ 15 秒 |
| part.Leaf | 后盖铝板-LQD80-镜像-175电机 | 同 |
| len(part.Bodies) / ToArray() | ❌ 两版均不支持 | ❌ |
| **list(part.Bodies) / sum(1 for _ in ...)** | **92 个** | **2 个** |
| 全局环境变量 | 4 次运行零改动 | 同 |

## 四、人工执行清单（需要 NX 在线，本次任务未获授权，未执行）

以下命令会真实拉起 NX 批处理，请人工逐条执行（每条约 15 秒）：

```powershell
# ① 真实零件双版本冒烟（验收命令）
powershell -ExecutionPolicy Bypass -File D:\NX_AI\nxai.ps1 run -Version 2212 -Task open-part
powershell -ExecutionPolicy Bypass -File D:\NX_AI\nxai.ps1 run -Version 2412 -Task open-part
# 期望：各返回退出码 0，证据行含 PART_PROBE OK；产物落 状态\artifacts\<task_id>\
# 随后用 nxai verify -TaskId <id> 校验两次运行的产物完整性

# ② 92 vs 2 验证探针（见第五节）
powershell -ExecutionPolicy Bypass -File D:\NX_AI\core\nx_launch.ps1 -Version 2212 -Mode journal `
    -Journal D:\NX_AI\tools\bodies_probe.py -JournalArgs "C:\Users\Administrator\Desktop\UG插件\后盖铝板-LQD80-镜像-175电机.prt"
powershell -ExecutionPolicy Bypass -File D:\NX_AI\core\nx_launch.ps1 -Version 2412 -Mode journal `
    -Journal D:\NX_AI\tools\bodies_probe.py -JournalArgs "C:\Users\Administrator\Desktop\UG插件\后盖铝板-LQD80-镜像-175电机.prt"
# 对比 D:\NX_AI\状态\bodies_probe_result.txt 里两个 RESULT 行
```

## 五、Bodies 92 vs 2 调查结论

**结论：未证实，但证据链强烈指向「收敛体（Convergent Body）打包语义差异」，且已排除"数据丢失"方向。**

支持证据（均为已核实事实）：
- 同一零件两版本**面数（130）、面类型分布（68/43/19）、孔径分布完全一致**，特征数都是 2 ——
  几何实质相同，不存在"2412 少加载了东西"；
- 该零件是导入/收敛几何（Brep 特征，无参数化孔），92 这个量级符合"收敛小面体逐个成 Body"的特征；
- 候选假设"轻量化/部分加载"（任务卡第 29 行方向）可能性低：`OpenActiveDisplay` 两版用同一参数，
  且面数总量若部分加载必然对不上 130。

**下一步验证方法（可复现，探针已就绪）**：人工执行第四节②，`bodies_probe.py` 会输出两版本的
Bodies 计数、**面数总和、体积总和**、特征数、以及 `dir(part)` 反射出的 Convergent/Facet 相关成员名。
判定规则：
- **A（证实打包语义差异）**：两版 `faces_total` 与 `volume_total` 一致（130 面），仅 bodies 计数不同，
  且 2412 侧反射出 ConvergentBodies 类成员名 → Bodies 集合打包粒度不同，业务按几何量判断安全；
- **B（真数据差异）**：面数/体积也对不上 → 查加载完整性，升级处理。

无论 A/B，现有铁律第 2 条（禁止用 NX 对象个数做业务判断）已被本次调查再次证明是正确的纪律。
