refactor: fans are the whole additive node — dead support re-union removed (#302)

С адресным тримом (он не режет полосы обычных узлов) возврат саппорт-квадов в
тело стал мёртвым слоем: полный юнит-набор зелёный без него — проверено
исполнением, а не предположено. По дисциплине мутационного реестра
избыточный слой убран (fans only), его мутант `junction-supports-not-restored`
снят: у #271-узлов трим режет только ЗА пределами саппорта, возвращать
нечего. Саппорт-квады остаются экспортом `junctionNodeGeometry` — детектор и
тесты используют их как источник контрактной истины.

`npm test` 1303/1303; `golden:verify` 126/126; контракт-проба репро — 0;
`smoke_junction_holes` OK.

Issue: #302
User-Visible: no
This commit is contained in:
Codex
2026-08-25 17:34:19 +03:00
parent 9c396935dc
commit d3ed299d2a
4 changed files with 9 additions and 16 deletions
File diff suppressed because one or more lines are too long
+2 -2
View File
File diff suppressed because one or more lines are too long
-11
View File
@@ -2189,17 +2189,6 @@ export const MUTANTS = [
replace: ' void A2; void B2;',
}],
},
{
id: 'junction-supports-not-restored',
guard: 'npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs && node --test --test-name-pattern="hole-free end to end" test/wall-thickness.test.mjs',
because: 'фаска старого слоя срезает материал полос на острых стыках; '
+ 'без возврата саппорт-квадов узла репро владельца снова дырявое',
patches: [{
file: 'src/wall-thickness.ts',
find: ' for (const piece of [...corners.supports, ...corners.fans]) {',
replace: ' for (const piece of corners.fans) {',
}],
},
{
id: 'junction-fan-ignores-thick-length',
guard: 'npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs && node --test --test-name-pattern="issue 302" test/wall-thickness.test.mjs',
+5 -1
View File
@@ -3564,7 +3564,11 @@ export function wallBodiesGeometry(
rooms, walls, openCuts, pitch, cellCm, gridPitch, coordScale,
multiWallNodes,
);
for (const piece of [...corners.supports, ...corners.fans]) {
// Fans only: with the trim now TARGETED (it never cuts an ordinary
// node's strips) the support re-union became dead weight — measured by
// the full unit suite staying green without it. The support quads stay
// exported: the detector and the tests use them as the contract truth.
for (const piece of corners.fans) {
try {
let ring: any = [closedRing(piece)];
if (bound) ring = intersection(ring, bound);