test: обход правок собирает test-build сам, как чистый CI и требует

Смок импортировал `../test-build/*` статически и на моей стороне работал только
потому, что каталог остался от `npm test`. На чистом Linux CI его нет: в job
`smoke` идут `npm ci` и `npm run bundle:sync`, сборки тестов там не бывает, и
смок падал на импорте до запуска браузера.

Ровно эту ошибку уже проходил `smoke_lattice_write_barrier.mjs` — там об этом и
написано в комментарии. Лечение то же: собрать `tsconfig.test.json` перед
динамическим импортом.

Проверено в чистом worktree без `test-build`: шесть прогонов, все совпадают с
таблицей KNOWN, OK.

Issue: #297
User-Visible: no
This commit is contained in:
Claude
2026-08-24 21:27:38 +03:00
parent 158601d67d
commit 4feeebc355
+19 -3
View File
@@ -19,12 +19,28 @@
// поэтому воспроизводится одной командой:
// node demo/smoke_edit_walk.mjs --seed 7 --plan real-plan-second-floor.json
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
import { execFileSync } from 'node:child_process';
import { resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import { launch, checkAll, finish } from './serve.mjs';
import { optimizePlans } from '../test-build/plan-optimizer.js';
import {
// `model-invariants.mjs` и оптимизатор — скомпилированный продуктовый код, а не
// вторая модель. Значит смок обязан собрать тот же `test-build`, который делает
// `npm test`: на чистом Linux CI этого каталога нет, и опора на оставшийся от
// разработчика падает до запуска браузера. Ровно эту ошибку уже проходил
// `smoke_lattice_write_barrier.mjs` — здесь она повторена по той же причине.
const root = fileURLToPath(new URL('..', import.meta.url));
execFileSync(process.execPath, [
resolve(root, 'node_modules/typescript/bin/tsc'), '-p', 'tsconfig.test.json',
], { cwd: root, stdio: 'inherit' });
execFileSync(process.execPath, [resolve(root, 'scripts/fix-test-build.mjs')], {
cwd: root, stdio: 'inherit',
});
const { optimizePlans } = await import('../test-build/plan-optimizer.js');
const {
checkHiddenObstacles, checkMixedRoleRecords, checkWallKeys, checkReferences,
checkPhysicalGeometry, latticeProfile, readModel,
} from '../scripts/model-invariants.mjs';
} = await import('../scripts/model-invariants.mjs');
const arg = (name, fallback) => {
const index = process.argv.indexOf(name);