From 7ecdafef94f0004416dd3e14372aa38f090ac3fb Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 14 Sep 2026 01:39:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B2=D0=B0=20=D0=BC=D1=83=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=20=D1=80=D0=B5=D0=B5=D1=81=D1=82=D1=80=D0=B0?= =?UTF-8?q?=20=D1=81=D0=BD=D0=BE=D0=B2=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=B8=D0=BB=D0=B8=D1=80=D1=83=D1=8E=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `inner-span-reads-whole-edge-thickness` и `safe-resize-legacy-midpoint-fail-open` падали на `npx tsc -p tsconfig.test.json` до запуска заявленного теста и потому не проверяли ничего. Причина одна: патч делал ветку статически мёртвой (`if (false)`, `false &&`), а в мёртвой ветке TypeScript теряет сужение типов, сделанное выше — `profile` снова `| null`, `direct` снова `| undefined`. Условия заменены на ложные в рантайме, но не статически. Смысл мутантов тот же, и оба теперь ловятся заявленными тестами. Обнаружено прогоном на этой ветке: правка реестра затягивает в отбор мутантов чужие файлы, и красным стал гейт задачи, к которой эти записи отношения не имеют. Провал такого мутанта незаметен, пока его не выберет дифф — это отдельный пробел, #568. Issue: #566 User-Visible: no --- scripts/mutation-registry.mjs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/mutation-registry.mjs b/scripts/mutation-registry.mjs index 98078c45..54251d9b 100644 --- a/scripts/mutation-registry.mjs +++ b/scripts/mutation-registry.mjs @@ -1993,8 +1993,11 @@ const MUTANT_DEFINITIONS = [ + 'one unambiguous whole changed edge (#298)', patches: [{ file: 'src/wall-thickness.ts', + // `false &&` делало ветку статически мёртвой, и TypeScript терял сужение + // `direct` внутри неё: мутант падал на компиляции вместо проверки (#568). + // Сравнение со строкой вне союза даёт ту же ложь без потери сужения. find: " if (mode === 'fixed-topology') {\n const direct = wholeEdgeMoves.get(w.key);", - replace: " if (false && mode === 'fixed-topology') {\n const direct = wholeEdgeMoves.get(w.key);", + replace: " if (String(mode) === 'mutant-never-fixed-topology') {\n const direct = wholeEdgeMoves.get(w.key);", }], }, { @@ -4411,8 +4414,11 @@ const MUTANT_DEFINITIONS = [ + 'edges (#233, spec review r1/H2)', patches: [{ file: 'src/wall-thickness.ts', + // Условие ложно в рантайме, но не статически: с литеральным `false` + // TypeScript признаёт блок мёртвым и ТЕРЯЕТ сужение `profile` выше, из-за + // чего мутант падал на компиляции и не проверял ничего (#568). find: ' if (distToSeg(mid[0], mid[1], p0[0], p0[1], p1[0], p1[1]) <= eps) {', - replace: ' if (false) {', + replace: ' if (eps < 0) {', }], }, {