Files
houseplan-card/scripts/golden-accept.mjs
T
Claude 0c9cf9503e test: приёмка переписывает только объявленные эталоны
`passed` означает «в пределах порога», а не «байт в байт»: comparePng считает
diffRatio, и статус ставится по нему. А приёмка копировала кандидата поверх
КАЖДОГО эталона матрицы, поэтому подпороговый дрейф уезжал в контракт молча — и
накапливался: каждая приёмка подтягивала эталон к последней среде, порог не
пересекался никогда, а эталон уходил. Так 1e341c60 заменил 22 картинки, объявив
четыре.

Проект уже сталкивался с этим: ad3f9981 восстанавливал девять уехавших эталонов
руками. Такую работу обязан делать инструмент.

Теперь копируются только сцены из --expect-change и --expect-new; остальные
сохраняют и файл, и свой хеш из прежнего индекса. Индекс по-прежнему
перезаписывается на полный набор — сирота или пропавшая запись делают манифест
недействительным целиком.

Решение вынесено в чистую функцию goldenAcceptancePlan: оно одно, и ошибка в нём
дорога. Отсутствие прежнего хеша у необъявленной сцены — ошибка, а не повод
взять кандидата: без эталона бывает только новая сцена, а она обязана быть
названа в --expect-new.

Логика вернулась в demo/golden/accept.mjs, где ей и место: после #344 эти файлы
исключены из корпуса отпечатка, так что правка больше не требует пересборки и
пересъёмки. scripts/golden-accept.mjs остался проходным вызовом ради
документированной команды.

Проверено сквозным прогоном на синтетическом кандидате: у двух сцен байты
другие, объявлена одна — на диске изменились ровно два файла, эталон и индекс, а
хеш второй сцены остался прежним. Два мутанта убиты руками: «брать кандидата
вместо прежнего хеша» и «заменять всё».

Issue: #351
User-Visible: no
2026-08-28 11:52:36 +03:00

32 lines
1.7 KiB
JavaScript

#!/usr/bin/env node
/**
* Проходной вызов `demo/golden/accept.mjs` (#334, #350, #351).
*
* node scripts/golden-accept.mjs --reviewed --expect-change=<id,id>
* node scripts/golden-accept.mjs --reviewed --expect-new=<id,id>
*
* Обёртка появилась потому, что до #344 любой `.mjs` из `demo/golden` входил в
* корпус отпечатка, и правка инструмента приёмки объявляла устаревшими бандл и
* оба манифеста. После #344 это ограничение снято, правило живёт в самом
* `accept.mjs`, а этот файл остался ради документированной команды и передаёт
* аргументы как есть.
*
* Два флага утверждают разное: `--expect-change` — «я знаю, почему старый кадр
* изменился», `--expect-new` — «я посмотрел на новый кадр». Необъявленная сцена
* не переписывается вовсе: её эталон и хеш остаются прежними (#351).
*/
import { spawnSync } from 'node:child_process';
import { dirname, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
const argv = process.argv.slice(2);
if (!argv.includes('--reviewed')) {
console.error('приёмка требует явного --reviewed');
process.exit(2);
}
const accept = spawnSync(process.execPath, [
resolve(ROOT, 'demo/golden/accept.mjs'), ...argv,
], { cwd: ROOT, stdio: 'inherit' });
process.exit(accept.status ?? 1);