MUST USE for data engineering and analysis work — pipelines, ETL/ELT, data quality, SQL optimization, schema evolution, backfills, and reporting. Triggers: ETL, ELT, pipeline, data quality, SQL optimization, backfill, migration, schema drift, validation, batch vs streaming, dashboard-db, sqlite, audit-log-schema, connector-data, 데이터 파이프라인, 데이터 품질, 백필.
Production-grade data engineering patterns for building reliable data systems.
Activates by change surface for data pipelines, analytics, SQL-heavy work, schema evolution, backfills, and reporting.
C0/C1 work (small local patches): See dev §0.0 Work Classifier + §0.1 Patch Fast-Path before reading references.
dev is canonical:dev §0.2 Rule Classes, §3 Verification Gate, and §5 Safety Rules apply to all work governed by this skill.
When to Activate
Building data pipelines or ETL/ELT processes
Processing CSV, JSON, Parquet, or Excel files
Writing analytical SQL, warehouse/lakehouse queries, or transformation models
Setting up data quality checks or validation
Performing data analysis, aggregation, or reporting
Choosing between batch and streaming architectures
Do not activate for plain app CRUD SQL, OLTP query tuning, or transactional schema design. Route those to dev-backend/references/stacks/database.md. This skill owns analytics, ETL/ELT, pipelines, data quality, and reporting.
External/current data evidence
For current external dataset contracts, source freshness, pipeline/tool version
behavior, provider data API changes, or public benchmark/source claims, read the
active search skill and follow its query-rewrite, source-fetch, and
evidence-status rules. Use browser fetch/open/text/get-dom/snapshot only after
candidate URLs exist and the claim needs browser-verifiable source evidence.
Pre-Flight Checklist
Before delivering:
Input contract defined: source, schema, expected columns/types, and owner
Pipeline is idempotent and restartable from the last successful checkpoint
Data-quality checks cover nulls, uniqueness, ranges, freshness, and row counts
Volume and latency justify the chosen engine: pandas, Polars, DuckDB, SQL warehouse, Spark/Flink
Invalid records have a dead-letter/quarantine path with enough context to debug
PII/governance classification is complete or delegated to dev-security/§7
Output format and downstream contract are explicit
1. Data Processing Principles
Five rules that apply to every data task:
Principle
What It Means
Pipeline thinking
Every pipeline is Extract → Transform → Load. Keep each stage as an independent, testable function.
Schema-first
Define expected columns, types, and constraints BEFORE writing transformation logic.
Defensive parsing
External data will have nulls, wrong types, extra columns, missing columns, and encoding issues. Assume all of these.
Idempotent operations
Running the same pipeline twice on the same input must produce the same output. Use upsert patterns, not blind inserts.
Fail fast, fail loud
Raise errors at pipeline boundaries immediately. Internal transforms propagate errors; dead-letter queues handle row-level quarantine at the boundary (see §3).
Large files (stream, don't load all at once), deeply nested objects, encoding
Parquet
Large analytical datasets, columnar queries
Requires library support, not human-readable, schema evolution
Excel
Business user handoffs
Multiple sheets, merged cells, formulas vs. values, date formatting
Database
Production system access
Connection pooling, query timeouts, use read replicas for analytics
Incremental Loading
For large or frequently updated data sources:
Use a watermark column (e.g., updated_at, id) to track the last processed record.
Store the watermark after successful load. On failure, restart from the last saved watermark.
Process in batches (tune based on source limits and memory), not all-at-once.
Validate row counts: loaded_rows should equal source_rows_since_watermark.
Schema Validation on Ingest
Before any transformation, validate incoming data:
✅ Check: Expected columns exist
✅ Check: Data types match (string, number, date, boolean)
✅ Check: Required fields are not null
✅ Check: Values are within expected ranges
✅ Check: No unexpected duplicate keys
❌ Fail: If any check fails, write to error log with row details. Don't silently drop.
3. ETL/ELT Pipeline Design
Layer Architecture
Rules:
Keep staging immutable. Copy first, transform in a separate step — this enables replay and debugging.
One transformation per step. Don't combine cleaning + joining + aggregating in one function. Chain separate steps.
Incremental processing. Process only new/changed records when possible. Full reloads only when schema changes.
dbt Integration Patterns
Engine landscape (verified 2026-07-02): dbt Core remains the default; dbt Fusion
is the separately-documented/licensed current engine (check its feature matrix and
license before adopting); SQLMesh is a credible active alternative with plan/apply
workflows. Choose per license posture and team workflow — do not assume Fusion pricing
without a primary source.
When using dbt for transformations, follow the staging → intermediate → mart layer architecture:
Rules:
Staging models: rename, cast, filter NULLs — no joins, no business logic
Intermediate models: joins across staging, deduplication, business transforms
Mart models: aggregations, final business entities consumed by BI/analytics
Every model has a schema.yml with tests (not_null, unique, relationships, custom SQL).
Run validation tests in CI and after significant changes — treat test failures as pipeline failures.
Use dbt source freshness to monitor upstream data staleness
Error Handling in Pipelines
Scenario
Pattern
Invalid records
Write to dead-letter table/file for manual review. Preserve every record for debugging.
Source unavailable
Retry with exponential backoff (1s, 2s, 4s). Alert after 3 failures.
Schema mismatch
Halt pipeline. Log expected vs. actual schema. Don't attempt partial loads.
Duplicate records
Use upsert (INSERT ON CONFLICT UPDATE) or deduplicate with window functions.
Orchestration Basics
When pipelines have multiple steps with dependencies:
Define tasks as a DAG (Directed Acyclic Graph). Each task depends on its upstream tasks.
Each task must be independently retryable. If step 3 fails, you restart step 3, not step 1.
Set reasonable retries (2-3) with delay (5 min between attempts).
Add timeout per task to prevent hung pipelines.
Alert on failure: email, Slack, or monitoring dashboard.
4. Data Quality
Validation Checks
Run these after every pipeline step, not just at the end:
Check
What It Validates
Example
Not null
Required fields have values
WHERE order_id IS NULL → 0 rows
Unique
No duplicates on key columns
COUNT(*) = COUNT(DISTINCT id)
Range
Numeric values within bounds
amount BETWEEN 0 AND 1,000,000
Categorical
Values in allowed set
status IN ('pending', 'active', 'closed')
Freshness
Data is recent enough
MAX(updated_at) > NOW() - INTERVAL '24 hours'
Row count
No unexpected data loss or explosion
Within ±10% of previous run
Referential
Foreign keys point to existing records
customer_id EXISTS IN customers
Quality Tool Integration
Use a layered quality strategy — different tools at different pipeline stages:
Stage
Tool
Purpose
Ingest
Great Expectations
Validate raw data against expectations before staging
Changes to a contracted schema require versioning and consumer notification.
5. Analysis & Reporting
Migration and Backfill Sequencing (DATA-MIGRATION-01, DEFAULT)
Treat schema changes and data backfills as separate steps. Production evolution runs
expand → backfill → dual read/write where needed → contract.
Before declaring the migration complete, require three things: a dry run, an
idempotency proof, and reconciliation counts. Idempotency is the one that
matters most in practice — a backfill is the operation most likely to be interrupted and
resumed, so one that is not safe to re-run turns a retry into double-counted data.
Report confidence intervals, not just point estimates.
Visualize distributions (histograms, box plots), not just averages.
Distinguish correlation from causation explicitly.
6. Architecture Decisions
Batch vs. Streaming
Condition
Choose
Real-time insight required (sub-minute latency)
Streaming (Kafka + Flink, Spark Structured Streaming, or Kafka Streams depending on complexity)
Exactly-once semantics needed
Kafka transactional producers + Flink/Spark
Latency >1 min acceptable, volume >1TB/day
Distributed batch (Spark, Databricks)
Latency >1 min acceptable, volume <1TB/day
Single-node batch (SQL, Python, dbt)
Default to batch. Streaming adds significant complexity in error handling, state management, and debugging. Only use streaming when latency requirements genuinely demand it.
Streaming Decision Tiers (heuristic guidance)
Latency Requirement
Framework
Complexity
Sub-100ms, complex stateful
Apache Flink
High (dedicated cluster)
Sub-second, existing Spark infra
Spark Structured Streaming
Medium
Sub-second, Kafka-centric
Kafka Streams (embedded library)
Low-Medium
Minutes acceptable
Batch with frequent scheduling
Low
Kafka essentials for data engineers (Kafka 4.x / KRaft era — no ZooKeeper):
Partition by expected throughput — avoid excessive partitions
Use Schema Registry for backwards-compatible evolution
Default to at-least-once delivery + idempotent consumers
Use exactly-once only for financial/billing (transactional producers + consumers)
Monitor consumer lag via Prometheus/Grafana
See references/streaming.md for Kafka configuration, CDC patterns, and windowing.
Storage Selection
Need
Choose
SQL analytics, BI dashboards, structured queries
Data warehouse (Snowflake, BigQuery, PostgreSQL)
ML training, unstructured data, large-scale storage
Data lake (S3/GCS + Parquet or Delta format)
Both SQL and ML needs
Lakehouse (Delta Lake, Apache Iceberg)
Real-time key-value lookups, caching
Redis, DynamoDB
Graph relationships
Neo4j, Neptune
Tool Selection
Category
Options (verified 2026-07-02)
Orchestration
Airflow 3.x (standalone DAG processor; SequentialExecutor removed), Prefect 3, Dagster
Lakehouse format: do NOT assume "Iceberg won" — Delta Lake and Apache Iceberg are both
active; choose by ecosystem (engine/vendor support, catalog, existing stack), not by
mindshare claims.
Tool Decision Matrix
Factor
pandas
Polars
DuckDB
Best for
<100MB, exploration, ML prep
>100MB, batch ETL, performance
SQL analytics, ad-hoc queries
Execution
Single-threaded, eager
Multi-threaded Rust, lazy eval
Vectorized, auto disk spill
Speed (groupby/join)
Baseline
5-10x faster
Matches Polars on SQL-native
Memory
Full load into RAM
Streaming, lazy chains
Spill-to-disk for out-of-core
API style
DataFrame (imperative)
DataFrame (expression-based)
SQL-first
ML interop
Excellent (scikit-learn, etc.)
Good (.to_pandas())
Good (.fetchdf())
File format
CSV, JSON, Excel
CSV, Parquet, Arrow-native
CSV, Parquet, JSON, S3 direct
Decision rule (HEURISTIC — size bands are guidance, not hard cutoffs):
Data size / workflow
Recommended tool
Small (<100MB), interactive exploration
pandas
Medium (100MB-10GB), batch transforms
Polars
SQL-first analytics, any size
DuckDB
Blended workflow
Polars transforms, DuckDB aggregations (zero-copy via Arrow)
See references/tools.md for full patterns and code examples.
See references/ml-pipeline.md for ML training pipelines, experiment tracking (MLflow 3.x), feature stores (Feast), and data versioning (DVC/Delta Lake).
7. Data Governance & PII
Data Classification
Level
Examples
Handling
Public
Aggregated metrics, public reports
No restrictions
Internal
Business KPIs, operational data
Access controls, no external sharing
Confidential
Customer data, financial records
Encryption at rest, column-level masking
Restricted
SSN, payment data, health records
Tokenization, row-level security, audit logging
PII Handling Checklist
Before building any pipeline that touches PII:
Classify all columns by sensitivity level
Apply masking/tokenization for non-production environments (static masking)
Implement dynamic masking for production queries (role-based)
Set data retention TTL — don't keep PII longer than needed
Support right-to-erasure (GDPR Article 17): cascading delete across all pipeline stages
Log all PII access for audit trail
Mask raw PII values before logs and traces — use structured logging with redaction
GDPR/CCPA Quick Reference
Requirement
Engineering Pattern
Right to erasure
Soft delete → batch purge → propagate to downstream stores including data lake
Data minimization
Collect only necessary fields; TTL on non-essential data
Consent tracking
Consent event store with versioned preferences; consent-aware pipeline branches
Data portability
Standardized export endpoint (JSON/CSV) per user request
See references/governance.md for detailed implementation patterns, row-level security, and retention policies.
8. Query Performance Guidelines
Ownership note: this section covers analytical SQL, warehouse/lakehouse queries, and pipeline transforms. Plain app CRUD SQL, OLTP schema design, and transactional query tuning belong to dev-backend/references/stacks/database.md.
Every query that runs in production: EXPLAIN ANALYZE before deploy
Slow query threshold: > 100ms for OLTP, > 5s for OLAP/analytics
Index strategy: B-tree for equality/range, GIN for array/JSONB, GiST for geo
Missing index detection: pg_stat_user_tables → seq_scan / idx_scan ratio
Partition tables > 10M rows if query patterns allow time-range or hash partitioning
Never SELECT * in production code — specify columns
For pipeline observability, follow the OpenTelemetry patterns in dev-backend/references/core/observability.md. Instrument pipeline stages as spans, data quality checks as events.
When pipeline errors surface through APIs, use the AppError taxonomy from dev-backend/SKILL.md §3. Map pipeline failures to appropriate HTTP status codes (422 for validation, 502 for upstream failures, 503 for capacity).
For data API patterns (pagination of large datasets, cursor-based access, streaming responses), see dev-backend/references/core/api-design.md.
9. Companion Skills
Data engineering does not exist in isolation. Cross-reference these skills when your pipeline connects to other systems:
Companion
When to Consult
Key Sections
dev-backend
Exposing data via API, response envelope shape, pagination
Pipeline validation, contract tests for data APIs, CI gates
§2 Backend & API Testing, §3 Contract Testing
dev-frontend
Downstream reporting/dashboard consumers, data format expectations
§15 Backend Contract & Security Alignment
Integration patterns:
Data APIs serving frontend dashboards must use the standard response envelope (dev-backend §5)
PII pipelines must classify columns and apply masking per dev-security guidance before this skill's §7 rules
Data contract changes (§4 Data Contracts) must notify downstream consumers including frontend teams
Data Change Review Checklist (DATA-REVIEW-01, DEFAULT)
Source: sol research (dev-skill reinforcement audit, Euler findings).
When reviewing or implementing changes that affect data pipelines, schemas,
or data stores, check these domain-specific concerns:
Schema Changes
Is the change backward-compatible? (additive fields, optional columns)
Are existing consumers updated or tolerant of the new schema?
Is there a migration path for existing data?
Are destructive changes (DROP, RENAME, type narrowing) reversible?
Is the schema change tested with representative production-scale data?
Pipeline Changes
Are late/out-of-order events handled correctly?
Is the pipeline idempotent for replays?
Are timezone/DST transitions handled (especially for daily aggregations)?
Is numeric precision preserved across transforms (float → decimal)?
Are nondeterministic transforms (sampling, shuffling) reproducible with seeds?
Quality Gates
Is there a before/after reconciliation report (row counts, checksums)?
Are null/missing value rates within expected bounds?
Are downstream consumers notified of schema or semantic changes?
Is the blast radius documented (which dashboards, models, exports break)?
Backfill Safety
Is the backfill cost estimated (compute, I/O, lock duration)?
Is there a rollback plan for partial backfill failure?
Are concurrent writes handled during backfill?
Is the backfill window documented and approved?
1---2name: jaw-dev-data3description: MUST USE for data engineering and analysis work — pipelines, ETL/ELT, data quality, SQL optimization, schema evolution, backfills, and reporting. Triggers: ETL, ELT, pipeline, data quality, SQL optimization, backfill, migration, schema drift, validation, batch vs streaming, dashboard-db, sqlite, audit-log-schema, connector-data, 데이터 파이프라인, 데이터 품질, 백필.4---56# Dev-Data — Data Engineering & Analysis Guide78Production-grade data engineering patterns for building reliable data systems.9Activates by change surface for data pipelines, analytics, SQL-heavy work, schema evolution, backfills, and reporting.1011> **C0/C1 work (small local patches):** See `dev` §0.0 Work Classifier + §0.1 Patch Fast-Path before reading references.1213> **`dev` is canonical:** `dev` §0.2 Rule Classes, §3 Verification Gate, and §5 Safety Rules apply to all work governed by this skill.1415## When to Activate1617- Building data pipelines or ETL/ELT processes18- Processing CSV, JSON, Parquet, or Excel files19- Writing analytical SQL, warehouse/lakehouse queries, or transformation models20- Setting up data quality checks or validation21- Performing data analysis, aggregation, or reporting22- Choosing between batch and streaming architectures2324**Do not activate for plain app CRUD SQL, OLTP query tuning, or transactional schema design.** Route those to `dev-backend/references/stacks/database.md`. This skill owns analytics, ETL/ELT, pipelines, data quality, and reporting.2526## External/current data evidence2728For current external dataset contracts, source freshness, pipeline/tool version29behavior, provider data API changes, or public benchmark/source claims, read the30active `search` skill and follow its query-rewrite, source-fetch, and31evidence-status rules. Use browser fetch/open/text/get-dom/snapshot only after32candidate URLs exist and the claim needs browser-verifiable source evidence.3334---3536## Pre-Flight Checklist3738Before delivering:39- [ ] Input contract defined: source, schema, expected columns/types, and owner40- [ ] Pipeline is idempotent and restartable from the last successful checkpoint41- [ ] Data-quality checks cover nulls, uniqueness, ranges, freshness, and row counts42- [ ] Volume and latency justify the chosen engine: pandas, Polars, DuckDB, SQL warehouse, Spark/Flink43- [ ] Invalid records have a dead-letter/quarantine path with enough context to debug44- [ ] PII/governance classification is complete or delegated to `dev-security`/§745- [ ] Output format and downstream contract are explicit4647---4849## 1. Data Processing Principles5051Five rules that apply to every data task:5253| Principle | What It Means |54|-----------|---------------|55| **Pipeline thinking** | Every pipeline is Extract → Transform → Load. Keep each stage as an independent, testable function. |56| **Schema-first** | Define expected columns, types, and constraints BEFORE writing transformation logic. |57| **Defensive parsing** | External data will have nulls, wrong types, extra columns, missing columns, and encoding issues. Assume all of these. |58| **Idempotent operations** | Running the same pipeline twice on the same input must produce the same output. Use upsert patterns, not blind inserts. |59| **Fail fast, fail loud** | Raise errors at pipeline boundaries immediately. Internal transforms propagate errors; dead-letter queues handle row-level quarantine at the boundary (see §3). |6061---6263## 2. Data Ingestion Patterns6465### Format-Specific Guidance6667| Format | Best For | Watch Out For |68|--------|----------|---------------|69| **CSV** | Simple tabular data, human-readable | Encoding (UTF-8 BOM), delimiter ambiguity, multiline values, inconsistent quoting |70| **JSON** | Nested structures, API responses | Large files (stream, don't load all at once), deeply nested objects, encoding |71| **Parquet** | Large analytical datasets, columnar queries | Requires library support, not human-readable, schema evolution |72| **Excel** | Business user handoffs | Multiple sheets, merged cells, formulas vs. values, date formatting |73| **Database** | Production system access | Connection pooling, query timeouts, use read replicas for analytics |7475### Incremental Loading7677For large or frequently updated data sources:78791. Use a **watermark column** (e.g., `updated_at`, `id`) to track the last processed record.802. Store the watermark after successful load. On failure, restart from the last saved watermark.813. Process in batches (tune based on source limits and memory), not all-at-once.824. Validate row counts: `loaded_rows` should equal `source_rows_since_watermark`.8384### Schema Validation on Ingest8586Before any transformation, validate incoming data:8788```89✅ Check: Expected columns exist90✅ Check: Data types match (string, number, date, boolean)91✅ Check: Required fields are not null92✅ Check: Values are within expected ranges93✅ Check: No unexpected duplicate keys94❌ Fail: If any check fails, write to error log with row details. Don't silently drop.95```9697---9899## 3. ETL/ELT Pipeline Design100101### Layer Architecture102103**Rules:**104- **Keep staging immutable.** Copy first, transform in a separate step — this enables replay and debugging.105- **One transformation per step.** Don't combine cleaning + joining + aggregating in one function. Chain separate steps.106- **Incremental processing.** Process only new/changed records when possible. Full reloads only when schema changes.107108### dbt Integration Patterns109110Engine landscape (verified 2026-07-02): **dbt Core** remains the default; **dbt Fusion**111is the separately-documented/licensed current engine (check its feature matrix and112license before adopting); **SQLMesh** is a credible active alternative with plan/apply113workflows. Choose per license posture and team workflow — do not assume Fusion pricing114without a primary source.115116When using dbt for transformations, follow the **staging → intermediate → mart** layer architecture:117118**Rules:**119- **Staging models**: rename, cast, filter NULLs — no joins, no business logic120- **Intermediate models**: joins across staging, deduplication, business transforms121- **Mart models**: aggregations, final business entities consumed by BI/analytics122- Every model has a `schema.yml` with tests (not_null, unique, relationships, custom SQL).123- Run validation tests in CI and after significant changes — treat test failures as pipeline failures.124- Use `dbt source freshness` to monitor upstream data staleness125126### Error Handling in Pipelines127128| Scenario | Pattern |129|----------|---------|130| **Invalid records** | Write to dead-letter table/file for manual review. Preserve every record for debugging. |131| **Source unavailable** | Retry with exponential backoff (1s, 2s, 4s). Alert after 3 failures. |132| **Schema mismatch** | Halt pipeline. Log expected vs. actual schema. Don't attempt partial loads. |133| **Duplicate records** | Use upsert (INSERT ON CONFLICT UPDATE) or deduplicate with window functions. |134135### Orchestration Basics136137When pipelines have multiple steps with dependencies:138139- Define tasks as a **DAG** (Directed Acyclic Graph). Each task depends on its upstream tasks.140- Each task must be **independently retryable**. If step 3 fails, you restart step 3, not step 1.141- Set reasonable retries (2-3) with delay (5 min between attempts).142- Add timeout per task to prevent hung pipelines.143- Alert on failure: email, Slack, or monitoring dashboard.144145---146147## 4. Data Quality148149### Validation Checks150151Run these after every pipeline step, not just at the end:152153| Check | What It Validates | Example |154|-------|-------------------|---------|155| **Not null** | Required fields have values | `WHERE order_id IS NULL` → 0 rows |156| **Unique** | No duplicates on key columns | `COUNT(*) = COUNT(DISTINCT id)` |157| **Range** | Numeric values within bounds | `amount BETWEEN 0 AND 1,000,000` |158| **Categorical** | Values in allowed set | `status IN ('pending', 'active', 'closed')` |159| **Freshness** | Data is recent enough | `MAX(updated_at) > NOW() - INTERVAL '24 hours'` |160| **Row count** | No unexpected data loss or explosion | Within ±10% of previous run |161| **Referential** | Foreign keys point to existing records | `customer_id EXISTS IN customers` |162163### Quality Tool Integration164165Use a **layered quality strategy** — different tools at different pipeline stages:166167| Stage | Tool | Purpose |168|-------|------|---------|169| **Ingest** | Great Expectations | Validate raw data against expectations before staging |170| **Transform** | dbt tests | Assert model-level quality (not_null, unique, relationships, custom SQL) |171| **Production** | Soda / Monte Carlo | Real-time monitoring, anomaly detection, SLA enforcement |172173Validate data dimensions: completeness, uniqueness, range, format, referential integrity, freshness.174175**Rule:** Run validation on every pipeline step — skipping "because the data looks fine" leads to silent downstream corruption.176177### Data Contracts178179For datasets shared between teams, define a contract:180181A data contract must include:182- **name**, **owner**, **version**183- **schema**: column name, type, nullability, uniqueness, allowed values184- **SLA**: freshness threshold, minimum completeness percentage185- **consumers**: list of downstream teams/systems186187Changes to a contracted schema require **versioning and consumer notification**.188189---190191## 5. Analysis & Reporting192193### Migration and Backfill Sequencing (DATA-MIGRATION-01, DEFAULT)194195Treat schema changes and data backfills as **separate steps**. Production evolution runs196expand → backfill → dual read/write where needed → contract.197198Before declaring the migration complete, require three things: a **dry run**, an199**idempotency proof**, and **reconciliation counts**. Idempotency is the one that200matters most in practice — a backfill is the operation most likely to be interrupted and201resumed, so one that is not safe to re-run turns a retry into double-counted data.202203### Always Start with Summary Statistics204205Before any deep analysis, provide:206207| Metric | What to Report |208|--------|----------------|209| Row count | Total records in dataset |210| Column inventory | Name, type, null count per column |211| Numeric summary | min, max, mean, median, std dev |212| Categorical summary | Unique values, top 5 most frequent |213| Time range | Earliest and latest timestamp |214| Data quality | Null percentage, duplicate percentage |215216### Output Formats217218| Format | When to Use |219|--------|-------------|220| **Markdown tables** | Inline reports, ≤50 rows, quick summaries |221| **JSON** | Programmatic consumption, API responses |222| **CSV export** | Handoff to spreadsheet users, large datasets |223| **HTML + charts** | Dashboards, visual reports (Chart.js, Mermaid diagrams) |224225### Statistical Reporting226227When analysis involves statistics:228- State the method used and its assumptions.229- Report confidence intervals, not just point estimates.230- Visualize distributions (histograms, box plots), not just averages.231- Distinguish correlation from causation explicitly.232233---234235## 6. Architecture Decisions236237### Batch vs. Streaming238239| Condition | Choose |240|-----------|--------|241| Real-time insight required (sub-minute latency) | Streaming (Kafka + Flink, Spark Structured Streaming, or Kafka Streams depending on complexity) |242| Exactly-once semantics needed | Kafka transactional producers + Flink/Spark |243| Latency >1 min acceptable, volume >1TB/day | Distributed batch (Spark, Databricks) |244| Latency >1 min acceptable, volume <1TB/day | Single-node batch (SQL, Python, dbt) |245246**Default to batch.** Streaming adds significant complexity in error handling, state management, and debugging. Only use streaming when latency requirements genuinely demand it.247248### Streaming Decision Tiers (heuristic guidance)249250| Latency Requirement | Framework | Complexity |251|---------------------|-----------|------------|252| Sub-100ms, complex stateful | Apache Flink | High (dedicated cluster) |253| Sub-second, existing Spark infra | Spark Structured Streaming | Medium |254| Sub-second, Kafka-centric | Kafka Streams (embedded library) | Low-Medium |255| Minutes acceptable | Batch with frequent scheduling | Low |256257**Kafka essentials for data engineers (Kafka 4.x / KRaft era — no ZooKeeper):**258- Partition by expected throughput — avoid excessive partitions259- Use Schema Registry for backwards-compatible evolution260- Default to at-least-once delivery + idempotent consumers261- Use exactly-once only for financial/billing (transactional producers + consumers)262- Monitor consumer lag via Prometheus/Grafana263264See `references/streaming.md` for Kafka configuration, CDC patterns, and windowing.265266### Storage Selection267268| Need | Choose |269|------|--------|270| SQL analytics, BI dashboards, structured queries | Data warehouse (Snowflake, BigQuery, PostgreSQL) |271| ML training, unstructured data, large-scale storage | Data lake (S3/GCS + Parquet or Delta format) |272| Both SQL and ML needs | Lakehouse (Delta Lake, Apache Iceberg) |273| Real-time key-value lookups, caching | Redis, DynamoDB |274| Graph relationships | Neo4j, Neptune |275276### Tool Selection277278| Category | Options (verified 2026-07-02) |279|----------|---------|280| **Orchestration** | Airflow 3.x (standalone DAG processor; `SequentialExecutor` removed), Prefect 3, Dagster |281| **Transformation** | dbt Core / dbt Fusion / SQLMesh, Spark, plain SQL |282| **Streaming** | Kafka 4.x (KRaft), Kinesis, Pub/Sub |283| **Quality** | GX Core (Great Expectations' OSS library), dbt tests, Soda Core (data contracts), custom validators |284| **Monitoring** | Prometheus, Grafana, Datadog, Monte Carlo (data observability) |285| **Local analysis** | DuckDB (in-process SQL), Polars (fast DataFrame), pandas 3.x (exploration/ML) |286287Lakehouse format: do NOT assume "Iceberg won" — Delta Lake and Apache Iceberg are both288active; choose by ecosystem (engine/vendor support, catalog, existing stack), not by289mindshare claims.290291### Tool Decision Matrix292293| Factor | pandas | Polars | DuckDB |294|--------|--------|--------|--------|295| **Best for** | <100MB, exploration, ML prep | >100MB, batch ETL, performance | SQL analytics, ad-hoc queries |296| **Execution** | Single-threaded, eager | Multi-threaded Rust, lazy eval | Vectorized, auto disk spill |297| **Speed (groupby/join)** | Baseline | 5-10x faster | Matches Polars on SQL-native |298| **Memory** | Full load into RAM | Streaming, lazy chains | Spill-to-disk for out-of-core |299| **API style** | DataFrame (imperative) | DataFrame (expression-based) | SQL-first |300| **ML interop** | Excellent (scikit-learn, etc.) | Good (`.to_pandas()`) | Good (`.fetchdf()`) |301| **File format** | CSV, JSON, Excel | CSV, Parquet, Arrow-native | CSV, Parquet, JSON, S3 direct |302303**Decision rule (HEURISTIC — size bands are guidance, not hard cutoffs):**304305| Data size / workflow | Recommended tool |306|----------------------|------------------|307| Small (<100MB), interactive exploration | pandas |308| Medium (100MB-10GB), batch transforms | Polars |309| SQL-first analytics, any size | DuckDB |310| Blended workflow | Polars transforms, DuckDB aggregations (zero-copy via Arrow) |311312See `references/tools.md` for full patterns and code examples.313See `references/ml-pipeline.md` for ML training pipelines, experiment tracking (MLflow 3.x), feature stores (Feast), and data versioning (DVC/Delta Lake).314315---316317## 7. Data Governance & PII318319### Data Classification320321| Level | Examples | Handling |322|-------|----------|---------|323| **Public** | Aggregated metrics, public reports | No restrictions |324| **Internal** | Business KPIs, operational data | Access controls, no external sharing |325| **Confidential** | Customer data, financial records | Encryption at rest, column-level masking |326| **Restricted** | SSN, payment data, health records | Tokenization, row-level security, audit logging |327328### PII Handling Checklist329330Before building any pipeline that touches PII:331- [ ] Classify all columns by sensitivity level332- [ ] Apply masking/tokenization for non-production environments (static masking)333- [ ] Implement dynamic masking for production queries (role-based)334- [ ] Set data retention TTL — don't keep PII longer than needed335- [ ] Support right-to-erasure (GDPR Article 17): cascading delete across all pipeline stages336- [ ] Log all PII access for audit trail337- [ ] Mask raw PII values before logs and traces — use structured logging with redaction338339### GDPR/CCPA Quick Reference340341| Requirement | Engineering Pattern |342|-------------|---------------------|343| Right to erasure | Soft delete → batch purge → propagate to downstream stores including data lake |344| Data minimization | Collect only necessary fields; TTL on non-essential data |345| Consent tracking | Consent event store with versioned preferences; consent-aware pipeline branches |346| Data portability | Standardized export endpoint (JSON/CSV) per user request |347348See `references/governance.md` for detailed implementation patterns, row-level security, and retention policies.349350---351352## 8. Query Performance Guidelines353354Ownership note: this section covers analytical SQL, warehouse/lakehouse queries, and pipeline transforms. Plain app CRUD SQL, OLTP schema design, and transactional query tuning belong to `dev-backend/references/stacks/database.md`.355356- Every query that runs in production: EXPLAIN ANALYZE before deploy357- Slow query threshold: > 100ms for OLTP, > 5s for OLAP/analytics358- Index strategy: B-tree for equality/range, GIN for array/JSONB, GiST for geo359- Missing index detection: `pg_stat_user_tables` → seq_scan / idx_scan ratio360- Partition tables > 10M rows if query patterns allow time-range or hash partitioning361- Never `SELECT *` in production code — specify columns362363For pipeline observability, follow the OpenTelemetry patterns in `dev-backend/references/core/observability.md`. Instrument pipeline stages as spans, data quality checks as events.364365When pipeline errors surface through APIs, use the AppError taxonomy from `dev-backend/SKILL.md` §3. Map pipeline failures to appropriate HTTP status codes (422 for validation, 502 for upstream failures, 503 for capacity).366367For data API patterns (pagination of large datasets, cursor-based access, streaming responses), see `dev-backend/references/core/api-design.md`.368369---370371## 9. Companion Skills372373Data engineering does not exist in isolation. Cross-reference these skills when your pipeline connects to other systems:374375| Companion | When to Consult | Key Sections |376|-----------|-----------------|--------------|377| `dev-backend` | Exposing data via API, response envelope shape, pagination | §5 API Response Contract, §2 Layered Architecture |378| `dev-security` | PII handling, data classification, access controls, audit logging, input validation policy (per dev-security §10 ownership matrix) | §1 Input Validation, §4 Secrets, §8 Pre-Flight |379| `dev-testing` | Pipeline validation, contract tests for data APIs, CI gates | §2 Backend & API Testing, §3 Contract Testing |380| `dev-frontend` | Downstream reporting/dashboard consumers, data format expectations | §15 Backend Contract & Security Alignment |381382**Integration patterns:**383- Data APIs serving frontend dashboards must use the standard response envelope (`dev-backend` §5)384- PII pipelines must classify columns and apply masking per `dev-security` guidance before this skill's §7 rules385- Data contract changes (§4 Data Contracts) must notify downstream consumers including frontend teams386387---388## Data Change Review Checklist (DATA-REVIEW-01, DEFAULT)389390Source: sol research (dev-skill reinforcement audit, Euler findings).391392When reviewing or implementing changes that affect data pipelines, schemas,393or data stores, check these domain-specific concerns:394395### Schema Changes396- [ ] Is the change backward-compatible? (additive fields, optional columns)397- [ ] Are existing consumers updated or tolerant of the new schema?398- [ ] Is there a migration path for existing data?399- [ ] Are destructive changes (DROP, RENAME, type narrowing) reversible?400- [ ] Is the schema change tested with representative production-scale data?401402### Pipeline Changes403- [ ] Are late/out-of-order events handled correctly?404- [ ] Is the pipeline idempotent for replays?405- [ ] Are timezone/DST transitions handled (especially for daily aggregations)?406- [ ] Is numeric precision preserved across transforms (float → decimal)?407- [ ] Are nondeterministic transforms (sampling, shuffling) reproducible with seeds?408409### Quality Gates410- [ ] Is there a before/after reconciliation report (row counts, checksums)?411- [ ] Are null/missing value rates within expected bounds?412- [ ] Are downstream consumers notified of schema or semantic changes?413- [ ] Is the blast radius documented (which dashboards, models, exports break)?414415### Backfill Safety416- [ ] Is the backfill cost estimated (compute, I/O, lock duration)?417- [ ] Is there a rollback plan for partial backfill failure?418- [ ] Are concurrent writes handled during backfill?419- [ ] Is the backfill window documented and approved?
Run npx skillmds@latest add lidge-jun/jaw-dev-data in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
MUST USE for data engineering and analysis work — pipelines, ETL/ELT, data quality, SQL optimization, schema evolution, backfills, and reporting. Triggers: ETL, ELT, pipeline, data quality, SQL optimization, backfill, migration, schema drift, validation, batch vs streaming, dashboard-db, sqlite, audit-log-schema, connector-data, 데이터 파이프라인, 데이터 품질, 백필. It is listed under DevOps & Infra on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
lidge-jun (@lidge-jun) published this skill. Their other Agent Skills are listed on their SkillMD profile.