tasks: разобраны вопросы и набран спринт 2026-08-03

- открытых вопросов не осталось: три решения владельца доведены до берущегося
  вида, по entity-without-parsed-label принято хранить с NULL-меткой после Read API
- unseen-sections-check сжата до остатка — активная проверка появления секции;
  разбор невиденных секций из неё вынут, вслепую он не пишется
- спринт под целью parsing-and-storage: categorical-value-dictionary и
  unseen-sections-check, обеим написаны критерии приёмки с оракулами
This commit is contained in:
av
2026-08-03 17:47:41 +03:00
parent b2bdb6383f
commit 3df42afeca
8 changed files with 112 additions and 56 deletions
@@ -35,7 +35,33 @@ HAE отдаёт перечислимые значения строками ло
расколется вторично — уже на «стабильной» стороне. Простейшее решение: хранить код как есть, а
эквивалентность старых и новых имён держать отдельной таблицей синонимов.
Готово, когда фазы сна из потока и из экспорта Apple сравниваются напрямую, а
`/stats` показывает строки, для которых кода ещё нет.
`stateOfMind` в словаре не нуждается — он и так шлёт коды HealthKit.
## Критерии приёмки
- фаза сна из потока («БДГ») и из экспорта Apple
(`HKCategoryValueSleepAnalysisAsleepREM`) за один период сопоставляются
напрямую — оракул: запрос на живой базе за период с известным перекрытием,
ноль несопоставимых строк
- строка сохранена **дословно**, код лежит рядом отдельным полем — оракул: тест
разбора на реальном пакете HAE из `internal/hae/testdata`
- незнакомая строка даёт пустой код, разбор не падает, а событие попадает в
счётчик — оракул: тест на выдуманной фазе сна плюс проверка счётчика
- переименование кода самой Apple (`…Asleep``…AsleepUnspecified`, находка 43)
не раскалывает историю — оракул: тест на паре синонимов, обе формы сходятся
в один код
- повторный прогон живого архива даёт то же состояние — оракул:
`task verify:archive`
Критерий «`/stats` показывает строки без кода» снят при переоценке 2026-08-03:
`/stats` ещё нет ([stats-endpoint](stats-endpoint.md)), и вешать приёмку на
несуществующий оракул значит либо блокировать задачу, либо принять её
непроверенной. Наблюдаемость закрывается счётчиком; показ в `/stats` — строка
задачи наблюдаемости, а не этой.
## Рамки
Схема трогается: у категориального значения появляется поле кода, плюс таблица
синонимов. Дословную строку не заменяем и не нормализуем — инвариант «точки
хранятся дословно». Пересборка обязана оставаться детерминированной, оракул
тот же `task verify:archive`.