Actuality-классификатор (biomarker-actuality-service) на каждый биомаркер выдаёт один из пяти finalStatus. Pipeline уже маркирует все биомаркеры этими тегами — но UI HealthReport использует это только частично. Эта страница фиксирует существующие альтернативы и leading-кандидаты, не settled-решение.
Контекст
Endpoint /api/patient-summary foled-ит actualityStatus в каждый element массива parameters[] (через parametersWithActuality). То есть данные на UI приходят однородно — у каждого биомаркера есть tag-поле. Вопрос только в том как это рендерить.
Параллельно работает scope-axis вопрос: actuality-классы имеют смысл только на patient-wide latest-per-analyte surface (HealthReport), на single-test surface (test detail) — не применимы. Эта страница покрывает только HealthReport.
5 классов вывода actuality
| Класс | Семантика | Текущий UI |
|---|---|---|
currently_representative | значение надёжно, отражает текущее состояние | обычный рендер в основном списке |
currently_representative_with_caveat | значение надёжно, но есть caveat (активный driver) | нет UI signal, рендерится как representative |
likely_outdated | значение не отражает текущее состояние | отдельная amber-секция «Not reflecting current state» (M2, реализовано 2026-05-19); в основном списке не показывается |
lifelong_no_retest | значение пожизненное по природе (blood type, baseline) | проходит дальше как обычный representative (per 2026-05-19 decision) — Reasoner+Writer generate prose, рендерится inline. Не дроп’ается, не выделяется визуально пока |
error / unknown | classifier не смог дать verdict | fail-open — рендерится как representative, нет UI signal |
Pipeline в health-report.function.ts:951-980 пишет CI sub-extension stub только для likely_outdated (без prose). Lifelong stubs не пишутся — они не нужны, так как биомаркер живёт в обычном flow с полной prose. Error stubs тоже не пишутся (fail-open поведение).
Состояния строки в UI
Каждая строка имеет два визуальных состояния — collapsed (одна строка с именем, датой, status badge, значением — дефолт) и expanded (после клика — range bar + AI prose или placeholder). 5 классов × 2 состояния = 10 ячеек для решения.
Позиции
M1 — единый список со всеми маркерами
Все биомаркеры в одном списке с per-row markers (badges, иконки, цвет).
Реальный prototype (2026-05-19) — добавили inline badge ⏱ outdated (красный) для likely_outdated рядом с именем биомаркера. Caveat сохранён как был (амбер), lifelong / error не реализованы.

ASCII-эскиз для остальных классов (не реализованных):
Hematology — 5 items
Гемоглобин 26.04.2026 Normal 13.2
⏱ Эритроциты 26.04.2026 Stale 4.8
ⓘ Trombociti 15.03.2026 Normal * 280 ← caveat
🔒 Group_AB+ 05.01.2020 Permanent AB+ ← lifelong
⚠ ALT 26.04.2026 Unknown 25 ← classifier failed
За: компактность; всё про биомаркер в одном месте; сохраняет panel-группировку.
Против: нужна легенда; risk визуальной перегрузки; lifelong и outdated теряются среди обычных. В live-проверке (2026-05-19) пользователь оценил inline badge как «как-то плохо» — рядом со status «Normal» badge ⏱ outdated визуально неуместен (биомаркер одновременно «нормален» и «устарел» — два противоречивых сигнала рядом).
M2 — отдельные секции для не-current классов
Survivors в основном. Outdated и lifelong в отдельных секциях. Error — TBD.
Реальная реализация amber-секции для outdated (2026-05-19) — OutdatedParametersSection в HealthReport.tsx:

ASCII-эскиз с lifelong / error секциями (не реализованы):
Current state
Hematology — 1 item
ⓘ Trombociti 26.04.2026 Normal * 280
Not reflecting current state — 2 biomarkers
Гемоглобин 26.04.2026 13.2 г/дл
Эритроциты 26.04.2026 4.8 млн/мкл
Recommend: retake to refresh
Permanent markers — 1 biomarker
Group_AB+ 05.01.2020 AB+
Baseline value — no retest needed
За: chunks по семантике; outdated не путается с current; в live-проверке (2026-05-19) пользователь leaned к этому варианту over inline badge — amber-секция читается понятнее, чем badge inline. Против: длиннее scroll; разрывается panel-группировка; маленькая секция выглядит зря.
M3 — гибрид
Caveat — inline в основном. Outdated / lifelong / error — отдельные секции.
Hematology — 1 item
ⓘ Trombociti 26.04.2026 Normal * 280
↓ AI: «...на фоне Metformin, контекст важен»
Not reflecting current state — 2
Гемоглобин 26.04.2026 13.2 г/дл
Эритроциты 26.04.2026 4.8 млн/мкл
Permanent markers — 1
Group_AB+ 05.01.2020 AB+
За: caveat и representative вместе (есть prose); outdated и lifelong отдельно (нет prose). Против: три render-механизма; semantic boundary «есть prose / нет prose» не совпадает с «надёжно / не надёжно».
Текущий leaning (после live prototype 2026-05-19)
Реализовали M1 и M2 одновременно на actuality-mvp-dirty worktree, проверили на Maria Test patient. Пользовательская оценка — M1 inline badge не сработал: рядом со status badge Normal рендерить ещё один badge ⏱ outdated визуально неуместно — два противоречивых сигнала (биомаркер одновременно «в норме» и «устарел») в одной строке. M2 amber-секция читается лучше — outdated биомаркеры дистанцируются от current state списка, signal не смешивается с reference-range статусом.
Decision не final — нужно ещё (a) проверить как M2 выглядит на пациенте с большим числом likely_outdated (3-5+), (b) понять как surface’ить lifelong и error, и (c) решить что делать с заголовком панели «All parameters are within normal range!» когда внутри панели есть outdated биомаркеры (см. ниже).
Что нужно для разрешения
- Inventory lifelong-биомаркеров — сколько у среднего пациента классификатор маркирует
lifelong_no_retest. Малое число → inline; большое → отдельная секция оправдана. - Caveat surface design — какой visual marker (icon, bordered box, color tint). Пересекается с дизайн-системой my-health / health-report-vision.
- Outdated row expand поведение — раскрывать или нет если prose нет. То же для error/unknown.
- Error UI signal — fail-open сейчас выглядит как representative. Сознательная политика или gap.
Следствия выбора
| M1 | M2 | M3 | |
|---|---|---|---|
| Endpoint shape | один parameters[] с tags | + отдельные массивы за класс | аналог M2 |
| Кол-во UI секций | 1 | 3 | 3 |
| Группировка по panel | сохраняется | разрывается | частично |
| Legend | да | минимально | минимально |
| Cost рефакторинга | low | med | med |
Открытые вопросы
- Цветовая палитра — какие цвета для какого класса (outdated, caveat, lifelong, error). Согласованно с palette HealthReport.
- Iconography — какие иконки доступны в design system
- Sort order внутри outdated секции — по дате, по panel, или по importance
- Lifelong rows — раскрываются или нет
- Mobile / responsive — обе модели должны работать на узком экране
- Заголовок панели Hematology («All parameters are within normal range!») сейчас игнорирует outdated биомаркеры внутри. Если M2 (outdated дублирует в amber-секции) — нужно decide: убирать outdated из panel-списка совсем, или менять заголовок чтобы упоминать «N outdated»
Связано
- biomarker-actuality-service — сервис эмитит 5 классов — draft
- storing-biomarker-actuality — где persist выводы; storage decision отдельный от render — draft
- health-report-pipeline — где actuality живёт в общем pipeline — active
- health-report-versioning-model — versioning Composition / CI — active
- my-health — продуктовая страница HealthReport surface — active
- document-deletion-strategy — относится к edge case удалённой Observation — draft