diff --git a/text5.txt b/text5.txt index 67e47f0..990266c 100644 --- a/text5.txt +++ b/text5.txt @@ -6452,3 +6452,72 @@ Guard g10 interpreter fixture coverage ``` 提交后再复跑同一组 gate。 + +六十七、2026-06-12 继续执行记录:INI 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 的 +两个 pure interpreter family: + +- `tests/interp/sub-call-from-sub` +- `tests/interp/nested-sub-in-file-error` + +这两个 family 不需要 HAL/task/tool DB/user-M process,只需要确认 staging helper +不会遗漏 INI subroutine 文件。 + +2. 更新。 + +更新: + +- `wasm-port/tests/wasm/node/verify_interp_wasm.mjs` +- `wasm-port/tests/browser/interp_smoke.html` + +Node 新增: + +- `subCallFromSubNgcFiles` 固定: + - `test.ngc` + - `subs/caller.ngc` + - `subs/helper.ngc` +- `nestedSubInFileErrorNgcFiles` 固定: + - `test.ngc` + - `subs/sequential.ngc` +- Node 对上述列表分别与 + `interpRegressionNgcFilesRecursive("sub-call-from-sub")` 和 + `interpRegressionNgcFilesRecursive("nested-sub-in-file-error")` 精确对账; +- Node 还检查 `stageInterpIniContext()` 返回的 `plan.files` 中 `.ngc` 文件集合 + 与上述列表一致。 + +Browser 新增: + +- 对上述两个 fixed list 做 count 和 duplicate-free guard; +- 检查 browser `stageInterpIniContext()` 返回的 `plan.files` 中 `.ngc` 文件集合 + 与 fixed list 一致; +- browser 仍不枚举目录。 + +3. 下一步工作建议。 + +先复跑: + +```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 INI subroutine staging manifests +``` diff --git a/wasm-port/tests/browser/interp_smoke.html b/wasm-port/tests/browser/interp_smoke.html index 9ab9ee1..740056f 100644 --- a/wasm-port/tests/browser/interp_smoke.html +++ b/wasm-port/tests/browser/interp_smoke.html @@ -7239,6 +7239,22 @@ ); const subCallFromSubPlan = await stageInterpIniContext(interp, "sub-call-from-sub"); + const subCallFromSubNgcFiles = [ + "subs/caller.ngc", + "subs/helper.ngc", + "test.ngc", + ]; + if (subCallFromSubNgcFiles.length !== 3 || new Set(subCallFromSubNgcFiles).size !== subCallFromSubNgcFiles.length) { + throw new Error("browser_interp_sub_call_from_sub_fixture_coverage: list drift"); + } + const subCallFromSubStagedNgcFiles = subCallFromSubPlan.files + .map((file) => file.sourceRel) + .filter((sourceRel) => sourceRel.endsWith(".ngc")) + .map((sourceRel) => sourceRel.replace("tests/interp/sub-call-from-sub/", "")) + .sort(); + if (subCallFromSubStagedNgcFiles.join(",") !== subCallFromSubNgcFiles.join(",")) { + throw new Error("browser_interp_sub_call_from_sub_staging_manifest: list drift"); + } verifyExpectedOutput( "browser_interp_sub_call_from_sub", interp.runFileWithIni( @@ -7294,6 +7310,21 @@ interp, "nested-sub-in-file-error", ); + const nestedSubInFileErrorNgcFiles = [ + "subs/sequential.ngc", + "test.ngc", + ]; + if (nestedSubInFileErrorNgcFiles.length !== 2 || new Set(nestedSubInFileErrorNgcFiles).size !== nestedSubInFileErrorNgcFiles.length) { + throw new Error("browser_interp_nested_sub_in_file_error_fixture_coverage: list drift"); + } + const nestedSubInFileErrorStagedNgcFiles = nestedSubInFileErrorPlan.files + .map((file) => file.sourceRel) + .filter((sourceRel) => sourceRel.endsWith(".ngc")) + .map((sourceRel) => sourceRel.replace("tests/interp/nested-sub-in-file-error/", "")) + .sort(); + if (nestedSubInFileErrorStagedNgcFiles.join(",") !== nestedSubInFileErrorNgcFiles.join(",")) { + throw new Error("browser_interp_nested_sub_in_file_error_staging_manifest: list drift"); + } verifyExpectedOutput( "browser_interp_nested_sub_in_file_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 3295b85..48c7f3d 100644 --- a/wasm-port/tests/wasm/node/verify_interp_wasm.mjs +++ b/wasm-port/tests/wasm/node/verify_interp_wasm.mjs @@ -2134,6 +2134,25 @@ verifyExpectedOutput( ); const subCallFromSubPlan = stageInterpIniContext("sub-call-from-sub"); +const subCallFromSubNgcFiles = [ + "subs/caller.ngc", + "subs/helper.ngc", + "test.ngc", +]; +assert.deepEqual( + subCallFromSubNgcFiles, + interpRegressionNgcFilesRecursive("sub-call-from-sub"), + "interp sub-call-from-sub fixture coverage drift", +); +assert.deepEqual( + subCallFromSubPlan.files + .map((file) => file.sourceRel) + .filter((sourceRel) => sourceRel.endsWith(".ngc")) + .map((sourceRel) => sourceRel.replace("tests/interp/sub-call-from-sub/", "")) + .sort(), + subCallFromSubNgcFiles, + "interp sub-call-from-sub staging manifest drift", +); verifyExpectedOutput( "interp_sub_call_from_sub_wasm", interp.runFileWithIni( @@ -2186,6 +2205,24 @@ verifyExpectedOutput( ); const nestedSubInFileErrorPlan = stageInterpIniContext("nested-sub-in-file-error"); +const nestedSubInFileErrorNgcFiles = [ + "subs/sequential.ngc", + "test.ngc", +]; +assert.deepEqual( + nestedSubInFileErrorNgcFiles, + interpRegressionNgcFilesRecursive("nested-sub-in-file-error"), + "interp nested-sub-in-file-error fixture coverage drift", +); +assert.deepEqual( + nestedSubInFileErrorPlan.files + .map((file) => file.sourceRel) + .filter((sourceRel) => sourceRel.endsWith(".ngc")) + .map((sourceRel) => sourceRel.replace("tests/interp/nested-sub-in-file-error/", "")) + .sort(), + nestedSubInFileErrorNgcFiles, + "interp nested-sub-in-file-error staging manifest drift", +); verifyExpectedOutput( "interp_nested_sub_in_file_error_wasm", interp.runFileWithIni(