mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
ci: diff mutants only on request; the review pipeline proves them on the material before reviewing
Validate ran the three "Мутанты по диффу" shards on every push of every branch: 48 of 56 job-hours on 08–09.09, most of them cancelled by the next push. Mutants now run when asked — pull requests, the nightly schedule, a push carrying a `Release:` trailer, or a dispatch with `mutants=true` (classify-changes.mjs → `mutants_requested`); an ordinary push runs the light checks only. The proof moves to where it is consumed. process.yml gets a gate after the #499 reuse step: on the code stage it looks for a dispatch Validate run on the exact material SHA whose mutant jobs executed and passed (scripts/validate-gate.mjs); none → it dispatches one and waits; red or missing → the task goes back S7→S6 with the run link and the review cycle is not spent. Spec stage and the reuse fast-path skip the gate (`proceed=true`); all later steps branch on `proceed` in place of the old conflict conjunct only. merge-candidate.mjs dispatches Validate on the pushed candidate and waits for that dispatch run. PROCESS.md/AGENTS.md: review does not start on red code; one handoff — one push. Mutants: mutants-run-on-every-push, review-starts-on-red-validate, review-trusts-push-run-without-mutants, merge-waits-push-run-without-mutants. Issue: #510 User-Visible: no
This commit is contained in:
@@ -94,6 +94,20 @@ export function heavyGatesRequested({ eventName, headMessage, fullInput } = {})
|
||||
return hasReleaseTrailer(headMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Нужны ли мутанты по диффу (#510). За 08–09.09 они съели 86 % job-минут
|
||||
* Validate, потому что бежали на каждом промежуточном пуше и отменялись
|
||||
* следующим. Место мутантов — кандидат: ревью-конвейер и слияние кандидата
|
||||
* запускают Validate по кнопке с `mutants=true`, ночной прогон и PR берут
|
||||
* полный набор, кандидат беты несёт трейлер `Release:`. Обычный push — нет.
|
||||
*/
|
||||
export function mutantsRequested({ eventName, headMessage, fullInput, 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);
|
||||
}
|
||||
|
||||
/** Трейлер `Release: vX.Y.Z` в конце сообщения коммита — признак кандидата. */
|
||||
export function hasReleaseTrailer(message) {
|
||||
return /^Release:\s*v?\d+\.\d+\.\d+\S*\s*$/m.test(String(message || ''));
|
||||
@@ -119,6 +133,13 @@ if (invokedDirectly) {
|
||||
fullInput: process.env.FULL_INPUT,
|
||||
});
|
||||
process.stdout.write(`heavy=${heavy ? 'true' : 'false'}\n`);
|
||||
const mutants = mutantsRequested({
|
||||
eventName: process.env.EVENT_NAME,
|
||||
headMessage: process.env.HEAD_MESSAGE,
|
||||
fullInput: process.env.FULL_INPUT,
|
||||
mutantsInput: process.env.MUTANTS_INPUT,
|
||||
});
|
||||
process.stdout.write(`mutants_requested=${mutants ? 'true' : 'false'}\n`);
|
||||
} else {
|
||||
const all = process.argv.includes('--all');
|
||||
const outputs = all ? classifyAll() : classifyChanges(readFileSync(0, 'utf8'));
|
||||
|
||||
Reference in New Issue
Block a user