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. Then I show what the checks caught, what they missed, and where a person still has to decide. Anyone can get a model to emit JSON; what a team pays for is output it can trust and sign off on.

75 public, 72 unit-tested Reproducible runs Human-in-the-loop Async · chat-based delivery All 75 MIT-licensed

Live app

3
Deployed and interactive — click through it in the browser.
DATA CONTRACT DEMO ● Live Public

Load a CSV or JSON in the browser and get contract violations and drift signals against an editable, inferred contract. Nothing is uploaded — every check runs on the page.

The fixtures are synthetic controls with planted faults, and the test suite includes a mutation control: removing each planted fault lowers the caught count by exactly one, so the checker is proved to be detecting rather than guessing.
javascriptdata contractsdriftbrowser-only20 tests
MIGRATION VERIFY DEMO ● Live Public

Compare a source and a target export and get key reconciliation plus field-level evidence — the step where a migration quietly breaks. Both files stay in the browser.

It does not decide whether the migration should be accepted. It produces the evidence a person signs off on, and says so on the page.
pythonjavascriptmigrationreconciliation16 tests
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

Robotics & robot data

9
Data and verification infrastructure around robot programs — bag audits, dataset contracts, migration, evaluation. I build the data layer, not the robot: every tool here states what it measured and refuses to claim more.
What you can hire me for
Dataset acceptance audit

Before you pay for a dataset, get a verdict on it — episode completeness, sensor synchronisation, joint and gripper ranges, duplicate rate. You get a stated pass line, the reason behind every failed episode, and a command that reproduces the whole audit.

robotdata-pipeline · dataset-curation-dedup · ros2-bag-data-audit
Format migration, proved

LeRobot v2.x → v3, and conversions between RLDS, HDF5 and LeRobot layouts. The migration is the step where datasets quietly break, so this one ships with field-by-field evidence that it held — not just a script that exited zero.

lerobot-dataset-migrate
Mixability & policy evaluation

Can these datasets safely be trained together? Did this policy actually beat that one? Per-pair normalisation plans from the manifests, and success rates with Wilson confidence intervals instead of a single number.

crossembodiment-align · policy-eval-harness
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
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
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
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
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
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
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
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

Workflow & intake automation

3
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-agent-n8nPublic

An n8n workflow that scores incoming inquiries with deterministic rules and routes them through a verification gate: complete leads land in a CRM-ready lane, uncertain ones stop in a human-review queue with explicit reasons, spam is rejected. Ships with the workflow JSON, a 24-case golden fixture set, ten unit tests and run screenshots — and the same scoring logic runs standalone with zero dependencies.

Anyone can wire n8n nodes together; the value is a gate that refuses to guess — every routing decision replays from committed fixtures (ALL PASS 24/24), and the executed branch was verified against the execution log, not just the response payload.
n8nworkflow automationroutingqa 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

11
Making a codebase something an AI agent can actually work in — generated context, kept fresh, and verified.
mcp-permission-serverPublic

A permission layer in front of MCP tools, and a log that can prove what it decided. The same 17-call session through a naive allowlist and through nine checks: calls executed without a grant 7 → 0, decisions that cannot be reconstructed from the log 16 → 0, denials that left no trace 1 → 0, secrets sitting in the log 2 → 0, entries removable unnoticed 1 → 0 — with 0 legitimate calls refused.

The moat is the log. Almost every audit trail records what happened; almost none record enough to recompute why it was allowed. --verify re-decides all 17 entries from the log alone and checks each against the verdict it claims. Redaction at write time, hash-chained entries, and a stated limit: this is a policy and audit layer, not a sandbox.
pythonmcpauthorizationaudit-loghash-chain
agent-approval-gatePublic

An LLM support agent that cannot spend money without a human — and the number that proves it. The same 37 recorded incidents run twice, once through a typical agent loop and once through seven gates: unapproved money moved $453.50 → $0.00, duplicate side effects 4 → 0, injected args executed 4 → 0, malformed money moves 2 → 0, and 5 actions held for a person.

The moat is what gets measured. Most agent demos score whether the agent finished; this one scores what it moved, replaying every refund that actually landed against policy.yaml to ask whether a human was required. Noise on control tasks stays at 0 — legitimate work is untouched.
pythonagent safetyhuman-in-the-loopapproval gatedeterministic
odds-mcpPublic

An MCP server where every read names its evidence and the one write is impossible without an approval token. A risk envelope checked before a human ever sees the request, a single-use token issued by a separate step, a publish that cannot happen without it, and an append-only log of every attempt — especially the refused ones.

The moat is the shape of the dangerous tool. Reads are easy to make safe; this is the propose → approve → publish pattern that makes a side-effectful agent tool safe enough to exist at all. Data comes from odds-consensus, so the integration surface is a real pipeline rather than a mock.
pythonmcpapproval tokenaudit logagent tools
readonly-guardPublic

A narrow Python guard for audit, inventory, and verification tools that are meant to read evidence without changing the environment they are pointed at. Blocks write-capable open modes, selected pathlib/os/shutil mutations, and HTTP POST/PUT/PATCH/DELETE — while the sample inventory still runs inside the guard.

The moat is that the disclaimer is part of the contract: this is a tested application-level policy, not an operating-system sandbox, and the one-pager says so before a client ever sees it.
pythonread-onlyaudit toolingsafetyunittest
llm-deprecation-radarPublic

Static-scans a codebase for retired and soon-to-retire LLM model IDs, API surfaces, and parameters, then reports days remaining, blast radius, and the published replacement path. The deterministic demo catches 11 of 12 planted cases; the twelfth is a current-model negative control.

The moat is the dated evidence boundary: 6 Confirmed, 2 Likely, 2 Unverified, and 1 runtime-data-required finding — plus registry freshness and a weekly CI deadline gate. Dynamic selection is never mislabeled as clean.
pythonstatic analysisllm opsci gatedeterministic
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

7
Extraction and retrieval that cite their sources, reconcile the numbers, and refuse when the evidence isn't there.
rag-copilotPublic

A document copilot that cites what it says, refuses when the evidence is not there, and ships the test that proves both. Same corpus, same 33 questions, same scorer: baseline 12/33 → harness 32/33, including 4/4 on superseded editions, 4/4 on regional scope, and 4/4 on questions the corpus cannot answer at all.

The control row is the honest part — both systems answer all 8 un-trapped questions, so the gain is not bought with refusals. The baseline is what most demos ship: it invented an answer to every unanswerable question and returned two confident numbers from a policy edition retired on 2025-12-31. Runs in Docker with network_mode: none.
pythonragcitationsrefusalablation
docs-chatbot-kitPublic

A support bot’s mistakes do not live in its sentences — they live between them. The layer between a model’s draft reply and the person reading it, scored over 17 conversations / 32 turns: conversations never handed off 4 → 0, replies that must not go out but were sent anyway 4 → 0, good conversations interrupted 3 → 0.

The moat is that single-turn evaluation passes every failure in this repository. Read turn 6 of B-06 alone and it is a correct, well-cited sentence; read it after turn 1 and it is the bot telling the same person the opposite of what it just said. The naive baseline — a keyword escalation list — escalates the wrong half and misses every cross-turn failure.
pythonsupport automationescalationmulti-turnguardrails
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
screenshot-to-sheetPublic

Screenshots → a spreadsheet, with a verification layer between them: per-field confidence gates, type and pattern checks, and a subtotal + tax = total reconciliation that catches OCR errors which parse cleanly. Ships with a Google Apps Script + Cloud Vision deployment path, so the client never touches the code.

OCR always misreads something. The number that matters is how many misreads were caught before the clean sheet — and the report states how many slipped through.
pythonocrapps-scriptgoogle-sheetsvalidation
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

5
Reports, predictions, and segments — with the data-quality checks, baselines, and limits stated up front.
odds-consensusPublic

De-margined fair prices and a cross-book consensus that refuses to merge markets that are not the same. One schema for five books, the margin stripped the same way everywhere, and a hard rule for when two markets are actually the same market — before anyone claims a book is off the market by 9.85%.

The moat is what it writes down when it declines: skipped.json and devig_skips.json record what was refused and why, so the consensus is a statement about markets that were genuinely comparable. No keys, no network, byte-identical fixtures.
pythonnormalizationde-vigconsensusreproducible
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

37
Reproducible pipelines that clean, normalize, and load — idempotently, with per-row confidence where it matters.
statement-to-ledgerPublic

Bank and card statements into a reconciled ledger — and a refusal, in plain English, for the ones that do not add up. Importers are scored on rows parsed; this is scored on rows wrong: silently wrong rows 26 → 0, silently wrong money $62,832.40 → $0.00, unreconciled $8,905.20 → $0.00, corrupt sources caught 0/5 → 5/5.

The moat is that it accepts fewer statements on purpose — 11 of 16 instead of 16 of 16 — and holds the rest rather than parsing them wrongly. Clean sources held: 0. The refusals are targeted, not blanket caution.
pythonreconciliationfinancerefusaldecimal
dupe-merge-gatePublic

Decide what your duplicates are before you delete any of them. The three-line DELETE … WHERE id NOT IN (SELECT MIN(id) …) against a gated path over eleven cases: facts lost 7 → 0, rows destroyed 6 → 0, rows fabricated 4 → 0, duplicates left behind 4 → 0, deletes with no undo 13 → 0, blocking operations in the plan 22 → 0.

The moat is the split-brain hold. Rows that share an email but disagree on external_id are not one person, and the gate says so instead of picking a winner — 3 held for a human, 1 migration refused, and 0 false alarms on the sets that really were duplicates.
pythondeduplicationmigration safetyreversiblesql
run-ledger-hardening-kitPublic

A run-tracking table that has never once said “failed” is not evidence that nothing failed. 282 runs across four pipelines, every row marked success or still running, reconstructed from what the runs left behind: silent failures found 4/10 → 10/10, false accusations 4 → 0, duplicate alerts 3 → 0, runs that never ran 0/2 → 2/2.

The moat is the undecided column. Three runs come back honestly undecided rather than guessed at — and of those three, zero were really broken. The naive baseline is not invented: it is the three sensible rules somebody writes the afternoon they are asked whether the pipelines are healthy.
pythonobservabilitysilent failurealertingevidence
site-watch-diffPublic

Tell me what changed on this page — not what moved on it. Change watchers fail in both directions at once, and both are quiet: over the same 12 material changes, missed changes 7 → 0 and false alarms 40 → 0, with unusable snapshots caught 0/5 → 5/5.

The moat is that the baseline is not a straw man — it is this same pipeline with every gate switched off, which is exactly what a text-based watcher does. And it catches the changes that never appear on screen: a link’s destination, a form’s post target, a robots directive.
pythonchange detectionmonitoringablationoffline
operations-canaryPublic

Scheduled, offline evidence for a data operation that may drift after delivery. Replays four committed weeks of an order feed through six stages — collect, normalize, declared checks, change record, alert payloads written but not sent, and exports a client can open without this codebase.

The moat is the badge disclaimer. The README states plainly that the workflow badge is not evidence until the scheduled run actually completes in public — the same honesty the checks themselves apply. Standard library only; no network call, no alert sent, no credential persisted.
pythonscheduled checksdriftevidencegithub actions
repair-casesPublic

Two synthetic before/after repair cases with the fault planted on purpose: a pipeline that completes without an exception while mapping reordered columns by position and misreading a changed encoding, and a static page carrying a blocking script, four font stylesheets, and an injected layout shift.

The moat is the “what these are not” section. They demonstrate diagnosis on deliberately broken local code — no client system, no production data, no commercial website — and each fix is stated as holding for the planted fault, not as a general remedy.
pythondiagnosisbefore/afteretlperformance
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
scraper-canaryPublic

Seven invariants that fire when a site changes underneath a working scraper — selector hit-rate, per-field fill-rate, a median+MAD row-count band, type and enum stability, tag-skeleton drift, and freshness. Runs offline against committed snapshots of a fictional catalogue.

The expensive scraping failure is not a crash — it is a job that keeps succeeding while the prices come back empty. The report states how many planted breakages were caught, how many were missed, and how many were false alarms.
pythonweb scrapingdriftmonitoringdata quality
pipeline-heartbeatPublic

An offline run-ledger monitor for scheduled pipelines — liveness, missed schedules, empty success, median+MAD volume and runtime bands, schema and watermark drift, partial sources, duplicate batches, persistent finding state, and a period digest.

A pipeline can exit 0 while emitting 0 rows, or stop running without throwing anything. The committed fixture catches 8 of 8 planted fault patterns while the healthy control produces 0 findings.
pythondata pipelinemonitoringmedian+MADdata quality
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
automation-run-auditPublic

An audit of a no-code automation’s own execution history — for the runs that reported success and still lost data. Silent attrition at a filter step, duplicate delivery from a retry without idempotency, schedule gaps, retry storms whose eventual success hides the failures, success rows carrying an error payload, and events applied out of their own order.

The platform dashboard shows the scenario active and the success rate in the high nineties. The audit returns 9 findings across all 7 checks on 30 runs: 90 items dropped by a filter at 3.00% against a 1.00% tolerance, one order delivered twice an hour apart, a 9-day window where the schedule never fired, and a ‘cancelled’ applied before its own ‘created’. It reads an exported run log — no account access, no API token.
pythonn8nmake.comzapierautomation reliability
ecommerce-order-reconcilePublic

A three-way reconciliation for an online store — orders against fulfillments against payouts. Paid but never shipped, shipped but never paid, quantity mismatches, payout shortfalls attributed to fee drift or an unrecorded refund, duplicate charges separated from legitimate repeat purchases, refunds with no restock, and currency or cent-level rounding breaks.

All three dashboards agree they are fine. The reconciliation returns 11 findings across all 8 checks and names $80.90 of payout shortfall — $0.90 at 62 bps explained by fee drift, $80.00 at 8,290 bps unexplained by any recorded refund. Money is Decimal end to end, with a test asserting no float ever touches it. A clean set with a real repeat purchase and a real partial fulfillment passes at 0.
pythonshopifystripereconciliationdecimal
sheet-to-db-contractPublic

A load contract for the spreadsheet that quietly feeds a production system — header drift including reordering, spreadsheet error literals arriving as text, type drift, ambiguous dates, leading-zero and scientific-notation mangling, structural noise like repeated headers and totals rows, primary-key integrity, and declared enums and ranges.

The import ran and loaded every row without an error. The gate returns 31 findings (17 error, 14 warning) on 24 rows: #REF!, #VALUE! and #N/A landed as text, a declared column vanished, a long id arrived as 1.23457E+11, and 03/04/2026 is reported as ambiguous rather than guessed. It runs on a CSV export, so it needs no Google credentials at all.
pythongoogle sheetscsvdata contractpre-load gate
odoo-migration-gatePublic

A pre-flight gate for a legacy export on its way into Odoo — required fields, dangling many2one references, duplicate and near-duplicate external IDs, selection values outside the allowed set, non-ISO dates, thousands separators in decimals, credit-note sign convention, and header totals that disagree with their own lines.

The import wizard reports the file is readable and the load begins. The gate returns 16 findings across 9 checks on the same export: a 99.00 gap between amount_total and the sum of its lines, an EUR invoice with no rate against a USD company, two references pointing at partners that are not in the export, and ‘15/01/2026’ parsed as a date. A clean export passes at 0.
pythonodooerp migrationdata contractreferential integrity
geo-data-quality-gatePublic

A load contract for GeoJSON before it reaches PostGIS — CRS declaration, coordinate range, ring closure, winding order, self-intersection, zero-area and too-short rings, hole containment, duplicate geometry, dimension and geometry-type conformance, plus a longitude/latitude axis-swap heuristic.

The file parses as valid JSON and the load job starts. The gate blocks the same file with 17 findings across 13 checks on 13 features: longitude 190.0 and latitude 95.0 outside their ranges, a ring that never closes, a polygon that crosses itself, a hole outside its shell, and 5 points that only fall inside the declared bbox once swapped — flagged as a heuristic, not a proof. Zero runtime dependencies: the segment-intersection and shoelace math is stdlib.
pythongeojsonpostgisspatial datadata quality
crm-contact-hygienePublic

Deduplication and merge audit for contacts a CRM already holds — blocking, per-field similarity, a three-way verdict, declared conflict-resolution rules, and an audit log that names which record won every field and why. Nothing is looked up externally; the tool reads one file and writes cleaned output.

Blocking cuts 153 naive pair comparisons to 7 (95.4% saved). On 18 records it merges 3, leaves 15, and puts 2 pairs in a review queue rather than guessing — one because two rules disagree on a field, one because the score lands in the grey band. A father and son at one address, and two employees sharing a switchboard number, are not merged; that guard is a test.
pythoncrmdeduplicationrecord linkagemerge audit
migration-verifyPublic

A post-migration verification gate for the losses a row count cannot see — primary-key reconciliation plus column-aggregate parity between the legacy table and the new warehouse. Row churn that nets to zero, a lost numeric scale on the money column, a timezone shift onto the wrong calendar day, silent truncation and NULL→'' coercion.

The cutover check every team ships reports 12,000 = 12,000, 0 issues and signs off. The same pair yields 96 findings: 42 orders missing, 37 duplicated, $5,955.90 (10.3 bps) unaccounted, and 1,416 orders on the wrong day. A correct migration passes at 0.
pythondata migrationreconciliationcutoverdata quality
soc2-evidencePublic

An evidence completeness gate for SOC 2 / ISO 27001 control sets — refresh windows, population coverage against the authoritative roster, artifact-type matching, and contradiction against the access log. Evidence engineering: it checks whether the pack is complete, it does not issue an audit opinion.

The readiness tracker reads 12 of 12 evidenced and books the auditor. The gate returns 14 findings across 7 controls on the same pack: evidence 501 days old against a 365-day window, a review covering 34 of 53 identities, a backup control with 0 restore tests, and 8 live production grants held by 5 leavers.
pythonsoc 2iso 27001compliance evidenceaccess review
pii-guardPublic

A pre-release gate for “anonymized” exports — column-agnostic PII detection, mask-uniqueness and hash-invertibility checks, k-anonymity over quasi-identifiers, and DSAR erasure completeness across every related table.

The masking review finds 0 issues and the export ships. The guard blocks the same file: 652 PII instances in three unlabeled columns, 799 masks for 799 subjects, 567 user_ids reversed from the delivery’s own send log, 87.5% of rows unique at k=1, and 16 surviving references to an erased subject. The properly anonymized variant passes at min k = 13.
pythongdprpiik-anonymitydsar
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
warehouse-quality-gatePublic

A dbt contract — 15 tests over staging and marts — that blocks a bad batch before it reaches the mart. Duplicate keys, broken relationships, a cents/dollars unit mix-up, a mixed-currency batch, an out-of-window date, and a status with the wrong case.

The sabotaged batch loads with zero errors and reports revenue of $4,905,051 instead of $395,751 — a 1,139% overstatement. The contract fails 12 of 15 tests and the mart is never built; the clean batch passes 15 of 15.
dbtduckdbdata qualitydata contractsql
dag-guardPublic

Static review for Airflow DAGs — 12 checks read the source with ast, so there is no Airflow install, no import, and no side effects. Catchup blast radius, dependency cycles, non-idempotent writes, unordered co-writers, missing timeouts, retries, SLAs and failure callbacks.

The sabotaged DAG is valid Python that renders normally in the UI — and queues 90,816 backfill runs on deploy. Every finding carries evidence, production impact and the fix. 12 of 12 caught, 0 false alarms on the clean DAG.
pythonairflowastorchestrationci
metrics-contractPublic

A single YAML contract for six business metrics, and a checker that diffs every dashboard against it — filter sets, timezone, currency handling, distinct-ness, expressions, rate denominators, unowned metrics and dead ones.

It does not just say "definitions differ" — it runs both definitions over the same data and prices the gap: net revenue 697,691 vs 755,388 (+8.3%), buyers 870 vs 3,119 (+258.5%). 10 of 10 drifts surfaced, 0 on the compliant dashboard.
pythonduckdbanalyticsmetric governancedataviz
fhir-quality-gatePublic

Twelve semantic checks for FHIR R4 bundles that are already structurally valid — code-system mislabelling, ICD-10 without its decimal, UCUM units that contradict the LOINC code, implausible values, unresolvable references, naive timestamps and value-set casing.

Both bundles share identical base data. The drifted one silently drops 3 patients from a 46-patient measure denominator and neither run raises an error. 12 of 12 defect types caught, 0 findings on the clean bundle. Standard library only, no PHI.
pythonfhirhealthcareloincdata quality
rubric-grading-gatePublic

A release gate for automatically-marked answer sheets. It grades against the rubric, then decides which of those grades are supported well enough to reach a student — naming the criterion, the reason, and the words on the page for every one it holds.

The moat is the evidence span, not the page. On 480 sheets carrying 156 wrong grades, a page-confidence threshold releases 378 with 128 wrong (66.14%); this gate releases 326 with 6 wrong (98.16%), and 97.4% of what a teacher opens is genuinely wrong. Six flags were written and two were cut by ablation — they add 49 sheets to the queue and catch nothing the other four miss. Standard library only, offline, seeded fixtures, 25 tests.
pythondata qualityrelease gateedtechdeterministic
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
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
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
How to read these
All 75 projects are public on github.com/jigonyoo, each with a README and a reproducible run. 72 of the 75 carry test suites, and all 75 are MIT-licensed. 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