From 8af5ebefd23dccbe9b221d42fbc30b8de78d9e2d Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 25 Aug 2026 14:09:13 +0300 Subject: [PATCH] test: multiwall smoke follows the strip-safe chamfer contract (#302) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Смок `smoke_multiwall_junction` держал старый контракт «клин за фаской пуст» — его проба лежит в перекрытии двух полос узла и по strip-safe правилу #302 обязана остаться заполненной. Пропущен в первом прогоне AC9, пойман CI. Issue: #302 User-Visible: no --- demo/smoke_multiwall_junction.mjs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/demo/smoke_multiwall_junction.mjs b/demo/smoke_multiwall_junction.mjs index 722491fd..c1b53e3c 100644 --- a/demo/smoke_multiwall_junction.mjs +++ b/demo/smoke_multiwall_junction.mjs @@ -107,12 +107,15 @@ const result = await page.evaluate(async (source) => { const canonical = card._wallUnionGeometry(); const node = new DOMPoint(source.node[0] * 1000, source.node[1] * 1000); // Midpoint between the R-bounded straight bevel and the old 1.80×H mitre. - const discardedWedge = new DOMPoint(330.3808442725, 148.8560107825); + // #302: this point lies in the OVERLAP of two incident strips, and the + // chamfer is strip-safe now — it must stay filled (it used to be discarded, + // which is exactly the hole class #302 removed). + const retainedOverlap = new DOMPoint(330.3808442725, 148.8560107825); out.fixtureLoaded = card._spaceModel()?.rooms.length === 2 && card._spaceWalls.length === 7; out.planUsesCanonicalPath = !!planD && canonical?.d === planD; out.nodeRemainsFilled = !!path?.isPointInFill(node); - out.excessWedgeIsEmpty = path && !path.isPointInFill(discardedWedge); + out.stripOverlapRetained = !!path?.isPointInFill(retainedOverlap); out.planHasNoEnclosedHoles = enclosedSvgHoles(path, node) === 0; out.paperRemainsSolid = !!canonical?.paperD && !!root().querySelector('.hp-paper');