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

ADR Index

Architecture Decision Records фиксируют решения, которые должны быть стабильной опорой для разработки. Формат каждого ADR должен оставаться коротким и проверяемым: контекст, решение, последствия, rollout и связанные документы.

ADRРешение
ADR-0001Monorepo и границы импортов
ADR-0002Backend: .NET 10, DDD, vertical slice
ADR-0003Frontend: React/Vite applications для рабочих интерфейсов
ADR-0004PostgreSQL как OLTP source of truth
ADR-0005Financial ledger и double-entry accounting
ADR-0006Kafka + MassTransit, Outbox/Inbox, event envelope
ADR-0007ClickHouse для аналитики
ADR-0008Elasticsearch как search projection
ADR-0009Observability: Serilog, OTEL, Sentry, correlation flow
ADR-0010External integrations через anti-corruption layer
ADR-0011Multi-tenant модель
ADR-0012Application feature slices
ADR-0013Layer dependencies и architecture tests
ADR-0014Repository pipeline и scope filters
ADR-0015Ports, providers и adapters
ADR-0016Rules/Policy Engine и Policy Decision Records
ADR-0017Permission и Policy Catalog
ADR-0018Service Boundary Decision Matrix
ADR-0019Data Freshness Standard
ADR-0020Export Registry и Data Access Registry
ADR-0021Reconciliation Center
ADR-0022External Integration Sandbox / Simulator
ADR-0023Incentive Budget и Channel Quality Controls
ADR-0024Operational Evidence Packages
ADR-0025Identity Role + Permission Scope Model
ADR-0026Result и Error Handling Standard
ADR-0027Audit и Idempotency Standards
ADR-0028API Versioning и Client Generation
ADR-0029Database Migrations и Seeding
ADR-0030Service Bootstrap, Health Checks и CI Gates
ADR-0031Background Jobs и Schedulers
ADR-0032Data Retention и Lifecycle Standard
ADR-0033Bootstrap Kernel для Backend Services
ADR-0034API Middleware, Filters и Context Propagation
ADR-0035Event Governance и Data Lineage
ADR-0036Feature Flags, Release Safety и Operational Dashboards
ADR-0037Service Landscape и Business Capabilities
ADR-0038Shared Building Blocks SDK
ADR-0039DDD Rich Model vs Anemic Model
ADR-0040Testing Strategy
ADR-0041Reporting и Export Architecture
ADR-0042Distributed Locking
ADR-0043SignalR Realtime и Redis Backplane
ADR-0044Audit.NET Admin API и Resilience Policies
ADR-0045C# Language Standards
ADR-0046Security Coding Standards
ADR-0047Structured Logging и Observability Standards
ADR-0048Financial Arithmetic и Money Safety
ADR-0049Configuration, Secrets и Options Pattern
ADR-0050Разделение API-контрактов и Domain JSONB-моделей
ADR-0051API Gateway (YARP) как единая точка входа
ADR-0052Tenancy-модель PIN: TenantId = CompanyId, инвестор вне tenant
ADR-0053Администраторы — отдельная admin-система за пределами Identity
ADR-0054user-activity: объединение сессий, просмотров и трекинга действий
ADR-0055Собственный мини-мессенджер (SignalR); чат↔сделка через CRM-события
ADR-0056Simplicity-first: целевая нагрузка, PostgreSQL-only (sessions/favorites/selections), polling-delta закрытие сессий
ADR-0057Статистика просмотров для застройщиков: dev-stats на ClickHouse (3 года, иерархия фильтров в ORDER BY)
ADR-0058Переименование «Лот» → «Объект недвижимости» (Lot → PropertyObject): канонический словарь и ложные срабатывания
ADR-0059Поиск во всех поверхностях PIN на Elasticsearch-проекциях (Talent.Common.Domain.Search); supersedes FTS-пункт ADR-0056
ADR-0060Продвижение — отдельный контекст promotion (полиморфный таргет Project/PropertyObject/Post); catalog и news — консюмеры буста
ADR-0061Независимый агент, отвязка от агентства и приглашения по номеру телефона (агрегат CompanyInvitation, user-centric метрики)
ADR-0062Медиа-стек звонков и запись на Jitsi (JVB SFU + coturn + jibri → file storage; JWT из messenger; нативный lib-jitsi-meet)
ADR-0063Новый контекст handbook — ACL-реплика Talent Handbook (consume handbooks.after-* → реплика → re-publish pin.handbook.*.v1); id источника (short/long, без Guid); scope v1 = Country/Region/City/Currency/Language; регион derive-ится из city-событий; delete-gap источника → soft-архив IsArchived + reconciliation; locale/timezone — строки; lookup на PostgreSQL
ADR-0064Отдельный контекст calendar (события агента, материализованные слоты самозаписи с гонкой Available→Booked, агрегат Appointment, напоминания через polling); переработка черновика Talent (единый агрегат вместо TPH, фикс бага start→InProgress); интеграция с CRM только событиями pin.calendar.*; UTC + IANA TimeZone; recurrence вне scope
ADR-0065Отдельный контекст wallet — первая реализация ADR-0005: immutable double-entry ledger, холдерские (AgentCommission/ReferralCommission/AgencyCommission) и системные (PlatformSettlement/PlatformRevenue) счета; кредиты по гейту MoneyReceived, дебеты по факту выплаты, идемпотентность (OperationKind, SourceId), без банковской интеграции
ADR-0066Удержание ПИН — только процентные пункты от ставки застройщика (0.25–1.50 п.п., условия per-agency + глобальный дефолт, третья строка распределения Platform, политика агентства делит пул); реферальные ставки и начисления — в rewards (4 уровня специфичности Partner×Developer > Partner > Developer > Global, отдельная сущность ReferralAccrual с гейтом MoneyReceived и guard-ом самореферала)
ADR-0067Статус MoneyReceived — гейт всех выплат (агентских и реферальных); батчевый «Акт поступления средств» (RC-{yyyy}-{seq}, Σ позиций = сумме акта, Registered неизменяем); first-class корректировки суммы (застройщик при confirm, ПИН-админ до получения денег) с обязательной причиной и аудитом
ADR-0068Ставки вознаграждения — scoped + time-bounded: измерения специфичности Developer → Project → LayoutGroup (+ Partner для реферала, + Agency для удержания ПИН), резолюция «наиболее специфичная активная на asOf=CompletedAt», периоды EffectiveFrom/EffectiveTo, непересечение внутри специфичности, акции как временные записи; топик pin.rewards.commission-rules.v1
ADR-0069Co-broking v1 (Proposed, v-next): комиссию получает только Executor, прочие агентские участники (CoAgent/Assistant/Lawyer) нефинансовые; мультистрочный агент (AgentShares[]) отложен в v-next; топик pin.rewards.commission-distribution-adjusted.v1
ADR-0070Мульти-агентство и active-agency: AgentMembershipEntity с SingleActivePerCompany, выбор активного агентства RefreshSession.ActiveCompanyId (refresh переиздаёт claim tenant_id), endpoint POST /api/v1/me/active-agency, nextAction=SelectActiveAgency при >1 членстве, зеркало UserEntity.CompanyId
ADR-0071Владение процессами CRM компанией и модель участников: ParticipantRole (additive, unknown → строка + warning), иммутабельная атрибуция OriginAgencyCompanyId/OriginAgentUserId + производные ExecutorAgentUserId/ResponsibleAgentUserId (ровно один активный Executor и один InvestorPrimary); получатель комиссии CommissionRecipientUserId в pin.crm.deal-completed.v1/fixation-approved; топик pin.crm.lead-participants-changed.v1, ChatKind.Lead
ADR-0072Увольнение агента и каскад: без нового Status (не ломать rewards-consumer) — enrich pin.identity.agent-membership-changed.v1 полями Reason (LeaveReason: SelfLeave/ExcludedByAgency) + EffectiveAt (additive, ContractVersion не бампим); передача Executor до потери членства, процесс нельзя оставить без Executor