<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Mohanad Abu-Nayla</title><link>https://hannody.github.io/</link><description>Recent content on Mohanad Abu-Nayla</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sat, 01 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hannody.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>About</title><link>https://hannody.github.io/about/</link><pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate><guid>https://hannody.github.io/about/</guid><description>&lt;p&gt;Within my organization, I act as a technical problem router. When there&amp;rsquo;s no
established answer, whether that&amp;rsquo;s new infrastructure, a new AI capability, or
a complex integration, I&amp;rsquo;m brought in to assess, decide, build and deliver.&lt;/p&gt;
&lt;p&gt;I design and run production AI systems under real-world constraints: LLM
inference pipelines, OCR engines, and ML platforms on on-prem GPU Kubernetes
clusters, optimized for reliability, low latency, and cost efficiency in
regulated environments.&lt;/p&gt;</description></item><item><title>Spec-Driven Development with AI Agents: Constitutions, Checkpoints, and Handoffs</title><link>https://hannody.github.io/posts/agents/spec-driven-development-with-ai-agents/</link><pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate><guid>https://hannody.github.io/posts/agents/spec-driven-development-with-ai-agents/</guid><description>&lt;p&gt;AI coding agents are strangely lopsided. Hand one a well-scoped task and it writes better code, faster, than I do. Hand it a &lt;em&gt;large&lt;/em&gt; 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 &lt;strong&gt;context rot&lt;/strong&gt;). A fresh session, missing the history, confidently invents an API that never existed. And even when the code is good, you&amp;rsquo;re left staring at a 3,000-line diff you can&amp;rsquo;t meaningfully review.&lt;/p&gt;</description></item><item><title>Before You Train, Audit: A TinyStories Case Study</title><link>https://hannody.github.io/posts/ai/training/before-you-train-audit-tinystories/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://hannody.github.io/posts/ai/training/before-you-train-audit-tinystories/</guid><description>&lt;p&gt;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.&lt;/p&gt;</description></item><item><title>On-Demand Namespace Error Log Watcher in a Locked-Down Kubernetes Environment</title><link>https://hannody.github.io/posts/k8s/kubernetes-stern-error-watcher/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>https://hannody.github.io/posts/k8s/kubernetes-stern-error-watcher/</guid><description>&lt;p&gt;During a large-scale stress test, the last thing you want is to be hunting errors across 150 pods manually.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What we are building:&lt;/strong&gt; a Kubernetes Deployment, scaled to zero by default, that runs &lt;a href="https://github.com/stern/stern"&gt;Stern&lt;/a&gt; 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 &lt;code&gt;kubectl scale&lt;/code&gt; command. The entire setup RBAC, ServiceAccount, and Deployment lives within the targeted namespace it monitors and leaves no trace when removed.&lt;/p&gt;</description></item></channel></rss>