Pivot с Device на Organization подтверждён через session c9560637 (Feb 17–20 2026): Google Healthcare API не принимает Device-references в author[x] choice type. Это vendor-specific ограничение — FHIR R4 spec разрешает Device через author[x], но Google валидатор отвергает. Используется Organization/bloodgpt для всех AI-generated полей.

Контекст

Composition.author, CarePlan.author, Observation.note[].authorReference — все указывают на “кто написал/сгенерировал этот FHIR-кусок”. В нашем случае автор — система BloodGPT (AI). FHIR Annotation.author[x] (см. fhir-annotation) — choice type: либо authorString (просто строка), либо authorReference (ссылка на ресурс). Какой ресурс ставить в качестве AI-автора?

Рассматривали

  • authorString: "BloodGPT AI" — простейший вариант, никаких новых ресурсов. Но нет места для версии модели, prompt-version, audit trail. При смене prompts/моделей вся история сваливается в одну строку.
  • authorReference → Device/bloodgpt-ai (initial выбор в 871a7608, Feb 13–16) — Device-ресурс хранит version, deviceName, note[] с описанием модели и prompt-версии. Один Device per tenant FHIR store, создаётся при provisioning datasets, conditional create в bundles.
  • authorReference → Organization/bloodgpt (pivot в c9560637, Feb 17) — Organization вместо Device, потому что Google Healthcare API отверг Device.

Выбрали: Organization

authorReference: { reference: "Organization/bloodgpt" } — для всех AI-generated полей.

Почему (verified в c9560637)

Healthcare API принимает в author[x] только: Practitioner | Patient | RelatedPerson | Organization. Device — отвергается с validation failure. Это vendor-specific, не FHIR R4 ограничение.

Ильдар: «мы решили поменять на Организацию вместо Девайс. потому что вроде healthcare api не работает с девайсом»

Backward-compatible fallback (читать legacy Device/bloodgpt-ai) при reading рассматривался Claude как защита от старых записей и был отклонён:

Ильдар: «не надо бекверд-компактибл»

Чисто Organization, без legacy paths.

Следствия

  • В коде 6 файлов перешли на Organization/bloodgpt: enrich-fhir-observations.function.ts, fhir-careplan-builder.ts, fhir-composition-builder.ts, healthcare-dataset.function.ts, fhir-response-builder.ts, scripts/migrate-to-fhir.ts.
  • Provisioning function создаёт Organization/bloodgpt только для новых datasets. Existing prod orgs на момент pivot’а не имели этого ресурса → runtime error reference target(s) not found: Organization/bloodgpt. Manual fix через gcloud + curl сделан только для двух prod datasets (org-cmlpaxq2g0001nv1511l4t6v9, org-cmlpbcp5l0000pl14apu115cw). Backfill для остальных не сделан системно — открытое (см. multi-tenant-fhir-storage [О5]).
  • Версия модели и prompt-версия теряют структурированное место в FHIR. Workarounds: хранить в BloodTest метаданных (aiModel, promptVersion уже есть в CompositionInput), либо в Observation.note[].text префиксом. Не финализировано.
  • Regulatory framing: Organization-as-author — это “компания-автор”, проще для текущей “не ставим диагнозов” позиции, чем Device.

Open questions

  • Один Organization на весь BloodGPT (Organization/bloodgpt) или per-tenant вариант? Сейчас один. Если будут whitelabel-инсталляции с собственным брендингом — может потребоваться Organization/{tenantId} для брендинга + Organization/bloodgpt для AI-author (отдельные ресурсы).
  • Promotion на DiagnosticReport.resultsInterpreter — стандартное FHIR поле для “кто отвечает за интерпретацию результатов” (verified в c9560637). Сейчас используется только author на Composition/CarePlan/note. Promotion — отдельная задача.

Связано

Источники

Источники: 1.

Сноски

  1. FHIR R4 Annotation.author, accessed 2026-05-17, https://hl7.org/fhir/R4/datatypes.html#Annotation.