fix: close both code-review mediums and drop the dead paper layer (#302 r1 M1,M2)

**M1.** `docs/WALL-THICKNESS.md` §3 «Junction nodes» переписан под решение №5:
полный mitre, фаска #249 в отставке, `bevelMultiWallBody` — только адресный
латеральный трим. Прежний абзац описывал отменённое утреннее решение.

**M2.** Guard мутанта `junction-fans-disabled` собирает `test-build` и бандл
перед смоком: `smoke_junction_holes` — единственный смок, импортирующий из
`test-build`, и в чистом worktree он падал `ERR_MODULE_NOT_FOUND` до
применения мутации. Ревью прав: после переякорения guard'а на смок я не
перегнал его штатным харнесом — только ручной test-build-патч, который worktree
не видит.

**Low + следствие.** `bevelMultiWallPaper` удалена как мёртвый код; следом
измерено (фикстура #197 и репро владельца — байт в байт с веерами и без), что
и `paperWithNodeCorners` бумаге ничего не даёт: footprint ∪ shell уже
покрывает каждый узел. Слой удалён целиком, бумага возвращена к rawPaper.
Осиротевший мутант `multi-wall-paper-full-origin-cut` (#261, «белый клин от
вычитающего разреза бумаги») снят с обоснованием: в бумаге не осталось ни
одного вычитания — этот класс регресса невозможен по построению.

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

Issue: #302
User-Visible: no
This commit is contained in:
Codex
2026-08-25 17:34:19 +03:00
parent 58c096cef1
commit ec8dc6fde1
5 changed files with 249 additions and 350 deletions
+3 -40
View File
@@ -614,45 +614,6 @@ export const MUTANTS = [
replace: ' return v;',
}],
},
{
id: 'multi-wall-paper-full-origin-cut',
guard: 'npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs '
+ '&& node --test --test-name-pattern="issue #197 keeps" '
+ 'test/wall-thickness.test.mjs',
because: 'the exterior paper must retain valid multi-wall overlap up to R; cutting from the '
+ 'offset origins recreates the measured white T-junction wedge from #261',
patches: [{
file: 'src/wall-thickness.ts',
find: ' const cuts = multiWallEffectiveCutGeometry(\n'
+ ' node, map, true, true, protectedStrips,\n'
+ ' );',
replace: ' const cuts = multiWallEffectiveCutGeometry(\n'
+ ' node, map, false, true, protectedStrips,\n'
+ ' );',
}, {
file: 'src/wall-thickness.ts',
find: ' if (envelope) localInside = intersection(localInside, envelope);\n'
+ ' else if (centre) localInside = intersection(localInside, centre);',
replace: ' if (centre) localInside = intersection(localInside, centre);\n'
+ ' else if (envelope) localInside = intersection(localInside, envelope);',
}, {
file: 'src/wall-thickness.ts',
find: ' return cuts && protectedStrips ? difference(cuts, protectedStrips) : cuts;',
replace: ' return cuts;',
}, {
file: 'src/wall-thickness.ts',
find: ' if (protectedStrips) local = union(local, protectedStrips);',
replace: ' // protected-strip fail-safe intentionally disabled by the mutant',
}, {
file: 'src/wall-thickness.ts',
find: ' if (protectedStrips) {\n'
+ ' try {\n'
+ ' let protectedInside = protectedStrips;',
replace: ' if (protectedStrips && false) {\n'
+ ' try {\n'
+ ' let protectedInside = protectedStrips;',
}],
},
{
id: 'multi-wall-orthogonal-strip-protection-disabled',
guard: 'npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs '
@@ -2211,7 +2172,9 @@ export const MUTANTS = [
},
{
id: 'junction-fans-disabled',
guard: 'node demo/smoke_junction_holes.mjs',
guard: 'npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs '
+ '&& npm run build >/dev/null 2>&1 && cp dist/houseplan-card.js demo/srv/assets/houseplan-card.js '
+ '&& node demo/smoke_junction_holes.mjs',
because: 'без вееров сектор между соседними полосами узла остаётся дырой — '
+ 'это и есть класс артефактов #302',
patches: [{