Categories
Implementation Specs (157)
- specs/AnomalyDetection/TASK1.1.md
- specs/AnomalyDetection/TASK1.2.md
- specs/AnomalyDetection/TASK1.3.md
- specs/AnomalyDetection/TASK1.4.md
- specs/AnomalyDetection/TASK2.1.md
- specs/AnomalyDetection/TASK2.2.md
- specs/AnomalyDetection/TASK3.1.md
- specs/AnomalyDetection/TASK3.2.md
- specs/AnomalyDetection/TASK3.3.md
- specs/AnomalyDetection/TASK4.1.md
- specs/AnomalyDetection/TASK4.2.md
- specs/AnomalyDetection/TASK4.3.md
- specs/AnomalyDetection/TASK4.4.md
- specs/AnomalyDetection/TASK5.1.md
- specs/AnomalyDetection/TASK5.2.md
- specs/AnomalyDetection/TASK5.3.md
- specs/AnomalyDetection/TASK6.1.md
- specs/AnomalyDetection/TASK6.2.md
- specs/AnomalyDetection/TASK6.3.md
- specs/AnomalyDetection/TASKS.md
- specs/ApiServicePostgresTestStability/TASK.md
- specs/BackendDatabaseConsolidation/TASK.md
- specs/BackendDatabaseConsolidation/TASK1.1.md
- specs/BackendDatabaseConsolidation/TASK1.2.md
- specs/BackendDatabaseConsolidation/TASK1.3.md
- specs/BackendDatabaseConsolidation/TASK2.1.md
- specs/BackendDatabaseConsolidation/TASK2.2.md
- specs/BackendDatabaseConsolidation/TASK2.3.md
- specs/BackendDatabaseConsolidation/TASK3.1.md
- specs/BackendDatabaseConsolidation/TASK3.2.md
- specs/BackendDatabaseConsolidation/TASK4.1.md
- specs/BackendDatabaseConsolidation/TASK4.2.md
- specs/BackendDatabaseConsolidation/TASK4.3.md
- specs/BackendDatabaseConsolidation/TASK5.1.md
- specs/BackendDatabaseConsolidation/TASK5.2.md
- specs/BrinkLaborGetShiftsStaging/TASK.md
- specs/BrinkPosOrdersFirstEtlJob/TASK.md
- specs/BrinkPosOrdersFirstEtlJob/TASK0.md
- specs/BrinkPosOrdersFirstEtlJob/TASK1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.md
- specs/BrinkPosOrdersFirstEtlJob/TASK7.md
- specs/BrinkPosOrdersFirstEtlJob/TASK8.md
- specs/BrinkPosOrdersFirstEtlJob/TASK9.md
- specs/BrinkSettings2ToStaging/TASK.MD
- specs/CuratedToS3Stage/TASK.md
- specs/CuratedToS3Stage/TASK0.md
- specs/CuratedToS3Stage/TASK1.md
- specs/CuratedToS3Stage/TASK2.md
- specs/CuratedToS3Stage/TASK3.md
- specs/CuratedToS3Stage/TASK4.md
- specs/CustomerCredentialCustomHeaders/TASK.md
- specs/CustomerCredentialCustomHeaders/TASK1.1.md
- specs/CustomerCredentialCustomHeaders/TASK1.2.md
- specs/CustomerCredentialCustomHeaders/TASK2.1.md
- specs/CustomerCredentialCustomHeaders/TASK2.2.md
- specs/CustomerCredentialCustomHeaders/TASK3.1.md
- specs/CustomerCredentialTriggeredProvisioning/TASK.md
- specs/CustomerCredentialTriggeredProvisioning/TASK1.1.md
- specs/CustomerCredentialTriggeredProvisioning/TASK1.2.md
- specs/CustomerCredentialTriggeredProvisioning/TASK2.1.md
- specs/CustomerCredentialTriggeredProvisioning/TASK2.2.md
- specs/CustomerCredentialTriggeredProvisioning/TASK3.1.md
- specs/CustomerCredentialTriggeredProvisioning/TASK3.2.md
- specs/CustomerCredentialTriggeredProvisioning/TASK4.1.md
- specs/EtlSourceAdapterFramework/TASK.md
- specs/EtlSourceAdapterFramework/TASK0.md
- specs/EtlSourceAdapterFramework/TASK1.md
- specs/EtlSourceAdapterFramework/TASK2.md
- specs/EtlSourceAdapterFramework/TASK3.md
- specs/EtlSourceAdapterFramework/TASK4.md
- specs/EtlSourceAdapterFramework/TASK5.md
- specs/EtlSourceAdapterFramework/TASK6.md
- specs/KdsCdcDebeziumIntegration/TASK.md
- specs/KdsCdcDebeziumIntegration/TASK1.md
- specs/KdsCdcDebeziumIntegration/TASK2.md
- specs/KdsCdcDebeziumIntegration/TASK3.md
- specs/KdsCdcDebeziumIntegration/TASK4.md
- specs/KdsCdcDebeziumIntegration/TASK5.md
- specs/KdsCdcDurableRelationRouting/TASK.md
- specs/KdsCdcDurableRelationRouting/TASK1.md
- specs/KdsCdcDurableRelationRouting/TASK2.md
- specs/KdsCdcDurableRelationRouting/TASK3.md
- specs/KdsCdcDurableRelationRouting/TASK4.md
- specs/KdsCdcDurableRelationRouting/TASK5.md
- specs/KdsCdcIngestion/TASK.md
- specs/KdsCdcIngestion/TASK1.md
- specs/KdsCdcIngestion/TASK2.md
- specs/KdsCdcIngestion/TASK3.md
- specs/KdsCdcIngestion/TASK4.md
- specs/KdsCdcIngestion/TASK5.md
- specs/KdsCdcIngestion/TASK6.md
- specs/KdsCdcIngestion/TASK7.md
- specs/KdsCdcIngestion/TASK8.md
- specs/KdsCdcIngestion/TASK9.md
- specs/KdsCdcReplayExecution/TASK.md
- specs/KdsCdcReplayExecution/TASK1.md
- specs/KdsCdcReplayExecution/TASK2.md
- specs/KdsCdcReplayExecution/TASK3.md
- specs/KdsCdcReplayExecution/TASK4.md
- specs/KdsMonitorServingContractMigration/TASK.md
- specs/KdsMonitorServingContractMigration/TASK1.1.md
- specs/KdsMonitorServingContractMigration/TASK1.2.md
- specs/KdsMonitorServingContractMigration/TASK2.1.md
- specs/KdsMonitorServingContractMigration/TASK2.2.md
- specs/KdsMonitorServingContractMigration/TASK3.1.md
- specs/KdsMonitorServingContractMigration/TASK3.2.md
- specs/RedshiftFoundation/TASK.md
- specs/RedshiftFoundation/TASK1.1.md
- specs/RedshiftFoundation/TASK1.2.md
- specs/RedshiftFoundation/TASK1.3.md
- specs/RedshiftFoundation/TASK1.4.md
- specs/RedshiftFoundation/TASK2.1.md
- specs/RedshiftFoundation/TASK2.2.md
- specs/RedshiftFoundation/TASK3.1.md
- specs/RedshiftFoundation/TASK3.2.md
- specs/RedshiftFoundation/TASK3.3.md
- specs/RedshiftSyntheticDataFeed/TASK.md
- specs/RedshiftSyntheticDataFeed/TASK1.1.md
- specs/RedshiftSyntheticDataFeed/TASK1.2.md
- specs/RedshiftSyntheticDataFeed/TASK1.3.md
- specs/RedshiftSyntheticDataFeed/TASK2.1.md
- specs/RedshiftSyntheticDataFeed/TASK2.2.md
- specs/RedshiftSyntheticDataFeed/TASK3.1.md
- specs/RedshiftSyntheticDataFeed/TASK3.2.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK1.1.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK1.2.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK2.1.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK2.2.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK2.3.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK3.1.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK3.2.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK4.1.md
TASK 4: Standardize Source Descriptor, Diagnostics Envelopes, And Catalog Contracts
Summary
Standardize the metadata contracts that source adapters use to plug into the ETL framework.
Implementation Status
Status: implemented.
Implemented:
- shared source descriptor exists in
backend/Kds.Ai.Integrations/Etl/EtlSourceDescriptor.cs, - shared diagnostics envelope type exists in
backend/Kds.Ai.Integrations/Etl/StageDiagnosticsEnvelope.cs, - shared catalog contracts exist in
IExtractOperationCatalog.cs,INormalizationContractCatalog.cs,IStagingTableCatalog.cs, andICuratedTargetCatalog.cs, - Brink catalogs expose shared contract shapes in
BrinkPosEndpointCatalog.cs,BrinkPosNormalizationCatalog.cs,BrinkPosStagingTableCatalog.cs, andBrinkPosCuratedTargetCatalog.cs, - catalog consistency tests exist in
backend/tests/Kds.Ai.Integrations.Tests/BrinkPos/BrinkPosEtlCatalogTests.cs.
Completed by:
- persisted stage details now use
StageDiagnosticsEnvelope<TDetails>inBrinkPosNormalizeLoadJobs.cs,BrinkPosLoadToStagingJobs.cs, andBrinkPosStagingToCuratedJobs.cs, - shared serialization helpers exist in
backend/Kds.Ai.Integrations/Etl/StageDiagnosticsJson.cs, - upstream stage-detail readers now support both the new envelope shape and legacy plain detail payloads so existing persisted data is still readable during transition.
This task should define the shared concept of:
- source descriptor,
- common stage diagnostics envelope,
- extract catalog,
- normalization catalog,
- staging catalog,
- curated target catalog.
The framework should own the structure of these contracts, while adapters should continue to own their content.
Dependencies
Files to Modify
1. Shared metadata contracts
- framework-oriented files under a backend location such as:
backend/Kds.Ai.Etl/- or
backend/Kds.Ai.Integrations.Abstractions/
2. Brink source metadata classes
backend/Kds.Ai.Integrations/BrinkPos/BrinkPosEndpointCatalog.csbackend/Kds.Ai.Integrations/BrinkPos/BrinkPosNormalizationCatalog.csbackend/Kds.Ai.Integrations/BrinkPos/BrinkPosStagingTableCatalog.csbackend/Kds.Ai.Integrations/BrinkPos/BrinkPosCuratedTargetCatalog.csbackend/Kds.Ai.Integrations/BrinkPos/Models/BrinkPosEtlStageConstants.cs
3. Tests
- add or extend tests under:
backend/tests/Kds.Ai.Integrations.Tests/BrinkPos/
Required Behavior
Shared source descriptor
Create a shared source descriptor that represents source identity without hardcoding Brink values into framework helpers.
Shared diagnostics envelope
Create a common stage diagnostics envelope that can carry:
- stage identity,
- source identity,
- tenant/company/business date,
- upstream batch id,
- artifact references,
- status,
- timestamps,
- stage-specific nested diagnostics when needed.
Shared catalog contracts
Create shared interfaces or contracts for:
- extract operation catalogs,
- normalization contract catalogs,
- staging table catalogs,
- curated target catalogs.
Adapter-owned content rule
Brink metadata content must remain in the Brink adapter. This task should only change ownership of the contract shape, not centralize source definitions.
Proposed Contracts
Suggested shared metadata contracts:
public sealed record EtlSourceDescriptor(
string SourceType,
IngestionSourceType IngestionSourceType,
IngestionMode DefaultIngestionMode);
public sealed record StageDetailsEnvelope<TDetails>(
EtlSourceDescriptor Source,
string CompanyId,
string TenantId,
DateOnly BusinessDate,
string PipelineStage,
Guid BatchId,
Guid? UpstreamBatchId,
string Status,
DateTimeOffset StartedAt,
DateTimeOffset CompletedAt,
TDetails Details);
public interface IExtractOperationCatalog
{
IReadOnlyList<ExtractOperationDefinition> GetOperations();
}
public interface INormalizationContractCatalog
{
IReadOnlyList<NormalizationContractDefinition> GetContracts();
}
public interface IStagingTableCatalog
{
IReadOnlyList<StagingTableDefinition> GetTables();
}
public interface ICuratedTargetCatalog
{
IReadOnlyList<CuratedTargetDefinition> GetTargets();
}Suggested shared definition records:
public sealed record ExtractOperationDefinition(
string StreamName,
string OperationName,
bool IsRequired);
public sealed record NormalizationContractDefinition(
string ContractName,
string SchemaVersion);
public sealed record StagingTableDefinition(
string ContractName,
string TableName,
string SchemaVersion,
string DeleteSql,
string CopySqlTemplateId);Proposed Execution Shape
After this task:
- framework helpers consume
EtlSourceDescriptorinstead of source constants, - stage details are serialized through a shared outer envelope,
- Brink catalogs remain in
Kds.Ai.Integrations.BrinkPos, - Brink catalogs expose their entries through shared catalog contracts,
- tests verify that Brink catalog content is structurally complete and internally consistent.
Catalog Consistency Guidance
At minimum, tests in this task should verify:
- every staging table definition references an existing normalization contract,
- every curated target dependency references declared staging tables,
- every active extract operation required by Brink has matching downstream catalog ownership where applicable.
Acceptance Criteria
- source descriptor is shared and reusable,
- diagnostics envelope is shared and reusable,
- shared catalog contracts exist,
- Brink catalogs implement or align to the shared contracts,
- tests cover catalog completeness or catalog-shape consistency where practical.
Notes
- Keep the framework contracts minimal.
- Do not use this task to invent speculative metadata required by sources that do not exist yet.
- Prefer shared outer envelopes plus source-specific nested detail records over one giant universal diagnostic schema.