Guard INI subroutine staging manifests

This commit is contained in:
2026-06-12 23:11:21 +08:00
parent b84dfbdcf0
commit 3b0e8df639
3 changed files with 137 additions and 0 deletions

View File

@@ -6452,3 +6452,72 @@ Guard g10 interpreter fixture coverage
``` ```
提交后再复跑同一组 gate。 提交后再复跑同一组 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
```

View File

@@ -7239,6 +7239,22 @@
); );
const subCallFromSubPlan = await stageInterpIniContext(interp, "sub-call-from-sub"); 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( verifyExpectedOutput(
"browser_interp_sub_call_from_sub", "browser_interp_sub_call_from_sub",
interp.runFileWithIni( interp.runFileWithIni(
@@ -7294,6 +7310,21 @@
interp, interp,
"nested-sub-in-file-error", "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( verifyExpectedOutput(
"browser_interp_nested_sub_in_file_error", "browser_interp_nested_sub_in_file_error",
interp.runFileWithIni( interp.runFileWithIni(

View File

@@ -2134,6 +2134,25 @@ verifyExpectedOutput(
); );
const subCallFromSubPlan = stageInterpIniContext("sub-call-from-sub"); 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( verifyExpectedOutput(
"interp_sub_call_from_sub_wasm", "interp_sub_call_from_sub_wasm",
interp.runFileWithIni( interp.runFileWithIni(
@@ -2186,6 +2205,24 @@ verifyExpectedOutput(
); );
const nestedSubInFileErrorPlan = stageInterpIniContext("nested-sub-in-file-error"); 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( verifyExpectedOutput(
"interp_nested_sub_in_file_error_wasm", "interp_nested_sub_in_file_error_wasm",
interp.runFileWithIni( interp.runFileWithIni(