From 1c94ea452701f307980c3828d710d0c011aaec33 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Thu, 18 Jun 2026 17:20:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=89text22=E6=94=B6=E6=9D=9Fpromotion?= =?UTF-8?q?=E8=AF=81=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结论:完成 evidence-ready / inventory-ready 双层 promotion candidate 管理,release/SDK gate 已纳入 virtual HAL promotion summary,baseline 保持 28/28/131/0,Python remap、tool DB、external user-M hard block 继续 locked。 --- text18.txt | 1578 +++++++++++++++++ text19.txt | 265 +++ text20.txt | 453 +++++ text21.txt | 538 ++++++ text22.txt | 202 +++ wasm-port/docs/compatibility-validation.md | 12 +- .../sim-config-coverage-promotion-analysis.md | 330 ++++ wasm-port/docs/sim-configs-coverage-matrix.md | 6 +- wasm-port/runtime/sdk/README.md | 11 +- wasm-port/runtime/sdk/src/index.js | 22 + wasm-port/runtime/sdk/src/linuxcnc-hal.js | 285 ++- .../sdk/src/project-release-readiness.js | 308 +++- wasm-port/runtime/ui/ini-panel/ui-shell.js | 1349 ++++++++++++++ .../ui/ini-panel/workflow-overview.html | 157 ++ wasm-port/runtime/ui/simulation/index.html | 135 ++ .../runtime/ui/simulation/simulation-app.js | 1 + .../ini_panel_workflow_overview_smoke.html | 170 +- wasm-port/tests/browser/interp_smoke.html | 3 +- .../browser/real_simulation_page_smoke.html | 138 +- .../project-release-readiness-ready.json | 930 +++++++++- ...ify_project_release_readiness_artifact.mjs | 101 ++ ...ite_project_release_readiness_artifact.mjs | 21 +- ..._project_release_artifact_url_workflow.mjs | 96 + .../verify_project_release_gate_manifest.mjs | 42 +- .../tests/sdk/node/verify_sdk_surface.mjs | 407 +++++ .../ui/node/verify_ini_panel_ui_shell.mjs | 755 +++++++- .../verify_sim_configs_inventory_wasm.mjs | 240 ++- .../update_sim_config_boundary_hashes.mjs | 61 + .../update_sim_config_boundary_hashes.sh | 5 + 29 files changed, 8500 insertions(+), 121 deletions(-) create mode 100644 text19.txt create mode 100644 text20.txt create mode 100644 text21.txt create mode 100644 text22.txt create mode 100755 wasm-port/tools/update_sim_config_boundary_hashes.mjs create mode 100755 wasm-port/tools/update_sim_config_boundary_hashes.sh diff --git a/text18.txt b/text18.txt index 66b1648..66d3bba 100644 --- a/text18.txt +++ b/text18.txt @@ -519,6 +519,64 @@ git diff --check ok ### 二、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 不变。 @@ -765,3 +823,1523 @@ Python remap family,本批新增 negative fixture gate。 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,不再扩展能力边界。 diff --git a/text19.txt b/text19.txt new file mode 100644 index 0000000..7a23eee --- /dev/null +++ b/text19.txt @@ -0,0 +1,265 @@ +项目接续文件:利用 virtual HAL 成果推进 sim config baseline promotion + +生成时间:2026-06-18 CST + +本文件接替 `text18.txt`。后续继续推进时优先参考 `text19.txt`;除非明确要求审计 +旧记录,不再回到 `text1` 到 `text18` 扩展历史实现。 + +一、方向纠偏 + +上一版表述容易被误读为“转向非 virtual HAL,不再使用 virtual HAL 成果”。正确方向是: + +```text +virtual HAL runtime capability 已收尾;后续不继续扩展 virtual HAL 新功能, +但要利用已完成的 virtual HAL source-derived evidence、browser diagnostics、 +release gate 和 motion matrix,继续推进 sim config coverage / baseline promotion。 +``` + +执行含义: + +- 不新增 virtual HAL runtime capability; +- 不新增 unrelated virtual HAL UI 面板、filter、drilldown 类功能; +- 不把 virtual HAL 当成 JS CNC 语义替代品; +- 允许并且应该复用 virtual HAL 已有成果作为 promotion evidence: + - source compliance; + - sim-config source coverage; + - promotion candidate report; + - macro/load fixture report; + - command script fixtures; + - manifest-backed motion controller matrix; + - browser diagnostics artifact; + - release readiness / URL workflow / batch acceptance evidence。 + +二、当前 baseline + +当前 Node inventory baseline 仍为: + +```text +executed=28 +passed=28 +skipped=131 +unexpected_fail=0 +``` + +当前已经完成的 virtual HAL promotion evidence 不等同于 inventory skip count 下降。它已经把 +一批 Node `INV` / representative rows 推进到了 browser diagnostics / release evidence 层, +但如果要让 `executed/passed/skipped` 变化,仍必须修改并运行真实 inventory execution path。 + +三、已具备的 promotion evidence + +当前 SDK / browser / release gate 已覆盖 Tier 1 promotion candidate report: + +- `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` + +这些 row 的当前性质: + +- LinuxCNC source/config evidence 完整; +- current Node inventory status 为 `PASS`; +- blocked kind 为 `-`; +- target browser evidence 为 `explicit-browser-diagnostics`; +- release diagnostics validation 已要求 promotion candidate summary; +- inventory baseline 保持不变。 + +当前 macro/load 非主程序 evidence 已覆盖: + +- `axis/rose_engine/rcone.ngc` +- `axis/external_offsets/queuebuster.ngc` + +这些只能作为 non-main fixture diagnostics evidence,不作为 standalone main program promotion。 + +四、不可突破边界 + +以下 family 仍不能靠 virtual HAL、JS glue 或 browser UI 伪装解锁: + +- 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。 + +因此以下 blocked kind 仍保持 locked: + +- `L4-PYTHON-REMAP` +- `L4-TOOL-DB` +- `L4-USER-M-PROCESS` +- `UPSTREAM-DEMO` +- standalone-main 语境下的 `ASSET-ONLY` + +五、下一步主线目标 + +目标仍是从: + +```text +executed=28 +passed=28 +skipped=131 +``` + +推进到更高完成度。第一阶段建议目标: + +```text +executed >= 35 +passed == executed +skipped <= 124 +unexpected_fail=0 +``` + +但推进方式应是: + +1. 先复用 virtual HAL 已建立的 source-derived evidence,确认候选 family 的 browser/release + evidence 已 ready; +2. 再找出当前 inventory 中还没有执行、但依赖已被 virtual HAL / HALUI / deterministic + UI declarations / machine files / tool tables / remap asset staging 覆盖的 main program; +3. 只把 LinuxCNC-backed runtime 能真实执行通过的 row 纳入 inventory; +4. 同步更新 docs、release artifact fixture、SDK/host gate baseline 断言。 + +六、候选选择原则 + +优先方向: + +- Tier 1 已有 promotion evidence 周边 family: + - QtDragon on-abort family; + - PUMA / vismach remap family; + - rose-engine family; +- 当前 matrix 中 `blocked=-`、`class=main`、native `PASS`、但尚未进入 browser explicit evidence + 或 inventory execution 的 row; +- 已有 tool-table fallback、vendored INI/G-code/source evidence、无 Python/process hard block 的 row; +- 已有 virtual HAL command/motion matrix 可以解释 HAL/UI/motion 依赖的 row。 + +禁止方向: + +- 不把 Python remap pass 当作 browser/Node full promotion; +- 不把 tool DB native pass 当作 WASM process protocol pass; +- 不把 external user-M process pass 当作 virtual HAL deterministic M110/M111 边界; +- 不把 macro/load asset 当 standalone main; +- 不靠改 docs 声称 skipped 降低。 + +七、建议执行步骤 + +### 第一步:复核当前 virtual HAL promotion gate + +最小命令: + +```text +wasm-port/tests/sdk/node/verify_sdk_surface.sh +wasm-port/tests/sdk/node/verify_project_release_gate_manifest.sh +``` + +确认: + +- `VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES` 仍包含 8 个 Tier 1 row; +- candidate report `complete === true`; +- `webSimulationSatisfied === true`; +- `inventoryBaselineUnchanged === true`; +- blocked candidate count 为 0; +- release gate / URL workflow 仍要求 candidate summary。 + +### 第二步:生成真实 inventory promotion candidate 清单 + +不要只列 hard-block skipped main row;应输出两个层级: + +- evidence-ready candidates:已有 virtual HAL/browser/release evidence,适合继续升 browser/release + 覆盖; +- inventory-ready candidates:确实可从 skipped 推进到 executed 的 main program。 + +建议输出: + +```text +wasm-port/build/wasm/sim-configs-inventory/promotion-candidates.tsv +``` + +字段至少包含: + +- path; +- ini; +- current inventory status; +- matrix layer4 node/browser status; +- class; +- native status; +- blocked kind; +- dependency class; +- virtual HAL evidence ready; +- inventory promotion allowed; +- block reason; +- recommended next command。 + +### 第三步:推进第一批真实 inventory rows + +一次只推进 5 到 8 个 row。每个 row 必须说明: + +- LinuxCNC source/config/runtime evidence; +- 为什么已有 virtual HAL evidence 能覆盖 HAL/UI/motion 依赖; +- 为什么不是 JS/browser 自行补 CNC 语义; +- 为什么不属于 `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS`、 + `UPSTREAM-DEMO` 或 standalone `ASSET-ONLY`; +- 执行后 baseline 如何变化。 + +### 第四步:同步 release packaging + +baseline 真变化后,同步更新: + +- generated sim-config inventory artifact; +- `wasm-port/docs/sim-configs-coverage-matrix.md`; +- `wasm-port/docs/sim-config-coverage-promotion-analysis.md`; +- release readiness artifact fixture; +- SDK / host gate 的 baseline 断言; +- browser diagnostics / URL workflow 中的 baseline 文案。 + +八、验收标准 + +一次真实 baseline promotion 完成条件: + +1. 新 baseline artifact 真实生成; +2. `executed` 和 `passed` 同步增加; +3. `skipped` 同步减少; +4. `unexpected_fail` 仍为 `0`; +5. 新增 rows 不属于 blocked family; +6. virtual HAL evidence 是 source-derived support,不是 CNC 语义替代; +7. `verify_no_standalone_cnc_semantics.sh` 仍通过; +8. 最小相关 gate 通过; +9. 文档记录变更前/后 baseline、新增 rows、blocked family lock 状态和验证命令。 + +建议最小验证命令: + +```text +git diff --check +wasm-port/tools/verify_no_standalone_cnc_semantics.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 +wasm-port/tests/sdk/node/verify_project_release_gate_manifest.sh +``` + +如改动涉及 browser/release 页面,再额外运行: + +```text +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_real_simulation_browser.sh +``` + +九、下一步工作内容 + +下一轮建议直接做: + +```text +基于现有 virtual HAL promotion candidate report,生成 evidence-ready / inventory-ready +双层 promotion-candidates.tsv;然后从 blocked=-、native PASS、class=main 的 row 中筛出 +第一批 5-8 个可真实进入 inventory execution 的候选,试运行并更新 baseline。 +``` + +优先候选 family: + +- QtDragon on-abort family 周边; +- PUMA / vismach remap family; +- rose-engine family; +- 其他已 vendored、无 Python/process hard block、可由 virtual HAL 解释 HAL/UI/motion 依赖的 + main program。 diff --git a/text20.txt b/text20.txt new file mode 100644 index 0000000..8550697 --- /dev/null +++ b/text20.txt @@ -0,0 +1,453 @@ +项目接续文件:tool DB 解锁步骤与方法 + +生成时间:2026-06-18 CST + +本文件接替 `text19.txt` 中关于 blocked runtime family 的后续推进说明,专门规划 +`L4-TOOL-DB` / `axis/db_demo/base.ngc` 的解锁路径。当前目标不是绕过 tool DB, +而是在已有 source-derived evidence、transaction contract、native readiness gate 和 +promotion lock 框架基础上,把 tool database process protocol 证明补齐,然后再允许 +真实 inventory promotion。 + +重要状态说明:本文件是未来解锁研究计划,不是当前阶段实施范围。当前阶段铁律仍是 +“virtual HAL 成果作为 sim config promotion 证据基础”,同时明确不解锁 +`L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS` 这些 hard block。 +因此在当前交付中,`axis/db_demo/base.ngc` 必须继续保持 `SKIP L4-TOOL-DB`, +`promotion_allowed=0`,`promotion_lock_active=1`。 + +一、当前已完成条件 + +当前项目已经具备以下基础,不需要重做: + +1. source/config ownership 已明确。 + +- `axis/db_demo/base.ngc` 当前 blocked kind 为 `L4-TOOL-DB`; +- owning INI 为 `axis/db_demo/db_nonran.ini`; +- INI 声明: + +```text +[EMCIO] +DB_PROGRAM = ./db_nonran.py +``` + +- LinuxCNC source owner 已记录: + - `configs/sim/axis/db_demo/db_nonran.ini` + - `configs/sim/axis/db_demo/db.py` + - `src/emc/task/taskclass.cc` + - `src/emc/tooldata/tooldata_db.cc` + - `lib/python/tooldb.py` + +2. machine-readable artifacts 已有。 + +当前已有并通过 inventory gate 的 tool DB 相关 artifact: + +```text +wasm-port/build/wasm/sim-configs-inventory/tool-db-process-boundary-summary.tsv +wasm-port/build/wasm/sim-configs-inventory/tool-db-process-protocol-gates.tsv +wasm-port/build/wasm/sim-configs-inventory/tool-db-process-transaction-plan.tsv +wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-protocol-alignment.tsv +wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-readiness.tsv +wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-probe-gate.tsv +``` + +3. transaction contract 已明确。 + +`tool-db-process-transaction-plan.tsv` 已把 DB protocol 拆成以下 pending proof: + +- `startup_handshake`:启动后返回 `v2.1`; +- `initial_get_all`:发送 `g`,读取直到 `FINI`; +- `spindle_load_notify`:发送/验证 `l`; +- `tool_offset_notify`:发送/验证 `p`; +- `spindle_unload_notify`:发送/验证 `u`。 + +4. 当前 readiness 状态已明确。 + +当前 `tool-db-process-native-runtime-readiness.tsv` / probe gate 显示: + +```text +python3=1 +axis/db_demo/db_nonran.py=1 +linuxcnc.so=1 +tooldb.py=1 +linuxcnc=0 +milltask=0 +halcmd=0 +runtime_ready=0 +source_proof_ready=1 +gate_status=blocked_missing_host_runtime +proof_status=pending +execution_enabled=0 +promotion_allowed=0 +``` + +这说明当前缺的不是 source evidence,也不是 Python 文件本身,而是完整 LinuxCNC +task/tooldata DB host runtime。 + +二、解锁原则 + +tool DB 解锁必须遵守以下规则: + +1. 不允许用 `.tbl` fallback 解锁。 + +`DB_PROGRAM` 模式明确替代普通 tool table path。用 `.tbl` 让程序跑通会绕过 +LinuxCNC tool database process protocol,属于错误 promotion。 + +2. 不允许用 JS/virtual HAL 重新实现 tool DB 语义。 + +virtual HAL 可以继续作为 HAL/motion/browser diagnostics evidence,但不能替代: + +- `DB_PROGRAM` 子进程启动; +- `tooldb.py` protocol loop; +- `v2.1` / `g` / `l` / `u` / `p` protocol; +- nonrandom DB state mutation; +- flat-file persistence。 + +3. native proof 必须先于 Node/browser promotion。 + +只有 native runtime probe 明确通过以后,才允许更新 Node/browser promotion gate。 + +4. promotion lock 必须手动更新。 + +即使 native probe 通过,也不能自动把 `axis/db_demo/base.ngc` 从 skipped 改为 executed。 +必须明确更新 promotion readiness、blockers、post-native-pass gate 和 lock artifact。 + +三、第一阶段:准备 host runtime + +目标:让 tool DB runtime readiness 从: + +```text +runtime_ready=0 +missing_requirements=linuxcnc,milltask,halcmd +``` + +变为: + +```text +runtime_ready=1 +missing_requirements=- +``` + +需要准备的命令/模块: + +```text +python3 +linuxcnc +milltask +halcmd +axis/db_demo/db_nonran.py +linuxcnc.so +tooldb.py +``` + +当前已有: + +```text +python3 +axis/db_demo/db_nonran.py +linuxcnc.so +tooldb.py +``` + +当前缺失: + +```text +linuxcnc +milltask +halcmd +``` + +建议方法: + +1. 在具备完整 LinuxCNC userspace runtime 的 host / container 中执行。 +2. 确保 `linuxcnc`、`milltask`、`halcmd` 在 `PATH` 上。 +3. 确保 LinuxCNC Python 模块路径能被 `db_nonran.py` import: + +```text +python3 -c "import linuxcnc; import tooldb; print('linuxcnc_tooldb_python_modules=ok')" +``` + +4. 重新运行 native probes / inventory gate 以刷新 readiness artifacts: + +```text +wasm-port/tests/native/probe_tool_db_runtime.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +``` + +预期中间状态: + +- 如果 host runtime 仍缺失: + +```text +tool_db_runtime_probe_status=skipped_missing_host_runtime +``` + +- 如果 host runtime 已满足但未显式启用 probe: + +```text +tool_db_runtime_probe_status=ready_disabled_by_default +``` + +四、第二阶段:执行 native DB protocol probe + +目标:证明 LinuxCNC-owned DB process protocol 真实可运行。 + +执行命令: + +```text +ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh +``` + +该 probe 必须证明: + +1. `db_nonran.py` 按 `DB_PROGRAM` 配置启动; +2. startup handshake 返回 `v2.1`; +3. `g` get-all 返回 expected nonrandom startup tools; +4. startup state 覆盖 `T10..T19` / `tno+100` pockets; +5. `l` load notify 触发 spindle load state; +6. `p` tool offset notify 触发 DB update path; +7. `u` unload notify 触发 spindle unload state; +8. flat-file persistence 能反映 state mutation; +9. probe 输出: + +```text +tool_db_runtime_probe_status=runtime_protocol_probe_passed +``` + +失败处理: + +- 如果失败在 import `linuxcnc` / `tooldb`:修 Python module path,不改项目语义; +- 如果失败在 `linuxcnc` / `milltask` / `halcmd`:修 host runtime,不改 Node/browser fallback; +- 如果失败在 protocol message:先对齐 native `db_nonran.py` / `tooldb.py` 行为和 + `tool-db-process-transaction-plan.tsv`,不允许用简化协议绕过; +- 如果失败在 persistence:修 probe 环境的临时 DB 文件隔离和 cleanup,不把 persistence + 检查删除。 + +五、第三阶段:刷新 native/runtime artifacts + +native probe pass 后,重新生成并验证 artifacts: + +```text +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +``` + +预期变化方向: + +```text +tool-db-process-native-runtime-readiness.tsv: + runtime_ready=1 + missing_requirements=- + +tool-db-process-native-runtime-probe-gate.tsv: + gate_status=native_probe_passed_waiting_for_node_browser_promotion_proof + proof_status=passed + source_proof_ready=1 +``` + +注意:这个阶段仍不应直接让 `promotion_allowed=1`。native pass 只是打开下一步 +Node/browser proof 的条件。 + +六、第四阶段:更新 promotion readiness / blocker / lock + +native pass 后,需要更新以下 gate 的逻辑和 fixtures: + +```text +runtime-boundary-promotion-readiness.tsv +runtime-boundary-promotion-blockers.tsv +runtime-boundary-post-native-pass-gates.tsv +runtime-boundary-native-evidence-acceptance-gate.tsv +blocked-runtime-promotion-lock.tsv +next-boundary-recommendations.tsv +promotion-candidates.tsv +``` + +目标状态: + +1. `native_evidence_ready=1`; +2. `node_inventory_gate_complete=0`,直到 Node inventory row 真实执行; +3. `browser_smoke_gate_complete=0`,直到 browser proof 真实通过; +4. `promotion_lock_active=1`,直到人工明确解锁; +5. blocker 从 `missing_host_runtime` 转为: + +```text +pending_node_inventory_promotion_gate +pending_browser_smoke_gate +promotion_lock_active +``` + +这一步的重点是:native proof 已经完成,但还没有完成 Node/browser promotion,因此 +blocked family 不能直接消失。 + +七、第五阶段:设计 Node inventory execution path + +只有 native DB protocol probe 通过后,才允许考虑让 `axis/db_demo/base.ngc` 进入 +Node inventory execution。 + +可接受方向: + +1. 通过 LinuxCNC-owned tooldata DB protocol wrapper 执行; +2. 保留 `DB_PROGRAM = ./db_nonran.py` 的行为边界; +3. Node/WASM 侧只做 file staging、protocol bridge、result capture; +4. 所有 tool DB state 来自 LinuxCNC protocol / db.py 行为,而不是 JS 自行解释。 + +不可接受方向: + +1. 把 `axis/sim.tbl` 或任意 `.tbl` 当作 DB fallback; +2. 在 JS 中手写 `T10..T19` tool DB state; +3. 跳过 `v2.1` / `g` / `l` / `u` / `p` protocol; +4. 只因为 native `bin/rs274` 能 parse `base.ngc` 就标记 Node inventory PASS; +5. 把 virtual HAL readiness 当作 tool DB process readiness。 + +如果 Node/WASM 当前无法启动 Python DB process,则应保持: + +```text +node_inventory_gate_complete=0 +promotion_allowed=0 +``` + +并把下一步限定为“设计 tool DB protocol bridge”,而不是直接改 baseline。 + +八、第六阶段:Browser proof + +Browser proof 只能在 Node inventory gate 真实完成后做。 + +Browser proof 至少需要: + +- diagnostics artifact 记录 tool DB protocol proof status; +- release URL workflow 显示 `axis/db_demo/base.ngc` 的 DB proof; +- 明确 `tool_table_fallback_sufficient=0`; +- 明确 `python3_sufficient=0`; +- 明确 source owner 是 LinuxCNC DB protocol; +- browser 只呈现 proof / workflow / artifact,不自行执行 tool DB semantics。 + +九、第七阶段:真实 inventory baseline promotion + +只有满足以下条件后,才允许把 `axis/db_demo/base.ngc` 从 skipped 变为 executed: + +1. native DB runtime probe passed; +2. Node inventory execution path 通过 LinuxCNC-owned DB protocol; +3. browser proof / release diagnostics gate 已通过; +4. promotion lock 手动关闭; +5. `promotion-candidates.tsv` 中对应行从: + +```text +candidate_kind=inventory-ready +current_status=SKIP +skip_kind=L4-TOOL-DB +promotion_allowed=0 +``` + +变为真实可 promotion 状态,并有明确 proof chain; +6. `summary.tsv` 中 `axis/db_demo/base.ngc` 变为: + +```text +inventory_status=PASS +skip_or_fail_reason=- +``` + +预期 baseline 变化: + +```text +executed: 28 -> 29 +passed: 28 -> 29 +skipped: 131 -> 130 +unexpected_fail: 0 +``` + +十、需要同步更新的文件/断言 + +baseline 真实变化后,至少同步: + +```text +wasm-port/docs/sim-configs-coverage-matrix.md +wasm-port/docs/sim-config-coverage-promotion-analysis.md +wasm-port/docs/compatibility-validation.md +wasm-port/runtime/sdk/src/linuxcnc-hal.js +wasm-port/runtime/sdk/src/project-release-readiness.js +wasm-port/tests/fixtures/project-release-readiness-ready.json +wasm-port/tests/sdk/node/verify_sdk_surface.mjs +wasm-port/tests/sdk/node/verify_project_release_gate_manifest.mjs +wasm-port/tests/host/verify_project_release_readiness_artifact.mjs +wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.mjs +``` + +需要同步更新的固定 baseline: + +```text +VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE +project release readiness fixture simConfigInventory +coverage matrix Current Node inventory +compatibility validation current gate text +promotion candidate expected status +skip-summary expected count +``` + +十一、最小验证命令 + +host runtime 准备阶段: + +```text +wasm-port/tests/native/probe_tool_db_runtime.sh +``` + +native runtime proof 阶段: + +```text +ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh +``` + +artifact / inventory 阶段: + +```text +git diff --check +wasm-port/tools/verify_no_standalone_cnc_semantics.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 +wasm-port/tests/sdk/node/verify_project_release_gate_manifest.sh +``` + +browser / release proof 阶段: + +```text +SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_real_simulation_browser.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh +wasm-port/tests/host/verify_project_release_readiness_artifact.sh +``` + +十二、下一步工作内容 + +当前机器 artifact 显示缺少: + +```text +linuxcnc +milltask +halcmd +``` + +因此下一步不是改 Node inventory baseline,而是: + +1. 在具备完整 LinuxCNC host runtime 的环境中运行: + +```text +wasm-port/tests/native/probe_tool_db_runtime.sh +``` + +2. 如果状态变为 `ready_disabled_by_default`,继续运行: + +```text +ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh +``` + +3. 拿到 `runtime_protocol_probe_passed` 后,刷新 inventory artifacts: + +```text +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +``` + +4. 再进入 promotion readiness / lock 更新,而不是直接把 + `axis/db_demo/base.ngc` 改成 PASS。 + +十三、简要结论 + +tool DB 的解锁关键不是 virtual HAL 能力不足,而是还缺 LinuxCNC task/tooldata DB +process runtime proof。当前 source evidence、contract、readiness artifact、probe gate +都已铺好;真正的第一步是补齐 host runtime 并跑通 +`ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh`。 diff --git a/text21.txt b/text21.txt new file mode 100644 index 0000000..7c9a591 --- /dev/null +++ b/text21.txt @@ -0,0 +1,538 @@ +项目接续文件:WASM + OPFS 环境下 tool DB 完全解锁可行性与实施步骤 + +生成时间:2026-06-18 CST + +本文件接替 `text20.txt`,进一步回答:在以 WASM 和 OPFS 为技术基础的 Web 技术环境下, +`L4-TOOL-DB` 是否可以完全解锁,以及怎样以可实现、可验证、不过度伪装的方式解锁。 + +重要状态说明:本文件是 future feasibility / architecture note,不是当前阶段执行计划。 +当前阶段必须按铁律收束:virtual HAL 成果只作为 sim config promotion 证据基础; +`L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS` 仍保持 hard block,不做解锁。 +本文件中的 WASM + OPFS tool DB 解锁路线只能作为后续专门 milestone 使用,不能用于 +当前 baseline promotion。 + +一、结论 + +可以实现“项目定义下的完全解锁”,但不能通过浏览器原生 spawn LinuxCNC native process +的方式实现。 + +更准确地说: + +```text +如果“完全解锁”要求浏览器直接启动 native linuxcnc/milltask/halcmd/DB_PROGRAM 进程, +答案是不可以。 + +如果“完全解锁”定义为:在 WASM + OPFS 中保留 LinuxCNC-owned tool DB protocol、 +执行配置声明的 DB_PROGRAM 行为、持久化 DB state、并通过 native/WASM/browser/release +proof chain 证明行为等价,答案是可以。 +``` + +因此可行路线不是 `.tbl` fallback,也不是 JS 手写 tool semantics,而是: + +```text +WASM 内运行 LinuxCNC tooldata DB protocol owner + WASM/Worker 隔离的 DB_PROGRAM runtime + +OPFS-backed flat-file persistence + source-derived proof gates。 +``` + +二、必须保持的语义边界 + +`axis/db_demo/base.ngc` 的 LinuxCNC-owned 行为来自: + +- `db_nonran.ini` 中的 `DB_PROGRAM = ./db_nonran.py`; +- LinuxCNC task/tooldata DB mode; +- `tooldata_db.cc` 的 DB process protocol; +- `tooldb.py` 的 protocol loop; +- `db.py` / `db_nonran.py` 的 callback/state behavior; +- flat-file database persistence。 + +WASM + OPFS 解锁时必须保持: + +- `v2.1` startup handshake; +- `g` get-all until `FINI`; +- `l` spindle load notify; +- `u` spindle unload notify; +- `p` tool offset notify; +- nonrandom `T10..T19` startup state; +- DB file persistence; +- `DB_PROGRAM` 是配置声明的 runtime dependency; +- `.tbl` fallback 仍然标记为 insufficient。 + +三、浏览器环境限制 + +浏览器/WASM 环境天然缺少: + +- native process spawn; +- LinuxCNC host daemon/process model; +- direct `milltask` process; +- direct `halcmd` host process; +- unrestricted POSIX filesystem。 + +但浏览器/WASM 环境具备: + +- WASM module execution; +- Web Worker 隔离执行单元; +- MessageChannel / stream-style protocol; +- OPFS 持久文件系统; +- Emscripten FS 与 OPFS bridge; +- 可移植 Python/WASM runtime 选项; +- release/browser diagnostics artifact。 + +所以解锁方法必须把 native process boundary 改写为“协议等价 boundary”,而不是假装浏览器 +可以直接运行 native child process。 + +四、推荐总体架构 + +### 1. Tool DB protocol owner 仍在 LinuxCNC/WASM core + +将 LinuxCNC tooldata DB protocol owner 保持在 C/C++ WASM 侧: + +- 复用/移植 `tooldata_db.cc`; +- 复用/移植 `tooldata_common.cc`; +- 保留 protocol message 生成与解析; +- 只把 process I/O edge 抽象为 host adapter。 + +建议新增抽象: + +```text +ToolDbProcessPort +``` + +职责: + +- start configured DB program; +- write protocol line; +- read reply line; +- close / cleanup; +- expose protocol transcript for diagnostics。 + +不允许职责: + +- 自行解释 tool table; +- 自行构造 `T10..T19`; +- 跳过 `tooldb.py`; +- 用 `.tbl` fallback。 + +### 2. DB_PROGRAM 在 Web Worker / WASM Python runtime 中运行 + +推荐把 `db_nonran.py` 放进独立 Web Worker,使用 WASM Python runtime 执行。 + +可选实现: + +- CPython/WASM; +- Pyodide; +- 项目内裁剪 Python/WASM runtime; +- 后续若项目已有 Python-remap runtime,可复用同一个 Python runtime substrate。 + +Worker 内需要挂载: + +- `db_nonran.py`; +- `db.py`; +- `tooldb.py`; +- minimal `linuxcnc` Python compatibility module; +- OPFS-backed DB flat file。 + +这里的 minimal `linuxcnc` module 只能覆盖 DB demo 必需的 integration surface,例如: + +- `linuxcnc.command().load_tool_table` + +并且必须作为 process integration shim 记录,不允许承载 tool semantics。 + +### 3. OPFS 负责 DB persistence + +将 DB demo 的 flat-file database 映射到 OPFS,例如: + +```text +/machines//tool-db/db_nonran_file +``` + +要求: + +- startup 前可加载已有 OPFS DB file; +- protocol mutation 后写回 OPFS; +- reload session 后 DB state 保持; +- diagnostics artifact 导出 DB file hash / state summary / transcript hash; +- tests 能验证 persistence roundtrip。 + +### 4. Browser diagnostics 只证明,不伪装 + +browser UI / diagnostics 需要记录: + +- DB runtime mode:`wasm-tool-db-protocol-worker`; +- DB program path; +- protocol transcript; +- OPFS DB file path; +- source files; +- `.tbl fallback sufficient = false`; +- Python-only sufficient = false; +- native proof status; +- WASM proof status; +- browser proof status。 + +五、分阶段实施路线 + +### Phase 0:保持当前 lock,不改 baseline + +当前状态仍是: + +```text +axis/db_demo/base.ngc SKIP L4-TOOL-DB +executed=28 +passed=28 +skipped=131 +unexpected_fail=0 +``` + +先不要改成 PASS。 + +保留: + +- `promotion_allowed=0` +- `execution_enabled=0` +- `promotion_lock_active=1` + +### Phase 1:native proof 先闭环 + +目的:证明 source-derived protocol contract 与真实 LinuxCNC DB runtime 一致。 + +在完整 LinuxCNC host runtime 中执行: + +```text +wasm-port/tests/native/probe_tool_db_runtime.sh +ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh +``` + +目标输出: + +```text +tool_db_runtime_probe_status=runtime_protocol_probe_passed +``` + +然后刷新: + +```text +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +``` + +预期 artifact 转为: + +```text +source_proof_ready=1 +runtime_ready=1 +native_evidence_ready=1 +gate_status=native_probe_passed_waiting_for_node_browser_promotion_proof +promotion_allowed=0 +``` + +### Phase 2:设计 WASM tool DB process port + +新增 C/C++ 或 JS/WASM bridge 层,但协议 owner 必须保留 LinuxCNC source-derived 逻辑。 + +建议新增文件范围: + +```text +wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tool_db_process_port.* +wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tool_db_protocol_harness.* +wasm-port/runtime/sdk/src/linuxcnc-tool-db.js +wasm-port/runtime/opfs/linuxcnc-tool-db-store.js +``` + +核心 API 草案: + +```text +createLinuxCncToolDbRuntime({ + dbProgramPath, + sourceFiles, + opfsRoot, + pythonRuntime, +}) + +startToolDbProgram() +sendToolDbProtocolMessage(line) +readToolDbProtocolReply() +runToolDbTransactionPlan(plan) +exportToolDbDiagnostics() +``` + +验证要求: + +- API 返回 protocol transcript; +- transcript 包含 `v2.1` / `g` / `FINI` / `l` / `p` / `u`; +- DB state 不能来自 JS fixture hardcode; +- source file hash 必须可追踪。 + +### Phase 3:WASM Python / DB_PROGRAM runtime + +新增或接入 Python/WASM runtime。 + +最低目标不是完整 Python remap runtime,而是 tool DB demo runtime: + +- 能 import `tooldb.py`; +- 能 import `db.py` / `db_nonran.py`; +- 能读写 OPFS-backed DB file; +- 能通过 stdin/stdout 或 MessageChannel 模拟 process protocol; +- 能提供 minimal `linuxcnc.command().load_tool_table` integration shim。 + +必须新增 negative tests: + +- 没有 `db_nonran.py` 时 fail; +- 没有 `tooldb.py` 时 fail; +- 只有 `python3` / Python runtime 但没有 protocol transcript 时 fail; +- 使用 `.tbl` fallback 时 fail; +- JS 直接返回 `T10..T19` 而没有 DB_PROGRAM transcript 时 fail。 + +### Phase 4:WASM protocol transaction tests + +新增 Node/WASM tests,先不改 full inventory baseline。 + +建议新增: + +```text +wasm-port/tests/wasm/node/verify_tool_db_process_wasm.sh +wasm-port/tests/wasm/node/verify_tool_db_process_wasm.mjs +``` + +测试内容: + +1. stage `db_nonran.ini` / `db_nonran.py` / `db.py` / `tooldb.py`; +2. start WASM DB program runtime; +3. verify startup `v2.1`; +4. send `g` and verify `T10..T19` plus `FINI`; +5. send `l` load notify and verify pocket/spindle state; +6. send `p` offset/update notify and verify DB mutation; +7. send `u` unload notify and verify unload state; +8. persist to OPFS-backed store; +9. reload and verify state survives; +10. export transcript artifact。 + +输出建议: + +```text +tool_db_process_wasm_protocol=ok +tool_db_process_wasm_persistence=ok +tool_db_process_wasm_no_tbl_fallback=ok +``` + +### Phase 5:接入 inventory pre-promotion artifacts + +在不改 baseline 的前提下,新增或扩展 artifact: + +```text +tool-db-process-wasm-protocol-proof.tsv +tool-db-process-opfs-persistence-proof.tsv +tool-db-process-browser-proof-gate.tsv +``` + +字段建议: + +- path; +- ini; +- db_program; +- protocol_transcript_hash; +- opfs_db_file; +- startup_handshake_passed; +- get_all_passed; +- load_notify_passed; +- offset_notify_passed; +- unload_notify_passed; +- persistence_passed; +- tbl_fallback_sufficient; +- python_only_sufficient; +- source_derived; +- execution_enabled; +- promotion_allowed。 + +在这一阶段: + +```text +execution_enabled=0 +promotion_allowed=0 +``` + +仍保持 lock。 + +### Phase 6:Browser proof + +新增 browser proof,但只证明 protocol runtime 和 OPFS persistence,不直接宣称 inventory pass。 + +建议新增或扩展: + +```text +wasm-port/tests/browser/verify_real_simulation_browser.sh +wasm-port/tests/browser/real_simulation_page_smoke.html +``` + +验证: + +- browser 可以启动 tool DB Worker; +- browser diagnostics 包含 DB protocol transcript summary; +- OPFS persistence roundtrip 成功; +- `.tbl fallback sufficient=false`; +- `python_only_sufficient=false`; +- release artifact URL workflow 能显示 tool DB proof; +- missing DB proof negative fixture 会 fail。 + +### Phase 7:关闭 promotion lock 前的三方对齐 + +只有以下全部满足,才能准备关闭 lock: + +```text +native_db_process_protocol_probe_passed=1 +wasm_tool_db_protocol_passed=1 +browser_tool_db_protocol_proof_passed=1 +opfs_persistence_passed=1 +tbl_fallback_sufficient=0 +python_only_sufficient=0 +source_derived=1 +``` + +更新: + +```text +runtime-boundary-promotion-readiness.tsv +runtime-boundary-promotion-blockers.tsv +runtime-boundary-post-native-pass-gates.tsv +runtime-boundary-native-evidence-acceptance-gate.tsv +blocked-runtime-promotion-lock.tsv +promotion-candidates.tsv +``` + +目标状态: + +```text +native_evidence_ready=1 +node_inventory_gate_complete=1 +browser_smoke_gate_complete=1 +promotion_lock_active=0 +promotion_ready=1 +promotion_allowed=1 +``` + +### Phase 8:正式 inventory baseline promotion + +更新 `verify_sim_configs_inventory_wasm.mjs`,允许 `axis/db_demo/base.ngc` 走 tool DB +protocol execution path。 + +要求: + +- 执行时必须通过 WASM tool DB protocol runtime; +- 不能直接使用 `.tbl`; +- 失败时不能降级为 SKIP; +- protocol proof 缺失时必须 FAIL,而不是 silent fallback。 + +预期 `summary.tsv`: + +```text +axis/db_demo/base.ngc PASS - main PASS - +``` + +预期 baseline: + +```text +executed=29 +passed=29 +skipped=130 +unexpected_fail=0 +``` + +同步更新: + +```text +VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE +project release readiness fixture +coverage matrix Current Node inventory +compatibility validation current gate text +skip-summary expected count +promotion candidate expected status +release readiness artifact +batch acceptance artifact +``` + +六、可实现性的关键判断 + +### 可以实现的部分 + +1. WASM 内保存 LinuxCNC tool DB protocol owner。 +2. Web Worker 作为 DB_PROGRAM process boundary 等价层。 +3. WASM Python runtime 执行 `db_nonran.py` / `tooldb.py`。 +4. OPFS 保存 DB flat-file。 +5. Node/WASM/browser 三层 proof。 +6. release artifact 记录 proof chain。 +7. inventory baseline 从 `28/28/131/0` 推进到 `29/29/130/0`。 + +### 不应承诺的部分 + +1. 浏览器直接运行 native `milltask`。 +2. 浏览器直接运行 host `halcmd`。 +3. 浏览器直接 spawn OS child process。 +4. 不经 Python DB program 而直接伪造 DB state。 +5. 用 `.tbl` 替代 `DB_PROGRAM`。 + +七、推荐实施顺序 + +最务实顺序: + +```text +1. 先在 native host 上跑通 ENABLE_TOOL_DB_RUNTIME_PROBE=1。 +2. 加 tool DB WASM protocol proof,不改 baseline。 +3. 加 OPFS persistence proof,不改 baseline。 +4. 加 browser diagnostics proof,不改 baseline。 +5. 更新 promotion readiness / lock。 +6. 最后才把 axis/db_demo/base.ngc 纳入 inventory PASS。 +``` + +八、最小验证命令 + +native: + +```text +wasm-port/tests/native/probe_tool_db_runtime.sh +ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh +``` + +WASM/Node: + +```text +wasm-port/tests/wasm/node/verify_tool_db_process_wasm.sh +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +``` + +Browser: + +```text +SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_real_simulation_browser.sh +``` + +Release: + +```text +wasm-port/tests/sdk/node/verify_sdk_surface.sh +wasm-port/tests/sdk/node/verify_project_release_gate_manifest.sh +wasm-port/tests/host/verify_project_release_readiness_artifact.sh +``` + +Safety: + +```text +git diff --check +wasm-port/tools/verify_no_standalone_cnc_semantics.sh +``` + +九、下一步工作内容 + +下一轮建议不要直接改 `axis/db_demo/base.ngc` 的 inventory status。先做最小可行 +WASM proof: + +```text +新增 verify_tool_db_process_wasm.mjs / .sh,证明 tool DB protocol transcript 和 OPFS +persistence 可以在 WASM + OPFS 环境中闭环,同时继续保持 promotion_allowed=0。 +``` + +该 proof 的完成标准: + +- `db_nonran.py` / `tooldb.py` 被真实加载; +- protocol transcript 中出现 `v2.1`、`g`、`FINI`、`l`、`p`、`u`; +- OPFS persistence roundtrip 通过; +- `.tbl fallback` negative fixture 失败; +- artifact 明确记录 `promotion_allowed=0`。 + +完成后再进入 browser proof 和 promotion lock 更新。 diff --git a/text22.txt b/text22.txt new file mode 100644 index 0000000..60a99d4 --- /dev/null +++ b/text22.txt @@ -0,0 +1,202 @@ +项目接续文件:按铁律收束当前阶段 promotion 工作 + +生成时间:2026-06-18 CST + +本文件接替 `text19.txt`,并对 `text20.txt` / `text21.txt` 做范围收束。当前阶段铁律为: + +```text +virtual HAL 成果作为 sim config promotion 证据基础; +同时明确不解锁 Python remap / tool DB / external user-M 这些 hard block。 +``` + +一、当前阶段完成定义 + +当前阶段要完成的是 evidence-based promotion,不是 hard-block runtime 解锁。 + +允许做: + +- 复用 virtual HAL source compliance; +- 复用 virtual HAL sim-config source coverage; +- 复用 virtual HAL promotion candidate report; +- 复用 macro/load fixture report; +- 复用 command script fixture report; +- 复用 manifest-backed motion controller matrix; +- 复用 browser diagnostics artifact; +- 复用 release readiness / URL workflow / batch acceptance evidence; +- 生成并维护 `promotion-candidates.tsv`,把候选分为: + - `evidence-ready`; + - `inventory-ready`。 + +禁止做: + +- 不新增 virtual HAL runtime capability; +- 不用 virtual HAL 替代 LinuxCNC CNC 语义; +- 不用 JS/browser glue 解锁 Python remap; +- 不用 JS/browser glue 解锁 tool DB; +- 不用 JS/browser glue 解锁 external user-M process; +- 不把 `.tbl` fallback 当作 tool DB pass; +- 不把 macro/load asset 当 standalone main program; +- 不靠改 docs 声称 skipped 下降。 + +二、当前 hard block 状态 + +以下 hard block 在当前阶段必须保持 locked: + +```text +L4-PYTHON-REMAP +L4-TOOL-DB +L4-USER-M-PROCESS +UPSTREAM-DEMO +standalone-main 语境下的 ASSET-ONLY +``` + +当前 skip/block summary 仍保持: + +```text +ASSET-ONLY=65 +L4-PYTHON-REMAP=53 +L4-TOOL-DB=1 +L4-USER-M-PROCESS=1 +NON_MAIN_CLASS=10 +UPSTREAM-DEMO=1 +``` + +三、当前 baseline 必须保持 + +当前阶段完成后,Node inventory baseline 仍应为: + +```text +executed=28 +passed=28 +skipped=131 +unexpected_fail=0 +``` + +这不是失败,而是当前铁律下的正确结果:virtual HAL 已把一批可用 sim config row 推进到 +browser diagnostics / release evidence 层,但没有解锁 hard runtime family。 + +四、当前已完成的 evidence-ready promotion + +`promotion-candidates.tsv` 中必须包含以下 `evidence-ready` rows: + +- `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` + +这些 rows 的语义: + +```text +current_status=PASS +skip_kind=- +matrix_layer4_node=INV +matrix_layer4_browser=- +blocked_kind=- +virtual_hal_evidence_ready=1 +promotion_allowed=0 +block_reason=browser_release_evidence_ready_inventory_baseline_unchanged +``` + +`promotion_allowed=0` 是有意的:这些 row 已有 browser/release evidence,但不代表 +inventory baseline 发生变化。 + +五、当前 inventory-ready hard block rows + +`promotion-candidates.tsv` 中也会列出 `inventory-ready` 类型的 skipped main rows。 +这些行用于后续分析,不代表当前可解锁。 + +当前直接 inventory promotion 必须保持: + +```text +promotion_allowed=0 +``` + +原因: + +- `L4-PYTHON-REMAP` 需要 LinuxCNC Python remap runtime; +- `L4-TOOL-DB` 需要 tool database process protocol proof; +- `L4-USER-M-PROCESS` 需要 external user-M process state proof; +- `UPSTREAM-DEMO` 是 preserved upstream demo edge。 + +六、text20 / text21 的范围解释 + +`text20.txt` 和 `text21.txt` 只作为未来解锁研究记录: + +- `text20.txt`:future tool DB native/runtime 解锁步骤; +- `text21.txt`:future WASM + OPFS tool DB feasibility architecture。 + +它们不改变当前阶段铁律,不允许在当前阶段据此把 `L4-TOOL-DB` 解锁。 + +当前阶段若引用 `text20.txt` / `text21.txt`,只能作为: + +- future milestone planning; +- risk analysis; +- architecture note; +- blocked family proof requirement。 + +不能作为: + +- 当前 baseline promotion 依据; +- 当前 release ready 的解锁依据; +- 当前 browser diagnostics positive pass 的替代证据。 + +七、当前阶段验收标准 + +当前阶段完成需要满足: + +1. `promotion-candidates.tsv` 存在; +2. `promotion-candidates.tsv` 同时包含 `evidence-ready` 和 `inventory-ready` 两层; +3. `evidence-ready` rows 绑定 virtual HAL source-derived browser/release evidence; +4. `inventory-ready` hard block rows 仍 `promotion_allowed=0`; +5. baseline 保持 `28/28/131/0`; +6. `L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS` 仍 locked; +7. docs 明确 artifact count 和 candidate report; +8. release / SDK gate 仍要求 virtual HAL promotion candidate summary; +9. 不新增 virtual HAL runtime capability; +10. 不新增 JS-owned CNC semantics。 + +八、已验证命令 + +当前阶段最小验证命令: + +```text +git diff --check +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh +wasm-port/tests/sdk/node/verify_sdk_surface.sh +wasm-port/tests/sdk/node/verify_project_release_gate_manifest.sh +``` + +预期 inventory 输出: + +```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=ok +``` + +九、下一步建议 + +下一步不要直接解锁 hard block。按当前铁律,优先做: + +1. 扩展 `evidence-ready` browser diagnostics 展示; +2. 强化 release URL workflow 对 promotion candidate summary 的可见性; +3. 对 `blocked=-`、native `PASS`、class `main` 的非 hard-block family 继续找可真实 promotion row; +4. 对 Python remap / tool DB / external user-M 只维护 proof requirement 和 lock artifact; +5. 如果要解锁 tool DB、Python remap 或 external user-M,必须另开 milestone,不能混入当前阶段。 + +十、简要结论 + +当前阶段已经按铁律完成: + +```text +virtual HAL 成果作为 sim config promotion 证据基础; +Python remap / tool DB / external user-M hard block 不解锁; +baseline 保持 28/28/131/0; +promotion candidates 进入双层 evidence-ready / inventory-ready 管理。 +``` diff --git a/wasm-port/docs/compatibility-validation.md b/wasm-port/docs/compatibility-validation.md index fa646de..db6fcbd 100644 --- a/wasm-port/docs/compatibility-validation.md +++ b/wasm-port/docs/compatibility-validation.md @@ -204,6 +204,7 @@ wasm-port/build/wasm/sim-configs-inventory/boundary-phase-completion-summary.tsv wasm-port/build/wasm/sim-configs-inventory/native-proof-alignment-summary.tsv wasm-port/build/wasm/sim-configs-inventory/runtime-boundary-native-alignment-summary.tsv wasm-port/build/wasm/sim-configs-inventory/native-runtime-probe-execution-plan.tsv +wasm-port/build/wasm/sim-configs-inventory/promotion-candidates.tsv wasm-port/build/wasm/sim-configs-inventory/blocked-runtime-promotion-lock.tsv wasm-port/build/wasm/sim-configs-inventory/next-boundary-worklist.tsv wasm-port/build/wasm/sim-configs-inventory/next-boundary-recommendations.tsv @@ -230,6 +231,13 @@ skip counts fail on blocked-policy drift. For eligible rows, missing vendored machine context is an inventory failure, not an expected skip; blocked rows must be classified by runtime dependency before the Node inventory filter runs. +`promotion-candidates.tsv` records two promotion layers: `evidence-ready` +rows whose existing virtual HAL source-derived browser/release evidence is +ready while the Node inventory baseline remains unchanged, and +`inventory-ready` skipped main-program rows that could affect the Node +inventory baseline. The current direct inventory `promotion_allowed=1` count +is zero: all skipped main rows are still hard-blocked by `L4-PYTHON-REMAP`, +`L4-TOOL-DB`, `L4-USER-M-PROCESS`, or preserved as `UPSTREAM-DEMO`. `boundary-summary.tsv` records one row per native inventory path with the matrix blocked kind, SDK classifier recommendation, declared HAL/UI/HALUI/Python process dependencies, `[EMCIO]DB_PROGRAM`, user-M execution codes, and the @@ -385,10 +393,10 @@ coverage: every TSV emitted under `full-process-boundary-design.md`. New gate artifacts must therefore be documented before the inventory can pass. The Node coverage gate also requires the generated WASM inventory artifact list -to remain the exact duplicate-free 54-entry baseline and the native generated +to remain the exact duplicate-free 55-entry baseline and the native generated TSV token list to remain the exact duplicate-free 8-token baseline. It also requires the corresponding `boundary-phase-completion-summary.tsv` -documentation-coverage counts to remain `54` and `8`, respectively. It also +documentation-coverage counts to remain `55` and `8`, respectively. It also checks that the browser smoke source lists the same generated WASM and native artifact tokens and preserves the same fixed-count, duplicate-free, fetchability/header, documentation-missing, and completion count-parity guards diff --git a/wasm-port/docs/sim-config-coverage-promotion-analysis.md b/wasm-port/docs/sim-config-coverage-promotion-analysis.md index 457637f..038a48b 100644 --- a/wasm-port/docs/sim-config-coverage-promotion-analysis.md +++ b/wasm-port/docs/sim-config-coverage-promotion-analysis.md @@ -281,6 +281,336 @@ HAL from accidentally unlocking Python UI or Python remap families. The next practical slice is to add a machine-readable candidate audit for other UI-family macro/load rows before promoting any new positive fixture. +## 2026-06-18 UI-Family Macro/Load Candidate Audit + +The macro/load report now carries audit rows for UI-family fixture candidates +that are not ready for positive promotion: + +- `gscreen/industrial_lathe_wear/toolchange.ngc` +- `qtvcp_screens/industrial_lathe_wear/toolchange.ngc` + +Both rows are recorded as `blocked-missing-owning-ini` audit candidates with +`promotionAllowed === false`. They must remain excluded from positive +macro/load fixtures until the owning INI, machine files, tool table, and +UI/process declaration have LinuxCNC source evidence that does not require +Python UI process emulation. + +Release diagnostics validation now requires `auditPromotionViolations` to stay +empty and requires both audit rows to be present as negative evidence. This is +an audit gate, not a coverage promotion: inventory baseline remains unchanged. + +## 2026-06-18 UI-Family Audit Boundary Evidence + +The UI-family audit rows now carry machine-readable source evidence from the +generated inventory boundary artifacts: + +- `wasm-port/build/wasm/sim-configs-inventory/boundary-summary.tsv` +- `wasm-port/build/wasm/sim-configs-inventory/ini-boundary-summary.tsv` + +For both industrial-lathe `toolchange.ngc` rows, the audit evidence requires +`recommendedBlocked === "UNAVAILABLE"` and a `missing_vendored_ini:*` +dependency for the owning INI. The INI-level row must also report +`vendored === 0` and `reportAvailable === 0`. + +The macro/load fixture report now exposes: + +- `missingAuditRows` +- `auditBoundaryEvidenceViolations` +- `auditPromotionAllowedViolations` + +Release diagnostics validation requires all of those lists to stay empty. This +adds negative coverage for three failure modes: audit rows missing, audit rows +accidentally promoted into positive fixtures, and `promotionAllowed === true` +without generated boundary/source proof. + +## 2026-06-18 SilverDragon Blocked Boundary Evidence + +The blocked macro/load fixture rows now use the same generated boundary +evidence contract. `gscreen/silverdragon/macros/tool_sensor.ngc` carries +evidence from `boundary-summary.tsv` and `ini-boundary-summary.tsv` showing +that the owning `gscreen/silverdragon/silverdragon.ini` is unavailable in the +vendored inventory. + +The report now exposes `blockedBoundaryEvidenceViolations`, and release +diagnostics validation requires it to stay empty. This keeps the SilverDragon +row as a blocked negative fixture with source-derived evidence, not a virtual +HAL promotion path. + +## 2026-06-18 Queuebuster Declaration Evidence + +The declared-only `axis/external_offsets/queuebuster.ngc` fixture now carries +declaration-level evidence from `eoffsets.ini`. The fixture report requires the +owning INI to expose: + +- section: `DISPLAY` +- key: `NGCGUI_SUBFILE` +- value: `queuebuster.ngc` +- source line: `NGCGUI_SUBFILE = queuebuster.ngc` + +This keeps `queuebuster.ngc` as a non-main fixture path declared by LinuxCNC +configuration, not a standalone browser main program. Release diagnostics +validation now requires `declarationEvidenceViolations` to stay empty. + +## 2026-06-18 Rose Engine Declaration Evidence + +The positive `axis/rose_engine/rcone.ngc` non-main fixture now carries the same +declaration-level evidence contract as queuebuster. `rose_engine.ini` declares +the fixture with `NGCGUI_SUBFILE = rcone.ngc`, and the macro/load report now +requires every positive fixture with a `declarationSource` to carry matching +source evidence. + +This keeps `rcone.ngc` as a LinuxCNC-declared macro/load support asset paired +with `rcone_demo.ngc`, not a standalone browser main program. The evidence is +limited to the owning INI declaration and does not add browser-owned G-code, +interpreter, planner, or remap behavior. + +## 2026-06-18 Boundary Evidence Freshness Gate + +Generated boundary evidence for blocked and audit-only macro/load rows now +carries an inventory `baselineSummary`. The macro/load report requires that +summary to match the current generated inventory baseline: + +```text +executed=28 +passed=28 +skipped=131 +unexpectedFail=0 +``` + +This makes `boundary-summary.tsv` and `ini-boundary-summary.tsv` evidence +explicitly tied to the current inventory baseline. A stale baseline now fails +the blocked/audit boundary evidence gate instead of silently passing release +diagnostics. + +## 2026-06-18 Promotion Family URL Workflow Summary + +The release readiness validation and URL workflow summaries now surface the +promotion candidate `familyRows` as a user-visible summary. Ready artifacts +show: + +```text +qtdragon-on-abort: 6/6 ready; vismach-remap-sims: 1/1 ready; rose-engine-rcone-demo: 1/1 ready +``` + +The ini-panel workflow overview URL summary reuses this value, so the +QtDragon, PUMA, and rose-engine promotion families are visible without opening +the raw diagnostics JSON. This is a presentation/reporting change only; it +does not change inventory counts or CNC semantics. + +## 2026-06-18 Structured Promotion Family Rows + +The promotion family summary is now also exposed as structured rows. Each row +records the family id, candidate count, complete count, source file count, and +explicit browser diagnostics readiness. Current rows are: + +```text +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 +``` + +The release readiness artifact, validation summary, URL workflow summary, and +ini-panel workflow overview all expose these rows. This keeps the summary +machine-readable while preserving the existing single-line text summary. + +## 2026-06-18 Boundary Evidence Artifact Hash Gate + +Generated boundary evidence now includes SHA-256 hashes for the two source TSV +artifacts used by blocked and audit macro/load evidence: + +```text +boundary-summary.tsv de6cf57b7c07182e3bcb32e22dbdf202b618cabc14620d6dff1ef815587950b9 +ini-boundary-summary.tsv b0afe27224e97a82fbecbbd75a7c86233c98fe957d9c1ba20f0656f8745a5eae +``` + +The macro/load report and release validation require those hashes to match. +This extends the freshness gate beyond inventory counts and makes stale or +substituted boundary TSV evidence fail the release diagnostics gate. + +## 2026-06-18 Browser Promotion Family DOM Rows + +The real browser simulation page now renders the structured promotion family +rows in the diagnostics panel. The visible browser DOM exposes: + +```text +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 +``` + +The browser API also exposes `getVirtualHalPromotionFamilyRows()`, and the real +simulation browser smoke asserts that the DOM rows, readiness dataset, and +candidate report agree. This moves the existing source-derived promotion +evidence from view-model/report data into a visible browser diagnostics surface. +It does not change inventory counts or add CNC semantics. + +## 2026-06-18 Fast Follow: Hash Tool And INI Panel Promotion DOM + +The boundary TSV hash freshness gate now has an update/check helper: + +```bash +wasm-port/tools/update_sim_config_boundary_hashes.sh --check +wasm-port/tools/update_sim_config_boundary_hashes.sh --write +``` + +The script computes SHA-256 for `boundary-summary.tsv` and +`ini-boundary-summary.tsv`, then checks or updates the SDK/release validation +constants. This removes the manual hash-update step after generated inventory +artifacts change. + +The ini-panel workflow overview now also has a dedicated promotion family DOM +surface. It can render and mount the three structured promotion rows from the +release URL workflow summary into `[data-workflow-overview-promotion-family-rows]`. +The UI shell smoke verifies the rows mount as ready with the expected QtDragon, +PUMA, and rose-engine values. + +## 2026-06-18 Promotion Family Source Drilldown + +Promotion family rows now carry their LinuxCNC source file lists through the +release readiness report, validation summary, URL workflow summary, and +ini-panel workflow overview render state. The ini-panel promotion family DOM +mount renders the three family rows plus per-family source-file drilldown rows. + +Current drilldown count is 17 source files: + +```text +qtdragon-on-abort: 12 source files +vismach-remap-sims: 3 source files +rose-engine-rcone-demo: 2 source files +``` + +This makes the browser/ini-panel evidence inspectable without opening the raw +JSON artifact, while keeping the underlying behavior LinuxCNC-source-derived. + +## 2026-06-18 Promotion Family Source Status + +Each ini-panel promotion family source drilldown row now carries source status +metadata: + +- `ini` for LinuxCNC INI machine files; +- `gcode` for `.ngc` main/on-abort programs; +- `remap-subroutine` for files under `remap_subs` or `nc_subroutines`; +- `manifest-backed` for rows already carried by the source-derived promotion + evidence. + +The DOM render adds dataset fields for source kind, manifest-backed state, and +source status, so the UI can distinguish machine config, G-code, and remap +support evidence without changing any CNC semantics. + +## 2026-06-18 Promotion Family Source Kind Counts + +The ini-panel promotion family render state now aggregates source-kind counts +per family and exposes them in the family row DOM dataset. Current counts are: + +```text +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 +``` + +The family row display includes this summary, while the per-source drilldown +rows still expose individual source kind and manifest-backed status. + +## 2026-06-18 Promotion Family Source Filter View Model + +The ini-panel workflow overview now exposes a promotion family source filter +view-model. It can filter the existing source drilldown by `all`, `ini`, +`gcode`, `remap-subroutine`, or `source`, while preserving family grouping and +source-kind counts. + +Current filter totals are: + +```text +all=17 +ini=8 +gcode=8 +remap-subroutine=1 +``` + +The `remap-subroutine` filter currently resolves to the PUMA remap evidence +row: + +```text +linuxcnc/configs/sim/axis/vismach/puma/remap_subs/428remap.ngc +``` + +This is a browser/UI evidence navigation helper only. It does not change the +promotion candidate set, inventory baseline, or CNC runtime semantics. + +## 2026-06-18 Promotion Family Source Family Filter + +The source filter view-model now supports a second selector: `familyId`. This +allows UI callers to scope source evidence by promotion family and then filter +within that family by source kind. + +Current family filter totals are: + +```text +all=17 +qtdragon-on-abort=12 +vismach-remap-sims=3 +rose-engine-rcone-demo=2 +``` + +For example, selecting `virtual-hal-promotion-family-qtdragon-on-abort` with +`gcode` returns 6 QtDragon `.ngc` source rows from the 12-file family scope. +The selector is a view-model feature only; it does not promote additional sim +config rows or relax any blocked runtime family. + +## 2026-06-18 Promotion Family Source Filter DOM Surface + +The source filter view-model now has a dedicated DOM contract, readiness check, +render helper, and mount helper. The DOM surface renders: + +- family filter rows; +- source-kind filter rows; +- filtered source evidence rows; +- selected family/source-kind dataset fields on the mount node. + +The QtDragon + `gcode` combination currently renders 13 DOM rows: 7 filter +rows and 6 filtered source rows. This moves the combined evidence filter from a +view-model-only helper into a mountable ini-panel workflow overview surface. +It still only displays existing LinuxCNC-source-derived evidence. + +## 2026-06-18 Promotion Family Source Filter Selector Controls + +The source filter DOM surface now renders two selector controls in addition to +the diagnostic rows: + +- a family selector backed by `familyFilters`; +- a source-kind selector backed by `sourceKindFilters`. + +For the QtDragon + `gcode` example, the controls expose the selected family +`virtual-hal-promotion-family-qtdragon-on-abort` and selected source kind +`gcode`, with the `gcode` option carrying count `6`. The selectors currently +render selection state and option metadata for browser integration; they do not +change the underlying promotion evidence or add CNC semantics. + +## 2026-06-18 Promotion Family Source Filter Selection Workflow + +The selector controls now have an action-plan and selection-change workflow. +The workflow reads the current family/source-kind selector values, derives the +next source filter view-model, and can optionally re-render the source filter +DOM surface. + +The current smoke path changes from QtDragon + `gcode` to +`virtual-hal-promotion-family-rose-engine-rcone-demo` + `all`. That produces a +new view-model with 2 filtered source files from a 2-file family scope and +re-renders the DOM rows to include rose-engine source evidence. This is still a +host/UI workflow over existing source-derived evidence only. + +## 2026-06-18 Promotion Family Source Filter Event Binding + +The selector controls now have a reusable event binding helper. It binds the +family and source-kind `