ADR Index
Architecture Decision Records фиксируют решения, которые должны быть стабильной опорой для разработки. Формат каждого ADR должен оставаться коротким и проверяемым: контекст, решение, последствия, rollout и связанные документы.
| ADR | Решение |
|---|---|
| ADR-0001 | Monorepo и границы импортов |
| ADR-0002 | Backend: .NET 10, DDD, vertical slice |
| ADR-0003 | Frontend: React/Vite applications для рабочих интерфейсов |
| ADR-0004 | PostgreSQL как OLTP source of truth |
| ADR-0005 | Financial ledger и double-entry accounting |
| ADR-0006 | Kafka + MassTransit, Outbox/Inbox, event envelope |
| ADR-0007 | ClickHouse для аналитики |
| ADR-0008 | Elasticsearch как search projection |
| ADR-0009 | Observability: Serilog, OTEL, Sentry, correlation flow |
| ADR-0010 | External integrations через anti-corruption layer |
| ADR-0011 | Multi-tenant модель |
| ADR-0012 | Application feature slices |
| ADR-0013 | Layer dependencies и architecture tests |
| ADR-0014 | Repository pipeline и scope filters |
| ADR-0015 | Ports, providers и adapters |
| ADR-0016 | Rules/Policy Engine и Policy Decision Records |
| ADR-0017 | Permission и Policy Catalog |
| ADR-0018 | Service Boundary Decision Matrix |
| ADR-0019 | Data Freshness Standard |
| ADR-0020 | Export Registry и Data Access Registry |
| ADR-0021 | Reconciliation Center |
| ADR-0022 | External Integration Sandbox / Simulator |
| ADR-0023 | Incentive Budget и Channel Quality Controls |
| ADR-0024 | Operational Evidence Packages |
| ADR-0025 | Identity Role + Permission Scope Model |
| ADR-0026 | Result и Error Handling Standard |
| ADR-0027 | Audit и Idempotency Standards |
| ADR-0028 | API Versioning и Client Generation |
| ADR-0029 | Database Migrations и Seeding |
| ADR-0030 | Service Bootstrap, Health Checks и CI Gates |
| ADR-0031 | Background Jobs и Schedulers |
| ADR-0032 | Data Retention и Lifecycle Standard |
| ADR-0033 | Bootstrap Kernel для Backend Services |
| ADR-0034 | API Middleware, Filters и Context Propagation |
| ADR-0035 | Event Governance и Data Lineage |
| ADR-0036 | Feature Flags, Release Safety и Operational Dashboards |
| ADR-0037 | Service Landscape и Business Capabilities |
| ADR-0038 | Shared Building Blocks SDK |
| ADR-0039 | DDD Rich Model vs Anemic Model |
| ADR-0040 | Testing Strategy |
| ADR-0041 | Reporting и Export Architecture |
| ADR-0042 | Distributed Locking |
| ADR-0043 | SignalR Realtime и Redis Backplane |
| ADR-0044 | Audit.NET Admin API и Resilience Policies |
| ADR-0045 | C# Language Standards |
| ADR-0046 | Security Coding Standards |
| ADR-0047 | Structured Logging и Observability Standards |
| ADR-0048 | Financial Arithmetic и Money Safety |
| ADR-0049 | Configuration, Secrets и Options Pattern |
| ADR-0050 | Разделение API-контрактов и Domain JSONB-моделей |
| ADR-0051 | API Gateway (YARP) как единая точка входа |
| ADR-0052 | Tenancy-модель PIN: TenantId = CompanyId, инвестор вне tenant |
| ADR-0053 | Администраторы — отдельная admin-система за пределами Identity |
| ADR-0054 | user-activity: объединение сессий, просмотров и трекинга действий |
| ADR-0055 | Собственный мини-мессенджер (SignalR); чат↔сделка через CRM-события |
| ADR-0056 | Simplicity-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-0069 | Co-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 |