ci(validate): мутанты по диффу — только по явному запросу, не на кандидате беты и не в full (#601)

`mutantsRequested` отвечает true лишь на PR и `workflow_dispatch mutants=true`
(конвейер ревью, слияние кандидата). Трейлер `Release:` и `full=true` включают
тяжёлые гейты — смоки, golden, performance_smoke — но не мутантов: к бете каждая
задача прогнана ими на ревью и на слитом после ребейза кандидате, ночь покрыта
полным реестром (mutation-gate.yml, #513), а ручной полный прогон ради
артефакта эталонов и приёмка эталонов с трейлером на ветке задачи платили
шестью job впустую. `schedule` мутантов тоже не запрашивает.

Политика release в ci-proof — `mutants: false`: иначе proof кандидата беты
без запрошенных mutant-jobs объявлялся бы stale. review и merge по-прежнему
требуют шесть исполненных job (#541).

Тесты: #510 AC1 переписан под новый список, ci-proof — release без мутантов
green, лёгкий stale, review/merge без запроса stale. Мутанты протокола:
`mutants-run-on-every-push` перепривязан, новые `mutants-run-on-beta-candidate`,
`mutants-run-on-full-dispatch`, `release-proof-demands-mutant-jobs`.
PROCESS.md §10.4, AGENTS.md, docs/TESTING.md, комментарии workflow.

Issue: #601
User-Visible: no
This commit is contained in:
Claude
2026-09-20 19:22:38 +03:00
parent 57572d8c8c
commit a551af9219
10 changed files with 147 additions and 45 deletions
+17 -9
View File
@@ -96,17 +96,25 @@ export function heavyGatesRequested({ eventName, headMessage, fullInput } = {})
}
/**
* Нужны ли мутанты по диффу (#510). За 08–09.09 они съели 86 % job-минут
* Validate, потому что бежали на каждом промежуточном пуше и отменялись
* следующим. Место мутантов — кандидат: ревью-конвейер и слияние кандидата
* запускают Validate по кнопке с `mutants=true`, ночной прогон и PR берут
* полный набор, кандидат беты несёт трейлер `Release:`. Обычный push — нет.
* Нужны ли мутанты по диффу (#510, сужено в #601). За 08–09.09 они съели 86 %
* job-минут Validate, потому что бежали на каждом промежуточном пуше и
* отменялись следующим. Место мутантов — кандидат ревью и кандидат слияния:
* оба запускают Validate по кнопке с `mutants=true`; на PR Validate —
* единственный сигнал, поэтому там тоже. Больше нигде: мутанты проверяют
* тесты, а не продукт (#513), и к моменту беты каждая задача прогнана ими
* дважды — на ревью и на слитом после ребейза кандидате. Трейлер `Release:`
* и `full=true` включают тяжёлые гейты, но не мутантов — иначе ручной полный
* прогон ради артефакта эталонов и приёмка эталонов с трейлером на ветке
* задачи платили шестью job впустую (#601). Ночь — полный реестр
* (mutation-gate.yml), не диффовое подмножество; `schedule` здесь тоже
* не запрашивает, чтобы будущее расписание Validate не вернуло их молча.
* CLI по-прежнему передаёт headMessage и fullInput вместе с остальным —
* функция их не читает, и тест закрепляет, что они НЕ влияют на ответ.
*/
export function mutantsRequested({ eventName, headMessage, fullInput, mutantsInput } = {}) {
export function mutantsRequested({ eventName, mutantsInput } = {}) {
if (eventName === 'pull_request') return true;
if (eventName === 'schedule') return true;
if (eventName === 'workflow_dispatch') return String(fullInput) === 'true' || String(mutantsInput) === 'true';
return hasReleaseTrailer(headMessage);
if (eventName === 'workflow_dispatch') return String(mutantsInput) === 'true';
return false;
}
/**