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
Curated To S3 Stage - Implementation Tasks
Overview
Implementation of curated_to_s3 ETL stage framework plus first Brink adoption.
This slice extends current ETL framework with real export stage after staging_to_curated and proves it through current Brink pipeline.
Current repo state:
- ETL framework already reserves
EtlStageNames.CuratedToS3. - Active Brink pipeline stops at
staging_to_curated. - S3 storage already supports curated-object keys and writes.
docs/ETL.mdexpects RedshiftUNLOADfrom tenantcuratedtables to S3 Parquet.
This slice outcome is:
- framework-owned export contracts and execution seam exist,
- export list stays adapter-owned,
- new entities can be added for Brink through catalog extension rather than stage rewrites,
- other source systems can adopt same stage model by providing export catalog content,
- Brink pipeline exports
curated.pos_ordersandcurated.pos_order_itemsas first adopter, - Redshift
UNLOADwrites Parquet directly to standard S3curated/layout, - parent ETL batch succeeds only after export succeeds.
Source Documents
../../docs/ETL.md../../docs/features/ETL/etl-source-adapter-framework.md../../docs/features/ETL/progress-gap-vs-etl-architecture.md
Spec Name
This implementation spec should be referred to as Curated To S3 Stage.
Fixed Decisions
- This slice delivers framework support plus Brink first adoption only.
- Framework must support future non-Brink adapters without stage redesign.
- Brink is first adopter, not one-off implementation target.
- First exported entities are
curated.pos_ordersandcurated.pos_order_itemsonly. - Export list stays adapter-owned. Execution mechanics and catalog contracts stay shared.
- Export mechanism is Redshift
UNLOADto Parquet in S3. - Application code must not read curated rows and write Parquet itself.
- Parent ETL batch succeeds only after
curated_to_s3succeeds. - Export metadata should reuse source adapter catalog pattern with framework-owned contract.
- S3 layout should reuse existing project curated path standard.
- Athena, Glue, partition projection, and cross-tenant query routing stay out of scope.
Scope
This task includes:
- freezing minimal delivery contract for
curated_to_s3, - adding framework-owned export contracts for adapter catalogs,
- adding shared executor for Redshift
UNLOAD, - adding adapter-owned export catalog for Brink as first adopter,
- adding new
curated_to_s3stage support into source-adapter runtime model, - adding new Brink stage and jobs wiring,
- adding regression coverage for export success, failure, and stage ordering,
- validating S3 key layout against current curated-path standard.
In short, this slice ends when ETL framework has reusable curated_to_s3 stage model and current Brink pipeline can adopt it for first curated exports without starting Athena/Glue work.
Out of Scope
The following items are explicitly excluded from this task:
- Athena query execution,
- Glue Data Catalog tables,
- partition projection setup,
- access-control tables,
- multi-tenant query routing,
- adding more curated entities beyond
pos_ordersandpos_order_itemsin first adopter implementation, - redesigning whole ETL framework,
- app-side Parquet export path.
Task Checklist
Phase 0: Contract Freeze
- [ ] TASK 0 - Freeze minimal
curated_to_s3delivery contract
Phase 1: Shared Export Mechanics
- [ ] TASK 1 - Add framework-owned export contracts, shared Redshift
UNLOADexecutor, and S3 path builder usage
Phase 2: Adapter Export Metadata
- [ ] TASK 2 - Add adapter export catalog model and Brink first-adopter catalog
Phase 3: Stage Runtime Integration
- [ ] TASK 3 - Add framework stage integration and Brink
curated_to_s3pipeline wiring
Phase 4: Validation
- [ ] TASK 4 - Add regression coverage for export success, failure, and contract shape
Dependency Graph
Phase 0 (Contract Freeze)
+-- freezes scope and success boundary before runtime work starts
Phase 1 (Shared Export Mechanics) <-- depends on Phase 0
+-- adds reusable export contracts and UNLOAD execution seam
Phase 2 (Adapter Export Metadata) <-- depends on Phase 0
+-- adds adapter-owned export target definitions under shared contract
Phase 3 (Stage Runtime Integration) <-- depends on Phases 1, 2
+-- introduces executable curated_to_s3 stage in framework runtime and Brink pipeline
Phase 4 (Validation) <-- depends on Phase 3
+-- locks behavior with unit and integration-style testsRecommended Session Order
| Session | Tasks | Description |
|---|---|---|
| 1 | 0 | Freeze minimal contract and non-goals |
| 2 | 1 | Add shared export contracts and UNLOAD execution seam |
| 3 | 2 | Add adapter export catalog model through Brink first adopter |
| 4 | 3 | Add stage runtime support, then Brink stage and adapter wiring |
| 5 | 4 | Add regression coverage and verify S3 contract |
Key Design Decisions
Export Is Real Warehouse Behavior
This slice should use Redshift UNLOAD, not app-side row export. Exported Parquet must come directly from tenant curated tables.
Shared Mechanics, Adapter-Owned Targets
Execution, connection handling, common command shaping, and export catalog contracts are shared concerns. Export target list and source-specific SELECT semantics stay in adapter catalog.
Success Boundary Includes Export
staging_to_curated is not final success anymore. Green ETL run means curated export also completed.
Minimal First Scope
Brink is first adopter. First exported entities are only curated.pos_orders and curated.pos_order_items. Breadth comes later through catalog extension after framework seam proves itself.
Reuse Existing S3 Standard
This slice should not invent another curated S3 layout. It should plug into existing curated object path standard already used in project docs and storage helpers.