Skip to content
View egnaro9's full-sized avatar

Block or report egnaro9

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please donโ€™t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this userโ€™s behavior. Learn more about reporting abuse.

Report abuse
egnaro9/README.md

Hi, I'm Erik ๐Ÿ‘‹

AI evaluation & testing engineer. I build the tests that catch AI when it's wrong โ€” deterministic graders, not a model grading itself โ€” and keep a human on every step that can't be undone.

Self-taught in under a year, after six years in professional kitchens. Since then: a live public board tracking 16 LLMs for drift, a merged fix in a 12-year-old compiler, a game shipped to Google Play, and an operator-supervised multi-agent harness that reviews and validates its own work.

โ–ถ egnaro9.github.io โ€” the portfolio, where most of this is live and clickable in your browser.

Watch the 90-second portfolio tour

โ–ถ A narrated 90-second tour through the harness, the live board, and the repos โ€” watch it here.


What "deterministic graders" actually looks like

An adversarial battery against a deliberately-vulnerable mock. No API key, no network, no model grading anything โ€” the mock answers from a fixed profile, so every fail card reproduces byte-for-byte on your machine.

Adversarial battery against a vulnerable mock: vulnerability 1.00, with one fail card per broken guarantee โ€” leaked passphrase, unrefused harmful request, unflagged fabricated citation

The grader names which guarantee broke and how badly. Play it as a terminal session ยท crashkit

A determinism test that could not fail

I compiled a shipped game's rules engine to the browser. The two builds played different games from the same seed โ€” java.util.Random's algorithm is specified, but the code was running whichever implementation the runtime supplied, and TeaVM's is not the JVM's.

The cross-compiler check passing, then the same command against the recording of the build from before the fix: 69 differences, obstacles off by 712px

The test I already had ran the engine twice in the same runtime. It was green throughout โ€” it had to be. A golden file of the JVM trace passed too, because the JVM side never moved. Two things that both look like determinism tests, both blind to the boundary they claim to hold across. The write-up ยท tapdodge-engine

A merged fix in a twelve-year-old compiler

TeaVM PR #1213 โ€” one character in TGregorianCalendar: days - 2, where the line above it and the branch beside it both use days - 3. Merged nine hours after I opened it, closing an issue open since 2018.

The wrong character dates to 2014. It survived because the only four assertions reaching that line were commented out in 2015 โ€” one by the developer who later hit the bug and filed the issue, three by the maintainer who merged the fix.

The patch adds no new tests. It uncomments four. A commented-out assertion is a bug-shaped hole in a suite: the setup above it still runs, so the test still looks alive in the file.

One system that calls itself

These five aren't separate exercises โ€” they call each other, and one installs another's published wheel. Every one runs offline with deterministic mock backends, so the tests pass without a single API key.

Repo What it is
๐Ÿ•ธ๏ธ agent-graph A LangGraph ReAct agent โ€” multi-step tool-calling with real guardrails (a safe evaluator, a step budget), both tested. Runs real LangGraph in your browser tab. LangGraph WebAssembly
๐Ÿšช llm-gateway A multi-provider LLM gateway on FastAPI: auth, per-key rate limiting, caching, retries, per-model cost accounting behind one endpoint. FastAPI observability
๐Ÿ” rag-eval-lab A RAG pipeline + eval harness that catches a planted hallucination โ€” with a from-scratch BM25 matching the published SciFact baseline (nDCG@10 0.664 vs 0.665), plus hybrid retrieval and a reranker it benchmarks honestly. RAG evals ยท nDCG BM25
๐Ÿ“Š eval-dashboard A Next.js 15 + strict TypeScript dashboard that turns an eval run into metric cards and flags hallucinations in red. Reads live from eval-history. Next.js TypeScript
๐Ÿ—„๏ธ eval-history The full-stack one: FastAPI + SQLAlchemy 2.0 + Postgres on Neon, deployed on Render, CI against Postgres 16 and 18. Alembic migrations with a drift test. Postgres SQLAlchemy Alembic

Evaluation & testing

Repo What it is
๐Ÿ“‰ model-drift A live public board tracking 16 LLMs across 5 labs for drift. A frozen 35-task suite runs daily; no LLM-as-judge, so a score that moves means the model moved. See the board โ†’
๐Ÿ’ฅ crashkit Point a model at an adversarial battery with your own key and get a severity-weighted vulnerability report. Your key never touches the server โ€” verify it in the Network tab. Crash-test a model โ†’
โš–๏ธ gradecore The grading engine behind both, extracted rather than reimplemented โ€” suite_hash byte-identical across repos. Zero dependencies.
๐Ÿšฆ prompt-regress A merge gate: runs your eval on every PR, compares against the main baseline, and blocks on a regression. Ships a GitHub Action.
โš–๏ธ evals-differential-oracle The same logic written twice, fuzzed for disagreements. Where two implementations disagree, one is wrong โ€” no gold labels needed.

Agents, tools & guardrails

Repo What it is
๐Ÿ”Œ mcp-tools A Model Context Protocol server built from the spec โ€” JSON-RPC over stdio, no SDK, zero dependencies. Five tools, including a grader that names the sentences your sources don't support.
๐Ÿงช pi-eval Deterministic grading for pi โ€” including when it refuses: "this suite cannot decide between them โ€” that is a limit of the suite, not a finding about the configs." Reports the noise floor, puts cost next to the score.
๐Ÿšง pi-gates Refusal gates: git commit/push denied without an approval typed that turn. The trust root is the event source, not the text โ€” because an extension can inject input, and a gate honouring every event could be opened by the thing it gates. Write-up โ†’
๐Ÿ› ๏ธ agentic-dev-harness The architecture case study: a self-reviewing loop (Strategy โ†’ Execution โ†’ Critic โ†’ Eval โ†’ Ops), a cold independent critic, a NO-PROOF-NO-CLOSE evidence trail, and a human-in-the-loop autonomy ladder.

Shipped

๐ŸŽฎ Tap Dodge Rush โ€” my first game, live on Google Play under SeraphLight Studios. Two weeks of closed testing, then review, then shipped. ย Get it on Google Play

โš™๏ธ tapdodge-engine โ€” the game's rules, lifted into a module with no Android on its classpath and compiled twice: javac for the app, TeaVM for the browser. A differential test replays one scripted run through both and diffs the traces โ€” written because the two had already drifted, and the existing determinism test could not see it. Play it.

๐ŸŽฒ match3-engine โ€” a separate engine, for an unreleased match-3 game: 16 jqwik property invariants, compiled to the browser via TeaVM. Porting it caught a System.nanoTime() bug the JVM couldn't show.

Find me

๐ŸŒ Portfolio ยท ๐Ÿ’ผ LinkedIn ยท โœ๏ธ dev.to ยท ๐Ÿฆ X ยท ๐ŸŽฎ SeraphLight Studios

Open to remote (US) roles in AI evaluation, ML test / SDET, backend, or applied AI engineering.

Pinned Loading

  1. agentic-dev-harness agentic-dev-harness Public

    Architecture case study: an autonomous dev harness โ€” self-reviewing loop, differential oracle, human-in-the-loop autonomy ladder.

    2 1

  2. rag-eval-lab rag-eval-lab Public

    RAG pipeline with no third-party dependencies and a deterministic eval harness that catches hallucinations (precision@k, recall@k, citation, faithfulness) โ€” proven in CI. Optional OpenAI + pgvectorโ€ฆ

    Python

  3. eval-history eval-history Public

    Store eval runs in Postgres and find out what got worse โ€” a regression tracker for LLM evals. FastAPI + SQLAlchemy 2.0 + Postgres, CI against Postgres 16 & 18, Alembic drift test. 57 tests.

    Python

  4. model-drift model-drift Public

    Is My Model Drifting? A public LLM regression tracker: a frozen, hash-fingerprinted suite run daily against 16 models across 5 labs, scoring accuracy, latency, verbosity, reliability and refusal raโ€ฆ

    Python

  5. crashkit crashkit Public

    AI Crash Test โ€” an interactive, deterministic (no-LLM-judge) LLM stress-test. The adversarial lens on the same engine as model-drift.

    Python

  6. gradecore gradecore Public

    A deterministic, no-LLM-judge grading engine โ€” one GradeInputโ†’Verdict signature shared by model-drift and the crash-test platform. Zero deps.

    Python