<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Azmi Rutkay Biyik on Medium]]></title>
        <description><![CDATA[Stories by Azmi Rutkay Biyik on Medium]]></description>
        <link>https://medium.com/@arutkayb?source=rss-5b7ef8a57ae5------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*eSfaKO0Lhjva4QUj0meCOA.jpeg</url>
            <title>Stories by Azmi Rutkay Biyik on Medium</title>
            <link>https://medium.com/@arutkayb?source=rss-5b7ef8a57ae5------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 05:51:32 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@arutkayb/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Those Absurd Tai Chi Ads Are a Masterclass in Dark Patterns]]></title>
            <link>https://medium.com/seek-for-wealth/those-absurd-tai-chi-ads-are-a-masterclass-in-dark-patterns-c504f1f348cb?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/c504f1f348cb</guid>
            <category><![CDATA[dark-patterns]]></category>
            <category><![CDATA[marketing]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[ai-video]]></category>
            <category><![CDATA[digital-marketing]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Mon, 20 Jul 2026 06:11:45 GMT</pubDate>
            <atom:updated>2026-07-20T06:11:45.941Z</atom:updated>
            <content:encoded><![CDATA[<p><em>The worse the ad looks, the better the funnel works. Here are the ten tricks inside it.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GXHfIctwruZMRF9tPyrDtQ.png" /></figure><p>An AI-generated grandfather keeps showing up in fitness feeds. He’s 62, shredded, and he says Tai Chi walking gave him abs in three weeks. Seven minutes a day. In a week your eyes will change. In a month your son won’t recognize you.</p><p>My first reaction was probably the same as yours: who falls for this? Then I dug into it and found the uncomfortable answer. Nobody is supposed to fall for the ad. The ad is a filter. The real machine starts after the click, and that machine is built almost entirely out of <strong>dark patterns</strong>.</p><p>Most of the facts below come from an investigation by YouTuber Josh Brett, who bought a fresh debit card and <a href="https://www.youtube.com/watch?v=XkNMeGIX2iY">walked into the funnel himself</a>. The pattern names come from Harry Brignull, the UK designer who has been cataloging these tricks for over a decade. What I want to do here is line the two up, because this funnel is close to a complete tour of his catalog.</p><h3>The Ads Are Bad. The Operation Is Not.</h3><p>Some context before the list, because the scale is the whole point.</p><p>There’ve reportedly been over 18,000 variants of these ads. A single one passed 100 million views. The estimated spend behind them is around $195 million over 12 months. That money doesn’t come from an amateur fumbling with AI video tools.</p><p>The ads funnel into Mad Muscles, a fitness app. Mad Muscles is run by Ammo Apps, which sits inside Ammo, a company of around 600 people. Above all of it sits Genesis, a Ukrainian holding company whose app portfolio reports over 400 million downloads. The company is registered in Cyprus and bills from Las Vegas while the ads run worldwide.</p><p>So the amateur look of the ads is not a budget problem. It’s a design choice. Hold that thought until pattern number one.</p><h3>What a Dark Pattern Actually Is</h3><p><strong>Dark patterns</strong>, now often called deceptive patterns, are interface tricks designed to make you do things you didn’t intend: buy add-ons, accept a subscription, or hand over personal data. Brignull started documenting them in 2010, and some, like sneaking items into your basket, have already been made illegal in parts of the world.</p><p>One caveat before the list. The line between persuasion and deception can be blurry. A discount is persuasion. A discount with a fake timer is deception. What pushes this funnel over the line is the combination: every stage uses one of these tricks, wrapped around health claims that the evidence doesn’t support.</p><h3>The 10 Dark Patterns in the Tai Chi Funnel</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f_Jx4IvbQJi6ikrE2kJkuQ.png" /></figure><p><strong>1. The self-selection filter.</strong> The ads are absurd on purpose. A 2012 Microsoft paper asked why Nigerian prince emails look so fake and landed on this: an unbelievable message repels skeptics for free, so only the most trusting people ever reply. If you laugh at the AI grandfather and scroll past, the advertiser hasn’t spent a cent on you. You filtered yourself out.</p><p><strong>2. The data-harvest quiz.</strong> Before any product appears, you answer roughly ten minutes of questions about your age, weight, goals, and insecurities. Brett entered a body weight that made him almost underweight, and the quiz still prescribed a 1,040-calorie diet to drop 12% body fat. The quiz isn’t diagnosis. It’s commitment. After ten minutes of answering, walking away feels like a waste.</p><p><strong>3. The rigged prize wheel.</strong> Before showing the price, the site spins a gambling-style wheel and you “win” a discount. Brett won the maximum discount, as everyone presumably does. A price you won feels like a gift, and gifts are hard to refuse.</p><p><strong>4. The countdown that never ends.</strong> A timer pressures you to buy before your discount expires. Brignull has documented what many of these timers do at zero: they restart. The urgency is manufactured.</p><p><strong>5. Fake scarcity.</strong> “Hurry, only five spots left.” It’s a subscription app. There are no spots.</p><p><strong>6. Misdirection.</strong> After you pay, a sequence of pop-ups begins. Each has a huge, bright yes button and a tiny gray skip link hidden off-center. Judging by the angry reviews, many buyers thought these pop-ups were the product they’d already paid for.</p><p><strong>7. Sneak into basket.</strong> Those pop-ups are stacked add-ons that can pile up to hundreds of dollars before you notice. Sports Direct ran the physical version of this trick with a magazine and a giant mug at checkout, and the UK made that practice illegal in 2014. Online, it lives on.</p><p><strong>8. Hidden auto-renew.</strong> The subscription renews itself, disclosed in small print. Scroll through Mad Muscles’ 26,000+ Trustpilot reviews and the complaints cluster exactly there, coming from men over 50 and women over 40. That’s the same audience the ads target.</p><p><strong>9. The paywalled lifeline.</strong> Brett tried to ask the in-app coach whether 1,040 calories a day at 50 kilograms is actually safe. The coach sits behind another paywall. The one feature that could catch a dangerous recommendation costs extra.</p><p><strong>10. The roach motel.</strong> Easy to get in, hard to get out. The money-back guarantee requires many consecutive days of completed workouts, screenshots as proof, and sometimes ongoing messages with a coach. There’s no cancel button anywhere in the app. Brignull coined the name for this pattern, and the timing is grim: the US “click-to-cancel” rule that would have forced a cancel button was struck down in federal court in July 2025.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WNZni53c8-SbQLS9kINVbw.png" /></figure><h3>Why Nobody Stops It</h3><p>Here’s the part that bothered me the most. Every layer of oversight has a reason to look away.</p><p>The corporate structure spans jurisdictions, so a person hit with a surprise charge doesn’t know who to complain to. The UK’s Advertising Standards Authority can ask for an ad to be taken down, but it rarely fines or prosecutes. Health regulators police medical products, and these apps are structured to fall between the categories. Meta, YouTube, and TikTok earn money every time one of these ads runs. And when a fine does land, it’s often smaller than the revenue it punishes.</p><p>Nobody in the chain has a financial reason to stop. So it doesn’t stop.</p><h3>What You Can Actually Do</h3><p><strong>Don’t skip the ad.</strong> This one is petty, and I love it. Advertisers pay per completed view. If you watch all 30 seconds of the AI grandfather without clicking, the company pays for a viewer it specifically built the ad to repel. Their filter, used against them.</p><p><strong>Talk to the actual targets.</strong> The people falling for this aren’t reading breakdowns like this one. They’re on Facebook. They’re your parents, or your aunt who has struggled with her weight for years and just wants to feel better. A two-minute conversation about fake countdown timers protects them more than any regulator currently does.</p><p><strong>If you build products, audit your own funnel.</strong> Every pattern on this list ships in some growth playbook as a conversion tactic. The wheel, the timer, the pre-checked add-on. If your funnel only works because the user didn’t notice something, you already know which side of the line you’re on.</p><h3>The Takeaway</h3><p>The lesson I keep coming back to: the badness was engineering. Every instinct says a $195 million operation should produce polished ads, and every instinct is wrong. The polish lives where it pays off, in the funnel, and the crudeness lives where it pays off, in the filter.</p><p>So the next time an ad looks too stupid to work, don’t ask who it repels. Ask who it keeps.</p><p>The full investigation is Josh Brett’s video, <a href="https://www.youtube.com/watch?v=XkNMeGIX2iY">The $295,000,000 Tai Chi Walking Scam</a>. Worth 13 minutes of your time. Harry Brignull’s catalog of deceptive patterns lives at <a href="https://www.deceptive.design/">deceptive.design</a>.</p><p>If you have come this far, I guess I can assume you’re interested in tech and how it shapes behavior. If you want more reads in tech and lifestyle around tech, don’t forget to check out my profile.</p><p>Stay skeptical out there. The wheel always lands on the maximum discount.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c504f1f348cb" width="1" height="1" alt=""><hr><p><a href="https://medium.com/seek-for-wealth/those-absurd-tai-chi-ads-are-a-masterclass-in-dark-patterns-c504f1f348cb">Those Absurd Tai Chi Ads Are a Masterclass in Dark Patterns</a> was originally published in <a href="https://medium.com/seek-for-wealth">Seek For Wealth</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Smarter the Model Gets, the Less My Custom Pipeline Matters]]></title>
            <link>https://levelup.gitconnected.com/the-smarter-the-model-gets-the-less-my-custom-pipeline-matters-686021106526?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/686021106526</guid>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[vibe-coding]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Wed, 15 Jul 2026 16:37:46 GMT</pubDate>
            <atom:updated>2026-07-15T16:37:46.777Z</atom:updated>
            <content:encoded><![CDATA[<p><em>My multi-stage AI workflow just lost a fair fight against a single conversation. Where it still wins is the part that should worry experienced engineers.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*U0Dbkyuw7j1idoX8-tgCzQ.png" /></figure><p>I’ve spent months building a custom AI development pipeline. Ideation, specification, planning, plan validation, execution, code review, findings triage. Every stage produces an artifact. Every artifact gets checked before the next stage runs. I wrote about it, refined it, and ran it on real projects. It worked, and I was proud of it.</p><p>Last week, a single conversation with a newer model did what the pipeline used to do. No plan file. No validation gate. No review loop. One prompt, some back-and-forth, done.</p><p>I should be happy about that. I’m mostly not.</p><h3>The Test Bed</h3><p>The project is a Flutter rewrite of a ten-year-old Java Android app with thousands of live users. It’s the kind of project where mistakes are not abstract. The new app has to read the old app’s SQLite database in place after a Play Store update. The crypto has to match the old implementation byte for byte: AES-256-GCM, PBKDF2 with exactly 65536 iterations, a 12-byte IV prepended to every payload. Backup restore has to handle four different legacy data formats, because ten years of users means ten years of formats.</p><p>I built my pipeline for exactly this kind of work. Work where a “reasonable guess” by an agent corrupts real user data.</p><p>For months, the pipeline earned its keep. The validation gate caught unverified package versions. The review stage caught assumptions that would have broken the migration path. The structure was doing real work.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3pw6VPGnpKLSyviji1x5Kg.png" /></figure><h3>Then the Model Emerged: Fable 5</h3><p>The recent task: replace the app’s manual backup and restore flow with a background sync service. Not a small change. One service deleted, two new modules, the auth flow touched, tests rewritten, user-facing strings updated in eleven languages.</p><p>Old me would have run the full pipeline. Spec, plan, validate, execute in phases.</p><p>Instead I described the goal in a normal conversation and watched. The model asked the clarifying questions my specification stage used to force. It checked the legacy formats before touching the codec, which is what my validation stage used to verify. It ran the tests without being told, which is what my execution harness used to enforce.</p><p>The pipeline’s stages didn’t disappear. They moved inside the model.</p><p>That’s the pattern I keep seeing now. Most of my harness was compensation. Compensation for a model that wouldn’t ask questions, wouldn’t check its assumptions, wouldn’t verify its own work. Each model generation needs less compensation. The harness shrinks with every release.</p><h3>Where the Pipeline Still Wins</h3><p>But not all of it shrinks. There’s a category of work where I still run the full pipeline, and I don’t expect that to change soon: well-established, quality-critical, deterministic implementations.</p><p>The crypto compatibility layer is the clearest example. There is exactly one correct output. The old app’s ciphertext either decrypts or it doesn’t. “The model is smart” is not a guarantee I can ship to thousands of users. What I need there is determinism: the same checks, in the same order, every single time, with acceptance criteria a machine can verify. A smart model gets it right most of the time. A pipeline proves it got it right this time.</p><p>Same for the four backup formats. Same for the database migration. The pipeline isn’t there because the model is dumb. It’s there because “probably correct” and “verified correct” are different products, and some code has to be the second one.</p><p><strong>The dividing line, as far as I can tell: intelligence replaces process where judgment was the bottleneck. It doesn’t replace process where proof is the bottleneck.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CeBZZEoeA_LIRoOxQ5V3Kg.png" /></figure><h3>The Part That Should Worry You</h3><p>Here’s the uncomfortable conclusion I keep circling back to.</p><p>My pipeline was never really a tool. It was my judgment, written down. Years of knowing what to check, when to stop and validate, which assumptions kill projects. Encoding that into a workflow was my edge over someone who just types “build me a sync service” into a chat box.</p><p>The models are absorbing that judgment. Not the domain knowledge, the engineering discipline itself. The instinct to verify a package version before depending on it. The habit of checking repository state before executing a plan. These were senior engineer behaviors. Now they’re default model behaviors.</p><p>So the moat moves again. First it was writing code. Then it was reviewing AI code. Then it was orchestrating AI with custom harnesses. Each of those felt durable when I was doing it. None of them were.</p><p>What’s left, for now, is narrower: knowing which slice of the work is quality-critical, and being able to write its invariants down precisely enough to verify. In my rewrite project, that’s maybe ten percent of the codebase. The crypto, the migration, the legacy formats. The other ninety percent, the model increasingly handles from a conversation.</p><p>I don’t think that ten percent goes away. But I also thought my pipeline wouldn’t be optional this soon.</p><h3>The Takeaway</h3><p>If you’ve built a custom AI workflow, re-test it against the newest models with an honest eye. Some stages still do real work. Some are compensation for a weakness that no longer exists. Keep the first kind, delete the second kind, and be honest about which is which.</p><p>And if your professional value currently lives in your harness, start moving it. The durable skill isn’t the pipeline. It’s knowing which parts of your system deserve one.</p><p>I’ve written before about the pipeline this article is now partially retiring, in <a href="https://medium.com/@arutkayb/i-stopped-trying-to-make-agents-smarter-and-started-making-my-inputs-better-b9d0b84ffb02"><strong><em>By the time execution starts, there should be nothing left to decide</em></strong></a>. If you have come this far, I guess I can assume that you are interested in AI and tech. If you want more reads in tech and lifestyle around tech, don’t forget to check out my profile.</p><p>Always review what AI generates before pushing. It handles the tedious stuff, you stay the engineer.</p><p>Wish you all the best in your AI journey!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=686021106526" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/the-smarter-the-model-gets-the-less-my-custom-pipeline-matters-686021106526">The Smarter the Model Gets, the Less My Custom Pipeline Matters</a> was originally published in <a href="https://levelup.gitconnected.com/">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Gave Claude Code Its Own Notion Workspace]]></title>
            <link>https://levelup.gitconnected.com/i-gave-claude-code-its-own-notion-workspace-6742b33dbeb4?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/6742b33dbeb4</guid>
            <category><![CDATA[notion]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Fri, 10 Jul 2026 16:18:46 GMT</pubDate>
            <atom:updated>2026-07-10T16:18:46.945Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Persistent project docs and task tracking through Notion MCP, without letting an agent near my personal notes</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DU-GPi8DYsNAC7mlwONQYA.png" /></figure><p>Every Claude Code session starts with amnesia. You explain your project, the agent does great work, you close the terminal, and tomorrow you explain it all over again. The code persists in git. The understanding doesn’t.</p><p>I’ve written before about treating execution state as a first-class artifact: plan files, state files, project logs. That solved continuity inside a single task. But project-level knowledge was still scattered across markdown files, chat histories, and my head. Task backlogs, competitor research, architecture decisions, open questions. The kind of knowledge that spans weeks.</p><p>So I moved it to Notion and let Claude Code manage it through the Notion MCP server. A few weeks in, this is the setup I keep coming back to.</p><h3>The First Decision: A Separate Workspace</h3><p>Before connecting anything, I had a problem. My Notion workspace is my life. Personal notes, journals, plans, things no agent has any business reading, let alone editing.</p><p>MCP permissions are not granular enough for my comfort here. Once Claude has access to a workspace, it can search and touch what’s in it. I didn’t want to rely on “it probably won’t open my journal.”</p><p>The fix was boring and effective: I created a second Notion workspace. “Rutkay’s Notes” stays private, untouched, disconnected. “Rutkay’s Projects” is the only workspace the MCP integration can see, and it contains nothing but project material.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/582/1*yoko_na7yd_dfLt-Bd0sKA.png" /></figure><p>This one decision removed the entire category of worry. Claude can read, write, and reorganize anything in the projects workspace, and the blast radius is exactly zero for everything I actually care about protecting. If you take one thing from this article, take this: don’t point an agent at the workspace where you keep your life.</p><h3>Two Skills to Make It Usable</h3><p>Raw MCP access works, but it’s chatty. Every operation is a round of tool calls, and Claude has to rediscover the workspace structure each session. I wrapped the common paths into two custom skills.</p><p><strong>/notion-project-sync</strong> keeps a project’s Notion presence in sync with reality. It knows where the project’s task database and documentation pages live, so Claude can pull the current state at the start of a session and push updates back (new tasks, status changes, fresh docs) without me spelling out page IDs every time.</p><p><strong>/notion-cli</strong> wraps the Notion CLI (ntn) for the operations where the API is the better tool: direct API calls, batch operations, file uploads. When MCP is too slow or too coarse for a job, Claude drops down to the CLI instead of fighting the tool interface.</p><p>I won’t paste the skill files here. The point is the division of labor, not the implementation. One skill for the routine sync loop, one for the escape hatch.</p><h3>What Claude Actually Built</h3><p>Here’s where it got interesting. I didn’t design the databases myself. I described what I wanted tracked, and Claude created the structure through MCP.</p><p>For one project, that became a task database with fields for Area (Platform, Security, Monetization, Trust &amp; Safety), Phase, and Priority. Claude populated it: DB schema and migrations, rate limiting, age gating, secure key storage, crash reporting. Each task with a one-line note explaining the why. Not a template I filled in. A backlog the agent derived from our planning conversations and wrote directly into Notion.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4bV8Yxq_HkwkybDfZsLJ7Q.png" /></figure><p>Around the tasks, it built the documentation layer: a documentation hub, a competitor and review analysis, a field analysis of the domain, mockup collections, and a page of rough task ideas waiting to be triaged into the real backlog.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/554/1*ZzSR89G3VuFOqzunUSq9Qg.png" /></figure><p>The part that matters: because Claude wrote this structure, Claude can navigate it. There’s no impedance mismatch between how the docs are organized and how the agent expects them to be organized. It reads its own filing system fluently.</p><h3>Two Real Tests</h3><p>I didn’t want to evaluate this on a toy project, so I ran two very different workloads through it.</p><p>The first was a rewrite. I have an Android app I wrote about ten years ago, and I’m rebuilding it with Flutter. This is exactly the kind of project that punishes lost context: legacy behavior to preserve, migration decisions that only make sense if you remember the constraint that forced them, a long backlog that evolves as the old code reveals its surprises. Claude tracks all of it in Notion now. When a session starts, it syncs the project state, sees which migration tasks are open, and picks up with full knowledge of decisions made weeks ago.</p><p>The second was research, not code. For a new project idea, I had Claude run a field analysis: the competitive landscape, existing products, user complaints from reviews, gaps worth building into. The output didn’t land in a chat window that would scroll into oblivion. It landed as structured Notion pages that later sessions cite when we discuss priorities. Last month’s research is now an input to this month’s planning, automatically.</p><p>Two workloads, one pattern: the value isn’t that Claude can write to Notion. It’s that a later session can read what an earlier session knew.</p><h3>What Changed</h3><p>Before this, resuming a project meant reconstructing context by hand. Re-explaining the architecture, re-stating the priorities, hoping I remembered the reasoning behind last month’s decisions.</p><p>Now the session starts with a sync. Claude reads the task database, checks the documentation, and asks about the things that actually changed. When we finish, it updates task statuses and appends what we learned. The project’s memory lives outside both my head and the conversation.</p><p>There’s a second-order effect I didn’t expect. Because the docs are in Notion rather than buried in a repo, I read them too. On my phone, away from the terminal. I catch stale priorities and wrong assumptions while making coffee, not while burning a coding session. The shared memory works in both directions.</p><p>It’s not free. The sync adds a bit of overhead at session boundaries, and every MCP tool call is slower than reading a local file. For a quick one-off script, I skip it. For anything that spans more than a couple of sessions, the overhead pays for itself the first time I don’t have to re-explain the project.</p><h3>The Takeaway</h3><p>If your agent workflow loses everything between sessions, the fix isn’t longer conversations or bigger context windows. It’s an external memory the agent can read and write, structured well enough that it can navigate it without you.</p><p>Notion through MCP is one way to build that. Whatever you pick, two rules held up for me: give the agent its own space, isolated from anything personal, and let it build the structure it will later have to navigate.</p><p>Front-load the isolation. Externalize the memory. Let the agent do its own filing.</p><p>If you have come this far, I guess I can assume that you are interested in AI and tech. If you want more reads in tech and lifestyle around tech don’t forget to check out my <a href="https://medium.com/@arutkayb"><strong>profile</strong></a>. If you wanna choose your next read immediately, you can go for this one: <a href="https://medium.com/gitconnected/my-idea-finder-had-exactly-one-idea-make-it-cheaper-a9a9671bc327"><strong>My Idea Finder Had Exactly One Idea: Make It Cheaper</strong></a></p><p>Always review what AI generates before pushing. It handles the tedious stuff, you stay the engineer.</p><p>Wish you all the best in your AI journey!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6742b33dbeb4" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/i-gave-claude-code-its-own-notion-workspace-6742b33dbeb4">I Gave Claude Code Its Own Notion Workspace</a> was originally published in <a href="https://levelup.gitconnected.com/">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Code API Error: Unable to connect to API (ECONNRESET)]]></title>
            <link>https://arutkayb.medium.com/claude-code-api-error-unable-to-connect-to-api-econnreset-c27668525aca?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/c27668525aca</guid>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[macos]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[networking]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Tue, 23 Jun 2026 06:51:49 GMT</pubDate>
            <atom:updated>2026-06-23T06:51:49.356Z</atom:updated>
            <content:encoded><![CDATA[<p>Claude Code Kept Resetting on My Home Wi-Fi after attempting to connect 10 times, 15 second trials each. Here is the full diagnosis and the one-line fix.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lUrK2I62ZyOsF91pSh_g5Q.png" /><figcaption>Claude Code session API Error: Unable to connect to API (ECONNRESET)</figcaption></figure><h3>My AI coding sessions kept dying in the middle. Always on my home Wi-Fi, never on my phone hotspot</h3><p>The error was always the same: `API Error: Unable to connect to API (ECONNRESET)`. ECONNRESET means the connection got reset out from under the app. Short prompts worked fine. The moment a session got long, it would run for a few minutes and then drop.</p><p>I have been debugging networks and systems for a decade, so I did the responsible thing and blamed everything in order. None of it was the real cause. The real cause was a single number my own Mac had picked, and it took a full afternoon of tests to corner it.</p><p>Here is the whole hunt, because if you are on a German DSL line, or any asymmetric home connection behind an ISP-provided router, this is probably waiting for you too.</p><h3>The First Misread: It Looked Like a Slow Death</h3><p>The story everyone tells themselves is “long connection, dies after a while.” My sessions died after 12 minutes once, 6 minutes another time. That sounds like a connection getting tired and giving up.</p><p>The debug log said otherwise. Claude Code does not give up after one failure. It retries. The log showed 10 attempts, and each single attempt died at a consistent 15 to 16 seconds. The “12 minutes” was just 10 retries with backoff added together.</p><p><strong>That reframe mattered. The real question was never “what dies after 12 minutes.” It was “what dies after 15 seconds, reliably, on every attempt.”</strong></p><h3>The Wrong Turns I Took First</h3><p>I want to be honest about the dead ends, because they are the obvious suspects and you will reach for them too.</p><p><strong>MTU.</strong> The classic culprit for “small requests work, big ones hang.” I set the interface MTU down from 1500, confirmed it held, and tested again. Still dead. Then I proved it could not be MTU: the upload failed after exactly 2,293,760 bytes at MTU 1500, and after exactly 2,293,760 bytes at MTU 1400. If packet size were the trigger, that number would move. It did not.</p><p><strong>Bufferbloat.</strong> My next theory. A saturated uplink fills the modem buffer, latency explodes, things reset. So I pinged my provider’s path while hammering the upload. Latency stayed flat at about 22 ms the whole time. No bloat.</p><p><strong>The usual scapegoats.</strong> IPv6 was already off. No VPN, no proxy, no corporate middlebox. A bare connection to the API succeeded, so the client and the TLS stack were fine. The phone hotspot worked perfectly with the same laptop, same binary, same everything.</p><p>Every easy answer was wrong. That is usually the sign you are measuring the wrong thing.</p><h3>The Test That Cracked It</h3><p>I had been testing downloads. A 5.5 GB download held one connection open for 16 minutes at 44 Mbps without a hiccup. So the link was not flaky, and long-lived connections were not the problem.</p><p>The problem was the other direction. Every API request uploads your full conversation context as the request body. I had never tested uploads.</p><p>So I uploaded. A 100 MB upload reset at 2.29 MB and 15 seconds, the exact signature from the real failures. Then I changed one thing: I paced the upload with a rate limit.</p><p>- 5 MB at full speed: dead at 2.29 MB.</p><p>- 5 MB throttled to 700 KB/s: full success.</p><p>- 5 MB throttled to 250 KB/s: full success.</p><p>Read that again. The same 5 MB, more than double the “2.29 MB limit,” went through fine, as long as it was paced. There was no size cap and no time cap. The only thing that failed was an unpaced burst.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*e2y_JECNIPyqMVBnyLwvLg.png" /><figcaption>The Breakthrough: The Throttling Experiment</figcaption></figure><h3>The Real Reason</h3><p>Here is what was actually happening.</p><p>macOS auto-tunes the TCP send buffer. The ceiling is a sysctl called `net.inet.tcp.autosndbufmax`, and the stock value is 4 MB. For a large upload, the kernel grows the buffer toward that ceiling, so a single connection can have several megabytes in flight at once.</p><p>My request body got dumped into the modem’s upstream buffer in one fast burst. That buffer tail-drops at about 2.29 MB. Once it overflowed, the flow stalled, and the server reset it around 15 seconds later. A throttled upload never bursts that far, so the buffer never overflows. The uplink itself is fast, about 24 Mbit when measured cleanly. The burst was the whole problem.</p><p>This is also why it tracked session length so precisely. A short Claude Code session has a small body and never bursts far enough to overflow. A long session carries a multi-megabyte context, bursts past the cliff, and dies. The hotspot worked because the mobile path soaks up the burst differently.</p><p>So the bug was a bad marriage: a generous default send buffer on my Mac, plus a home router with an oversized, badly behaved upstream buffer.</p><h3>The One-Line Fix</h3><p>If no single connection can burst more than a quarter megabyte into the modem, the buffer can never overflow. So cap the send buffer.</p><p>Check your current values first:</p><p>```<br><strong><em>sysctl net.inet.tcp.autosndbufmax net.inet.tcp.sendspace<br>```</em></strong></p><p>Then cap them to 256 KiB:</p><p>```<br><strong>sudo sysctl -w net.inet.tcp.autosndbufmax=262144 net.inet.tcp.sendspace=262144</strong><br>```</p><p>256 KiB is the smallest value that still keeps your full upload speed, which is also the value with the most safety margin.</p><p>After that, my 100 MB upload completed at 3 MB/s with no reset. The cap costs zero throughput on this link, because the bandwidth-delay product (how much data should be in flight to keep the pipe full) is only about 22 KB. A 256 KB ceiling is more than ten times that, but still far below the 2.29 MB overflow point.</p><p><strong>One catch: `sysctl -w` resets on reboot.</strong> To make it stick, load it at boot with a small LaunchDaemon that re-applies the two values. I wrapped the whole thing in a tiny on and off script so I can toggle it on demand, which matters when I am on a different network and want my full burst speed back.</p><h4>Persistent Fix</h4><p>Here is the <a href="https://gist.github.com/arutkayb/f56e7a4e1d8b50a6064645c327749fbc">script</a> as GitHub Gist (with a README) that applies cap + installs LaunchDaemon to persist the fix across reboots. You can use it after you confirm the fix is working for you.</p><h3>How to Tell If This Is You</h3><p>You do not need to reproduce my afternoon. The fingerprint is specific:</p><ul><li>Long AI sessions, large git pushes, or big file uploads reset, but downloads and short requests are fine.</li><li>It dies on your home line but works on a phone hotspot.</li><li>The failure is a connection reset, not a timeout or a DNS error.</li></ul><p>One quick test tells you if uploads are the problem. Push 100 MB at your server and watch it die:</p><p>```<br><strong>head -c 104857600 /dev/zero | curl -4 -sS -X POST — data-binary @- — max-time 120 \</strong></p><p><strong>-w ‘http=%{http_code} up=%{size_upload} time=%{time_total}\n’ \</strong></p><p><a href="https://speed.cloudflare.com/__up"><strong>https://speed.cloudflare.com/__up</strong></a><strong><br></strong>```</p><p>If that resets partway with a tiny `up=` count, you have the same bug. Apply the cap and run it again. It should report the full 104857600 bytes.</p><p>This is not a Claude Code problem, by the way. Any tool that sends large request bodies over an asymmetric line with a bloated router buffer can hit it. AI coding agents just trigger it more, because they upload your whole context on every call.</p><h3>The Takeaway</h3><p><strong>The proper fix lives in the router, not the laptop</strong>. A box that runs smart queue management (SQM, which keeps the upstream buffer from bloating) makes this disappear for every device on the network. Put the ISP router in bridge mode behind something that does fq_codel, and you never think about it again.</p><p>But the per-host send-buffer cap works today, on the hardware I already have, and it is reversible in one command.</p><p>The debugging lesson is the part I will keep. The consistent 15 seconds and the identical byte count across two different MTUs were the real clues, and I almost ignored both because the easy answers felt close enough. When the obvious fix does not work, stop adjusting it harder. Measure the thing you have not measured yet. For me, that was the upload.</p><p>If you have come this far, I guess I can assume you spend real time fighting your tools so they get out of your way. If you want more reads on tech and the lifestyle around it, check out my profile. If a tool you rely on keeps resetting on your home network, run the upload test above before you blame anything else.</p><p>Wish you all the best in your debugging journey!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c27668525aca" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My Idea Finder Had Exactly One Idea: Make It Cheaper]]></title>
            <link>https://levelup.gitconnected.com/my-idea-finder-had-exactly-one-idea-make-it-cheaper-a9a9671bc327?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/a9a9671bc327</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[product-owner]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[claude-code]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Mon, 13 Apr 2026 15:02:30 GMT</pubDate>
            <atom:updated>2026-04-13T15:02:30.524Z</atom:updated>
            <content:encoded><![CDATA[<p>My AI Agent Product Ownership Story: Your agent can’t define “good” for you. You still own the product.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t74nSvlodySEnhga0_Zmow.png" /><figcaption>The recipe to make your agent a better version of Instagram</figcaption></figure><p>A few weeks ago, I developed an internal tool for myself, a niche idea finder program. In my head, it was simple: Fetch the latest comments from the app stores, pull search engine results, cross-reference Google Trends, and surface the real pain points people are complaining about. Find the signal. Build the product.</p><p>I ran it and waited for the magic.</p><p>The top insight my idea finder returned, after rounds of “analysis,” was this: people want subscription prices to be lower, and someone should build a product that helps with that.</p><p>That was it. That was the signal 😅</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/886/1*4QDxBjvFWqnZmSefJT6Asg.png" /><figcaption>Developer sad</figcaption></figure><h4>What the script actually did</h4><p>The script did exactly what I told it to do. It scraped comments. It clustered complaints. It matched them against search volume. It correlated trends. Every step worked. Every box was ticked. There were even some unit tests that all passed, full green.</p><p>The problem was upstream of the code. I had never defined what a “good idea signal” looked like to me. I mean, I did give some examples and some ideas on how it should be. Not in a way you could write a function against. I just had a vague feeling that I’d recognize one when I saw it. But it was not precise, not like I am paying tens of thousands of dollars to get this product from a 3rd-party company. If it were the case, I wouldn&#39;t have let them hallucinate on my money and half-baked ideas.</p><p>So when the agent wrote the correlation logic, it optimized for what was measurable, not what was meaningful. What does meaningful even mean here? Dude… I need a philosophy degree to be a good product owner.</p><p>The loudest complaints across the largest cluster of people. That’s “price is too high,” every time, in every category. Of course it is. That’s gravity.</p><p>The agent wasn’t wrong in the end.</p><h4>The third-party company trap</h4><p>When I started coding with Claude Code for days, then weeks, then months, my working model was this: treat the agent like a third-party company I’m hiring to build things for me. Write a brief, hand it off, review the output, iterate.</p><p>That model held up for small tasks. It fell apart on anything that required taste, domain expertise, and hard work on the product side.</p><p>As an experienced developer, I already know how third-party engagements go wrong. The requirements looked clear. The vendor delivered something that technically matches. You open it and it’s not what you wanted, and the gap between “what you said” and “what you meant” is where the whole project lived.</p><p>Agents have the same failure mode, except faster and cheaper, so you stop noticing it.</p><p>You blow through 40 iterations in a day, each one slightly off, and you never stop to ask the uncomfortable question: <strong>Do I actually know what I want here?</strong> <strong>Could I describe the target output to a human, concretely, before any code is written?</strong></p><p>For my idea finder, the answer was no. I was outsourcing a decision I hadn’t made.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bZsKTlJ9Oxn5mYQR0A8GIg.png" /><figcaption>Study philosophy, I mean it</figcaption></figure><h4>The questions only you can answer</h4><p>There’s a category of questions your agent physically cannot answer for you. Not because it’s not smart enough. Because the answer lives in your head and nowhere else.</p><p>For the idea finder, the questions I hadn’t answered were things like:</p><ul><li>What counts as a “good” signal? A complaint with high volume? High emotional intensity? Low competition? A complaint that implies a workflow people are already paying to solve badly?</li><li>Why am I even scraping store reviews in the first place? Are indie app reviewers representative of the market I want to build for? Or am I just fishing where the water is shallow?</li><li>What does a valid output look like? Can I write down three real examples of “good signals” from products I admire, so the agent has something to match against?</li><li>What am I going to reject? Price complaints. Generic UX gripes. “Make it free.” If I can’t list what to filter out, my signal is going to drown in noise.</li></ul><p>None of these are coding questions. They’re product questions. And I had handed them all to the agent by accident, just by not writing them down.</p><p>When the script returned “people want cheaper subscriptions,” it wasn’t a bug. It was the honest answer to a brief I hadn’t written.</p><h4>Target output examples, before anything else</h4><p>The fix was embarrassingly simple, yet requires diligence and proper hard work instead of only &quot;talking to an agent&quot;. It’s the lesson I keep learning over and over.</p><p>Before the agent writes a single line, I now force myself to produce target output examples, run a complete manual round myself if possible. Not acceptance criteria in the abstract. Actual, concrete examples of what “success” looks like if this thing ran perfectly.</p><p>For the idea finder, that meant sitting down and writing three fake “ideal” outputs by hand. “Users of budgeting apps in the EU keep asking for shared household budgets with separate personal envelopes, and three of the top four apps either don’t support it or charge for it as a premium tier.” That kind of thing. Specific. Opinionated. Impossible to mistake for “lower the prices.”</p><p>Once I had three examples I actually wanted to see, the whole script changed. The filters changed. The correlation logic changed. Half the data sources I was scraping went in the trash because they couldn’t produce the shape of output I was now asking for. Maybe app store comments were the wrong place to look at all. Maybe I needed forum threads, support tickets, Reddit niche subreddits. The target output was telling me where to fish.</p><p>That reshaping was never going to come from the agent. It came from me writing down what “good” meant, in examples, before pretending the agent could find it.</p><h4>Owning the product means owning the definitions</h4><p>Here’s the shift that’s been building in me for months, and the idea finder just made it loud.</p><p>When I delegate execution to agents, I don’t get to delegate the product. I still have to own it. Owning it doesn’t mean writing the code. It means owning the definitions the code depends on.</p><p>What “good” means for this output. What “correlated” means for this data. What “done” means for this PRD. What “a signal worth chasing” means versus “noise that happens to be loud.” What I’m willing to reject, even when the agent produces it confidently.</p><p>The more I let the agent handle the typing, the more I have to work on my own methods of thinking about the product. Summaries I can actually skim. Diagrams I can actually read. Documentation I can come back to in a week and recognize. Target output examples for every non-trivial task. A running sense of the state of the product that doesn’t live only in transcripts.</p><p>I used to draw a lot of diagrams by hand when I was the one writing every line. I thought I drew them for documentation. Nope! I drew them to understand what I was building. Now that the agent is doing the building, I need those diagrams more, not less, because they’re the only thing that keeps me in the driver’s seat.</p><h4>The test I run on myself now</h4><p>Before I hand anything non-trivial to an agent, I try to answer one question honestly: could I describe the target output to a smart human collaborator, with examples, and have them push back where I’m being vague?</p><p>If I can’t, the task isn’t ready for an agent. It’s not even ready for me yet. What it’s ready for is ten minutes of me sitting with a notebook, writing down what “good” looks like for this specific thing, on this specific day, for this specific product.</p><p>Ten minutes of that will save me from building another idea finder that confidently tells me to make things cheaper.</p><h4>The takeaway</h4><p>Agents are fast, patient, and relentlessly literal. They execute whatever definition of “good” you encode into their inputs, even if that definition is “the loudest thing in the dataset.” They can’t nudge you when your framing is off. They can’t know what’s in your head. They can’t own your product.</p><p>You can. And if you don’t, nobody will, because the agent is busy shipping the wrong thing correctly.</p><p>Own the definitions. Write the target output examples. Draw the diagrams for yourself, not for the agent. The agent will do the rest, well.</p><p>If you have come this far, I guess you are interested in AI and tech. If you want more reads in tech and lifestyle around tech, don’t forget to check out my profile. If you wanna choose your next read immediately, you can go for <a href="https://levelup.gitconnected.com/i-added-one-step-to-my-ai-workflow-and-it-boomed-the-quality-cbb5e3a2c221">I Added One Step to My AI Workflow, and It Boomed the Quality</a>.</p><p>Always review what AI generates before pushing. It handles the tedious stuff, you stay the engineer and product owner.</p><p>Wish you all the best in your AI journey!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a9a9671bc327" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/my-idea-finder-had-exactly-one-idea-make-it-cheaper-a9a9671bc327">My Idea Finder Had Exactly One Idea: Make It Cheaper</a> was originally published in <a href="https://levelup.gitconnected.com/">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Added One Step to My AI Workflow, and It Boomed the Quality]]></title>
            <link>https://levelup.gitconnected.com/i-added-one-step-to-my-ai-workflow-and-it-boomed-the-quality-cbb5e3a2c221?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/cbb5e3a2c221</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Mon, 06 Apr 2026 17:14:09 GMT</pubDate>
            <atom:updated>2026-04-06T17:14:09.548Z</atom:updated>
            <content:encoded><![CDATA[<p>Thanks to Claude Code Leak, which showed how the internal Claude Code team works, I am now catching bugs that code review misses</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Bx9URjT4lJqyvl3PC0USng.png" /><figcaption>My simple workflow</figcaption></figure><p>Everything started with a huge feature request last week.</p><p>I generated a detailed plan for restructuring a Flutter project. It ended up having five tasks, 30+ implementation steps, 4 big Architecture Decision Records. The plan covered everything: error handling patterns, folder structure, dependency injection, testing strategy. It looked perfect to me.</p><p>Before, I would’ve sent this straight to execution. An agent picks up the plan, starts writing code, and I review the output later. That was my AI workflow for months. Plan, execute, review.</p><p>A couple of weeks ago, Claude Code accidentally pushed their source code to public (see <a href="https://www.reddit.com/r/ClaudeAI/comments/1s9d9j9/claude_code_source_leak_megathread/">Claude Code Source Leak Megathread on Reddit</a>). After checking what they have myself and reading the community analysis over it, I decided to adopt some practices from them. And, I implemented a validation step between the plan and execution. Ten minutes. Zero code written.</p><p>The result: seven issues surfaced, including unverified package versions that could’ve broken the build, a task that touched 20+ files per step without checkpoint guidance, and acceptance criteria that were too vague for an agent to verify against.</p><p>Neither my agents nor my half-baked (especially when they are my own stupid indie projects) code review would have caught these before (at least some of them, I&#39;m still reviewing them OK?!)</p><h4>The Plan-Execute Trap</h4><p>Most AI-assisted development workflows have two phases. You describe what you want (the plan), then an agent builds it (the execution). Maybe you add code review at the end. This is the setup you’ll find in most tutorials, most tools, most workflows.</p><p>It looks efficient. You’re not wasting time on ceremony. You plan, you execute, you review. Three clean steps.</p><p>The problem is the gap between planning and execution. Plans contain assumptions. Some are explicit, like “use fpdart for error handling.” Some are implicit, like assuming a package version exists, or assuming a directory structure is already in place, or writing “verify the feature works” as an acceptance criterion without defining what “works” means.</p><p>Agents don’t question these assumptions. They execute. If your plan says “implement authentication,” the agent will make a reasonable guess about what that means. Its guess might be wrong. You won’t find out until code review, after the agent has built an entire feature on top of that guess.</p><p>I kept running into this. Not on small tasks. On the bigger ones, the ones where planning felt thorough and comprehensive. The more detailed the plan, the more hiding spots for unresolved decisions.</p><h4>What Falls Through the Cracks</h4><p>Here’s what I was finding in code review that shouldn’t have made it that far:</p><p><strong>Unverified dependencies.</strong> A plan says “add fpdart ^1.1.0.” Does that version exist? Does it support the Dart SDK version in the project? The plan doesn’t check. The agent doesn’t check. It adds the line to pubspec.yaml and moves on. If it breaks, you find out during execution, not planning.</p><p><strong>High-risk steps without guardrails.</strong> A task that touches 20+ files in a single step is risky. If something breaks halfway through, you need to know where to roll back to. But the plan just lists the files and moves on. No checkpoints, no intermediate verification.</p><p><strong>Vague acceptance criteria.</strong> “Verify the DI setup works” isn’t something an agent can verify. What does “works” mean? All dependencies resolve? The app compiles? A specific test passes? The vaguer the criterion, the more the agent has to guess. And guessing is where bugs come from.</p><p><strong>Orphaned references.</strong> A plan mentions a file in its “Files Touched” section that no step actually creates or modifies. Or a step references a directory that doesn’t exist yet without a creation step. These are small things. They cascade.</p><p><strong>Stale assumptions.</strong> The plan was written against a specific branch state. By the time execution starts, has anything changed? Are there uncommitted changes that might conflict? The plan doesn’t know.</p><p>Every one of these is fixable. But they’re only fixable if you catch them before execution starts. Once code is being written, these assumptions become load-bearing walls. Changing them means rework.</p><h4>The Validation Gate</h4><p>The fix was adding a single step between planning and execution. I call it validate-plan. It reads the plan file and runs five checks:</p><p><strong>Plan syntax.</strong> Does the plan follow the expected structure? Are there acceptance criteria for each task? Are dependencies between tasks declared? This is mechanical, like a linter for plans.</p><p><strong>Scope boundaries.</strong> Does the plan stay within what was originally requested? Plans tend to grow. A task that started as “migrate error handling” quietly expands to include refactoring three unrelated modules. Scope creep in a plan becomes scope creep in execution, except now an agent is doing the creeping and you won’t notice until review.</p><p><strong>Decision register integrity.</strong> Every architectural decision in the plan should map to a documented rationale. If the plan says “use feature-first folder structure,” is there a record of why? If not, the agent has no way to make judgment calls when edge cases come up during execution.</p><p><strong>Execution step viability.</strong> Can each step be completed as described? Are the referenced files and directories real? Are the tools and commands available? Are the steps ordered correctly based on their dependencies?</p><p><strong>File and folder readiness.</strong> Does the current state of the repository match what the plan expects? Are there uncommitted changes that could conflict? Missing directories that need to be created first?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*g0C3ZKLgtBKZQkv0aIeWQw.png" /><figcaption>Part of a list of real validation warnings</figcaption></figure><p>The output is a report: blockers (must fix before execution) and warnings (should address, won’t break things). In the Flutter project case: zero blockers, seven warnings. Ten minutes to generate. All seven warnings were things I fixed in the plan before a single line of code was written.</p><h4>Why Code Review Doesn’t Catch This</h4><p>Code review is good at catching implementation bugs. Wrong logic, missing edge cases, bad patterns. It’s not good at catching planning bugs. Funnily, there is no code before the execution at all. And, you are handing over the plan to an agent and believing that the code will be sound! Not happening.</p><p>By the time you’re reviewing code, the architectural decisions are already made. The folder structure exists. The dependency versions are locked. The acceptance criteria were already interpreted by the agent, one way or another.</p><p>If the plan said “use injectable for DI” but didn’t specify whether to use lazy or eager initialization, the agent picked one. Code review will show you which one it picked. But at that point, you’re evaluating “is this acceptable?” instead of “what should this be?” Those are different questions. The second one should have been answered before any code was written.</p><p>Code review also can’t catch what wasn’t done. If a plan was missing a step, the agent didn’t skip it. It was never there. There’s nothing in the code to review because the work was never performed. You’d have to notice the absence of something, and that’s much harder than noticing the presence of a bug.</p><p>Validation catches absences. “This plan doesn’t verify the output after a high-risk step.” “This acceptance criterion is not agent-verifiable.” “This dependency version hasn’t been confirmed.” These are things that are visible in a plan and invisible in code.</p><h4>What Actually Changed</h4><p>Before adding the validation gate, I’d estimate about 30–40% of the issues I caught in code review were things that shouldn’t have made it past planning. <em>Not</em> code bugs. <strong>Planning bugs</strong>. Assumptions that should have been resolved, decisions that should have been made, criteria that should have been sharpened.</p><p>After adding it, that category dropped significantly. The issues I find in code review now are real implementation issues, things that couldn’t have been caught without seeing the actual code. That’s what code review is supposed to be for.</p><p>The bigger shift is how I think about plans. Writing a plan used to feel like the last creative step before handing off to automation. Now it feels like a draft. The validation step is the editorial pass. It makes the plan tighter, more explicit, more executable. And it takes ten minutes.</p><p>It’s cheaper to fix a plan than to fix code. That sounds obvious when you say it out loud. But most AI workflows skip the step that makes it actually true.</p><h4>The Takeaway</h4><p>If you’re using AI agents for anything beyond small one-shot tasks, your workflow probably has a gap between planning and execution. A gap where assumptions live unchallenged, where decisions are implied but not recorded, where “works” means different things to you and the agent.</p><p>Adding a validation step there doesn’t require new tools or frameworks. It requires the discipline to ask: is this plan actually ready to execute? Not “does it look good,” but “can an agent execute this without making any decisions on my behalf?”</p><p>If the answer is no, the plan isn’t done yet. And that’s a much better time to find out than during code review.</p><p>I’ve been building this validation step as a custom Claude Code skill that plugs into my planning-to-execution pipeline. If you’re interested in how the full workflow fits together, I wrote about the broader approach in <a href="https://medium.com/medium.com/@arutkayb/i-stopped-trying-to-make-agents-smarter-and-started-making-my-inputs-better-b9d0b84ffb02?source=your_stories_outbox---writer_outbox_published-----------------------------------------">By the time execution starts, there should be nothing left to decide</a>.</p><p>If you have come this far, I guess I can assume that you are interested in AI and tech. If you want more reads in tech and lifestyle around tech don’t forget to check out my profile. If you wanna choose your next read immediately, you can go for this one: <a href="https://medium.com/gitconnected/i-forgot-what-i-worked-on-yesterday-705644ab8527">I Forgot What I Worked On Yesterday</a></p><p>Always review what AI generates before pushing. It handles the tedious stuff, you stay the engineer.</p><p>Wish you all the best in your AI journey!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cbb5e3a2c221" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/i-added-one-step-to-my-ai-workflow-and-it-boomed-the-quality-cbb5e3a2c221">I Added One Step to My AI Workflow, and It Boomed the Quality</a> was originally published in <a href="https://levelup.gitconnected.com/">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[201 Claude Code Agent Personas. I Installed Zero]]></title>
            <link>https://levelup.gitconnected.com/201-claude-code-agent-personas-i-installed-zero-b45e4629512d?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/b45e4629512d</guid>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[apps]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Mon, 30 Mar 2026 10:15:34 GMT</pubDate>
            <atom:updated>2026-03-31T15:29:55.269Z</atom:updated>
            <content:encoded><![CDATA[<p>Then I finally understood what an agent actually is</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/912/1*eMnooeOK8rr_Hl9Em4-CYg.png" /><figcaption>Searching for &quot;the&quot; agent</figcaption></figure><p>There’s a repository out there, <a href="https://github.com/msitarzewski/agency-agents">agency-agents</a>, with 200+ Claude Code agent personas well clustered under their expertise, such as Marketing, Sales, Development, everything a tech business might need. Each one is a detailed character with personality traits, domain frameworks, code examples, and communication style guidelines. Some are genuinely impressive, to be honest.</p><p>I spent a few hours going through the repository and the agent details. Going through them helped me understand something that’s easy to miss when you’re new to agentic development: agents and skills solve completely different problems.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IddJVbHluEYDcx5e7HEC5A.png" /><figcaption>Some agents from the repository</figcaption></figure><h4><strong>What Agents Actually Do</strong></h4><p>An <strong>agent</strong> in Claude Code is essentially a persona. It tells Claude who to BE for the duration of your session. A Security Engineer agent comes loaded with threat modeling methodologies, OWASP frameworks, secure coding opinions, and a specific communication style — “I approach every system with an adversarial mindset.”</p><p>That sounds powerful. And it can be, for the right situation.</p><p>Agents are great for ad-hoc advice. You’re staring at a weird architecture decision and you want a Software Architect’s perspective. You load the persona, have the conversation, and close it out.</p><p>But that’s it. The next session? You load it again. Start over. No memory of the project. No continuity. No phases. No workflow.</p><h4><strong>What Skills Actually Do</strong></h4><p>A <strong>skill</strong> is different. It tells Claude what to DO, and in which way you want Claude to do that. Not who to be.</p><p>Specifically:</p><p>- What phases to run through</p><p>- What files to read and write</p><p>- What model to use for which step</p><p>- What tools are allowed or restricted</p><p>- What the output looks like at the end</p><p>You run a skill, it produces something concrete, and next session you can pick up exactly where you left off. The skill doesn’t care about personality. It cares about process.</p><p>That’s a fundamentally different thing.</p><h4><strong>The Problem with Installing 300 Lines of Personality</strong></h4><p>Here’s where I started developing a skepticism about full agent installs.</p><p>Those 201 personas are 300-500 lines each. Personality guidelines. Communication style. How the agent responds to pushback. Preferred frameworks. Examples of good vs. bad output.</p><p>Every time you invoke an agent, all of that loads. Every single call. Most of it is noise for your specific situation.</p><p>The Security Engineer agent has hardcoded opinions about how to structure a threat model. But your system doesn’t look like the system the agent was designed for. Your stack, your risk surface, your team’s tolerance for ceremony, all different.</p><p>You end up fighting the agent as often as using it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6xcK-XwJ7CntlU1QH--jHw.png" /><figcaption>400-line agent vs 30-line skill</figcaption></figure><p>The extraction from an agent to a skill isn’t refactoring. It’s a contract boundary. The skill describes what to do, and the orchestrator decides when and with what data.</p><h4><strong>The Valuable Part Is Buried Inside</strong></h4><p>But here’s what I noticed after a few hours of reading through these personas. Every good agent has a gem inside it. One specific framework. One methodology that would genuinely improve a workflow if applied correctly.</p><p>The Security Engineer? STRIDE threat modeling. A structured way to think about adversarial scenarios: Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege. That’s a real, battle-tested framework. Worth having.</p><p>The problem isn’t the content. It’s the packaging. 400 lines of persona wrapper around 20 lines of actual value.</p><h4><strong>What I Did Instead</strong></h4><p>I didn’t install any agents for my development workflows. I extracted the frameworks instead. Two small additions to skills I already had running:</p><ol><li>My security review skill now starts with an adversarial threat assessment phase. I took the STRIDE model out of the Security Engineer agent and embedded the questions directly into the review workflow. No persona needed.</li><li>My planning skill now generates an ADR automatically when a change involves an architectural decision. Borrowed the template from the Software Architect agent. Works exactly the same.</li></ol><p>Zero persona bloat, great addition to the skills I already tailored.</p><p>The security review runs the same way every time, on every project, without loading 400 lines of Security Engineer personality. The ADR template shows up exactly when it should, without me having to remember to ask for it.</p><p>That’s the difference between a workflow and a persona. One is reliable. The other depends on you remembering to use it.</p><h4><strong>The One Question Worth Asking</strong></h4><p>Before you install any agent, from this repo, from anywhere, ask one question: <strong>What is the one thing this agent knows that my current setup does not?</strong></p><p>Not what the agent does in general, or not what persona it assumes. <em>The one specific piece of knowledge that would make your existing workflow better.</em></p><p>Find that piece. Extract it. Embed it where it belongs in your workflow, and leave the rest behind.</p><p>Most of the time, the answer is a framework, a template, or a checklist. Something you can write in 15 to 20 lines and slot directly into the right skill phase. No personality guidelines needed. No hardcoded communication style.</p><p>The agent was a container for the knowledge. You don’t need the container.</p><h4><strong>Why This Matters for How You Work</strong></h4><p>This distinction, agent vs. skill, persona vs. process, matters more as you build out your AI-assisted development setup.</p><p>If everything you use is persona-based, your workflow depends on you knowing which persona to invoke at which moment. You become the orchestrator, manually selecting the right character for each situation. That’s cognitive load you’ve added to yourself.</p><p>If your setup is skill-based, the workflow knows when to apply what. The adversarial threat assessment happens because the security review skill runs it. The ADR gets generated because the planning skill detects an architectural decision. You’re not managing personas. You’re running repeatable processes. That’s the shift worth making.</p><p>I’ve been building out this kind of skill-based setup for a while now. If you want more reads in tech and lifestyle around tech, don’t forget to check out my <a href="https://arutkayb.medium.com/">profile</a>. If you wanna choose your next read immediately, you can go for this one: <a href="https://medium.com/@arutkayb/i-forgot-what-i-worked-on-yesterday-705644ab8527">I Forgot What I Worked On Yesterday</a></p><p>Wish you all the best in your AI journey!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b45e4629512d" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/201-claude-code-agent-personas-i-installed-zero-b45e4629512d">201 Claude Code Agent Personas. I Installed Zero</a> was originally published in <a href="https://levelup.gitconnected.com/">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Forgot What I Worked On Yesterday]]></title>
            <link>https://levelup.gitconnected.com/i-forgot-what-i-worked-on-yesterday-705644ab8527?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/705644ab8527</guid>
            <category><![CDATA[developer-tools]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Fri, 27 Mar 2026 08:20:16 GMT</pubDate>
            <atom:updated>2026-03-31T15:29:08.276Z</atom:updated>
            <content:encoded><![CDATA[<p>Coding with agents is great, but it comes with a cost</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vmpP9YXtmziZq065saK-1g.png" /><figcaption>Me, me, me. See <a href="https://arutkayb.github.io/">https://arutkayb.github.io/</a></figcaption></figure><p>Since I started to work with agents, I have stopped knowing what I did each day. Not because I did not own the AI work. I understood everything that it has done as a responsible senior developer, for sure! Yet, the context switch and mental load were messing with me.</p><p>I mean literally, I’d sit down the next morning, open my laptop, and draw a blank on what I shipped, what I fixed, what I decided the day before. The tools were doing a lot. I was doing a lot. But none of it was sticking.</p><p>This started to be a problem at work as I started to report the necessary details during the dailies, as well as losing track of details I should&#39;ve given attention to.</p><p>It was clear at some point: I was developing brain fog that is way more dense, by using Claude Code than doom scrolling.</p><h4><strong>The Day That Made Me Build Something</strong></h4><p>A few weeks ago, I ran 22 Claude Code sessions across 6projects. 886 messages. In a single day.</p><p>The energy I spent and the output were the kind of things that used to take a week or so. Bugs fixed, features shipped, experiments run, a whole pipeline redesigned, all before dinner. And I felt great about it while it was happening.</p><p>That night, when I tried to actually reflect on what I’d done, I couldn’t reconstruct it. I remembered the shape of the day, something about calendar bugs, something about a pricing test, but the specifics were gone. The wins, the gotchas, the decisions I’d made and why, all blurred together.</p><p>I wrote a note to myself: “The cognitive cost of agentic parallelism. High throughput, but declining awareness.” (The actual note was more like &quot;I often realize that idk what I did these days&quot;)</p><p>That note became my tiny open source project <a href="https://github.com/arutkayb/dear-diary"><strong>dear-diary</strong></a></p><h4><strong>What dear-diary Does</strong></h4><p>Claude Code stores your conversation transcripts as raw JSONL files in <em>~/.claude/projects/</em>. They’re noisy, full of tool calls, thinking blocks, internal metadata. There’s no way to look at them and understand what actually happened.</p><p><strong>dear-diary</strong> cleans that up in two stages.</p><p><strong>Stage 1</strong> is a pure Python script called <em>extract.py</em>. Zero external dependencies — no pip, no virtual environment, just the standard library. It scans your Claude session files for a given date, strips the noise, groups everything by project, and writes a clean JSON file. No LLM is involved at this stage. Same input, same output, every time.</p><p><strong>Stage 2</strong> is a <strong><em>Claude Code skill</em></strong> called <em>/diary-review</em>. You run it from the project directory, and it reads the diary JSON from Stage 1 and produces a structured reflection: Day Overview, What I Worked On, Wins, Learnings, Challenges, Patterns, Key Takeaways, and Seeds for Content (blog angles, basically).</p><p>The <strong>skill</strong> has two modes. Auto mode runs parallel subagents against each project and synthesizes everything without you. Reflection mode — the default — is different. It talks to you first.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Sxz034QUu50-_rZ3-tX_4w.png" /><figcaption>Diary samples <a href="https://arutkayb.github.io/diary/">https://arutkayb.github.io/diary</a></figcaption></figure><h4><strong>The Thing I Didn’t Expect</strong></h4><p>I thought I was building a logging tool. I was wrong.</p><p>The first time I ran <em>/diary-review</em> in reflection mode, it gave me a quick summary of the day — project names, what was done — and then asked me a specific question. Not “how did the day go?” but something like: “You ran three production bug fixes today, all triggered by funnel analytics, not crash logs. What made you look at the funnel instead of Crashlytics?”</p><p>That question surfaced something I had completely lost. I sat down and typed the answer. Then it asked a follow-up.</p><p>By the end of that 10-minute conversation, I had a reflection that captured not just what I did, but why I made the choices I made, what I was worried about, and what I was actually proud of.</p><p>That’s different from logging. The manual Q&amp;A process forces awareness, it makes you realize what you actually accomplished, not just what you touched. The reflection question bank is organized by the shape of your day: bug-heavy days get different questions than multi-project days or feature-shipped days. It’s contextual, not generic.</p><p>One word I wrote in my diary for that day: “euphorically exhausting.” Touching 6 projects in a day with agents is both the blessing and the curse.</p><h4><strong>The Funny Part</strong></h4><p><em>dear-diary</em> itself was built in a single day, using the same workflow it’s designed to reflect on.</p><p>A bunch of commits, step by step: CLI skeleton, output writer, session discovery, date filtering, message extraction, full pipeline, tests. Then the skill, then iteration on friction (inline Python in Claude skills triggers security heuristics — had to extract helper scripts to fix that), then a README, then an open-source release.</p><p>The next morning, I ran the diary review on the day I built it. That first reflection made clear the tool wasn’t about logging. It was about building awareness of your own work. About feeling proud of what you shipped instead of wondering what day it even was.</p><h4><strong>A Different Kind of Productivity</strong></h4><p>I’ve thought about what actually changed. It’s not speed. <em>dear-diary</em> doesn’t make me write code faster.</p><p>It’s awareness. And awareness compounds. When you know what you shipped yesterday, you make better decisions about today. When you can articulate a win clearly, it stops blurring into the noise.</p><p>The repo is at <a href="https://github.com/arutkayb/dear-diary">github.com/arutkayb/dear-diary</a>. If you use Claude Code and have been feeling the same blur at the end of the day, give it a try. And do not hesitate to open a PR to extend it to agentic tools other than Claude Code.</p><p>If you have come this far, I guess I can assume that you are interested in AI and tech. If you want more reads in tech and lifestyle around tech don’t forget to check out my <a href="https://arutkayb.medium.com/">profile</a>. If you wanna choose your next read immediately, you can go for this one <a href="https://medium.com/p/b9d0b84ffb02">By the time execution starts, there should be nothing left to decide</a></p><p>Always review what AI generates before pushing. It handles the tedious stuff, you stay the engineer.</p><p>Wish you all the best in your AI journey!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=705644ab8527" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/i-forgot-what-i-worked-on-yesterday-705644ab8527">I Forgot What I Worked On Yesterday</a> was originally published in <a href="https://levelup.gitconnected.com/">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[By the time execution starts, there should be nothing left to decide]]></title>
            <link>https://arutkayb.medium.com/i-stopped-trying-to-make-agents-smarter-and-started-making-my-inputs-better-b9d0b84ffb02?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/b9d0b84ffb02</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[agents]]></category>
            <category><![CDATA[claude-code]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Tue, 17 Mar 2026 18:53:41 GMT</pubDate>
            <atom:updated>2026-03-18T19:17:27.420Z</atom:updated>
            <content:encoded><![CDATA[<h4>The agent isn’t broken. The input was.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5r72ig5EkfHSTDoCQM8NCA.png" /><figcaption><a href="https://9gag.com/gag/aYQ0wYv?utm_source=copy_link&amp;utm_medium=post_share">https://9gag.com/gag/aYQ0wYv?utm_source=copy_link&amp;utm_medium=post_share</a></figcaption></figure><p>There’s a version of AI-assisted development that looks productive but isn’t. You describe something, the agent writes code, you review it, realize it missed the point, describe it again — slightly differently — and the cycle repeats. The agent isn’t broken. The input was.</p><p>I kept running into this loop. Not because the tools were bad, but because I was treating AI agents like they had judgment they don’t have. Eventually, I stopped trying to make agents smarter and started making my inputs better. What came out of that was a structured workflow I’ve been refining for weeks — and it changed not just how I build, but how I think about development.</p><h3>The Real Problem With “Just Ask AI”</h3><p>When you delegate a task to another person, they ask clarifying questions. They flag ambiguity. They tell you when your requirements don’t make sense. Agents don’t do that — or at least, they do it at the wrong time: mid-execution, when undoing mistakes costs more than the original task.</p><p>The root cause is almost always the same: the requirements going into execution contain open questions. Not always obvious ones. Sometimes it’s something as subtle as “what counts as done?” Sometimes it’s a decision that seemed clear in your head but never made it into writing.</p><p>I started thinking about this differently after a project where I handed an agent a solid-sounding task and got back something technically correct but architecturally wrong. The agent had made a reasonable guess where I should have made a decision.</p><p>That’s when I landed on the principle I now design everything around:</p><p>By the time execution starts, there should be nothing left to decide.</p><h4>Front-Loading Human Judgment</h4><p>The shift this required was counterintuitive. Instead of spending less time upfront (the whole appeal of AI), I started spending more — deliberately, in structured stages, before any code got written.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/581/1*1_dYCx-XmcMKcJrVnvLGtQ.png" /><figcaption>new-idea skill to kick off a new thing</figcaption></figure><p>The idea is simple: every stage of development resolves the open questions produced by the previous stage. Ideation produces questions about what you’re actually building. Specification resolves those and produces questions about technical approach. Planning resolves those and produces a step-by-step execution path with no remaining ambiguity.</p><p>By the time an agent runs, it’s not reasoning under uncertainty. It’s executing a plan someone already thought through. That someone is me.</p><p>This sounds like more work. It is — up front. But the execution phase becomes dramatically faster and more accurate. More importantly, when something does go wrong, it’s easy to trace back to which stage the assumption broke down. That’s something you can fix. A tangle of agent-generated code built on a vague brief is much harder to untangle.</p><h4>Two Different Requirements, One Design</h4><p>Here’s the part that took me longest to get right: the artifacts produced by this workflow serve two very different audiences simultaneously.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cHZpXy2JfEw2i2fhQZrWhg.png" /><figcaption>PRD pipeline for big and longs tasks</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5FPrDkA_pCurrWIoOX121g.png" /><figcaption>One shot pipeline for smaller yet complex tasks</figcaption></figure><p>Agents need precision. They need machine-verifiable acceptance criteria, not “the feature should work well.” They need explicit decisions, not implied ones. They need each step scoped tightly enough that success or failure is unambiguous. A plan that says “implement authentication” is useless to an agent. A plan that says “implement JWT-based auth with 1-hour expiry, refresh tokens stored in HttpOnly cookies, endpoint returns 401 with error code on invalid token” — that’s something an agent can execute against.</p><p>Humans need narrative. I need to be able to open a plan file and understand what I was thinking when I wrote it. I need to see why certain decisions were made, what alternatives were considered, what risks were flagged. I need to be able to edit a plan before running it, and have that edit mean something.</p><p>Most frameworks optimize for one of these. I wanted both.</p><p>The answer was keeping everything in plain Markdown. Plans are readable documents, not database records. Every plan file has a clear structure: what’s being built, what each step does, what “done” looks like. A human can review and edit it before execution. An agent can read it and execute it step by step, checking off each item as it goes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/678/1*ktD8eIl1XzUPzfTQuQ2uwg.png" /><figcaption>skill-generated structured outputs and logs</figcaption></figure><p>The same file serves both purposes. That constraint — that every artifact has to be legible to a human and executable by an agent — shaped every design decision in the workflow.</p><h4>Execution That Doesn’t Lose Its Place</h4><p>One of the underrated problems with AI-assisted development is context fragility. You have a great session, make good progress, close the terminal, and the next day you’re back to square one explaining what you were doing.</p><p>I solved this by treating execution state as a first-class artifact. Every task gets its own folder. Plans track their own progress with checkboxes. There’s a separate state file that records which steps completed, what was committed, what’s left. Execution always happens on a dedicated branch.</p><p>The result: resuming a task isn’t a memory exercise. You run the same command, the workflow reads the state file, and picks up exactly where it left off. The conversation context is gone. The execution context isn’t.</p><p>This also means the plan file becomes a historical record. After a task is done, I can look at the plan and see every step, in order, with the logic behind each one. That’s more useful than git blame.</p><h4>The Project Log No One Thinks to Build</h4><p>There’s a second layer I added that I didn’t anticipate needing: a project-level log that tracks everything that happened, in reverse chronological order.</p><p>Not code changes — git handles that. But decisions. Pivots. The time I abandoned an approach halfway through because I realized a dependency was wrong. The time I changed the data model three days in. These are the things that never make it into commit messages but are exactly what future-me (or future agents) need to understand why the codebase looks the way it does.</p><p>Every workflow stage appends to this log automatically. Decisions I make manually get logged with a dedicated command. The result is a single file — a timeline — that gives a complete narrative of the project. One file. Start here when resuming after a break. Read the decisions folder when something seems weird about a past choice.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/779/1*HsWi077FocDa45Nuq4nxjg.png" /><figcaption>SUMMARY, historical record for humans and agents</figcaption></figure><p>The pattern I keep coming back to is: clarity compounds. Each bit of context you capture makes the next decision easier. Each decision you log makes the next agent run smarter. The overhead of maintaining this log is trivial. The payoff, over a project lifecycle, is significant.</p><h3>What Changed</h3><p>Before this, I’d estimate about 60–70% of my back-and-forth with agents was resolving ambiguity that should have been resolved before I started. Requirements that seemed clear to me but weren’t precise enough to execute. Decisions I thought were made but hadn’t been written down.</p><p>Now that percentage is much lower. Not zero — I still discover things during execution that change the plan. But they’re real discoveries, not just the cost of vague inputs.</p><p>The bigger shift is harder to quantify. I think more clearly about what I’m building before I start building it. The workflow forces a kind of structured deliberation — not paralysis, but rigor. Writing acceptance criteria that an agent can verify against turns out to be good practice whether an agent ever reads them or not. You learn a lot about what you actually want when you have to make it falsifiable.</p><h3>The Takeaway</h3><p>If you’re using AI agents and finding yourself in loops — re-explaining, course-correcting, undoing — the problem is probably not the agent. It’s that the inputs contain decisions that weren’t made yet.</p><p>The fix isn’t better prompting. It’s a workflow that forces you to make all the decisions before execution begins. One that produces artifacts a human can read and edit, and an agent can execute without guessing.</p><p>Front-load the thinking. Make everything readable. Trust the execution.</p><p>I’ve been building this framework as a set of custom Claude Code skills and have been running it on real projects for several weeks. If you want to know more about how I’ve structured the workflow or the tooling behind it, drop a comment — happy to go deeper on any part of it.</p><p>A few people have asked about the actual skill files behind this workflow. If you’d find it useful to have the raw files — the ones that power each stage of this pipeline — drop a comment below. If there’s enough interest, I’ll update this article with direct links so you can plug them straight into your own setup.</p><p>If you have come this far, I guess I can assume that you are interested in AI and tech. If you want more reads in tech and lifestyle around tech don’t forget to check out my <a href="https://arutkayb.medium.com/">profile</a>. If you wanna choose your next read immediately, you can go for this one <a href="https://medium.com/@arutkayb/frustrated-with-boring-review-comments-resolve-them-at-once-with-claude-code-9668da61056b">Frustrated with Boring Review Comments? Resolve them at once with Claude Code Custom Skills and Commands</a></p><p>Always review what AI generates before pushing. It handles the tedious stuff, you stay the engineer.</p><p>Wish you all the best in your AI journey!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b9d0b84ffb02" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Frustrated with Boring Review Comments?]]></title>
            <link>https://arutkayb.medium.com/frustrated-with-boring-review-comments-resolve-them-at-once-with-claude-code-9668da61056b?source=rss-5b7ef8a57ae5------2</link>
            <guid isPermaLink="false">https://medium.com/p/9668da61056b</guid>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[gitlab]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[claude-code]]></category>
            <dc:creator><![CDATA[Azmi Rutkay Biyik]]></dc:creator>
            <pubDate>Fri, 20 Feb 2026 16:10:18 GMT</pubDate>
            <atom:updated>2026-03-18T09:01:55.098Z</atom:updated>
            <content:encoded><![CDATA[<h3>Frustrated with Boring Review Comments? Resolve them at once with Claude Code Custom Skills and Commands</h3><p>Gitlab version is also explained with the necessary skill files attached</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/910/1*qaXpnc7GgDk-1oBAqwWuQA.png" /><figcaption>Claude Code vs Copilot</figcaption></figure><p>How familiar are you with these review comments?</p><ul><li>“Can you add comments to this code?”</li><li>“Please rename this variable to something more descriptive.”</li><li>“Can you break this function into smaller functions?”</li><li>“Please remove this commented-out code.”</li><li>“Can you add type annotations?”</li><li>“This should be an enum, not a string.”</li><li>“Can you move this to a separate file?”</li><li>“This logic is duplicated — can you extract it?”</li><li>“Please don’t use any here.&quot;</li><li>“Can you use a more descriptive commit message?”</li><li>“Can you use destructuring here?”</li><li>“This import is unused.”</li><li>“Please handle the edge case where this is empty.”</li><li>“Can you add logging here?”</li><li>“This could be a one-liner.”</li><li>“Can you sort these imports?”</li><li>“This belongs in the utils folder.”</li></ul><p>AI coding tools and agents are drastically shaping the way we code these days. As a 10+ years experienced developer, I acquired a lot of knowledge and skills on my way to becoming today&#39;s me. Long architecture discussions, whiteboard brainstorming sessions, arguments end up being almost fights. Throughout the journey, I&#39;ve seen many developer, regardless of their seniority and experience, getting frustrated by code review comments like above.</p><p>Don&#39;t get me wrong, they are really valid comments, and we all should follow certain practices that don&#39;t matter if it is as big as a wrong architectural choice or as small as word case formatting. But I am sure that after days, sometimes weeks, of development, seeing these small, easy-to-fix review comments can get your nerves.</p><p>Thanks to recent tools, today&#39;s developer can focus on the business impact and engineering concerns to operate the AI and review what&#39;s been done, instead of spending precious hours on straightforward, no-brainer review requests.</p><p>I was in Italy last month to visit a close friend for his birthday. He is working at one of the big tech companies in the data collection field. He told me that the engineers at his company received an ultimatum from their higher management: if they don&#39;t use AI sufficiently across all company tasks, they risk being fired. It was this clear. Though it is funny that they were counting the tokens their engineers use in a month to assess if they are using &quot;AI&quot; well enough :D</p><p>However, I heard that they&#39;ve been exploring Claude and its capabilities deeply. I started to check it and realized that Claude is becoming a kind of tech World standard. And there are tons of fantastic ways to leverage it to pump up your productivity. Copilot seemed an ancient tool besides Claude.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MLLUZLY1wubpxG2xBdCaGg.png" /><figcaption><a href="https://x.com/bcherny/status/2007179832300581177">X thread</a> from Boris Cherny, about how they use Claude Code</figcaption></figure><p>I am relatively new to Claude code, as I&#39;ve been using Copilot since its first day. And <a href="https://x.com/bcherny/status/2007179832300581177">this X thread</a> from Boris Cherny, the creator and head of Claude Code at Anthropic, gave me a great starting point to shape my CLAUDE.md files, Caude skills, and so on.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SJSQimqIM5FzeefJuGKz4Q.png" /></figure><p>Let&#39;s get back to resolving review comments with Claude. If you haven&#39;t installed the command-line tool yet, you can do it by following the instructions in <a href="https://code.claude.com/docs/en/setup">this</a> link.</p><p>Once you start your Claude session with claude command, you will be able to use all kinds of skills/claude-commands. The one we are interested in here is pr-comments . As you can see in the description of the command, it gets all the comments from a GitHub pull request. Then, the only thing left is for you to tell Claude to resolve the issues listed in the command result, that&#39;s it!</p><p>But there is a problem if you are not using GitHub as a source control. I use GitLab and there is no mr-comments command to fetch the comments from GitLab by defult.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/881/0*LWZGI98aUt3KjhUo.jpg" /></figure><h4>Adding a Custom skill</h4><p>No worries! Claude Code gives you a way to create your own skills, which means custom commands.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/522/1*Kav6mgTlOP_Xl8iH6RTI8Q.png" /><figcaption>Directory structure to add new skills</figcaption></figure><p>Steps:</p><ul><li>Create .claude/skills/&lt;command&gt; . In our case glab-mr-comments</li><li>Create SKILL.md file under the newly created skill folder.</li><li>Create your skill file, or feel free to use mine directly <a href="https://gist.github.com/arutkayb/d842121ed0e76b61f835ff3983b4622e">https://gist.github.com/arutkayb/d842121ed0e76b61f835ff3983b4622e</a></li><li>As my skill file uses the REST API of Gitlab to access the merge request, you need to define GITLAB_API_TOKEN environment variable and set your private Gitlab api token in your ~/.zprofile or any other env file export GITLAB_API_TOKEN=...</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Gl44ekvfQJgL6sYn1lyyNg.png" /><figcaption>How to acquire a personal Gitlab access token</figcaption></figure><p>And now you can start a Claude session on your terminal and start using your new Gitlab MR comment command!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SYKrr-PB6uXnOuuylffiJw.png" /></figure><p>And an example response of the new command to follow up with &quot;Resolve them&quot;:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nUsiYDlHove2XbPTklIeUA.png" /><figcaption>glab-mr-comments</figcaption></figure><p>If you have come this far, I guess I can assume that you are interested in AI and tech. If you want more reads in tech and lifestyle around tech don&#39;t forget to check out my <a href="https://arutkayb.medium.com/">profile</a>. If you wanna choose your next read immediately, you can go for this one <a href="https://medium.com/p/b9d0b84ffb02">By the time execution starts, there should be nothing left to decide</a></p><p>Always review what AI generates before pushing. It handles the tedious stuff, you stay the engineer.</p><p>Wish you all the best in your AI journey!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9668da61056b" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>