Chris Chang

I’m a CS major at Columbia University. My experiences include harness engineering, LLM architecture, agent benchmarking, and industry experience in backend, app dev, and ML training.

I’m always endlessly interested in superalignment, intelligence research, and applied AI. If you have any interesting projects, please message me.

Now

  • PeKe Labs — Developer I. AR controller hardware, iOS app development, backend ML/SWE.
  • Columbia Software Systems Laboratory — Research Intern. Benchmarking code generation.

Selected work

Full history on the résumé.

background

I was born in New York, lived in Canada, Korea, Austin, and now in NY and Seattle.

off the clock

I love football(Go Birds), climbing, cats, games (Soulsborne, RDR2, Hollow Knight, etc.).

Spex

Speculative tool calling for Codex

award2nd Place, Ramp / Cursor / Codex Builder Cup
periodJul 2026
roleOriginated the approach, wrote the implementation plan, and built the prediction layer by turning a 90K-event trajectory corpus into the predictor's transition table.
TypeScriptCodexsandboxingSWE-bench

The Problem:

Codex runs tools serially, leaving the repository idle while it reasons about a verification command that is often predictable.

The Solution:

Spex observes an unmodified Codex and pre-runs likely tests, lint checks, type checks, and builds. A pull-only tool returns the byte-identical result only when Codex requests it. Across 84 sealed runs on 42 SWE-bench Verified tasks, Spex matched the baseline’s 38 resolutions, served 80% of verification calls from speculative work, reduced aggregate trace wall time by 13.9%, and increased verification by 64% with no added tokens or stale results.

Architecture:

Spex reads Codex app-server events over JSON-RPC and predicts from a transition table mined with PrefixSpan-style patterns over 2,146 trajectories and 90,591 normalized events. Runtime prediction is a map lookup with 75.4% held-out recall, so it needs no second model call. Allow-listed commands enter a two-slot sandbox queue and are keyed by command, working directory, and source epoch. Each edit advances the epoch; duplicate or outdated work is discarded before it can enter model context. Append-only JSONL traces record predictions, launches, cache hits, misses, resets, and timing.

−13.9%wall time, SWE-bench Verified
80%verify calls served from pre-runs
75%top-3 held-out recall
+64%self-verification, 0 added tokens
Spex architecture
The daemon watches an unmodified Codex, pre-runs the predicted verification command in a sandbox, and serves a byte-identical result from an epoch-fenced cache.

OpenDisaster

Natural disasters on real cities

awardWinner, Social Impact Track · Winner, Best Use of Featherless (DevFest 2026)
periodFeb 2026
roleTeam of 4 with Alex Jerpelea, Theo Chapman, Anirudh Sridharan. I wrote the architecture and built the agent perception and damage systems, the three disaster modules, and the backend orchestration.
BunThree.jsWebGPUbitecsTypeScriptOpenStreetMapFeatherlessElevenLabs

The Problem:

Emergency-training software rarely combines real neighborhoods, configurable disasters, autonomous people, and replayable evidence. Abstract maps miss local geometry, while scripted crowds cannot show how perception changes behavior.

The Solution:

OpenDisaster reconstructs any coordinates from OpenStreetMap, elevation data, and satellite imagery. It simulates tornadoes, earthquakes, floods, and fires with structural damage, configurable controls, eight VLM-driven agents, heatmaps, POV replays, and narrated casualty reports.

Architecture:

A Bun backend proxies Overpass, elevation, satellite, Featherless, and ElevenLabs requests. Three.js and WebGPU generate GeoJSON terrain and buildings, project satellite materials, and render fire and debris particles. A bitecs Structure-of-Arrays ECS runs at a fixed 1/60-second step and publishes disaster events. Each agent sends a first-person frame over WebSocket to google/gemma-3-27b-it; calls are pooled across up to four API keys, and responses drive road-graph navigation. Logs feed replay, while ElevenLabs eleven_v3 gives eight agents stable voices with danger-aware delivery. Without an API key, agents fall back to autonomous wandering.

4disaster modules
8simultaneous VLM agents
Allreal-world coordinates
OpenDisaster architecture
Map, elevation, and satellite data resolve into one ECS world; disaster and agent runtimes both write to it, and everything downstream reads from it.
City blocks reconstructed at altitude from OpenStreetMap and satellite imagery
City blocks reconstructed at altitude from OpenStreetMap and satellite imagery
Tornado simulation in progress with agent markers and per-agent POV strip
Tornado simulation in progress with agent markers and per-agent POV strip

Threadline

Git for AI coding sessions

statusPersonal Project
periodJun 2026 to present
roleOriginated the project, designed client-side encrypted sync through rclone to R2, and wrote the initial spec and pull prototype.
PythonrcloneCloudflare R2richkeyring

The Problem:

AI coding sessions contain decisions, context, and failed approaches, but remain tied to one provider and one machine.

The Solution:

Threadline gives Claude Code and Codex sessions Git-shaped history, cross-device sync, search, review, diffing, and selective sharing without a hosted service or account.

Architecture:

Sessions use content-addressed blob, tree, and commit objects with linear fast-forward history. When machines diverge, JSONL transcripts merge as a deduplicated union of turns inside a two-parent commit. Immutable objects let each push copy only new objects and update one ref through rclone. Client-side encryption leaves Cloudflare R2 with ciphertext only, so no application server is required.

2agent providers
18git-shaped commands
E2Eencrypted, zero-server
Threadline architecture
A session repo is a real object store. Sync is an incremental copy of immutable objects plus one ref pointer, through an encrypted remote.

PolyHedge

Hedging equities with prediction markets

awardFinalist, YHack Spring 2026
periodMar 2026
roleLed the project and wrote most of the factor pipeline.
PythonstatsmodelsnumpypandasyfinancefredapiNext.jsReactRecharts

The Problem:

Equity portfolios carry hidden exposure to rates, inflation, credit, commodities, and other macro outcomes. Polymarket prices many of those events directly, but investors lack a bridge from portfolio risk to prediction-market hedges.

The Solution:

PolyHedge converts holdings into 18 macro-factor exposures, maps significant factors to live Polymarket contracts, compares portfolio-implied probabilities with market prices, and sizes quarter-Kelly hedges. Gaps below 8 points are ignored; positions are capped at 3% each and 10% total, with correlation haircuts and cross-factor deduplication.

Architecture:

An 11-stage Python pipeline uses OLS with Newey-West errors, QR orthogonalization, and a Chow test to build dollar-weighted factor profiles. Yield-curve level, slope, and curvature come from PCA. Polymarket markets are filtered by volume, expiry, domain, and binary outcome, then ranked 40% on relevance, 35% on liquidity, and 25% on timing. Probability inversion loading-weights holdings, caps moves at ±3σ, applies a tanh mapping, and corrects bond ETFs for duration and convexity. A Next.js and React dashboard renders the resulting exposures, divergences, hedge scenarios, and risk summaries with Recharts.

18orthogonalized macro factors
11pipeline stages
PolyHedge architecture
Eleven stages, grouped. Market data enters at ingest, the Polymarket catalog enters at match, and everything converges on a sized position.
Divergence map with ranked hedge cards showing gaps of +16.5pp and −23.0pp
Divergence map with ranked hedge cards showing gaps of +16.5pp and −23.0pp
Detail view comparing TradFi-implied probability against the live Polymarket price
Detail view comparing TradFi-implied probability against the live Polymarket price

3DSim-Bench

Benchmark research backed by Google

statusResearch Paper
periodNov 2025 to present
roleColumbia Software Systems Laboratory Research Intern.
PythonPlaywrightPyTorchCLIPDINOGitHub Content API

The Problem:

No benchmark exists yet that tests models’ skills at 3D interactive web simulation generations.

The Solution:

A 649-case benchmark mined from more than 22K GitHub repositories and Three.js, with over 1,600 audited agent runs. Paper in progress, backed by Google.

649benchmark cases
22K+repos mined
1,600+audited agent runs
3DSim-Bench architecture
Method only. Results are under review..
><⎇ main*⊗ 0  ⚠ 0✉ cchang3906@gmail.comGitHubLinkedInLn 1, Col 1Spaces: 2UTF-8LFMarkdown