项目接续文件：sim config coverage promotion 后续推进计划

生成时间：2026-06-18 CST

本文件接替 `text17.txt`，作为后续继续推进的接续文件。后续工作优先参考
`text18.txt`；除非明确要求审计旧记录，不再回到 `text1` 到 `text17` 扩展进度。

一、当前完成情况摘要

1. LinuxCNC-backed WASM 核心仍是 CNC 语义来源。

- G-code / interpreter / planner / kinematics / canonical motion 语义仍来自 vendored
  LinuxCNC C/C++ 源码；
- Browser / UI / SDK 只做 host boundary、文件装载、OPFS/session、virtual HAL runtime、
  仿真状态桥、测试胶水和报告；
- 不在 JS 中重写 G-code 解释器、planner、kinematics、tool/parameter 语义。

2. virtual HAL 已完全满足 Web 方式数控系统仿真系统。

当前 virtual HAL 已具备并通过 gate 验证：

- LinuxCNC realtime HAL simulation replacement；
- `halcmd` simulation replacement；
- motion controller simulation replacement；
- HAL pin/signal/param store；
- `setp`、`sets`、`net`、`show`、`getp`、`gets`、`loadrt`、`loadusr`、`addf`、
  `start`、`stop` command workflow；
- servo-period motion stepping；
- axis/joint position feedback；
- source compliance report；
- sim-config source coverage report；
- command script fixture report；
- manifest-backed motion controller matrix report；
- OPFS/session persistence；
- saved-session release diagnostics evidence；
- release readiness / batch acceptance artifact gate。

3. release gate 已接入 virtual HAL motion matrix。

已完成：

- `virtualHalMotionControllerMatrix`；
- `virtualHalMotionControllerMatrixReady`；
- release readiness artifact 强制校验 manifest-backed motion matrix；
- batch acceptance artifact checklist 从 `4/4` 扩展为 `5/5 passed`；
- saved-session diagnostics 负向 fixtures：
  - 缺失 saved-session diagnostics；
  - incomplete source compliance；
  - missing manifest-backed motion matrix。

4. sim config coverage promotion 已先形成分析文档。

新增分析文档：

```text
wasm-port/docs/sim-config-coverage-promotion-analysis.md
```

该文档已纳入：

```text
wasm-port/tests/docs/node/verify_sim_configs_coverage_docs.sh
```

当前结论：

- 当前 generated inventory 中没有“hard block 已清空但仍 SKIP 的 main program”；
- 因此不应因为 virtual HAL 完善就直接降低 `skipped=131`；
- 下一步应推进“case promotion”：把已有 Node `INV` 或代表覆盖案例推进到 browser
  diagnostics / release evidence；
- blocked runtime families 仍不能由 virtual HAL 或 JS glue 直接解锁。

二、当前 sim config inventory baseline

当前必须保持的 baseline：

```text
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
sim_configs_wasm_node_inventory_skip_ASSET_ONLY=65
sim_configs_wasm_node_inventory_skip_L4_PYTHON_REMAP=53
sim_configs_wasm_node_inventory_skip_L4_TOOL_DB=1
sim_configs_wasm_node_inventory_skip_L4_USER_M_PROCESS=1
sim_configs_wasm_node_inventory_skip_NON_MAIN_CLASS=10
sim_configs_wasm_node_inventory_skip_UPSTREAM_DEMO=1
```

后续任何改动，只要涉及 inventory baseline，必须明确说明：

- 哪些 row 从何种状态变更；
- 为什么 LinuxCNC source/runtime evidence 已满足；
- 为什么不是 JS/browser 自行补语义；
- 为什么没有破坏 blocked runtime promotion lock。

三、virtual HAL 完善后可以推进的范围

virtual HAL 现在可以支撑以下 Web 仿真 promotion 范围：

- HAL / HALUI / deterministic UI process declarations；
- virtual `halcmd` workflow；
- machine state；
- motion feedback；
- axis/joint feedback；
- diagnostics artifact；
- saved-session diagnostics artifact；
- release readiness / batch acceptance evidence。

virtual HAL 仍不能解锁：

- Linux kernel hard-realtime ABI；
- 外部硬件驱动 ABI；
- native HAL module ABI；
- Python UI process emulation；
- Python remap runtime；
- tool database process protocol；
- external user-M process execution；
- upstream-invalid demo code。

四、promotion 铁律

后续 sim config coverage promotion 必须满足：

1. LinuxCNC source/config evidence owns the behavior。
2. Native 或当前 Node inventory evidence 已经通过；或者 row 是 macro/load /
   remap_subroutine，且有明确非主程序验证计划。
3. 依赖仅限于 virtual HAL、HALUI、deterministic UI process declarations、machine
   files、tool tables、remap subroutine assets 或已由 LinuxCNC-backed runtime 覆盖的
   motion/kinematics evidence。
4. Browser evidence 必须能导出：
   - virtual HAL source compliance；
   - sim-config source coverage；
   - command script fixtures；
   - manifest-backed motion matrix；
   - diagnostics artifact；
   - 如涉及 session，必须导出 saved-session diagnostics。
5. row 不能属于：
   - `L4-PYTHON-REMAP`；
   - `L4-TOOL-DB`；
   - `L4-USER-M-PROCESS`；
   - `UPSTREAM-DEMO`；
   - standalone-main 执行语境下的 `ASSET-ONLY`。
6. `verify_no_standalone_cnc_semantics.sh` 必须保持通过。

五、继续推进计划

### 1. 建立 promotion candidate report

新增机器可读候选报告，先只覆盖可推进案例，不改变 inventory baseline。

首批候选：

- `qtdragon/qtdragon_multi_joint/on_abort.ngc`；
- `qtdragon/qtdragon_xyz/on_abort.ngc`；
- `qtdragon/qtdragon_xyz45/on_abort.ngc`；
- `qtdragon_hd/qtdragon_hd_xyz/on_abort.ngc`；
- `qtdragon_hd/qtdragon_hd_z_compensation/on_abort.ngc`；
- `qtvcp_screens/qtdragon/on_abort.ngc`；
- `axis/vismach/puma/puma_seam_weld.ngc`；
- `axis/rose_engine/rcone_demo.ngc`。

每行至少记录：

- candidate id；
- LinuxCNC source files；
- INI path；
- G-code path；
- current Node inventory status；
- current matrix browser status；
- dependency class；
- target browser evidence；
- required virtual HAL reports；
- blocked-family exclusion result。

建议 API / report 名称：

- `VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES`；
- `createVirtualHalSimConfigPromotionCandidateReport()`；
- report `apiName`：
  `linuxcnc-wasm-virtual-hal-sim-config-promotion-candidate-report`。

### 2. 增加 candidate report gate

新增 Node gate 断言：

- candidate report `complete === true`；
- candidate report `webSimulationSatisfied === true`；
- candidate 不包含：
  - `L4-PYTHON-REMAP`；
  - `L4-TOOL-DB`；
  - `L4-USER-M-PROCESS`；
  - `UPSTREAM-DEMO`；
  - standalone main promotion 下的 `ASSET-ONLY`；
- candidate 当前 Node status 必须为 `PASS` 或明确 non-main fixture candidate；
- inventory baseline 保持：
  - `executed=28`；
  - `passed=28`；
  - `skipped=131`；
  - `unexpected_fail=0`。

建议接入：

- `verify_sdk_surface.mjs`；
- `verify_sim_configs_coverage_docs.mjs`；
- 后续可接入 release readiness artifact，但第一批先作为 SDK/docs gate。

### 3. 推进第一个 browser evidence 案例

建议首选：

```text
qtdragon/qtdragon_multi_joint/on_abort.ngc
```

选择原因：

- 当前 Node `INV`；
- 无 hard runtime block；
- 依赖 HAL/UI declarations 与 multi-joint machine context；
- virtual HAL motion matrix 已映射 `qtdragon-on-abort`；
- source evidence 已包含：
  `linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini`；
- 可验证 virtual HAL 对 Web CNC 仿真系统的完整满足性。

目标 browser diagnostics evidence：

- candidate id 存在；
- source files 完整；
- current Node inventory status 为 `PASS`；
- browser evidence ready；
- virtual HAL source compliance complete；
- sim-config source coverage complete；
- command script fixtures complete；
- motion matrix manifest checked；
- diagnostics artifact 可被 release URL workflow 验证。

### 4. 扩展 release diagnostics validation

release browser diagnostics validation 后续新增 candidate evidence 校验：

- diagnostics artifact 包含 candidate promotion report；
- candidate row ready；
- candidate source files 完整；
- candidate 不属于 hard-block family；
- current Node status 为 `PASS`；
- browser evidence ready；
- virtual HAL reports complete；
- motion matrix manifest checked。

URL workflow 中显示：

- candidate promotion evidence；
- candidate browser diagnostics；
- missing candidate reason；
- next command / action plan。

### 5. 更新 coverage matrix 注释

只在 browser gate 通过后更新 matrix。

可更新方向：

- 将对应行从“browser delegated to `woodpecker`”改为 explicit browser diagnostics
  evidence；
- 不改变 blocked runtime family；
- 不降低 skip count；
- 不把 Node `INV` 误写成 browser `REP`，除非实际 browser smoke/gate 已覆盖该 row。

首批可能更新：

```text
qtdragon/qtdragon_multi_joint/on_abort.ngc
```

### 6. 推进 QtDragon family 全组

在第一个 QtDragon multi-joint candidate 通过后，继续推进：

- `qtdragon/qtdragon_xyz/on_abort.ngc`；
- `qtdragon/qtdragon_xyz45/on_abort.ngc`；
- `qtdragon_hd/qtdragon_hd_xyz/on_abort.ngc`；
- `qtdragon_hd/qtdragon_hd_z_compensation/on_abort.ngc`；
- `qtvcp_screens/qtdragon/on_abort.ngc`。

目标：

- 从 shared `woodpecker` representative delegation 变为 explicit browser diagnostics
  evidence；
- 每个 row 都有独立 source evidence；
- 每个 row 都保持 LinuxCNC-owned config/program evidence。

### 7. 推进 vismach / rose_engine 案例

后续候选：

- `axis/vismach/puma/puma_seam_weld.ngc`
  - 当前 Node `INV`；
  - 与 `puma_cube.ngc` 共用 PUMA machine context；
  - 目标是形成 PUMA 双案例 browser diagnostics evidence。
- `axis/rose_engine/rcone_demo.ngc`
  - 当前 Node `INV`；
  - HAL process only；
  - 适合作为非 Qt、非复杂 vismach remap 的轻量 browser diagnostics 案例。

### 8. 设计 macro/load 非主程序 promotion

不要把 macro/load 当 browser main program 执行。

候选只作为 non-main fixture evidence：

- `axis/external_offsets/queuebuster.ngc`；
- `axis/rose_engine/rcone.ngc`；
- `gscreen/silverdragon/macros/tool_sensor.ngc`；
- `gscreen/industrial_lathe_wear/toolchange.ngc`；
- `qtvcp_screens/industrial_lathe_wear/toolchange.ngc`。

需要新增独立报告，而不是复用 main-program promotion：

- `createVirtualHalSimConfigMacroLoadFixtureReport()`；
- 或将其作为 promotion candidate report 的 `nonMainFixture` 分类。

### 9. 保持 hard boundary lock

继续禁止以下 family promotion：

- `L4-PYTHON-REMAP`；
- `L4-TOOL-DB`；
- `L4-USER-M-PROCESS`；
- `UPSTREAM-DEMO`。

这些只能通过 LinuxCNC-owned runtime proof 解锁，不能由 virtual HAL、browser UI、
SDK glue 或 JS fixture 解锁。

六、建议下一批实际执行目标

下一批建议只做一个完整闭环：

1. 新增 promotion candidate report；
2. 新增 candidate report Node gate；
3. 将 `qtdragon/qtdragon_multi_joint/on_abort.ngc` 纳入 browser diagnostics evidence；
4. release diagnostics validation 增加 candidate evidence ready 校验；
5. docs / matrix 只做最小同步；
6. inventory baseline 不变。

七、建议验证命令

每批至少运行：

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

如涉及 release artifact / URL workflow，再运行：

```bash
wasm-port/tests/sdk/node/verify_project_release_artifact_url_workflow.sh
wasm-port/tests/host/verify_project_release_readiness_artifact.sh
wasm-port/tests/sdk/node/verify_project_batch_acceptance_artifact.sh
```

如涉及 ini-panel workflow overview，再运行：

```bash
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
```

八、后续记录规则

- 后续进度只追加到 `text18.txt`；
- 每批只追加一个新的中文编号或 `###` 标题记录；
- 提交前检查标题唯一性：

```bash
awk '/^[一二三四五六七八九十百]+、|^### / {print}' text18.txt | sort | uniq -d
```

- 不复制 `text17.txt` 的长历史；
- 不把局部重排、断言挪动、路径整理作为主目标；
- 每批必须产出至少一种可复用能力、可执行 gate、可验证 workflow 或明确 runtime
  boundary proof；
- 对外表述必须同时说明：
  - virtual HAL 已完全满足 Web 方式数控系统仿真系统；
  - 在仿真范围内，virtual HAL 已替代 LinuxCNC realtime HAL / halcmd /
    motion controller；
  - 它不是 Linux kernel hard-realtime ABI；
  - 它不替代外部硬件驱动 ABI、native HAL module ABI；
  - G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

### 一、2026-06-18 Virtual HAL Sim Config Promotion Candidate Report

按本文件推进 virtual HAL 已满足 Web 仿真后的 sim config coverage promotion。本批完成
“下一批实际执行目标”的第 1 到第 4 项：新增 source-derived promotion candidate report，
新增 Node/browser gate，并把 `qtdragon/qtdragon_multi_joint/on_abort.ngc` 纳入 browser
diagnostics / release validation evidence。inventory baseline 保持不变。

新增实质能力：

- 新增 `VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES`：
  - `qtdragon-multi-joint-on-abort`；
  - `qtdragon-xyz-on-abort`；
  - `qtdragon-xyz45-on-abort`；
  - `qtdragon-hd-xyz-on-abort`；
  - `qtdragon-hd-z-compensation-on-abort`；
  - `qtvcp-screens-qtdragon-on-abort`；
  - `puma-seam-weld`；
  - `rose-engine-rcone-demo`；
- 每个 candidate row 记录：
  - LinuxCNC INI source file；
  - LinuxCNC G-code source file；
  - current Node inventory status；
  - current matrix browser status；
  - dependency class；
  - target browser evidence；
  - required virtual HAL reports；
  - blocked-family exclusion；
- 新增 `createVirtualHalSimConfigPromotionCandidateReport()`：
  - 输出 `linuxcnc-wasm-virtual-hal-sim-config-promotion-candidate-report`；
  - 校验 source manifest；
  - 校验 candidate 不属于 `L4-PYTHON-REMAP` / `L4-TOOL-DB` /
    `L4-USER-M-PROCESS` / `UPSTREAM-DEMO`；
  - 校验 current Node inventory status 为 `PASS`；
  - 校验 required virtual HAL reports complete：
    source compliance、sim-config source coverage、command fixtures、
    manifest-backed motion matrix；
  - 显式输出 `inventoryBaselineUnchanged === true`；
- `createLinuxCncVirtualHalRuntime()` 新增：
  - `getSimConfigPromotionCandidateReport()`；
- SDK index、SDK README、browser simulation re-export 同步导出新常量和新 report API；
- real simulation page 新增：
  - `getVirtualHalSimConfigPromotionCandidateReport()`；
  - diagnostics artifact 字段 `virtualHalSimConfigPromotionCandidates`；
- release diagnostics validation 新增 candidate evidence 识别：
  - `hasPromotionCandidates`；
  - `promotionCandidatesReady`；
  - validation row：`sim-config-promotion-candidates`；
  - 如果 diagnostics artifact 携带 candidate report，则必须 complete；
  - 首批要求 `qtdragon-multi-joint-on-abort` candidate ready，且包含
    `qtdragon_xyyz.ini` 与 `on_abort.ngc` source evidence；
- release URL workflow fixtures、ini-panel workflow fixtures 同步携带 candidate evidence。

新增/扩展验证：

- `verify_sdk_surface.mjs` 覆盖：
  - 新常量导出；
  - 新 report API 导出；
  - SDK README 文档化；
  - candidate report complete；
  - `inventoryBaselineUnchanged === true`；
  - blocked candidate 为 0；
  - missing manifest files 为 0；
  - missing required virtual HAL reports 为 0；
  - `qtdragon-multi-joint-on-abort` row ready；
  - runtime wrapper 可读取 candidate report；
  - release browser diagnostics validation 识别 candidate evidence ready；
- `real_simulation_page_smoke.html` 覆盖：
  - browser API 暴露 `getVirtualHalSimConfigPromotionCandidateReport()`；
  - diagnostics artifact 内嵌 complete candidate report；
  - candidate report 包含 `qtdragon-multi-joint-on-abort`；
  - candidate row current Node status 为 `PASS`；
  - candidate row target browser evidence 为 `explicit-browser-diagnostics`；
- `verify_project_release_artifact_url_workflow.mjs` 覆盖：
  - diagnostics artifact 携带 candidate evidence；
  - URL workflow diagnostics validation `hasPromotionCandidates === true`；
  - URL workflow diagnostics validation `promotionCandidatesReady === true`；
- `verify_ini_panel_ui_shell.mjs` 覆盖：
  - ini-panel URL workflow diagnostics validation 识别 candidate evidence；
  - diagnostics validation candidate evidence ready；
- `ini_panel_workflow_overview_smoke.html` 使用带 candidate evidence 的 diagnostics fixture。

关键验证：

```text
sim_configs_coverage_docs_node_smoke=ok
project_release_artifact_url_workflow_node_smoke=ok
sdk_surface_node_smoke=ok
project_release_gate_manifest_node_smoke=ok
project_batch_acceptance_workflow_node_smoke=ok
project_batch_acceptance_artifact_node_smoke=ok
browser_real_simulation_page_smoke=ok
ini_panel_ui_shell_node_smoke=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_smoke=ok
browser_ini_workflow_overview_smoke=ok
browser_ini_shell_integration_workflow_smoke=ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- candidate report 只把已有 Node `PASS` / source-derived virtual HAL evidence 推进到
  browser diagnostics / release validation；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked，不能由 virtual HAL 或 JS glue 解锁；
- virtual HAL 仍不声称提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI 或
  native HAL module ABI；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作内容：

1. 将 `qtdragon/qtdragon_multi_joint/on_abort.ngc` 的 explicit browser diagnostics evidence
   同步到 coverage matrix 注释，把它从 delegated representative 记录为已具备 browser
   diagnostics evidence。
2. 推进 QtDragon family 其余 candidate：
   `qtdragon_xyz`、`qtdragon_xyz45`、`qtdragon_hd_xyz`、
   `qtdragon_hd_z_compensation`、`qtvcp_screens/qtdragon`。
3. 将 `axis/vismach/puma/puma_seam_weld.ngc` 与 `axis/rose_engine/rcone_demo.ngc`
   纳入 browser diagnostics candidate evidence，形成非 QtDragon 的 promotion 案例。

### 二、2026-06-18 QtDragon Family Browser Diagnostics Promotion

本批在上一轮 candidate report 基础上收口 QtDragon family 的机器可读 evidence，
把 promotion candidate 从“逐 row 断言”推进为 family-level browser diagnostics
summary，便于后续 release gate 和 URL workflow 直接判断整组是否 ready。

新增实质能力：

- `VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES` 中 8 个 Tier 1 candidate 的
  `currentMatrixBrowserStatus` 统一更新为 `explicit-browser-diagnostics`：
  - 6 个 QtDragon / QTVCP on-abort row；
  - `puma-seam-weld`；
  - `rose-engine-rcone-demo`；
- `createVirtualHalSimConfigPromotionCandidateReport()` 新增 `familyRows`：
  - 按 `simConfigTarget` 聚合；
  - 对无 `simConfigTarget` 的 row 使用自身 id 聚合；
  - 输出 `candidateIds`、`candidateCount`、`completeCount`、
    `explicitBrowserDiagnosticsCount`、`explicitBrowserDiagnosticsReady`、
    `sourceFiles`；
- QtDragon family 现在有机器可读 6/6 evidence：
  - `id === "qtdragon-on-abort"`；
  - `candidateCount === 6`；
  - `completeCount === 6`；
  - `explicitBrowserDiagnosticsCount === 6`；
  - `explicitBrowserDiagnosticsReady === true`；
- PUMA 与 rose_engine 也进入 family summary：
  - `vismach-remap-sims` 覆盖 `puma-seam-weld`；
  - `rose-engine-rcone-demo` 覆盖 rose engine main diagnostics candidate；
- release readiness fixture 重新生成，静态 JSON artifact 现在包含 `familyRows`；
- SDK smoke、browser real simulation smoke、release readiness artifact smoke 同步验证：
  - every candidate row `currentMatrixBrowserStatus === "explicit-browser-diagnostics"`；
  - QtDragon family 6/6 ready；
  - PUMA 与 rose_engine family explicit browser diagnostics ready。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- candidate report 仍只把已有 Node `PASS` / LinuxCNC source-derived virtual HAL
  evidence 推进到 browser diagnostics / release validation；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 为 `boundaryEvidence` 增加 freshness gate，记录 generated inventory artifact 的
   summary/hash，避免过期 TSV 继续作为 release evidence。
2. 将 positive non-main fixtures 的 declaration evidence 扩展到
   `axis/rose_engine/rcone.ngc`，显式证明它来自 `rose_engine.ini` 的 macro/load 声明。
3. 将 `familyRows` 接入 release URL / ini-panel workflow 的可视摘要，让使用者可以直接看到
   QtDragon、PUMA、rose_engine 三个 promotion family 的 ready 状态。

本批接续上一批 candidate report，完成 QtDragon family 全组 browser diagnostics evidence
推进，并保持 inventory baseline 不变。

新增实质能力：

- `VIRTUAL_HAL_SIM_CONFIG_SOURCE_TARGETS` 的 `qtdragon-on-abort` target 补齐：
  - `qtdragon/qtdragon_xyz45/qtdragon_xyza.ini`；
  - `qtdragon/qtdragon_xyz45/on_abort.ngc`；
  - `qtdragon_hd/qtdragon_hd_z_compensation/qtdragon_hd_z_compensation.ini`；
  - `qtdragon_hd/qtdragon_hd_z_compensation/on_abort.ngc`；
- release diagnostics validation 从只要求
  `qtdragon-multi-joint-on-abort` 扩展为要求 QtDragon family 6 个 candidate 全部
  ready：
  - `qtdragon-multi-joint-on-abort`；
  - `qtdragon-xyz-on-abort`；
  - `qtdragon-xyz45-on-abort`；
  - `qtdragon-hd-xyz-on-abort`；
  - `qtdragon-hd-z-compensation-on-abort`；
  - `qtvcp-screens-qtdragon-on-abort`；
- 每个 QtDragon candidate 必须满足：
  - `complete === true`；
  - `currentNodeInventoryStatus === "PASS"`；
  - `blockedKind === "-"`；
  - `targetBrowserEvidence === "explicit-browser-diagnostics"`；
  - source files 同时包含对应 LinuxCNC INI 与 G-code 文件；
- real browser simulation diagnostics artifact 同步要求 QtDragon family 全组 candidate
  evidence；
- coverage matrix 注释从“browser representative delegated to woodpecker”同步为
  virtual HAL promotion candidate gate 已导出 explicit browser diagnostics evidence；
- promotion analysis 文档新增本批 QtDragon family promotion evidence 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批只推进 source-derived diagnostics evidence，不新增
  G-code/interpreter/planner/kinematics/remap 语义；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI 或 native
  HAL module ABI；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 推进非 QtDragon browser diagnostics promotion：
   `axis/vismach/puma/puma_seam_weld.ngc` 与
   `axis/rose_engine/rcone_demo.ngc`。
2. 为 PUMA / rose engine 增加 release diagnostics validation 中的 required candidate
   gate，形成非 Qt、非 on-abort family 的 promotion proof。
3. 之后再设计 macro/load non-main fixture report，不把 macro/load 误作为 standalone
   browser main program 执行。

### 三、2026-06-18 Non-Qt Virtual HAL Promotion Evidence

本批接续 QtDragon family promotion，将非 QtDragon Tier 1 candidate 纳入 release
diagnostics required candidate gate，形成非 Qt、非 on-abort family 的 virtual HAL
browser diagnostics proof。

新增实质能力：

- release diagnostics validation 的 required promotion candidate gate 从 QtDragon 6 项扩展为
  Tier 1 全量 8 项：
  - QtDragon family 6 个 on-abort candidate；
  - `puma-seam-weld`；
  - `rose-engine-rcone-demo`；
- `puma-seam-weld` required evidence 必须包含：
  - `linuxcnc/configs/sim/axis/vismach/puma/puma.ini`；
  - `linuxcnc/configs/sim/axis/vismach/puma/puma_seam_weld.ngc`；
  - `linuxcnc/configs/sim/axis/vismach/puma/remap_subs/428remap.ngc`；
- `rose-engine-rcone-demo` required evidence 必须包含：
  - `linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini`；
  - `linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc`；
- SDK smoke 与 real browser simulation smoke 同步要求上述 8 个 candidate 全部 ready；
- coverage matrix 对 `puma_seam_weld.ngc` 与 `rcone_demo.ngc` 注释更新为 explicit
  browser diagnostics evidence；
- promotion analysis 文档新增 Non-Qt Promotion Evidence 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- PUMA / rose engine promotion 只推进 source-derived diagnostics evidence，不新增
  G-code/interpreter/planner/kinematics/remap 语义；
- PUMA remap subroutine 作为 LinuxCNC source evidence 引用，不把 ASSET-ONLY subroutine
  当 standalone browser main program 执行；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI 或 native
  HAL module ABI；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 设计 macro/load non-main fixture report，首选
   `axis/rose_engine/rcone.ngc` 与 `axis/external_offsets/queuebuster.ngc`。
2. gate 必须明确 `nonMainFixture === true`，避免把 macro/load 误作为 standalone browser
   main program 执行。
3. 将 macro/load fixture evidence 接入 release diagnostics validation，但不改变当前
   inventory baseline。

### 四、2026-06-18 Macro Load Non-Main Fixture Evidence

本批接续 Non-Qt promotion evidence，完成 macro/load non-main fixture report 首批闭环。

新增实质能力：

- 新增 `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES`；
- 新增 `createVirtualHalSimConfigMacroLoadFixtureReport()`：
  - 输出 `linuxcnc-wasm-virtual-hal-sim-config-macro-load-fixture-report`；
  - 显式输出 `inventoryBaselineUnchanged === true`；
  - 每个 row 必须 `nonMainFixture === true`；
  - 每个 row 的 `targetBrowserEvidence` 必须为
    `non-main-fixture-diagnostics`；
  - `standaloneMainViolations` 必须为空；
  - source manifest 只校验 LinuxCNC source evidence，不把 declared-only fixture path
    误当成 manifest 文件；
- 首批 fixture：
  - `rose-engine-rcone-macro-load`：
    - `fixturePath` 为
      `linuxcnc/configs/sim/axis/rose_engine/rcone.ngc`；
    - source evidence 包含 `rose_engine.ini`、`rcone.ngc`、`rcone_demo.ngc`；
    - 与 `rcone_demo.ngc` 配对作为 rose engine non-main macro/load evidence；
  - `external-offsets-queuebuster-macro-load`：
    - `fixturePath` 为
      `linuxcnc/configs/sim/axis/external_offsets/queuebuster.ngc`；
    - source evidence 包含 `eoffsets.ini` 与 `eoffsets.ngc`；
    - `declaredOnly === true`，通过 `eoffsets.ini` 的 `NGCGUI_SUBFILE` 声明保留
      fixture path，不声明它是 standalone browser main program；
- `createLinuxCncVirtualHalRuntime()` 新增：
  - `getSimConfigMacroLoadFixtureReport()`；
- SDK index、SDK README、browser simulation re-export 同步导出新常量和新 report API；
- real simulation diagnostics artifact 新增：
  - `virtualHalSimConfigMacroLoadFixtures`；
  - browser API `getVirtualHalSimConfigMacroLoadFixtureReport()`；
- OPFS/session virtual HAL payload 新增：
  - `simConfigPromotionCandidates`；
  - `simConfigMacroLoadFixtures`；
  - saved-session diagnostics nested artifact 同步携带两类 evidence；
- release diagnostics validation 新增 required evidence：
  - `hasMacroLoadFixtures`；
  - `macroLoadFixturesReady`；
  - validation row：`sim-config-macro-load-fixtures`；
  - 缺少 `virtualHalSimConfigMacroLoadFixtures` 时 release diagnostics validation 不再 ready；
- coverage matrix 对 `axis/rose_engine/rcone.ngc` 与
  `axis/external_offsets/queuebuster.ngc` 注释更新为 non-main fixture diagnostics evidence；
- promotion analysis 文档新增 Macro/Load Non-Main Fixture Evidence 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- macro/load fixture evidence 只证明 LinuxCNC-owned source/config declaration 与
  virtual HAL diagnostics readiness；
- `queuebuster.ngc` 只作为 `eoffsets.ini` 的 `NGCGUI_SUBFILE` declared-only fixture path
  记录，不作为 manifest-backed standalone file，也不作为 browser main program 执行；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI 或 native
  HAL module ABI；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 扩展 macro/load fixture report 到一个 UI-family non-main 案例，优先评估
   `gscreen/silverdragon/macros/tool_sensor.ngc`。
2. 推进前必须确认 owning machine files、UI process declaration 和 source evidence，
   不能把 Python UI process emulation 纳入 virtual HAL 范围。
3. 如 UI-family 边界不清晰，先增加 negative fixture gate：证明
   `L4-PYTHON-REMAP` / Python UI process 相关 macro/load 不会被 macro/load fixture
   report 误解锁。

### 五、2026-06-18 Macro Load Blocked Fixture Lock

本批按上一节建议先评估 `gscreen/silverdragon/macros/tool_sensor.ngc`。结论是不能直接
作为 positive macro/load fixture 推进：当前 generated boundary evidence 显示 owning
machine file `gscreen/silverdragon/silverdragon.ini` 在 vendored manifest 中不可用，且该
family 涉及 Python UI/process 边界风险。为避免 virtual HAL 误解锁 Python UI 或
Python remap family，本批新增 negative fixture gate。

新增实质能力：

- 新增 `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES`；
- `createVirtualHalSimConfigMacroLoadFixtureReport()` 新增：
  - `blockedRows`；
  - `blockedFixturePromotionViolations`；
  - summary row：`blocked-fixture-lock`；
- 首批 blocked fixture：
  - `silverdragon-tool-sensor-python-ui-boundary`：
    - `fixturePath` 为
      `linuxcnc/configs/sim/gscreen/silverdragon/macros/tool_sensor.ngc`；
    - `owningIniPath` 为
      `linuxcnc/configs/sim/gscreen/silverdragon/silverdragon.ini`；
    - `blockedKind` 为 `PYTHON-UI-PROCESS`；
    - 必须 `excludedFromPositiveFixtures === true`；
  - `gmoccapy-on-abort-python-remap-boundary`：
    - `fixturePath` 为
      `linuxcnc/configs/sim/gmoccapy/macros/on_abort.ngc`；
    - `owningIniPath` 为 `linuxcnc/configs/sim/gmoccapy/6_axis.ini`；
    - `blockedKind` 为 `L4-PYTHON-REMAP`；
    - 必须 `excludedFromPositiveFixtures === true`；
- release diagnostics validation 新增 required negative evidence：
  - `blockedFixturePromotionViolations.length === 0`；
  - SilverDragon `tool_sensor.ngc` 与 gmoccapy `on_abort.ngc` 必须存在于
    `blockedRows`；
  - 两者不能出现在 positive macro/load fixture rows；
- real simulation smoke 与 SDK smoke 同步验证 blocked fixture lock；
- coverage matrix 对 `gscreen/silverdragon/macros/tool_sensor.ngc` 注释更新为 blocked
  negative fixture；
- promotion analysis 文档新增 Macro/Load Blocked Fixture Lock 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- 本批没有把 SilverDragon、gmoccapy 或任何 Python UI / Python remap family 作为
  virtual HAL positive fixture 推进；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation 或 Python remap runtime；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 为 macro/load fixture report 增加 UI-family candidate audit，将
   `gscreen/industrial_lathe_wear/toolchange.ngc` 与
   `qtvcp_screens/industrial_lathe_wear/toolchange.ngc` 先作为 audit rows 评估。
2. 只有 owning INI、machine files、tool table、UI/process declaration 都有
   LinuxCNC source evidence，且不需要 Python UI process emulation 时，才允许转为
   positive non-main fixture。
3. 如证据仍不完整，继续扩展 blocked fixture lock，不降低 inventory baseline。

### 六、2026-06-18 UI-Family Macro Load Candidate Audit

本批接续上一节建议，把 UI-family macro/load 候选先纳入机器可读 audit rows，而不是
positive fixture promotion。结论是这批仍不能由 virtual HAL 直接解锁。

新增实质能力：

- 新增 `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_AUDIT_CANDIDATES`；
- `createVirtualHalSimConfigMacroLoadFixtureReport()` 新增：
  - `auditRows`；
  - `auditPromotionViolations`；
  - summary row：`ui-family-audit`；
- 首批 audit candidate：
  - `gscreen-industrial-lathe-wear-toolchange-audit`：
    - `fixturePath` 为
      `linuxcnc/configs/sim/gscreen/industrial_lathe_wear/toolchange.ngc`；
    - `owningIniPath` 为
      `linuxcnc/configs/sim/gscreen/industrial_lathe_wear/industrial_lathe_wear.ini`；
    - `auditStatus` 为 `blocked-missing-owning-ini`；
    - `promotionAllowed === false`；
    - 必须 `excludedFromPositiveFixtures === true`；
  - `qtvcp-industrial-lathe-wear-toolchange-audit`：
    - `fixturePath` 为
      `linuxcnc/configs/sim/qtvcp_screens/industrial_lathe_wear/toolchange.ngc`；
    - `owningIniPath` 为
      `linuxcnc/configs/sim/qtvcp_screens/industrial_lathe_wear/industrial_lathe_wear.ini`；
    - `auditStatus` 为 `blocked-missing-owning-ini`；
    - `promotionAllowed === false`；
    - 必须 `excludedFromPositiveFixtures === true`；
- release diagnostics validation 新增 required audit evidence：
  - `auditPromotionViolations.length === 0`；
  - 两个 industrial lathe wear `toolchange.ngc` audit rows 必须存在；
  - 两者不能出现在 positive macro/load fixture rows；
- SDK index、browser simulation re-export 同步导出 audit candidate 常量；
- SDK smoke 与 real browser simulation smoke 同步验证 audit rows；
- SDK README 与 promotion analysis 文档同步说明 UI-family audit gate。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- industrial lathe wear `toolchange.ngc` 只作为 audit negative evidence，不作为
  standalone browser main program，也不作为 positive macro/load fixture；
- 只有 owning INI、machine files、tool table、UI/process declaration 都有 LinuxCNC
  source evidence，且不需要 Python UI process emulation 时，才允许后续 positive
  promotion；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation 或 Python remap runtime；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 UI-family audit 与 generated boundary inventory 对齐，补一份 machine-readable
   “owning INI missing / UI process boundary”来源说明，避免 audit row 靠手工判断。
2. 继续增加 release diagnostics negative fixtures：缺失 `auditRows`、audit row 被误放入
   positive fixtures、`promotionAllowed === true` 但证据不足时必须 fail。
3. 暂不降低 inventory baseline；后续 promotion 只从已有 Node `PASS` 且无 blocked
   runtime family 的 main program 或明确 non-main fixture 中推进。

### 七、2026-06-18 UI-Family Audit Boundary Evidence Gate

本批接续上一节建议，把 UI-family macro/load audit rows 与 generated boundary inventory
对齐，补齐机器可读来源说明，并增加 release diagnostics 负向 gate。

新增实质能力：

- `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_AUDIT_CANDIDATES` 的两个 industrial lathe
  `toolchange.ngc` audit rows 新增 `boundaryEvidence`：
  - source artifacts：
    - `wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv`；
    - `wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv`；
  - `boundarySummary` 必须记录：
    - 对应 `fixturePath`；
    - 对应 `owningIniPath`；
    - `recommendedBlocked === "UNAVAILABLE"`；
    - `dependencies` 包含 `missing_vendored_ini:`；
  - `iniBoundarySummary` 必须记录：
    - 对应 `owningIniPath`；
    - `vendored === 0`；
    - `reportAvailable === 0`；
    - `recommendedBlocked === "UNAVAILABLE"`；
    - `dependencies` 包含 `missing_vendored_ini:`；
- `createVirtualHalSimConfigMacroLoadFixtureReport()` 新增：
  - `missingAuditRows`；
  - `auditBoundaryEvidenceViolations`；
  - `auditPromotionAllowedViolations`；
  - audit row 字段 `boundaryEvidenceReady`；
- report `complete` 现在要求：
  - audit rows 存在；
  - audit rows 未进入 positive fixture；
  - generated boundary evidence ready；
  - `promotionAllowed === true` 不能在证据不足时出现；
- release diagnostics validation 同步要求：
  - `missingAuditRows.length === 0`；
  - `auditBoundaryEvidenceViolations.length === 0`；
  - `auditPromotionAllowedViolations.length === 0`；
  - audit rows 的 boundary evidence 必须与 generated inventory 缺失 owning INI 证据一致；
- SDK smoke 新增负向 fixtures：
  - 缺失 generated boundary evidence 必须 fail；
  - audit candidate 被误放入 positive fixtures 必须 fail；
  - `promotionAllowed === true` 但证据不足必须 fail；
  - browser diagnostics artifact 缺失 audit rows / boundary evidence violations /
    promotionAllowed violations 必须 fail；
- real browser simulation smoke 与 release readiness artifact smoke 同步验证 audit row
  的 boundary evidence；
- promotion analysis 文档新增 UI-Family Audit Boundary Evidence 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- industrial lathe wear `toolchange.ngc` 仍只是 audit negative evidence，不是
  positive fixture，不是 browser main program；
- generated boundary evidence 只证明 owning INI 在当前 vendored inventory 中缺失，
  不把 virtual HAL 扩展为 Python UI process emulation；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation 或 Python remap runtime；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 把 SilverDragon blocked fixture 也接入同样的 generated boundary evidence 字段，
   让 `tool_sensor.ngc` 的 blocked lock 不再只依赖手工 reason。
2. 为 `boundaryEvidence` 增加 manifest/source artifact freshness gate，避免使用过期的
   `build/wasm/sim-configs-inventory/*.tsv` 证据。
3. 继续保持 inventory baseline 不变；后续只推进已具备 LinuxCNC source/runtime
   evidence 的 non-main fixture 或 main program diagnostics evidence。

### 八、2026-06-18 SilverDragon Blocked Boundary Evidence Gate

本批接续上一节建议，把 SilverDragon blocked fixture 接入 generated boundary evidence，
让 `tool_sensor.ngc` 的 blocked lock 不再只依赖手工 reason。

新增实质能力：

- `VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES` 新增 `boundaryEvidence`：
  - `silverdragon-tool-sensor-python-ui-boundary`：
    - `fixturePath` 为
      `linuxcnc/configs/sim/gscreen/silverdragon/macros/tool_sensor.ngc`；
    - `owningIniPath` 为 `linuxcnc/configs/sim/gscreen/silverdragon/silverdragon.ini`；
    - generated boundary evidence 来自：
      - `wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv`；
      - `wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv`；
    - evidence 必须证明 `recommendedBlocked === "UNAVAILABLE"` 且 dependencies
      包含 `missing_vendored_ini:configs/sim/gscreen/silverdragon/silverdragon.ini`；
  - `gmoccapy-on-abort-python-remap-boundary` 同步补齐 generated boundary evidence；
- 新增 helper `isGeneratedBoundaryEvidenceReady()`，blocked rows 与 audit rows 复用同一
  generated boundary evidence 校验；
- `createVirtualHalSimConfigMacroLoadFixtureReport()` 新增：
  - blocked row 字段 `boundaryEvidence`；
  - blocked row 字段 `boundaryEvidenceReady`；
  - `blockedBoundaryEvidenceViolations`；
- report `complete` 现在要求 blocked fixture 也具备 generated boundary evidence；
- release diagnostics validation 同步要求：
  - `blockedBoundaryEvidenceViolations.length === 0`；
  - blockedRows 的 boundary evidence 必须证明 owning INI missing；
- SDK smoke 新增负向 fixture：
  - blocked row 缺失 generated boundary evidence 必须 fail；
- real browser simulation smoke 与 release readiness artifact smoke 同步验证 blocked row
  boundary evidence；
- promotion analysis 文档新增 SilverDragon Blocked Boundary Evidence 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- SilverDragon `tool_sensor.ngc` 仍是 blocked negative fixture，不是 positive
  macro/load fixture，不是 browser main program；
- generated boundary evidence 只证明 owning INI 在当前 vendored inventory 中缺失，
  不把 virtual HAL 扩展为 Python UI process emulation；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation 或 Python remap runtime；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 为 `boundaryEvidence` 增加 freshness gate，记录 generated inventory artifact 的
   baseline summary 或 timestamp/hash，避免使用过期 TSV。
2. 将 `axis/external_offsets/queuebuster.ngc` 的 declared-only fixture 也补充
   declaration-level evidence，显式指向 `eoffsets.ini` 的 `NGCGUI_SUBFILE`。
3. 继续保持 inventory baseline 不变，只推进 evidence/report/gate 层面的 Web
   simulation readiness。

### 九、2026-06-18 Queuebuster Declaration Evidence Gate

本批接续上一节建议，把 `axis/external_offsets/queuebuster.ngc` 的 declared-only
non-main fixture 补充 declaration-level evidence，显式证明它来自 LinuxCNC
`eoffsets.ini` 的 `NGCGUI_SUBFILE` 声明。

新增实质能力：

- `external-offsets-queuebuster-macro-load` 新增 `declarationEvidence`：
  - `sourceFile`：
    `linuxcnc/configs/sim/axis/external_offsets/eoffsets.ini`；
  - `section`：`DISPLAY`；
  - `key`：`NGCGUI_SUBFILE`；
  - `value`：`queuebuster.ngc`；
  - `line`：`40`；
  - `sourceLine`：`NGCGUI_SUBFILE = queuebuster.ngc`；
- `createVirtualHalSimConfigMacroLoadFixtureReport()` 新增：
  - row 字段 `declarationEvidence`；
  - row 字段 `declarationEvidenceReady`；
  - `declarationEvidenceViolations`；
- declared-only fixture 的 `complete` 现在要求 declaration evidence ready；
- release diagnostics validation 同步要求：
  - `declarationEvidenceViolations.length === 0`；
  - `external-offsets-queuebuster-macro-load` 必须携带 `NGCGUI_SUBFILE =
    queuebuster.ngc` evidence；
- SDK smoke 新增负向 fixture：
  - queuebuster declared-only fixture 缺失 declaration evidence 必须 fail；
- real browser simulation smoke 与 release readiness artifact smoke 同步验证
  queuebuster declaration evidence；
- promotion analysis 文档新增 Queuebuster Declaration Evidence 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- `queuebuster.ngc` 仍是 declared-only non-main fixture，不是 browser main program；
- declaration evidence 只证明 LinuxCNC INI source 声明，不把 virtual HAL 扩展为
  Python remap runtime 或 external user-M process execution；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation 或 Python remap runtime；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 为 `boundaryEvidence` 增加 freshness gate，记录 generated inventory artifact 的
   summary/hash，避免过期 TSV 继续作为 release evidence。
2. 将 positive non-main fixtures 的 declaration evidence 扩展到
   `axis/rose_engine/rcone.ngc`，显式证明它来自 `rose_engine.ini` 的 macro/load 声明。
3. 继续保持 inventory baseline 不变，只推进 source-derived evidence/report/gate。

### 十、2026-06-18 Rose Engine Declaration Evidence Gate

本批接续上一节建议，把 positive non-main fixture
`axis/rose_engine/rcone.ngc` 也补充 declaration-level evidence，显式证明它来自
LinuxCNC `rose_engine.ini` 的 `NGCGUI_SUBFILE` 声明。

新增实质能力：

- `rose-engine-rcone-macro-load` 新增 `declarationEvidence`：
  - `sourceFile`：`linuxcnc/configs/sim/axis/rose_engine/rose_engine.ini`；
  - `section`：`DISPLAY`；
  - `key`：`NGCGUI_SUBFILE`；
  - `value`：`rcone.ngc`；
  - `line`：`34`；
  - `sourceLine`：`NGCGUI_SUBFILE = rcone.ngc`；
- `createVirtualHalSimConfigMacroLoadFixtureReport()` 的 declaration gate 从
  `declaredOnly === true` 扩展为所有声明了 `declarationSource` 的 positive fixture；
- positive non-main fixture row 新增 `requiresDeclarationEvidence`；
- release diagnostics validation 同步要求 `rose-engine-rcone-macro-load` 携带
  `rose_engine.ini` 第 34 行 declaration evidence；
- SDK smoke 新增负向 fixture：
  - `rose-engine-rcone-macro-load` 缺失 declaration evidence 必须 fail；
- real browser simulation smoke 与 release readiness artifact smoke 同步验证 rcone 与
  queuebuster 两个 positive non-main fixture 的 declaration evidence；
- promotion analysis 文档新增 Rose Engine Declaration Evidence 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpected_fail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- `rcone.ngc` 仍是 LinuxCNC INI 声明的 non-main macro/load support asset，不是
  browser main program；
- declaration evidence 只证明 LinuxCNC INI source 声明，不把 virtual HAL 扩展为
  Python remap runtime、tool DB process protocol 或 external user-M process execution；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation 或 Python remap runtime；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 为 `boundaryEvidence` 增加 freshness gate，记录 generated inventory artifact 的
   summary/hash，避免过期 TSV 继续作为 release evidence。
2. 将 `familyRows` 接入 release URL / ini-panel workflow 的可视摘要，让使用者可以直接看到
   QtDragon、PUMA、rose_engine 三个 promotion family 的 ready 状态。
3. 继续保持 inventory baseline 不变，只推进 source-derived evidence/report/gate。

### 十一、2026-06-18 Boundary Evidence Freshness Gate

本批接续上一节建议，为 blocked/audit macro-load `boundaryEvidence` 增加 freshness
gate，避免过期 generated inventory TSV 继续作为 release evidence。

新增实质能力：

- 新增 `VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE`：
  - `executed: 28`；
  - `passed: 28`；
  - `skipped: 131`；
  - `unexpectedFail: 0`；
- SDK index 与 README 同步导出/记录该 baseline 常量；
- blocked fixtures 与 audit candidates 的 `boundaryEvidence` 新增 `baselineSummary`；
- `isGeneratedBoundaryEvidenceReady()` 现在要求：
  - `sourceArtifacts` 包含 `boundary-summary.tsv` 与 `ini-boundary-summary.tsv`；
  - `baselineSummary` 与当前 inventory baseline 完全一致；
  - `boundarySummary` 与 `iniBoundarySummary` 仍证明 owning INI missing；
- release diagnostics validation 新增 baseline freshness 校验：
  - blocked rows 必须携带 fresh `baselineSummary`；
  - audit rows 必须携带 fresh `baselineSummary`；
- SDK smoke 新增负向 fixture：
  - blocked boundary evidence 的 `skipped` 伪造为 `130` 时必须 fail；
- real browser simulation smoke 与 release readiness artifact smoke 同步验证
  `baselineSummary`；
- release readiness fixture 重新生成，静态 JSON artifact 现在携带 fresh baseline
  evidence；
- promotion analysis 文档新增 Boundary Evidence Freshness Gate 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- freshness gate 只约束 generated boundary evidence 与当前 inventory artifact
  baseline 对齐；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 `familyRows` 接入 release URL / ini-panel workflow 的可视摘要，让使用者可以直接看到
   QtDragon、PUMA、rose_engine 三个 promotion family 的 ready 状态。
2. 为 freshness gate 增加 artifact hash 字段，进一步证明 `boundary-summary.tsv` 与
   `ini-boundary-summary.tsv` 不是旧文件。
3. 继续保持 inventory baseline 不变，只推进 source-derived evidence/report/gate。

### 十二、2026-06-18 Promotion Family URL Workflow Summary

本批接续上一节建议，把 `familyRows` 接入 release URL / ini-panel workflow 的可视摘要，
让使用者可以直接看到 QtDragon、PUMA、rose_engine 三个 promotion family 的 ready 状态。

新增实质能力：

- 新增 helper `createPromotionFamilySummaryText()`：
  - 从 promotion candidate report 的 `familyRows` 生成摘要；
  - 当前 ready artifact 输出：
    `qtdragon-on-abort: 6/6 ready; vismach-remap-sims: 1/1 ready; rose-engine-rcone-demo: 1/1 ready`；
- `createProjectReleaseReadinessReport()` 新增：
  - `virtualHalPromotionFamilySummary`；
  - rows 中新增 `virtual-hal-promotion-families`；
- `createProjectReleaseReadinessArtifactValidation()` 新增：
  - `virtualHalPromotionFamilySummary`；
  - validation rows 中新增 `virtual-hal-promotion-families`；
- `createProjectReleaseReadinessArtifactValidationSummaryViewModel()` 显示 promotion
  family summary；
- `createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel()` 显示 promotion
  family summary；
- ini-panel workflow overview URL summary 同步显示 promotion family summary；
- ini-panel 测试 fixture 补齐 release artifact 内的 promotion candidate report 和
  macro/load fixture report，避免 URL workflow 只显示局部 release evidence；
- release readiness fixture 重新生成，静态 JSON artifact 现在携带
  `virtualHalPromotionFamilySummary`；
- SDK smoke、release artifact URL workflow smoke、project release gate manifest smoke、
  ini-panel UI shell smoke 同步验证可视摘要；
- promotion analysis 文档新增 Promotion Family URL Workflow Summary 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- 本批只把已有 source-derived candidate family evidence 暴露到 release URL /
  ini-panel workflow summary；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 为 freshness gate 增加 artifact hash 字段，进一步证明 `boundary-summary.tsv` 与
   `ini-boundary-summary.tsv` 不是旧文件。
2. 将 promotion family summary 扩展为结构化 rows，分别展示 QtDragon、PUMA、
   rose_engine 的 source file count 与 diagnostics ready 状态。
3. 继续保持 inventory baseline 不变，只推进 source-derived evidence/report/gate。

### 十三、2026-06-18 Structured Promotion Family Rows

本批接续上一节建议，把 promotion family summary 扩展为结构化 rows，分别展示
QtDragon、PUMA、rose_engine 的 source file count 与 diagnostics ready 状态。

新增实质能力：

- 新增 helper `createPromotionFamilySummaryRows()`：
  - 从 promotion candidate report 的 `familyRows` 生成结构化摘要；
  - 每行包含 `id`、`candidateCount`、`completeCount`、`sourceFileCount`、
    `explicitBrowserDiagnosticsReady`、`ready`、`value`；
- `createProjectReleaseReadinessReport()` 新增：
  - `virtualHalPromotionFamilyRows`；
  - rows 中新增每个 family 的结构化展示行；
- `createProjectReleaseReadinessArtifactValidation()` 新增：
  - `virtualHalPromotionFamilyRows`；
  - validation rows 中新增每个 family 的结构化展示行；
- `createProjectReleaseReadinessArtifactValidationSummaryViewModel()` 显示结构化
  promotion family rows；
- `createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel()` 显示结构化
  promotion family rows；
- ini-panel workflow overview URL summary 同步显示结构化 promotion family rows；
- 当前结构化输出：
  - `qtdragon-on-abort: 6/6 ready; sources=12; diagnostics=ready`；
  - `vismach-remap-sims: 1/1 ready; sources=3; diagnostics=ready`；
  - `rose-engine-rcone-demo: 1/1 ready; sources=2; diagnostics=ready`；
- release readiness fixture 重新生成，静态 JSON artifact 现在携带
  `virtualHalPromotionFamilyRows`；
- SDK smoke、release artifact URL workflow smoke、project release gate manifest smoke、
  ini-panel UI shell smoke、release readiness artifact smoke 同步验证结构化 rows；
- promotion analysis 文档新增 Structured Promotion Family Rows 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- 本批只把已有 source-derived candidate family evidence 进一步结构化；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 为 freshness gate 增加 artifact hash 字段，进一步证明 `boundary-summary.tsv` 与
   `ini-boundary-summary.tsv` 不是旧文件。
2. 将 structured promotion family rows 接入浏览器页面 DOM 渲染层，形成可见 UI 行而不仅是
   view-model row。
3. 继续保持 inventory baseline 不变，只推进 source-derived evidence/report/gate。

### 十四、2026-06-18 Boundary Evidence Artifact Hash Gate

本批接续上一节建议，为 freshness gate 增加 artifact hash 字段，进一步证明
`boundary-summary.tsv` 与 `ini-boundary-summary.tsv` 不是旧文件或替代文件。

新增实质能力：

- 新增 `VIRTUAL_HAL_SIM_CONFIG_INVENTORY_ARTIFACT_HASHES`：
  - `boundary-summary.tsv`：
    `de6cf57b7c07182e3bcb32e22dbdf202b618cabc14620d6dff1ef815587950b9`；
  - `ini-boundary-summary.tsv`：
    `b0afe27224e97a82fbecbbd75a7c86233c98fe957d9c1ba20f0656f8745a5eae`；
- SDK index 与 README 同步导出/记录该 hash 常量；
- blocked fixtures 与 audit candidates 的 `boundaryEvidence` 新增 `sourceArtifactHashes`；
- `isGeneratedBoundaryEvidenceReady()` 现在要求：
  - artifact path 存在；
  - `baselineSummary` 与 inventory baseline 一致；
  - `sourceArtifactHashes` 与当前两个 generated TSV 的 SHA-256 一致；
  - `boundarySummary` 与 `iniBoundarySummary` 仍证明 owning INI missing；
- release diagnostics validation 同步检查 artifact hash freshness；
- SDK smoke 新增负向 fixture：
  - blocked boundary evidence 的 `boundary-summary.tsv` hash 伪造为 `stale` 时必须 fail；
- real browser simulation smoke 与 release readiness artifact smoke 同步验证 hash；
- release readiness fixture 重新生成，静态 JSON artifact 现在携带 source artifact hash
  evidence；
- promotion analysis 文档新增 Boundary Evidence Artifact Hash Gate 小节。

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- hash gate 只约束 generated boundary evidence 的来源与当前 build artifact 一致；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 structured promotion family rows 接入浏览器页面 DOM 渲染层，形成可见 UI 行而不仅是
   view-model row。
2. 为 artifact hash gate 增加自动生成脚本，避免 generated TSV 变更后手工更新 hash。
3. 继续保持 inventory baseline 不变，只推进 source-derived evidence/report/gate。

### 十五、2026-06-18 Browser Promotion Family DOM Rows

本批接续上一节建议，将 structured promotion family rows 接入 real simulation 浏览器页面
DOM 渲染层，形成可见 diagnostics UI 行，而不仅停留在 view-model / report 数据。

新增实质能力：

- real simulation diagnostics panel 新增 `data-promotion-family-rows` DOM 容器；
- 新增 `renderPromotionFamilyRows()`：
  - 从 `createVirtualHalSimConfigPromotionCandidateReport().familyRows` 渲染可见行；
  - 写入 `document.body.dataset.promotionFamilyReady`；
  - 写入 `document.body.dataset.promotionFamilyCount`；
  - 每行暴露 `data-promotion-family-row`、`data-promotion-family-ready` 与
    `data-promotion-family-value`；
- browser API 新增：
  - `getVirtualHalPromotionFamilyRows()`；
- 当前浏览器可见行：
  - `qtdragon-on-abort: 6/6 ready; sources=12`；
  - `vismach-remap-sims: 1/1 ready; sources=3`；
  - `rose-engine-rcone-demo: 1/1 ready; sources=2`；
- real browser simulation smoke 新增断言：
  - API 暴露 `getVirtualHalPromotionFamilyRows()`；
  - `promotionFamilyReady === "true"`；
  - `promotionFamilyCount === "3"`；
  - QtDragon、PUMA、rose_engine 三个 DOM row 均 ready；
  - DOM 文本与 promotion candidate report 的结构化 family evidence 对齐；
- promotion analysis 文档新增 Browser Promotion Family DOM Rows 小节。

关键验证：

```text
git diff --check ok
sdk_surface_node_smoke=ok
project_release_gate_manifest_node_smoke=ok
project_release_artifact_url_workflow_node_smoke=ok
project_batch_acceptance_workflow_node_smoke=ok
project_batch_acceptance_artifact_node_smoke=ok
browser_real_simulation_page_smoke=ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- 本批只把已有 source-derived candidate family evidence 渲染为浏览器可见 diagnostics
  UI 行；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 为 artifact hash gate 增加自动生成脚本，避免 generated TSV 变更后手工更新 hash。
2. 将 promotion family DOM rows 扩展到 ini-panel workflow overview 的实际挂载 DOM，
   让 release URL workflow 和 real simulation 页面具备一致可见证据。
3. 继续保持 inventory baseline 不变，只推进 source-derived evidence/report/gate。

### 十六、2026-06-18 Fast Follow: Hash Tool And INI Panel Promotion DOM

按“减少测试、快速大幅度推进”的要求，本批只跑少量贴近改动的 gate，同时完成两个高杠杆
交付：artifact hash 自动更新工具，以及 ini-panel workflow overview 的 promotion family
可见 DOM 挂载能力。

新增实质能力：

- 新增 hash 工具：
  - `wasm-port/tools/update_sim_config_boundary_hashes.mjs`；
  - `wasm-port/tools/update_sim_config_boundary_hashes.sh`；
- hash 工具能力：
  - 读取 `boundary-summary.tsv` 与 `ini-boundary-summary.tsv`；
  - 计算 SHA-256；
  - `--check` 校验 SDK / release validation 中的 hash 常量是否同步；
  - `--write` 自动更新 hash 常量；
  - 避免 generated TSV 变更后手工改 hash；
- ini-panel workflow overview 新增 promotion family rows DOM 能力：
  - `createIniPanelShellWorkflowOverviewPromotionFamilyRowsRenderState()`；
  - `createIniPanelShellWorkflowOverviewPromotionFamilyRowsDomContract()`；
  - `createIniPanelShellWorkflowOverviewPromotionFamilyRowsDomReadiness()`；
  - `renderIniPanelShellWorkflowOverviewPromotionFamilyRowsState()`；
  - `mountIniPanelShellWorkflowOverviewPromotionFamilyRowsState()`；
- SDK index 同步导出上述 ini-panel promotion family DOM API；
- `createIniPanelShellViewModel()` 的 workflow overview API 同步暴露 create/render/mount
  方法；
- workflow overview contract 纳入对应 `getWorkflowOverviewPromotionFamilyRows*` 方法；
- UI shell smoke 覆盖：
  - 从 release URL workflow summary 生成 promotion family rows render state；
  - 三行 ready：
    - `virtual-hal-promotion-family-qtdragon-on-abort`；
    - `virtual-hal-promotion-family-vismach-remap-sims`；
    - `virtual-hal-promotion-family-rose-engine-rcone-demo`；
  - DOM-like mount rowCount 为 3；
  - render/mount result 均 ready；
- promotion analysis 文档新增 Fast Follow: Hash Tool And INI Panel Promotion DOM 小节。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tools/update_sim_config_boundary_hashes.sh --check ok
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- hash 工具只维护 generated boundary artifact 的 evidence hash；
- ini-panel DOM 只展示已有 source-derived promotion family evidence；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。
2. 将 ini-panel promotion family DOM rows 接入 browser workflow overview smoke，验证真实浏览器
   页面也能看到三条 family row。
3. 继续推进下一个 source-derived evidence：为 promotion family rows 增加 per-family source
   file drilldown DOM。

### 十七、2026-06-18 Promotion Family Source Drilldown DOM

继续按“减少测试、快速大幅度推进功能实现”推进，本批实现 promotion family 的 source file
drilldown：ini-panel 不再只显示 family ready 状态和 source file count，而是能把每个 family
对应的 LinuxCNC source evidence 展开为 DOM 行。

新增实质能力：

- `createPromotionFamilySummaryRows()` 输出新增：
  - `sourceFiles`；
- release readiness report / validation summary / URL workflow summary 保留 promotion family
  source file metadata；
- `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()` 新增：
  - `promotionFamilyRows` 结构字段；
- `createIniPanelShellWorkflowOverviewPromotionFamilyRowsRenderState()` 新增：
  - `sourceRows`；
  - `sourceFileCount`；
- `renderIniPanelShellWorkflowOverviewPromotionFamilyRowsState()` 现在渲染：
  - 3 条 promotion family row；
  - 17 条 per-family source file drilldown row；
  - 每条 source row 携带 `workflowOverviewPromotionFamilyFamily` dataset，指向所属 family；
- 当前 source drilldown：
  - `qtdragon-on-abort`：12 个 source files；
  - `vismach-remap-sims`：3 个 source files；
  - `rose-engine-rcone-demo`：2 个 source files；
- UI shell smoke 新增关键 source evidence 断言：
  - `qtdragon_multi_joint/qtdragon_xyyz.ini`；
  - `axis/vismach/puma/remap_subs/428remap.ngc`；
  - `axis/rose_engine/rcone_demo.ngc`；
- promotion analysis 文档新增 Promotion Family Source Drilldown 小节。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- source drilldown 只展示已有 source-derived promotion family evidence；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 ini-panel promotion family source drilldown 接入 browser workflow overview smoke，确认真实
   DOM 中可见 3 个 family 与 17 个 source rows。
2. 给 source drilldown 增加 per-source status 字段，区分 INI、G-code、remap subroutine 与
   manifest-backed source。
3. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。

### 十八、2026-06-18 Promotion Family Source Status

继续减少测试并快速推进功能。本批在上一批 source drilldown 基础上增加 per-source status，
让 ini-panel workflow overview 能区分每条 source evidence 的类型与 manifest-backed 状态。

新增实质能力：

- 新增 source 分类 helper：
  - `.ini` 标记为 `ini`；
  - `.ngc` 标记为 `gcode`；
  - `remap_subs` / `nc_subroutines` 下的 source 标记为 `remap-subroutine`；
  - 其他 source 标记为 `source`；
- promotion family source drilldown row 新增：
  - `sourceKind`；
  - `manifestBacked`；
  - `status: "manifest-backed"`；
- DOM dataset 新增：
  - `workflowOverviewPromotionFamilySourceKind`；
  - `workflowOverviewPromotionFamilyManifestBacked`；
  - `workflowOverviewPromotionFamilySourceStatus`；
- UI shell smoke 覆盖：
  - QtDragon INI source 为 `ini` + `manifest-backed`；
  - QtDragon on_abort `.ngc` 为 `gcode` + `manifest-backed`；
  - PUMA `remap_subs/428remap.ngc` 为 `remap-subroutine` + `manifest-backed`；
  - DOM row dataset 与 render state source status 一致；
- promotion analysis 文档新增 Promotion Family Source Status 小节。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- source status 只标注已有 source-derived promotion family evidence 的文件类型；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 ini-panel promotion family source status 接入 browser workflow overview smoke，确认真实
   DOM dataset 可见。
2. 把 source status 聚合成 family-level source-kind counts，例如 `ini=6 gcode=6`。
3. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。

### 十九、2026-06-18 Promotion Family Source Kind Counts

继续减少测试并快速推进功能。本批把 source drilldown 的 per-source status 聚合到 family
层级，让 ini-panel workflow overview 的 family 行直接展示 source-kind counts。

新增实质能力：

- 新增 source kind 聚合 helper：
  - `countPromotionFamilySourceKinds()`；
  - `formatPromotionFamilySourceKindCounts()`；
- promotion family row 新增：
  - `sourceKindCounts`；
  - `sourceKindSummary`；
- DOM family row 新增 dataset：
  - `workflowOverviewPromotionFamilySourceKindCounts`；
- family row 显示文本追加 source-kind summary；
- 当前聚合结果：
  - `qtdragon-on-abort`：`ini=6 gcode=6`；
  - `vismach-remap-sims`：`ini=1 gcode=1 remap-subroutine=1`；
  - `rose-engine-rcone-demo`：`ini=1 gcode=1`；
- UI shell smoke 覆盖：
  - render state family counts；
  - DOM family row dataset；
  - DOM family row text；
- promotion analysis 文档新增 Promotion Family Source Kind Counts 小节。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- source-kind counts 只聚合已有 source-derived promotion family evidence；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 ini-panel promotion family source-kind counts 接入 browser workflow overview smoke，
   确认真实 DOM dataset 可见。
2. 增加 source drilldown filter/view-model，让 UI 可以按 `ini`、`gcode`、
   `remap-subroutine` 过滤 evidence。
3. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。

### 二十、2026-06-18 Promotion Family Source Filter ViewModel

继续减少测试并快速推进功能。本批把 source drilldown 从“只能展示”推进到“可按类型过滤”，
让 ini-panel workflow overview 能直接按 `ini`、`gcode`、`remap-subroutine` 查看
promotion family evidence。

新增实质能力：

- 新增 source kind filter helper：
  - `normalizePromotionFamilySourceKindFilter()`；
  - `createIniPanelShellWorkflowOverviewPromotionFamilySourceFilterViewModel()`；
- shell workflow overview contract 新增：
  - `getWorkflowOverviewPromotionFamilySourceFilterViewModel`；
- SDK 入口导出新增 filter view-model API；
- filter view-model 输出：
  - `sourceKindFilters`；
  - `sourceKindCounts`；
  - `totalSourceFileCount`；
  - `filteredSourceFileCount`；
  - `familyRows`；
  - `sourceRows`；
- 当前过滤结果：
  - `all=17`；
  - `ini=8`；
  - `gcode=8`；
  - `remap-subroutine=1`；
- `remap-subroutine` 过滤当前只命中：
  - `linuxcnc/configs/sim/axis/vismach/puma/remap_subs/428remap.ngc`；
- UI shell smoke 覆盖：
  - 默认 `all` filter；
  - `remap-subroutine` filter；
  - family row 过滤结果；
  - workflow overview API surface。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- source filter 只过滤已有 source-derived promotion family evidence；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 promotion family source filter 接入真实 browser workflow overview smoke，确认浏览器
   DOM/控制入口可以切换 `ini`、`gcode`、`remap-subroutine`。
2. 给 filter view-model 增加 family selector，让用户可同时按 family 与 source kind 缩小
   evidence。
3. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。

### 二十一、2026-06-18 Promotion Family Source Family Filter

继续减少测试并快速推进功能。本批在 source kind filter 基础上增加 family selector，让
ini-panel workflow overview 可以同时按 promotion family 与 source kind 缩小 evidence。

新增实质能力：

- 新增 family filter helper：
  - `normalizePromotionFamilyFilter()`；
- `createIniPanelShellWorkflowOverviewPromotionFamilySourceFilterViewModel()` 新增参数：
  - `familyId`；
  - `sourceKind`；
- filter view-model 新增输出：
  - `selectedFamilyId`；
  - `familyFilters`；
  - `scopedSourceFileCount`；
- 当前 family filter totals：
  - `all=17`；
  - `virtual-hal-promotion-family-qtdragon-on-abort=12`；
  - `virtual-hal-promotion-family-vismach-remap-sims=3`；
  - `virtual-hal-promotion-family-rose-engine-rcone-demo=2`；
- 当前组合过滤示例：
  - `familyId=virtual-hal-promotion-family-qtdragon-on-abort`；
  - `sourceKind=gcode`；
  - 结果为 `6/17 source files selected`；
  - scoped family source count 为 `12`；
  - family row summary 为 `gcode=6`；
- UI shell smoke 覆盖：
  - family filter 列表；
  - QtDragon + G-code 组合过滤；
  - scoped count；
  - filtered source rows 均属于所选 family 和 source kind。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- family filter 只过滤已有 source-derived promotion family evidence；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 family + source kind filter 接入真实 browser workflow overview smoke，确认 DOM 控件或
   dataset 能驱动组合过滤。
2. 增加 source filter render/mount DOM surface，让过滤结果不只停留在 view-model。
3. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。

### 二十二、2026-06-18 Promotion Family Source Filter DOM Surface

继续减少测试并快速推进功能。本批把 family + source kind filter 从 view-model 推进到可
挂载 DOM surface，让 ini-panel workflow overview 可以直接渲染过滤器与过滤后的 source
evidence。

新增实质能力：

- 新增 source filter DOM contract：
  - `createIniPanelShellWorkflowOverviewPromotionFamilySourceFilterDomContract()`；
- 新增 DOM readiness：
  - `createIniPanelShellWorkflowOverviewPromotionFamilySourceFilterDomReadiness()`；
- 新增 DOM render/mount：
  - `renderIniPanelShellWorkflowOverviewPromotionFamilySourceFilterState()`；
  - `mountIniPanelShellWorkflowOverviewPromotionFamilySourceFilterState()`；
- shell workflow overview contract 新增：
  - `getWorkflowOverviewPromotionFamilySourceFilterDomContract`；
  - `getWorkflowOverviewPromotionFamilySourceFilterDomReadiness`；
  - `renderWorkflowOverviewPromotionFamilySourceFilterState`；
  - `mountWorkflowOverviewPromotionFamilySourceFilterState`；
- SDK 入口导出新增 4 个 source filter DOM API；
- DOM mount dataset 新增：
  - `handoffScope=workflow-overview-promotion-family-source-filter`；
  - `selectedFamilyId`；
  - `selectedSourceKind`；
- DOM rows 覆盖：
  - family filter rows；
  - source-kind filter rows；
  - filtered source rows；
- 当前 QtDragon + `gcode` 组合过滤 DOM 输出：
  - `filterRowCount=7`；
  - `sourceFileCount=6`；
  - `rowCount=13`；
  - selected family 为 `virtual-hal-promotion-family-qtdragon-on-abort`；
  - selected source kind 为 `gcode`。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
SDK export smoke ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- source filter DOM 只渲染已有 source-derived promotion family evidence；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 source filter DOM surface 接入真实 browser workflow overview smoke，确认浏览器 DOM
   能渲染 selected family/source kind 和 filtered source rows。
2. 给 source filter DOM 增加用户可操作的 selector 控件，而不只是渲染当前 view-model。
3. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。

### 二十三、2026-06-18 Promotion Family Source Filter Selector Controls

继续减少测试并快速推进功能。本批把 source filter DOM surface 从“只渲染过滤结果”
推进到“同时渲染 selector 控件”，为后续 browser workflow overview 交互接入提供直接
DOM contract。

新增实质能力：

- source filter DOM contract 新增 controls 节点：
  - selector：`[data-workflow-overview-promotion-family-source-filter-controls]`；
  - required node：`controls`；
- DOM readiness 新增 `controlsNode` 检查；
- DOM render/mount 新增 `controlsNode` 参数；
- source filter DOM render 新增两个 selector controls：
  - family selector；
  - source-kind selector；
- selector controls dataset 新增：
  - `workflowOverviewPromotionFamilySourceFilterControl`；
  - `workflowOverviewPromotionFamilySourceFilterControlValue`；
  - `workflowOverviewPromotionFamilySourceFilterSelect`；
  - `workflowOverviewPromotionFamilySourceFilterOption`；
  - `workflowOverviewPromotionFamilySourceFilterCount`；
  - `workflowOverviewPromotionFamilySourceFilterSelected`；
- render result 新增：
  - `controlCount=2`；
- 当前 QtDragon + `gcode` 组合 selector 输出：
  - family control value 为 `virtual-hal-promotion-family-qtdragon-on-abort`；
  - source-kind select value 为 `gcode`；
  - selected `gcode` option count 为 `6`；
  - rows 仍为 `filterRowCount=7`、`sourceFileCount=6`、`rowCount=13`。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- selector controls 只承载已有 source-derived promotion family evidence 的过滤状态；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 给 source filter selector controls 增加 change handler/action-plan，让控件选择能生成新的
   filtered view-model。
2. 将 source filter selector controls 接入真实 browser workflow overview smoke，确认真实 DOM
   中可见 family/source-kind selector 与 filtered rows。
3. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。

### 二十四、2026-06-18 Promotion Family Source Filter Selection Workflow

继续减少测试并快速推进功能。本批把 source filter selector controls 从“可显示选择状态”
推进到“可读取控件选择并生成新的 filtered view-model”，为后续真实 browser 交互接入
补齐 workflow 层。

新增实质能力：

- 新增 selector action-plan：
  - `createIniPanelShellWorkflowOverviewPromotionFamilySourceFilterSelectionActionPlan()`；
- 新增 selector change workflow：
  - `handleIniPanelShellWorkflowOverviewPromotionFamilySourceFilterSelectionChange()`；
- shell workflow overview contract 新增：
  - `getWorkflowOverviewPromotionFamilySourceFilterSelectionActionPlan`；
  - `handleWorkflowOverviewPromotionFamilySourceFilterSelectionChange`；
- shell view-model 新增：
  - `createWorkflowOverviewPromotionFamilySourceFilterSelectionActionPlan`；
  - `handleWorkflowOverviewPromotionFamilySourceFilterSelectionChange`；
- SDK 入口导出新增 2 个 selector workflow API；
- selection change workflow 能从 controls DOM 读取：
  - family select value；
  - source-kind select value；
- selection change workflow 输出：
  - `actionPlan`；
  - 新 `viewModel`；
  - 可选 `renderResult`；
- 当前 smoke 路径：
  - 原状态：`virtual-hal-promotion-family-qtdragon-on-abort` + `gcode`；
  - 新选择：`virtual-hal-promotion-family-rose-engine-rcone-demo` + `all`；
  - 新结果：`2/17 source files selected`；
  - scoped family source count 为 `2`；
  - DOM re-render 后包含 `linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc`。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
SDK export smoke ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- selector workflow 只读取/重渲染已有 source-derived promotion family evidence；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 selector change workflow 接入真实 browser workflow overview smoke，确认真实 DOM
   change 后能重渲染 filtered rows。
2. 给 selector controls 增加 browser event binding helper，封装 `change` 事件与 action-plan
   workflow。
3. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。

### 二十五、2026-06-18 Promotion Family Source Filter Event Binding

继续减少测试并快速推进功能。本批把 selector change workflow 推进到可复用 browser event
binding helper，让 source filter controls 的 `change` 事件可以直接触发 action-plan workflow
并重渲染 filtered rows。

新增实质能力：

- 新增 event binding helper：
  - `bindIniPanelShellWorkflowOverviewPromotionFamilySourceFilterSelectionControls()`；
- shell workflow overview contract 新增：
  - `bindWorkflowOverviewPromotionFamilySourceFilterSelectionControls`；
- shell view-model 新增：
  - `bindWorkflowOverviewPromotionFamilySourceFilterSelectionControls`；
- SDK 入口导出新增 binding helper；
- binding helper 输出：
  - `boundControlCount`；
  - `controlIds`；
  - `lastChange`；
  - `triggerChange()`；
  - `unbind()`；
- 当前 smoke 路径：
  - 绑定 family 与 source-kind 两个 select；
  - 将 family select 改为 `virtual-hal-promotion-family-rose-engine-rcone-demo`；
  - 将 source-kind select 改为 `all`；
  - 触发 `change`；
  - DOM re-render 后 source row count 为 `2`；
  - `lastChange.selectedSourceKind=all`；
  - `unbind()` 返回 `{ unbound: 2 }`。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
SDK export smoke ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- event binding 只绑定 UI controls 到已有 source-derived promotion family evidence
  filter workflow；
- virtual HAL 已满足 Web 方式数控系统仿真系统，并在仿真范围内替代 LinuxCNC
  realtime HAL、`halcmd`、motion controller；
- virtual HAL 仍不提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI、native
  HAL module ABI、Python UI process emulation、Python remap runtime、tool DB process
  protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked；
- G-code/interpreter/planner/canonical motion 语义仍来自 LinuxCNC-backed WASM。

下一步工作建议：

1. 将 source filter event binding 接入真实 browser workflow overview smoke，确认真实 DOM
   change 后能重渲染 filtered rows。
2. 把 source filter controls 放进实际 workflow overview 页面结构，而不只是在 helper 层验证。
3. 把 hash 工具接入 release readiness / SDK smoke，使 generated TSV drift 能在常规 gate
   中自动暴露。

### 二十六、2026-06-18 真实仿真页 Promotion Candidate 可见证据

继续按“减少测试、快速大幅度推进功能实现”推进。本批把 sim config promotion
candidate report 从 SDK / release artifact 层推进到真实 browser simulation 页面，让操作员可在
AXIS-style diagnostics 区直接看到 candidate evidence 摘要。

新增实质能力：

- 真实仿真页 diagnostics 区新增 promotion candidate summary panel；
- 新增 browser summary API：
  - `getVirtualHalPromotionCandidateSummary()`；
- `exportDiagnosticsArtifact()` 新增：
  - `virtualHalPromotionCandidateSummary`；
- summary 明确暴露：
  - 首选推进案例：`qtdragon-multi-joint-on-abort`；
  - 首选 INI：`linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini`；
  - 首选 G-code：`linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc`；
  - candidate ready count：`8/8`；
  - family count：`3`；
  - source file count：`17`；
  - browser diagnostics evidence：`8/8 explicit`；
  - inventory baseline：`executed=28 passed=28 skipped=131 unexpected_fail=0`；
- 页面 body dataset 新增：
  - `promotionCandidateReady`；
  - `promotionCandidateCount`；
  - `promotionCandidatePreferred`；
- 真实 browser smoke 新增 DOM/API/artifact 断言，确认 candidate summary 可见且首选
  QtDragon multi-joint 案例已进入 browser evidence；
- SDK smoke 期望同步接受 promotion family rows 携带 `sourceFiles`，保留更强的 source
  evidence。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/sdk/node/verify_sdk_surface.sh ok
SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_real_simulation_browser.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- candidate summary 只汇总已有 LinuxCNC source-derived virtual HAL report；
- virtual HAL 仍只作为 Web 仿真替代层，不提供 Linux kernel hard-realtime ABI、外部硬件
  驱动 ABI、native HAL module ABI、Python UI process emulation、Python remap runtime、
  tool DB process protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked。

下一步工作建议：

1. 把 promotion candidate summary 接入 release artifact URL workflow 页面展示，让外部 URL
   验证也能直接看到首选 candidate、source files 和 baseline。
2. 在真实 workflow overview browser smoke 中验证 source filter event binding 的 DOM
   change 交互，闭合 helper 到页面的链路。
3. 将 `qtdragon-multi-joint-on-abort` 扩展为可点击的 diagnostics drilldown，显示 INI、
   G-code、required virtual HAL reports 和 blocked-family exclusion 明细。

### 二十七、2026-06-18 Release URL Workflow Candidate Summary

继续按“减少测试、快速大幅度推进功能实现”推进。本批把上一轮真实仿真页导出的
`virtualHalPromotionCandidateSummary` 接入 release artifact URL workflow，让外部 URL
验证和 INI-panel workflow overview 都能直接显示首选 promotion candidate 证据。

新增实质能力：

- `loadProjectReleaseReadinessArtifactUrlWorkflow()` 现在保留 fetched diagnostics artifact：
  - 新字段：`diagnosticsArtifact`；
  - 来源为 diagnostics URL 返回的
    `real-browser-simulation-diagnostics-artifact`；
- `createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel()` 新增 rows：
  - `virtual-hal-promotion-candidate-summary`；
  - `virtual-hal-promotion-candidate`；
  - `virtual-hal-promotion-candidate-ini`；
  - `virtual-hal-promotion-candidate-gcode`；
  - `virtual-hal-promotion-candidate-count`；
  - `virtual-hal-promotion-candidate-baseline`；
- `loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()` 同步透传：
  - `diagnosticsArtifact`；
- `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()`
  同步显示 candidate summary rows；
- release URL workflow 现在可以直接展示：
  - 首选推进案例：`qtdragon-multi-joint-on-abort`；
  - INI：`linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini`；
  - G-code：`linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc`；
  - candidate readiness：`8/8 ready`；
  - baseline：`executed=28 passed=28 skipped=131 unexpected_fail=0`；
- SDK URL workflow smoke 和 INI-panel UI shell smoke 同步验证这些 rows。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/sdk/node/verify_project_release_artifact_url_workflow.sh ok
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- URL workflow 只透传并展示 diagnostics artifact 中已有 source-derived candidate
  summary；
- virtual HAL 仍只作为 Web 仿真替代层，不提供 Linux kernel hard-realtime ABI、外部硬件
  驱动 ABI、native HAL module ABI、Python UI process emulation、Python remap runtime、
  tool DB process protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked。

下一步工作建议：

1. 在真实 workflow overview browser smoke 中验证 release URL workflow 页面能渲染新增
   candidate summary rows。
2. 将 `qtdragon-multi-joint-on-abort` 做成 drilldown view，展示 INI、G-code、
   required virtual HAL reports、source files 和 blocked-family exclusion。
3. 把 source filter event binding 接入真实 browser workflow overview smoke，确认真实 DOM
   change 后能重渲染 filtered source rows。

### 二十八、2026-06-18 Workflow Overview Browser Candidate Summary

继续按“减少测试、快速大幅度推进功能实现”推进。本批把 release artifact URL workflow
中的 promotion candidate summary 推进到真实 workflow overview browser smoke，确认真实
页面 DOM 能渲染并展示首选 candidate 证据。

新增实质能力：

- `ini_panel_workflow_overview_smoke.html` 的 diagnostics artifact fixture 新增：
  - `virtualHalPromotionCandidateSummary`；
- 真实 workflow overview browser 路径现在验证：
  - diagnostics artifact 中 candidate summary ready；
  - URL workflow render rows 包含 `virtual-hal-promotion-candidate-summary`；
  - summary view-model 暴露首选 candidate；
  - 真实 DOM 中可读取：
    - `virtual-hal-promotion-candidate`；
    - `virtual-hal-promotion-candidate-count`；
- 真实页面可见证据保持：
  - 首选推进案例：`qtdragon-multi-joint-on-abort`；
  - INI：`linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini`；
  - G-code：`linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc`；
  - candidate readiness：`8/8 ready`；
  - baseline：`executed=28 passed=28 skipped=131 unexpected_fail=0`。

本批减少测试，只执行贴近改动的验证：

```text
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh ok
git diff --check ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- 真实 browser smoke 只验证已有 source-derived candidate summary 被 URL workflow 页面
  渲染；
- virtual HAL 仍只作为 Web 仿真替代层，不提供 Linux kernel hard-realtime ABI、外部硬件
  驱动 ABI、native HAL module ABI、Python UI process emulation、Python remap runtime、
  tool DB process protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked。

下一步工作建议：

1. 将 `qtdragon-multi-joint-on-abort` 做成 drilldown view，展示 INI、G-code、
   required virtual HAL reports、source files 和 blocked-family exclusion。
2. 把 source filter event binding 接入真实 browser workflow overview smoke，确认真实 DOM
   change 后能重渲染 filtered source rows。
3. 给 release URL workflow 增加 candidate summary 缺失的 negative fixture，防止后续
   diagnostics artifact 回退时仍被误判 ready。

### 二十九、2026-06-18 Workflow Overview Source Filter 真实交互

继续按“减少测试、快速大幅度推进功能实现”推进。本批把已存在的 promotion family
source filter helper 接入真实 workflow overview 页面，而不只停留在 UI helper / Node
smoke 层。

新增实质能力：

- `workflow-overview.html` 新增真实 Promotion family source filter 面板：
  - `data-workflow-overview-promotion-family-source-filter`；
  - `data-workflow-overview-promotion-family-source-filter-controls`；
  - `data-workflow-overview-promotion-family-source-filter-rows`；
- release artifact URL workflow 成功后自动生成：
  - promotion family rows render state；
  - source filter view-model；
  - source filter DOM mount result；
  - source filter select change binding；
- 页面 API 新增真实 source filter helper 暴露：
  - `getWorkflowOverviewPromotionFamilyRowsRenderState()`；
  - `getWorkflowOverviewPromotionFamilySourceFilterViewModel()`；
  - `getWorkflowOverviewPromotionFamilySourceFilterDomContract()`；
  - `getWorkflowOverviewPromotionFamilySourceFilterDomReadiness()`；
  - `getWorkflowOverviewPromotionFamilySourceFilterSelectionActionPlan()`；
  - `handleWorkflowOverviewPromotionFamilySourceFilterSelectionChange()`；
  - `bindWorkflowOverviewPromotionFamilySourceFilterSelectionControls()`；
  - `renderWorkflowOverviewPromotionFamilySourceFilterState()`；
  - `mountWorkflowOverviewPromotionFamilySourceFilterState()`；
- 真实 browser smoke 现在验证：
  - 默认 source filter 为 `all / all`，展示 `17` 个 source file；
  - 两个 select 控件已绑定；
  - 将 family select 改为
    `virtual-hal-promotion-family-rose-engine-rcone-demo` 后，真实 DOM 重渲染为该 family
    的 2 个 source file；
  - body dataset 同步记录 selected family 和 filtered source count；
  - 可从真实 DOM 读取
    `linuxcnc/configs/sim/axis/rose_engine/rcone_demo.ngc` source row。

本批减少测试，只执行贴近改动的验证：

```text
git diff --check ok
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh ok
```

语义边界：

- 本批没有降低 inventory skip count；
- 当前 baseline 仍是 `executed=28`、`passed=28`、`skipped=131`、
  `unexpectedFail=0`；
- 本批没有新增 G-code/interpreter/planner/kinematics/remap 语义；
- source filter 只筛选 release diagnostics 中已有的 source-derived promotion family
  evidence；
- virtual HAL 仍只作为 Web 仿真替代层，不提供 Linux kernel hard-realtime ABI、外部硬件
  驱动 ABI、native HAL module ABI、Python UI process emulation、Python remap runtime、
  tool DB process protocol 或 external user-M process execution；
- `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、`UPSTREAM-DEMO` 仍保持
  locked。

下一步工作建议：

1. 给 release URL workflow 增加 candidate summary 缺失的 negative fixture，防止后续
   diagnostics artifact 回退时仍被误判 ready。
2. 把 source filter 当前选中状态持久化到 URL hash 或 session state，让刷新页面后仍保留
   family/source-kind 筛选。
3. 将 source filter 与 candidate drilldown 联动：点击 source row 时自动切换
   `qtdragon-multi-joint-on-abort`、PUMA 或 rose-engine 对应 drilldown。

### 三十、2026-06-18 virtual HAL 实质功能收尾

按“尽快结束 virtual HAL 相关实质性功能”的要求，本批不再扩展新的 virtual HAL UI 或
runtime 能力，只补最后一个 release diagnostics 防回退 gate，然后将 virtual HAL 工作从
“功能推进”转为“维护冻结”。

新增收尾能力：

- release browser diagnostics validation 现在强制要求
  `virtualHalPromotionCandidateSummary`；
- summary 必须完整匹配当前 source-derived promotion evidence：
  - `apiName=real-browser-simulation-promotion-candidate-summary`；
  - `ready=true`；
  - `candidateCount=8`；
  - `readyCandidateCount=8`；
  - `familyCount=3`；
  - `sourceFileCount=17`；
  - `preferredCandidateId=qtdragon-multi-joint-on-abort`；
  - `explicitBrowserDiagnosticsCount=8`；
  - inventory baseline 仍为
    `executed=28 passed=28 skipped=131 unexpected_fail=0`；
- release URL workflow negative fixture 已覆盖缺失
  `virtualHalPromotionCandidateSummary` 的情况；
- SDK surface negative fixture 已覆盖 summary 缺失和 ready count 回退；
- release gate manifest URL workflow summary 期望已同步新 rows。

本批减少测试，只执行贴近改动的验证：

```text
wasm-port/tests/sdk/node/verify_project_release_artifact_url_workflow.sh ok
wasm-port/tests/sdk/node/verify_sdk_surface.sh ok
git diff --check ok
```

virtual HAL 结论：

- virtual HAL 的实质功能推进到此结束；
- 后续不再建议继续增加 virtual HAL runtime/UI 功能；
- virtual HAL 后续只做 bugfix、fixture drift 修复、release gate 回归维护；
- 后续主线应转向非 virtual HAL 任务，例如真实 LinuxCNC-backed interpreter / simulation
  workflows、release packaging、业务 UI、文档交付或其他项目目标。

后续工作建议：

1. 暂停 virtual HAL 新功能，只保留现有 smoke/gate 维护。
2. 选择下一个非 virtual HAL 主线任务，优先做能直接提升产品完成度的功能。
3. 如必须碰 virtual HAL，只处理 failing gate 或 source manifest drift，不再扩展能力边界。
