Три состояния владельца позиции вместо двух

Ревью r1, Medium: наблюдение о записи на удалённом пространстве говорило
«владелец жив» и про ключ, который ни во что не резолвится. Это заявление о
доказанности там, где её нет: продукт в этом состоянии ничего не удаляет не
потому, что владелец жив, а потому, что не знает — `space-reference-repair`
ведёт `live`, `absent` и `unverified`, три состояния, а не два.

Проверка ведёт те же три. Нерезолвящийся ключ получает наблюдение
`unknown_owner` с той же формулировкой, что и в живом пространстве: «владелец не
найден в конфигурации (возможно устройство HA)». Тест сверяет теперь и ТЕКСТ
причины — вид наблюдения без текста эту асимметрию пропускал, ровно так она и
проехала.

Issue: #566
User-Visible: no
This commit is contained in:
Codex
2026-09-14 02:28:50 +03:00
committed by Codex
parent 9cb1f4be6c
commit 733cd5b86b
4 changed files with 59 additions and 20 deletions
+15 -7
View File
@@ -150,14 +150,22 @@ test('#566: на удалённом пространстве нарушение
'layout_space:m_gone',
'layout_space:rl_room_never_existed',
]);
// Три состояния, а не два: продукт различает `live` и `unverified`, и
// проверка обязана различать их тоже. Сказать «владелец жив» про ключ,
// который ни во что не резолвится, — заявить доказанность там, где её нет
// (находка r1). Поэтому сверяется и вид наблюдения, и ТЕКСТ причины: вид без
// текста эту асимметрию пропускает — именно так она и проехала.
assert.deepEqual(notes.filter((n) => n.kind === 'stale_layout_space')
.map((n) => n.owner).sort(), [
'980f1446c4ec1a3a9fa9ff5f6d93caed', 'grp_kitchen', 'm1', 'rl_r1',
]);
// Наблюдение обязано называть причину, иначе читатель решит, что проверка
// просто ослабла.
assert.match(notes.find((n) => n.kind === 'stale_layout_space').detail,
/Optimize хранит позицию намеренно/);
.map((n) => n.owner).sort(), ['grp_kitchen', 'm1', 'rl_r1']);
assert.deepEqual(notes.filter((n) => n.kind === 'unknown_owner')
.map((n) => n.owner), ['980f1446c4ec1a3a9fa9ff5f6d93caed']);
for (const note of notes.filter((n) => n.kind === 'stale_layout_space')) {
assert.match(note.detail, /владелец жив — Optimize хранит позицию намеренно/);
}
for (const note of notes.filter((n) => n.kind === 'unknown_owner')) {
assert.match(note.detail, /владелец не найден в конфигурации/);
assert.doesNotMatch(note.detail, /владелец жив/);
}
});
test('позиция устройства без записи маркера — наблюдение, а не нарушение (#254)', () => {