# Li ZhenXi > SRE, Cloud and AI Infrastructure. I run cloud platforms in production and benchmark AI infrastructure. DevOps intern at Primustech, Computer Science at NTU. Open to 2027 roles; based in Singapore. This site is itself a small production service: a Go API on Cloud Run with its own SLO, signed releases and public postmortems. Currently: DevOps Engineer Intern at Primustech; Final-year research at NTU HyScale Lab. Bachelor of Computer Science at Nanyang Technological University, Jul 2023 - Jun 2027. Contact: zli057@e.ntu.edu.sg. Everything below is also available to an AI agent as tools: this site is a Model Context Protocol server at https://portfolio-emsghin2iq-as.a.run.app/mcp (POST, Streamable HTTP, no authentication, read-only). Tools: ask, search_facts, list_topics, get_status, get_delivery. How to connect: https://portfolio-emsghin2iq-as.a.run.app/agents ## Chapters - [Building IoT platform](https://portfolio-emsghin2iq-as.a.run.app/iot): Collects live data from building systems (sensors, HVAC, meters) and serves the dashboards and alarms facility teams use. Its case studies as working models, then its traffic, SLOs and cost. - [AI agent platform](https://portfolio-emsghin2iq-as.a.run.app/ai): Two AI agents for facility teams: one answers from the IoT platform's live data, the other from company documents. - [Research](https://portfolio-emsghin2iq-as.a.run.app/research): Making the lab's open-source agent-serving framework run long agent tasks, then measuring what serving them costs. - [Writing](https://portfolio-emsghin2iq-as.a.run.app/writing): posts, and postmortems of what broke while I built and ran this site. - [About](https://portfolio-emsghin2iq-as.a.run.app/about): where I have worked, the tools I use, and a console that answers questions about my work. - [On-call drills](https://portfolio-emsghin2iq-as.a.run.app/oncall): two simulated incidents, one on each platform, with a postmortem of your own response. ## Work: Building IoT platform - [One VM to a GKE platform](https://portfolio-emsghin2iq-as.a.run.app/md/work/gke.md): Moved a live building-operations platform off a single Docker Compose VM and onto Kubernetes. - [A pipeline where failed merges never deploy](https://portfolio-emsghin2iq-as.a.run.app/md/work/pipeline.md): I own the Cloud Build delivery pipeline: build once, promote by digest, approve before release. - [Cutting cloud spend by ~15%](https://portfolio-emsghin2iq-as.a.run.app/md/work/reaper.md): Measured first, then cut monitoring, database and compute, with every trade-off written down. - [Alerts that mean something](https://portfolio-emsghin2iq-as.a.run.app/md/work/observability.md): Dashboards and alerts built around how this system actually fails. - [Remote control that fails safe](https://portfolio-emsghin2iq-as.a.run.app/md/work/control.md): The platform could watch a building's air-conditioning. Letting it switch units on and off took a different kind of care. - [Changing a live cluster in steps that can't break it](https://portfolio-emsghin2iq-as.a.run.app/md/work/two-step.md): Security and reliability changes to a running platform, each split so that no single step can take it down, and rehearsed first. ## Work: AI agent platform - [Running an agentic AI platform](https://portfolio-emsghin2iq-as.a.run.app/md/work/ai-platform.md): Infrastructure for the company's two AI products: an operations agent that answers from live building data, and a document assistant. ## Writing - [Running an agent benchmark on a supercomputer, without root](https://portfolio-emsghin2iq-as.a.run.app/md/writing/agents-without-root.md): ARIES started every part of a run with Docker. A supercomputer gives users neither Docker nor root, so I added an Apptainer backend: 6,678 lines, a way to measure containers that have no cgroup, and one hang that looked like the agent's fault. - [What 320 agent runs taught me about serving LLM agents](https://portfolio-emsghin2iq-as.a.run.app/md/writing/serving-llm-agents.md): MCP tool calls were 2.7% of an agent's time, 96% of its input tokens came from the prefix cache, and the GPU sat idle most of the time it was held. - [Finding a metrics bill in 914 orphaned Kafka topics](https://portfolio-emsghin2iq-as.a.run.app/md/writing/metrics-bill-kafka-topics.md): Managed Prometheus was the third-largest line item and nobody had measured why. Attribution first, then a reaper, then dropping what nobody read. ## Postmortems - [“Message sent” for messages nobody would read](https://portfolio-emsghin2iq-as.a.run.app/md/postmortems/contact-form.md): For the site's first 3 h 32 min, the contact form said a message was sent while keeping it on a disk that Cloud Run throws away. - [The health check that only worked from inside](https://portfolio-emsghin2iq-as.a.run.app/md/postmortems/healthz.md): Cloud Run's front end answers some paths ending in “z” itself, so /healthz returned 404 to every outside check while the app was healthy. - [A failing check on a healthy site](https://portfolio-emsghin2iq-as.a.run.app/md/postmortems/smoke-test.md): The smoke test reported /metrics as broken while Cloud Run's logs showed every /metrics request returning 200. ## How this site runs - [Architecture decision records](https://portfolio-emsghin2iq-as.a.run.app/md/decisions.md): why it is built this way, and what each choice costs. - [Evidence](https://portfolio-emsghin2iq-as.a.run.app/evidence): the site's main claims, sorted by whether they can be checked live, on public record, or are private. - [Status](https://portfolio-emsghin2iq-as.a.run.app/status): live state, availability against a 99.9% SLO, and the incident history. - [What it costs](https://portfolio-emsghin2iq-as.a.run.app/cost): this month's usage from Cloud Monitoring at list prices, where the money goes, and what caps the bill. - [Break it yourself](https://portfolio-emsghin2iq-as.a.run.app/break): inject delays and errors into your own requests to the live server and watch retries, a circuit breaker and hedging cope. - [Changelog](https://portfolio-emsghin2iq-as.a.run.app/changelog): every release to production and the commits it shipped. - [Live SLO as JSON](https://portfolio-emsghin2iq-as.a.run.app/api/slo): availability and error budget from Google Cloud uptime checks. - [This month's cost as JSON](https://portfolio-emsghin2iq-as.a.run.app/api/cost): usage, list prices, the free tier and the estimated bill. ## Optional - [Every fact on the site in one file](https://portfolio-emsghin2iq-as.a.run.app/llms-full.txt): the text the site's own Ask console retrieves from. - [Source code](https://github.com/zhenxi0901/portfolio): Next.js front end, Go API, Terraform and the GitHub Actions pipeline.