Fix the Third Code Cell

I was trying to get a coding agent to fix a few notebook cells, and it asked me to copy-paste snippets just so it could figure out which ones I meant. It worked, but it felt like a step backward. I knew exactly which cells I meant, but I had no direct way to point to them. Usually, we point agents to notebook cells indirectly: the cell that loads the dataset, the cell that does the groupby and filtering, and so on. It works, but it is not a great way to address a cell. Insert a cell, delete one, or reorder the notebook, and positional references change. Descriptions can also be ambiguous when several cells look similar. ...

August 15, 2026 · 3 min · Mohanad Abu-Nayla

Spec-Driven Development with AI Agents: Constitutions, Checkpoints, and Handoffs

AI coding agents are strangely lopsided. Hand one a well-scoped task and it writes better code, faster, than I do. Hand it a large feature, the kind that takes days and touches a dozen files across several layers, and the failure mode changes. The context window fills up and quality quietly degrades (AKA context rot). A fresh session, missing the history, confidently invents an API that never existed. And even when the code is good, you’re left staring at a 3,000-line diff you can’t meaningfully review. ...

August 1, 2026 · 6 min · Mohanad Abu-Nayla

Before You Train, Audit: A TinyStories Case Study

If you are building a small language model from scratch, TinyStories is usually one of the first datasets you reach for. I did too. Before touching tokenization and training, I ran a quick data audit on the parquet train split. That one step surfaced something worth sharing: a large number of exact duplicate stories sitting quietly in the data. This post is a practitioner-level writeup, not an accusation. TinyStories is still a solid dataset. The point is just this: verify your data pipeline the same way you verify your model pipeline. ...

May 30, 2026 · 8 min · Mohanad Abu-Nayla

On-Demand Namespace Error Log Watcher in a Locked-Down Kubernetes Environment

During a large-scale stress test, the last thing you want is to be hunting errors across 150 pods manually. So I built an on-demand error log watcher for a complex Kubernetes namespace under real-world constraints, without touching anything outside the namespace, and without installing a single binary on the server. What we are building: a Kubernetes Deployment, scaled to zero by default, that runs Stern as a container inside the cluster. It watches all pods in a target namespace, filters output to errors only, and can be started or stopped with a single kubectl scale command. The entire setup RBAC, ServiceAccount, and Deployment lives within the targeted namespace it monitors and leaves no trace when removed. ...

May 23, 2026 · 9 min · Mohanad Abu-Nayla