добавлен словарь категориальных значений HAE → коды HealthKit

- фазы сна, контекст пульса и имена тренировок попадают в реестр
  `category_value` (миграция 00010): строка хранится дословно, выведенный код
  лежит рядом отдельной записью, а не полем внутри точки
- словарь и синонимы кодов живут в бинаре (`internal/healthkit`); локаль из
  `Accept-Language` сужает поиск, но в ключ реестра не входит — заголовков в
  сыром архиве нет
- наблюдение входит в отпечаток витрины, выведенный код — нет: он производная
  от словаря, а не от журнала
This commit is contained in:
av
2026-08-04 07:32:19 +03:00
parent eb3fca77ee
commit 1b649ba3d5
40 changed files with 4317 additions and 42 deletions
+27 -10
View File
@@ -323,10 +323,13 @@
или нет.
Счётчики «до и после» SHALL покрывать **каждую единицу хранения витрины**:
часовые объекты, тренировки и записи. Отпечаток отвечает «да/нет» за витрину
целиком, поэтому единица, которой нет в счётчиках, делает расхождение
безадресным: человек увидит «не совпало» при неизменившемся числе объектов и не
отличит появление двадцати семи тренировок от пропажи двух.
часовые объекты, тренировки, записи и строки реестра категориальных значений.
Отпечаток отвечает «да/нет» за витрину целиком, поэтому единица, которой нет в
счётчиках, делает расхождение безадресным: человек увидит «не совпало» при
неизменившемся числе объектов и не отличит появление двадцати семи тренировок от
пропажи двух. Перечень пополняется **тем же изменением**, которое заводит
единицу хранения: список закрытый, и единица, не внесённая в него, молчит ровно
там, где расхождение впервые становится заметным.
Отказы SHALL считаться **по классам**: слой не выводится, содержимое не
разбирается, работа отложена по обстоятельствам, всё прочее. Невыведенный слой
@@ -362,13 +365,17 @@
печатать их сравнение значило бы выдать неизмеренное за измеренное, причём в
единственном оракуле задачи. Ожидаемые классы расхождения (новые доставки за время прогона,
непереносимый признак запечатанного часа, исправленный разбор, **покрытая
разбором новая секция**) SHALL называться отдельно от самого факта расхождения.
разбором новая секция**, **появившаяся единица хранения**) SHALL называться
отдельно от самого факта расхождения.
Класс «покрыта новая секция» назван потому, что первый прогон после такого
изменения расходится **гарантированно** и штатно: витрина обзаводится единицами
хранения, которых в рабочей базе нет по построению. Не назвав его, отчёт
приучает человека игнорировать расхождение отпечатков — то есть обесценивает
оракул ровно тогда, когда по нему принимается необратимое решение.
оракул ровно тогда, когда по нему принимается необратимое решение. Класс
«появилась единица хранения» — та же причина в общем виде: реестр категориальных
значений пуст у витрины, свёрнутой прежним бинарём, и первая сверка после
выкатки расходится по нему одному, при неизменившихся объектах и сущностях.
**Исход команды.** Расхождение отпечатков отказом быть MUST NOT: после
исправления разбора оно ожидаемо и есть сам смысл пересборки. Отказ отдельной
@@ -383,7 +390,9 @@
выполнивший напечатанную процедуру, заменил бы витрину пустой.
Отчёт значений точек, имён метрик, имён устройств и содержимого тел содержать
MUST NOT: отпечаток берёт содержимое хешем. Ограничение относится к отчёту в
MUST NOT: отпечаток берёт содержимое хешем. Строки реестра при этом счётом, а не
перечислением: наблюдённое значение — данные о здоровье наравне со значением
точки. Ограничение относится к отчёту в
стандартном выводе; лог свёртки живёт по правилам спеки хранения, где координаты
столкновения (метрика, слой, час) разрешены явно.
@@ -402,7 +411,15 @@ SHALL идти в поток ошибок, а не смешиваться с о
- **WHEN** пересборка завершилась
- **THEN** отчёт печатает «до и после» отдельно для часовых объектов,
тренировок и записей
тренировок, записей и строк реестра категориальных значений
#### Scenario: Пустой реестр рабочей витрины назван ожидаемым классом
- **WHEN** рабочая витрина свёрнута прежним бинарём и строк реестра не имеет, а
пересобранная их получила
- **THEN** отчёт называет «появилась единица хранения» ожидаемым классом
расхождения
- **AND** печатает число строк реестра «до и после»
#### Scenario: Расхождение отпечатков не является отказом
@@ -444,7 +461,8 @@ SHALL идти в поток ошибок, а не смешиваться с о
#### Scenario: Отчёт не раскрывает данных о здоровье
- **WHEN** отчёт напечатан
- **THEN** он не содержит ни значений точек, ни имён метрик, ни имён устройств
- **THEN** он не содержит ни значений точек, ни имён метрик, ни имён устройств,
ни наблюдённых категориальных строк
### Requirement: Отказ на одной доставке не останавливает пересборку
@@ -497,4 +515,3 @@ SHALL идти в поток ошибок, а не смешиваться с о
- **WHEN** журнал содержит доставку, приехавшая версия сущности в которой
теряет содержание сохранённой
- **THEN** отчёт пересборки называет число удержанных версий больше нуля