<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Doruk Taneli</title>
        <link>https://www.doruktaneli.com</link>
        <description>Your blog description</description>
        <lastBuildDate>Fri, 17 Jul 2026 16:42:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Doruk Taneli</title>
            <url>https://www.doruktaneli.com/favicon.ico</url>
            <link>https://www.doruktaneli.com</link>
        </image>
        <copyright>All rights reserved 2026</copyright>
        <item>
            <title><![CDATA[EGO: A Simple Production Checklist for AI Agents]]></title>
            <link>https://www.doruktaneli.com/articles/ego</link>
            <guid isPermaLink="false">https://www.doruktaneli.com/articles/ego</guid>
            <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Most AI agent diagrams focus on models, memory, tools, and runtimes.</p>
<p>That is useful, but when moving from a demo to production, I find the bottom layer more important: the cross-cutting systems that help you monitor, evaluate, debug, and keep the agent safe.</p>
<img alt="" loading="lazy" width="1284" height="1536" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fthe-ai-agent-stack-explained.0yewo6dlp-ys2.jpg&amp;w=1920&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fthe-ai-agent-stack-explained.0yewo6dlp-ys2.jpg&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fthe-ai-agent-stack-explained.0yewo6dlp-ys2.jpg&amp;w=3840&amp;q=75">
<p>I like to summarize this layer as <strong>EGO</strong>:</p>
<ul>
<li>
<p><strong>Evaluation</strong>: Does the agent actually work? <br>
feedback, evals, quality checks, performance monitoring, and drift detection</p>
</li>
<li>
<p><strong>Guardrails</strong>: Does it stay within acceptable boundaries? <br>
safety, moderation, security, policy, permissions, and risk controls</p>
</li>
<li>
<p><strong>Observability</strong>: Can we see what happened? <br>
tracing, debugging, sessions, logs, cost, usage, and latency</p>
</li>
</ul>]]></content:encoded>
            <author>doruktaneli@gmail.com (Doruk Taneli)</author>
        </item>
        <item>
            <title><![CDATA[IC vs EM Way of Agentic Programming]]></title>
            <link>https://www.doruktaneli.com/articles/ic-vs-em</link>
            <guid isPermaLink="false">https://www.doruktaneli.com/articles/ic-vs-em</guid>
            <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>There are two main ways of doing agentic programming.</p>
<img alt="IC vs EM Way of Agentic Programming" loading="lazy" width="1536" height="1024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fic-vs-em-way-of-agentic-programming.0oc90qaa6fn5h.png&amp;w=1920&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fic-vs-em-way-of-agentic-programming.0oc90qaa6fn5h.png&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fic-vs-em-way-of-agentic-programming.0oc90qaa6fn5h.png&amp;w=3840&amp;q=75">
<h2>Individual Contributor (IC)</h2>
<p>Watch closely as the agent thinks and implements. Steer if they make wrong choices.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Token efficient</li>
<li>Less cognitive debt</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Scale</li>
</ul>
<p>As of June 2026, I enjoy using ChatGPT more for the IC way:</p>
<ul>
<li>ChatGPT responses are faster than Claude.</li>
<li>Model overloaded: I have never seen a model overloaded error in ChatGPT. These errors are much more annoying if you are watching a single coding thread, compared to the parallel and async EM way.</li>
<li>ChatGPT has a steer function that lets you steer the model as it's working, rather than stopping the response and sending a new message.</li>
</ul>
<hr>
<h2>Engineering Manager (EM)</h2>
<p>Stop telling your reports what singular changes to do. Tell them the end goal and the why.</p>
<p>EMs don't review all code changes; they make engineers review each other's code.
Many mistakes can be caught by coding agents themselves. I found that reviewing the code in a fresh context works better for this.</p>
<p>You don't have to babysit each thread. Give each thread the goal, the why, and a way to review its work. Then you can parallelize the work and go much faster.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Scale</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Token spend</li>
<li>Cognitive debt</li>
</ul>
<p>In June 2026, Anthropic seems to be pushing for this way of coding, especially with the new ultracode function in Claude Code.</p>
<hr>
<p>You don't have to choose one, you can do both.
Like many things in engineering, this is about trade-offs.</p>
<p>For risky and ambiguous production changes, the IC way is a better fit. This way, you have less cognitive debt and debug much easier if something goes wrong. EM mode still works for well-scoped and easy-to-test changes.</p>
<p>The EM way is especially great for experiments, proof of concepts, and hackathons. Especially if your token costs are covered!</p>]]></content:encoded>
            <author>doruktaneli@gmail.com (Doruk Taneli)</author>
        </item>
        <item>
            <title><![CDATA[Serving LLMs to Children]]></title>
            <link>https://www.doruktaneli.com/articles/llms-and-children</link>
            <guid isPermaLink="false">https://www.doruktaneli.com/articles/llms-and-children</guid>
            <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Serving LLMs to teach children languages looks simple at first. The child writes something, the model replies, and the child learns. But once the user is a child, the product bar changes.</p>
<img alt="Children using tablets for a language-learning course" loading="lazy" width="2400" height="1572" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fakelius-languages.0qdv.eg_22sur.webp&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fakelius-languages.0qdv.eg_22sur.webp&amp;w=3840&amp;q=75">
<p>The model should stay inside the lesson. Children can ask anything, but the system should not drift into adult topics, personal advice, self-harm, violence, or anything inappropriate for a kids' product. A system prompt is not enough. You need guardrails, moderation before and after the model, topic boundaries, and tests for jailbreaks.</p>
<p>Privacy also matters more. Children may share names, schools, locations, family details, or photos without understanding the risk. Store the minimum data needed, keep retention short, and avoid linking raw messages directly to users unless it is necessary. Logs used for debugging, analytics, or evaluation should be anonymized or pseudonymized by default.</p>
<p>Evaluation should also be age-aware. It is not enough for the answer to be grammatically correct. The response should be simple, encouraging, age-appropriate, and useful for learning.</p>
<p>Observability still matters, but it should respect privacy. You need to know when moderation triggered, when the model went off-topic, and when the tutor gave a bad correction. But engineers should not need full access to a child’s conversation history to debug the system.</p>
<p>For adult products, a bad LLM response is often just a product bug. For children, it can become a safety and trust issue.</p>
<p>That is why production AI for kids needs three things: evaluation, guardrails, and privacy-aware observability.</p>]]></content:encoded>
            <author>doruktaneli@gmail.com (Doruk Taneli)</author>
        </item>
    </channel>
</rss>