From 091c4a3a66074c7e96cd9f1b62560696931e9890 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Fri, 12 Jun 2026 23:27:09 +0800 Subject: [PATCH] Guard sequence subroutine staging manifests --- text5.txt | 78 +++++++++++++++++++ wasm-port/tests/browser/interp_smoke.html | 30 +++++++ .../tests/wasm/node/verify_interp_wasm.mjs | 36 +++++++++ 3 files changed, 144 insertions(+) diff --git a/text5.txt b/text5.txt index 5f29498..d1693df 100644 --- a/text5.txt +++ b/text5.txt @@ -6633,3 +6633,81 @@ wasm-port/tests/host/verify_host_smokes.sh ```text Guard oword-unwind staging manifest ``` + +七十、2026-06-12 继续执行记录:sequence/nested subroutine staging manifest guard + +本轮继续当前 host 可执行路线。提交后轻量守门通过: + +```text +vendor sync up to date +standalone CNC semantics guard complete +``` + +当前 host 仍缺 `halcmd`、`halrun`、`linuxcnc`、`milltask`,因此不执行任何 +`ENABLE_*_RUNTIME_PROBE=1` opt-in native probe。 + +1. 候选选择。 + +选择已有 Node/browser 执行覆盖、且依赖 `[RS274NGC]SUBROUTINE_PATH` staging 的 +两个 INI-context family: + +- `tests/interp/sequence-number` +- `tests/interp/nested-sub-error` + +这两个 family 不需要 HAL/task/tool DB/user-M process,只需要确认 staging helper +不会遗漏 INI subroutine 文件。 + +2. 覆盖对账。 + +`tests/interp/sequence-number` 当前 upstream `.ngc` 文件: + +```text +rm400.ngc +test.ngc +``` + +`tests/interp/nested-sub-error` 当前 upstream `.ngc` 文件: + +```text +subs/nested.ngc +test.ngc +``` + +3. 更新。 + +更新: + +- `wasm-port/tests/wasm/node/verify_interp_wasm.mjs` +- `wasm-port/tests/browser/interp_smoke.html` + +Node 新增: + +- `sequenceNumberNgcFiles` 固定 `rm400.ngc` 和 `test.ngc`; +- `nestedSubErrorNgcFiles` 固定 `subs/nested.ngc` 和 `test.ngc`; +- 分别与 `interpRegressionNgcFilesRecursive(...)` 精确对账; +- 检查 `stageInterpIniContext()` 返回的 `plan.files` 中 `.ngc` 文件集合与 + fixed list 一致。 + +Browser 新增: + +- fixed-count 和 duplicate-free guard; +- 检查 browser `stageInterpIniContext()` 返回的 `plan.files` 中 `.ngc` 文件集合 + 与 fixed list 一致; +- browser 仍不枚举目录。 + +4. 下一步工作建议。 + +先复跑: + +```bash +git diff --check +wasm-port/tests/wasm/node/verify_interp_wasm.sh +wasm-port/tests/browser/verify_interp_browser.sh +wasm-port/tests/host/verify_host_smokes.sh +``` + +如果通过,做小提交,建议 message: + +```text +Guard sequence subroutine staging manifests +``` diff --git a/wasm-port/tests/browser/interp_smoke.html b/wasm-port/tests/browser/interp_smoke.html index 33f4772..d78977f 100644 --- a/wasm-port/tests/browser/interp_smoke.html +++ b/wasm-port/tests/browser/interp_smoke.html @@ -7271,6 +7271,21 @@ ); const sequenceNumberPlan = await stageInterpIniContext(interp, "sequence-number"); + const sequenceNumberNgcFiles = [ + "rm400.ngc", + "test.ngc", + ]; + if (sequenceNumberNgcFiles.length !== 2 || new Set(sequenceNumberNgcFiles).size !== sequenceNumberNgcFiles.length) { + throw new Error("browser_interp_sequence_number_fixture_coverage: list drift"); + } + const sequenceNumberStagedNgcFiles = sequenceNumberPlan.files + .map((file) => file.sourceRel) + .filter((sourceRel) => sourceRel.endsWith(".ngc")) + .map((sourceRel) => sourceRel.replace("tests/interp/sequence-number/", "")) + .sort(); + if (sequenceNumberStagedNgcFiles.join(",") !== sequenceNumberNgcFiles.join(",")) { + throw new Error("browser_interp_sequence_number_staging_manifest: list drift"); + } verifyExpectedOutput( "browser_interp_sequence_number", interp.runFileWithIni( @@ -7289,6 +7304,21 @@ ); const nestedSubErrorPlan = await stageInterpIniContext(interp, "nested-sub-error"); + const nestedSubErrorNgcFiles = [ + "subs/nested.ngc", + "test.ngc", + ]; + if (nestedSubErrorNgcFiles.length !== 2 || new Set(nestedSubErrorNgcFiles).size !== nestedSubErrorNgcFiles.length) { + throw new Error("browser_interp_nested_sub_error_fixture_coverage: list drift"); + } + const nestedSubErrorStagedNgcFiles = nestedSubErrorPlan.files + .map((file) => file.sourceRel) + .filter((sourceRel) => sourceRel.endsWith(".ngc")) + .map((sourceRel) => sourceRel.replace("tests/interp/nested-sub-error/", "")) + .sort(); + if (nestedSubErrorStagedNgcFiles.join(",") !== nestedSubErrorNgcFiles.join(",")) { + throw new Error("browser_interp_nested_sub_error_staging_manifest: list drift"); + } verifyExpectedOutput( "browser_interp_nested_sub_error", interp.runFileWithIni( diff --git a/wasm-port/tests/wasm/node/verify_interp_wasm.mjs b/wasm-port/tests/wasm/node/verify_interp_wasm.mjs index 2f33749..33008c6 100644 --- a/wasm-port/tests/wasm/node/verify_interp_wasm.mjs +++ b/wasm-port/tests/wasm/node/verify_interp_wasm.mjs @@ -2169,6 +2169,24 @@ verifyExpectedOutput( ); const sequenceNumberPlan = stageInterpIniContext("sequence-number"); +const sequenceNumberNgcFiles = [ + "rm400.ngc", + "test.ngc", +]; +assert.deepEqual( + sequenceNumberNgcFiles, + interpRegressionNgcFilesRecursive("sequence-number"), + "interp sequence-number fixture coverage drift", +); +assert.deepEqual( + sequenceNumberPlan.files + .map((file) => file.sourceRel) + .filter((sourceRel) => sourceRel.endsWith(".ngc")) + .map((sourceRel) => sourceRel.replace("tests/interp/sequence-number/", "")) + .sort(), + sequenceNumberNgcFiles, + "interp sequence-number staging manifest drift", +); verifyExpectedOutput( "interp_sequence_number_wasm", interp.runFileWithIni( @@ -2187,6 +2205,24 @@ verifyExpectedOutput( ); const nestedSubErrorPlan = stageInterpIniContext("nested-sub-error"); +const nestedSubErrorNgcFiles = [ + "subs/nested.ngc", + "test.ngc", +]; +assert.deepEqual( + nestedSubErrorNgcFiles, + interpRegressionNgcFilesRecursive("nested-sub-error"), + "interp nested-sub-error fixture coverage drift", +); +assert.deepEqual( + nestedSubErrorPlan.files + .map((file) => file.sourceRel) + .filter((sourceRel) => sourceRel.endsWith(".ngc")) + .map((sourceRel) => sourceRel.replace("tests/interp/nested-sub-error/", "")) + .sort(), + nestedSubErrorNgcFiles, + "interp nested-sub-error staging manifest drift", +); verifyExpectedOutput( "interp_nested_sub_error_wasm", interp.runFileWithIni(