Перейти к основному содержимому

Каноничная доменная ось платформы (ось 1)

Версия: 1.0 Дата: 25.04.2026 Статус: Готов к обсуждению

Назначение документа

Этот документ — раскрытие первой оси верхнеуровневой архитектуры: каноничная доменная ось (canonical domain spine). Он отвечает на вопросы: какие сущности являются каноничными, какие — производными от поставщиков, какие — операционными, транзакционными, композиционными, governance-сущностями, как они связаны между собой, какие у них жизненные циклы, и как доменная ось проявляется на других пяти осях архитектуры.

Это верхнеуровневое описание. Детальная семантика каждой сущности — в документах второго круга (reference/domain-model.md, reference/offer-pricing-booking-semantics.md, reference/tenancy-and-identity.md, reference/tour-builder-domain.md и других).

Документ читается после главной архитектурной оси (overview/index.md) и манифеста переосмысления (overview/platform-vision-and-manifest.md).

Главный принцип каноничной модели

Каноничная модель проектируется от целей платформы, не от структур поставщиков. Это правило 00000 в применении к доменной оси.

Из этого следует:

  • поле в каноничной модели появляется потому, что домен Vitiana требует его существования, а не потому, что «у Stuba так возвращается»;
  • если поставщик не предоставляет нужного поля — это технический долг ingestion adapter, не недостаток модели;
  • любой поставщик отключаем без переделки каноничной модели;
  • любой новый поставщик подключается через новый ingestion adapter, без расширения каноничных полей.

Семь групп каноничных сущностей

Каноничные сущности делятся на семь групп по их роли в платформе. Каждая группа имеет свою политику истины (truth policy), свой жизненный цикл, свои правила видимости на поверхностях.

Группа 1. Каноничные мастер-сущности (canonical master entities)

Что включает:

  • Property — каноничная сущность объекта размещения как стабильной мастер-записи платформы;
  • CanonicalProduct — каноничная продуктовая единица внутри property context;
  • Organization — родовая сущность организации;
  • User — пользователь;
  • Partner — партнёр (специализация Organization);
  • Agency — туристическое агентство (специализация Organization);
  • PolicySet — набор политик (commercial, governance, operational);
  • GovernanceDecision — формализованное решение управления данными.

Политика истины: master truth — долгоживущая, audit-critical, изменяется только через governance.

Жизненный цикл: candidate → mapped → canonicalized → enriched → revised → governed.

Где живёт: постоянная модель платформы (managed PostgreSQL Public Cloud в фазе Bootstrap; Bare Metal Scale в фазе 3+).

Видимость на поверхностях: различная per-surface; полная видимость на Internal Operational Surface, контракт-безопасное представление на Partner API Surface, презентационное на B2C.

Группа 2. Сущности, производные от поставщиков (supplier-derived entities)

Что включает:

  • Supplier — поставщик информации;
  • SupplierProperty — supplier-specific представление того, что потенциально соответствует Property;
  • SupplierProduct — supplier-specific продаваемая единица;
  • SupplierPayload — сырая полезная нагрузка от поставщика;
  • SupplierSyncRun — запуск синхронизации;
  • SupplierCapabilityProfile — профиль возможностей поставщика (что он умеет давать);
  • SupplierBookingReference — ссылка на бронирование на стороне поставщика.

Политика истины: supplier truth — append-heavy, replay-friendly, отдельная от master truth.

Жизненный цикл: received → parsed → normalized → mapped → consumed_in_canonical_update or rejected_to_governance.

Где живёт: persistent supplier trace layer (отдельный от canonical layer).

Видимость на поверхностях: только Internal Operational и Service-to-Service. Внешние поверхности не видят supplier-derived entities в их сыром виде.

Главный принцип: supplier-derived entities никогда не подменяют canonical entities. Они существуют параллельно как trace того, что пришло от поставщика.

Группа 3. Операционные сущности предложения (operational offer entities)

Что включает:

  • Offer — конкретное предложение, пригодное для показа, quotation, revalidation, потенциального бронирования;
  • AvailabilitySnapshot — краткоживущая фиксация состояния доступности;
  • PriceSnapshot — краткоживущая фиксация технической или коммерчески нормализованной цены;
  • Quote — actor-aware коммерческая фиксация (commercial promise);
  • RevalidationResult — результат повторной проверки;
  • SearchSession — сессия поиска.

Политика истины: operational truth — краткоживущая, но не одноразовая; reproducible, audit-friendly для retention-grade требований.

Жизненный цикл Offer: computed → surfaced → compared → quoted → expired / revalidated / superseded.

Жизненный цикл Quote: created → active → revalidated / stale → expired / consumed.

Где живёт: persistent operational layer + rebuildable cache. Quote с audit-significant ролью — в persistent layer.

Видимость на поверхностях:

  • Offer — все основные поверхности с разной детализацией;
  • Quote — actor-aware видимость; на Agency полная структура, на Partner контракт-безопасная, на B2C финальная цена;
  • AvailabilitySnapshot, PriceSnapshot — внутренние, видимы только Internal и S2S.

Группа 4. Транзакционные сущности (transactional entities)

Что включает:

  • Booking — транзакционная фиксация подтверждённой или partially-resolved коммерческой операции;
  • BookingItem — элемент бронирования;
  • BookingEvent — событие в lifecycle бронирования;
  • PaymentIntent — намерение платежа;
  • Refund — возврат;
  • AmendmentRequest — запрос на изменение бронирования.

Политика истины: transactional truth — audit-critical, retention-grade, никогда не теряется.

Жизненный цикл Booking: draft_intent → submitted → pending_revalidation → pending_supplier_confirmation → supplier_confirmed → platform_confirmed → partially_failed / failed → cancel_requested → cancel_pending → cancelled → amendment_requested → amendment_in_progress → completed → unknown_external_state.

Полное описание state machine — reference/booking-state-machine.md фазы 5.

Где живёт: persistent transactional layer; должна переживать инциденты, расследования, reconciliation, споры, финансовую отчётность.

Видимость на поверхностях:

  • Internal — полный lifecycle + audit;
  • Agency — полное состояние своих бронирований;
  • Partner — контракт-безопасное состояние своих бронирований через webhooks + read API;
  • B2C — собственные бронирования с упрощённой видимостью;
  • S2S — полное состояние.

Группа 5. Композиционные сущности (composition entities)

Что включает:

  • TourDraft — рабочая, изменяемая композиционная сущность;
  • TourDraftItem — отдельный элемент композиции внутри draft;
  • DraftVariant — альтернативный вариант элемента;
  • TourProposal — коммерчески представляемая форма результата Tour Builder;
  • ProposalVersion — версия proposal;
  • ProposalArtifact — материализованный output (PDF, share-link, branded export).

Политика истины:

  • TourDraft — мутабельная working composition truth;
  • TourProposal — published commercial presentation truth, привязанная к версии;
  • ProposalArtifact — materialized output of proposal version.

Жизненный цикл TourDraft: created → editing → structured → awaiting_repricing → awaiting_revalidation → ready_for_proposal → archived.

Жизненный цикл TourProposal: prepared → published → shared → viewed → superseded → expired → accepted_for_conversion → archived.

Где живёт: persistent layer для draft / proposal / version metadata; object storage для artifact blobs.

Видимость на поверхностях:

  • Tour Builder Closed Surface — first-class;
  • Agency Working Surface — composer view + history;
  • Partner API Surface — только при наличии paid Tour Builder tier;
  • B2C — published proposal view по share-ссылке.

Главный принцип: composition entities — это модульный продукт, состоящий из:

  • модуль размещения (accommodation segment);
  • модуль переезда (transfer segment);
  • модуль активности (activity);
  • модуль услуги (service);
  • модуль аренды транспорта (transport rental);
  • модуль страхования (insurance);
  • пользовательский модуль (custom block);
  • информационный модуль (informational block).

Каждый модуль имеет свой контракт совместимости (compatibility check) и свои операционные правила.

Группа 6. Сущности управления и проверки (governance and review entities)

Что включает:

  • ReviewCase — кейс проверки данных;
  • MappingDecision — решение о маппинге supplier entity к canonical;
  • MergeDecision — решение о слиянии данных от нескольких поставщиков;
  • Anomaly — обнаруженная аномалия данных или операционная;
  • FieldLineage — происхождение значения каждого поля canonical entity;
  • SourcePrecedenceRule — правило приоритета источника при конфликте.

Политика истины: governance truth — долгоживущая, audit-critical; обеспечивает explainability платформы.

Жизненный цикл ReviewCase: detected → queued → reviewed → decided → applied / rejected → audited.

Где живёт: persistent governance layer. Никогда не уходит в чистый cache или unreliable очереди.

Видимость на поверхностях:

  • Internal Operational — полный набор governance операций;
  • На внешних поверхностях напрямую не видны; результаты проявляются через публикацию (publication contour) и repricing.

Группа 7. Сущности субъектов, тенантов и доступа (identity, tenancy, access entities)

Что включает:

  • Tenant — boundary of isolation and policy application;
  • Workspace — рабочее пространство внутри tenant;
  • RoleAssignment — назначение роли пользователю;
  • CapabilityGrant — выданное право (атомарное или полуатомарное);
  • ApiClient — machine subject для machine access;
  • ApiCredential — учётные данные API-клиента;
  • ActorContext — текущий рабочий контекст identity (тот же User может быть в разных actor-контекстах).

Политика истины: master truth для основных сущностей; runtime state для access markers (rate windows, idempotency keys) — отдельный класс.

Где живёт: persistent layer для identity и tenancy truth; runtime cache для коротких access markers.

Видимость на поверхностях: subject-aware, tenant-aware, capability-aware на всех поверхностях.

Главный принцип: identity, tenancy, capability, contract — четыре разные сущности, не одна. Identity отвечает «кто», tenant — «где», capability — «что», contract — «как». Не сливать в один «role» или один «user type».

Группы сущностей и поверхности — матрица видимости

Группа сущностейInternalAgencyPartnerB2CS2STour Builder
Canonical MasterFull + lineageContent + structureContract-safe contentPresentation-safeFullContent + module
Supplier-derivedFullLimited (governance UI)HiddenHiddenFullHidden
Operational OfferFull + governance stateFull operational + commercialContract-safe with freshnessIndicativeFullAs composable input
TransactionalFull lifecycle + auditOwn stateOwn contract-safe stateOwn onlyFullAs composition output
CompositionFullComposer viewTour Builder tier onlyPublished viewFullFirst-class
Governance/ReviewFullHiddenHiddenHiddenFullHidden
Identity/Tenancy/AccessFullOwn contextOwn contextHiddenFullOwn

Доменные контуры

Сущности группируются в доменные контуры — операционные процессы, в которых участвуют разные группы сущностей.

Контур приёма данных (data ingress contour)

Сущности: Supplier, SupplierPayload, SupplierProperty, SupplierProduct, SupplierSyncRun + Property, CanonicalProduct.

Процесс: supplier reality → ingestion adapter → normalization → mapping → governance review or auto-update of canonical.

Главное правило: ingestion adapter переводит произвольные представления в каноничную модель Vitiana, не наоборот.

Контур поиска и обнаружения (search and discovery contour)

Сущности: SearchSession + Property, Offer (в виде поисковой проекции).

Процесс: intent capture → ranking → fasceting → result delivery.

Главное правило: результат поиска — не offer-объект напрямую, а проекция (search projection), оптимизированная для read-heavy traffic.

Контур фиксации обещаний (offer-quote contour)

Сущности: Offer, AvailabilitySnapshot, PriceSnapshot, Quote, RevalidationResult.

Процесс: discovery → offer materialization → commercial interpretation → quote fixation → revalidation/repricing.

Главное правило: Quote — actor-aware фиксация, не «ещё одна цена на карточке». Quote удерживает quoted promise, validity window, applied commercial policy.

Контур транзакционного коммита (transactional commit contour)

Сущности: Quote → Booking, BookingItem, BookingEvent, PaymentIntent.

Процесс: booking intent → quote revalidation → supplier reservation → platform confirmation → settlement event generation.

Главное правило: booking lifecycle сложнее, чем pending / confirmed / cancelled. Полная state machine — в reference/booking-state-machine.md фазы 5.

Контур пост-продажи (post-booking contour)

Сущности: Booking, AmendmentRequest, Refund, BookingChangeRequest, CancellationCase, SupplierDisruptionCase, SupportCase, PostBookingDecision, RefundDecision, CompensationDecision, CommunicationRecord.

Процесс: booking confirmed → потенциально cancellation/amendment/disruption → financial correction → resolution.

Главное правило: post-booking — отдельный домен, не «хвост booking». Polно описан в reference/post-booking-lifecycle.md.

Контур композиции тура (tour composition contour)

Сущности: TourDraft, TourDraftItem, DraftVariant, TourProposal, ProposalVersion, ProposalArtifact + ссылки на Offer, Quote, Booking.

Процесс: draft creation → component assembly → variant exploration → proposal creation → version → artifact generation → optional conversion to bookings.

Главное правило: Tour Builder работает как закрытая система с raw API constructor по модулям. Это ядро платформы, не вторичная UI-фича.

Контур взаиморасчётов (settlement and clearing contour)

Сущности: Booking → SettlementEvent, ReconciliationCase + Partner Financial Account, Clearing Balance, Deposit, Credit Limit, Hold, Clearing Entry, Netting Rule.

Процесс: booking confirmed → settlement event → supplier payable → agency commission → partner share → reconciliation → clearing.

Главное правило: clearing — отдельный домен от settlement. Описан в reference/partner-finance-and-clearing.md.

Контур governance и review (governance contour)

Сущности: ReviewCase, MappingDecision, MergeDecision, Anomaly, FieldLineage, SourcePrecedenceRule + влияет на все остальные сущности.

Процесс: detection → queue → review → decision → application or rejection → audit.

Главное правило: governance — не побочный admin-функционал, а самостоятельный контур платформы. Описан в reference/data-governance-and-matching.md.

Контур учёта потребления и тарификации (metering and billing contour)

Сущности: UsageEvent, MeteringWindow, QuotaState, BillingEntry + связь с Tenant, ApiClient, ApiCredential.

Процесс: взаимодействие на любой поверхности → tracking event → aggregation → quota check → billing entry generation.

Главное правило: metering — продуктовый контур, не операционный. Прямо влияет на динамическое ценообразование. Описан в reference/api-metering-and-usage-governance.md.

Контур наблюдаемости (observability contour)

Сущности: Trace, Metric, Log, Alert + связь со всеми другими сущностями через correlation IDs.

Процесс: action на любой поверхности → trace creation → metrics emission → log capture → optional alert → dashboard visibility.

Главное правило: observability — сквозной контур, проходит через все остальные. Технологический baseline — operations/observability-tooling-baseline.md.

Сущности и контуры — матрица

КонтурГлавные сущности
Data ingressSupplier, SupplierPayload, SupplierProperty, SupplierProduct, SupplierSyncRun, Property, CanonicalProduct
Search & discoverySearchSession, Property, Offer (projection)
Offer-QuoteOffer, AvailabilitySnapshot, PriceSnapshot, Quote, RevalidationResult
Transactional commitQuote, Booking, BookingItem, BookingEvent, PaymentIntent
Post-bookingBooking, AmendmentRequest, Refund, BookingChangeRequest, CancellationCase, SupplierDisruptionCase, SupportCase
Tour compositionTourDraft, TourDraftItem, DraftVariant, TourProposal, ProposalVersion, ProposalArtifact
Settlement & clearingBooking, SettlementEvent, Partner Financial Account, Clearing Balance, Hold
Governance & reviewReviewCase, MappingDecision, MergeDecision, Anomaly, FieldLineage, SourcePrecedenceRule
Metering & billingUsageEvent, MeteringWindow, QuotaState, BillingEntry
ObservabilityTrace, Metric, Log, Alert

Источники истины и политики свежести

Каждая группа сущностей имеет свою политику истины и политику свежести. Эти политики определяют:

  • какой срок допустимой устарелости (acceptable staleness);
  • когда требуется повторная проверка (revalidation);
  • какие данные сохраняются для audit, даже если устарели операционно;
  • как обрабатываются конфликты между источниками.

Полное описание — в reference/storage.md. Ключевые моменты:

ГруппаAcceptable stalenessRevalidation trigger
Canonical MasterДни (для content), часы (для классификации)Governance review + supplier sync
Supplier-derivedМинуты-часыКаждый sync run
Operational OfferМинутыКаждый search; обязательно перед quote
QuoteValidity window (минуты-часы по типу)Перед transition в booking; явно через repricing
TransactionalБез устаревания (audit-grade)Только supplier-driven changes
CompositionЧасы для drafts; days для published proposalsПри изменении underlying offers
GovernanceБез устареванияManual review only
Identity/TenancyДни-неделиПо administrative actions

Что нельзя путать в каноничной модели

После фиксации этой оси следующие смешения запрещены во всех документах:

  • PropertyOffer — Property стабилен, Offer операционный.
  • SupplierPropertyProperty — SupplierProperty не подменяет Property.
  • CanonicalProductSupplierProduct — каноничный vs supplier-specific.
  • OfferQuote — Offer операционная возможность, Quote actor-specific фиксация.
  • QuoteBooking — Quote коммерческое обещание, Booking транзакционная фиксация.
  • TourDraftTourProposal — Draft мутабельная working composition, Proposal published versioned presentation.
  • TourProposalProposalArtifact — Proposal сущность, Artifact materialized output.
  • User identityActor context — identity отвечает «кто», ActorContext отвечает «в какой роли сейчас».
  • PartnerAgency — разные коммерческие категории Tenant.
  • supplier truthplatform canonical truth — две разные истины, никогда не смешивать.
  • cached previewcommit-ready state — UI кеш не commit-ready.
  • quote validity windowavailability TTL — commercial обещание vs operational актуальность.
  • supplier confirmationplatform confirmation — успех у поставщика vs успех в caнonic transactional layer.
  • booking failureunknown external state — известный отказ vs неопределённость.
  • display pricequoted price — UI-проекция vs commercial promise.
  • quoted pricesettlement price — commercial promise vs financial reality.
  • commercial fixationtransactional commit — quote vs booking.

Связь с другими осями архитектуры

Связь с осью 2 (поверхности взаимодействия)

Каждая сущность проявляется на разных поверхностях с разной видимостью. Полная матрица видимости — выше в этом документе.

Связь с осью 3 (платформа как продукт)

  • Tenant, Partner, Agency, ApiClient, ApiCredential — сущности тарификации.
  • TourDraft, TourProposal — сущности отдельного paid Tour Builder tier.
  • UsageEvent, BillingEntry — сущности динамической тарификации.

Связь с осью 4 (данные и интеллект)

  • Все сущности генерируют domain events.
  • FieldLineage — основа для data quality monitoring.
  • ML использует features, derived from canonical entities.
  • Tracking events — параллельный класс к domain events для аналитики.

Связь с осью 5 (операционная)

  • Booking — самый критический операционный домен (audit, recovery, SLA).
  • Governance — операционный процесс с человеком в цикле.
  • Replay capability — для всех групп сущностей с persistent layer.

Связь с осью 6 (реализация)

Карта соответствия каноничной модели и реальных таблиц home-to-go-api:

Каноничная группаТекущая реализация в home-to-go-apiСтатус
Canonical Master (Property, CanonicalProduct)hotels schemaПервая итерация, требует унификации для multi-supplier
Supplier-derivedполя supplier_* в hotelsТребует выноса в отдельный supplier trace layer
Operational Offerпока не реализовано как отдельный layerТребует разработки в фазе 2
Transactionalпока не реализованоТребует разработки в фазе 2
Composition (Tour)не реализованоТребует разработки в фазе 2-3
Governanceне реализовано как layerТребует разработки в фазе 2
Identity/Tenancy/Accessтаблицы usr_* (18 таблиц)Первая итерация, требует ревью на multi-tenant модель
Metering & billingне реализованоТребует разработки в фазе 2-3
Observabilityбазовая через managed toolsТребует углубления в фазе 2

Полное раскрытие — в overview/relation-to-implementation-baseline.md.

Углубление каноничной оси в документах второго круга

Эта ось верхнего уровня раскрывается детально в документах второго круга:

ТемаДокумент второго круга
Каноничные сущности и их атрибутыreference/domain-model.md
Семантика Offer/Quote/Bookingreference/offer-pricing-booking-semantics.md
Семантика Tenant/Identity/Accessreference/tenancy-and-identity.md
Семантика Tourreference/tour-builder-domain.md
Семантика governancereference/data-governance-and-matching.md
Семантика commercialreference/commercial-model.md
Семантика partner financereference/partner-finance-and-clearing.md
Семантика post-bookingreference/post-booking-lifecycle.md
Семантика supplier intakereference/ingestion.md
Семантика storagereference/storage.md
Семантика persistent schemareference/database-schema.md

В фазе 5 будут созданы дополнительные углубляющие документы:

  • reference/booking-state-machine.md — полная state machine bookings;
  • reference/tour-builder-operational-model.md — операционная модель Tour Builder;
  • reference/multi-tenant-isolation-strength.md — выбор уровня изоляции тенантов.

Что нельзя делать с этой каноничной моделью

  • Подстраивать каноничные поля под структуру конкретного поставщика;
  • Делать hotelId или roomTypeId достаточным transactional identifier (transactional identity — это Offer.id или Quote.id);
  • Сливать Quote и Booking в одну сущность;
  • Сливать TourDraft и TourProposal в одну сущность;
  • Сливать User и ActorContext (один пользователь может быть в разных ролях);
  • Сливать Partner и Agency (разные коммерческие модели);
  • Хранить supplier-derived entities в той же таблице, что canonical entities;
  • Терять FieldLineage при canonical update — оно должно отражать, кто и когда внёс каждое значение;
  • Допускать видимость supplier-derived entities на внешних поверхностях.

Уточнение naming состояний Booking (28.04.2026)

Запись жизненного цикла Booking в этом документе (Group 4, операционные сущности предложения) использовала рабочие именования, которые в Фазе 5 канонически зафиксированы в reference/booking-state-machine.md с точными именами 14 состояний. Эта секция фиксирует каноничные имена для использования во всех контрактах, событиях и кодовых артефактах.

Каноничные 14 состояний (источник истины — booking-state-machine.md)

Каноничное имяНазначение
1draftчерновик, не отправлен на обработку
2submittedотправлен в обработку, идут pre-checks
3pending_revalidationожидание revalidation у поставщика (drift detection)
4pending_supplier_confirmationожидание ответа поставщика по бронированию
5supplier_confirmedпоставщик подтвердил (но платформа ещё не финализировала)
6platform_confirmedплатформа финализировала (≡ confirmed для внешних потребителей)
7partially_confirmedпоставщик подтвердил часть позиций
8unknown_external_stateпоставщик не отвечает или отвечает некорректно (target SLI: менее 1%)
9failedизвестный отказ
10cancel_requestedзапрошена отмена
11cancel_in_progress_supplierотмена выполняется у поставщика
12cancelledотменено
13amendment_in_progressвыполняется изменение
14completedисполнено

Соответствие с упрощённой записью выше в этом документе

Запись жизненного цикла Booking в Group 4 (draft_intent → submitted → ... → completed → unknown_external_state) — рабочая высокоуровневая запись, не каноничные имена. При имплементации, контрактах API/AsyncAPI, событиях event stream — использовать только имена из таблицы выше.

Соответствие именований:

Запись в Group 4Каноничное имя
draft_intentdraft
partially_failedpartially_confirmed
cancel_pendingcancel_in_progress_supplier
amendment_requested (отдельный)(отсутствует — сразу amendment_in_progress)

Кроме того, верхнеуровневая запись содержит 15 элементов из-за разделения amendment_requested и amendment_in_progress. Каноничная state machine — 14 состояний.

Эта секция является уточнением no-destruction — текст Group 4 выше остаётся для смыслового каркаса, истина по именованию состояний — в booking-state-machine.md.

Связанная документация