Jigon Yoo
Data & AI-Automation Engineer
Available for freelance work ↗ github.com/jigonyoo
Data & AI-Automation Engineer

Automation your team can put into production — and actually trust.

I build data and AI-automation pipelines with a verification layer built in — confidence scores, checks against source, and a human-review queue for anything uncertain. Anyone can get a model to emit JSON; what a team pays for is output it can trust and sign off on.

Public & unit-tested Reproducible runs Human-in-the-loop Async · chat-based delivery MIT-licensed on GitHub

Live app

1
Deployed and interactive — click through it in the browser.
WNBA PROPBOARD ● Live Public

A dark, interactive WNBA player-prop board — sortable table with per-player sparklines, book line vs. projection with over/under coloring, and a click-through player-detail panel. Deployed as a standalone Vercel page that auto-updates on every push.

Data layer verifies every field against source (wnba.com / API) before it reaches the board; sample data shown in the demo is labeled as such.
htmldatavizvercelgithub ci/cd

Workflow & intake automation

2
Turning raw inbound into routed, reviewed, CRM-ready records — with the uncertain cases caught, not dropped.
ai-intake-qualifierPublic

Raw lead / form submissions → normalized, classified, and scored (hot / warm / cold) → a staff summary and reply draft → routed by a verification gate: trustworthy leads auto-flow to the CRM, uncertain ones go to a human-review queue. Runs fully offline (deterministic) or with OpenAI.

An LLM can label a lead; the value is knowing which to auto-route and which a human must see first — unreachable "hot" leads and ambiguous spam get caught, not dropped.
pythonlead scoringroutingqa gate
intake-router-multisourcePublic

Leads arrive from four differently-shaped sources (web form, Facebook Lead Ads, inbound email, CSV) → normalized to one schema → cross-source identity resolution merges the same person across channels → deterministic routing / SLA → a review gate for anything uncertain. Runs fully offline (deterministic) or with OpenAI.

Merging is a risk, not a convenience: only an exact email / phone match auto-merges — same name + same company but different contacts is flagged for a human, never silently combined. Full provenance and audit trail on every merge.
pythonidentity resolutiondeduproutingqa gate

Developer & AI tooling

6
Making a codebase something an AI agent can actually work in — generated context, kept fresh, and verified.
ai-ready-repo-setupPublic

Scans a repo into a CLAUDE.md / AGENTS.md an agent can follow — build/test commands, coding rules, prohibitions, CI smoke test, Definition of Done — then detects when it goes stale and scores readiness deterministically.

The moat isn't the generated file — it's drift detection + a deterministic readiness check that keeps the context honest, and says plainly what it does not measure.
pythonai-toolingclaude.mdverification
eval-harnessPublic

Golden-set regression testing for LLM / extraction pipelines: scores a pipeline, judges the fields where exact match is unfair, and fails CI when quality regresses. A real amount-parsing bug drops row-correct 100% → 48% and the gate blocks it.

The moat isn't the metric — it's a CI gate that catches silent regressions, an LLM-as-judge that recovers correct-but-non-exact answers, and a judge that's itself checked against human labels. Offline, no keys.
pythonevalllm-as-judgeci gateregression
mcp-server-prodPublic

A hardened MCP server exposing read-only order tools to an AI agent — treating every tool argument as untrusted, because it's LLM-generated. Validated, parameterized, read-only. A naive concat server leaks the whole table on a classic OR-1=1 injection; this one blocks 5/5 with zero functionality lost.

The moat is the security posture most MCP demos skip: tool args are a network boundary, so validation + parameterized SQL + a read-only connection — proven by a contract suite that also shows the naive version really leaks.
pythonmcpsecuritysql-injectionsqlite
llm-cost-optimizerPublic

A FinOps pass over an LLM usage log: reads a month of calls + a pricing table and reports how much spend is recoverable, with the dollars behind every recommendation. Model right-sizing + prompt-cache savings, runnable as a spend gate.

Turns "we should use a cheaper model" into a number: 38.9% of a synthetic month recoverable, the biggest win priced ($16.28 from moving classify off gpt-4o). Every figure derives from pricing.json — auditable, reproducible.
pythonfinopsllm costobservability
llm-guardrailsPublic

A drop-in input/output guardrail layer for LLM apps: blocks prompt injection and jailbreaks before they reach the model, and redacts leaked secrets/PII before they reach the user. Naive lets 33/33 attacks+leaks through; guarded stops all 33 — with zero false positives on 17 benign lookalikes.

The moat is the honesty of the numbers: weighted multi-signal detection that knows use from mention (0 false positives), a Luhn-checked redactor that never mangles clean text, and a CI gate that fails if protection regresses. Offline, no keys.
pythonllm securityprompt-injectionowasp-llmpii-redaction
agent-reliability-kitPublic

The reliability layer an agent’s tool calls need — retry, timeout, circuit breaker, idempotency — with the numbers showing what each buys. Same workload through naive / retry-only / reliable: naive 53/80 → reliable 63/80, double-charges 5 → 0, load on a down service 88 → 30 calls.

The moat is the honest tradeoff table: it shows retry-only’s double-charge footgun (5 duplicate side effects) and the breaker’s ~1-request post-recovery cost, not just the wins. Logical clock = byte-identical runs. Offline, no keys.
pythonagentopsreliabilitycircuit-breakeridempotency

Document & knowledge AI

4
Extraction and retrieval that cite their sources, reconcile the numbers, and refuse when the evidence isn't there.
invoice-to-structuredPublic

Documents (invoices, purchase orders, bank statements — PDF or scanned) → structured JSON/CSV through a deterministic verification engine: line math, balance reconciliation, totals, required fields, confidence scores, and a cross-document human-review gate. Optional AWS Textract path for scans.

The trust layer is the point — it flags which rows you can believe, not just extract-and-hope.
pythonidptextractreconciliationvalidation
rag-grounded-qaPublic

Grounded document Q&A that cites its sources, refuses when unsure (no hallucinations), and ships with an evaluation harness — recall@k, refusal accuracy, and grounding rate.

Not naïve RAG: the durable value is citation, refusal, and evaluation — scored, not hand-waved.
pythonragretrievaleval
rag-multidoc-crosscheckPublic

Cross-document Q&A that surfaces every source's claim and flags contradictions — old vs new policy, US vs EU handbook — routing conflicts to human review instead of hiding them.

In policy & compliance, a hidden contradiction between sources is the expensive failure. Consensus/conflict detection is the trust layer.
pythonragcomplianceconflict-detection
rag-hybrid-rerankPublic

Hybrid retrieval — BM25 + semantic, fused with Reciprocal Rank Fusion and reranked — with an evaluation harness that measures the lift (recall@k, MRR, nDCG) over any single retriever.

Retrieval quality is where RAG lives or dies. Here it is a measured number across four configs, not a claim.
pythonraghybrid-searchrerank

Analytics, ML & mining

4
Reports, predictions, and segments — with the data-quality checks, baselines, and limits stated up front.
analytics-pipelinePublic

Messy CSV → cleaned data (with a quality log) → KPIs and month-over-month analysis → an automated report with charts. Includes anomaly detection: outliers, revenue mismatches, MoM spikes.

Data-quality checks and anomaly flags are baked into the report — not a pretty-but-blind dashboard.
pythonpandasreportinganomaly
ml-churn-pipelinePublic

Customer-churn prediction with an honest evaluation: leakage-safe splits, a baseline to beat, 5-fold cross-validation, and a model card that states the limits. Logistic regression implemented in NumPy.

Leakage guard + baseline + CV + model card = the difference between a demo notebook and something you can rely on.
pythonnumpymlmodel card
data-mining-retailPublic

Market-basket association rules (Apriori, lift-based) + RFM customer segmentation — surfacing real cross-sell signals and at-risk customers, with explainable segments.

Lift-based real signal (not just co-occurrence) and segments a marketer can actually act on.
pythonapriorirfmsegmentation
field-inspection-reportPublic

Site photo → object detection → checklist verification → a PASS / REVIEW / FAIL report with annotated images. A confidence gate routes uncertain calls to human review; the detector is swappable (offline or a production vision model).

The detector is replaceable; the verification + human-review layer is the moat.
pythoncomputer visionnumpyqa gate

Data engineering & extraction

5
Reproducible pipelines that clean, normalize, and load — idempotently, with per-row confidence where it matters.
ai-product-extractorPublic

Messy product listings → clean, validated, de-duplicated data. LLM + heuristic extraction with a per-row confidence score and human-review flags.

Per-row confidence and review flags — you know exactly which rows to double-check.
pythonetldata extractionai-automation
hardware-parts-data-pipelinePublic

Multi-source scraper + unified-schema normalizer for robotics/electronics parts (Pololu + Adafruit, 380 products), with idempotent ETL into SQLite.

Unified schema + idempotent loads — re-runs don't duplicate or corrupt the store.
pythonweb scrapingetlsqlite
wnba-player-vs-defensePublic

Reproducible Python pipeline building a WNBA player-vs-defense info sheet — player game logs joined to opponent defense, every field verifiable against source.

The data engine behind the PROPBOARD demo — source-verifiable, reproducible.
pythonsports datapipeline
data-contract-guardPublic

A schema + range + enum contract with drift detection for tabular & sensor (rosbag) batches. Catches the batch that still parses but whose meaning changed — a firmware unit switch (°C→°F), a new category, a sensor dropout — that a naive "did it parse?" gate ships.

Names the cause, not the symptom: 0 issues on the naive check vs 36 violations + drift (joint_temp mean 45→112, z=14.9) on the same batch. Runs as a CI gate; the clean batch passes untouched.
pythondata contractdriftrosbagdata quality
ros2-bag-data-auditPublic

A (synthetic) ROS2 rosbag export of robot telemetry → a structured anomaly audit: per-topic publish-rate deviations, dropout gaps, header-vs-receive clock skew, out-of-range sensor values, TF frame gaps, and a cmd_vel-vs-odom stall signal — organized by how sure the evidence is.

Honest by construction: findings split into Confirmed evidence / Likely causes / Unverified hypotheses / Additional data required — it narrows candidate causes and says what data would confirm them, never asserting a root cause from a single bag.
pythonros2rosbagrobotopsanomaly detection
ros2-ci-bridgePublic

A ROS2 colcon workspace → a reproducible Docker build + GitHub Actions CI (colcon build/test) → an offline Python layer that parses the build/test logs into an evidence-graded build-health report.

Honest by construction: findings split into Confirmed evidence / Likely causes / Unverified hypotheses / Additional data required — the heavy build runs in CI, the demo verifies the analysis layer offline, and reproducibility is reported as signals, never a false "reproducible: yes".
pythonros2dockerci/cdrobotops
analytics-scheduled-reportPublic

A raw event/transaction log → scheduled daily/weekly reports with period-over-period deltas, threshold + statistical-outlier alerts, and idempotent re-runs.

Every alert carries its triggering rule and measured value — flags for a human to confirm, not a black-box "something's wrong".
pythonanalyticsschedulingalerting
demand-forecast-pipelinePublic

A demand time series → forecasts with prediction intervals from a rolling-origin backtest, honest error metrics, and an explicit "when NOT to trust this" section.

Uncertainty is the product: intervals come from observed backtest residuals and widen with horizon — no accuracy overclaim, stdlib-only math.
pythonforecastingtime seriesml
retail-sequence-miningPublic

A transaction log → sequential purchase patterns, cohort retention, and churn associations, with Wilson intervals so small groups aren't over-read.

Associations are labeled correlational, carry counts + confidence intervals, and recommend an experiment before anyone acts on them.
pythondata miningretailchurn
ros2-urdf-smoke-testPublic

A robot URDF → static structural audit (link/joint tree integrity, missing meshes, inertial sanity, joint limits) → a four-section smoke-test report.

Honest by construction: Confirmed / Likely / Unverified / Additional data — a pass means "likely loads", never "works" or "safe".
pythonros2urdfroboticsrobotops
analytics-significancePublic

Experiment/metric data → honest significance testing: two-proportion z-test and Welch's t-test (stdlib), confidence intervals, multiple-comparison correction (Bonferroni + Benjamini-Hochberg), and minimum detectable effect.

"Not significant" is reported with the effect it *could* have detected, not as "no effect"; family-wide correction flips naive false positives.
pythonstatisticsab testinganalytics
site-progress-reportPublic

Tagged site-photo metadata (EXIF) + an inspection checklist → a construction progress report: percent complete per area/phase, a timeline, and missing / out-of-sequence / stale-area detection.

Metadata + checklist only — never claims to see image content; answers "is every required shot present, in order, and recent", not "is the work good".
pythonautomationconstructionreporting
plan-vs-actual-reconPublic

A plan/spec with tolerances vs a measured inspection log → a reconciliation report: matched items, missing, extra, and out-of-tolerance deviations, each with the numbers.

Structured reconciliation, not CAD/vision; ambiguous matches are surfaced for a human instead of being silently auto-resolved.
pythonqareconciliationtolerance
mlb-matchup-infosheetPublic

MLB game logs → a reproducible batter-vs-pitcher info sheet: season/L5/L10, home-away and vs-hand splits, and head-to-head history, every number traceable to its sample size.

Information, not betting advice — no edge/EV claims and small samples flagged. Same reproducible pipeline as the WNBA sheet, second sport.
pythonsports datapipelinemlb
agentops-tool-orchestratorPublic

A single-agent loop — planner → guardrail validation → executor → eval harness. Tool registry with arg schemas, allow/deny + approval gates for side-effecting tools, step caps, and loop detection.

The safety + evaluation scaffolding around an LLM agent, not a model: side-effecting tools never run without an approval gate, and every block logs its rule.
pythonagentopsguardrailsevaluation
agentops-multiagent-supervisorPublic

A supervisor decomposes a task and routes subtasks to specialized worker agents over a message bus + shared blackboard, with coordination guardrails.

Multi-agent coordination plumbing with cycle/deadlock detection, delegation-depth caps, and per-agent budgets — deterministic and observable, not emergent magic.
pythonagentopsmulti-agentorchestration
agentops-trace-cost-guardPublic

Wraps an agent run to produce a structured trace (steps, tokens, latency), cost accounting from a pricing table, hard token/$ budget guards, and failure policies (retry, circuit-breaker, fallback).

Makes agent runs observable, budgeted, and fail-safe; costs from a static illustrative table and a logical clock keep it deterministic and honest.
pythonagentopsobservabilityreliability
lerobot-dataset-migratePublic

A LeRobot v2.1 dataset → a validated migration to the v3 layout: documented field/layout mapping, then integrity checks (frame counts, features, index continuity, stats) so nothing is silently dropped.

Migration + validation, not a black box — it models the publicly documented format and reports what it preserved vs what still needs checking against real datasets.
pythonroboticslerobotdata migrationrobotops
policy-eval-harnessPublic

Robot policy rollout logs → success rate with Wilson confidence intervals, per-task breakdowns, and A/B comparison (difference CI + two-proportion test), with small-sample flags.

Same training loss ≠ same real success rate: it compares measured success with uncertainty, and never reports a rate without its n and CI.
pythonroboticsevaluationstatisticsrobotops
dataset-curation-dedupPublic

A robot/ML dataset manifest → near-duplicate detection (Hamming/cosine on provided hashes), quality gates, a coverage/imbalance report, and a curated manifest with a justified rejection log.

Every drop has a reason and borderline duplicates go to human review, never silent auto-deletion; it operates on manifests + hashes, not raw pixels.
pythonroboticsdatasetdeduprobotops
domain-rand-sweepPublic

A parameter-space spec → a domain-randomization sweep (grid / random / Latin-hypercube) plus coverage and pairwise-gap analysis, ready to feed a simulator.

Designs and analyzes the sweep only — it runs no simulator and makes no sim-to-real transfer claim: broad coverage is not evidence of real-world robustness.
pythonroboticsdomain randomizationsimrobotops
crossembodiment-alignPublic

Multiple robot demonstration datasets (different embodiments, action spaces, control rates, gripper conventions) → a mixability assessment: normalize, flag frequency/gripper conflicts and missing embodiment metadata, and a per-pair mix / mix-subset / do-not-mix report.

The metadata needed to mix robot datasets is often missing — even NVIDIA's BridgeData v3 has an empty robot_type. This finds it from manifests, trains nothing, and every verdict cites its measured reasons.
pythonroboticscross-embodimentdatasetrobotops
agent-trace-triagePublic

Agent execution traces → a rule-based failure taxonomy (tool-selection error, loop, timeout, malformed args, wrong answer…), a failure distribution, and a labeled eval-ready dataset with a human-review queue for ambiguous cases.

The missing link between observability (89% adoption) and evaluation (52%): it turns raw traces into eval data deterministically, and sends ambiguous cases to a human rather than guessing.
pythonagentopsevaluationobservability
robotdata-pipelinePublic

Raw operator/rosbag logs → a training-ready ML dataset (RLDS/LeRobot-style) with episode-level splits, a data contract that fails the build on bad data, and an RLDS-vs-LeRobot format recommendation.

The "make it" that follows an audit's "it's broken": a contract violation blocks a bad dataset from being produced instead of silently shipping one.
pythonroboticsetldata contractrobotops
How to read these
Every project is public and MIT-licensed on github.com/jigonyoo — each with a README, unit tests, and a reproducible run. Sample projects use synthetic or sample data where noted; the point they demonstrate is the pipeline and its verification layer, not a specific dataset.
Jigon Yoo — Data & AI-Automation Engineer Async · chat-based delivery · available for freelance work