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 / unknownclassifier не смог дать verdictfail-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 не реализованы.

M1 inline badge — Гемоглобин/Эритроциты с outdated badge в Hematology панели

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:

M2 — OutdatedParametersSection amber-блок «Not reflecting current state · 2 biomarkers»

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 биомаркеры (см. ниже).

Что нужно для разрешения

  1. Inventory lifelong-биомаркеров — сколько у среднего пациента классификатор маркирует lifelong_no_retest. Малое число → inline; большое → отдельная секция оправдана.
  2. Caveat surface design — какой visual marker (icon, bordered box, color tint). Пересекается с дизайн-системой my-health / health-report-vision.
  3. Outdated row expand поведение — раскрывать или нет если prose нет. То же для error/unknown.
  4. Error UI signal — fail-open сейчас выглядит как representative. Сознательная политика или gap.

Следствия выбора

M1M2M3
Endpoint shapeодин parameters[] с tags+ отдельные массивы за классаналог M2
Кол-во UI секций133
Группировка по panelсохраняетсяразрываетсячастично
Legendдаминимальноминимально
Cost рефакторингаlowmedmed

Открытые вопросы

  • Цветовая палитра — какие цвета для какого класса (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»

Связано