Projects

Everything I've built, with the reason each one exists. Merged open-source work is further down.

Process Pair project cover

Built

Process Pair

2026

Jim Gray's 1985 process pair rebuilt on one laptop and killed 420 times to measure the checkpoint tradeoff he described and never tested. Checkpointing every request costs 25% of throughput, lost work is N/2, and the 1974 formula for the best interval lands 20x too high because it assumes lost work gets recomputed.

Why: Built as the first stop in rederiving fault tolerance from the original papers. Two things I did not expect: Gray's own fix, client replay, closes the lost-work hole for free, while a durable log costs 99% of throughput because fsync() on macOS does not wait for the disk. And my first takeover result was wrong: macOS AirPlay listens on port 5000 and was accepting the client's reconnects, which is the gray-failure problem in miniature.

PythonTCPFault ToleranceDistributed Systems
GitHub
Hapax project cover

Built

Hapax

2026

A crash-durable task store for AI agents that guarantees a side effect happens exactly once, even under kill -9 at any point. 500 randomized crashes produced 0 double charges; a naive implementation under the identical harness produced 121.

Why: Built because the MCP Tasks spec defines a store interface and ships only an in-memory implementation, leaving persistence to implementers, and an agent that charges a card twice is a real failure rather than a theoretical one. Peak 5,202 tasks/s in Python and 7,345 in a Go port, both hitting the ceiling at 8 workers, which traced the wall to Postgres's commit path by elimination.

PythonGoPostgreSQLDistributed SystemsOpenTelemetry
GitHub
Aporia project cover

Built

Aporia

2026

Semantic search over primary-source philosophy that classifies whether a passage argues for or against a claim, not merely whether it is about the topic. On a held-out set written after the fix, 20 of 21 queries surfaced the philosopher who actually holds the position.

Why: Built after finding that embedding search matches vocabulary and imagery rather than the conclusion an argument reaches, so a query about free will returns everyone who mentions it, on either side, undifferentiated. Fixed with HyDE query expansion over a from-scratch HNSW index, and validated on queries written afterwards so the result could not be tuned into existence.

PythonFastAPINext.jsTypeScriptVector Search
GitHub
Peras project cover

Built

Peras

2026

A metrics ingest pipeline that survives the label explosion that OOM-kills a naive one, proven by exit code. Same 20M-sample workload in the same 256 MB container: the naive ingester dies at 8M samples; Peras completes all 20M at 1.67M samples/s with ~3 MB of heap.

Why: Built after measuring, while instrumenting Hapax, what one high-cardinality label costs: adding task_id took an export from 22 series to 30,019 and the payload up 1,488x. Peras is the ingest-side defense: it attributes a breach to the exploding label dimension at runtime and aggregates it away instead of crashing, and CI re-proves the die-vs-survive contrast on every push.

GogRPCOpenTelemetryKubernetesObservability
GitHub

Open Source

Contributions to external projects, with what each one fixed and why it mattered.

kubernetes-sigs/jobset

Merged

Render negative Pod priorities as valid label values

The Pod webhook copied pod.Spec.Priority into a label verbatim, so a negative PriorityClass produced a label value the API server rejects; every child Pod failed admission and the JobSet sat at zero Pods. Negative values are now encoded with an n prefix while non-negative values keep their form, so exclusive-placement affinity keeps matching across the upgrade.

Impact: JobSets using a negative PriorityClass, including the cluster-autoscaler overprovisioning pattern, schedule again instead of retrying forever.

GoKubernetesAdmission Webhooks
View Pull Request

open-telemetry/opentelemetry-collector-contrib

Merged

Bound decompressed size of gzip request bodies

Fixed a decompression-bomb vector in the Cloudflare receiver: the compressed request body was bounded, but the gzip stream was decompressed with no limit of its own, so a small request could expand without bound in memory.

Impact: Hardens a production telemetry receiver against memory exhaustion; over-limit requests are now rejected with a 422, matching the existing uncompressed path.

GoSecurityOpenTelemetry Collector
View Pull Request

open-telemetry/opentelemetry-collector-contrib

Merged

Map the Rate metric intake type in the Datadog exporter

Rate metrics reached Datadog's intake as UNSPECIFIED because the type mapping only handled Count and Gauge; added the missing Rate case with table-driven tests covering all three.

Impact: Rate metrics exported through the Collector now carry the correct Datadog intake type instead of an unspecified one.

GoDatadogMetrics
View Pull Request

open-telemetry/opentelemetry-collector

Merged

Clarify processor ordering relative to batching

Updated the core Collector's processor documentation to recommend placing filtering, transformation, and enrichment processors before batching, with the rationale spelled out.

Impact: Keeps pipelines from batching telemetry that is later discarded and ensures data reaches its final form before export.

DocumentationOpenTelemetry CollectorPipelines
View Pull Request

microsoft/agent-governance-toolkit

Merged

Add TypeScript SDK quickstart example

Added a standalone TypeScript SDK quickstart showing AgentMeshClient initialization, governance checks, and result handling.

Impact: Improves onboarding for developers trying the TypeScript SDK with a concise runnable example.

TypeScriptSDK ExamplesGitHub Actions
View Pull Request