diff --git a/text6.txt b/text6.txt index f6771fa..3816376 100644 --- a/text6.txt +++ b/text6.txt @@ -887,3 +887,48 @@ remap file-list guard 的当前显性剩余项已基本收束。下一批建议 fixture;若没有合适小批次,转向补齐 staging guard 的文档索引或生成一个 machine-readable fixture coverage manifest。继续避免 blocked runtime promotion、 browser full inventory 扩面和 JS CNC 语义实现。 + +二十二、2026-06-13 继续执行记录:interp fixture staging helper guard + +本批回到 `writeInterpRegressionFiles(...)` helper,先整理已有 Node/browser coverage +里的两个固定 `.ngc/.tbl` fixture: + +- `interp/cam-nisley` +- `interp/g76` + +完成内容: + +- Node 侧新增 `assertInterpRegressionStaging(...)`; +- Node 侧对 upstream vendored `.ini/.ngc/.tbl` 文件清单与 fixed manifest 精确对账; +- Node 侧检查 staged path 与 `/work/interp//...` fixed manifest 一致; +- browser 侧新增同名 `assertInterpRegressionStaging(...)`; +- browser 侧检查 fixed manifest duplicate-free,并检查 staged path 去掉 + `/work/browser-interp//` 前缀后与 fixed manifest 一致; +- `cam-nisley` 与 `g76` 改用该 helper,去掉内联重复 guard; +- 仅整理 host/filesystem staging guard,不改变 G-code、tool table 或 threading 语义。 + +已运行验证: + +```bash +git diff --check +SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh +wasm-port/tools/verify_vendor_sync.sh +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/host/verify_host_smokes.sh +``` + +结果:全部通过。 + +下一步建议: + +继续复用 `assertInterpRegressionStaging(...)` 处理已有 `writeInterpRegressionFiles(...)` +调用里的小批次。优先候选: + +- `m98m99/09-disable-fanuc-subs` +- `m98m99/11-main-program-oword` + +这两个已有固定 file list 和 Node/browser coverage,适合把现有 m98m99 aggregate +slice guard 拆出更直接的 per-directory staged path guard。仍不推进 blocked runtime +promotion、browser full inventory 扩面或 JS CNC 语义实现。 diff --git a/wasm-port/tests/browser/interp_smoke.html b/wasm-port/tests/browser/interp_smoke.html index 4921152..df789c4 100644 --- a/wasm-port/tests/browser/interp_smoke.html +++ b/wasm-port/tests/browser/interp_smoke.html @@ -4680,6 +4680,16 @@ return wasmDir; } + function assertInterpRegressionStaging(name, files, wasmDir) { + if (files.length === 0 || new Set(files).size !== files.length) { + throw new Error(`browser_interp_${name}_fixture_coverage: list drift`); + } + const interpStagedRelativeFiles = files.map((file) => `${wasmDir}/${file}`.replace(`/work/browser-interp/${name}/`, "")); + if (interpStagedRelativeFiles.join(",") !== files.join(",")) { + throw new Error(`browser_interp_${name}_staging_manifest: list drift`); + } + } + async function writeCcompRegressionFiles(interp, name) { const sourceDir = `../../vendor/linuxcnc/tests/ccomp/${name}`; const wasmDir = `/work/browser-ccomp/${name}`; @@ -6600,14 +6610,8 @@ "cam.ngc", "test.tbl", ]; - if (camNisleyFiles.length !== 2 || new Set(camNisleyFiles).size !== camNisleyFiles.length) { - throw new Error("browser_interp_cam_nisley_fixture_coverage: list drift"); - } const camNisleyDir = await writeInterpRegressionFiles(interp, "cam-nisley", camNisleyFiles); - const camNisleyStagedRelativeFiles = camNisleyFiles.map((file) => `${camNisleyDir}/${file}`.replace("/work/browser-interp/cam-nisley/", "")); - if (camNisleyStagedRelativeFiles.join(",") !== camNisleyFiles.join(",")) { - throw new Error("browser_interp_cam_nisley_staging_manifest: list drift"); - } + assertInterpRegressionStaging("cam-nisley", camNisleyFiles, camNisleyDir); interp.writeTextFile( `${camNisleyDir}/test.ini`, [ @@ -7345,14 +7349,8 @@ "g76only.ngc", "test.tbl", ]; - if (g76Files.length !== 2 || new Set(g76Files).size !== g76Files.length) { - throw new Error("browser_interp_g76_fixture_coverage: list drift"); - } const g76Dir = await writeInterpRegressionFiles(interp, "g76", g76Files); - const g76StagedRelativeFiles = g76Files.map((file) => `${g76Dir}/${file}`.replace("/work/browser-interp/g76/", "")); - if (g76StagedRelativeFiles.join(",") !== g76Files.join(",")) { - throw new Error("browser_interp_g76_staging_manifest: list drift"); - } + assertInterpRegressionStaging("g76", g76Files, g76Dir); interp.writeTextFile( `${g76Dir}/test.ini`, [ diff --git a/wasm-port/tests/wasm/node/verify_interp_wasm.mjs b/wasm-port/tests/wasm/node/verify_interp_wasm.mjs index 03dd341..8238ea6 100644 --- a/wasm-port/tests/wasm/node/verify_interp_wasm.mjs +++ b/wasm-port/tests/wasm/node/verify_interp_wasm.mjs @@ -287,6 +287,22 @@ function writeInterpRegressionFiles(name, files) { return wasmDir; } +function assertInterpRegressionStaging(name, files, wasmDir) { + const sourceDir = resolve(rootDir, "vendor/linuxcnc/tests/interp", name); + assert.deepEqual( + readdirSync(sourceDir) + .filter((filename) => filename.endsWith(".ini") || filename.endsWith(".ngc") || filename.endsWith(".tbl")) + .sort(), + [...files].sort(), + `interp ${name} fixture coverage drift`, + ); + assert.deepEqual( + files.map((file) => `${wasmDir}/${file}`), + files.map((file) => `/work/interp/${name}/${file}`), + `interp ${name} staging manifest drift`, + ); +} + function interpRegressionNgcFiles(name) { const sourceDir = resolve(rootDir, "vendor/linuxcnc/tests/interp", name); return readdirSync(sourceDir) @@ -1574,17 +1590,8 @@ const camNisleyFiles = [ "cam.ngc", "test.tbl", ]; -assert.deepEqual( - camNisleyFiles.filter((file) => file.endsWith(".ngc")), - interpRegressionNgcFilesRecursive("cam-nisley"), - "interp cam-nisley fixture coverage drift", -); const camNisleyDir = writeInterpRegressionFiles("cam-nisley", camNisleyFiles); -assert.deepEqual( - camNisleyFiles.map((file) => `${camNisleyDir}/${file}`), - camNisleyFiles.map((file) => `/work/interp/cam-nisley/${file}`), - "interp cam-nisley staging manifest drift", -); +assertInterpRegressionStaging("cam-nisley", camNisleyFiles, camNisleyDir); interp.writeTextFile( `${camNisleyDir}/test.ini`, [ @@ -2321,17 +2328,8 @@ const g76Files = [ "g76only.ngc", "test.tbl", ]; -assert.deepEqual( - g76Files.filter((file) => file.endsWith(".ngc")), - interpRegressionNgcFilesRecursive("g76"), - "interp g76 fixture coverage drift", -); const g76Dir = writeInterpRegressionFiles("g76", g76Files); -assert.deepEqual( - g76Files.map((file) => `${g76Dir}/${file}`), - g76Files.map((file) => `/work/interp/g76/${file}`), - "interp g76 staging manifest drift", -); +assertInterpRegressionStaging("g76", g76Files, g76Dir); interp.writeTextFile( `${g76Dir}/test.ini`, [