Guard sequence subroutine staging manifests

This commit is contained in:
2026-06-12 23:27:09 +08:00
parent 3555b47c91
commit 091c4a3a66
3 changed files with 144 additions and 0 deletions

View File

@@ -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
```

View File

@@ -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(

View File

@@ -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(