
What I built
I built a reproducible data-engineering sample that turns approval-workflow CSVs into validated relational records and a lifecycle report. Each reported request can be traced back to its authors, events, and source fields.
The project addresses a familiar reporting problem: request spreadsheets, author records, and dashboard exports can disagree about what “complete” means. I made those rules explicit so a bad record produces an explanation before it becomes a confident-looking total.
Explore the browser walkthrough
Follow four fictional requests, inspect a missing completion date or approval-count mismatch, and apply an example correction. This site-created illustration runs in your browser; it does not execute the repository’s Python or SQL code.
The repository’s separate 12-request Python/SQLite demo checks fresh data generation, builds lifecycle facts, and deliberately introduces invalid examples. Its recorded output makes the same questions inspectable through an actual data pipeline.
Architecture and decisions
- Preserve inputs long enough to explain them. Raw staging retains records for validation; failed input produces a report and an unsuccessful exit before core loading.
- Count from the source entities. Lifecycle facts derive approval counts from core author records, then compare them with independent dashboard extracts.
- Give each table a clear job. A lifecycle fact represents one request, event rows retain detailed history, and daily author snapshots capture changes over time.
- Separate portable and engine-specific checks. SQLite supports a local run without infrastructure; a SQL Server harness checks history rules, permissions, and other engine behavior.
Same-day author changes coalesce into a daily snapshot. More detailed history belongs in event rows, while late-arriving history and persistent incremental loading remain possible extensions.
My contribution
I defined and reviewed the data contracts, modeling decisions, and failure cases, using the AI-assisted development approach described on the About page.
Scope and verification
Fresh local validation passed 22 tests, lint, formatting, strict types, generated-artifact comparisons, and package checks; the SQLite demo matched its recorded output. Hosted CI passed the SQL Server integration at the same reviewed revision. All records are generated fixtures, so these results establish sample behavior rather than Azure SQL deployment, production scale, adoption, or measured savings.
Run the repository example
With Python 3.11 or newer:
PYTHONPATH=src python3 scripts/demo.py
The command checks fixture reproducibility and demonstrates expected failures using temporary storage.
Source snapshot e4d9d25 · Reviewed 2026-09-22. This case study describes that revision; development may continue separately.