I learned Kubernetes and the Nautilus cluster from scratch just to get access to CARLA and run the lab's experiments — GPU-scheduled jobs, PVC-backed storage, pod specs written by hand. Most of the early work was infrastructure rather than research. Currently I'm studying the RL methods themselves, mostly SAC and DDPG, and learning to develop my own! The part I find interesting isn't implementing them but rather understanding why one algorithm or policy gets chosen over another for a given problem.
Computer
Science
I'm Christopher Zarraga — a CS major and Applied Math minor at UC Santa Cruz, here on the Sabatte Family full-ride scholarship, the first ever awarded by the university. I spend most of my time turning half-formed ideas into systems that actually run.
- 1st
- COHORT FULL RIDE
RECIPIENT AT UCSC - 5
- ENGINEERS LED
ON VERIFI - First-gen
- COLLEGE SCHOLAR
IN SHPE - 3rd
- YEAR AT UCSC
CS + APPLIED MATH
Fujifilm X-T2, 18–55mm
01 — Where it started
A Replit tab
that never closed
My first real project was a tiny text RPG I made in Python! I made it to showcase what I had learned in my first semester of Highschool computer science. Man, looking back at this code is so crazy, it helps me appreciate how far I've come in this field!
There are four bugs in the shop code on the right. I shipped every one of them and never noticed. Click any line you think is broken. Two of them are harmless on their own — they only break the game when they line up.
# shop state: bare list, index contract in a comment# [name, display, cost, purchased]macheteShop = ['Machete', "$200", macheteCost, False] def Market(): while macheteShop[3] is True: global macheteCost macheteCost = 10000000 macheteShop.pop(1) macheteShop.insert(1, "$10000000") marketchoice = input("") marketchoice.lower() if gearChoice == "boots": if playerMoney < bootsShop[2]: flavor("You don't have enough...") Market() else: playerInventory.append("Boots") macheteShop[3] = True playerMoney -= bootsCost02 — Santa Cruz
A full ride
and a new cohort
I came to UC Santa Cruz in the first cohort of Sabatte Family full-ride scholars — the first full ride in the university's history. It changed what I could afford to be curious about. I am so grateful; I got to declare Computer Science with an Applied Math minor because I wanted both halves: the systems themselves, and the math that explains why they behave the way they do.
There's more — click through the photos!
03 — Everything else
The rest of
the build log
I helped build and complete four goal-tracking components for Compass, the lab's goal-setting and reflection app — owning the data and event layer, which meant keeping state consistent from a user's action all the way through NgRx Signal Store to Firestore. The lab is also studying how to use AI agents properly in development rather than just faster: we work inside Google Antigravity with a shared set of in-house agent skills, where the Angular feature pipeline splits every stage into a plan skill and an implement skill, and the implement stage refuses to run until a plan is finalized. Watching a codebase enforce that separation changed how I think about my own workflow.
I wanted to know exactly what a framework does when it runs a forward pass instead of trusting it, so I wrote the matrix multiply, ReLU, and argmax myself and built a binary weight format to carry a trained PyTorch model into C++. The bar wasn't whether it ran — it was whether it was provably the same model. Along the way I found my own test suite was passing against a stale baseline, which was a more useful lesson than the engine itself.
View on GitHub ↗I founded this and led a five-person team, which meant most of my time went to defining interface contracts — chunk format, search API, response schema — so five people could build in parallel instead of blocking on each other. I own the retrieval engine itself: exact cosine-similarity k-NN, written as a correctness baseline before any optimization. Partial-sort selection and SIMD are the obvious next steps and I deliberately didn't take them yet.
View on GitHub ↗Built at the NVIDIA × ASUS hackathon and finished on my own after the team moved on. The interesting part isn't the tuning — it's the safety model. An LLM proposes changes, but my code validates every one against legal ranges and overwrites state fields from live telemetry, so the model can't misreport what it's changing. Every mutation is journaled with its inverse. If the LLM is offline, a deterministic rule engine takes over.
View on GitHub ↗The constraint that made this worth doing was writing the concurrency myself — a bounded producer-consumer queue and per-URI reader-writer locks over raw syscalls, no library concurrency. Getting honest numbers took two passes: my first benchmark silently linked the reference library instead of my code, so I verified symbol provenance with nm and reran everything.
View on GitHub ↗Right now
I'm going deeper on autonomous-driving RL at the AIEA Lab and building up Compass with the Tech4Good Lab. On my own time I'm re-learning computer architecture before writing an NES emulator in C++, and building AVScope — a C++ tool for benchmarking autonomous-vehicle experiments. Alongside that I'm looking for an internship where I can ship something real and be the least experienced person in the room for a while!



