# Часть 8. Источники и Schema Manifest Профилирование источников — это режим наблюдения, а не режим проектирования. Агент должен прочитать заголовки raw-файлов, примеры строк и простые статистики, но не должен самостоятельно решать бизнес-смысл. На этом шаге мы собираем факты и открытые вопросы, чтобы не писать контракт на догадках. ## Что профилировать Для каждого источника: - имя файла или таблицы; - список полей; - наблюдаемый тип; - пустые значения и поля, допускающие `null`; - кандидатные ключи; - кандидаты PII; - свежесть или дата выгрузки, если есть; - вопросы к человеку. Пример: ```markdown Источник: raw/open_api_consents.csv Поля: consent_id, customer_id, scope, granted_at, revoked_at Кандидат ключа: consent_id Кандидаты PII: customer_id — синтетический идентификатор, прямых PII нет Открытый вопрос: пустой revoked_at означает активное согласие? ``` ## Почему манифест отдельно от контракта Манифест описывает наблюдаемое. Контракт описывает обещанное. Если в источнике есть поле `pii_email`, манифест обязан его показать. Контракт может запретить ему попасть в mart. Если смешать эти слои, агент начнёт «очищать» источник до того, как человек утвердил политику. ## Qwen-запрос ```text Прочитай заголовки raw CSV и первые строки. Составь Schema Manifest: поля, наблюдаемые типы, кандидатные ключи, кандидаты PII, подсказки свежести и открытые вопросы. Не пиши dbt-модели. Не решай grain без утверждения. ``` ## Минимальный выход Составьте черновой манифест хотя бы для двух источников. В запускаемом примере такие файлы уже есть: ```text specs/source-manifests/card_transactions.md specs/source-manifests/open_api_consents.md ``` Формат: ```markdown # Schema Manifest: card_transactions ## Наблюдаемые поля ## Кандидаты ключей ## Кандидаты PII ## Заметки о качестве ## Открытые вопросы ``` Открытые вопросы не являются слабостью. Это защита от скрытых догадок. ## Разбор для читателя Профилирование источника требует сдержанности. Агент видит поле `risk_flag` и хочет сразу придать ему бизнес-смысл. Видит пустой `revoked_at` и хочет решить, что согласие активно. Видит `stage` и может вспомнить кредитную методологию. В этот момент полезнее всего запретить себе интерпретацию. Профилирование источников отвечает только за наблюдение: какие поля есть, какие типы похожи на реальные, какие значения пустые, какие ключи кажутся устойчивыми. Манифест защищает raw-слой от преждевременной чистки. Если в источнике есть странность, её нужно сначала записать, а не исправить. Пустая дата может быть ошибкой, допустимым способом кодирования активного согласия или следствием потери данных. Эти варианты требуют разных решений. Если агент сразу заменит пустоту на удобное значение, ревьюер уже не увидит вопрос, который должен был попасть к человеку. Раздел «открытые вопросы» поэтому не является признаком слабой работы. Наоборот, он показывает, что автор не выдаёт догадку за факт. В дата-инженерии многие ошибки возникают не потому, что кто-то не знал SQL, а потому что слишком рано закрыл вопрос. «Похоже на ключ» стало ключом. «Похоже на PII» осталось без политики. «Похоже на активное согласие» попало в отчёт. Хороший манифест читается как протокол осмотра места происшествия: вот что нашли, вот что измерили, вот что выглядит подозрительно, вот что нельзя решать без владельца источника. Такой документ не заменяет контракт. Он делает контракт честнее, потому что контракт начинает не с желаемой картины, а с того, что реально пришло. ## Практика Откройте `specs/source-manifests/card_transactions.md` и `specs/source-manifests/open_api_consents.md`. Для каждого открытого вопроса напишите, что может сломаться, если агент решит его сам. ## Типичная ошибка Считать, что имя поля полностью определяет смысл. `risk_flag` может быть флагом источника, правилом антифрода или учебной заглушкой. До утверждения человеком это только кандидат. ## Контрольные вопросы 1. Почему профилирование источников не должно сразу писать SQL? 2. Чем наблюдаемый тип отличается от контрактного типа? 3. Какие вопросы нужно задать по пустому `revoked_at`?