test: объявленный Baseline-Reviewed прогон проверяется отдельно от вершины ветки

`test/release-gate.test.mjs` строил ожидания из живого состояния репозитория, а
`localEvidence` читает `baselines.reviewedRun` из сообщения HEAD-коммита. Пока
вершиной был обычный коммит, поле оставалось `null` и всё сходилось. Как только
вершиной становился коммит приёмки эталонов, поле становилось непустым, и
`evaluateCiProof` законно требовал объявленный прогон — которого заглушка
`loadContext` не отдавала. Тест краснел на всей ветке, ради которой #573 и
писалась, и вместе с ним краснел бы `dev` сразу после слияния такой ветки.

Воспроизведено на `issue/594-form-kit-room@68bb7558`: 2776 pass / 1 fail, из-за
чего конвейер ревью не запустился вовсе.

Продуктовый код не менялся: контракт «объявленный прогон обязан существовать,
быть завершённым, не отменённым и быть Validate» — ровно то, что задумано, и он
намеренно не требует `success`, потому что приёмка эталонов по определению
ссылается на прогон, где golden покраснел.

Что изменено:

- зелёный путь теста считается на evidence с `baselines.reviewedRun: null` и
  больше не зависит от того, каким коммитом оказалась вершина;
- контракт объявленного прогона вынесен в отдельный тест и проверяется с трёх
  сторон: завершённый неотменённый Validate с `conclusion: 'failure'` — зелёно;
  прогона нет — отказ; прогон отменён — отказ;
- мутант `declared-baseline-review-run-never-checked` обнуляет объявление и
  краснеет на новом тесте.

Доказательство на фикстуре «вершина — приёмка эталонов»: старый тест 8 pass /
1 fail, новый 10 pass / 0 fail.

Issue: #595
User-Visible: no
This commit is contained in:
Claude
2026-09-19 06:12:46 +00:00
committed by claude[bot]
parent 2167d43968
commit 5b6d5d1d8f
2 changed files with 80 additions and 4 deletions
+12
View File
@@ -9937,6 +9937,18 @@ const MUTANT_DEFINITIONS = [
replace: ' const mismatch = evidenceMismatch(proof.evidence, proof.evidence);',
}],
},
{
id: 'declared-baseline-review-run-never-checked',
guard: 'node --test --test-name-pattern="#595" test/release-gate.test.mjs',
because: '#573/#595: коммит приёмки эталонов объявляет прогон, на кадры которого смотрели. '
+ 'Если объявление не резолвится, трейлер Baseline-Reviewed становится честным словом: '
+ 'сослаться можно на что угодно, включая отменённый или несуществующий прогон',
patches: [{
file: 'scripts/ci-proof.mjs',
find: ' const declared = proof.evidence.baselines?.reviewedRun ?? null;',
replace: ' const declared = null;',
}],
},
{
id: 'reused-marker-key-unchecked-against-candidate',
guard: 'node --test --test-name-pattern="#573" test/ci-proof.test.mjs',