Terry Configuration
Goal
Terry должен быть конфигурируемой платформой, где поведение pipeline задаётся декларативно, а не хардкодится под каждый source.
Current Persisted Shape
Текущий Terry baseline уже хранит source catalog в PostgreSQL:
terry.workspacesзадаёт верхний ownership boundary;terry.domainsзадаёт logical source owner внутри workspace;terry.data_sourcesхранит source identity/policy и pointer на текущую активную config version.terry.loader_configsхранит versioned runtime config и history/statistics по каждой версии.data_sources.expiration_daysхранит retention policy для raw payload artifacts этого источника.
На этом этапе persisted source-of-truth для universal loader runtime это связка data_sources + loader_configs.
Configuration Domains
Source configuration
Описывает:
- тип source;
- transport details;
- auth/secrets references;
- polling или trigger strategy;
- формат входного payload.
В текущем коде source/runtime configuration вынесена в versioned loader_configs:
loader_settingsauth_settingsvalidator_settingsfreshness_settingsprocessor_settingsfingerprintincrementalschedule_settingsexpiration_days
Для source.type=sdk текущий Terry runtime ожидает transport-specific блок source.sdk:
clientидентифицирует биржу или SDK-backed provider;operationвыбирает Terry registry operation;methodостаётся legacy fallback для старого config shape, еслиoperationне задан;paramsпередаёт per-operation runtime arguments;- SDK credentials по-прежнему берутся из environment, а не из Terry config.
Для binance:coins.snapshot runtime использует официальный Go SDK github.com/binance/binance-connector-go и прокидывает source.sdk.params.recv_window в Binance recvWindow, если параметр задан.
Current supported Terry SDK operations:
binance:coins.snapshotkucoin:coins.snapshotkucoin:loans.snapshotbybit:coins.snapshotbybit:loans.snapshotgate:loans.snapshotwhitebit:loans.snapshot
Current loader output contract для Terry сейчас JSON-only:
LoaderOutput.bodyсериализуется как JSON payload, а не как бинарный[]byte;- для
sdkfetcher это означает, что workflow result в Temporal CLI показывает обычный JSON body вместо base64 строки; - если source не может вернуть валидный JSON payload, такой transport shape сейчас считается вне активного Terry scope.
Для source-level throttling Terry runtime ожидает source.rate_limit:
requests_per_second,burstи optionalwindowописывают limiter policy;bucket_keyпозволяет несколькимdata_sourceделить один limiter bucket;- если
bucket_keyне задан, runtime fallback-ит кauth.credentials_ref, а затем кdata_source_id; domain.rate_limit_rpsостаётся domain metadata и не используется loader runtime как active throttling policy.
Job configuration
Описывает:
- какой
sourceиспользует job; - какой parser или extractor применяется;
- какие
validation ruleвключены; - какой набор
transformationприменяется; - какой
sinkявляется целевым; - какие notification policies привязаны к outcome.
Notification configuration
Описывает:
- какие события порождают нотификацию;
- какой
notification templateиспользовать; - в какие
delivery channelотправлять; - dedup/rate-limit policy;
- fallback channel при delivery errors.
Suggested Config Shape
На уровне документации разумно исходить из следующих logical blocks:
Для текущего persisted catalog это можно читать так:
workspace
domain
data_source
current_loader_config_id
loader_config(versioned)
source
auth
validation
freshness
processing
fingerprint
incremental
scheduling
Configuration Principles
- config должен описывать intent, а не внутренние runtime классы;
- secrets и credentials не хранятся inline в job config;
- validation и transformation должны быть composable;
- notification rules должны ссылаться на pipeline outcome, а не на transport-specific payload;
- любой config должен поддерживать dry-run или validation mode до production запуска.
Дополнительно для текущей реализации:
- runtime должен уметь однозначно загрузить config по
data_source_id; source_typeи transport-specificsource.typeне должны расходиться;- ownership chain
workspace -> domain -> data_sourceдолжна быть консистентной на уровне БД; data_sourceпринадлежитworkspaceтранзитивно черезdomain, без отдельногоworkspace_idв строке источника.
Evolution Rules
- новые поля должны добавляться backward-compatible способом;
- deprecated keys должны иметь документированный migration path;
- shared vocabulary из Terry должен использоваться в names и описаниях ключей.