Источники радара сравниваются по смыслу, а не по тексту

Гард `keepTwoPoint` решал, сохранять ли двухточечную калибровку, сравнением
`JSON.stringify`, то есть текста. Порядок ключей `sources` при этом меняет сам
билдер: `slots`/`ranges`/`zones`/`occupancy_entity`/`count_entity` он удаляет и
дописывает заново, а `availability_entity` остаётся на месте и уезжает в начало.
Конфиг, только что записанный этим же билдером, при следующем открытии
сравнивался неравным — и радар с `availability_entity` терял `refs` и `rms_cm`,
получая `method: manual`, при первом же обычном сохранении.

Сравнение стало каноничным по порядку ключей объектов и осталось чувствительным
к порядку элементов массивов: позиция слота — это его `target_N`. Проекция не
затронута — она считается от `mount`, `cell_cm` и `mirror`.

Issue: #567
User-Visible: no
This commit is contained in:
Codex
2026-09-13 23:23:30 +03:00
parent 6706182a27
commit 03983946c5
46 changed files with 565 additions and 431 deletions
+12
View File
@@ -72,6 +72,18 @@ function relocateEditorPatch(patch, cardSource, editorSource) {
// `find` обязан встречаться в файле ровно один раз: патч, который ложится «куда
// попало», проверяет не то, что объявлен проверять. Это контролирует --check.
const MUTANT_DEFINITIONS = [
{
id: 'radar-sources-compared-as-text',
guard: 'node --test --test-name-pattern="#567" test/radar-editor.test.mjs',
because: '#567: порядок ключей `sources` меняет сам билдер, поэтому текстовое сравнение '
+ 'ложно отвечает «источники изменились» и радар молча теряет refs и rms_cm '
+ 'двухточечной калибровки при первом же обычном сохранении',
patches: [{
file: 'src/radar-editor.ts',
find: ' && canonicalSources(original.sources) === canonicalSources(sources)',
replace: ' && JSON.stringify(original.sources) === JSON.stringify(sources)',
}],
},
{
id: 'household-marker-drops-keyboard-reach',
guard: 'node demo/smoke_household_journeys.mjs',