<?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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Kamil Gwóźdź]]></title><description><![CDATA[I'm Kamil and I'm a software engineer working on various projects at GitHub.]]></description><link>https://kamilgwozdz.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!sQG4!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9000ba2e-125d-4c34-91ee-13fa3df7d79f_1179x1179.png</url><title>Kamil Gwóźdź</title><link>https://kamilgwozdz.substack.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 02 Jun 2026 15:02:35 GMT</lastBuildDate><atom:link href="https://kamilgwozdz.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Kamil Gwóźdź]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[kamilgwozdz@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[kamilgwozdz@substack.com]]></itunes:email><itunes:name><![CDATA[Kamil Gwóźdź]]></itunes:name></itunes:owner><itunes:author><![CDATA[Kamil Gwóźdź]]></itunes:author><googleplay:owner><![CDATA[kamilgwozdz@substack.com]]></googleplay:owner><googleplay:email><![CDATA[kamilgwozdz@substack.com]]></googleplay:email><googleplay:author><![CDATA[Kamil Gwóźdź]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How I’m using Copilot to not use Copilot]]></title><description><![CDATA[Reasons why your prompts suck (part 2) - you're using skills instead of extensions.]]></description><link>https://kamilgwozdz.substack.com/p/how-im-using-copilot-to-not-use-copilot</link><guid isPermaLink="false">https://kamilgwozdz.substack.com/p/how-im-using-copilot-to-not-use-copilot</guid><dc:creator><![CDATA[Kamil Gwóźdź]]></dc:creator><pubDate>Mon, 01 Jun 2026 22:01:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hZWH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In <a href="https://substack.com/home/post/p-193459438">part 1</a> I talked about harnesses - giving Copilot ways to check its own work so it can converge on a good result instead of guessing. This time I want to talk about the opposite problem: the moments when you should deliberately stop letting Copilot do the work for you, and how to wire that into your tooling so you can&#8217;t accidentally skip them.</p><p>Before I get to the example, there&#8217;s a distinction in Copilot CLI that I think is underused - <strong>skills vs extensions</strong>.</p><p>A <strong>skill</strong> is just text. It&#8217;s a markdown file the agent reads when it thinks a topic is relevant, like &#8220;here&#8217;s how to write a good commit message&#8221; or &#8220;here&#8217;s the convention we use for branch names&#8221;. The agent can use it, or it can quietly ignore it. It costs context window. At the end of the day, it&#8217;s just special prompt.</p><p>An <strong>extension</strong> is code. It hooks directly into the agent&#8217;s runtime - it can inspect and rewrite CLI calls before they execute, validate the output of a tool call after it runs, or inject prompts when specific events happen. It&#8217;s deterministic. The agent can&#8217;t talk its way out of an extension the way it can talk its way past a skill it didn&#8217;t feel like reading.</p><p>That distinction matters because some rules in your workflow are &#8220;nice to have&#8221; and some are &#8220;never break this&#8221;. Examples of rules I defined for Copilot:</p><ul><li><p>Never open a non-draft PR by accident.</p></li><li><p>Never <code>@</code>-mention people or teams from inside an agent - those notifications go to real humans and should be purposefully triggered by humans.</p></li><li><p>Always attempt to update my <a href="https://obsidian.md/">Obsidian</a> vault with substantial information when a session ends</p></li></ul><p>Those aren&#8217;t suggestions. They&#8217;re hard rules. So they live in extensions, not skills.</p><p>The extension I want to show off is <strong>pr-lifecycle</strong>. It does three things automatically: it silently injects <code>--draft</code> into any <code>gh pr create</code> that&#8217;s missing it, it blocks commands containing <code>@</code> mentions before they run, and it validates that PR bodies have the structure I want (a human-written summary followed by an AI-generated <code>&lt;details&gt;</code> block for agents). On top of that it exposes a <code>finalize_pr</code> tool that, when called, pops up two UI prompts asking me for the PR title and the description.</p><p>Here&#8217;s the workflow in practice. I tell Copilot to open a PR. The hook injects <code>--draft</code>, the PR opens with a placeholder body, and I get a reminder to call <code>finalize_pr</code> once CI is green - which ensures I only need to pay attention to it after changes were validated. When I do, the agent has to stop and ask me:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hZWH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hZWH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png 424w, https://substackcdn.com/image/fetch/$s_!hZWH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png 848w, https://substackcdn.com/image/fetch/$s_!hZWH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png 1272w, https://substackcdn.com/image/fetch/$s_!hZWH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hZWH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png" width="1456" height="867" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:867,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:805354,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://kamilgwozdz.substack.com/i/200178865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hZWH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png 424w, https://substackcdn.com/image/fetch/$s_!hZWH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png 848w, https://substackcdn.com/image/fetch/$s_!hZWH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png 1272w, https://substackcdn.com/image/fetch/$s_!hZWH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a886db-7102-4d35-bb1c-a1a0dead8769_3004x1788.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Then, separately, the description:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A3t_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A3t_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png 424w, https://substackcdn.com/image/fetch/$s_!A3t_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png 848w, https://substackcdn.com/image/fetch/$s_!A3t_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png 1272w, https://substackcdn.com/image/fetch/$s_!A3t_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A3t_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png" width="1456" height="867" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:867,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:792813,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://kamilgwozdz.substack.com/i/200178865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A3t_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png 424w, https://substackcdn.com/image/fetch/$s_!A3t_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png 848w, https://substackcdn.com/image/fetch/$s_!A3t_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png 1272w, https://substackcdn.com/image/fetch/$s_!A3t_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049076f6-1c85-4bd5-9358-aa4e97f37f2c_3004x1788.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And the final PR ends up looking like this - my words at the top, with the AI&#8217;s structured summary tucked into a collapsible <code>&lt;details&gt;</code> block underneath that reviewers can expand if they want the agent&#8217;s take:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Li0v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Li0v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif 424w, https://substackcdn.com/image/fetch/$s_!Li0v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif 848w, https://substackcdn.com/image/fetch/$s_!Li0v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif 1272w, https://substackcdn.com/image/fetch/$s_!Li0v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Li0v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif" width="1456" height="945" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:945,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:182087,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://kamilgwozdz.substack.com/i/200178865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Li0v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif 424w, https://substackcdn.com/image/fetch/$s_!Li0v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif 848w, https://substackcdn.com/image/fetch/$s_!Li0v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif 1272w, https://substackcdn.com/image/fetch/$s_!Li0v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65db798b-0075-42a3-9b6a-ea4eb383d592_1500x974.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>(<a href="https://github.com/kamil-gwozdz/test-repo/pull/81">example PR</a>)</p><p>Now here&#8217;s the part that actually matters, and the reason this extension exists at all.</p><p><strong>The PR description is the one moment in the loop where I force myself to stop, slow down, and think.</strong> Not &#8220;review the diff and click merge&#8221; think - actually think. Did I consider the performance implications? Did I pick this architecture for a reason I can articulate? Is there a simpler version of this change I rejected, and why? Writing that down in my own words, in my own voice, is the closest thing I have to a guarantee that I actually understood what just got built. If I can&#8217;t describe the change, I don&#8217;t really understand it, and I shouldn&#8217;t be shipping it.</p><p>The PR description is also <em>the</em>&nbsp;artifact my reviewer should read carefully - they will skim the diff, they will not thoroughly read a wall of AI-generated text. Description written in my own words, is the signal I send them about how <em>I</em>&nbsp;think about my own changes. Outsourcing that part to the agent is outsourcing the one piece of the workflow where being a human actually matters and that's why I decided to purposely do it on my own. But the AI-summary part allows to preserve context for future agent sessions.</p><p></p><p>So the extension exists to make that pause non-skippable. The agent literally cannot finalize the PR without coming back to me and asking. It&#8217;s a tiny piece of friction, and it&#8217;s the most valuable friction in my entire workflow.</p><p><em>This is part 2 of &#8220;Reasons why your prompts suck&#8221; - a mini-series about closing the gap between what AI agents can do and what you&#8217;re actually getting out of them.</em></p>]]></content:encoded></item><item><title><![CDATA[Reasons why your prompts suck (part 1)]]></title><description><![CDATA[A mini-series about closing the gap between what you're getting out of AI agents and what they can actually do]]></description><link>https://kamilgwozdz.substack.com/p/reasons-why-your-prompts-suck-part</link><guid isPermaLink="false">https://kamilgwozdz.substack.com/p/reasons-why-your-prompts-suck-part</guid><dc:creator><![CDATA[Kamil Gwóźdź]]></dc:creator><pubDate>Tue, 07 Apr 2026 12:37:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sQG4!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9000ba2e-125d-4c34-91ee-13fa3df7d79f_1179x1179.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>You never gave it eyes</h2><p>I think there&#8217;s a common pattern I keep seeing with people who are frustrated with AI coding agents. They give the agent a task, the agent produces something, and then they&#8217;re disappointed with the result. But when I look at how they set things up, the problem usually isn&#8217;t the prompt itself - it&#8217;s that the agent had no way to check its own work.</p><p>Think about it this way - imagine you&#8217;re building a website but you&#8217;re not allowed to look at it. No browser, no preview, nothing. You just write code and hope for the best. That&#8217;s essentially the situation we put AI agents in most of the time, and then we&#8217;re surprised when the output isn&#8217;t great.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://kamilgwozdz.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I feel like the fix here isn&#8217;t about writing better prompts. It&#8217;s about building better harnesses - giving the agent something to validate its output against so it can actually iterate and converge on a good result instead of guessing.</p><h3>What I mean by harness</h3><p>A harness is anything that closes the feedback loop. Most people act as a harness themselves when they manually evaluate the agent&#8217;s output, even in situations where this could be completely avoided in favor of an automated harness.</p><p>There are a few approaches that I&#8217;ve found work well in practice.</p><p>The most obvious one is <strong>tests</strong>. If you have a test suite, the agent can run it after every change and immediately know whether something broke. If you don&#8217;t have tests, you can tell the agent to write them first and then use them as guardrails for the actual implementation. This alone makes a huge difference.</p><p>Another thing is that modern agents like Copilot are multimodal - <strong>they can actually look at images</strong>. You can tell the agent to take a screenshot of your page and evaluate it visually. Instead of guessing whether the layout looks right, it&#8217;s actually <em>seeing</em> it. I think a lot of people don&#8217;t realize this is even possible.</p><p>The same principle applies to document rendering. If you&#8217;re working with PDFs or generated documents, you can have the agent convert them to images and inspect the output. It&#8217;s the same idea - close the feedback loop and let the agent see what it produced.</p><p>For browser or mobile development you can go even further and <strong>tell the agent to use debugging tools to click through your app, take screenshots at each step, and verify the behavior</strong>. It&#8217;s basically giving the agent a QA workflow, and the results are significantly better than just generating code and hoping it works.</p><p>And last but not least - most mature projects have a CI setup. This single line in <code>copilot-instructions.md</code> has saved me hundreds of interactions with Copilot:</p><blockquote><p>When opening or iterating on a PR, never consider the work done until CI is green. Always wait for CI to complete and verify all required jobs pass.</p></blockquote><h3>Where this leaves us</h3><p>I think the productivity gap most people experience with AI agents isn&#8217;t really about the model being too dumb. It&#8217;s about the model being blind. Once you give it ways to validate its own output - tests, screenshots, interactive tools - the quality of what it produces goes up dramatically. It&#8217;s worth spending time on the harness before you spend time on the prompt.</p><div><hr></div><p><em>This is part 1 of &#8220;Reasons why your prompts suck&#8221; - a mini-series about closing the gap between what AI agents can do and what you&#8217;re actually getting out of them.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://kamilgwozdz.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>