AI Engineering · Data Engineering

Mamadou Bassirou Diallo

I build AI systems and the data platforms under them, end to end, and I run the evaluation that could kill my own favourite feature before I ship it. Three of the projects below changed their production default because of what that evaluation found.

M.S. Business Analytics & AI, UT Dallas · Dallas-Fort Worth · Internships and full-time roles from 2027 · Open to relocation

End-to-end projects
8
Eval runs across the three agents
924
Clouds the lakehouses are verified on
3
Point-in-time financial facts in the SEC lakehouse
7.07M

Selected work

Eight projects, each finished

Tests, CI, a Docker image, a section on what broke while building it, and a section on what it cannot do yet. The numbers on every card come from the repo's own eval report or run log, not from a slide.

01

AI engineering

LLM agents with tool use, human-in-the-loop gates and an eval harness that decides the default.

ChainPilot

Supply-chain disruption agent

Detects a stock-out or supplier delay, runs ten tool calls, has specialists argue when confidence is low, drafts RFQs and a Slack alert, and stops at a human-approval gate above a trust threshold that moves with rated outcomes. Live tool feed over SSE, React UI, single Docker image with a recorded replay mode.

What the eval found

Across 204 runs on Sonnet 5, plain direct synthesis scored 0.735 strict accuracy against 0.382 with always-on deliberation. My conditional gate was the least stable branch: its trigger flipped on 12 of 34 scenarios. Direct synthesis is now the default and the gate is a flag.

Eval runs
204
Direct vs deliberate
0.735 / 0.382
Cost per run
$0.26
  • Python
  • Anthropic API
  • FastAPI
  • React
  • SSE
  • Docker

TriageIQ

ER triage decision support

A symptom specialist flags red flags, a senior-nurse synthesizer assigns the ESI level, care area and action checklist. Nurse override with a required reason, printable report, hash-chained audit log. Mock patients only, labelled as such on every screen. Haiku 4.5 for the specialists, Sonnet 5 for synthesis.

What the eval found

Across 270 runs, a single prompt scored 100% on ESI level and produced no report at all on 12 of 99 attempts, all on ambiguous cases. The lean pipeline scored 98.9% and never failed to produce one. Zero critical misses on both. That completeness row is why lean is the default.

Eval runs
270
Critical misses
0
Reports missing (single prompt)
12 / 99
  • Python
  • Anthropic API
  • FastAPI
  • React
  • Pydantic
  • Docker

ClauseGuard

Contract-conflict agent

Extracts clauses from two PDFs, finds and ranks every conflict, drafts a redline brief, and has a second model review each suggested resolution. A 24-entry negotiation playbook is exposed as a tool. Advice to counsel, never an executed amendment.

What the eval found

Across 450 runs on Sonnet 5, the agentic loop beat the single prompt by 5.4 F1 points, outside the 0.05 to 0.07 run-to-run noise, so it became the default. Inlining the playbook into the prompt cost 14 points; exposing it as a tool was neutral. The router I had built did not earn its place and is now an opt-in cost lever.

Eval runs
450
F1, agentic vs single prompt
78.9 / 73.5
Playbook inlined
−14 pts
  • Python
  • Anthropic API
  • FastAPI
  • React
  • PyMuPDF
  • Docker
02

Data engineering

Iceberg lakehouses that run on a laptop with Docker Compose and are applied and verified on AWS, Azure and GCP.

SEC Filings Lakehouse

AI-ready Iceberg lakehouse on real EDGAR filings

7.07M point-in-time financial facts with every restated version kept, so "what did we know on date D" is one predicate. dbt with an enforced contract, 10-K and 10-Q text chunked and embedded into pgvector as immutable index versions behind a retrieval-eval gate, a FastAPI RAG endpoint with citations, Dagster orchestration, Terraform for three clouds.

What went wrong, and what caught it

The promotion gate rejected two of my three embedding indexes and was right both times: one was a retrieval problem, fixed with hybrid search, and one was two bugs of mine in the chunker and the eval itself. 17,977 restated facts in two quarters is why the point-in-time model exists.

Filings
13,240
Facts
7.07M
Promoted index recall@5
1.00
  • Apache Iceberg
  • dbt
  • Dagster
  • DuckDB
  • pgvector
  • FastAPI
  • Terraform
  • AWS · Azure · GCP

GitHub Archive Streaming Lakehouse

Kafka to Iceberg, exactly once, with CDC and FinOps

GH Archive events replayed onto Redpanda as Avro with a schema registry, Spark Structured Streaming writing exactly-once into Iceberg with watermarks and RocksDB state, Debezium CDC folded into an SCD2 dimension, replay and backfill, Prometheus and Grafana, and a cost model that prices three AWS designs and says which one to pick.

What went wrong, and what caught it

The first run put every event in 1970. A freshness gauge I had added because consumer lag says nothing about correctness caught it; lag did not. After a full-hour replay the table held 169,753 events with 169,753 distinct ids: zero duplicates. The README lists five things that broke.

Events, distinct ids
169,753
Duplicates after replay
0
Files after compaction
75 → 15
  • Kafka / Redpanda
  • Avro
  • Spark Structured Streaming
  • Apache Iceberg
  • Debezium
  • Prometheus · Grafana
  • Terraform
  • AWS · Azure · GCP

Stack Overflow Retention

Causal inference on 1.77M new contributors

Does a fast first answer make new contributors stay? A five-step BigQuery pipeline (44 GB scanned for $0.22) and four estimators: controlled OLS, IPW, propensity stratification and 2SLS. The estimators live in a tested module, the dashboard reads committed summaries, and the whole thing ships as a Docker image.

What the analysis found

The three controlled estimators agree on about +7.7 points of 30-day retention. The instrumental-variable estimate came out at −20 points with a strong first stage, which says the exclusion restriction does not hold. It is reported as a failure, not dropped.

Users
1.77M
D30 retention lift
+7.7 pp
BigQuery cost
$0.22
  • BigQuery
  • statsmodels
  • linearmodels
  • Streamlit
  • pytest
  • Docker
03

Machine learning

Models served behind an API with drift monitoring, golden tests, and a public app.

SBA Loan Default Prediction

XGBoost on 890K loans · Live app

Default-risk model with a FastAPI service, PSI drift monitoring, golden-prediction tests and a Gradio scoring app on Hugging Face where a loan officer can pick the operating point.

What the evaluation found

The ensemble weight search picked one model, and the metadata says so. The cost-weighted threshold analysis found 0.35 lowers expected loss by 22% versus the F1-optimal 0.66; the app offers both. Calibration error is 0.21, and the app says that too.

AUCPR
0.567
Base rate
18%
Expected loss at 0.35
−22%
  • XGBoost
  • Optuna
  • SHAP
  • FastAPI
  • Gradio
  • Docker

NBA Contract Value Analyzer

LightGBM salary model · Live app

Market salary from on-court production with a leakage-safe time split, empirical 80% prediction intervals, a staleness flag, drift monitoring, a static site and a Streamlit dashboard on Hugging Face.

What the evaluation found

The notebook's R² of 0.741 was early-stopping on the test season. The honest retrain is 0.733, and a determinism test keeps it there. Real salary data covers about 75 players because the salary sites sit behind Cloudflare; the synthetic fallback is disclosed on every page and in the API.

R² (honest)
0.733
MAE
$1.41M
Interval coverage
78%
  • LightGBM
  • FastAPI
  • Streamlit
  • pytest
  • Docker

How I work

The evaluation decides, not the architecture diagram

1

Write the eval before trusting the feature

Every agent ships with a scored harness, checkpoints and a resume flag. When the harness said my deliberation layer, my router or my specialist pipeline was not earning its cost, the default changed and the report stayed in the repo.

2

Keep the account of what went wrong

Each README has a section on what broke: the 1970 timestamps, the merge that read a stale cache, the eval that was itself wrong. The bugs were real and the fixes are in the code. I would rather you read them there than find them in an interview.

3

Local first, then cloud, then verified

Every system runs on a laptop with Docker Compose. The Terraform for AWS, Azure and GCP is applied, and the pipeline is re-run on each target and read back before the README says "verified".

Stack

What the projects are built with

AI systems

  • Anthropic API
  • Tool use & agents
  • pgvector
  • Hybrid retrieval
  • Eval harnesses
  • SSE streaming

Data platforms

  • Apache Iceberg
  • Spark Structured Streaming
  • Kafka / Redpanda
  • Debezium
  • dbt
  • Dagster
  • DuckDB
  • BigQuery

Modelling

  • XGBoost
  • LightGBM
  • scikit-learn
  • statsmodels
  • SHAP
  • Causal inference

Delivery

  • Python
  • SQL
  • FastAPI
  • React
  • Docker
  • Terraform
  • GitHub Actions
  • Prometheus · Grafana

About

Background

I am finishing an M.S. in Business Analytics and Artificial Intelligence at UT Dallas. Before that I completed a B.S. with a double major in AI Engineering and Management Information Systems at Sahmyook University in Seoul, taught in Korean, my third language. The portfolio above is what I built alongside coursework, chosen to show the kind of judgment an engineer has to have before holding the title.

The habit I hold every project to is simple: the evaluation, not my attachment to a design, decides what ships. Three of the eight projects changed their production default because of a measurement I did not expect, and the reports that changed my mind are in the repos.

Education

  • M.S. Business Analytics & AI
    The University of Texas at Dallas · 2027 (expected)
  • B.S. AI Engineering & Management Information Systems
    Sahmyook University, Seoul · taught in Korean

Languages

  • English · French (native) · Korean · basic Spanish

Looking for

  • AI engineering internships and full-time roles from 2027, new-grad or early-career, with data engineering as a close second. Based in Dallas-Fort Worth, open to relocation.

Contact

Let's talk

A LinkedIn message gets the fastest reply. Email works too. If it is about a specific role, include the title and the posting link so I can read it before we talk.