text38.txt

一、接续说明

执行时间：2026-06-20 CST

本文件专门关闭下面这个问题：

```text
剩余 77 个 SKIP 中哪些是真正可 promotion 的 main-program row？
```

结论不是“还要继续逐条找”，而是：

```text
当前没有可直接 promotion 的 skipped main-program row。
baseline 不能继续因为这 77 个 SKIP 而变化。
```

本文件的作用是把该结论整理成可执行、可复查、可防回归的方法，供后续接续时直接引用，
避免下一轮再次重复总复核。

二、已确认事实

当前 inventory baseline 已重新生成并复核：

```text
sim_configs_wasm_node_inventory_executed=82
sim_configs_wasm_node_inventory_passed=82
sim_configs_wasm_node_inventory_skipped=77
sim_configs_wasm_node_inventory_unexpected_fail=0
```

77 个 SKIP 的构成已经固定为：

```text
ASSET-ONLY=65
L4-USER-M-PROCESS=1
NON_MAIN_CLASS=10
UPSTREAM-DEMO=1
```

其中真正 `class=main` 的 skipped row 只有 2 个：

```text
axis/vismach/millturn/example.ngc
axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_g533.ngc
```

这 2 个 row 当前均为：

```text
promotion_allowed=0
promotion_ready=0
```

因此最终判定：

```text
remaining_skip_count=77
remaining_skipped_main_program_rows=2
remaining_skipped_main_program_promotion_allowed=0
direct_inventory_promotion_rows=0
baseline_change_allowed=no
```

三、问题关闭判定

该问题已经完全解决，理由如下：

```text
1. 审计对象已经限定：
   只检查 current_status=SKIP 且 class=main 的 row。

2. 审计数据已经落盘：
   remaining-skip-main-program-promotion-audit.tsv 已生成并被 docs smoke 检查。

3. 审计结果已经闭环：
   当前只有 2 个 skipped main-program row，且 promotion_allowed 全部为 0。

4. 非 main-program SKIP 已排除：
   ASSET-ONLY=65 和 NON_MAIN_CLASS=10 不能伪装成 standalone main-program PASS。

5. blocked runtime / invalid upstream demo 已排除：
   L4-USER-M-PROCESS 缺 promotion proof；
   UPSTREAM-DEMO 缺有效 motion G-code；
   两者都不能直接 promotion。
```

所以后续不应再把“复核 77 个 SKIP 哪些可 promotion”当作开放任务。

四、逐类处理方法

1. ASSET-ONLY=65

处理规则：

```text
不 promotion。
不计入 standalone main-program promotion 候选。
不为了降低 SKIP 数量改成 PASS。
```

原因：

```text
这些 row 是 source asset / dependency / support file，不是可独立运行的 main-program。
即使它们对某个 PASS row 有贡献，也只能作为 source coverage 或 evidence dependency，
不能独立改变 inventory PASS baseline。
```

允许后续动作：

```text
1. 作为已 PASS row 的 evidence dependency 引用；
2. 在 diagnostics/release artifact 中展示 source coverage；
3. 不改变 current_status=SKIP 的 inventory 语义。
```

2. NON_MAIN_CLASS=10

处理规则：

```text
不 promotion。
不重分类为 main，除非 LinuxCNC source / inventory classifier 明确变化。
不作为 baseline promotion 候选。
```

原因：

```text
这些 row 不是 standalone main-program class。
promotion 的目标是可作为主程序执行并被 Node/WASM/browser proof 覆盖的 row。
```

允许后续动作：

```text
1. 保持分类；
2. 如果 classifier 规则改变，先重跑 inventory 并检查 drift；
3. 只有 class 真实变为 main 后，才进入 skipped main-program audit。
```

3. L4-USER-M-PROCESS=1

对应 row：

```text
axis/vismach/millturn/example.ngc
```

当前状态：

```text
class=main
skip_kind=L4-USER-M-PROCESS
native_status=PASS
simulation_proof_status=ready_disabled_by_default:native=0:node=0:browser=0
promotion_allowed=0
```

处理规则：

```text
当前不 promotion。
Web/virtual HAL 状态 proof 只能证明页面和虚拟 HAL 仿真链路可展示相关状态，
不能替代 external user-M arbitrary process execution 的 runtime promotion proof。
```

要让它未来可重新进入 promotion 讨论，必须先满足：

```text
1. native opt-in runtime probe 真正通过；
2. millturn_user_m_runtime_probe_status=runtime_state_probe_passed；
3. execution gate 有明确 artifact 证明；
4. Node inventory promotion gate 重新计算后给出 promotion_allowed=1；
5. browser/host proof 补齐；
6. manual promotion lock review 明确放行。
```

在这些条件满足前，禁止动作：

```text
1. 禁止仅凭 virtual HAL proof 改 PASS；
2. 禁止仅凭 native_status=PASS 改 PASS；
3. 禁止手写 promotion_allowed=1；
4. 禁止把 baseline 从 82/82/77/0 往前推。
```

4. UPSTREAM-DEMO=1

对应 row：

```text
axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_g533.ngc
```

当前状态：

```text
class=main
skip_kind=UPSTREAM-DEMO
native_status=FAIL
native_expected_failure=upstream-demo-missing-motion-gcode
promotion_allowed=0
```

处理规则：

```text
当前不 promotion。
不能为了 baseline 变化修补或替换 LinuxCNC upstream demo 的语义。
```

允许后续动作：

```text
1. 保留为 upstream invalid/demo edge；
2. 在 docs 中说明它不是可执行 motion main-program；
3. 如果 upstream source 将来修复，先更新 vendor source，再重跑 inventory；
4. 只有 native/WASM/browser proof 全部重算后，才允许重新评估。
```

五、以后如何复查而不重做总复核

后续如果有人再次问“77 个 SKIP 中还有没有可 promotion main-program row”，
不要重新从 77 行人工审起，按下面方法复查即可。

第一步：重新生成 inventory artifact

```bash
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
```

第二步：只看两个关键 artifact

```text
wasm-port/build/wasm/sim-configs-inventory/skip-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/remaining-skip-main-program-promotion-audit.tsv
```

第三步：确认 skip summary 是否仍为当前结构

期望：

```text
ASSET-ONLY=65
L4-USER-M-PROCESS=1
NON_MAIN_CLASS=10
UPSTREAM-DEMO=1
```

如果一致，则不重开问题。

第四步：确认 audit 行数和 promotion_allowed

期望：

```text
remaining-skip-main-program-promotion-audit.tsv 只有 2 行；
两行 class=main；
两行 promotion_allowed=0；
两行 promotion_ready=0；
路径分别是：
axis/vismach/millturn/example.ngc
axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_g533.ngc
```

如果一致，则结论仍是：

```text
direct_inventory_promotion_rows=0
baseline_change_allowed=no
```

六、允许重开问题的唯一条件

只有出现以下任一 drift，才允许重开“剩余 SKIP promotion”问题：

```text
1. remaining-skip-main-program-promotion-audit.tsv 行数不再是 2；
2. audit 中出现新的 class=main skipped row；
3. 任一 audit row 的 promotion_allowed 变为 1；
4. 任一 audit row 的 promotion_ready 变为 1；
5. skip-summary.tsv 的四类计数发生变化；
6. L4-USER-M-PROCESS native opt-in runtime probe 变为 runtime_state_probe_passed；
7. UPSTREAM-DEMO row 的 native_expected_failure 不再是 upstream-demo-missing-motion-gcode；
8. inventory classifier 明确改变了 ASSET-ONLY 或 NON_MAIN_CLASS 的 class 语义。
```

如果没有这些 drift，禁止重新打开总复核。

七、推荐验证命令

关闭该问题时的最小验证：

```bash
git diff --check
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/docs/node/verify_sim_configs_coverage_docs.sh
```

如果后续涉及 release / browser evidence，还应追加：

```bash
wasm-port/tests/sdk/node/verify_sdk_surface.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_real_simulation_browser.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
```

如果后续专门尝试 L4-USER-M-PROCESS promotion proof，还应追加：

```bash
bash wasm-port/tests/native/probe_millturn_user_m_runtime.sh
wasm-port/tests/native/verify_native_probes.sh
```

但这些 native probe 只有在明确选择 L4-USER-M-PROCESS runtime 主线时才需要跑，
不作为当前 77 SKIP 问题关闭的必要条件。

八、后续工作分流

该问题关闭后，后续只能走两条线之一。

第一条：继续当前 smoke 收尾

```text
目标：
继续收敛 real_simulation_page_smoke.html 中 review/statusbar/external-shell
相关重复断言。

边界：
不改 inventory baseline；
不改 diagnostics artifact schema；
不改 release artifact schema；
不重开 77 SKIP 总复核。
```

第二条：切回 promotion 主线

promotion 主线不能从“77 个 SKIP 里继续找”开始，而应二选一：

```text
1. L4-USER-M-PROCESS runtime proof：
   先解决 native opt-in runtime probe；
   目标是 runtime_state_probe_passed；
   通过后再进入 inventory promotion gate。

2. 已 PASS row evidence expansion：
   继续扩展 browser diagnostics / release evidence；
   优先选择 current_status=PASS 且已有 matrix/browser REP 基础的 row；
   不改变 inventory baseline=82/82/77/0。
```

九、最终接续结论

本问题的最终处理口径：

```text
不要继续尝试把剩余 77 个 SKIP 直接改 PASS。
当前没有可直接 promotion 的 skipped main-program row。
baseline 保持 82/82/77/0。
后续只有 audit drift 或 runtime proof drift 出现时，才允许重开 promotion 评估。
```

下一轮如果继续做当前实际工作，优先接：

```text
text37.txt 中列出的 real_simulation_page_smoke.html
review/statusbar/external-shell badge 重复断言收尾。
```

下一轮如果切回 promotion，优先接：

```text
L4-USER-M-PROCESS native opt-in runtime probe，
而不是重新复核 77 个 SKIP。
```
