diff --git a/README.md b/README.md index 0051e1c0..d4e9f767 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,11 @@ Acceptance criteria разбиты на 3 блока (функционально Зависит от 5 факторов канала ДДУ: легальность, поля, покрытие, свежесть, условия коммерческого использования. См. сущности `PlanA_AnalyticsFirst_Apr25` и `SalesTracking_Strategy_Apr25` в графе памяти. +**26.04 вечер — data discovery разблокировал Plan A независимо от Антона.** Найдены три легальных канала ground-truth-данных: +1. **Росреестр CSV-датасет** (`DataSource_Rosreestr_DealsCSV_Apr26`) — per-deal цены сделок ДКП+ДДУ из ФГИС ЕГРН, 9 кварталов 2024–Q1 2026, ~898К сделок РФ/квартал. Открытые данные по 8-ФЗ, разделитель `~`, гранулярность до кадастрового квартала. +2. **ДОМ.РФ фронт-API** (`DataSources_Analysis_Apr26` + 12 вкладок) — открытые JSON без auth (либо `Basic MTpqd2U=` хардкоден), per-flat прайс-лист, реализация/готовность как velocity. +3. **НСПД MarketAnalytics** (`NSPD_MarketAnalytics_FullArchitecture_Apr26`) — индикаторы цен по кадастровым кварталам, 8 лет longitudinal, GeoJSON-полигоны для heatmap. Архитектура полностью раскрыта в debug-браузере (saveUserFilters → graphEgrn*/tableEgrn/geomDataForHeatMap, серверная сессия фильтров через userFiltersId). ⚠ `graphEgrnCandleMedian`/`LineMedian` (абсолютные ₽/м²) дают 403 для physic-аккаунта — но эти данные мы уже получаем из CSV-датасета Росреестра. + --- ## Структура репозитория @@ -330,10 +335,38 @@ git push - `Team_Setup` — 2 фуллстека part-time - `WorkSplit_Generative_Stage1` — кто что делает в Generative - `PlanA_AnalyticsFirst_Apr25` — pending pivot решение (ждём 27.04 — Антон по ДДУ) -- `SalesTracking_Strategy_Apr25` — шахматки застройщиков -- `DataSources_Pricing_Apr25` — источники цен и площадей +- `SalesTracking_Strategy_Apr25` — шахматки застройщиков (downgrade-нуты после находок 26.04) +- `DataSources_Pricing_Apr25` — источники цен и площадей (общий обзор) +- `DataSources_Analysis_Apr26` — глубокий анализ ДОМ.РФ как ground truth (заменяет ожидание ДДУ-канала) - `Validation_Findings_Apr25` — валидация бизнес-плана +**Источники данных (обновлено 26.04 вечер):** +- `DataSource_Rosreestr_DealsCSV_Apr26` ⭐ — per-deal цены сделок ДКП+ДДУ из ФГИС ЕГРН, 9 кварталов 2024–Q1 2026, ~898К сделок РФ/квартал +- `DataSource_Rosreestr_DealsCSV_Schema_Apr26` — схема CSV (разделитель `~`, 17 полей) +- `DataSource_Rosreestr_DealsCSV_Sverdl_Q1_2026` — реальные цифры по Свердл.обл (ДКП median 82,594 ₽/м², ДДУ median 156,314 ₽/м²) +- `DataSource_Rosreestr_DealsCSV_Limits_Apr26` — ограничения (нет покупателя, period=начало квартала) +- `DataSource_Rosreestr_ETL_Plan_Apr26` — план интеграции в Stage 2a +- `DataSource_PerDeal_Reality_Apr26` — иерархия источников (1. Росреестр CSV → 2. ДОМ.РФ → 3. ЦБ ипотека → 4. Fedstat → 5. УПН Екб) +- `DataSource_UPN_Ekb_Apr26` — Уральская Палата Недвижимости (19 лет longitudinal по Екб) + +**ДОМ.РФ фронт-API (по вкладкам):** +- `DomRF_Architecture_Apr26` · `DomRF_Host_Apr26` · `DomRF_API_PortalAnalytics_Apr26` · `DomRF_KeyAndLegal_Apr26` (ключ Basic MTpqd2U=) +- `DomRF_PlanA_Mapping_Apr26` — маппинг endpoints на 3 плитки Plan A +- 12 вкладок аналитики: `DomRF_Tab1_HousingIndicators_Apr26` ... `DomRF_Tab11_MortgageStats_Apr26` +- `DomRF_Spec_APF_v22` — официальный B2B API (только для банков) +- `DomRF_OfficialVsFront_Comparison_Apr26` — почему фронт незаменим даже с банк-партнёром + +**НСПД (nspd.gov.ru, новый портал Росреестра):** +- `Rosreestr_SiteMap_Apr26` — карта ресурсов Росреестра/НСПД +- `NSPD_Architecture_Apr26` — React SPA, micro-frontends, OAuth через ESIA +- `NSPD_OAuth_Architecture_Apr26` — auth flow, JWT TTL=30 мин +- `NSPD_PhysicAccess_Apr26` — что доступно физик-аккаунту (18 сервисов, marketAnalytics ✓) +- `NSPD_MarketAnalytics_FullArchitecture_Apr26` ⭐ — полный API-флоу разобран в debug-браузере 26.04: saveUserFilters → graphEgrn*, tableEgrn, geomDataForHeatMap. Серверная сессия фильтров (userFiltersId) +- `NSPD_OrgOnly_Endpoints_Apr26` — graphEgrnCandleMedian/LineMedian возвращают 403 (абсолютные ₽/м² скрыты от physic, дублируют CSV-датасет) +- `NSPD_DataValue_For_GenDesign_Apr26` — value: 8 лет longitudinal, гранулярность до кадастрового квартала, GeoJSON-полигоны для heatmap +- `NSPD_AEGGIS_WMTS_Apr26` — WMTS-тайлы для embed в Mapbox/Leaflet +- `NSPD_PII_Leak_Apr26` · `Rosreestr_Recon_Findings_Apr26` · `Rosreestr_TLS_Note_Apr26` — security/инфра наблюдения + **Инфраструктура:** - `Hosting_Pricing_Apr25` — сравнение провайдеров - `Hosting_Decision_Apr25` — решение по Yandex Cloud (для будущей миграции) diff --git a/memory/memory-gendesign.jsonl b/memory/memory-gendesign.jsonl index 5f586fda..54cf1c58 100644 --- a/memory/memory-gendesign.jsonl +++ b/memory/memory-gendesign.jsonl @@ -83,6 +83,19 @@ {"type":"entity","name":"DataSource_Rosreestr_DealsCSV_Sverdl_Q1_2026","entityType":"research","observations":["Реальные цифры из скачанного dataset_СДЕЛКИ за Q1 2026 по Свердл.обл (region_code=66) — проверка качества источника.","ИТОГО сделок в Свердл.обл за Q1 2026: 37 310 (после умножения на number)","Распределение по типу объекта:","Помещения (квартиры/нежилые): 24 923","Земельные участки: 7 157","Здания: 3 130","Машиноместа: 2 100","Распределение по doc_type:","ДКП (вторичка+ГП): 26 655","ДДУ (ПЕРВИЧКА): 10 655","Практически все ДДУ = новостройки + прямая покупка от застройщика. ДКП — вторичка и прямые П в ГП","ЦЕНЫ ₽/м² ПО ПОМЕЩЕНИЯМ (выборка: area 5-500 м², price>100К):","ДКП median: 82 594 ₽/м², mean: 89 206 ₽/м² (n=14 994)","ДДУ median: 156 314 ₽/м², mean: 220 983 ₽/м² (n=664)","Первичка ВДВОЕ дороже вторички в Свердл.обл — логично (вторичка включает хрущёвки 60-х годов, НП, МО подмосковье и т.д.)","Сверка с baseline: статистика ДОМ.РФ / Росстат по Свердл.обл в ~85-95 тыс ₽/м² (Apr 2025) — совпадает с ДКП median 82,594","ПРИМЕРЫ реальных сделок в Екб (квартал 66:41:*):","4.8М ₽ за 40.9 м² (117К ₽/м²), дом 2019, 3 этаж","6.7М ₽ за 32.2 м² (208К ₽/м²), дом 2022, 6 этаж","1.9М ₽ за 28.9 м² (66К ₽/м²), дом 1962 — хрущёвка","ТОП районы: 'Екатеринбург' (1642+1293=2935), Сысертский (1098), Белоярский (728)","Для GenDesign ПЛИТКИ 2 (ЦЕНА): рабочая выборка — сделки ПОМЕЩЕНИЙ в кадастровых кварталах в радиусе 5км от участка пользователя, раздельно ДКП vs ДДУ"]} {"type":"entity","name":"DataSource_Rosreestr_ETL_Plan_Apr26","entityType":"research","observations":["ETL-план интеграции открытых данных Росреестра в GenDesign Stage 2a.","ИСТОЧНИКИ: 3 dataset типа на квартал: СДЕЛКИ (НАШ!), АРЕНДА, КАДАСТРСТОИМОСТЬ (4 файла)","ОБЪЁМ СДЕЛОК по кварталу: ZIP 9-30 MB, CSV 96-300 MB, ~600К-1.5М строк","ДОСТУПНО НА СЕЙЧАС: 9 кварталов (Q1 2024 - Q1 2026) + Архив до 2023г. (JSON-выгрузки по регионам, ~50-300 MB на регион в ZIP)","СТРАТЕГИЯ заливки:","Шаг 1: bootstrap — одноразовый скрипт скачивает все 9 кварталов СДЕЛОК → распакует → фильтрует region_code IN (66, 50, 77) → upsert в PostgreSQL","Шаг 2: cron-task quarterly_rosreestr_sync — раз в квартал (16-е число второго месяца после окончания квартала) проверять index и тянуть новый квартал","Шаг 3: обогащение: JOIN с ПКК Rosreestr по quarter_cad_number → получить geom квартала (полигон) + центроид","SQL Schema (PostgreSQL):","CREATE TABLE rosreestr_deals (id BIGSERIAL PK, region_code SMALLINT, district TEXT, city TEXT, quarter_cad_number VARCHAR(30), street TEXT, realestate_type_code VARCHAR(15), wall_material_code VARCHAR(15), year_build SMALLINT, floor TEXT, purpose_code VARCHAR(15), area NUMERIC(12,2), period_start_date DATE, deal_price NUMERIC(14,2), currency VARCHAR(10), doc_type VARCHAR(10), deal_count INT, raw_okato VARCHAR(15), source_quarter VARCHAR(10))","Индексы: (region_code), (quarter_cad_number), (period_start_date), (doc_type), (realestate_type_code), GIST на geom после энричмента","Materialized views: median(price/area) по (region, quarter, doc_type, realestate_type) и по радиусу 5км вокруг lat/lon","Объём работы: скачать+распаковать+лоаднуть 9 кварталов в PG для 3 регионов = 2-3 часа. ETL код = 4-6 часов. ПКК-энричмент = 1-2 дня","Для ПЛИТКИ 2 в GenDesign: это ОСНОВНОЙ источник фактических цен сделок (ДОМ.РФ остаётся для текущего прайс-листа и velocity)"]} {"type":"entity","name":"DataSource_Rosreestr_DealsCSV_Limits_Apr26","entityType":"research","observations":["ОГРАНИЧЕНИЯ открытого dataset Росреестра dataset_СДЕЛКИ — важно знать перед интеграцией.","1. НЕТ покупателя/продавца — персональные данные по 152-ФЗ НЕ выкладываются","2. НЕТ конкретной даты сделки — period_start_date = первое число квартала. Гранулярность времени = 90 дней","3. НЕТ кадастрового номера ОБЪЕКТА, только КАДАСТРОВЫЙ КВАРТАЛ. Нельзя связать с ДОМ.РФ odsId/elemId напрямую","4. ГРУППИРОВКА дубликатов в row + number: если 5 одинаковых квартир в одном жк проданы с похожими характеристиками — склеиваются в 1 ряд с number=5 и СРЕДНЕЙ ценой","5. НЕТ инфы о форме оплаты (наличные/ипотека), только итоговая цена","6. НЕТ комнатности квартиры. Можно инферить по площади (>50м² = 2к, >70 = 3к, ...) но не точно","7. НЕТ застройщика/ЖК в явном виде — выводим через JOIN ПКК → ДОМ.РФ /object по координатам квартала","8. Безвозмездные сделки (дарения, наследства) НЕ включены","9. ЛАГ: dataset публикуется ~через 1.5 месяца после конца квартала (Q1 2026 вышел 16.04.2026)","10. САМОСТОЯТЕЛЬНОСТЬ от ДОМ.РФ: СДЕЛКИ регистрируются все (и вторичка и первичка), тогда как ДОМ.РФ покрывает только первичку в строящихся ДОМАх = Росреестр ШИРЕ","11. ЮР.СТАТУС: официальный open data, в реестр ПО декларируем 'Интеграция с открытыми данными Росреестра (фИГС ЕГРН)' — легально и без NDA"]} +{"type":"entity","name":"Rosreestr_SiteMap_Apr26","entityType":"research","observations":["Карта ресурсов Росреестра (обзор 26.04.2026 passive recon).","rosreestr.gov.ru — ОСНОВНОЙ портал (Bitrix CMS), TLS с self-signed-cert (Минцифры CA, не в system store)"," ├─ /eservices/ — электронные услуги (выписки ЕГРН 340-4160 ₽, регистрация прав, ДДУ-проверка)"," ├─ /opendata/ — 17 МАНДАТНЫХ open data наборов (СРО кадастровых инженеров, лицензии, проверки, ГКГН). Базовые реестры без сделок"," ├─ /open-service/data-sety-rosreestra/ — ⭐ 3 ДАТАСЕТА с РЫНОЧНЫМИ ДАННЫМИ:"," │ ├─ СДЕЛКИ (ДКП+ДДУ) с ценами — см. DataSource_Rosreestr_DealsCSV_Apr26"," │ ├─ КАДАСТРСТОИМОСТЬ (4 файла по регионам)"," │ └─ АРЕНДА (договоры аренды)"," ├─ /data-sets/ — Apache OpenIndex файлы CSV по кварталам — см. DataSource_Rosreestr_DealsCSV_Apr26"," └─ /open-service/statistika-i-analitika/ — только пресс-материалы, нет выгрузок","nspd.gov.ru — НОВЫЙ ПОРТАЛ НСПД (Национальная Система Пространственных Данных), заменил ПКК"," ├─ React SPA с Module Federation (микро-фронты)"," ├─ /api/{service-name}/{version} — микросервисы: notifications-controller/v2, ticket-support/v3, registers-manager/v2, tech-process/v2"," ├─ Все API требуют auth — ESIA через Госуслуги"," └─ X-TIMEZONE header обязателен","pkk.rosreestr.ru — 301 → nspd.gov.ru/map?thematic=PKK (старый ПКК устарел)","lk.rosreestr.ru — Личный кабинет (React SPA, ESIA auth)","rosreestr.ru — старый домен (большинство поддоменов не отвечают в пробе)"]} +{"type":"entity","name":"Rosreestr_OpenData_17Sets_Apr26","entityType":"research","observations":["Полный список 17 open data наборов на https://rosreestr.gov.ru/opendata/ (ПО идентификатору 7706560536 = ИНН Росреестра).","Наборы реестров СРО (полезные GenDesign):","1. СРО кадастровых инженеров — контрагенты для топосъёмки","2. СРО оценщиков — профессиональная оценка для финмодели","3. СРО арбитражных управляющих — для проблемных объектов (банкротство застройщиков)","4. Реестр лицензий на геодезическую и картографическую деятельность","5. Государственный каталог географических названий — полезно для нормализации адресов","Наборы НЕ полезные для GenDesign:","6-9. Планы/результаты проверок (землепользование, геодезия, СРО)","10. Перечень ГИС Росреестра","11-13. СРО медиаторов, РОК, СРО без полномочий, ЭП-площадок","14-17. Различные проверки и результаты","Это ГОС-МАНДАТ по 8-ФЗ 'O доступе к информации'. Реальные рыночные данные (СДЕЛКИ/КАДАСТР/АРЕНДА) НЕ здесь, а в отдельном блоке /open-service/data-sety-rosreestra/","Формат выгрузки (по паспорту): CSV/XML/JSON раз в квартал/месяц в зависимости от набора"]} +{"type":"entity","name":"NSPD_Architecture_Apr26","entityType":"api_spec","observations":["НСПД (nspd.gov.ru) — новый портал Росреестра для пространственных данных, заменил ПКК (pkk.rosreestr.ru → 301)","Архитектура:","— React SPA с Vite билдом (видно по import-паттернам и vite_API_BASE)","— Module Federation с micro-frontends (видны runtime hooks @nspd-modules/*)","— Effector + atomic-router для state management","— ui kit @nspd/uikit (внутренний)","— Map: @nspd-modules/map-core, map-adapter","— Yandex Metrika (yandex-metrika-xOrTB1Q0.js)","— Special browser support: YaBrowser, Firefox, Chromium-Gost, Chrome (без Edge)","Microservices API base = '/api/{service}/{version}':","— /api/notifications-controller/v2/notifications","— /api/ticket-support/v3/tickets","— /api/registers-manager/v2 — реестры","— /api/tech-process/v2 — техпроцессы","— /api/aeggis-portal/v3/spatial-data-info — инфо пространственные данные (AEGGIS = Application for Earth Geospatial Information System)","— /api/aeggis-portal/v1/auth-providers — провайдеры авторизации","— /api/services — сервисы НСПД","Все вызывают 403 без auth (видимо SSO через Госуслуги/ESIA)","Обязательный header: X-TIMEZONE","Для GenDesign: НСПД не даёт прямого API без ESIA-входа. Альтернатива — старый ПКК-API community библиотек (rosreestr2coord) они могли сломаться после миграции"]} +{"type":"entity","name":"Rosreestr_Recon_Findings_Apr26","entityType":"research","observations":["Passive recon наблюдения на rosreestr.gov.ru и nspd.gov.ru (26.04.2026). Только то что видно при просмотре публичных страниц и их bundle. Без active scan.","1. ⚠ dev-поддомен в prod-bundle (medium): в nspd.gov.ru/assets/api-ByMDT02-.js вывернута vite переменная VITE_PROXY_DOMAIN=https://dev.nspd.rosreestr.gov.ru — раскрывает существование dev-копии портала. Прямые пробы dev-хоста НЕ делали (active recon за рамками пользовательского запроса)","2. ⚠ X-Powered-CMS header (low): rosreestr.gov.ru отдаёт 'X-Powered-CMS: Bitrix Site Manager (d61e85ea0be7ddfb3fa5a12935cc91a6)' — раскрывает CMS + license-hash. Обычно хеш = SHA Bitrix лицензии (в отличие от просто 'Bitrix') — портрет продакшн инстанса","3. ⚠ Двойной Referrer-Policy header (low): выдаются два разных 'Referrer-Policy: origin-when-cross-origin' и 'Referrer-Policy: unsafe-url'. По спеке второй выигрывает — unsafe-url пропускает ПОЛНЫЙ URL+query в Referer на внешние сайты. Утечка приватности","4. ⚠ SameSite отсутствует в cookies (low): PHPSESSID, USER_REGION_ID, USER_CITY выдаются без SameSite-атрибута. CSRF risk при входе в ЛК","5. ⚠ P3P header устарел (info): policyref='/bitrix/p3p.xml' — P3P стандарт давно обсолетен (W3C прекратил в 2009)","6. ⚠ Typo в canonical URL (cosmetic): на nspd.gov.ru в указан 'nspd.rosreetr.gov.ru' (rosreetr без 's') — опечатка в build","7. ⚠ Отсутствует Content-Security-Policy header на обоих доменах (low) — слабая защита от XSS","8. ⚠ robots.txt разрешает /opendata/ но НЕ учитывает /open-service/data-sety-rosreestra/ и /data-sets/ — это не баг, это отсутствие стратегии (файлы индексируются)","9. Открытая директория /data-sets/ (info, НЕ уязвимость, это полезный listing) — Apache mod_autoindex. Но кодировка имён в листинге = cp1251 (mojibake в UTF-8 браузере), свидетельство legacy Apache config","10. SSL TLS с российским CA (Russian Trusted CA / Минцифры) — не в trust store обычных OS/браузеров. Браузер Chromium-Gost или ruchnoe доверие в system store нужны. Для ETL в GenDesign — curl -k или ручное включение CA","Severity общая: все наблюдения LOW-MEDIUM. Ничего критичного не найдено (и не искали active scan'ами)","ДЛЯ GenDesign: из утечек ничего не используем. На реестр ПО декларируем только легальные источники: 'open data Rosreestr' (data-sety-rosreestra)"]} +{"type":"entity","name":"Rosreestr_TLS_Note_Apr26","entityType":"feedback","observations":["Росреестр (rosreestr.gov.ru, nspd.gov.ru) использует TLS-сертификат от российского CA (Russian Trusted CA Минцифры), который НЕ включен в браузеры/OS из коробки за пределами РФ.","Why: после санкций 2022 российские госресурсы перевели выдачу TLS на Минцифры. Обычный Chrome показывает ERR_CERT_AUTHORITY_INVALID","How to apply в GenDesign:","1) При ETL/curl используй флаг -k (skip cert check) — это безопасно потому что это открытые данные без auth/PII","2) Для строгой валидации в проде — добавь в trust store: https://www.gosuslugi.ru/crt/MinCifry_RootCA.pem","3) Python requests: используй verify=False или verify=path_to_minciftry_ca","4) Браузеры: Yandex Browser и Chromium-Gost включают CA по умолчанию","Не связано с security: это инфраструктурная особенность. Наблюдаемые данные в открытом доступе легальны"]} +{"type":"entity","name":"NSPD_OAuth_Architecture_Apr26","entityType":"api_spec","observations":["NSPD (nspd.gov.ru) auth: собственный OAuth2/OIDC сервер на sso.nspd.gov.ru, провайдер = ESIA Госуслуги.","Token endpoint: POST https://nspd.gov.ru/oauth2/token (прокси на sso.nspd.gov.ru)","Body: {grant_type: 'refresh_token'|'authorization_code', client_id: 'nspd'} — как JSON, NOT form-urlencoded","Real client_id (UUID): 03386dbe-5185-4b96-900d-c2b1bb368ed6","JWT issuer: https://sso.nspd.gov.ru, algo: RS256","JWT TTL: 1800с (30 мин). Refresh ttl: лонже (30+ мин, точно не известно — не проверяли)","Cookie storage: authAccessToken + authRefreshToken в cookie с HttpOnly, secure, SameSite=None, domain=nspd.gov.ru. Недоступны JS, но видны в DevTools Network","ESIA scope (при входе запрашивается): ОРГАНИЗАЦИИ, АДРЕСА, ДР, фИО, ИНН, СНИЛС, емаил, телефон, ПАСПОРТ — очень широко для сервиса карты. Для GenDesign это предупреждение же — НЕ интегрируем НСПД с ESIA в наш продукт (слишком большой PII surface)","JWT claims (PII!): aud, client_id, display_name, email, family_name, given_name, middle_name, sub (UUID), uid (UUID), preferred_username, sid, scope='profile email uid', updated_at","X-TIMEZONE обязателен в каждом запросе","Backend сигнатура: x-backend: dc1-gw-8-1, x-api-header: af, x-request-id: hex"]} +{"type":"entity","name":"NSPD_PhysicAccess_Apr26","entityType":"research","observations":["Доступ к NSPD API для physic-аккаунта (физлицо через ESIA) — проверено эмпирически 26.04.2026.","GET /api/registers-manager/v2/pages/main → 200, typeAccount: 'physic', 18 сервисов:","approvalInConstruction (согласования в строительстве), integratedDevelopmentOfTheTerritory (КРТ), individualHousingConstruction (ИЖС), myProperties (мои объекты), arcticPeopleLanguages, urbanPlanningStudyOnline (градопроработка), smallBusiness, assistantSurveyor (помощник изыскателя), geodataVisualization, cadastralValuation, landNspd, farmLand, buildingLand, tourismNspd, marketAnalytics (НАШ!), complexCadastralWorks, specialTools, thematicUserLayers","URL-маппинг сервисов (frontend routes):","/market-analysis → marketAnalytics","/urban-analyze → urbanPlanningStudyOnline","/construction-nspd → buildingLand (земля для стройки)","/integrated-development-territories → КРТ","/cadastral-valuation → cadastralValuation","/my-properties → myProperties","/assistant-surveyor → assistantSurveyor","GET /api/notifications-controller/v2/notifications → 200 (totalCount: 0 для нового юзера)","GET /api/portal-tools/v1/page-assistant/{pageCode} → 200 (флаг assistant)","POST /api/portal-tools/v1/audit → 200 (аудит пользовательских действий)","ЗАКРЫТО для physic (403 Forbidden код=3):","/api/registers-manager/v2/registers/can-get-tree — дерево реестров","/api/aeggis-portal/v3/* — портал пространственных данных (объекты, registry-list, spatial-data-info, auth-providers)","/api/services/* — сервисы NSPD","/api/v1/parcels — парцели","Эти endpoints видимо для organisation-аккаунта (юрлицо) или госслужащих","Для GenDesign: physic-аккаунта хватит для marketAnalytics + WMTS-карта. Реестры/объекты — требуют юрлица"]} +{"type":"entity","name":"NSPD_MarketAnalytics_API_Apr26","entityType":"api_spec","observations":["Сервис nspd.gov.ru/market-analysis — 'Аналитика рынка недвижимости', официальный сервис Росреестра.","Источник данных: Цены сделок по продаже квартир на вторичном рынке из ФГИС ЕГРН с 2018 года","Разрезы: федокруг / субъект РФ / населённый пункт / кадастровый квартал. Визуализация: тепловая карта, графики, таблица","Auth: ESIA-вход (physic), JWT в cookie","Base: /api/market-analytics/v1/","GET /filters/indicators → [{id:1,title:'Индикатор цен ежемесячный',type:M},{2,'Квартальный',Q},{3,'Полугодовой',H},{4,'Годовой',Y}]","GET /filters/calculationMethod → [К базисному, К предыдущему, К аналогичному периоду годом ранее]","GET /filters/dataSource → [{1,ФГИС ЕГРН,fgisEgrn},{2,Внешние,externalSource}]","GET /filters/areaRanges → [0-25, 25-40, 40-60, 60-80, 80-100, 100+]","GET /federal-district → [8 ФО с codes 1-8]. Уральский=6, Сибирский=7, Дальневосточный=8, Приволжский=5, СКФО=4, СЗФО=2, ЦФО=1, ЮФО=3","GET /groups/fgisEgrn → полная схема фильтров: dataSource, indicators, calculationMethod, periodFrom/periodTo, federalDistrict, federalSubject, settlement, cadastralQuarter, areaRanges. limit=10 на множественные выборы","GET /layers-tree → 6 MVT-слоёв на разные площади. layerId 872964-872969. categoryId 470043. visualType=bubble, minZoom=2, tileExtent=512","POST /period (body: {type, dataSourceSysName}) — периоды доступные для индикатора (POST, валидации проверены)","POST /settlement (body: другой формат — не выявлен) — нас.пункты","GET /federal-subject?federalDistrict={code} — видимо есть но ожидает другой формат параметров","Data endpoint (чарт/таблица) — НЕ НАЙДЕН без реального UI-выбора. Связаные endpoints для рендера в SPA ловятся только при полном set выборе фильтров","КОНЦЕПЦИЯ для GenDesign: это ГОТОВЫЙ official aggregation API по сделкам ПО КАДАСТРОВЫМ КВАРТАЛАМ. В отличие от CSV-датасета (сырые сделки раз в квартал) — это предварительно вычисленные индикаторы с выбором временного окна (M/Q/H/Y) и динамики относительно базы/предыдущего/ГОГ"]} +{"type":"entity","name":"NSPD_AEGGIS_WMTS_Apr26","entityType":"api_spec","observations":["AEGGIS WMTS API НСПД — картирование слоёв в стандарте OGC WMTS.","GET /api/aeggis/v4/{layerId}/wmts/{z}/{x}/{y}.png — PNG растровые тайлы. layerId=235 — 'Цифровая объектовая схема' (базовый справочный слой)","GET /api/aeggis/v4/{layerId}/mvt/{z}/{x}/{y} — Mapbox Vector Tiles (предположение по schema layers-tree)","MarketAnalytics MVT-слои: 872964 (объекты 0-25м²), 872965 (25-40), 872966 (40-60), 872967 (80-100), 872968 (100+), 872969 (60-80). Все из categoryId 470043. priceIndicator как key","Base layers (/api/geoportal/v1/baselayers): id=235 (ЦОС), id=36347 (ЕЭКО), id=36344 (Ортофото планы 2000) и другие","Cache: в ответе видны cache.levels_to (max zoom), refresh_before для временного инвалидирования","External tiles: есть в базовом списке с 'external' source. Пример 'https://nspd.gov.ru/cgk/map/38/tms/{z}/{x}/{y}.png' (TMS-паттерн)","Для GenDesign: можно встраивать эти тайлы в наши Mapbox/Leaflet как base/overlay. Авторизация через cookie session, но physic-вход работает для layer 235","Остальные полезные endpoints geoportal:","/api/geoportal/v1/page-search-settings?pageCode={code} — настройки поиска. Для marketAnalytics regex='^\\d{2}:\\d{2}:\\d{1,7}:\\d+$' — формат кадастрового номера"]} +{"type":"entity","name":"NSPD_PII_Leak_Apr26","entityType":"research","observations":["Security observation НСПД (26.04.2026): ПД в localStorage браузера.","После ESIA-входа SPA сохраняет в localStorage ключ NSPD_API_CLIENT_USER (~657 char) с данными текущего юзера (вероятно ID, name, email, expires и др.)","Парный ключ NSPD_API_CLIENT_USER_EXPIRES с ISO-датой истечения (обычно +30 мин от входа)","Риск (medium): любой скрипт на странице (в т.ч. 3rd-party вроде Yandex Metrika, или при XSS) может прочитать ПД. Best practice = хранить ПД только в HttpOnly cookie или server-side, не в localStorage","Yandex Metrika с _ym_uid + _ym_d + webvisor (96513913) работает на всех страницах включая профиль — теоретически может видеть PII в страницах","JWT в cookie HttpOnly — это ок, JS не видит. Но всё равно видно в DevTools Network и в cookie storage браузера","JWT response body в ответе /oauth2/token (в сыром plaintext): возвращает распакованные claims в JSON в ответе — display_name, email, family_name, given_name, middle_name, sub UUID, uid UUID, sid — всё это PII","Для GenDesign: прямая интеграция НСПД в наш продукт = ПЛОХО: брал бы слишком большую поверхность PII. Лучше server-side прокси с одним общим сервис аккаунтом (если будет выдан) или использовать CSV-датасеты (DataSource_Rosreestr_DealsCSV_Apr26) и WMTS-плитки без входа (если публичные слои работают без cookie)"]} +{"type":"entity","name":"NSPD_MarketAnalytics_FullArchitecture_Apr26","entityType":"api_spec","observations":["Дата: 26.04.2026 вечер. Полная архитектура /api/market-analytics/v1/* — раскрыта через debug-браузер с физик-аккаунтом ESIA.","АРХИТЕКТУРНЫЙ ПАТТЕРН: серверная сессия фильтров. Фронт сохраняет выбор фильтров на бэке через saveUserFilters → бэк хранит как userFiltersId (число). Все data-endpoints читают активные фильтры из этой сессии — поэтому body=`{}` или совсем без body.","FLOW (порядок вызовов):","1) GET /user-filters/userFilters → текущее состояние фильтров пользователя {userFiltersId, dataSourceSysName, filters[]}","2) Пользователь меняет фильтры в UI → собирающие вызовы /period, /region-list, /settlement, /cadastral-quarter (все POST с подсказками для следующего уровня)","3) Кнопка «Применить» → POST /user-filters/saveUserFilters с полным телом фильтров. Возвращает {userFiltersId: N}","4) После save фронт автоматически дёргает: graphEgrnHistogram, graphEgrnLineIndicator, graphEgrnCandleMedian, graphEgrnLineMedian, tableEgrn, geomDataForHeatMap, dataOnLegend, titleHeatMap","BODY saveUserFilters (правильный формат):","{ dataSourceSysName: 'fgisEgrn', filters: ["," {sysName:'dataSource', options:{value:'ФГИС ЕГРН', id:1}},"," {sysName:'calculationMethod', options:{value:'К предыдущему периоду', id:2}},"," {sysName:'areaRanges', options:{value:'от 25 до 40', id:1}},"," {sysName:'indicators', options:{value:'Индикатор цен квартальный', id:2, periodType:'Q'}},"," {sysName:'periodFrom', options:{value:'4 квартал 2025', sortOrder:32, isRemote:true}},"," {sysName:'periodTo', options:{value:'1 квартал 2026', sortOrder:33, isRemote:true}},"," {sysName:'federalDistrict', options:{valueList:[{code,title}], isSelectAll:true|false}},"," {sysName:'federalSubject', options:{valueList:[{code,title}], isSelectAll:true|false}},"," {sysName:'settlement', options:{valueList:[{code,title}], isSelectAll:false}}","]}","POSTПОДСКАЗКИ при выборе фильтров (важная деталь — все обёрнуты в params!):","POST /period body={params:{type:'M'|'Q'|'H'|'Y', dataSourceSysName:'fgisEgrn'}} → список доступных периодов с sortOrder","POST /region-list body={districtIds:[6]} → список субъектов в выбранных ФО (НЕ /federal-subject!)","POST /settlement body={subjectIds:[1,2,3,4]} → нас.пункты по subject id (массив до 4-5 за раз, фронт батчит)","POST /cadastral-quarter body={subjectIds:[1,2,3,4]} → массив кадастровых кварталов формата '02:55:020113'","DATA ENDPOINTS (body={} или GET, читают по userFiltersId из cookie):","POST /tableEgrn/fgisEgrn?page=0&count=10 → {headers:[{key,name,columnType}], bodyData:[{1:Территория, 2:значение_period1, 3:значение_period2}], meta:{page,count,totalCount}}","POST /fgisEgrn/geomDataForHeatMap → GeoJSON FeatureCollection. Координаты в EPSG:3857 (Web Mercator). 13 цветовых бакетов: <0.25, 0.25-0.5, 0.5-0.7, 0.7-0.85, 0.85-0.95, 0.95-1.0, 1.0_unchanged, 1.0-1.05, 1.05-1.15, 1.15-1.3, 1.3-1.5, 1.5-1.75, >1.75. MultiPolygon границы кадастровых кварталов с цветом по индикатору","GET /graphEgrnHistogram/fgisEgrn → {chartType:'histogramChart', data:[{title, indicatorValueCurrent:0.88, indicatorValuePrevious:1.12, period:'02.2026', percentValue:-21}]}","GET /graphEgrnLineIndicator/fgisEgrn → {chartType:'lineChartIndicator', data:[{title, indicatorValue:1.12, period:'01.2026', periodType:'Месяц'}, ...]}","GET /dataOnLegend/fgisEgrn → описание легенды теплокарты","GET /fgisEgrn/titleHeatMap → {title:'Индикатор цен ежемесячный по выбранной территории...'}"]} +{"type":"entity","name":"NSPD_OrgOnly_Endpoints_Apr26","entityType":"research","observations":["Дата: 26.04.2026. ⚠ КРИТИЧНОЕ ОТКРЫТИЕ — endpoints скрытые от physic-аккаунта (403 Forbidden):","GET /api/market-analytics/v1/graphEgrnCandleMedian/fgisEgrn — СВЕЧНОЙ график медианной АБСОЛЮТНОЙ цены сделок (₽/м²)","GET /api/market-analytics/v1/graphEgrnLineMedian/fgisEgrn — линия медианной АБСОЛЮТНОЙ цены сделок","Все остальные graph endpoints (Histogram, LineIndicator) возвращают только относительные индикаторы (текущий период / предыдущий = 0.88), а Candle/Line Median должны возвращать реальные ₽/м² по кадастровому кварталу.","Для physic (как у юзера сейчас) — 403 'Forbidden'. Проверено эмпирически в браузере 26.04.2026.","ГИПОТЕЗА: доступно для organisation-аккаунта (юрлицо в ESIA) или для аккаунтов с расширенным scope.","ЭКВИВАЛЕНТНОСТЬ ДАННЫХ: эти endpoints дублируют то, что мы уже получаем из CSV-датасета Росреестра (DataSource_Rosreestr_DealsCSV_Apr26) — медианные цены сделок по кадастровым кварталам. Только тут это онлайн-API с фильтрами по периоду/площади/нас.пункту, а CSV — сырые сделки покварталу.","ДЛЯ GenDesign: ничего не теряем. Используем CSV-датасет (per-deal сырые данные) + публичные индикаторы NSPD (относительная динамика) + dom.рф per-flat snapshot. Org-аккаунт NSPD — НЕ требуется."]} +{"type":"entity","name":"NSPD_DataValue_For_GenDesign_Apr26","entityType":"research","observations":["Дата: 26.04.2026. Конкретный value NSPD MarketAnalytics для GenDesign Plan A.","ИСТОРИЯ ДАННЫХ: 33 квартала (Q1 2018 — Q1 2026, 8 лет longitudinal)","ВРЕМЕННЫЕ РАЗРЕЗЫ: M (месяц), Q (квартал), H (полугодие), Y (год). Месячный показатель работает с лагом ~1-2 мес (на 26.04.2026 показывает 02.2026)","МЕТРИКА: индикатор цен — отношение текущего периода к базе/предыдущему/ГОГ. Безразмерное число (0.88 = -12% к предыдущему). Полезно для тренда, не для абсолютных значений","ГРАНУЛЯРНОСТЬ: до уровня кадастрового квартала (формат XX:YY:ZZZZZZ). Это в 100-1000 раз тоньше чем Росстат (агрегат по региону).","КОНКРЕТНЫЙ КЕЙС Свердл.обл, Екатеринбург, площадь 25-40 м², 02.2026 vs 01.2026: индикатор=0.88 (цены упали на 12%), предыдущий период 1.12.","ВЫГОДА для GenDesign:","1) Cross-validation цен сделок с Росреестра CSV — индикатор NSPD должен совпадать с (median_current_quarter / median_previous_quarter) из CSV","2) ВЕЛОСИТИ (sigma trend): тренд цен по конкретному кадастровому кварталу — для финмодели это хороший signal","3) ВЫБОР АНАЛОГОВ: GeoJSON-полигоны кадастровых кварталов с раскраской по индикатору → для участка пользователя автоматически найти кадастровые кварталы вокруг с похожей динамикой","4) WMTS-тайлы (через /api/aeggis/v4/235/wmts/{z}/{x}/{y}.png) можно встроить как base layer в Mapbox/Leaflet GenDesign","ПЛАН ИНТЕГРАЦИИ В Stage 2a:","Шаг A: ESIA-логин в headless Chrome (или через cookie из user-input) → получаем JWT в authAccessToken cookie","Шаг B: для каждого региона интереса (Свердл.обл, МО, Москва) сохраняем фильтры (saveUserFilters) и тянем geomDataForHeatMap → сохраняем GeoJSON в PostGIS как материализованное представление","Шаг C: cron 1×в сутки обновляем индикаторы по периоду и пересчитываем materialized views","Шаг D: для каждого участка пользователя — JOIN с PostGIS по геометрии → находим включающий кад.квартал → читаем индикатор","JURISDICTION: NSPD — государственный сервис Росреестра по 8-ФЗ. Использование физик-аккаунта легально как пользователя. ⚠ автоматизированный сбор через ESIA — серая зона. Лучше ОДНОРАЗОВО собрать с физик-аккаунта и кешировать локально.","ОГРАНИЧЕНИЯ:","1) physic-аккаунт через ESIA — доступ только для одного юзера, RPS-лимиты на сессию","2) JWT TTL=30 мин (refreshable). Для cron нужно либо хранить refresh_token, либо на каждом запуске re-auth через ESIA (что НЕ автоматизируется без обхода капчи)","3) Авторизация через ESIA подвержена captcha/2FA — недетерминирована для headless","4) absolute medians (Candle/Line Median) — 403, требуют org-аккаунт","5) Лимит на массовые запросы кадастровых кварталов: фронт батчит по 4-5 субъектов за раз — видимо есть soft-rate-limit"]} {"type":"relation","from":"Project_GenDesign","to":"TechStack_v2.2","relationType":"uses"} {"type":"relation","from":"Project_GenDesign","to":"NorthStar_DiscoveryMVP","relationType":"targets"} {"type":"relation","from":"Project_GenDesign","to":"Phase0_DiscoveryMVP","relationType":"currently_executes"} @@ -208,3 +221,20 @@ {"type":"relation","from":"DataSource_Rosreestr_ETL_Plan_Apr26","to":"DomRF_PerFlat_ETL_Apr26","relationType":"complements"} {"type":"relation","from":"DataSource_Rosreestr_DealsCSV_Sverdl_Q1_2026","to":"DataSource_UPN_Ekb_Apr26","relationType":"ground_truth_for"} {"type":"relation","from":"DataSource_Rosreestr_DealsCSV_Sverdl_Q1_2026","to":"DataSource_Fedstat_Apr26","relationType":"ground_truth_for"} +{"type":"relation","from":"NSPD_OAuth_Architecture_Apr26","to":"NSPD_Architecture_Apr26","relationType":"extends"} +{"type":"relation","from":"NSPD_PhysicAccess_Apr26","to":"NSPD_OAuth_Architecture_Apr26","relationType":"uses"} +{"type":"relation","from":"NSPD_MarketAnalytics_API_Apr26","to":"NSPD_PhysicAccess_Apr26","relationType":"accessible_via"} +{"type":"relation","from":"NSPD_MarketAnalytics_API_Apr26","to":"DataSource_Rosreestr_DealsCSV_Apr26","relationType":"based_on_same_source"} +{"type":"relation","from":"NSPD_AEGGIS_WMTS_Apr26","to":"NSPD_Architecture_Apr26","relationType":"extends"} +{"type":"relation","from":"NSPD_PII_Leak_Apr26","to":"NSPD_OAuth_Architecture_Apr26","relationType":"qualifies"} +{"type":"relation","from":"NSPD_PII_Leak_Apr26","to":"Rosreestr_Recon_Findings_Apr26","relationType":"complements"} +{"type":"relation","from":"NSPD_MarketAnalytics_API_Apr26","to":"DomRF_PlanA_Mapping_Apr26","relationType":"tile2_alternative"} +{"type":"relation","from":"NSPD_PhysicAccess_Apr26","to":"Rosreestr_SiteMap_Apr26","relationType":"is_part_of"} +{"type":"relation","from":"NSPD_MarketAnalytics_FullArchitecture_Apr26","to":"NSPD_MarketAnalytics_API_Apr26","relationType":"supersedes"} +{"type":"relation","from":"NSPD_MarketAnalytics_FullArchitecture_Apr26","to":"NSPD_OAuth_Architecture_Apr26","relationType":"uses_auth_from"} +{"type":"relation","from":"NSPD_MarketAnalytics_FullArchitecture_Apr26","to":"NSPD_PhysicAccess_Apr26","relationType":"tested_with"} +{"type":"relation","from":"NSPD_OrgOnly_Endpoints_Apr26","to":"NSPD_MarketAnalytics_FullArchitecture_Apr26","relationType":"qualifies"} +{"type":"relation","from":"NSPD_OrgOnly_Endpoints_Apr26","to":"DataSource_Rosreestr_DealsCSV_Apr26","relationType":"duplicates_data_of"} +{"type":"relation","from":"NSPD_DataValue_For_GenDesign_Apr26","to":"NSPD_MarketAnalytics_FullArchitecture_Apr26","relationType":"applies"} +{"type":"relation","from":"NSPD_DataValue_For_GenDesign_Apr26","to":"DomRF_PlanA_Mapping_Apr26","relationType":"tile2_alternative_to"} +{"type":"relation","from":"NSPD_DataValue_For_GenDesign_Apr26","to":"Stages_MVP_v1","relationType":"extends_stage_2a_for"}