Sitemap
A list of all the posts and pages found on the site. For you robots out there, there is an XML version available for digesting as well.
Pages
Posts
journal
[11] Tag-Based Image Pinning Let Kubernetes Serve a Deleted Build
The Deployment spec showed exactly the image we intended. The pods had been serving an 18-hour-old build whose digest had already been deleted from the registry. A tag is a name; with imagePullPolicy IfNotPresent it is also a cache key.
[15] A Misconfigured Security Scanner Never Scanned the Intended Image
A container-configuration gate failed images that passed when scanned by tag, and passed images it had never looked at. It took five attempts, each of which fixed something real and left the gate still capable of reporting on an artefact nobody asked about.
[9] A Latched Health Flag Left an Instance Permanently Unrecoverable
An on-premise instance whose telemetry uploads kept failing began returning 503 and never stopped. Restarting did not help; shipping a new image did not help. The health anchor was a latched flag, and the only code that cleared it could no longer run.
[2] A Clamped Deduction Let Wallet Balances Go Negative Without Reporting It
Wallets in production showed the impossible triple: deposited $0, balance $0, spent $10.53 — and kept serving. A clamp in the deduction routine absorbed every overshoot, and a write-behind cache turned the resulting lie into a renewable resource.
[20] A Faulty Error Handler Silently Deleted Unbilled Usage Events
Usage events drained from a Redis Stream into the billing table. A helper returned an empty list on any exception, and the caller read emptiness as permission to XTRIM the stream to zero. Dashboards and invoices were quietly low, with no error anywhere.
[5] A Partial Unique Index Broke ON CONFLICT Arbiter Inference
Every insert failed with ‘no unique or exclusion constraint matching the ON CONFLICT specification’ — against a column that demonstrably had a unique index on it. ON CONFLICT does arbiter inference, and a partial index only qualifies if the statement’s own predicate implies the index’s.
[13] A Reentrant Lock Deadlock Froze the Proxy on Any Invalid Config Patch
A malformed config patch froze the entire proxy, permanently, because every request path calls Current() under the same lock. The first fix removed the self-deadlock and introduced a leaked write lock on both error paths — the common paths for a bad patch.
[6] Malformed SSE Reconstruction Permanently Corrupted Conversation History
An SSE resynthesis path emitted a whole thinking block without any of the delta events a spec-compliant client uses to build it. Clients reconstructed an empty block with a valid signature, saved it to disk, and every future replay of that conversation was rejected forever.
[18] Substring Matching on a Streaming Protocol Caused False and Missed Detections
Detecting a specific kind of tool call in a streaming response with a raw substring search caused duplicate upstream billing whenever the model merely mentioned the tool’s name in prose, and missed real calls whose name was split across a chunk boundary.
[17] A Miswired Feature Flag Disabled Streaming’s Fast Path for Months
Time-to-first-token equalled full generation time for every streaming request, for months. A fast pass-through path existed and was correctly written — gated on a flag that had been set unconditionally on every request, so the branch was unreachable code nobody noticed.
[16] A Method Name Collision Broke Requests on the Async Path Only
An async client call raised TypeError about unexpected arguments, only on the async path. A subclass had defined a method with the exact same name as a base-class transport method but a completely different signature, and a type: ignore comment was sitting right on top of it.
[14] A Socket-Level Timeout Failed to Bound a Slow-Drip Request
A hot-path call configured with a timeout could hang indefinitely. A server dribbling one byte before each read-timeout window resets the clock every time — the timeout never fires, because it was never bounding the thing that needed bounding.
[19] Cross-Filesystem Temp Files Broke an ‘Atomic’ Config Write on Linux
A config persistence routine used the standard temp-file-then-rename pattern for an atomic write. On Linux, where the system temp directory is routinely a different filesystem from the target, the rename fails outright — and the failure path was the one that caused the deadlock in an earlier story.
[10] Mismatched Sample Sets Invalidated a Published Benchmark Comparison
A published cost-and-accuracy comparison had to be retracted and restated on a smaller n. A third-party search API ran out of quota mid-sweep, and the two arms being compared died at different points in their run — so neither the sample set nor the count of dropped questions matched.
[8] An Unblinded LLM Judge Biased a Benchmark’s Accuracy Comparison
A benchmark’s judge prompt labelled one answer as coming from the treated arm and printed the exact compression ratio applied to it. A judge primed to expect degradation will find it — and small differences between configurations turned out to be smaller than the judge’s own noise floor.
[12] An asyncio.Lock Bound to the Wrong Event Loop Caused Production Hangs
A repository client’s internal lock worked fine in isolated tests and deadlocked or raised confusingly under a real application’s request lifecycle. It had been created once, at object construction, capturing whatever event loop happened to be running at that moment — not the one that would later serve requests.
[7] A Missing Version Guard Let Concurrent Invoice Updates Lose Money
Folding a revoked key’s usage into an open invoice lost money under concurrency. Fixing the double-billing created silent under-billing; fixing that covered one of three race paths; and the last one was a plain lost update that a status guard cannot see.
[4] Concurrent Token Refreshes Raced Each Other and Invalidated the OAuth Grant
Users were intermittently forced to re-authenticate from scratch, for no visible reason. A background refresh and a 401-triggered refresh could race each other, and the refresh endpoint rotates the token on every use — so the loser presented a credential the winner had already spent.
[1] JSON Re-Serialization Silently Broke Prompt-Cache Prefix Matching
Prompt-cache hit rates collapsed on any request that passed through one code path, with no error and no log line. Parsing the request into a generic map, appending a message, and re-serializing produced byte-for-byte different output from byte-for-byte identical meaning — and a prefix cache only cares about bytes.
[3] A Request-Count Autoscaling Metric Couldn’t Detect Token-Heavy Load
SageMaker’s built-in autoscaling metric counts invocations per instance, not the compute behind them. A burst of long-generation requests looked identical to a burst of trivial ones, and the endpoint scaled three minutes too late every time — for exactly the traffic that mattered most.
publications
GRAD: Generative Retrieval-Aligned Demonstration Sampler for Efficient Few-Shot Reasoning
Published in Findings of EMNLP 2025, 2025
First author (equal contribution), published in Findings of EMNLP 2025 and presented in Suzhou. We propose GRAD, a dynamic demonstration-based approach where an LLM model is trained to generate input-specific concise demonstrations. By tailoring demonstrations to each input, our method offers better contextual support than traditional RAG approaches.
Cmprsr: Abstractive Token-Level Question-Agnostic Prompt Compressor
Published in arXiv preprint — under review at ACL 2026, 2025
Co-author. A prompt compressor that does not need to know the question in advance, so one compressed prompt can serve whatever gets asked of it afterwards. Trained with supervised fine-tuning and preference optimisation, it beats LLMLingua-2 on maths reasoning, summarisation and multiple-choice QA at matched token budgets.
Generative Approaches to Kinetic Parameter Inference in Metabolic Networks via Latent Space Exploration
Published in Nature Communications, 2026
Co-author, published in Nature Communications. We introduce a generative framework for constructing large-scale kinetic metabolic models through latent space exploration. By repurposing pretrained neural network generators across different physiological contexts, our method enables efficient and interpretable inference of kinetic parameters, facilitating targeted model design for diverse metabolic behaviors.
research_projects
Kinetic Parameter Inference in Metabolic Networks via Latent Space Exploration
Published:
We present a novel framework to interpret and control the latent spaces of generative neural network models for kinetic metabolic modeling. By perturbing structured latent spaces learned via REKINDLE or RENAISSANCE, our method generates new dynamic models with targeted properties such as specific response times, regulatory bottlenecks, or alternative physiologies, unlocking deeper insight and reusability across metabolic contexts.
Evaluating LLM Context Compression: Benchmarks, Agents, and Noise
Published:
How do you tell whether compressing an LLM’s context actually cost you anything? At Compresr I built the evaluation programme that answers that: 12 long-context suites, a sandboxed harness for running coding agents under compression, a 200-task assistant-agent benchmark, and — the part that changed how we read all of it — a measurement of our own judging noise.
Structured Representations for Fine-Grained Text-to-Image Retrieval in Remote Sensing
This thesis introduces a multimodal framework for fine-grained text-to-image retrieval in remote sensing, combining global and structured representations through scene graphs and semantic region embeddings. It addresses the limitations of CLIP-style global embeddings by capturing spatial, semantic, and relational details critical for fine-grained reasoning.
GRAD: Generative Retrieval-Aligned Demonstration Sampler for Efficient Few-Shot Reasoning
Published:
Conducted at EPFL dlab with Prof. Robert West; first author (equal contribution), published in Findings of EMNLP 2025. We propose GRAD, a dynamic demonstration-based approach where an LLM model is trained to generate input-specific concise demonstrations. By tailoring demonstrations to each input, our method offers better contextual support than traditional RAG approaches.
GemmaEdu: Enhancing Scientific Learning via Fine-Tuned Language Models and RAG
We developed an educational chatbot built on the quantized Gemma 2 7B model, optimized with Direct Preference Optimization (DPO) and enhanced with Retrieval-Augmented Generation (RAG). By leveraging fine-tuning on student-generated preference data and incorporating relevant external documents, our system significantly improves accuracy in answering STEM multiple-choice questions, outperforming baseline models like Mistral and Llama2.
From Novice to Expert: Dimensionality Reduction and Policy Distillation in Reinforcement Learning for Motor Control
This project investigates how to accelerate motor skill acquisition in reinforcement learning using curriculum-based learning, dimensionality reduction, and policy distillation. Using the Myosuite Baoding balls task, we explore how expert policies can be transferred to novice agents via PCA-reduced feature and action spaces, offering an efficient alternative to prolonged training times.
Learning-Based Multi-Robot Lane Navigation: Scalable Trajectory Prediction using Neural Networks
This project was conducted at DISAL, EPFL. We explore trajectory generation for multi-robot navigation using neural networks. We propose a scalable alternative to Webots simulation by training models using graph neural network, reinforcement and imitation learning. The final approach produces accurate trajectories in a lane-based environment, balancing precision and efficiency in robotic control.
work
Co-founder & CTO — Compresr Inc. (YC W26)
I co-founded Compresr out of EPFL’s dlab to build context-compression infrastructure for LLMs. We were taken into Y Combinator W26. I am the infrastructure engineer on a four-person team: the multi-tenant cloud platform, the on-premise product, an open-source Go proxy, the GPU serving layer, and the benchmark harness we make decisions with.
Research Assistant — Data Science Lab (dlab), EPFL
A year of NLP research with Prof. Robert West on making language models behave under tight context budgets. First-authored GRAD (EMNLP 2025 Findings), where an LLM is trained with GRPO to generate few-shot demonstrations instead of retrieving them, and designed the prompt-compression benchmark programme that became the basis for an ACL submission and, later, a product.
AI Research Intern — AXA Group Operations
I led applied research and prototyping efforts in multimodal AI, focusing on cross-modal representation learning, graph-based embeddings, and neural search systems. I developed scalable pipelines to generate scene graphs from satellite imagery and knowledge graphs from textual data, and to align their graph embeddings in a shared representation space.
Machine Learning Intern - Pixalione
Developed a machine learning pipeline to forecast daily ad spend on Google Ads based on client-specific campaign data. Deployed a web backend for dynamic budget strategy adjustment, automated alerts, and integration with Azure Cloud infrastructure.
Student Assistant — EPFL
During my studies, I served as a teaching assistant for multiple courses, assisting in lectures, labs, and tutorials
