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 1: Replace Simulator Contract Assumptions With Debezium-Native Intake Models
Summary
Replace the current simulator-shaped intake contract with Debezium-native models and parser behavior, while making intake independent from MessageGroupId as processing contract.
This task establishes the new source-of-truth message model for KDS CDC so later work does not keep translating Debezium into simulator-era abstractions.
Current Codebase Findings
Repository analysis shows the current intake seam is tightly coupled to simulator/custom payload assumptions:
KdsCdcEnvelopeParserrejects messages ifMessageGroupIdorSequenceNumberare missing.KdsCdcEnvelopeexpects top-levelsource_type,source_account_id,store_guid,entity,operation, andprimary_key.- Parser branches on
KdsCdcContractProfile.MockvsProductionand still treats mock contract as first-class. - Real payload samples under
docs/features/ETL/kds-cdc/payloads/use top-levelschemaplus nestedpayload.before,payload.after,payload.source, andpayload.op.
These findings mean current parser and message models are incorrect for the real input contract.
Dependencies
docs/features/ETL/kds-cdc/debezium-payload-compatibility-notes.md- payload samples under
docs/features/ETL/kds-cdc/payloads/
Source References
../../docs/features/ETL/kds-cdc/debezium-payload-compatibility-notes.md../../docs/features/ETL/kds-cdc/payloads/customer_update.json../../docs/features/ETL/kds-cdc/payloads/item_create.json../../docs/features/ETL/kds-cdc/payloads/item_update.json../../docs/features/ETL/kds-cdc/payloads/item_bump_create.json../../docs/features/ETL/kds-cdc/payloads/order_create.json../../docs/features/ETL/kds-cdc/payloads/order_update.json../../docs/features/ETL/kds-cdc/payloads/order_delete.json
Scope From Breakdown
This task covers only the contract/model replacement seam:
- Debezium envelope models,
- parser shape,
- op mapping,
- effective row-image selection,
- transport metadata compatibility model.
Files to Create
Recommended new logical types under backend/Kds.Ai.Integrations/KdsCdc/Messages/:
KdsDebeziumEnvelope.csKdsDebeziumPayload.csKdsDebeziumSourceMetadata.csKdsDebeziumTransactionMetadata.csif needed- optional small helper type for resolved effective row image or parsed metadata snapshot
Files to Modify
backend/Kds.Ai.Integrations/KdsCdc/KdsCdcEnvelopeParser.csbackend/Kds.Ai.Integrations/KdsCdc/Messages/KdsCdcEnvelope.csor replace usage entirelybackend/Kds.Ai.Integrations/KdsCdc/Messages/KdsCdcReceivedMessage.csbackend/Kds.Ai.Integrations/KdsCdc/Messages/KdsCdcTransportMessage.csbackend/Kds.Ai.Integrations/KdsCdc/Messages/KdsCdcContractProfile.cs- any parser-facing diagnostics or quarantine models that assume mock/custom reason codes
Required Behavior
Debezium envelope parsing
Parser must:
- deserialize Debezium top-level
schema+payload, - read
payload.source.tableas source entity, - map
payload.opvalues (c,u,d,r), - choose effective business row image:
afterforc,u,rbeforeford- derive primary key from effective row image,
- preserve the full original Debezium payload for raw storage and replay.
Transport compatibility without MessageGroupId dependency
Transport model must allow:
- nullable
MessageGroupId, - nullable
SequenceNumber.
Parser must preserve transport metadata when present, but it must not define a new correctness contract around derived pseudo-MessageGroupId values.
This task must establish:
- landing-capture compatibility without
MessageGroupId, - nullable
SequenceNumbersupport, - no parser-time requirement that transport metadata define routing or batching.
Contract simplification
Target direction is one Debezium-native production contract.
Preferred end state:
- no simulator/mock parser branch,
- no dependence on custom top-level
source_type,source_account_id, orprimary_keyfields.
Testing
Add parser-focused tests for:
- customer update payload,
- order create payload,
- order update payload,
- order delete payload,
- item update payload,
- missing transport metadata accepted into landing-capture path,
- malformed Debezium JSON rejected clearly,
- unsupported table/entity rejected clearly if outside supported set.
Tests should load or mirror the real sample payloads rather than inventing simulator-era bodies.
Acceptance Criteria
- [ ] Parser no longer depends on simulator-style top-level envelope fields
- [ ] Debezium
schema+payloadshape is modeled explicitly - [ ] Debezium op codes are mapped intentionally
- [ ] Effective row image is selected from
before/after - [ ] Primary key is derived from row image, not
primary_keyenvelope field - [ ] Transport model allows missing
MessageGroupIdandSequenceNumber - [ ] Parser preserves transport metadata without making it a correctness prerequisite
- [ ] Full Debezium payload remains available for raw persistence/replay
- [ ] Tests cover all provided sample payload shapes
Notes
- Keep this task focused on intake contract and parser shape.
- Do not mix tenant-resolution or normalization business logic into the parser unless required for basic field extraction.