<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Richard Shade</title>
    <description>The latest articles on DEV Community by Richard Shade (@rshade).</description>
    <link>https://dev.clauneck.workers.dev/rshade</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F977293%2Fb027b676-a6c8-4783-a135-714995cd4eb4.jpeg</url>
      <title>DEV Community: Richard Shade</title>
      <link>https://dev.clauneck.workers.dev/rshade</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.clauneck.workers.dev/feed/rshade"/>
    <language>en</language>
    <item>
      <title>agentic experience for Go</title>
      <dc:creator>Richard Shade</dc:creator>
      <pubDate>Sat, 20 Jun 2026 01:58:54 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/rshade/agentic-experience-for-go-36mh</link>
      <guid>https://dev.clauneck.workers.dev/rshade/agentic-experience-for-go-36mh</guid>
      <description>&lt;p&gt;Years ago at RightScale I learned more about distributed systems from broken log files than from any design doc. A request came in the front door, fanned out through a workflow service, hit a plugin, and the plugin called some cloud API. When it failed, the only way to find &lt;em&gt;where&lt;/em&gt; was to line up the logs of every service it passed through. So we threaded a trace ID from the frontend all the way to the cloud call and back. With it, a failure was a search query. Without it, you were guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  the lesson came back
&lt;/h2&gt;

&lt;p&gt;It stuck. I just had to learn it twice.&lt;/p&gt;

&lt;p&gt;Building &lt;a href="https://github.com/rshade/finfocus" rel="noopener noreferrer"&gt;finfocus&lt;/a&gt;, a FinOps CLI that talks to cloud providers through gRPC plugins, I hit the same wall. Except this time there was a second reader who couldn't follow the logs: the agent. I'd ask Claude to find why a plugin call failed, and it would dig through the finfocus logs, reach the gRPC boundary, and find nothing on the other side. Unconnected traces, or no traces at all. I'd reached for &lt;a href="https://github.com/rs/zerolog" rel="noopener noreferrer"&gt;zerolog&lt;/a&gt; early, but I'd wired it up wrong. The CLI logged. The plugin logged. Nothing tied the two together, so neither of us could see across the boundary.&lt;/p&gt;

&lt;p&gt;Once the trace ID actually crossed that boundary, troubleshooting got fast. The agent could make a call, follow it from the finfocus CLI through the gRPC plugin and back, and tell me which side broke. Bug hunting went from a séance to a &lt;code&gt;grep&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  the second wall
&lt;/h2&gt;

&lt;p&gt;The next problem was stranger. finfocus has a TUI: pretty tables, built for human eyes. Ask an agent to read one and it gets the numbers wrong, because a table is laid out for a person, not a parser. Back then, agents were bad at this.&lt;/p&gt;

&lt;p&gt;So every command that renders a table also got a &lt;code&gt;--json&lt;/code&gt; that runs the &lt;em&gt;same function&lt;/em&gt; as the table does. Two renderings, one source of truth: pretty for humans, structured for agents. They can't disagree about the total, because the total is computed once.&lt;/p&gt;

&lt;h2&gt;
  
  
  canonizing it
&lt;/h2&gt;

&lt;p&gt;Then I did all of it again in gh-aw-fleet.&lt;/p&gt;

&lt;p&gt;By the time I was copying the same plumbing into a third project (stream separation, trace propagation, structured errors, a JSON twin for every human view), the question answered itself. Why am I rewriting this per repo? Canonize it once, let other people use it, and get the wisdom of the crowd (and the clankers) to make it better.&lt;/p&gt;

&lt;p&gt;That's ax-go: Agentic Experience for Go.&lt;/p&gt;

&lt;h2&gt;
  
  
  what it is
&lt;/h2&gt;

&lt;p&gt;ax-go is a single Go package (&lt;code&gt;github.com/rshade/ax-go&lt;/code&gt;, imported as &lt;code&gt;ax&lt;/code&gt;) that encodes the conventions a CLI needs so an agent can use it as reliably as a human can. The rules I kept rediscovering, written down once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;stdout is data, stderr is everything else.&lt;/strong&gt; The final JSON payload is the only thing on stdout. Logs, progress, and error envelopes go to stderr. An agent pipes stdout into a parser; you still read the logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traces that cross the boundary.&lt;/strong&gt; W3C Trace Context rides &lt;code&gt;context.Context&lt;/code&gt; through OpenTelemetry, so one call stays correlated from the CLI to whatever it calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same input, same bytes.&lt;/strong&gt; Two runs on the same input produce byte-identical stdout. An agent diffs outputs to catch drift, which is the machine version of trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A &lt;code&gt;__schema&lt;/code&gt; command.&lt;/strong&gt; Every tool can describe its own commands, flags, and types as JSON, so an agent grounds itself instead of guessing. There's an MCP adapter too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent-safety primitives.&lt;/strong&gt; An auto-generated &lt;code&gt;--idempotency-key&lt;/code&gt; so a retried create can't run twice, a universal &lt;code&gt;--dry-run&lt;/code&gt;, deterministic exit codes, and a structured error envelope.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  where it's at
&lt;/h2&gt;

&lt;p&gt;It's released and pre-1.0. v0.1.0 is the pinnable tag, with output contracts already frozen in code and pinned by golden tests, so the shapes an agent depends on won't move underneath it.&lt;/p&gt;

&lt;p&gt;It starts with what I use: zerolog and OpenTelemetry. Other structured loggers and output formats will follow, but I'd rather ship the opinions I've tested in finfocus and gh-aw-fleet than guess at the ones I haven't. It's the common DNA for my own tools first. If it's useful to yours, even better.&lt;/p&gt;

&lt;p&gt;Years later, I'm still threading trace IDs across plugin boundaries. The only difference is who's reading them now.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rshade/ax-go" rel="noopener noreferrer"&gt;Repo + docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rshade/ax-go/releases/latest" rel="noopener noreferrer"&gt;Latest release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>projects</category>
      <category>agents</category>
      <category>ai</category>
      <category>go</category>
    </item>
    <item>
      <title>where did the knife come from</title>
      <dc:creator>Richard Shade</dc:creator>
      <pubDate>Thu, 18 Jun 2026 01:28:54 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/rshade/where-did-the-knife-come-from-1ebp</link>
      <guid>https://dev.clauneck.workers.dev/rshade/where-did-the-knife-come-from-1ebp</guid>
      <description>&lt;p&gt;In third grade I had to write a how-to for making a peanut butter and jelly sandwich. I thought I'd nailed it. Four steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the bread.&lt;/li&gt;
&lt;li&gt;Get the peanut butter and the jelly.&lt;/li&gt;
&lt;li&gt;Spread the peanut butter on one slice, the jelly on the other.&lt;/li&gt;
&lt;li&gt;Put them together.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My teacher read it, looked up, and asked one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where did the knife come from?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I had the vision. I'd skipped the environment. The knife was real in my head (I'd seen it in the drawer that morning) so I assumed it was real on the page. It wasn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  three phases of getting this wrong with LLMs
&lt;/h2&gt;

&lt;p&gt;When I started taking prompt engineering seriously last year, I realized I was repeating the third-grade mistake. The arc was familiar enough that I think most people walk it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase one: the one-liner.&lt;/strong&gt; Single sentence. Expect the model to read your mind. When it fails, fight with it in the next turn instead of fixing the prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase two: the notebook.&lt;/strong&gt; Start saving prompts that worked. Notice that consistency matters. Notice that some prompts are doing work the model can't actually do without more setup around it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase three: the environment.&lt;/strong&gt; Realize the prompt isn't an instruction. It's a room. The model can only use what's in the room. If the knife isn't in the room, the sandwich doesn't get made, no matter how clearly you described the spreading motion.&lt;/p&gt;

&lt;h2&gt;
  
  
  what I write now
&lt;/h2&gt;

&lt;p&gt;Three things stacked on top of each other:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt;: where the ingredients live. What the model has access to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constraints&lt;/strong&gt;: how to use the tools, and how not to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acceptance criteria&lt;/strong&gt;: what "finished sandwich" actually looks like, in enough detail that the model can self-check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's no magic word. There's no clever phrasing trick. Prompt engineering is the same skill as writing a good bug report or a clear design doc: assume the reader doesn't have your context, then put the context in the document.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>where the copilot credits went</title>
      <dc:creator>Richard Shade</dc:creator>
      <pubDate>Tue, 16 Jun 2026 02:16:01 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/rshade/where-the-copilot-credits-went-3gn3</link>
      <guid>https://dev.clauneck.workers.dev/rshade/where-the-copilot-credits-went-3gn3</guid>
      <description>&lt;p&gt;A couple weeks ago I &lt;a href="https://rshade.github.io/posts/introducing-gh-aw-fleet/" rel="noopener noreferrer"&gt;introduced gh-aw-fleet&lt;/a&gt; and ended on a confession: I went in solving a drift-tracking problem and walked out with a FinOps one. That was foreshadowing. The bill has since arrived, and I'm late to writing about it, which is about right. The hot takes have burned out and FinOps X has packed up, and what's left is the one question worth keeping: where did the credits actually go?&lt;/p&gt;

&lt;h2&gt;
  
  
  what changed
&lt;/h2&gt;

&lt;p&gt;On June 1, GitHub &lt;a href="https://github.blog/news-insights/company-news/github-copilot-is-moving-to-usage-based-billing/" rel="noopener noreferrer"&gt;moved Copilot to usage-based billing&lt;/a&gt;. Premium request units are gone; in their place are AI Credits metered against token consumption: input, output, and cached, at each model's API rate. The sticker prices didn't move (Pro+ is still $39, Business still $19 a seat), but the math underneath did: every chat turn, every agentic session, every Copilot code review now draws down a credit balance. Reviewing a PR with Copilot bills against your Actions minutes too.&lt;/p&gt;

&lt;p&gt;The reaction was about what you'd expect. People &lt;a href="https://www.ghacks.net/2026/06/02/github-copilot-usage-based-billing-takes-effect-drawing-developer-backlash-over-rapid-credit-depletion/" rel="noopener noreferrer"&gt;watched a month of credits evaporate in an afternoon&lt;/a&gt; and called it meter shock.&lt;/p&gt;

&lt;p&gt;Now point that meter at a fleet. I run a dozen-odd repos with agentic workflows on them (code review, daily doc updates, malicious-code scans), and every one of them is now a little metered faucet.&lt;/p&gt;

&lt;h2&gt;
  
  
  why you can't see it
&lt;/h2&gt;

&lt;p&gt;The per-repo tools answer the wrong question. &lt;code&gt;gh aw&lt;/code&gt; sees one repo. The Actions UI sees one repo. Nothing sums it across the fleet, so the credits drain quietly and the first time you see the total is on the invoice. That's the same blind spot drift detection had before &lt;code&gt;status&lt;/code&gt;: the problem was never any single repo, it's that nobody was looking across all of them at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  where the credits went
&lt;/h2&gt;

&lt;p&gt;The same &lt;code&gt;fleet.json&lt;/code&gt; that declares which repos get which workflows is the natural place to attribute what those workflows cost. It already knows the repo, the profile, and (if you set one) the cost center. That's every dimension you'd want to slice spend by, sitting right there in the config.&lt;/p&gt;

&lt;p&gt;So that's what &lt;code&gt;gh-aw-fleet consumption&lt;/code&gt; does. It reads the credits each workflow burned straight from &lt;code&gt;gh aw logs --json&lt;/code&gt; and rolls them up along whichever axis you ask for: the whole fleet, or scoped to a single repo. There's no dollar field to read. Under the new model the unit &lt;em&gt;is&lt;/em&gt; the AI credit, so that's the column, with USD derived at the published rate of a cent per credit.&lt;/p&gt;

&lt;p&gt;Across the repos I run in the open, finfocus was the worst offender, so I pointed &lt;code&gt;consumption&lt;/code&gt; at it, grouped by workflow, and let it name the culprit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh-aw-fleet consumption rshade/finfocus &lt;span class="nt"&gt;--by&lt;/span&gt; workflow &lt;span class="nt"&gt;--trailing&lt;/span&gt; 7d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WORKFLOW                          AIC       COST
Agentic Dependabot Bundler        2295.78   $22.96
Daily Documentation Updater        796.54    $7.97
Agentic Workflow Audit Agent       487.23    $4.87
Daily Malicious Code Scan Agent    385.92    $3.86
Sub-Issue Closer                   313.61    $3.14
Code Simplifier                    137.49    $1.37
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's one of my own repos, one week: ~4,400 credits, about forty-four dollars. And the rollup answers the question in the title: one workflow, the Agentic Dependabot Bundler, is $22.96 of that. A single agent is more than half the bill.&lt;/p&gt;

&lt;p&gt;None of this appeared overnight. It arrived one release at a time: a billing diagnostic, then the &lt;code&gt;cost_center&lt;/code&gt; and &lt;code&gt;tier&lt;/code&gt; fields, then the rollup, then reading credits straight from the logs, then scoping it to a single repo. I was building toward a bill I knew was coming.&lt;/p&gt;

&lt;h2&gt;
  
  
  the point
&lt;/h2&gt;

&lt;p&gt;Here's what makes it land harder than a personal billing gripe. At this year's FinOps X, the FinOps Foundation and the Linux Foundation announced their intent to form a &lt;a href="https://www.linuxfoundation.org/press/linux-foundation-announces-the-intent-to-launch-the-tokenomics-foundation-to-establish-open-standards-for-ai-cost-management" rel="noopener noreferrer"&gt;Tokenomics Foundation&lt;/a&gt;: open standards for AI token economics, the first job being to extend the FOCUS cost spec to cover token billing. The conference is even renaming itself Tokenomicon for 2027. The unit of account is officially becoming the token.&lt;/p&gt;

&lt;p&gt;My rollup agrees with them. There was no dollar figure to read. The honest unit under usage-based Copilot is the credit, and the dollars are a cent-apiece derivation on top. I didn't build a standards body. I built a subcommand. But it turns out I was hand-rolling, for one fleet, the thing a dozen of the biggest names in the industry just agreed needs a spec: when the unit of work is a fleet, the unit of cost is too. And nothing else in the stack was going to tell me that one dependency bundler was quietly eating half my credits.&lt;/p&gt;

</description>
      <category>finops</category>
      <category>agents</category>
      <category>projects</category>
    </item>
    <item>
      <title>introducing gh-aw-fleet</title>
      <dc:creator>Richard Shade</dc:creator>
      <pubDate>Mon, 15 Jun 2026 01:22:31 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/rshade/introducing-gh-aw-fleet-57f4</link>
      <guid>https://dev.clauneck.workers.dev/rshade/introducing-gh-aw-fleet-57f4</guid>
      <description>&lt;p&gt;I started using &lt;a href="https://github.com/github/gh-aw" rel="noopener noreferrer"&gt;GitHub Agentic Workflows&lt;/a&gt; a couple months ago: small Claude/Copilot agents that run inside your CI for code review, daily doc updates, malicious-code scans, and PR fixes. You author them in markdown, they compile to GitHub Actions, and an AI agent does the work on each run.&lt;/p&gt;

&lt;p&gt;Got the first few repos working and hit the question: how am I actually tracking what's deployed on each of these? What version? What profile? What's drifted?&lt;/p&gt;

&lt;p&gt;So I built a tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  what it is
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gh-aw-fleet&lt;/code&gt; is a declarative fleet manager for GitHub Agentic Workflows. One &lt;code&gt;fleet.json&lt;/code&gt; declares your repos and which "profiles" of workflows they get; the CLI reconciles (&lt;code&gt;deploy&lt;/code&gt;, &lt;code&gt;sync&lt;/code&gt;, &lt;code&gt;upgrade&lt;/code&gt;, &lt;code&gt;add&lt;/code&gt;), all dry-run by default. It's a thin orchestrator around &lt;code&gt;gh aw&lt;/code&gt;, &lt;code&gt;gh&lt;/code&gt;, and &lt;code&gt;git&lt;/code&gt;, not a fork.&lt;/p&gt;

&lt;p&gt;It never rewrites workflow markdown. It answers one question (&lt;em&gt;who gets what workflow, when, and from which profile&lt;/em&gt;) and dispatches the actual file work to &lt;code&gt;gh aw&lt;/code&gt;. Every operation that touches a repo opens a PR there. Nothing force-pushes or commits to &lt;code&gt;main&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# check drift across the whole fleet, no clones, read-only&lt;/span&gt;
gh-aw-fleet status

&lt;span class="c"&gt;# bring a repo in line with its declared profile (PR, after a dry-run)&lt;/span&gt;
gh-aw-fleet &lt;span class="nb"&gt;sync &lt;/span&gt;acme/widgets &lt;span class="nt"&gt;--apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dry-run gate is the part I lean on most. &lt;code&gt;deploy&lt;/code&gt;, &lt;code&gt;sync&lt;/code&gt;, and &lt;code&gt;upgrade&lt;/code&gt; print exactly what they'd do and change nothing until you add &lt;code&gt;--apply&lt;/code&gt;. When you're touching a dozen repos at once, "show me first" is the difference between a tool you trust and one you babysit.&lt;/p&gt;

&lt;h2&gt;
  
  
  the part I didn't see coming
&lt;/h2&gt;

&lt;p&gt;Usage-based Copilot billing lands 2026-06-01. Every deployed workflow burns credits at metered rates, and the per-repo tools (&lt;code&gt;gh aw&lt;/code&gt;, the Actions UI) can't see across the fleet to tell you where the credits went.&lt;/p&gt;

&lt;p&gt;The same &lt;code&gt;fleet.json&lt;/code&gt; that declares which repos get which workflows turns out to be the natural place to attribute that consumption: by repo, by profile, or by cost center. A &lt;code&gt;consumption&lt;/code&gt; rollup is in flight. I went in solving a drift-tracking problem and walked out with a FinOps one.&lt;/p&gt;

&lt;h2&gt;
  
  
  what's shipped since launch
&lt;/h2&gt;

&lt;p&gt;v0.1.0 shipped April 21 with the core reconcile loop. It's at v0.2.0 now, and the gap is mostly about trusting the tool against more repos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;status&lt;/code&gt; / drift detection&lt;/strong&gt;: see what's out of line across the fleet without cloning anything, and gate a CI job on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON output + structured logging&lt;/strong&gt;: &lt;code&gt;-o json&lt;/code&gt; on the read commands, &lt;code&gt;zerolog&lt;/code&gt; underneath, so you can pipe results into &lt;code&gt;jq&lt;/code&gt; or an aggregator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resumable deploys&lt;/strong&gt;: pick a half-finished deploy back up at the commit or push gate instead of starting over.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;a Layer-1 security scanner&lt;/strong&gt;: secrets and structural rules checked before anything ships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;observability-plus&lt;/code&gt; profile + an HTTP 402 billing diagnostic&lt;/strong&gt;: early groundwork for the billing story above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HuJSON config&lt;/strong&gt;: comments and trailing commas in &lt;code&gt;fleet.json&lt;/code&gt;, so you can document &lt;em&gt;why&lt;/em&gt; a pin is set right next to the pin.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  where it's at
&lt;/h2&gt;

&lt;p&gt;v0.2.0, still pre-1.0: the CLI flags and the &lt;code&gt;fleet.json&lt;/code&gt; schema may move before 1.0. But I'm already using it to manage my own repos, and it's working great.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rshade/gh-aw-fleet" rel="noopener noreferrer"&gt;Repo + docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rshade/gh-aw-fleet/releases/latest" rel="noopener noreferrer"&gt;Latest release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>projects</category>
      <category>agents</category>
      <category>ai</category>
      <category>finops</category>
    </item>
    <item>
      <title>hello, world</title>
      <dc:creator>Richard Shade</dc:creator>
      <pubDate>Sun, 14 Jun 2026 23:54:44 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/rshade/hello-world-507n</link>
      <guid>https://dev.clauneck.workers.dev/rshade/hello-world-507n</guid>
      <description>&lt;p&gt;A blog is a long-running argument with yourself about what you actually believe. I've been meaning to start one for years.&lt;/p&gt;

&lt;p&gt;This is mine. It will be about FinOps and Pulumi (my day job), AI tooling and agent design, infrastructure war stories that deserve to exist outside Slack threads, and occasionally brisket and ham radio, because a blog without a person behind it is just SEO.&lt;/p&gt;

&lt;p&gt;Up next: a story about a third-grade peanut butter sandwich assignment, and why it explains most of what I think people get wrong about prompt engineering in their first six months.&lt;/p&gt;

&lt;p&gt;More soon. 73.&lt;/p&gt;

</description>
      <category>meta</category>
    </item>
  </channel>
</rss>
