<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>A.I. with Coffee or Tea</title>
    <link>https://fterry.su.domains/</link>
    <description>Notes and tips from people working this out at work. Yours welcome too.</description>
    <language>en-us</language>
    <atom:link href="https://fterry.su.domains/rss.xml" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Tue, 29 Sep 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>Before You Build Anything With A.I., Write Down What Right Looks Like</title>
      <link>https://fterry.su.domains/posts/write-down-what-right-looks-like</link>
      <guid isPermaLink="true">https://fterry.su.domains/posts/write-down-what-right-looks-like</guid>
      <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
      <dc:creator>Forrester Terry</dc:creator>
      <description>A.I. is great at making things that look finished. It can't know what right means for your work. Three hand-written examples, written before anyone prompts, fix most of that.</description>
      <category>ai</category>
      <category>process</category>
      <category>requirements</category>
      <category>developers</category>
      <content:encoded><![CDATA[<p>The team meets. Everyone is excited. Someone opens a chat window and types &quot;build us a dashboard that tracks our renewals.&quot; Twenty minutes later there is a dashboard. It has charts. It has a dark mode. It looks amazing.</p>
<p>Then the person who actually handles renewals every month looks at it and says, &quot;That number is wrong.&quot;</p>
<p>Nobody can say why and nobody wrote down what right was supposed to be.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/requirements-cortisol.jpg" alt="Two-panel cortisol meter meme. Left, blurry and shaking, &quot;Me Not Having Requirements Doc&quot; with the needle pinned at high. Right, calm and sharp, &quot;Me Having Requirements Doc&quot; with the needle at low." width="743" height="337" loading="lazy" decoding="async"></figure><h2 id="why-this-step-matters-so-much">Why this step matters so much <a class="heading-anchor" href="#why-this-step-matters-so-much"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>A.I. is really good at making things that look finished. That's the magic, and it's also the trap.</p>
<p>What it can't do is know what &quot;right&quot; means for your work. It doesn't know that a charge on the 3rd is normal but a charge on the 30th means someone forgot to cancel. It doesn't know which column in the export can't be trusted. You know that, or someone on your team does.</p>
<p>That knowledge is the most valuable thing your team brings. Getting it out of people's heads and onto the page before anything gets built is where most of the win comes from.</p>
<h2 id="what-it-looks-like-in-practice">What it looks like in practice <a class="heading-anchor" href="#what-it-looks-like-in-practice"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>Say the project is tracking software subscriptions. You have a list of what your team pays for, and a card statement of what actually got charged. The goal is to catch surprises.</p>
<p>Before anybody prompts anything, write three examples by hand.</p>
<p><strong>A normal one.</strong> &quot;Design tool, $15 a month, charged on the 5th, matches the list. Nothing to flag.&quot;</p>
<p><strong>A wrong one.</strong> &quot;Survey tool. The list says $20 a month. The card says $340. It renewed annually at a new price. Flag it.&quot;</p>
<p><strong>A weird one.</strong> &quot;A $9 charge from a vendor nobody recognizes. Not on the list at all. Flag it and find out who owns it.&quot;</p>
<p>Three examples, ten minutes. Now you have something to hand the A.I., and something to check its work against. When the tool says &quot;everything looks good,&quot; you can run your three and know whether that's true.</p>
<p>The weird one is usually the most useful. It's where the real work lives, and it's the case the A.I. may quietly skip.</p>
<h2 id="tips-for-getting-started">Tips for getting started <a class="heading-anchor" href="#tips-for-getting-started"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p><strong>1. Start with a small slice of real data.</strong> Twenty rows beats twenty thousand. You can read twenty rows yourself and spot what the A.I. gets wrong. Stick to data and tools you're allowed to use, and leave out anything sensitive you don't need.</p>
<p><strong>2. Write your examples before you prompt.</strong> One normal, one wrong, one weird. If you have issues here, you may need to spend more time sorting your data and approach. That's a great thing to find out on day one instead of week three.</p>
<p><strong>3. Decide what &quot;wrong&quot; looks like.</strong> One sentence is enough: &quot;This is wrong if a charge shows up that isn't on the list.&quot; I wrote more about this in <a href="https://fterry.su.domains/posts/checking-ai-work-is-hard">Checking A.I. Work is Hard</a>. If you can't name what broken looks like, you'll end up with misleading results.</p>
<p><strong>4. Pick the smallest version that helps someone next week.</strong> Skip the full vision for now. Find the one piece that would save somebody real time on Monday. A spreadsheet of flagged charges is a win. The dashboard can come afterwards.</p>
<p><strong>5. Let the person who knows the work be the judge.</strong> On a mixed team, the most important person in week one often isn't the one writing code. It's the person who can look at an output and say &quot;that's wrong, and here's why.&quot; If that's you, everyone on the team will need you.</p>
<p><strong>6. Make the A.I. ask questions first.</strong> Give it your sample and your examples, and tell it not to build anything yet. Let it interview you. The questions it asks will show you what your team hasn't decided.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/not-time-to-develop.jpg" alt="Three-panel comic of a cartoon dog. Panel one: &quot;Time to develop?&quot; Panel two: a hand reaches in and the dog frowns, &quot;No&quot;. Panel three, the dog looking stern: &quot;Answer open questions first&quot;." width="761" height="343" loading="lazy" decoding="async"></figure><h2 id="tips-particularly-for-developers">Tips particularly for developers <a class="heading-anchor" href="#tips-particularly-for-developers"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p><strong>Turn the examples into tests.</strong> Your team's hand-written cases can become your first test fixtures. Every change then gets checked against what the team said right looks like.</p>
<p><strong>Don't let the agent edit the examples.</strong> Keep them in their own file and mark it read only. If a test fails, the code is likely wrong, not the example. Agents love to &quot;fix&quot; a failing test by changing what it expects.</p>
<p><strong>Add an example every time something surprises you.</strong> Every bug the domain expert catches becomes a new case. By the end of the project you have a real test suite written by the people who know the work best.</p>
<p><strong>Prove the logic before the interface.</strong> A small script that reads the sample and prints the flags is a great first deliverable. Once the flags are right, the UI is the easy part.</p>
<h2 id="wrapping-up">Wrapping up <a class="heading-anchor" href="#wrapping-up"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>The tools keep getting faster at building. Knowing what right looks like is still on us, and it's the part that makes everything else worth building.</p>
<p>So before your team opens a chat window this week, grab a whiteboard, pull twenty rows, and write down three examples. It takes 10 minutes, and will be very worth it.</p>
<p>Good luck to everyone kicking off something new.</p>
<h2 id="example-prompts">Example prompts <a class="heading-anchor" href="#example-prompts"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="before-you-start">Before you start <a class="heading-anchor" href="#before-you-start"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Here is a small sample of our data and three examples of what correct</span></span>
<span class="line"><span>output looks like, including one that should be flagged. Do not build</span></span>
<span class="line"><span>anything yet. Read everything, then ask me the questions you need</span></span>
<span class="line"><span>answered to get this right. Ask them one at a time.</span></span></code></pre>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Here is what we want to build: &#x3C;one or two sentences>. What is the</span></span>
<span class="line"><span>smallest version of this that would still be useful to someone next</span></span>
<span class="line"><span>week? What would we leave out, and what would we lose by leaving it out?</span></span></code></pre>
<h3 id="writing-your-examples">Writing your examples <a class="heading-anchor" href="#writing-your-examples"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Here is a sample of our data. Help me write examples of correct output:</span></span>
<span class="line"><span>one normal case, one that is clearly wrong, and one edge case that is</span></span>
<span class="line"><span>easy to miss. Don't guess at our rules. If you are not sure how a case</span></span>
<span class="line"><span>should be handled, ask me.</span></span></code></pre>
<h3 id="before-it-builds">Before it builds <a class="heading-anchor" href="#before-it-builds"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Before you build anything, restate in plain language what "done" means</span></span>
<span class="line"><span>for this project, and list how each of my examples should come out. If</span></span>
<span class="line"><span>anything I've told you conflicts, point it out.</span></span></code></pre>
<h3 id="after-it-says-its-done">After it says it's done <a class="heading-anchor" href="#after-it-says-its-done"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Run my examples through what you built and show me the result for each</span></span>
<span class="line"><span>one next to what I said it should be. Do not change the examples. If</span></span>
<span class="line"><span>any don't match, tell me which ones and why.</span></span></code></pre>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>What kinds of cases did my examples NOT cover? Give me three new</span></span>
<span class="line"><span>examples I should add, and tell me how you currently handle each one.</span></span></code></pre>
<h3 id="for-developers">For developers <a class="heading-anchor" href="#for-developers"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Turn examples.md into test fixtures. Treat examples.md as read only.</span></span>
<span class="line"><span>If a test fails, fix the code, never the expected result. If you think</span></span>
<span class="line"><span>an example itself is wrong, tell me instead of changing it.</span></span></code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>26 Ways to Use Coding Agents for Non-Coding Tasks</title>
      <link>https://fterry.su.domains/posts/using-coding-agents-for-non-coding-tasks</link>
      <guid isPermaLink="true">https://fterry.su.domains/posts/using-coding-agents-for-non-coding-tasks</guid>
      <pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate>
      <dc:creator>Forrester Terry</dc:creator>
      <description>Cloud bills, app store releases, marketing videos, a broken headset, and a road-trip playlist for my mom. Here are 26 things I actually use my coding agents for.</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>operations</category>
      <content:encoded><![CDATA[<p>Most people think of coding agents as tools for just writing code. But they can be effective for a lot more than that! If it has a command line, an API, or a screen, a coding agent can usually operate it.</p>
<p>For this post I figured folks could jump around and look at what they find interesting. There is a quick table of contents below to let you select what you want.</p>
<p><strong>In this post</strong></p>
<ul>
<li><a href="#how-i-found-these-examples">How I found these examples</a>
<ul>
<li><a href="#1-digging-through-my-own-agent-history">1. Digging through my own agent history</a></li>
</ul>
</li>
<li><a href="#cloud-money-and-store-ops">Cloud, money, and store ops</a>
<ul>
<li><a href="#2-the-cloud-spend-report">2. The cloud spend report</a></li>
<li><a href="#3-publishing-a-game-to-the-app-store-and-google-play">3. Publishing a game to the App Store and Google Play</a></li>
<li><a href="#4-setting-up-subscriptions-through-admin-apis">4. Setting up subscriptions through admin APIs</a></li>
<li><a href="#5-a-cost-per-user-model">5. A cost-per-user model</a></li>
</ul>
</li>
<li><a href="#media-production">Media production</a>
<ul>
<li><a href="#6-a-marketing-kit-for-my-food-tracker">6. A marketing kit for my food tracker</a></li>
<li><a href="#7-a-demo-video-set-rendered-around-midnight">7. A demo video set, rendered around midnight</a></li>
<li><a href="#8-a-commercial-from-six-clips-and-a-jingle">8. A commercial from six clips and a jingle</a></li>
<li><a href="#9-a-band-that-doesnt-exist">9. A band that doesn't exist</a></li>
<li><a href="#10-recording-gameplay-with-obs">10. Recording gameplay with OBS</a></li>
</ul>
</li>
<li><a href="#eyes-on-the-screen">Eyes on the screen</a>
<ul>
<li><a href="#11-an-unattended-ux-review">11. An unattended UX review</a></li>
<li><a href="#12-vision-driven-testing">12. Vision-driven testing</a></li>
</ul>
</li>
<li><a href="#the-managers-copilot">The manager's copilot</a>
<ul>
<li><a href="#13-launches-before-day-of-and-after">13. Launches: before, day-of, and after</a></li>
<li><a href="#14-how-our-teams-work-actually-flows">14. How our team's work actually flows</a></li>
<li><a href="#15-the-stray-k">15. The stray K</a></li>
<li><a href="#16-a-kernel-vulnerability-checked-and-patched">16. A kernel vulnerability, checked and patched</a></li>
<li><a href="#17-planning-a-team-event">17. Planning a team event</a></li>
</ul>
</li>
<li><a href="#home-lab-and-personal-it">Home lab and personal IT</a>
<ul>
<li><a href="#18-is-something-jamming-my-audio-card">18. &quot;Is something jamming my audio card?&quot;</a></li>
<li><a href="#19-a-home-lab-set-up-over-ssh">19. A home lab, set up over SSH</a></li>
<li><a href="#20-a-vpn-on-my-raspberry-pi">20. A VPN on my Raspberry Pi</a></li>
<li><a href="#21-rescuing-a-new-inference-server">21. Rescuing a new inference server</a></li>
</ul>
</li>
<li><a href="#life">Life</a>
<ul>
<li><a href="#22-a-road-trip-playlist-for-my-mom">22. A road-trip playlist for my mom</a></li>
<li><a href="#23-11-years-of-my-spotify-data">23. 11 years of my Spotify data</a></li>
<li><a href="#24-reading-my-old-facebook-data">24. Reading my old Facebook data</a></li>
<li><a href="#25-kitchen-timers-and-a-meal-plan">25. Kitchen timers and a meal plan</a></li>
<li><a href="#26-an-ai-phone-receptionist">26. An AI phone receptionist</a></li>
</ul>
</li>
<li><a href="#when-it-goes-sideways">When it goes sideways</a></li>
<li><a href="#patterns-that-worked">Patterns that worked</a></li>
<li><a href="#try-it">Try it</a></li>
</ul>
<h2 id="how-i-found-these-examples">How I found these examples <a class="heading-anchor" href="#how-i-found-these-examples"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="1-digging-through-my-own-agent-history">1. Digging through my own agent history <a class="heading-anchor" href="#1-digging-through-my-own-agent-history"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>To write this post, I asked Claude Code to go find the examples for me. Seven agents ran in parallel and swept 356 project folders, 6,818 of my past prompts, and the job history from FOREMAN, a tool I built to run coding agents unattended. They came back with about 80 examples.</p>
<p>This post counts as example 1, haha! Here are the other 25 worth sharing.</p>
<h2 id="cloud-money-and-store-ops">Cloud, money, and store ops <a class="heading-anchor" href="#cloud-money-and-store-ops"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="2-the-cloud-spend-report">2. The cloud spend report <a class="heading-anchor" href="#2-the-cloud-spend-report"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>I asked for an expense report across all of my team's Google Cloud projects: what we aren't using that still costs money, what we could scale down, and what is expensive but actually used. I told it to use the gcloud CLI and to MAKE NO CHANGES. It swept every project my account could see, read-only, and wrote it up. The headline: about 59% of the spend it could identify was Cloud Run instances kept online 24/7 and sitting almost entirely idle. I then had it rewrite the report for leadership and link it from the ticket. <em>(NOTE: using a Read Only Service Account and env isolation is best when allowing an LLM to drive your cloud infra. We don't want boo-boos...)</em></p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-card-gcp-spend.png" alt="A terminal-style card. The prompt asks for an expense report across the team's Google Cloud resources using the gcloud CLI, in capitals: MAKE NO CHANGES. The agent replies that it ran a read-only sweep, that about 59% of identified spend is idle Cloud Run instances, and that it saved the report." width="1400" height="736" loading="lazy" decoding="async"></figure><h3 id="3-publishing-a-game-to-the-app-store-and-google-play">3. Publishing a game to the App Store and Google Play <a class="heading-anchor" href="#3-publishing-a-game-to-the-app-store-and-google-play"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>For my game MagLava, the agent found the store credentials I had staged in Keychain, filled in the store listings in seven languages, uploaded builds to TestFlight and Google Play testing, and pushed the signing certificates into CI. It also rendered 126 localized screenshot cards, a trailer, and an App Store preview. The release notes it keeps are nice.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-maglava-store-languages.jpg" alt="Seven App Store screenshot cards for the game MagLava, side by side, each showing the same level with its caption translated into English, German, Spanish, Japanese, Portuguese, Turkish and Chinese." width="1400" height="433" loading="lazy" decoding="async"></figure><figure class="prose-figure">
<video controls playsinline preload="none" poster="/img-files/nca-maglava-trailer-poster.jpg" src="https://fterry.su.domains/video-files/nca-maglava-trailer.mp4" data-youtube="0L0MMnvFFjE" aria-label="MagLava launch trailer rendered by the agent, 36 seconds, with the original soundtrack."></video>
<figcaption><a href="https://youtu.be/0L0MMnvFFjE">Watch on YouTube</a></figcaption>
</figure>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-maglava-release-log.png" alt="An excerpt of the MagLava release log: the Apple build is valid and beta approved on TestFlight, Google Play open testing is configured but public availability is not confirmed, and store information is saved in all seven game languages." width="1200" height="958" loading="lazy" decoding="async"></figure><h3 id="4-setting-up-subscriptions-through-admin-apis">4. Setting up subscriptions through admin APIs <a class="heading-anchor" href="#4-setting-up-subscriptions-through-admin-apis"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>For my food tracker app, it used the RevenueCat and Google Play admin APIs to create the subscription plans: monthly and annual, with a 7-day trial. It did a dry run first, because Play base-plan IDs can never be reused once created. Along the way it noticed RevenueCat was still on sample settings, which would have made Pro silently fail.</p>
<h3 id="5-a-cost-per-user-model">5. A cost-per-user model <a class="heading-anchor" href="#5-a-cost-per-user-model"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>For the same food tracker app, it built a cost-per-user model from real usage, noticed billing export had never been turned on, and changed one Cloud Run setting that took the idle cost from about $37 a month to about $0.05.</p>
<h2 id="media-production">Media production <a class="heading-anchor" href="#media-production"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="6-a-marketing-kit-for-my-food-tracker">6. A marketing kit for my food tracker <a class="heading-anchor" href="#6-a-marketing-kit-for-my-food-tracker"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>A hero video, three short clips, captions, 23 generated food photos, Play Store screenshots, and a feature graphic. The pipeline writes the narration first (Gemini text-to-speech), so every on-screen action is held exactly as long as its voice-over. Playwright drives the app at phone size, Remotion puts the footage in a phone frame, and ffmpeg mixes in a music bed. Everything is captured from a seeded demo account, so no real user data shows up anywhere. It did however use a really old TTS model, so it sounds bad.</p>
<figure class="prose-figure">
<video controls playsinline preload="none" poster="/img-files/nca-food-hero-frame.jpg" src="https://fterry.su.domains/video-files/nca-food-hero.mp4" data-youtube="6cDhXwM8-xE" aria-label="The FoFo Food Tracker hero video the agent produced: narrated walkthrough of the app in a phone frame with captions and music, 80 seconds."></video>
<figcaption><a href="https://youtu.be/6cDhXwM8-xE">Watch on YouTube</a></figcaption>
</figure>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-food-photos.jpg" alt="A grid of 18 of the generated food photos: avocado toast, banana pancakes, salmon and rice, chicken tacos, lentil soup, pepperoni pizza and more." width="1400" height="697" loading="lazy" decoding="async"></figure><h3 id="7-a-demo-video-set-rendered-around-midnight">7. A demo video set, rendered around midnight <a class="heading-anchor" href="#7-a-demo-video-set-rendered-around-midnight"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>For FoFo Care, a Mac help app I built a while ago, the agent recorded the real packaged app, generated narration, captioned it with Whisper, composited it in Remotion, added music, and checked its own output. It even left notes on bugs it ran into while recording. OBS was installed, but it chose not to use it. It captured the app window through Chrome DevTools instead, which needs no screen recording permission and keeps desktop clutter out of the shot.</p>
<figure class="prose-figure">
<video controls playsinline preload="none" poster="/img-files/nca-care-demo-frame.jpg" src="https://fterry.su.domains/video-files/nca-care-demo.mp4" data-youtube="xgq9_-cl9as" aria-label="A 25-second excerpt of the FoFo Care demo video: a question asked in chat, the tools running, and the answer, with narration and captions."></video>
<figcaption><a href="https://youtu.be/xgq9_-cl9as">Watch on YouTube</a></figcaption>
</figure>
<h3 id="8-a-commercial-from-six-clips-and-a-jingle">8. A commercial from six clips and a jingle <a class="heading-anchor" href="#8-a-commercial-from-six-clips-and-a-jingle"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>For &quot;Robots Save The Call,&quot; it mapped the song's beat (120.96 BPM) and cut on it, generated four voiceover takes and checked each one by transcribing it back, then rendered nine versions across aspect ratios. Here is the full ad.</p>
<figure class="prose-figure">
<video controls playsinline preload="none" poster="/img-files/nca-robots-full-poster.jpg" src="https://fterry.su.domains/video-files/nca-robots-full.mp4" data-youtube="OMTMo1HDEII" aria-label="The full 42-second Robots Save The Call commercial, with jingle and voiceover."></video>
<figcaption><a href="https://youtu.be/OMTMo1HDEII">Watch on YouTube</a></figcaption>
</figure>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-robots-aspect-ratios.jpg" alt="The same frame of the commercial in three aspect ratios side by side: a cheerful blue robot with a headset floating among colorful phones, captioned &quot;Answers 24/7 so you don't have to&quot;." width="1400" height="411" loading="lazy" decoding="async"></figure><h3 id="9-a-band-that-doesnt-exist">9. A band that doesn't exist <a class="heading-anchor" href="#9-a-band-that-doesnt-exist"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>One FOREMAN job, $3.90: a made-up band called Saltline with a persona, lyrics, four songs, cover art, and a website.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-saltline-site.jpg" alt="The Saltline band website: four musicians standing on a misty beach at dusk under the band name, the tagline &quot;Songs for the long way home,&quot; and a Play the EP button." width="1400" height="972" loading="lazy" decoding="async"></figure><p>A note on the music: the four tracks on that site are 30-second instrumental clips from Google's Lyria model, and honestly they are... not the best yet (getting there). The good stuff came later. Here is &quot;Super Quick,&quot; a full song I made for the band with Suno:</p>
<figure class="prose-figure">
<audio controls preload="none" src="https://fterry.su.domains/video-files/nca-saltline-super-quick.mp3" aria-label="Super Quick, a song made with Suno for the Saltline band, about 2 minutes."></audio>
</figure>
<h3 id="10-recording-gameplay-with-obs">10. Recording gameplay with OBS <a class="heading-anchor" href="#10-recording-gameplay-with-obs"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>I made a StepMania song pack out of my own songs using A.I. and wanted a gameplay video for each one. I asked if it could automate it: open the game, play each song on Hard, and have OBS record. I set up the OBS scene, told it to go, and 13 videos landed about two minutes apart, each chart played by the game's AutoPlay.</p>
<figure class="prose-figure">
<video controls playsinline preload="none" poster="/img-files/nca-gameplay-obs.jpg" src="https://fterry.su.domains/video-files/nca-gameplay-obs.mp4" data-youtube="xdkjDLASOnI" aria-label="20 seconds of a gameplay recording made through OBS: the rhythm game plays one of my songs on AutoPlay over a neon synthwave background."></video>
<figcaption><a href="https://youtu.be/xdkjDLASOnI">Watch on YouTube</a></figcaption>
</figure>
<h2 id="eyes-on-the-screen">Eyes on the screen <a class="heading-anchor" href="#eyes-on-the-screen"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="11-an-unattended-ux-review">11. An unattended UX review <a class="heading-anchor" href="#11-an-unattended-ux-review"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>I told the agent I needed a general test and UX review of my app's pilot build, to work as autonomously as possible, and that OBS was set up if it wanted to record. It drove the real packaged app with Playwright over six passes and came back with a prioritized bug list, 14 annotated screenshots, and a two-minute walkthrough video. A couple of the finds I would not have caught quickly: the chat invented a fake technical reason when a tool was behind the paywall, and a confirmation dialog showed text that was written for the LLM, not the user.</p>
<p>The OBS part: it tried OBS first. OBS pulled in desktop clutter and audio, and one of its automation calls crashed OBS outright. So it switched to recording the app window through Chrome DevTools, on its own. The same tool that worked great for gameplay was the wrong tool here, and the agent figured that out without me.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-ux-paywall-reason.png" alt="A bug screenshot from the UX review: the chat assistant gives an invented technical reason for a failure instead of saying the tool requires an upgrade." width="1400" height="787" loading="lazy" decoding="async"></figure><figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-ux-prompt-leak.png" alt="A bug screenshot from the UX review: a confirmation dialog for a destructive tool shows prompt text that was written for the LLM." width="1400" height="787" loading="lazy" decoding="async"></figure><figure class="prose-figure">
<video controls muted playsinline preload="none" poster="/img-files/nca-ux-walkthrough-poster.jpg" src="https://fterry.su.domains/video-files/nca-ux-walkthrough.mp4" data-youtube="bPm1AS60uME" aria-label="40 silent seconds of the walkthrough video the agent recorded of the app during its UX review."></video>
<figcaption><a href="https://youtu.be/bPm1AS60uME">Watch on YouTube</a></figcaption>
</figure>
<h3 id="12-vision-driven-testing">12. Vision-driven testing <a class="heading-anchor" href="#12-vision-driven-testing"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>This one has been a long time coming. I have been chasing vision-driven testing for a while: started as a screen-grid experiment with a local vision model, now an auto-tester that screenshots the screen, lets Gemini pick the next click, and handles native macOS dialogs a browser driver cannot see. The goal every time has been the same: download one of our work apps and run it to completion.</p>
<h2 id="the-managers-copilot">The manager's copilot <a class="heading-anchor" href="#the-managers-copilot"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="13-launches-before-day-of-and-after">13. Launches: before, day-of, and after <a class="heading-anchor" href="#13-launches-before-day-of-and-after"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>I have started using agents at all three points of a launch.</p>
<ul>
<li><strong>Before:</strong> For my food tracker, I asked &quot;am I actually ready to launch this thing?&quot; and had it check the marketing site, app, backend, security, payments, and deployment, then save findings to a file. My favorite part: it later corrected one of its own findings (&quot;My original finding was wrong on the facts&quot;) after checking the actual database.</li>
<li><strong>Day-of:</strong> At work, the morning we rolled out a new feature, I asked it to check recent logs and tell me how it was going for folks. READ ONLY. It queried the logs and database, built an HTML report, and screenshotted it so I could share it.</li>
<li><strong>After:</strong> When one of my side projects hit v1, I asked it to look at all my git commits and all my Claude chats for the project and figure out how much development time went into it.</li>
</ul>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-launch-readiness.png" alt="The top of the FoFo Food Tracker launch readiness audit, written by Claude: a P0 remediation table listing items like &quot;Legal docs named the wrong payment processor&quot; and &quot;Alerting could not fire&quot;, each marked fixed or closed." width="1400" height="1050" loading="lazy" decoding="async"></figure><figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-card-launch-day.png" alt="A terminal-style card. The prompt says a feature just rolled out and asks for a read-only check of recent logs. The agent replies that it queried Cloud Logging and Firestore, covered adoption, latency and errors, and built an HTML launch report with a screenshot to share." width="1400" height="788" loading="lazy" decoding="async"></figure><h3 id="14-how-our-teams-work-actually-flows">14. How our team's work actually flows <a class="heading-anchor" href="#14-how-our-teams-work-actually-flows"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>I asked it to use six months of git and Jira history to answer three questions: how long does it take us to get work done, how much carries over from sprint to sprint, and is our pace sustainable? It built an HTML report. I cannot show the real one, so the chart below uses made-up numbers for what most teams see: most of a ticket's life is spent waiting, not being worked on.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-mock-ticket-time.png" alt="An illustrative stacked bar chart with made-up numbers titled &quot;Most of a ticket's life is spent waiting.&quot; For all teams and Teams A, B and C, waiting in backlog takes 58 to 74 percent of elapsed time, with in progress, review and test, and blocked making up the rest." width="1400" height="897" loading="lazy" decoding="async"></figure><h3 id="15-the-stray-k">15. The stray K <a class="heading-anchor" href="#15-the-stray-k"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>We started getting alerts that users were having issues. On day one, the agent traced it to a vendor service being down. On day two, the same alerts came back. I asked it to check if the vendor endpoint was up, without posting to it or authenticating. It was healthy. So it pulled the deployed source from the storage bucket and found a single stray <code>K</code> character in one file. That threw an error inside a success handler, the error handler swallowed it and reported failure, and the vendor call had actually succeeded the whole time. It was live for about 12 minutes. I had it write up the incident for our lead developer.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-card-stray-k.png" alt="A terminal-style card with names stripped. The prompts ask the agent to check whether the vendor endpoint is up without posting or authenticating, then why the error alerts keep firing. The agent replies the endpoint was healthy, a stray K in the deployed copy of one file threw inside a then handler that the catch swallowed, and the vendor call had actually succeeded." width="1400" height="955" loading="lazy" decoding="async"></figure><h3 id="16-a-kernel-vulnerability-checked-and-patched">16. A kernel vulnerability, checked and patched <a class="heading-anchor" href="#16-a-kernel-vulnerability-checked-and-patched"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>When a Linux kernel vulnerability was announced, I asked if it affected any of our stuff, read-only. It checked across our projects, identified already patched VMs over SSH one at a time, and wrote a Slack summary I could send my boss.</p>
<h3 id="17-planning-a-team-event">17. Planning a team event <a class="heading-anchor" href="#17-planning-a-team-event"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>My agent also helped plan our team event: a participant journey, an agenda, a dry run against a fake team, and a live site.</p>
<h2 id="home-lab-and-personal-it">Home lab and personal IT <a class="heading-anchor" href="#home-lab-and-personal-it"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="18-is-something-jamming-my-audio-card">18. &quot;Is something jamming my audio card?&quot; <a class="heading-anchor" href="#18-is-something-jamming-my-audio-card"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>My Mac would start playing audio and then immediately stop. I asked the agent in the middle of a video project. It checked audio processes, virtual audio drivers, and system logs, and found the real problem: my JBL headset was stuck in hands-free mode, the 16 kHz mono mode meant for calls, instead of stereo playback. Nothing to do with code at all. So turned off headphones and things worked again!</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-card-jbl-audio.png" alt="A terminal-style card. The prompt asks whether something is jamming the Mac's audio card. The agent replies that the JBL headset is stuck in hands-free mode, showing system output with an input sample rate of 16000 marked &quot;HFP/SCO, not A2DP&quot;." width="1400" height="978" loading="lazy" decoding="async"></figure><h3 id="19-a-home-lab-set-up-over-ssh">19. A home lab, set up over SSH <a class="heading-anchor" href="#19-a-home-lab-set-up-over-ssh"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>I have four machines at home for running local models. Agents did the setup over SSH: firewall rules, a scheduled task to keep WSL running on the Windows box, text-to-speech, speech recognition, and local model servers, a LiteLLM proxy, SearXNG search, and Langfuse tracing. Every service has a check script it can rerun. Now all of it is saved as a skill, so any future session already knows the boxes and the traps we have already hit.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-homelab-diagram.png" alt="A diagram of the home lab. Claude on the Mac reaches four machines over SSH: HULK runs shared services like LiteLLM, SearXNG, Langfuse and Firecrawl; HERMES runs a personal agent with calendar and Spotify connections; INFINITY runs a local reasoning model; WARLOCK runs voice services under Windows and WSL2." width="1400" height="1113" loading="lazy" decoding="async"></figure><h3 id="20-a-vpn-on-my-raspberry-pi">20. A VPN on my Raspberry Pi <a class="heading-anchor" href="#20-a-vpn-on-my-raspberry-pi"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>My agent set up a VPN on my Raspberry Pi with an auto-rollback timer, so if the VPN cut off SSH, the change would undo itself.</p>
<h3 id="21-rescuing-a-new-inference-server">21. Rescuing a new inference server <a class="heading-anchor" href="#21-rescuing-a-new-inference-server"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>At work, a brand new server came up with a (too) bare-minimum install (no sudo, no DNS). The agent got the machine working over SSH.</p>
<h2 id="life">Life <a class="heading-anchor" href="#life"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="22-a-road-trip-playlist-for-my-mom">22. A road-trip playlist for my mom <a class="heading-anchor" href="#22-a-road-trip-playlist-for-my-mom"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>I was going to San Francisco with my mom (likes 70s, R&amp;B, soul) and my brothers (video game music, electronic). I asked for a playlist called &quot;SanFranTripping,&quot; at least 30 tracks, with a good mix of what we all like, saved straight to my Spotify. It used my listening history and my Spotify connection and came back with 60 songs.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-sanfrantripping.jpg" alt="The SanFranTripping playlist on Spotify: 60 songs, about 4 hours 15 minutes, described as an SF road trip blend for the fam, starting with September by Earth, Wind &amp; Fire, A-Punk by Vampire Weekend, and Lose Yourself to Dance by Daft Punk." width="1400" height="1133" loading="lazy" decoding="async"></figure><h3 id="23-11-years-of-my-spotify-data">23. 11 years of my Spotify data <a class="heading-anchor" href="#23-11-years-of-my-spotify-data"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>I requested my full streaming history from Spotify and had an agent turn it into a single-page HTML report: 11 years, 394,588 streams, 17,332 hours. It was research for FoFo Radio, an AI radio station idea, so the agent went well past totals.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-spotify-music-dna.jpg" alt="The top of a dark-themed Spotify listening report called FoFo Radio: 394,588 total streams, 17,332 hours listened, 8,577 unique artists, and a timeline of monthly streams from 2015 to 2026." width="1400" height="1001" loading="lazy" decoding="async"></figure><p>It ranked my top artists and tracks. &quot;Pogo&quot; by Digitalism wins by a mile, with 1,289 plays.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-spotify-top-artists.jpg" alt="The Top Artists section of the report: The National leads with 9,286 plays, followed by Modest Mouse at 7,070, Death Cab for Cutie at 5,072, then STRFKR, Brand New, Tegan and Sara, Santigold and Daft Punk." width="1400" height="1075" loading="lazy" decoding="async"></figure><figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-spotify-top-tracks.jpg" alt="The Top Tracks section of the report: Pogo by Digitalism leads with 1,289 plays, far ahead of A-Punk by Vampire Weekend at 824, Disparate Youth by Santigold at 756, and Hot Thoughts by Spoon at 753." width="1400" height="1032" loading="lazy" decoding="async"></figure><p>It split out the songs I never skip, which it labeled as &quot;A-list&quot; rotation candidates for the station, from the ones I bail on within seconds.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-spotify-skips.jpg" alt="The skip analysis section: a table of never-skipped tracks such as Afraid Of Everyone by The National with 602 plays, labeled A-list candidates, next to a table of the most skipped tracks with skip rates up to 90 percent." width="1400" height="967" loading="lazy" decoding="async"></figure><p>And it found my longest &quot;listening sessions,&quot; using a rule of no more than 10 minutes between tracks. The top one ran 47 hours and 741 tracks.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/nca-spotify-marathons.jpg" alt="The Marathon Listening Sessions table: the longest session started September 8, 2022, ran 47.74 hours across 741 tracks with Modest Mouse as the top artist, followed by a 45-hour session led by Kanye West." width="1400" height="907" loading="lazy" decoding="async"></figure><h3 id="24-reading-my-old-facebook-data">24. Reading my old Facebook data <a class="heading-anchor" href="#24-reading-my-old-facebook-data"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>I also exported my Facebook data and asked an agent to write about me from it, to &quot;learn about myself from back in the day… the good moments, the sad moments.&quot; That one was a trip.</p>
<h3 id="25-kitchen-timers-and-a-meal-plan">25. Kitchen timers and a meal plan <a class="heading-anchor" href="#25-kitchen-timers-and-a-meal-plan"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>My self-hosted assistant, Hermes, has set a cookie timer and a muffin reminder, and made me a meal-prep plan in Google Sheets.</p>
<h3 id="26-an-ai-phone-receptionist">26. An AI phone receptionist <a class="heading-anchor" href="#26-an-ai-phone-receptionist"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>For an AI phone receptionist I set up, the agent configured Twilio, my router, and DNS. The receptionist answered my test call with &quot;let me transfer you.&quot; My response: TRANSFER ME TO WHO????</p>
<h2 id="when-it-goes-sideways">When it goes sideways <a class="heading-anchor" href="#when-it-goes-sideways"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>It is not all smooth. A few of my favorite misses:</p>
<ul>
<li>An agent running my art shop created about 800 Etsy draft listings I did not want.</li>
<li>I found out my assistant could reach my Mac directly casually via conversation: &quot;you are not sandboxed??&quot;</li>
<li>Deploying this blog, the agent would not listen to my upload instructions: &quot;STOP IGNORING MY DIRECTIONS.&quot;</li>
</ul>
<h2 id="patterns-that-worked">Patterns that worked <a class="heading-anchor" href="#patterns-that-worked"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<ul>
<li><strong>Say READ ONLY or MAKE NO CHANGES in the prompt. Scoped API Keys!!!</strong> Most of the examples above started this way.</li>
<li><strong>Dry run first</strong> for anything that writes, creates, or can't be undone.</li>
<li><strong>Auto-rollback timers</strong> for network changes, so a mistake can undo itself.</li>
<li><strong>Disable, don't delete.</strong> You can turn something back on. You can't un-delete it.</li>
<li><strong>Stage credentials in Keychain</strong> so you are not pasting secrets into the chat or storing in plaintext on disk.</li>
<li><strong>Take a snapshot before admin changes</strong>, so you can restore.</li>
</ul>
<p>More on this in <a href="https://fterry.su.domains/posts/checking-ai-work-is-hard">Checking A.I. Work is Hard</a>.</p>
<h2 id="try-it">Try it <a class="heading-anchor" href="#try-it"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>There is a lot you can do with an a.i. coding agent. In these examples, I typically used Claude Code via Max subscription -- but a lot of other setups work too.</p>
<p>Next time you wanna get a big task done, if you know the steps and can provide the APIs, see if A.I. can do it!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Checking A.I. Work is Hard: How I Handle It</title>
      <link>https://fterry.su.domains/posts/checking-ai-work-is-hard</link>
      <guid isPermaLink="true">https://fterry.su.domains/posts/checking-ai-work-is-hard</guid>
      <pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate>
      <dc:creator>Forrester Terry</dc:creator>
      <description>A.I. makes more work than you can reasonably review. You cannot read your way out of that. Here is where I move the checking instead, plus the prompts I actually use.</description>
      <category>ai</category>
      <category>process</category>
      <category>review</category>
      <category>developers</category>
      <content:encoded><![CDATA[<p>You spent a few good cycles, did some troubleshooting, and finally, it works!</p>
<p>With A.I., &quot;working&quot; does not always mean &quot;ready to go&quot; though. Something can work but have:</p>
<ul>
<li>Security issues</li>
<li>Resource and cost issues</li>
<li>Usability issues</li>
<li>Incomplete features</li>
</ul>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/readyready.jpg" alt="Futurama Fry squinting suspiciously. Top caption: &quot;Not sure if 'ready' ready&quot;. Bottom caption: &quot;Or just ready&quot;." width="577" height="433" loading="lazy" decoding="async"></figure><p>We are making way more code than we can reasonably review.</p>
<p>The takeaway is not that you should read harder. You cannot read your way out of this. The takeaway is that you have to move the checking somewhere it fits.</p>
<h2 id="so-what-should-we-do-to-handle-this">So what should we do to handle this? <a class="heading-anchor" href="#so-what-should-we-do-to-handle-this"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>Whether you are shipping code, a spreadsheet, a policy draft, or a slide deck the A.I. built for you, here are some things to try.</p>
<p><strong>1. Check the plan first, not the output.</strong> The plan might be forty lines or so, compared to output that is three thousand. Before you prompt for what you want to build, ask for the approach first: read that carefully, approve it, and then let it build. Ask it to do some research before starting.</p>
<p><strong>2. Define what &quot;wrong&quot; would look like before you start.</strong> Try writing out: &quot;X is wrong if Y does not match Z.&quot; Then try reviewing the work afterwards against this list.</p>
<p><strong>3. Ask it what it changed that you did not ask for.</strong> &quot;List every change you made that was not required by what I asked. For each one, say why.&quot; A.I. tools quietly improve things. Renamed a field. Moved a file. Swapped a library. Individually reasonable, collectively how you end up somewhere you never chose.</p>
<p><strong>4. Focus on consequence, not size.</strong> Careful not to spend too much time reading every change and line. For critical functionality, read more closely. For other things, read at a high level.</p>
<p><strong>5. Do a security pass.</strong> Once the A.I. claims to be done, tell it to check the work it did for any security issues or gaps. I have seen the A.I. forget to implement authentication and basic security from time to time, especially while working on bigger tasks and prompts.</p>
<p><strong>6. Ask the A.I. to explain what it did.</strong> Sometimes I ask my agent to give me a summary of what it did and why. You can also ask it to explain how to manually test components or chat through any questions you have.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/reviewboth.jpg" alt="The two-buttons meme. A sweating man reaches for two buttons labelled &quot;High Level Human Review&quot; and &quot;Automated A.I. Review&quot;. Second panel, he gives a thumbs up: &quot;Both Sounds Good To Me&quot;." width="500" height="757" loading="lazy" decoding="async"></figure><h2 id="a-few-bonus-ones-for-developers">A few bonus ones for developers <a class="heading-anchor" href="#a-few-bonus-ones-for-developers"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p><strong>Commit often, not once per session.</strong> Be sure to do commits per milestone or feature. This makes things way easier to review ultimately, since you get smaller chunks of code changes.</p>
<p><strong>Review the test, then lock it in.</strong> Have the A.I. write the test from the requirement before it writes the code. Then review the tests to ensure they evaluate what you need. From there, you can use these tests as your bar for the coder. Do not let the coder adjust the tests once locked in, this is key.</p>
<p><strong>Some things are best for humans.</strong> If the risks are high, you should double check the work yourself. Do not let the automation handle critical actions like deletes or live data manipulation without supervision and review.</p>
<p><strong>Commit before you start.</strong> Otherwise, you risk the coding agent wiping out your uncommitted changes. I had this happen to me once, so it is worth throwing out there.</p>
<h2 id="you-own-it">You own it <a class="heading-anchor" href="#you-own-it"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>Though we can move faster than ever, we need to make sure our workflows and processes for quality keep up.</p>
<p>By creating a process, and having some checks before and after you start, you can keep up with the new pace at which everyone is moving.</p>
<h2 id="example-prompts">Example prompts <a class="heading-anchor" href="#example-prompts"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>These are ones I have used, cleaned up so you can paste them as is.</p>
<h3 id="before-you-start">Before you start <a class="heading-anchor" href="#before-you-start"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p><strong>Get a plan you can read instead of output you cannot.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>I have outlined the requirements and specs for this project in &#x3C;FILE>.</span></span>
<span class="line"><span>Before we write any code, do the relevant research and read the whole</span></span>
<span class="line"><span>requirements file, then write a detailed design document that will guide</span></span>
<span class="line"><span>the implementation. Save it as design.plan.md in the docs/ directory.</span></span>
<span class="line"><span>I will review it before we start building.</span></span></code></pre>
<p><strong>Make every requirement fail-able.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Rewrite these requirements so each one has a stable ID (REQ-001, REQ-002)</span></span>
<span class="line"><span>and an "Acceptance:" line describing exactly what must be true for it to</span></span>
<span class="line"><span>count as done. If a requirement cannot be given a checkable acceptance</span></span>
<span class="line"><span>criterion, flag it instead of guessing.</span></span></code></pre>
<p>Anything it flags is something you had not actually decided yet.</p>
<p><strong>Confirm you have a clean starting point.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Before we begin, confirm the working tree is clean and everything is</span></span>
<span class="line"><span>committed. If it is not, stop and tell me what is uncommitted.</span></span></code></pre>
<h3 id="guardrails-to-paste-in-every-time">Guardrails to paste in every time <a class="heading-anchor" href="#guardrails-to-paste-in-every-time"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p><strong>Stop it from acting before you have answered.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>DO NOT MAKE CHANGES WITHOUT ASKING. First investigate and answer my</span></span>
<span class="line"><span>question. Do not touch the code until I say go.</span></span></code></pre>
<p><strong>Stop it from quietly editing the plan.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Do not change the scope of our work in PROGRESS.md. If work remains, we</span></span>
<span class="line"><span>handle it later. Never delete tasks.</span></span></code></pre>
<p><strong>Make the dry run mandatory for anything that touches real data.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Default to read-only. Before any action that writes, deletes, or changes</span></span>
<span class="line"><span>live data, show me the full plan of what you are about to do and wait for</span></span>
<span class="line"><span>me to say go. One plan at a time, no chaining. If any part of it cannot be</span></span>
<span class="line"><span>undone, say so explicitly at the top.</span></span></code></pre>
<h3 id="after-it-says-it-is-done">After it says it is done <a class="heading-anchor" href="#after-it-says-it-is-done"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p><strong>Find out what it changed on its own.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>List every change you made that was not required by what I asked.</span></span>
<span class="line"><span>For each one, say why you made it.</span></span></code></pre>
<p><strong>Run a security pass and send it somewhere you will actually read it.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Review this application and make sure it is secure, both when run as a</span></span>
<span class="line"><span>normal user and as an administrator. Include code snippets and links to</span></span>
<span class="line"><span>the relevant code so I can review each finding myself. Put everything in</span></span>
<span class="line"><span>an MD document in the docs folder rather than answering here.</span></span></code></pre>
<p>Shorter version for a smaller project:</p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Do a security review of this entire app and repo. Identify anything that</span></span>
<span class="line"><span>needs to be addressed before it goes live.</span></span></code></pre>
<p>Writing findings to a file instead of the chat window is the whole trick. Chat scrolls away. A file is still there tomorrow.</p>
<p><strong>Ask how to check it yourself.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>How do I test this myself? Write a short guide covering how to manually</span></span>
<span class="line"><span>verify each piece, including anything I need to set up first.</span></span></code></pre>
<p>Asking for a summary lets the A.I. grade its own work. Asking for testing instructions hands you something you can go check independently.</p>
<h3 id="for-developers">For developers <a class="heading-anchor" href="#for-developers"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p><strong>Lock the tests before any code exists.</strong></p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code class="language-text"><span class="line"><span>Write the tests from the spec first, before any implementation exists.</span></span>
<span class="line"><span>Once I approve them, they are locked: you write code to pass those tests</span></span>
<span class="line"><span>and you do not modify or weaken them. If you believe a test is wrong,</span></span>
<span class="line"><span>stop and tell me. That is a conversation, not an edit.</span></span></code></pre>
]]></content:encoded>
    </item>
    <item>
      <title>You Picked the Project. So Why Can't You Start?</title>
      <link>https://fterry.su.domains/posts/you-picked-the-project</link>
      <guid isPermaLink="true">https://fterry.su.domains/posts/you-picked-the-project</guid>
      <pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate>
      <dc:creator>Forrester Terry</dc:creator>
      <description>You picked the project and you still cannot start. Five minutes, tasks matched to the energy you actually have, and fewer things open at once.</description>
      <category>focus</category>
      <category>productivity</category>
      <category>process</category>
      <content:encoded><![CDATA[<p>Sometimes it's hard to get motivated to work on things you don't want to do.</p>
<p>Sometimes it's hard to work on things you DO want to do.</p>
<p>That second one can feel confusing. You picked the project. You were excited about it last week! But now you're sitting there with the editor open doing absolutely nothing. This is normal.</p>
<p>I'm an engineering manager, and I still sometimes lose whole evenings staring at a file, thinking in circles.</p>
<p>What I have come to appreciate is that sometimes all you need to do is chip away at something over time, not all at once.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/project-complete.jpg" alt="Hide the Pain Harold meme, two panels. Top: &quot;Git repo initialized, blank README ready to go.&quot; Bottom, same forced smile: &quot;Project progress: 70% complete!&quot;" width="500" height="626" loading="lazy" decoding="async"></figure><h2 id="some-common-tricks">Some common tricks: <a class="heading-anchor" href="#some-common-tricks"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="1-just-start-five-minutes">1. Just start. Five minutes. <a class="heading-anchor" href="#1-just-start-five-minutes"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>That first step is the heaviest one. So give it five or ten minutes of real attention. More often than not you get hooked and keep going, and if you don't, you still move something forward and that counts a lot!</p>
<h3 id="2-if-its-tiny-and-youre-between-things-knock-it-out">2. If it's tiny and you're between things, knock it out <a class="heading-anchor" href="#2-if-its-tiny-and-youre-between-things-knock-it-out"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>If something takes two or three minutes and you're already between tasks, just do it. Don't log it, don't schedule it, don't file it in a tool. The overhead of tracking a two minute task costs more than the task.</p>
<p>But do NOT do this mid-flow. A &quot;quick&quot; fifteen minute detour is never fifteen minutes, because you also pay for the twenty it takes to get your head back where it was. Let the small stuff pile up, then clear it in one pass when you're ready for lighter work.</p>
<h3 id="3-do-less-at-once">3. Do less at once <a class="heading-anchor" href="#3-do-less-at-once"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>Too many active projects burns you out faster AND ships slower. Every open thing is renting space in your head whether you're working on it or not.</p>
<p>Putting something down is not failure. It's the sign of someone who has done this a few times, and knows how to say yes to the right things.</p>
<h3 id="4-block-the-time-but-be-reasonable-about-it">4. Block the time, but be reasonable about it <a class="heading-anchor" href="#4-block-the-time-but-be-reasonable-about-it"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>If you don't have the energy right now, spend a minute figuring out when you will, and put it on the calendar.</p>
<p>Two rules when you do:</p>
<ul>
<li><strong>Don't underfeed a task.</strong> An hour blocked for something that needs three is just a scheduled failure</li>
<li><strong>Don't overpack a day.</strong> Leave wiggle room. Things run long, that's normal</li>
</ul>
<p>Sometimes setting goals for the day vs a particular hour block can be helpful.</p>
<h2 id="some-of-my-personal-tricks">Some of my personal tricks: <a class="heading-anchor" href="#some-of-my-personal-tricks"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<h3 id="5-match-the-task-to-the-energy-you-actually-have">5. Match the task to the energy you actually have <a class="heading-anchor" href="#5-match-the-task-to-the-energy-you-actually-have"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>You may not have the same amount of gas every day. So plan accordingly.</p>
<p>I stopped sorting my work by just priority and started sorting it by energy cost:</p>
<ul>
<li><strong>High energy stuff</strong> (architecture, hard decisions, difficult conversations) goes in my sharpest window / peak of day</li>
<li><strong>Medium stuff</strong> (code review, routine dev, meetings) goes in the middle of the day</li>
<li><strong>Low stuff</strong> (email, docs, cleanup) goes in the valleys</li>
</ul>
<p>Low energy day? Don't try to refactor the payment gateway. Go update the README nobody has touched since 2023, or bump the dependencies that have been throwing warnings at you for a month.</p>
<p>Small stuff very much counts, and it usually gets you moving on the bigger tasks anyway.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/small-big.jpg" alt="The domino chain meme. A man crouches to tip over a tiny domino labelled &quot;Small Tasks&quot; at the end of a line that grows into a very large one labelled &quot;Big Task&quot;." width="726" height="500" loading="lazy" decoding="async"></figure><h3 id="6-let-yourself-actually-recover">6. Let yourself actually recover <a class="heading-anchor" href="#6-let-yourself-actually-recover"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>If burnout is what's stopping you, take the break. Heal.</p>
<p>Do not underestimate sleep, food, medication, and having a life outside the screen. If you're not recharging, you're running the battery down, and you WILL feel it. Usually at the worst possible time.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/burnout.jpg" alt="Mr Bean waiting meme, four panels, captioned &quot;Me trying to wait out burnout so I can get back to what burned me out.&quot; He stands waiting, checks his watch, sits down, then lies flat in the field." width="500" height="614" loading="lazy" decoding="async"></figure><h3 id="7-build-a-process-and-set-real-deadlines-pat-yourself-on-the-back">7. Build a process, and set real deadlines, pat yourself on the back! <a class="heading-anchor" href="#7-build-a-process-and-set-real-deadlines-pat-yourself-on-the-back"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p>For anything you do more than twice, have a process or workflow.</p>
<p>Write it down and follow it. It makes you faster every single time after the first.</p>
<p>I have a process for deciding whether to even take on a new project: determine the value, determine if someone else is already doing what I am doing, determine the effort needed, etc. If the project doesn't meet certain criteria, it is likely a candidate for skipping.</p>
<p>Set deadlines and mean them. Miss one, don't spiral about it. Do a quick retro on why things fell behind, make a plan, get back on track.</p>
<p>And celebrate the small wins. You will be shocked how much you've done when you start keeping track.</p>
<h2 id="remember-it-will-suck-sometimes">Remember: it will suck sometimes <a class="heading-anchor" href="#remember-it-will-suck-sometimes"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>It will not all be fun. There's a stretch in the middle of every project where it's just grinding and there's no fun in it at all.</p>
<p>Be gracious with yourself when that hits. But also take credit for what you're taking on, and take responsibility for it. You signed up for something hard. That's allowed to be hard.</p>
<h2 id="thats-the-game">That's the game <a class="heading-anchor" href="#thats-the-game"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>You don't need a perfect system. You need five minutes, a task that matches your energy, and fewer things open at once.</p>
<p>Start there. You can do this!</p>
]]></content:encoded>
    </item>
    <item>
      <title>A.I. Made It… But Can You Explain It?</title>
      <link>https://fterry.su.domains/posts/ai-made-it-but-can-you-explain-it</link>
      <guid isPermaLink="true">https://fterry.su.domains/posts/ai-made-it-but-can-you-explain-it</guid>
      <pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate>
      <dc:creator>Forrester Terry</dc:creator>
      <description>A vendor asked how my own system worked and I stalled. Here is what I do so A.I. writes the code without taking the understanding with it.</description>
      <category>ai</category>
      <category>skills</category>
      <category>developers</category>
      <content:encoded><![CDATA[<p>Imagine: You are in a meeting with a vendor. It is going fine. Then they ask a completely normal question:</p>
<p><strong>&quot;So, how exactly does X work?&quot;</strong></p>
<p>And you stall. Not because it is a hard question. Because you shipped X, you own X, and you did not actually write X. Your A.I. did, and you skimmed it, and it worked, and you moved on.</p>
<figure class="prose-figure"><img src="https://fterry.su.domains/img-files/explain-comic.jpeg" alt="Two-panel comic. Panel one: a vendor in a meeting asks &quot;So, how exactly does X work?&quot; Panel two: the engineer, typing rapidly into Claude Code, answers &quot;Uhhhhh... one second, let me double check.&quot;" width="1376" height="768" loading="lazy" decoding="async"></figure><p>I had this happen to me. It was no big deal, I explained myself and found the answer, but I did not like the feeling of not knowing.</p>
<h2 id="the-worry-is-real-and-it-is-not-new">The worry is real, and it is not new <a class="heading-anchor" href="#the-worry-is-real-and-it-is-not-new"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>One of the big fears about A.I. is what it does to how much we learn, and how well.</p>
<p>We are already leaning on it hard. People get their news explained to them. Kids get their homework answered. We get our custom software written. These are genuinely great use cases.</p>
<p>The problems start when:</p>
<ul>
<li>We read the A.I. summary and never look at the actual source.</li>
<li>We get the answer instead of doing the work, so we never actually learn much.</li>
<li>We accept the code without understanding it, and then something breaks and we have no idea where to even start looking.</li>
</ul>
<p>For a developer or IT professional, the bill comes due in three ways. You learn less about how your own system works. Your troubleshooting gets slower and shallower. And your codebase quietly turns into a liability, because you are responsible for something you cannot explain.</p>
<p>None of that shows up on day one.</p>
<hr>
<h2 id="the-manager-parallel">The Manager Parallel <a class="heading-anchor" href="#the-manager-parallel"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>I have kinda lived a version of this transition, and so has every manager reading this.</p>
<p>When you move from writing code all day to managing people who write code all day, you produce less. Way less. And you do lose a little of your edge. That is real.</p>
<p>But something else happens. You start exercising different skills, and they turn out to matter a lot: reading a system at the architecture level, asking the question that unblocks somebody, knowing which risk is actually the risk. You stop being the person who types the most and you become the person who understands more.</p>
<p>And honestly, your &quot;old&quot; skills become a foundation for those new skills. For non-technical folks, your expertise in your domain becomes incredibly useful for directing the output and checking the quality.</p>
<p>So the goal is not &quot;use less A.I.&quot; The goal is to make sure the thing you traded away is the typing, and not the understanding and awareness.</p>
<h2 id="how-i-avoid-this-issue">How I Avoid This Issue <a class="heading-anchor" href="#how-i-avoid-this-issue"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>I let A.I. do nearly all of my coding, and I have not felt myself getting dull. Here is what that actually looks like for me:</p>
<h3 id="general-tips">General Tips <a class="heading-anchor" href="#general-tips"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p><strong>Make it explain itself, on purpose.</strong> I ask a lot of &quot;why&quot; out loud. Some prompts I use constantly:</p>
<ul>
<li>&quot;Explain this like I have to defend it in a design review tomorrow.&quot;</li>
<li>&quot;What approaches did you consider and reject here, and why?&quot;</li>
<li>&quot;What is the riskiest part of this change?&quot;</li>
<li>&quot;What would break if traffic went up 10x?&quot;</li>
</ul>
<p>Any of those will teach you something or even catch real problems.</p>
<p><strong>Stop on the words you do not know.</strong> A term goes by that you cannot define: so stop and ask, or go look it up. Small but fundamental and very powerful.</p>
<p><strong>Recite it back before you ship it.</strong> For anything meaningful, I close my agent and try to explain the change or work to myself in my head. If I cannot get through it cleanly, I should review the work and plan again.</p>
<p><strong>Keep building things that challenge you.</strong> Do it on your own time or as time allows, on something you actually care about. Run into the wall, get stuck, try again. Nobody is watching, there is no deadline, and it is still a quick way to learn anything.</p>
<p><strong>Watch how other people use theirs.</strong> Everyone has worked out some workflow trick. Ask them.</p>
<h3 id="tips-particularly-for-developers">Tips Particularly For Developers <a class="heading-anchor" href="#tips-particularly-for-developers"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h3>
<p><strong>Read the logs yourself, especially when the agent is circling.</strong> Let the A.I. read them first, absolutely. But the moment your agent takes its third swing at the same bug, that is your cue to open the logs personally. Nine times out of ten there is a line in there that it skipped right past, and you spotting it is what breaks the loop.</p>
<p><strong>Use the design phase as your learning budget.</strong> Before anything gets built, I will have it lay out two or three approaches with real tradeoffs, and tell me who else does it that way. That is the requirements and design part of the SDLC. This is where most of my exposure to new frameworks and patterns comes from now.</p>
<p><strong>Read the diff instead of the file.</strong> Telling yourself you will &quot;skim the whole file later&quot; can end up a daunting task. Reading the diff is easier and it is the difference between approving code and reading code. If something looks weird in there, stop and ask the bot about it before it merges.</p>
<h2 id="so">So… <a class="heading-anchor" href="#so"><span aria-hidden="true">#</span><span class="visually-hidden">Permalink to this section</span></a></h2>
<p>Like I said, I let A.I. write most of my code. But my role remains involved, I am just not doing the actual writing anymore. I'm still testing, still designing, still exploring and asking questions.</p>
<p>Next time you finish something, try asking this to yourself.</p>
<p><strong>&quot;If someone stopped you in a meeting and asked how it works, could you tell them?&quot;</strong></p>
<p>Not line by line. Just the shape of it, out loud, without opening your laptop or asking your agent.</p>
<p>If yes, you are fine. Go faster, fam!</p>
<p>If not, there is likely something new for you to learn.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
