diff --git a/.github/workflows/mutation-gate.yml b/.github/workflows/mutation-gate.yml index d9af24e8..34af413c 100644 --- a/.github/workflows/mutation-gate.yml +++ b/.github/workflows/mutation-gate.yml @@ -5,11 +5,17 @@ name: Мутационный гейт # оставшийся зелёным на сломанном коде, ничего не защищает — он лишь выглядит # защитой, и это хуже его отсутствия. # -# Прогон дорогой: пересборка бандла на каждого мутанта. Поэтому он не входит в -# Validate и не идёт на каждый push. Его место — перед стабильным релизом -# (PROCESS.md §8) и раз в неделю по расписанию, чтобы дрейф тестов не копился -# до релиза. Дешёвая половина — «якоря патчей живы, guard-файлы существуют» — -# идёт с обычными юнитами: test/mutation-gate.test.mjs. +# Прогон дорогой, поэтому он не входит в Validate и не идёт на каждый push. +# Его место — перед стабильным релизом (PROCESS.md §8) и раз в неделю по +# расписанию, чтобы дрейф тестов не копился до релиза. Дешёвая половина — +# «якоря патчей живы, guard-файлы существуют» — идёт с обычными юнитами: +# test/mutation-gate.test.mjs. +# +# #332: бандл собирается только мутантам с браузерным гвардом (guardNeedsBundle), +# компиляция тестов в worktree стартует с тёплого test-build (инкрементальный +# tsc), а реестр режется на четыре чересполосных шарда — полный прогон +# укладывается в десятки минут вместо часов. Локальный дифф-режим: +# node scripts/mutation-gate.mjs --changed origin/dev..HEAD on: workflow_dispatch: @@ -31,10 +37,14 @@ concurrency: jobs: mutants: - name: "Мутанты: каждый обязан красить тесты" + name: "Мутанты: каждый обязан красить тесты (шард ${{ matrix.shard }} из 4)" runs-on: ubuntu-latest - # Все мутанты × (сборка + свой guard) — это десятки минут, и это нормально: - # гейт предрелизный. Час — потолок против зависшего Chromium. + strategy: + fail-fast: false + matrix: + shard: [1, 2, 3, 4] + # Шард ~64 мутантов × свой guard; бандл собирают только браузерные гварды. + # Час — потолок против зависшего Chromium. timeout-minutes: 60 steps: - uses: actions/checkout@v7 @@ -70,5 +80,8 @@ jobs: - name: Реестр применим к текущему коду run: node scripts/mutation-gate.mjs --check + - name: Тёплый test-build для инкрементальной компиляции мутантов + run: npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs + - name: Каждый тест ловит свою поломку - run: node scripts/mutation-gate.mjs + run: node scripts/mutation-gate.mjs --shard=${{ matrix.shard }}/4