# Роадмап Что приложение уже умеет и чего ещё не умеет. Цель — возможность приложения, файл типа `goal` в `items/`; её задачи здесь **не перечисляются** — перечень даёт `tasks.py list --goal <слаг>`. Очередь значима только в «Запланировано» и обосновывается прозой рядом. В «Сопровождении» лежит то, чем держат проект — выкладка, инструмент, эксплуатация; граница проходит по тому, кто наблюдает: сообщает ли о состоянии приложение своему пользователю или дежурный смотрит на сервис снаружи. ## Запланировано Очередь держится на двух зависимостях. **`healthlog import` идёт перед чисткой нижнего слоя:** пока импорт экспорта не написан, помечать что-либо устаревшим не на основании чего. **MCP входит в чтение, а не идёт отдельной целью:** адаптер собственной логики не несёт, он переводит вызовы в те же обработчики, и очередь осталась порядком задач внутри цели. - [🎯 Клиенты читают данные через HTTP и MCP](items/read-api.md) — Данные видны только через sqlite на хосте — ни один из трёх потребителей, включая агента-медика, ничего прочитать не может - [🎯 Клиент узнаёт форму данных из ответа](items/self-description.md) — Метрик больше сотни и формы точек разные — клиент вынужден угадывать структуру по выборке - [🎯 История из родного экспорта Apple лежит в хранилище](items/native-export-import.md) — Слой sample пуст: полная история и точные сэмплы лежат в zip-архиве и никуда не едут - [🎯 Нижний слой чистится после проверенного экспорта](items/lower-layer-cleanup.md) — Нижний слой растёт на ~100 тысяч координат в сутки, а после экспорта Apple он избыточен - [🎯 Приложение сообщает о своём состоянии](items/observability.md) — Тихо сломавшаяся автоматизация — главный эксплуатационный риск, а сейчас факт виден только в логах ## Направления - [🎯 Исход слияния не зависит от порядка элементов на проводе](items/merge-robustness.md) — Правила слияния держатся на замерах, и каждый новый замер находит зависимость от порядка на проводе - [🎯 Расхождение витрины с журналом не молчит](items/journal-and-rebuild.md) — Расхождение витрины с журналом сейчас молчит: reindex печатает оба отпечатка, а сравнивать их некому - [🎯 У каждого входа есть названный предел](items/limits-and-load.md) — Предела на одну сущность нет вовсе: 63 МиБ держат блокировку 5.019 с, соседние доставки уходят в failed - [🎯 Новая форма от источника не теряется молча](items/parsing-completeness.md) — Пять секций HAE поток ещё не приносил, а ручные секции заводятся задним числом — разбор полон ровно до следующей новой формы ## Сопровождение - [🎯 Сервис доступен телефону из любой сети](items/deploy.md) — Сервис живёт на рабочей машине — телефон достаёт до него только дома, и оба контура открыты ## Готово - 2026-08-01 `ingest` — Сервис принимает доставки HAE и кладёт тела в архив. Приём отвечает `200` до разбора, свёртку ведёт фоновый воркер: код ответа отражает доставку, а не её понимание. - 2026-08-02 `reindex` — `healthlog reindex` проигрывает журнал в свежую витрину и печатает оба отпечатка. Повторный прогон ничего не меняет. - 2026-08-02 `catalog` — Клиент видит перечень разрезов с измеренным родом агрегации. Сверка минутного слоя с часовым разложила метрики живого корпуса на накопительные и мгновенные, не сойдясь ни на одной. - 2026-08-04 `parsing-and-storage` — Метрики, тренировки и записи со своими `id` разобраны и лежат в часовых объектах. Ни одна секция живого потока не числится неразобранной, категориальные значения несут стабильный код рядом с переведённой строкой, первая встреча незнакомой секции наблюдаема. Разведка формата закончена там же и записана в [research/apple-health.md](../research/apple-health.md): правило вывода слоя, модель идентичности и формы точки проверены на живом потоке. Возможностью приложения она не была, поэтому строки среди достигнутых целей не занимает.