<?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>Forem: Michael Tuszynski</title>
    <description>The latest articles on Forem by Michael Tuszynski (@michaeltuszynski).</description>
    <link>https://forem.com/michaeltuszynski</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1447774%2Fa99eea93-7845-4764-9fce-b1755bcfa456.png</url>
      <title>Forem: Michael Tuszynski</title>
      <link>https://forem.com/michaeltuszynski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/michaeltuszynski"/>
    <language>en</language>
    <item>
      <title>The Five Failures That Shaped My Personal AI Stack</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Tue, 26 May 2026 16:30:04 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/the-five-failures-that-shaped-my-personal-ai-stack-lno</link>
      <guid>https://forem.com/michaeltuszynski/the-five-failures-that-shaped-my-personal-ai-stack-lno</guid>
      <description>&lt;p&gt;Every working stack is the residue of failures the operator did not see coming. The &lt;a href="https://www.mpt.solutions/inside-the-stack-i-ship-from-daily/" rel="noopener noreferrer"&gt;Saturday piece&lt;/a&gt; showed the architecture as it stands now. This piece is the inverse — the five specific incidents that produced the current shape. Each one started as a quiet bug and ended as a permanent change in how the system runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure 1: The Eleven-Day Stale Lock
&lt;/h2&gt;

&lt;p&gt;On May 15 the session-end auto-commit hook tried to commit pending changes and failed. The commit attempt collided with a &lt;code&gt;.git/index.lock&lt;/code&gt; file that had been sitting in the repo since May 3 — a zero-byte file created by a crashed git process eleven days earlier. The hook had been quietly failing every session in between, and nobody had noticed because the failure mode was silent.&lt;/p&gt;

&lt;p&gt;Root cause: the hook had no defense against orphaned lock files. The original code assumed any &lt;code&gt;.git/index.lock&lt;/code&gt; it encountered was held by a live git process, which is true ninety-nine times out of a hundred. The hundredth time was a process that died without releasing the lock.&lt;/p&gt;

&lt;p&gt;Fix: a five-line stale-lock cleanup block. The hook checks for &lt;code&gt;.git/index.lock&lt;/code&gt; before attempting the commit. If the lock exists, it checks the file's mtime against the current time — a lock older than five minutes is suspicious. If the mtime is old, the hook then verifies via &lt;code&gt;lsof&lt;/code&gt; that no live process holds the file. Both conditions true: delete the lock. Either condition false: preserve it.&lt;/p&gt;

&lt;p&gt;Healthy auto-commits complete in under a second. The five-minute threshold cannot race a real concurrent run. Tested across three scenarios — no lock, old lock with no holder, fresh lock with a live holder — before the change shipped.&lt;/p&gt;

&lt;p&gt;The general lesson: hooks accumulate edge cases. The version of the hook that survives a year of daily use is the version that handles the failure modes you discovered along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure 2: The Silently Forked Database
&lt;/h2&gt;

&lt;p&gt;For eight days between May 4 and May 12, the content engine was writing to two different SQLite databases at the same time without anyone noticing. The cron pipeline at &lt;code&gt;~/services-local/content-engine/data/content.db&lt;/code&gt; was getting new topics from the daily trend-scan. The manual publish scripts in the same directory were also writing there. But a separate copy of the same database file at &lt;code&gt;~/.local/share/nexus/services-db/content-engine/content.db&lt;/code&gt;, which a broken Synology XSym symlink in the nexus path was silently resolving to, was getting the older trend-scan rows from the AI-driven path.&lt;/p&gt;

&lt;p&gt;Both files had &lt;code&gt;content&lt;/code&gt; rows, both had &lt;code&gt;topics&lt;/code&gt; rows, both had &lt;code&gt;publications&lt;/code&gt; rows, and the IDs overlapped. The reason this was not immediately catastrophic was that the disjoint content was bounded — temporal handoff between the two files happened cleanly on May 4 when the manual sprint began, so there were no genuine ID collisions, only orphaned rows on each side that the other side did not know about.&lt;/p&gt;

&lt;p&gt;Root cause: a Synology XSym pointer in the nexus directory that had been treating one of the source files as a symlink to a different location than the canonical one. The XSym format does not behave the same way as a POSIX symlink across mount boundaries; the difference between the two had been silent.&lt;/p&gt;

&lt;p&gt;Fix: an ID-offset merge that brought the orphaned rows from the older file into the canonical one (topics +1000, content/research/publications +100). The &lt;code&gt;sqlite_sequence&lt;/code&gt; table got rebumped. &lt;code&gt;PRAGMA foreign_key_check&lt;/code&gt; came back clean. Backups of both source databases were saved before the merge. The broken XSym symlink was replaced with a real POSIX symlink to the canonical path.&lt;/p&gt;

&lt;p&gt;The general lesson: silent forks are the worst class of incident because they degrade trust in the data retroactively. Anything that reports counts, dedupes, or makes scheduling decisions against the table is suspect until reconciled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure 3: The Re-Generated Drafts
&lt;/h2&gt;

&lt;p&gt;On May 13 the 10 AM &lt;code&gt;draft.ts&lt;/code&gt; cron produced two &lt;code&gt;pending_review&lt;/code&gt; drafts for titles that had already been published in April. The system was about to ship a second copy of two pieces that had been live for weeks. The drafts sat in Slack for review and got caught before they shipped, but the failure mode was that the cron pipeline would have happily generated them again the next day and the day after that until someone noticed.&lt;/p&gt;

&lt;p&gt;Root cause: two compounding gaps in the state machine. The &lt;code&gt;content_approve&lt;/code&gt; handler in &lt;code&gt;review-workflow.ts&lt;/code&gt; only advanced the content status; the topic status stayed at whatever the draft-runner left it, which meant a successfully published piece could leave its topic in &lt;code&gt;drafted&lt;/code&gt; (happy path) or &lt;code&gt;approved&lt;/code&gt; (if the Slack post mid-draft failed). Trend-scanner had a &lt;code&gt;getPublishedContentTitles()&lt;/code&gt; dedupe; &lt;code&gt;draft.ts&lt;/code&gt; did not. Then the May 12 DB merge brought two topics from the forked database in at &lt;code&gt;status='approved'&lt;/code&gt;, and the next day's 10 AM cron drained them.&lt;/p&gt;

&lt;p&gt;Fix in two parts. A defensive guard in &lt;code&gt;draft-runner.ts&lt;/code&gt; that imports &lt;code&gt;getPublishedContentTitles&lt;/code&gt;, builds a lowercase Set once per run, and skips and archives any topic whose title matches an already-published title. Re-drafting becomes structurally impossible regardless of upstream state-machine leaks. A state-machine fix in &lt;code&gt;review-workflow.ts&lt;/code&gt; that calls &lt;code&gt;updateTopicStatus(content.topic_id, 'archived')&lt;/code&gt; when the &lt;code&gt;content_approve&lt;/code&gt; case fires with a non-null &lt;code&gt;topic_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The general lesson: a state machine is only safe when the invariants hold from both directions. The trend-scanner had the dedupe; the drafter did not. Now both do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure 4: The 409 That Was a Success
&lt;/h2&gt;

&lt;p&gt;On May 2 the Instagram carousel publish for a T3 piece returned an HTTP 409 from Late.dev — "exact content already scheduled," with an &lt;code&gt;existingPostId&lt;/code&gt; field pointing at the post the request had just created. The carousel had successfully scheduled. The response said it had failed.&lt;/p&gt;

&lt;p&gt;Root cause: Late.dev's API was returning a duplicate-detection error against requests it had itself just enqueued, before its internal scheduler reconciled them. The 409 was a race condition between insert and dedup-check.&lt;/p&gt;

&lt;p&gt;Fix: a try/catch around the IG publish call that catches the 409, parses the &lt;code&gt;existingPostId&lt;/code&gt; from the error response, and treats it as success — inserts a publication row pointing at the returned ID, marks the content row as &lt;code&gt;status='published'&lt;/code&gt;. The fix lives in &lt;code&gt;publisher.ts &amp;gt; publishToInstagram&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The general lesson: integrations with vendor APIs accumulate vendor-specific quirks. The fix is not to file a support ticket and wait. The fix is to handle the quirk inside your wrapper and move on. The May 2 incident produced &lt;a href="https://www.mpt.solutions/your-agents-compliments-are-a-confession/" rel="noopener noreferrer"&gt;Hard-Won Lesson #21&lt;/a&gt; — the corpus reference to the broader pattern of catching false negatives at the integration layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure 5: The Named Foil
&lt;/h2&gt;

&lt;p&gt;On May 4, the contrarian piece "Agentic Coding Isn't the Trap. Supervising From Your Head Is." named the writer of the original argument I was rebutting and proceeded to characterize their position in ways that pushed beyond what they had actually written. Twelve days later, on May 16, the author of the original piece pushed back publicly in the LinkedIn comments — quoting their own piece to show they had never advocated the specific thing I had implied they advocated.&lt;/p&gt;

&lt;p&gt;The pushback was fair. The strawman risk had been highest precisely because their position was close enough to mine that the extrapolation felt safe. I acknowledged the correction publicly on LinkedIn, added an editor's note at the top of the original Ghost post linking back to the comment, and shipped a new reusable script (&lt;code&gt;scripts/add-editors-note-faye.ts&lt;/code&gt;) that uses the Ghost JWT auth pattern to add notes idempotently to any post.&lt;/p&gt;

&lt;p&gt;Root cause: a voice-and-discipline gap, not a code gap. Two patterns compounded — naming a foil author in the prose, and using the negative-parallelism title pattern ("X Isn't Y. Z is.") that depends on a strawman to work.&lt;/p&gt;

&lt;p&gt;Fix: two new entries in the feedback memory. The first bans the "X isn't Y. Z is." title and lede pattern across the corpus. The second bans naming the contrarian target in prose — the link to the source piece can stay, the URL slug can carry the author's name, but the in-prose attribution does not. Both rules are now part of the auto-loaded session context. Subsequent pieces — the May 19 Goodhart piece responding to a field guide, the May 20 co-design piece responding to an academic article — followed both rules and shipped clean.&lt;/p&gt;

&lt;p&gt;The general lesson: the corpus is the residue of editor's notes. Every voice-discipline rule worth keeping was learned from a specific incident where shipping without it produced a public correction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Survives
&lt;/h2&gt;

&lt;p&gt;The current stack is the survivor of these five and a dozen smaller incidents I am not writing up. The pieces of it that look obvious in retrospect — the stale-lock defense, the canonical-DB symlink, the dedupe guard in the drafter, the 409 catch in the publisher, the named-foil ban in the lint — each one came from a specific incident the original design did not anticipate.&lt;/p&gt;

&lt;p&gt;The stack is not what I planned. It is what is left after the failures pruned the parts that did not work. Anyone reading the &lt;a href="https://www.mpt.solutions/inside-the-stack-i-ship-from-daily/" rel="noopener noreferrer"&gt;Saturday architecture piece&lt;/a&gt; is looking at the convex hull of those five corrections, plus the smaller ones, plus the parts that worked the first time.&lt;/p&gt;

&lt;p&gt;Show your stack. Show the failures that shaped it. Show the editor's notes. The thing that ships is the thing that survived.&lt;/p&gt;

</description>
      <category>postmortem</category>
      <category>personalaistack</category>
      <category>developertools</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>What My AI Workflow Actually Costs Per Month</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Mon, 25 May 2026 16:30:09 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/what-my-ai-workflow-actually-costs-per-month-fp2</link>
      <guid>https://forem.com/michaeltuszynski/what-my-ai-workflow-actually-costs-per-month-fp2</guid>
      <description>&lt;p&gt;Most "AI is expensive" discourse is vague. The pieces that quote real numbers usually quote enterprise tier list prices for tools the writer does not personally run. The pieces that talk about personal use rarely quote any numbers at all.&lt;/p&gt;

&lt;p&gt;This is the ledger for a working personal AI stack that ships a five-surface daily content pipeline, runs four cron jobs, holds a SQLite memory database, and supports about thirty published pieces a month. Real line items, monthly recurring, in the rough order of largest to smallest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.anthropic.com/pricing" rel="noopener noreferrer"&gt;Claude Max subscription&lt;/a&gt;: $200/month.&lt;/strong&gt; This covers Claude Code, the writing model for every draft, the editor on every revision, the OAuth identity for tool integrations. No separate API key needed for Pro/Max users on most workflows. The two-hundred-a-month tier gives me the rate limits I need for daily use; the lower Pro tier at $20 ran out of capacity inside the first heavy week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic API spend, outside Max: roughly $30–60/month.&lt;/strong&gt; Used for the cron-driven trend-scan, digest, and draft pipeline that runs without an interactive Claude Code session — Sonnet for T1/T2 drafts, Opus for T3, occasional Haiku for the lint-eval cycle. Spend tracks topic volume. Slow weeks land near $30; busy weeks with deep research on every piece push toward $60.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://getlate.dev/pricing" rel="noopener noreferrer"&gt;Late.dev paid plan&lt;/a&gt;: about $30/month.&lt;/strong&gt; Hit the 20-post free cap on April 26. The upgrade was immediate because the alternative was bifurcating publishing across two manual flows for LinkedIn/X/IG. Current usage running 60+ posts a month across the three social surfaces means about $0.50 per post in distribution cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ghost.org/pricing" rel="noopener noreferrer"&gt;Ghost Pro hosting&lt;/a&gt;: $25/month.&lt;/strong&gt; The standalone option for self-hosting at lower cost on a VPS exists, but Ghost Pro covers backups, CDN, email delivery, and admin auth for less than the time cost of running it myself. The five-surface piece always starts at Ghost as the canonical URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.firecrawl.dev/pricing" rel="noopener noreferrer"&gt;Firecrawl&lt;/a&gt;: $20/month.&lt;/strong&gt; The base plan covers the trend-scan crawls and the per-piece research lookups (≥3 sources per T3 draft). Usage tracks topic generation rate, not piece count. Slow research months stay under the cap; weeks with five separate contrarian sources per piece can push over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev.to, Cloudflare, GitHub, Cursor (for occasional sidecar work): $0–20/month.&lt;/strong&gt; Dev.to is free for publishers. Cloudflare on the free tier handles DNS and Access for the dashboards. GitHub Free for personal repos. Cursor I use for one specific kind of work outside Claude Code; the free tier has been enough this month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAS storage and home server: roughly $15/month amortized.&lt;/strong&gt; A Synology DS920+ bought outright in 2023, running the canonical content-engine path mount and a few Plex services. Cost is electricity plus a notional five-year amortization of the hardware. Not strictly AI spend; without the NAS the content DB would live on a $5/month VPS instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain registrations (mpt.solutions, mpt.codes, a couple others): about $5/month amortized.&lt;/strong&gt; Annual renewals divided by twelve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Total
&lt;/h2&gt;

&lt;p&gt;Run the line items: $200 + $45 + $30 + $25 + $20 + $10 + $15 + $5 ≈ &lt;strong&gt;$350/month&lt;/strong&gt;, with seasonal variance pulling it to roughly $320–420 depending on usage.&lt;/p&gt;

&lt;p&gt;That is the gross. The net story is more interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Replaces
&lt;/h2&gt;

&lt;p&gt;Look at the equivalent enterprise plan that would deliver the same operator experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.microsoft.com/en-us/microsoft-365/blog/2025/12/02/microsoft-365-copilot-business-the-future-of-work-for-small-businesses/" rel="noopener noreferrer"&gt;Microsoft 365 Copilot Business&lt;/a&gt; is $21/user/month, but that covers AI in Word and Excel and Outlook — none of which is the agentic coding loop. Add ChatGPT Team at $30/user/month for the writing side. Add Cursor Business at $40/user/month for the coding side. Add an enterprise scheduling tool like Buffer for the social fanout at $100/month. Add a CMS subscription at Ghost-or-equivalent rates. Add an enterprise search API like Tavily or SerpAPI for the research crawls at $100/month.&lt;/p&gt;

&lt;p&gt;That assembled stack runs roughly $300/user/month for the licenses alone, and produces an experience that does not include any of: persistent cross-session memory, lint enforcement against my voice guide, queue-driven scheduled publish, custom hooks against my git workflow, or the SQLite schema that makes the dedupe and the cross-platform reconciliation work. Those parts would still need to be built on top.&lt;/p&gt;

&lt;p&gt;The personal stack costs less than the enterprise license stack and does more, because the wrapper is mine and the wrapper is where the payoff lives. This is the &lt;a href="https://www.mpt.solutions/the-coding-agent-stack-has-two-layers/" rel="noopener noreferrer"&gt;compose-the-stack argument from May 21&lt;/a&gt; in dollar form. The vendor positioning charges you for the model and the surface. The personal stack pays the vendor for the model only, and you build the surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Spend Lands Wrong
&lt;/h2&gt;

&lt;p&gt;Honesty about waste matters more than the gross number.&lt;/p&gt;

&lt;p&gt;The Anthropic API spend on the cron-driven pipeline is the line item with the worst yield. The AI-generated drafts get used about three days out of ten — the other seven, I write the piece by hand and run only the publisher path. The cron pipeline costs about $30/month in API calls to produce drafts that mostly get discarded in favor of human writing. I keep it running because the digest output is useful even when the drafts are not, but the marginal API call against an Opus draft I will not ship is the easiest line item to defend cutting.&lt;/p&gt;

&lt;p&gt;The Firecrawl cost runs higher than it needs to because the trend-scan queries are overlapping — TechMeme returns about 40% the same stories as the Hacker News pull, and the Reddit subreddit list is wider than it needs to be. A focused trend-scan would hit the same signal at half the credit cost.&lt;/p&gt;

&lt;p&gt;Late.dev is the line item with the worst risk profile. Single-vendor dependency on a fast-moving startup for three of the five surfaces. The May 2 IG 409 false-negative incident was an example of where the vendor's behavior diverges from documented contract, and the cost of switching is rewriting the publisher integration in &lt;code&gt;publisher.ts&lt;/code&gt;. Not painful, but real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Spend Lands Right
&lt;/h2&gt;

&lt;p&gt;The Claude Max subscription is the line item with the largest payoff by an order of magnitude. The work done in interactive Claude Code sessions — the actual writing, the actual drafting of these posts, the actual debugging of the publisher integration, the actual building of the personal stack itself — is what produces value. Cutting $200 there would tank the entire output. Doubling it would not change the output much, because the bottleneck is what I think and write, not the agent's rate limit.&lt;/p&gt;

&lt;p&gt;Ghost Pro is a small line item that has zero failure modes. Self-hosting would save $25/month at the cost of recurring incidents that compound over a year. The premium for not having to think about CMS uptime is the right premium.&lt;/p&gt;

&lt;p&gt;The lint-and-publisher infrastructure is free in operating cost and produces all of the consistency value. The compounding piece of this stack is not the line items that cost money. It is the parts I wrote myself that do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comparison That Matters
&lt;/h2&gt;

&lt;p&gt;A senior engineer at a company that has not yet rolled out an enterprise AI plan can run a personal stack equivalent to mine for about $350/month, build it in a weekend, and ship faster than the team will officially be allowed to ship for the next eighteen months. The math against the eventual enterprise plan that lands in 2027 will look like a rounding error.&lt;/p&gt;

&lt;p&gt;A senior engineer at a company that has rolled out an enterprise AI plan can run the same stack for the same $350/month, with the same independence, regardless of whether the official plan is good. The official plan being good is not a precondition for the personal stack working. The official plan being bad is not a reason to wait either.&lt;/p&gt;

&lt;p&gt;The cost is real. The payoff is realer. Three hundred and fifty dollars a month is what it costs me to ship at this rate. The exact mix will be different for everyone. The order of magnitude will not be.&lt;/p&gt;

</description>
      <category>personalaistack</category>
      <category>aicosts</category>
      <category>developertools</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>The Five Hooks That Change How You Ship With Claude Code</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Sun, 24 May 2026 20:21:04 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/the-five-hooks-that-change-how-you-ship-with-claude-code-m2o</link>
      <guid>https://forem.com/michaeltuszynski/the-five-hooks-that-change-how-you-ship-with-claude-code-m2o</guid>
      <description>&lt;p&gt;The &lt;a href="https://www.mpt.solutions/your-personal-ai-stack-is-the-new-dotfiles/" rel="noopener noreferrer"&gt;dotfiles piece from May 22&lt;/a&gt; named hooks as one component of a personal AI stack and moved on. They deserve more than a passing mention. Hooks are the primitive that turns taste into code — the &lt;a href="https://code.visualstudio.com/docs/editor/codebasics#_save-auto-save" rel="noopener noreferrer"&gt;editor's auto-format-on-save&lt;/a&gt; for AI work, run on the agent's actions instead of yours.&lt;/p&gt;

&lt;p&gt;Anthropic's &lt;a href="https://code.claude.com/docs/en/hooks" rel="noopener noreferrer"&gt;hooks documentation&lt;/a&gt; lists eight event types. Most published examples wire up one of them, demo a tiny safety check, and stop. The real payoff is in pairing the right hook to the right invariant for your work. Below are the five hooks I run, with the actual invariants they enforce.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hook 1: PreToolUse — Guard the Destructive Commands
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;PreToolUse&lt;/code&gt; fires before any tool call, with the tool name and arguments. The hook can approve, deny, or rewrite. The high-yield use is denying classes of commands you never want the agent to run unattended — &lt;code&gt;rm -rf&lt;/code&gt;, &lt;code&gt;git reset --hard&lt;/code&gt;, &lt;code&gt;git push --force&lt;/code&gt; to main, &lt;code&gt;gcloud auth revoke&lt;/code&gt;, &lt;code&gt;kubectl delete&lt;/code&gt; against production, anything with a flag that turns "ask first" into "do it now."&lt;/p&gt;

&lt;p&gt;The shape of the hook is a small shell script that reads the tool call from stdin, pattern-matches on dangerous combinations, and exits with a non-zero status to deny. Examples in production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deny &lt;code&gt;rm -rf&lt;/code&gt; against any path outside &lt;code&gt;/tmp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Deny &lt;code&gt;git push --force&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;master&lt;/code&gt; regardless of remote.&lt;/li&gt;
&lt;li&gt;Deny &lt;code&gt;--no-verify&lt;/code&gt; on &lt;code&gt;git commit&lt;/code&gt; unless &lt;code&gt;ALLOW_NO_VERIFY=1&lt;/code&gt; is set explicitly in the session env.&lt;/li&gt;
&lt;li&gt;Deny any &lt;code&gt;gh pr&lt;/code&gt; command with &lt;code&gt;--admin&lt;/code&gt; or auto-merge flags.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hook is a safety net, not a configuration. The agent already knows not to do these things. The hook catches the case where it almost did anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hook 2: PostToolUse — Auto-Lint Every Write
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;PostToolUse&lt;/code&gt; fires after a tool call completes, with the tool name, arguments, and result. The hook reads, runs whatever side effect you want, and returns. For file writes, this is where you run linting, formatting, type checking, and any project-specific guard.&lt;/p&gt;

&lt;p&gt;The shape: a hook that filters for &lt;code&gt;tool_name == "Write" || tool_name == "Edit"&lt;/code&gt;, then runs the relevant linter against the file path that was written. In my setup this means &lt;code&gt;prettier --write&lt;/code&gt; for JS/TS, &lt;code&gt;ruff check --fix&lt;/code&gt; for Python, &lt;code&gt;shellcheck&lt;/code&gt; for bash scripts. The hook does not block the agent's next action — by the time &lt;code&gt;PostToolUse&lt;/code&gt; runs, the write has already happened. It does silently fix what it can and report what it cannot.&lt;/p&gt;

&lt;p&gt;The win is consistency. Every file the agent writes ends up formatted the same way as every file I write. The agent's "I wrote this fast and ugly" output is indistinguishable from a deliberate commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hook 3: Stop — Session-End Auto-Commit with Stale-Lock Defense
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Stop&lt;/code&gt; fires when the agent finishes responding. This is the hook most people skip and where the highest payoff lives.&lt;/p&gt;

&lt;p&gt;My &lt;code&gt;Stop&lt;/code&gt; hook runs &lt;code&gt;git add -A &amp;amp;&amp;amp; git commit -m "&amp;lt;auto-commit message&amp;gt;"&lt;/code&gt; against any repo I have configured in &lt;code&gt;~/.claude/hooks/session-end-commit.sh&lt;/code&gt;. Every Claude Code session ends with a snapshot. I can always see what changed in the session because it is a real commit in real history.&lt;/p&gt;

&lt;p&gt;The interesting part is the stale-lock defense. On May 15 I discovered the session-end hook had been silently failing for eleven days against a 0-byte &lt;code&gt;.git/index.lock&lt;/code&gt; file left behind by a crashed git process on May 3. The fix was a five-line block that checks for the lock file, verifies its mtime is older than five minutes, verifies no process holds it via &lt;code&gt;lsof&lt;/code&gt;, and only then removes it. Live process: preserved. Stale lock: cleaned. Healthy auto-commits complete in under a second, so the five-minute threshold cannot race a real concurrent run.&lt;/p&gt;

&lt;p&gt;The lesson generalizes. Hooks accumulate edge cases. The first version of any hook works on the happy path. The version that survives a year of daily use is the one that handles the failure modes you discovered along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hook 4: SessionStart — Auto-Load Context
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;SessionStart&lt;/code&gt; fires when a new Claude Code session opens. This is where you pre-load the context your work needs every single time. The point is removing the recurring "read these three files first" prompt from your routine.&lt;/p&gt;

&lt;p&gt;Mine loads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The current state of the project's &lt;code&gt;SESSION-STATE.md&lt;/code&gt; — what's in progress, what's blocked, what's next.&lt;/li&gt;
&lt;li&gt;The relevant agent context file from &lt;code&gt;~/nexus/agents/&lt;/code&gt; based on the directory I am working in.&lt;/li&gt;
&lt;li&gt;A condensed log of yesterday's work — the last day's commits across the active projects.&lt;/li&gt;
&lt;li&gt;The active tasks from the queue file if one exists in the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hook returns text that gets injected into the session as a system reminder, the same shape as the auto-memory mechanism. By the time I type my first prompt, the agent already knows where I left off, what I am working on, and what is on the next-action list.&lt;/p&gt;

&lt;p&gt;This is the hook that turns Claude Code from a stateless assistant into a continuous-with-me collaborator without changing anything about the underlying model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hook 5: UserPromptSubmit — Prompt-Level Guards
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;UserPromptSubmit&lt;/code&gt; fires before the agent sees your prompt. The hook can rewrite the prompt, append context, or block submission. Most uses I see in the wild are filters for safety words, which is the boring case. The interesting cases are project-specific guards.&lt;/p&gt;

&lt;p&gt;Examples I run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the prompt contains "ship" or "publish" or "deploy" against the content-engine repo, the hook injects a reminder of the &lt;code&gt;--ship&lt;/code&gt; flag protection and the manual-publish pattern.&lt;/li&gt;
&lt;li&gt;If the prompt is a single command verb against a production directory (&lt;code&gt;run&lt;/code&gt;, &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;deploy&lt;/code&gt;), the hook injects the relevant CLAUDE.md section that explains the safer alternative.&lt;/li&gt;
&lt;li&gt;If the prompt mentions a person whose name appears in &lt;code&gt;~/nexus/agents/personal-contacts.md&lt;/code&gt;, the hook injects the relevant context — old college roommate, current employer relationship, the prior interaction — so the agent does not treat the message as cold-outreach.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hook does not block the prompt. It supplements it. The agent sees a richer version of what I typed, with context I would have had to remember to include otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hooks Are Actually For
&lt;/h2&gt;

&lt;p&gt;The pattern across all five is the same. The hook encodes a rule I will not enforce manually because I will forget. The forcing function is that the hook runs every single time, regardless of whether I remembered to invoke it.&lt;/p&gt;

&lt;p&gt;This is the same reason auto-format-on-save changed how teams write code in the 2010s. Not because format-on-save is technically interesting. Because the alternative — remembering to run the formatter every time — fails reliably enough that the team's code drifts from the style guide within a quarter.&lt;/p&gt;

&lt;p&gt;Hooks for AI work are the same primitive at a different layer. They are how individual operators encode the rules the institutional plan is still drafting. The team that ships with the same lint, the same auto-commit, the same context-loading, every single Claude Code session — across every engineer — has built something the enterprise rollout document will be eighteen months catching up to.&lt;/p&gt;

&lt;p&gt;Build yours. The five above are a working starting point.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>hooks</category>
      <category>developertools</category>
      <category>aicoding</category>
    </item>
    <item>
      <title>Inside the Stack I Ship From Daily</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Sat, 23 May 2026 16:30:04 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/inside-the-stack-i-ship-from-daily-dg4</link>
      <guid>https://forem.com/michaeltuszynski/inside-the-stack-i-ship-from-daily-dg4</guid>
      <description>&lt;p&gt;&lt;a href="https://www.mpt.solutions/your-personal-ai-stack-is-the-new-dotfiles/" rel="noopener noreferrer"&gt;Yesterday's piece&lt;/a&gt; prescribed building a personal AI stack instead of waiting for the enterprise plan. The natural objection — "fine, but what does that actually look like" — deserves a concrete answer. So here is mine, opened up.&lt;/p&gt;

&lt;p&gt;This stack ships a five-surface content pipeline daily, on cron, with file-based memory, lint enforcement, and a queue-driven publish runner. None of it is exotic. All of it is small enough that one operator built it on evenings, and nothing in it depends on anyone else's roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Directory Map
&lt;/h2&gt;

&lt;p&gt;The whole thing lives in three top-level directories.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~/services-local/content-engine/&lt;/code&gt; holds the active runtime — TypeScript ESM under &lt;code&gt;src/&lt;/code&gt;, scripts under &lt;code&gt;scripts/&lt;/code&gt;, drafts under &lt;code&gt;drafts/&lt;/code&gt;, the SQLite DB at &lt;code&gt;data/content.db&lt;/code&gt;, the LaunchAgent log paths under &lt;code&gt;logs/&lt;/code&gt;. About 4,000 lines of TypeScript across roughly fifteen source files. Nothing in here is a framework. Each file does one thing.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~/.claude/&lt;/code&gt; holds the Claude Code configuration that drives my interactive sessions — slash commands under &lt;code&gt;commands/&lt;/code&gt;, hooks under &lt;code&gt;hooks/&lt;/code&gt;, the keybindings file, the settings layers (global, project, local). The hooks are how I encode my own non-negotiables. The commands are how I encode the workflows I run every week.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~/nexus/&lt;/code&gt; holds the agent context files and the memory index. &lt;code&gt;MEMORY.md&lt;/code&gt; is a one-line-per-entry index that gets loaded into every Claude Code session via the auto-memory mechanism. The actual memory entries live next to it as one file each — &lt;code&gt;feedback_*.md&lt;/code&gt; for behavior rules, &lt;code&gt;project_*.md&lt;/code&gt; for ongoing work context, &lt;code&gt;user_*.md&lt;/code&gt; for personal preferences, &lt;code&gt;reference_*.md&lt;/code&gt; for pointers to external systems. Filesystem-backed, append-only, indexed, survives any model deprecation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pipeline
&lt;/h2&gt;

&lt;p&gt;Four cron jobs do the real work, scheduled via macOS LaunchAgents under &lt;code&gt;~/Library/LaunchAgents/ai.nexus.content-*.plist&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;trend-scan&lt;/code&gt; at 7 AM PT&lt;/strong&gt; pulls topics from TechMeme RSS, Hacker News Algolia, fifteen Reddit subreddits, and Firecrawl search queries. About 45 new topic rows land in &lt;code&gt;topics&lt;/code&gt; each morning, scored on a relevance weight, status set to &lt;code&gt;proposed&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;digest&lt;/code&gt; at 9 AM PT, weekdays&lt;/strong&gt; posts the top-scoring topics into a Slack channel with Approve/Reject/Tier buttons. I either approve a topic or reply with a URL of my own.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;draft&lt;/code&gt; at 10 AM PT&lt;/strong&gt; picks up approved topics, runs Firecrawl research to pull at least three sources, generates a draft via the writer module (Sonnet for T1/T2, Opus for T3), runs lint, posts the draft into Slack with Approve/Edit/Reject buttons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;publish&lt;/code&gt; at 11 AM PT&lt;/strong&gt; picks up approved drafts and ships them through &lt;code&gt;publisher.ts&lt;/code&gt; to Ghost (T3 blog) → Dev.to (cross-post with canonical URL from Ghost) → LinkedIn and X via Late.dev → Instagram carousel via Satori-rendered slide PNGs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The schema is four tables: &lt;code&gt;topics&lt;/code&gt;, &lt;code&gt;content&lt;/code&gt;, &lt;code&gt;research&lt;/code&gt;, &lt;code&gt;publications&lt;/code&gt;. Status fields drive the state machine: topics flow &lt;code&gt;proposed → approved → drafted → archived&lt;/code&gt;; content flows &lt;code&gt;draft → lint_passed → pending_review → approved → published&lt;/code&gt;. Publications get a row per successful platform delivery with the external ID and external URL for later reconciliation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manual Pattern That Coexists
&lt;/h2&gt;

&lt;p&gt;The AI-driven pipeline above ships when I let it. Most days I write the piece by hand instead, in a &lt;code&gt;drafts/*.md&lt;/code&gt; file under a structured header pattern — one second-level heading per surface (long-form blog body, LinkedIn body, X body, Instagram caption, hashtag lists, slide carousel JSON), parsed at publish time by the same script that runs the platform fanout.&lt;/p&gt;

&lt;p&gt;Each manual draft gets a matching &lt;code&gt;scripts/publish-&amp;lt;slug&amp;gt;.ts&lt;/code&gt; script that requires an explicit &lt;code&gt;--ship&lt;/code&gt; flag — bare invocation exits without publishing — parses the draft into surface-specific content rows, calls the same &lt;code&gt;publisher.ts&lt;/code&gt; functions the cron uses, and writes status updates back to the DB. Same five-surface fanout. Same lint records. Same &lt;code&gt;publications&lt;/code&gt; rows. The difference is that the writing is mine line-by-line instead of generated.&lt;/p&gt;

&lt;p&gt;Both paths converge at the publisher layer. The AI pipeline and the manual pattern are two front ends to the same back end.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lint Layer
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;src/lint.ts&lt;/code&gt; enforces voice. Roughly fifty banned words from my voice guide — the usual marketing-prose tells, the kind a reader recognizes on sight. Fifteen banned phrases. Word-count ranges per tier (T1: 50–200, T2: 150–600, T3: 600–2000). No question openers. No generic "state of the industry" openers. Concrete-example heuristic for T2+. Inline citation count minimum for T3 — at least three markdown hyperlinks.&lt;/p&gt;

&lt;p&gt;The lint is the line that catches drift. It catches the banned word I almost shipped yesterday — the wrapper-pattern post originally used a different word in the backlink that lint refused, prompting me to rename and re-link without breaking the citation. It catches negative-parallelism title patterns I trained myself to write before I had banned them.&lt;/p&gt;

&lt;p&gt;The taste lives in the lint file. Anyone reading it can see what I will not ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Memory Loop
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;MEMORY.md&lt;/code&gt; is loaded into every Claude Code session at session start. It is an index, not a memory — one line per entry, each pointing to a separate &lt;code&gt;*.md&lt;/code&gt; file in the same directory. The actual memories are typed: &lt;code&gt;feedback_*&lt;/code&gt; for behavior rules, &lt;code&gt;project_*&lt;/code&gt; for context that decays, &lt;code&gt;user_*&lt;/code&gt; for stable preferences, &lt;code&gt;reference_*&lt;/code&gt; for pointers to external systems.&lt;/p&gt;

&lt;p&gt;This is the &lt;a href="https://www.mpt.solutions/three-memory-systems-under-one-login-stop-picking-sides/" rel="noopener noreferrer"&gt;wrapper-pattern argument from May 3&lt;/a&gt; in working form. Vendor memory is not durable across providers or model deprecations. Files are. Every memory in this system survives Claude version changes, model deprecations, and provider switches. The only operation that ends a memory is me deleting the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Queue and the Wrapper Layer
&lt;/h2&gt;

&lt;p&gt;A queue file at &lt;code&gt;queue/posts-queue.json&lt;/code&gt; lists pre-drafted pieces with target dates and the publish script for each. A runner script reads the queue at noon PT daily, picks today's pending entry, executes its publish script with &lt;code&gt;--ship&lt;/code&gt;, marks it shipped on success or leaves it pending with a logged error on failure. This was &lt;a href="https://www.mpt.solutions/the-coding-agent-stack-has-two-layers/" rel="noopener noreferrer"&gt;yesterday's compose-the-stack argument&lt;/a&gt; in working form — Claude Code as the writing worker, a hand-rolled cron-driven orchestrator as the durable runtime.&lt;/p&gt;

&lt;p&gt;The whole orchestrator is about 90 lines of TypeScript. It does not need to be more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Stack Does Not Do
&lt;/h2&gt;

&lt;p&gt;It does not optimize for anyone but me. It does not have a UI. It does not have a settings page. It does not scale to a team of fifty without rewrites. It does not handle multi-tenant. It does not have a billing layer. None of those features would improve my daily ship rate. All of them would slow me down.&lt;/p&gt;

&lt;p&gt;The point of a personal stack is that the operator and the user are the same person. The constraints that drive enterprise product complexity — onboarding, support, multi-tenancy, role-based access — disappear. What is left is the substrate, the pipeline, and the taste.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Replication Cost
&lt;/h2&gt;

&lt;p&gt;Most of what is in here is replicable in a weekend.&lt;/p&gt;

&lt;p&gt;Skills, hooks, slash commands, and MCP servers ship with Claude Code. The publisher layer is platform SDKs wrapped in 488 lines of TypeScript. The lint layer is regex matching plus a banned-word list. The memory layer is a directory of markdown files and a one-line index. The queue runner is ninety lines.&lt;/p&gt;

&lt;p&gt;The reason most engineers do not have a stack like this is not technical difficulty. It is the absence of a forcing function. Daily shipping is the forcing function. Once you commit to publishing every day, you find out within a week which parts of the workflow are friction and which parts are taste. The friction gets automated. The taste gets encoded in lint. What remains is the writing.&lt;/p&gt;

&lt;p&gt;That is the stack. The components are boring. The discipline of having them all wired together is the asset.&lt;/p&gt;

</description>
      <category>personalaistack</category>
      <category>claudecode</category>
      <category>developertools</category>
      <category>contentengineering</category>
    </item>
    <item>
      <title>Your Personal AI Stack Is the New Dotfiles</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Fri, 22 May 2026 17:23:40 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/your-personal-ai-stack-is-the-new-dotfiles-5g0h</link>
      <guid>https://forem.com/michaeltuszynski/your-personal-ai-stack-is-the-new-dotfiles-5g0h</guid>
      <description>&lt;p&gt;Every senior engineer who has shipped meaningful work in the last thirty years has carried a personal dev environment with them. Emacs configs, vim plugins, shell aliases, dotfiles repos, custom prompts, terminal multiplexer setups, a handful of scripts that exist only on their laptop and do exactly what the work needs. Nobody waited for IT to mandate the right &lt;code&gt;.bashrc&lt;/code&gt;. The configurations that actually got used were the ones tuned to the operator, by the operator, and accumulated over years.&lt;/p&gt;

&lt;p&gt;AI adoption is the same shape, on a thirty-year delay. The "wait for the enterprise plan to roll out" path is the same path that left people running Outlook in 1998 while the early adopters ran their own mail server with elm and procmail. The configuration that wins, again, is the one tuned to your work — not the team average.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Institutional Lag Is Structural, Not Solvable
&lt;/h2&gt;

&lt;p&gt;The enterprise AI committee, the IT rollout, the sanctioned LLM provider, the official acceptable-use policy — these are eighteen to twenty-four months behind what the team's power users already do. The cause is structural. Committees cannot iterate at the rate of an individual operator who is using the tool every day and rewiring their workflow weekly. Putting better people on the committee does not fix this; the structure itself caps the rate of change.&lt;/p&gt;

&lt;p&gt;The historical record is unambiguous. Git was an individual-power-user tool from Linus's 2005 release through about 2010, and only became enterprise standard somewhere around 2015 — a full decade after it existed. As of &lt;a href="https://survey.stackoverflow.co/2025/technology" rel="noopener noreferrer"&gt;the 2025 Stack Overflow Developer Survey&lt;/a&gt;, Git sits above 90% adoption across professional developers. The enterprise mandate followed the power-user adoption by years. Same story for Slack (founded 2013, dominant by ~2019), Docker (released 2013, enterprise standard by ~2017), VS Code (released 2015, dominant IDE by ~2019). The mandate always followed.&lt;/p&gt;

&lt;p&gt;The people who outperformed in each of those windows were the people who adopted early, built personal infrastructure around the new tool, and accumulated workflow taste before the enterprise plan caught up. In every case, the official plan eventually arrived, and in every case it was late, incomplete, and missing the discipline-specific patterns the power users had already worked out. The same thing is happening with AI right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Personal AI Stack Actually Is
&lt;/h2&gt;

&lt;p&gt;The concrete components are not exotic. Most of them ship in the tools you already have. The work is in assembling them.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;persistent memory layer in files you own&lt;/strong&gt;. CLAUDE.md, MEMORY.md, per-project context files, an &lt;code&gt;agents/&lt;/code&gt; directory of role-specific context. Not vendor memory. Filesystem memory that travels with you across providers and survives any model deprecation. This is the &lt;a href="https://www.mpt.solutions/three-memory-systems-under-one-login-stop-picking-sides/" rel="noopener noreferrer"&gt;wrapper-pattern argument&lt;/a&gt; from earlier this month.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;hooks system that enforces your taste&lt;/strong&gt;. Anthropic shipped &lt;a href="https://code.claude.com/docs/en/hooks" rel="noopener noreferrer"&gt;hooks in Claude Code&lt;/a&gt; — PreToolUse, PostToolUse, Stop, SessionStart, SubagentStop, UserPromptSubmit. The hooks are how you encode your own non-negotiables: don't let the agent run a destructive command without confirmation, lint every write, log every session, refuse to commit with TODO markers. The hook is the editor's &lt;code&gt;auto-format on save&lt;/code&gt; for AI work.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;set of slash commands for your repeatable workflows&lt;/strong&gt;. The five or six things you do every week — the standup digest, the PR review pass, the architecture sketch, the test triage — get encoded as one-character invocations. The commands are personal because the workflows are personal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt;, the procedural memory layer. Anthropic's &lt;a href="https://code.claude.com/docs/en/skills" rel="noopener noreferrer"&gt;skills documentation&lt;/a&gt; covers the platform-native version. The open standard at &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;agentskills.io&lt;/a&gt; makes skills portable across agents — Claude Code, Codex, Gemini CLI, the Hermes orchestrator from &lt;a href="https://www.mpt.solutions/the-coding-agent-stack-has-two-layers/" rel="noopener noreferrer"&gt;yesterday's piece&lt;/a&gt;. A skill captures a pattern you have already executed enough times to formalize.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP servers wrapping the tools you actually use daily&lt;/strong&gt;. Not a marketplace download. A small set of MCP integrations for the specific systems your work touches — your data warehouse, your project tracker, your finance system, your private docs. Most people will end up writing one or two themselves; the rest can be borrowed.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;orchestrator-worker compose&lt;/strong&gt;. Claude Code as the in-session worker, a wrapper like Hermes Agent (or one you write yourself) as the durable cross-session orchestrator. The compose pattern was the argument of &lt;a href="https://www.mpt.solutions/the-coding-agent-stack-has-two-layers/" rel="noopener noreferrer"&gt;yesterday's piece&lt;/a&gt; and it is the structural answer to single-vendor lock-in.&lt;/p&gt;

&lt;p&gt;That is the kit. None of these components is hard individually. The work is in assembling and tuning them to the actual job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "The Way You Want" Matters
&lt;/h2&gt;

&lt;p&gt;Enterprise AI plans optimize for the median user, which is by definition not you. The median user does not have your discipline-specific edge cases, your taste in code, your judgment about what is worth automating, the specific failure modes you have learned to anticipate from a decade of doing the work. The committee output is a lowest-common-denominator policy, and lowest-common-denominator policies produce lowest-common-denominator outputs.&lt;/p&gt;

&lt;p&gt;A personal AI stack optimizes for the operator, which is you. The skill that captures your specific way of running a PR review will outperform a generic prompt template. The hook that enforces your team's actual code conventions will outperform the model's default style guide. The memory file that holds your project's actual history will outperform a context window that starts empty every Monday.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Personal Stack Becomes the Official One
&lt;/h2&gt;

&lt;p&gt;This is the part the institutional planners get wrong. Every enterprise standard started as one person's hobby project. The path is consistent across thirty years of tools: someone builds it for themselves; it outperforms the team's sanctioned approach; other engineers adopt it informally; the informal pattern becomes "how we do this here"; eventually official sanction follows, or the official plan is quietly replaced by the personal pattern.&lt;/p&gt;

&lt;p&gt;This is happening at companies right now with AI infrastructure, in places where the official plan has not yet arrived. A working content pipeline that ships across five surfaces a day with a SQLite memory database and a hand-rolled orchestration layer — for &lt;a href="https://www.mpt.solutions/your-marketing-team-is-now-a-software-vendor/" rel="noopener noreferrer"&gt;a concrete example&lt;/a&gt;, the kind of system the marketing team would have built if there were a paved road — starts as one engineer's weekend project and ends as the de facto company standard. The official plan eventually arrives and either ratifies the existing pattern or admits it lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Caveat
&lt;/h2&gt;

&lt;p&gt;Some employers will discipline shadow tooling on principle. If your environment is one of those, you have to play by it. But most companies do not. Most companies have a vague "AI policy in progress" posture that buys nine to eighteen months of operator latitude, and the operators who use that window will be the ones authoring the policy when it eventually drops. The right posture during that window is the same posture senior engineers have always taken with personal infrastructure: do not ask permission for your own dev environment, ship value, let the work speak.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Window
&lt;/h2&gt;

&lt;p&gt;The official AI adoption plan at most companies will land in 2027 or 2028. It will be late, incomplete, and miss the discipline-specific work you do. The personal AI stack you build in 2026 is the only piece under your direct control. The institutional plan will, as it has every time before this, eventually follow the people who built theirs early.&lt;/p&gt;

&lt;p&gt;Build the stack you want. Make it the official one by being the person who knew how before the committee did.&lt;/p&gt;

</description>
      <category>personalaistack</category>
      <category>developertools</category>
      <category>claudecode</category>
      <category>aiadoption</category>
    </item>
    <item>
      <title>The Coding Agent Stack Has Two Layers</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Thu, 21 May 2026 15:14:38 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/the-coding-agent-stack-has-two-layers-2chf</link>
      <guid>https://forem.com/michaeltuszynski/the-coding-agent-stack-has-two-layers-2chf</guid>
      <description>&lt;p&gt;The current "&lt;a href="https://www.youtube.com/results?search_query=hermes+agent+vs+claude+code" rel="noopener noreferrer"&gt;Hermes Agent vs Claude Code&lt;/a&gt;" framing is the wrong comparison. The two tools live at different layers of the coding agent stack, and most of the YouTube hot takes treating them as alternatives are reading them as if they competed for the same job. They do not. Claude Code is a worker. Hermes is an orchestrator that can use Claude Code as one of its workers. The argument is not which to pick. It is which layer you are optimizing.&lt;/p&gt;

&lt;p&gt;Here is what is actually different between them, and where each one earns its keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude Code Is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://code.claude.com/docs/en/changelog" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; is Anthropic's official CLI, with native access to Opus 4.7, Sonnet 4.6, and Haiku 4.5 — currently the strongest production-grade coding models. It runs on your machine, in your terminal or IDE, and pairs with the Claude Max subscription via OAuth so most users do not need a separate API key. The native tool-use loop — Read, Write, Edit, Bash, Task, Grep, Glob — is tight, the hooks system (PreToolUse, PostToolUse, Stop, SessionStart) is mature, MCP integration works, and the recently shipped /goal command added single-session unattended completion loops in v2.1.139.&lt;/p&gt;

&lt;p&gt;Claude Code is stateless across sessions by design. Every conversation starts in an empty room. The &lt;code&gt;--resume&lt;/code&gt; and &lt;code&gt;--continue&lt;/code&gt; flags restore a single recent session; there is no persistent memory layer that surfaces what you worked on last Tuesday.&lt;/p&gt;

&lt;p&gt;This is a feature, not a bug, if your work fits inside the session. Single-machine, in-the-loop coding work — pair programming with the agent, debugging a specific issue, refactoring a module, writing a script — is where Claude Code is hardest to beat. The model quality shows up most in the lines of code that get written between tool calls, and on raw coding tasks where the answer fits the context window, &lt;a href="https://pub.towardsai.net/i-tested-hermes-agent-vs-claude-code-vs-openclaw-on-18-real-tasks-the-10-week-old-one-cheats-by-0f2881a10213" rel="noopener noreferrer"&gt;the 18-task comparison published this week&lt;/a&gt; shows Claude Code wins its share — four of eighteen tasks went to it on raw coding chops alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hermes Is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hermes-agent.nousresearch.com/docs/" rel="noopener noreferrer"&gt;Hermes Agent&lt;/a&gt; is the open-source orchestrator from Nous Research. Its v0.13.0 "Tenacity Release" shipped May 7 with persistent /goal loops, durable multi-agent Kanban with heartbeat and retry budgets, checkpoints v2, and post-write delta lint. The repository as of that release counts 864 commits and 588 merged PRs from 295 contributors — fast-moving but real.&lt;/p&gt;

&lt;p&gt;The architectural difference from Claude Code is in three places.&lt;/p&gt;

&lt;p&gt;First, &lt;strong&gt;memory is persistent and indexed&lt;/strong&gt;. Hermes ships with a SQLite database under FTS5 full-text indexing that holds every session you have ever run through it. When you ask it to "fix the bug we were chasing on Friday," it greps Friday's transcript, pulls the relevant turns into context, and resumes. The "Honcho dialectic user modeling" layer builds a deepening profile of how you work across sessions. This is the single biggest functional gap with Claude Code.&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;the worker model is pluggable&lt;/strong&gt;. Hermes does not write code itself in the way Claude Code does. It dispatches the actual code-writing to whichever model or CLI you have configured — OpenAI, OpenRouter, Nous Portal, Anthropic through API, or by &lt;a href="https://github.com/NousResearch/hermes-agent" rel="noopener noreferrer"&gt;shelling out to the &lt;code&gt;claude&lt;/code&gt; CLI directly&lt;/a&gt;. The most common production setup right now is "Hermes orchestrates, Claude Code does the typing." That is not Hermes competing with Claude Code; that is Hermes wrapping it.&lt;/p&gt;

&lt;p&gt;Third, &lt;strong&gt;it runs anywhere&lt;/strong&gt;. Six terminal backends — local, Docker, SSH, Daytona, Singularity, Modal — mean a Hermes session can hibernate on a serverless platform, resume on a phone, or run unattended on a remote box. Claude Code is single-machine by design.&lt;/p&gt;

&lt;p&gt;In the same 18-task comparison, Hermes won fourteen of eighteen. The four it lost, it lost on raw coding. The fourteen it won, it won by remembering work from earlier sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Each One Loses
&lt;/h2&gt;

&lt;p&gt;Honesty about the weaknesses matters more than feature lists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code's actual weaknesses:&lt;/strong&gt; stateless by default; tied to Anthropic models (with the upsides and downsides that come with vendor concentration); no native cross-session memory of any depth; single-machine; the plugin/skill marketplace is still forming. If your bottleneck is institutional context that builds over time, Claude Code does not solve for it. You have to build the wrapper yourself, which is what &lt;a href="https://www.mpt.solutions/three-memory-systems-under-one-login-stop-picking-sides/" rel="noopener noreferrer"&gt;the wrapper-pattern argument from May 2&lt;/a&gt; is about — file-system-backed memory you own and bring to every session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hermes' actual weaknesses:&lt;/strong&gt; open-source moving fast means flaky updates and rough edges. The Python dependency surface is real. Setting up the persistent memory store, configuring providers, getting the right backend running, choosing the right model for each subtask — this is operator-grade work, not consumer-grade. The codebase shipped eight P0 security closures in the v0.13.0 release notes, which tells you both that the project is being maintained seriously and that it was shipping with security holes weeks before that. The skill autocreation feature can manufacture procedural memory that is wrong, and there is no perfect way to audit a self-modifying skill base.&lt;/p&gt;

&lt;p&gt;If you do not want to run a small piece of personal infrastructure, Hermes is not for you. If you do, Claude Code on its own leaves the persistent-memory layer unbuilt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Decision Matrix
&lt;/h2&gt;

&lt;p&gt;The question "which one should I use" decomposes into "what is the work I am trying to do."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Claude Code, on its own, when:&lt;/strong&gt; the work fits in a single session; you are in front of the machine; the answer is code that needs to be written, not context that needs to be remembered; you want the strongest available coding model with the lowest setup friction; the cost of vendor concentration on Anthropic is acceptable. This covers most ad-hoc coding sessions for most developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Hermes, with Claude Code as the worker, when:&lt;/strong&gt; the work spans days or weeks; institutional context (project history, prior decisions, partial state) matters more than raw coding speed on any one task; you want unattended runs (overnight, cron-triggered, mobile-initiated); you need parallel subagents on a Kanban; you want provider portability so you are not single-vendor; you can absorb the setup cost of running personal infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use both, in different roles, when:&lt;/strong&gt; you do daily focused work in Claude Code for the in-session productivity, and run Hermes as the durable layer for cross-session continuity. This is the pattern that is starting to dominate among heavy users. The two stop competing the moment you treat Claude Code as a worker and Hermes as the orchestrator that calls it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Layer Question
&lt;/h2&gt;

&lt;p&gt;The framing "vs" loses something important. Most coding-agent debates this year have been arguments about features that turn out to be at different layers of the stack. The persistent-memory question is at the orchestrator layer. The model-quality question is at the worker layer. The tool-loop question can sit at either. The IDE-integration question is at the worker layer. The unattended-run question is at the orchestrator layer.&lt;/p&gt;

&lt;p&gt;If you keep arguing about which agent is best without naming the layer the argument is at, the argument never lands. Once you do name it, the right answer is usually both, in different roles.&lt;/p&gt;

&lt;p&gt;Claude Code is the strongest worker available today. Hermes is the strongest open-source orchestrator that wraps a worker like Claude Code. The compose case is where the real productivity lives. The vendor positioning makes them look like alternatives. The architecture says they compose.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>hermesagent</category>
      <category>aicoding</category>
      <category>developertools</category>
    </item>
    <item>
      <title>You Can't Co-Design What You Don't Operate</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Wed, 20 May 2026 21:59:23 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/you-cant-co-design-what-you-dont-operate-5ad4</link>
      <guid>https://forem.com/michaeltuszynski/you-cant-co-design-what-you-dont-operate-5ad4</guid>
      <description>&lt;p&gt;&lt;a href="https://www.linkedin.com/pulse/human-factors-engineering-ai-buy-in-among-college-nobles-ph-d--pyfxe" rel="noopener noreferrer"&gt;An article circulating this week&lt;/a&gt; argues that faculty AI buy-in in higher education is a human factors engineering problem. The framing is correct. The path the piece describes skips the only two steps that matter, and the reason it skips them is structural, not pedagogical.&lt;/p&gt;

&lt;p&gt;Start with the framework on its own terms. Human factors engineering, as a discipline, is most rigorous in the places where mistakes kill people — aviation, medicine, nuclear operations, military command. In none of those places does participatory design mean asking operators to author protocols for systems they have not yet operated. &lt;a href="https://www.faa.gov/sites/faa.gov/files/2022-11/crmhistory.pdf" rel="noopener noreferrer"&gt;Crew Resource Management in commercial aviation&lt;/a&gt; was built by pilots who had logged thousands of hours on the platform. The accident-investigation literature, the cognitive task analyses, the checklists, the cross-checks — all of it sits downstream of operator-grade familiarity. &lt;a href="https://www.sciencedirect.com/science/article/pii/S0925753522003071" rel="noopener noreferrer"&gt;Mature HFE practice in industrial settings&lt;/a&gt; treats prerequisite familiarity as a precondition for authorship, not as a parallel track. The order is fixed: operate the system, then design the safeguards.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Step the Article Skips
&lt;/h2&gt;

&lt;p&gt;The piece on faculty AI buy-in moves directly from "engage faculty as co-designers" to the outcomes — trust, transparency, governance, alignment with academic values. The prerequisite that holds every successful HFE program together never appears in the prose. The article asks faculty to co-design governance for tools the average faculty member has used for less than ten hours total, primarily in artificial training contexts.&lt;/p&gt;

&lt;p&gt;What the article describes as co-design is closer to structured surveying. Faculty in a one-hour ChatGPT workshop can tell you what the demo felt like. They cannot tell you which boundaries a graduate seminar in clinical psychology needs around hallucination, or which retention defaults a research-methods course needs around student-generated prompts, or which provenance attribution rules an introductory writing course needs to keep its rubric honest. Those are the governance questions that matter. Surface familiarity produces surface governance.&lt;/p&gt;

&lt;p&gt;What the article wants — discipline-specific, boundary-aware, defensible against edge cases — requires sustained use in the actual work. Faculty have to teach with the tool, grade against the tool, fail against the tool, and revise around the tool, for weeks or semesters, before they can author governance worth shipping. The discipline has a name for this kind of sustained operation in the actual work, and the name is praxis.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Sequence That Makes the Outcomes Hold
&lt;/h2&gt;

&lt;p&gt;The order matters because what comes out of a co-design session is exactly proportional to what its participants have actually done with the tool. A committee composed of operators who have spent a semester working through real student artifacts produces governance that survives the first stress case. A committee composed of policy interpreters who watched a demo produces governance that fails on contact with real coursework.&lt;/p&gt;

&lt;p&gt;The fix is a sequencing change: praxis programs first, in disciplines, with real workflows and instructional artifacts, for at least one cycle of student work. Governance authorship after. The order is not optional, and the patience required to hold it is the part most institutions cannot afford politically. The faculty AI committee is sitting now; the spring catalog is locked; the student-affairs office wants a policy by July. So the committee is asked to ship governance from surface familiarity, and the result is governance theater.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Second Step Hidden in Plain Sight
&lt;/h2&gt;

&lt;p&gt;There is a second reason most institutions cannot deliver participatory design on AI even when they want to, and this one has nothing to do with pedagogy. By the time the faculty AI committee convenes, the enterprise contract has already been signed. &lt;a href="https://learn.microsoft.com/en-us/microsoft-365/copilot/enterprise-data-protection" rel="noopener noreferrer"&gt;Microsoft 365 Copilot for Education&lt;/a&gt; was procured eighteen months ago. The Google Workspace AI add-on, the OpenAI Edu tier, the Canvas-integrated AI tutor — all already on the books, with contract terms negotiated by procurement and counsel against the vendor's standard data-protection and indemnity language.&lt;/p&gt;

&lt;p&gt;The actual policy surface — data flows, retention windows, opt-out defaults, training-data carve-outs, accountability allocation, liability for hallucinated outputs reaching students — was decided in that contract. What the faculty AI committee ships from here is acceptable-use guidance inside a perimeter that was drawn elsewhere by people the committee never met. Co-design at the policy layer is downstream of choices that already foreclosed most of what could be co-designed.&lt;/p&gt;

&lt;p&gt;This is the same structural pattern that shows up &lt;a href="https://www.mpt.solutions/your-marketing-team-is-now-a-software-vendor/" rel="noopener noreferrer"&gt;whenever software arrives through the procurement door&lt;/a&gt; instead of the operator door. The real co-design moment is the moment the contract is being negotiated. The operators are not in that room. By the time the operators are in the room, the room has been redecorated, and the decisions that needed operator input are the wallpaper.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reframe
&lt;/h2&gt;

&lt;p&gt;The vocabulary the discussion runs on is part of the trouble. Buy-in is a marketing term. It implies persuading a population to consent to a decision that has been made. Higher-ed faculty are operators of AI workflows in disciplines where errors compound — into student records, into transcripts, into citations, into degree credentials. Authorship is the target the framework actually requires.&lt;/p&gt;

&lt;p&gt;Authorship requires praxis. Praxis requires sustained operation in the actual work. Sustained operation requires that the procurement phase admit it is the policy phase, and seat operators where the contract gets negotiated. The article describes the destination correctly. Trust, transparency, governance, alignment — all of those are the right outcomes. The path it draws skips the only two steps that can produce them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Looks Like In Practice
&lt;/h2&gt;

&lt;p&gt;For an institution willing to do the work, the program structure is concrete. A nine-to-twelve-month operator residency for each discipline before its AI governance is drafted, structured around real student artifacts and graded course outputs. A standing seat for faculty operators in the procurement workstream, with veto power on terms that touch retention, training-data use, and provenance. An explicit acknowledgment in published policy that the contract terms are the upstream constraint, named and dated, so the limits of faculty authorship are honest and visible. A sunset clause on every contract that returns the policy surface to renegotiation when the operator cohort says the boundary is wrong.&lt;/p&gt;

&lt;p&gt;None of this is the part faculty AI committees are currently asked to produce. All of it is the part the human factors engineering frame, taken seriously, would require. The framework is right. The implementations being shipped this year are the framework with the prerequisites filed off.&lt;/p&gt;

&lt;p&gt;Higher education will get AI governance worth defending only when the operators arrive before the contract is signed and the praxis arrives before the committee meets. Until then, what most institutions are calling co-design is a way of borrowing the legitimacy of participation without paying its operating cost.&lt;/p&gt;

</description>
      <category>highered</category>
      <category>aigovernance</category>
      <category>humanfactorsengineering</category>
      <category>facultydevelopment</category>
    </item>
    <item>
      <title>Goodhart's Law Just Got a Slash Command</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Tue, 19 May 2026 16:58:01 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/goodharts-law-just-got-a-slash-command-3b14</link>
      <guid>https://forem.com/michaeltuszynski/goodharts-law-just-got-a-slash-command-3b14</guid>
      <description>&lt;p&gt;Anthropic added &lt;a href="https://code.claude.com/docs/en/changelog" rel="noopener noreferrer"&gt;the &lt;code&gt;/goal&lt;/code&gt; command to Claude Code&lt;/a&gt; in v2.1.139. You set a completion condition; the agent keeps working across turns; a second model reads the transcript and decides whether the condition was met. It is the built-in version of the keep-going loops people have been hand-rolling for long agent work.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://medium.com/@jason.croucher/claude-code-goal-a-field-guide-with-games-f6f3b617ce5b" rel="noopener noreferrer"&gt;careful field guide for it&lt;/a&gt; circulated this week, and the piece lands the right diagnosis. A verification-only condition produces a correct-but-useless result. The worked example built a space shooter as a 960×540 canvas with a triangle, a dot, and three starfield pixels. Every machine check passed. The recommended cure is the wrong one: write better conditions, point them at a longer PRD that defines what good looks like, keep the condition short and the spec long. Better conditions do not escape this failure. They relocate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Slash Command Has a Fifty-Year-Old Name
&lt;/h2&gt;

&lt;p&gt;Marilyn Strathern's &lt;a href="https://en.wikipedia.org/wiki/Goodhart%27s_law" rel="noopener noreferrer"&gt;formulation of Goodhart's Law&lt;/a&gt; is the canonical statement of what &lt;code&gt;/goal&lt;/code&gt; automates: "When a measure becomes a target, it ceases to be a good measure." Targets get optimized with full discipline. Anything outside the target does not appear in the result, because nothing unmeasured can fail the goal. &lt;code&gt;/goal&lt;/code&gt; takes this dynamic — previously an organizational pathology — and ships it as a CLI primitive. The condition is the target. The agent is the optimizer. The evaluator-as-judge enforces the target with mechanical rigor.&lt;/p&gt;

&lt;p&gt;The field guide does not contain the word "Goodhart," and the omission matters. Every paragraph of it describes Goodhart's Law without naming what it is fighting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The HUD That Wasn't Checked
&lt;/h2&gt;

&lt;p&gt;The strongest evidence for the structural read is buried in the piece's own conclusion. The "fixed" three-games run used per-version visual assertions — for the 70s build, an automated check asserts the renderer uses stroke and line primitives only; the 8-bit and modern builds have their own. The &lt;a href="https://github.com/jason-c-dev/claude-slash-goal-example" rel="noopener noreferrer"&gt;public repo&lt;/a&gt; shows the work. And then, from the closing paragraph:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The modern version's headless playtest renderer stubs text drawing, so its headless screenshots show no HUD; it renders correctly in a browser. The visual assertion passed without ever checking for the HUD, which is the same lesson one level down. It measured the effects it was told to measure, not the HUD it was not.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the diagnosis from the opening of the piece recurring inside the fix from the middle. The PRD got longer. The condition got smarter. The unmeasured thing — text rendering — moved one room over and the shoebox followed it. This is what Goodhart's Law does to every system that automates a measure into a target. The fix is not a stricter spec. There is no spec that anticipates the thing you didn't think to check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Loop Cannot Save Itself
&lt;/h2&gt;

&lt;p&gt;The structural reason &lt;code&gt;/goal&lt;/code&gt; cannot escape this on its own is in Anthropic's own description of the feature. The evaluator runs no tools. It reads the transcript. The field guide flags this in two separate sections — first in How to use it ("The evaluator only read the transcript. Verify the result the way you would verify a colleague's pull request before you trust it") and then again in Gotchas ("A confident summary of broken work reads as 'fine'"). Both statements are correct. Both close the case.&lt;/p&gt;

&lt;p&gt;A verifier that does not run the artifact has not verified the artifact. It has verified the transcript. The transcript is the artifact's lawyer, not its auditor. The same model that produced the broken thing also produced the summary of the broken thing, and a second model trained on the same loss function reading that summary is not adversarial review. It is paperwork.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Narrow Case That Survives
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/goal&lt;/code&gt; earns its keep where the goal and the measure are the same object. Tests pass. Build is green. The queue is empty. Every module is under a size budget. Coverage is over a threshold. In that case Goodhart does not bite, because there is nothing unmeasured to subvert — you wanted the tests green and the tests are green. This is the argument from &lt;a href="https://www.mpt.solutions/babysitter-auditor-prayer-or-tests/" rel="noopener noreferrer"&gt;Babysitter, Auditor, Prayer. Or Tests.&lt;/a&gt; two weeks ago, restated: anything with deterministic verification is the right place to lean on a loop; anything that needs judgment is not.&lt;/p&gt;

&lt;p&gt;The moment your goal includes a judgment term — looks good, is fun, has a HUD, is well-designed, feels right — you have left the domain &lt;code&gt;/goal&lt;/code&gt; can serve. The PRD-as-context pattern does not change this. The evaluator still does not read the PRD. The evaluator still does not run the artifact. It is doing what its documentation says: summarizing whether the transcript looks like it satisfied a condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost Ledger
&lt;/h2&gt;

&lt;p&gt;The three-game example cost about 91 minutes across the three runs, plus the upfront work writing the PRD and the goal prompt. That is one half of the productivity story. The other half is the audit. The field guide is explicit about this: "Audit 'achieved' yourself. The evaluator only read the transcript. Verify the result the way you would verify a colleague's pull request before you trust it."&lt;/p&gt;

&lt;p&gt;If you audit every "achieved" result with the rigor of a real PR review, the loop did not eliminate the work. It moved the work to a different verb. The savings are real only when the verification is mechanical and you can skip the audit because the tests genuinely passed. Outside the mechanical case, the audit is the work, and the time spent writing a longer PRD is overhead the hand-rolled loop did not have.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Survives Contact With Goodhart
&lt;/h2&gt;

&lt;p&gt;Two patterns survive. The first is the narrow mechanical case above. Use &lt;code&gt;/goal&lt;/code&gt; for it, write a short condition that exactly equals what you want, and trust the green build. The second is a hand-rolled loop you write yourself, where the verification step is code rather than English. A loop with code-level verification surfaces missing checks as tests that do not run or assertions that do not compile. A &lt;code&gt;/goal&lt;/code&gt; condition that misses the HUD just announces "achieved." The visible failure is the cheaper one to fix.&lt;/p&gt;

&lt;p&gt;Goodhart's Law has been around for fifty years. Every system that has automated a measure into a target has lived through the same failure — KPIs, OKRs, SLAs, test scores, hospital wait times, sales quotas, ad-engagement metrics, every algorithmic feed. Now the pattern is a slash command. The PRD-as-spec recipe is the same trap with extra documentation.&lt;/p&gt;

&lt;p&gt;Use the feature where the goal and the measure coincide. Everywhere else, the audit is the loop and the human is the evaluator.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>aiengineering</category>
      <category>goodhartslaw</category>
      <category>agentdesign</category>
    </item>
    <item>
      <title>Your Marketing Team Is Now a Software Vendor</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Mon, 18 May 2026 00:13:03 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/your-marketing-team-is-now-a-software-vendor-2h64</link>
      <guid>https://forem.com/michaeltuszynski/your-marketing-team-is-now-a-software-vendor-2h64</guid>
      <description>&lt;p&gt;A DevOps engineer &lt;a href="https://www.reddit.com/r/devops/comments/1td7mxp/how_are_you_securing_aigenerated_vibecoded/" rel="noopener noreferrer"&gt;posted on r/devops&lt;/a&gt; this week with what reads like a familiar shadow-IT question dressed in 2026 clothes. Marketing, product, and sales people across his AI startup are shipping internal apps with Cursor and Claude Code. They deploy to Vercel, Cloudflare Pages, Netlify. The data is real. The authentication is not. The thread hit 119 upvotes and 119 comments in 48 hours.&lt;/p&gt;

&lt;p&gt;The top reply was two words: "Good luck."&lt;/p&gt;

&lt;p&gt;The framing of the original post is wrong, and the framing is the reason the thread is full of fatalism. The question "how do we secure AI-generated apps built by non-dev teams" assumes the right enforcement point is the human or the policy. That assumption was wrong for Shadow IT 1.0, and it is wrong for the 2.0 version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shadow IT Already Moved Once
&lt;/h2&gt;

&lt;p&gt;Shadow IT 1.0 was the marketing director expensing a Notion subscription, the sales rep wiring HubSpot to a personal email, the product manager paying for Figma on the team Amex. The solution was not "review every SaaS purchase." The solution was Okta — make the SSO catalog the only practical way to log in, and rogue accounts die of friction. The chokepoint was authentication, not procurement.&lt;/p&gt;

&lt;p&gt;Shadow IT 2.0 has no SaaS vendor at all. The marketing team is the vendor. They are shipping software. The Cursor-generated dashboard that reads from the customer database, the Claude Code script that pulls from the data warehouse and posts to a Vercel preview URL, the internal "tool" with a hardcoded production API key — your marketing team is distributing a software product into your environment. That product has one user, no contract, no security review, and no kill switch.&lt;/p&gt;

&lt;p&gt;Calling this "non-dev teams writing apps" understates what is happening. The right mental model is that you accidentally acquired twelve new internal software vendors last quarter, and vendors get treated as vendors.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5K-Lines-a-Day Wall
&lt;/h2&gt;

&lt;p&gt;Inside the same Reddit thread, one tech-sponsor commenter writes the most honest line in the discussion. Their company's policy requires a business sponsor and a technical sponsor for every internal app. The business sponsors approve everything. The technical sponsors "can't be arsed to review 5k lines of Claude reinventing the wheel per day, on top of their actual jobs."&lt;/p&gt;

&lt;p&gt;That is the bottleneck signal. The cost of code generation dropped to near zero. The cost of human code review did not. Any governance model that puts a senior engineer in the path of every vibe-coded internal app fails by simple arithmetic. You cannot review a Claude-generated codebase the way you review a pull request from a human teammate. The volume is wrong by an order of magnitude.&lt;/p&gt;

&lt;p&gt;The companies that solve this will solve it the way Anthropic &lt;a href="https://www.anthropic.com/engineering/building-effective-agents" rel="noopener noreferrer"&gt;describes building effective agents&lt;/a&gt; — by putting the checks at the seams that matter rather than auditing every step. The seam that matters for shadow IT 2.0 is the deploy, not the diff.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Substrate Is the Only Chokepoint
&lt;/h2&gt;

&lt;p&gt;Every internal vibe-coded app has to land somewhere. Vercel, Cloudflare Pages, Netlify, AWS Amplify, a personal S3 bucket — the deployment substrate is the new SSO catalog. Own that, and most of the OP's problem list collapses.&lt;/p&gt;

&lt;p&gt;A practical paved road looks like this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One sanctioned deploy path.&lt;/strong&gt; A self-service &lt;a href="https://backstage.io/" rel="noopener noreferrer"&gt;Backstage-style internal developer portal&lt;/a&gt; that takes a Cursor or Claude Code output and ships it in 60 seconds, but wraps it in SSO, secret scanning, data classification, CMDB registration, and your domain. Make the boring secure path also the only easy path. If the marketing team's "ship it now" instinct routes through the paved road by default, the policy fight stops being a policy fight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outbound deploy enforcement.&lt;/strong&gt; Block deploys to &lt;code&gt;*.vercel.app&lt;/code&gt;, &lt;code&gt;*.netlify.app&lt;/code&gt;, &lt;code&gt;*.pages.dev&lt;/code&gt; from corporate networks and managed devices except through the paved road. Treat unsanctioned deploys the way you treat unsanctioned SaaS — a network event, not a policy violation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every internal app gets a vendor record.&lt;/strong&gt; Owner, business sponsor, data classification, retention policy, kill switch. The CMDB entry that one Reddit commenter described as their company's working pattern is not bureaucracy. It is the only artifact that survives the engineer's vacation, the marketing manager's promotion, and the eventual audit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://developers.cloudflare.com/learning-paths/clientless-access/migrate-applications/integrated-sso/" rel="noopener noreferrer"&gt;Cloudflare Access&lt;/a&gt; and equivalents from the major clouds already do the SSO-and-tunnel side cheaply. The infrastructure exists. The missing piece is making it the path of least resistance for a marketing person who just got a working prototype out of Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a Browser-Security Vendor Just Sold for $205M
&lt;/h2&gt;

&lt;p&gt;This week Akamai &lt;a href="https://www.akamai.com/newsroom/press-release/akamai-technologies-announces-intent-to-acquire-layerx-advancing-its-workforce-security-strategy-with-ai-usage-control" rel="noopener noreferrer"&gt;announced its intent to acquire LayerX Security for roughly $205 million&lt;/a&gt;. LayerX builds browser-based AI usage control — visibility and policy enforcement at the point where employees paste customer data into a foundation model or deploy a generated app from a SaaS workspace. A $205 million acquisition does not happen because a handful of enterprises are worried about shadow AI. It happens because the security market just priced in that this is a category.&lt;/p&gt;

&lt;p&gt;That category is the Shadow IT 2.0 category, and the substrate vendors and security platforms are racing to claim it before the customer's internal platform team builds an alternative. The DevOps engineer who posted the Reddit question is buying or building in this space whether they planned to or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Air Canada Logic Applies
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://arstechnica.com/tech-policy/2024/02/air-canada-must-honor-refund-policy-invented-by-airlines-chatbot/" rel="noopener noreferrer"&gt;Air Canada was ordered&lt;/a&gt; in February 2024 to pay a customer whose refund policy the airline's chatbot had invented. The airline's defense — that the chatbot was "a separate legal entity" — was rejected by the BC Civil Resolution Tribunal. The agent's promise was the company's promise.&lt;/p&gt;

&lt;p&gt;The same logic applies one layer down. The customer-data dashboard your marketing manager vibe-coded last Thursday is the company's product when it leaks. The "I just made it for myself" defense lasts about as long as Air Canada's chatbot-is-separate defense did. Your liability surface is not the apps your engineering team ships. It is every app any employee deploys with company data, on company devices, under company infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do This Quarter
&lt;/h2&gt;

&lt;p&gt;Stop trying to gate the building — speed is the reason vibe coding exists. Gate the deployment substrate, register every app as a vendor product, and accept that the marketing team writing software is now a permanent feature of how your company operates.&lt;/p&gt;

&lt;p&gt;The platform team's job description just changed. It is no longer "support the engineering org." It is "run the internal vendor-onboarding desk for everyone who can now write software with an LLM." The companies that adapt fast will ship a paved road this quarter. The ones that send the policy email will, as the top Reddit reply put it, get to enjoy the inevitable disaster.&lt;/p&gt;

</description>
      <category>platformengineering</category>
      <category>shadowit</category>
      <category>aisecurity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Anthropic Picked Tulsa</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Sat, 16 May 2026 16:32:37 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/anthropic-picked-tulsa-1447</link>
      <guid>https://forem.com/michaeltuszynski/anthropic-picked-tulsa-1447</guid>
      <description>&lt;p&gt;Anthropic &lt;a href="https://www.anthropic.com/news/claude-for-small-business" rel="noopener noreferrer"&gt;launched Claude for Small Business&lt;/a&gt; on May 13. Every read I've seen has focused on the product surface: 15 prebuilt agentic workflows, 7 named SaaS integrations, a trust posture built around in-the-loop approval and no-training-on-data defaults.&lt;/p&gt;

&lt;p&gt;The product is fine. The strategic signal is somewhere else.&lt;/p&gt;

&lt;p&gt;Read past the workflow list to the bottom of the announcement. Anthropic is taking Claude for Small Business on a 10-city physical workshop tour: Chicago, Tulsa, Dallas, Hamilton Township NJ, Baton Rouge, Birmingham, Salt Lake City, Baltimore, San Jose, Indianapolis. Free half-day live AI fluency training. 100 local small-business leaders per stop. Local partner organizations in each city. Plus credits to a Workday Foundation Solopreneurship Accelerator run with LISC, and Claude credits + technical support to three CDFIs — Accion Opportunity Fund, Community Reinvestment Fund USA, Pacific Community Ventures.&lt;/p&gt;

&lt;p&gt;That is not a marketing budget. That is a ground game.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Ways to Win SMB Distribution
&lt;/h2&gt;

&lt;p&gt;There are two structural paths to small-business AI distribution at scale.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;bundling onto an existing install base&lt;/strong&gt;. Microsoft has Office 365 in the hands of millions of small businesses. &lt;a href="https://www.microsoft.com/en-us/microsoft-365/blog/2025/12/02/microsoft-365-copilot-business-the-future-of-work-for-small-businesses/" rel="noopener noreferrer"&gt;Microsoft 365 Copilot Business is $21/user/month&lt;/a&gt;, priced and packaged for SMB consumption, and shipped through the same Office channel partners that have been selling to small businesses for two decades. If you're a 20-person business already paying for Microsoft 365 Business Premium, Copilot Business is a checkbox.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;building a ground game&lt;/strong&gt;. Find the small businesses that aren't on a single dominant productivity stack. Show up in the cities where the consulting class doesn't fly. Partner with the organizations those businesses already trust — CDFIs that fund them, accelerators that mentor them, training nonprofits that work with them. Convert those relationships into installs.&lt;/p&gt;

&lt;p&gt;Anthropic doesn't have an installed base to bundle onto. They chose path two. The tour cities are the first visible artifact of that choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Integration List Is a Leaderboard
&lt;/h2&gt;

&lt;p&gt;Look at who's named in the launch: QuickBooks, PayPal, HubSpot, Canva, Docusign, Google Workspace, Microsoft 365. Those are the revenue-touching tools — cash, sales, design, contracts, productivity. Each integration partner traded co-marketing for default position inside the Claude SMB workflow.&lt;/p&gt;

&lt;p&gt;Now look at who's not on the list. Shopify. Stripe. Square. Mailchimp. Slack. Notion. Salesforce is the most interesting absence — they have their own Einstein/Agentforce play, so this reads as competitive choice rather than oversight.&lt;/p&gt;

&lt;p&gt;If you run an SMB-tier SaaS product and you weren't asked to integrate, your category got assessed as either too small to matter, too replaceable to integrate, or close enough to a competitor's space that you got passed over. The leaderboard is also a list of products that just learned their position is more fragile than they thought.&lt;/p&gt;

&lt;p&gt;This is the &lt;a href="https://www.mpt.solutions/build-like-the-capex-already-left/" rel="noopener noreferrer"&gt;Build Like the Capex Already Left&lt;/a&gt; thesis playing out at the SMB tier in real time. Workflow automation as a pure interface — bookkeeping point solutions, contract-review SaaS, marketing-automation tools, fractional-CFO platforms — is the category most at risk. Anthropic made a list of which interfaces survive as integrations and which get eaten as features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trust as the Scale-Down Moat
&lt;/h2&gt;

&lt;p&gt;Anthropic's own survey, cited in the launch: half of small-business owners name data security as their single biggest hesitation about AI. The Claude for Small Business response is structural: "every task is initiated by you," "your existing permissions hold," "we don't train on your data by default."&lt;/p&gt;

&lt;p&gt;That posture is harder for larger competitors to make credibly. A small-business owner who has read about cloud-provider data settlements, who has seen platform vendors fold AI features into existing license agreements, who has watched training-data policies quietly evolve — that owner reads "we don't train on your data by default" differently from how a Fortune 500 CIO reads it. The trust posture scales asymmetrically down-market.&lt;/p&gt;

&lt;p&gt;Anthropic's PBC structure and explicit Constitutional AI framing make this credible in the small-business segment in a way that's hard for larger players to match. That's not an accident.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tour Cities, Again
&lt;/h2&gt;

&lt;p&gt;Tulsa is &lt;a href="https://tulsachamber.com/clientuploads/Business_Dynamics_statistics,_firm_startups_&amp;amp;_related_measures___Tulsa_Regional_Chamber_of_Commerce.pdf" rel="noopener noreferrer"&gt;ranked second in Oklahoma for new business formation&lt;/a&gt;, with metro population over 1 million. Birmingham, Baton Rouge, Hamilton Township NJ, Indianapolis, Salt Lake City, Baltimore — mid-size metros with active SMB economies and minimal native AI marketing presence. The tour avoids the Bay Area and skips New York entirely.&lt;/p&gt;

&lt;p&gt;The CDFI partnerships matter for the same reason. Accion Opportunity Fund, Community Reinvestment Fund USA, and Pacific Community Ventures lend to small-business owners that traditional banks underserve. Putting Claude credits and technical support inside those institutions reaches a population that Anthropic could not reach through coastal startup networks.&lt;/p&gt;

&lt;p&gt;This is also where the &lt;a href="https://www.businessinsider.com/anthropic-pwc-big-four-business-ai-adoption-2026-5" rel="noopener noreferrer"&gt;PwC alliance expansion&lt;/a&gt; fits the same pattern at the enterprise tier. Anthropic doesn't have native large-enterprise GTM, so they're buying it via consulting alliance. The SMB tour is the bottom-up version of the same problem-solving: manufacture distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Diagnostic
&lt;/h2&gt;

&lt;p&gt;For SMB operators considering Claude for Small Business: the question isn't whether the workflows save time — they will. The question is which of your current vendors becomes redundant once Claude handles the cross-tool layer. The bookkeeper who only reconciles to QuickBooks. The fractional marketer who only schedules HubSpot campaigns. The contract reviewer who only flags Docusign sends. Those are the access-rents, and the rent just dropped to subscription pricing.&lt;/p&gt;

&lt;p&gt;For SMB SaaS founders: if you're not on the integration list, you have months to decide whether to compete with the integration layer or fold into it. The companies that picked the integration path bought time. The ones that bet on direct SMB acquisition without an installed base have to build distribution the way Anthropic is building it — geographically, partnership-by-partnership, in cities that don't make it onto a coastal startup deck.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Tulsa Means
&lt;/h2&gt;

&lt;p&gt;The product launch is the surface. The tour is the strategy. Anthropic is testing whether a public-benefit corporation with strong technical product but limited native distribution can manufacture a GTM motion in the SMB segment through geographic, institutional, and demographic outreach that the existing distribution channels haven't covered.&lt;/p&gt;

&lt;p&gt;If it works, it becomes the playbook for any AI company without a consumer-brand head start or an installed software base to bundle onto. Pick the cities. Find the partners. Build the relationships. Ship the credits. Skip the conference circuit.&lt;/p&gt;

&lt;p&gt;Anthropic picked Tulsa. The rest of the playbook follows.&lt;/p&gt;

</description>
      <category>aistrategy</category>
      <category>distribution</category>
      <category>smb</category>
      <category>anthropic</category>
    </item>
    <item>
      <title>What Looks Like Busywork Is Mostly Rent</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Fri, 15 May 2026 20:54:06 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/what-looks-like-busywork-is-mostly-rent-5735</link>
      <guid>https://forem.com/michaeltuszynski/what-looks-like-busywork-is-mostly-rent-5735</guid>
      <description>&lt;p&gt;Carl Frey's &lt;a href="https://www.nytimes.com/2026/05/11/opinion/ai-jobs-chores-work.html" rel="noopener noreferrer"&gt;recent NYT piece&lt;/a&gt; argues that AI's real impact isn't job replacement — it's labor transfer from worker to consumer. We become our own travel agent, accountant, exterminator, doctor. The work doesn't disappear; it moves out of the labor statistics and into our evenings. Productivity climbs, corporate profits climb, individuals feel overburdened.&lt;/p&gt;

&lt;p&gt;The observation is correct. The framing is wrong. And the receipt that demolishes the framing is sitting inside Frey's own piece.&lt;/p&gt;

&lt;h2&gt;
  
  
  The $162K Receipt
&lt;/h2&gt;

&lt;p&gt;Frey cites a family that used Claude to cut a hospital bill from $195,000 to under $33,000 — over $162,000 in coding errors and duplicative charges. He presents this as a "tangible benefit" of self-service, then immediately pivots to &lt;em&gt;"however, self-service does not automatically reproduce a professional's judgment."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That pivot is doing extraordinary work. The professional system here — the hospital's revenue-cycle department, the medical billing specialists, the insurance reviewers, the patient advocates — exists specifically to catch coding errors and duplicative charges. Those roles were billed for. They were paid. They simply weren't doing the work.&lt;/p&gt;

&lt;p&gt;The "burden" of the family doing that audit themselves wasn't AI making them busier. It was AI revealing that the prior arrangement was charging $162,000 for oversight that wasn't happening. The professional wasn't displaced. The professional was already absent — the bill just looked like they were there.&lt;/p&gt;

&lt;p&gt;This isn't a one-off. Industry estimates put &lt;a href="https://orbdoc.com/blog/medical-bill-errors-80-percent-problem" rel="noopener noreferrer"&gt;error rates in medical bills as high as 80%&lt;/a&gt;, with average mistakes on $10,000+ bills running $1,300. The system supposed to catch them — the same system Frey mourns as professional expertise — has been failing silently for decades. AI didn't transfer the auditing burden to consumers. It revealed no one was auditing in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Different Things Frey Calls One
&lt;/h2&gt;

&lt;p&gt;The Frey argument conflates two fundamentally different categories of professional work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access-rents&lt;/strong&gt; — work where the intermediary's value was gatekeeping the inconvenience of access, not delivering judgment. Travel agents reading flight schedules. Tax preparers running TurboTax-style forms. Stock brokers placing trades. Bank tellers handling deposits. The intermediary added little beyond &lt;em&gt;being a required step&lt;/em&gt;. Killing them is liberation, not burden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrated expertise&lt;/strong&gt; — work where the professional integrated context and judgment the consumer couldn't reach. Differential diagnosis on ambiguous symptoms. Real tax strategy across multiple business entities. Trial strategy under specific judges. These require an expert who tells you what to ask, not just answers your question. Killing these is real risk transfer.&lt;/p&gt;

&lt;p&gt;AI eats both. Frey treats them as one phenomenon — "busywork landing on us" — and concludes we're overburdened. The conflation matters because the policy and product implications are opposite: accelerate the killing of access-rents, protect integrated expertise.&lt;/p&gt;

&lt;p&gt;The hospital billing example is squarely the first category. The patient wasn't replacing a clinical judgment with Claude. They were replacing the &lt;em&gt;administrative oversight layer&lt;/em&gt; that was billed for but not delivered. That isn't thinner expertise. That's a system finally getting audited.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Travel Agent Case
&lt;/h2&gt;

&lt;p&gt;Frey raises self-service travel as a historical parallel. He's right that the work moved. He's wrong that it transferred a burden. &lt;a href="https://www.bls.gov/ooh/sales/travel-agents.htm" rel="noopener noreferrer"&gt;Travel agent employment dropped 60-80% between 2000 and 2020&lt;/a&gt; as Expedia, Kayak, and Booking.com took over leisure bookings. Airlines &lt;a href="https://www.latimes.com/archives/la-xpm-2002-mar-31-tr-digest31.2-story.html" rel="noopener noreferrer"&gt;eliminated most commissions to agents in 2002&lt;/a&gt;, removing the revenue model.&lt;/p&gt;

&lt;p&gt;Consumers did not drown in travel-planning busywork. The bookings that took 90 minutes with an agent (call, hold music, faxed itinerary, callback the next day) take 5 minutes online. The work didn't transfer to the consumer — most of it disappeared, because most of it was the friction of going through a human intermediary in the first place.&lt;/p&gt;

&lt;p&gt;The agents who survived the collapse were the ones doing real integrated work: complex multi-leg corporate travel, custom itineraries for high-end leisure, expertise on visa requirements and disruption handling. The access-rent agents disappeared. The integrated-expertise agents didn't. The market separated category A from category B without any policy guidance. Consumers benefited.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Quality Differential Cuts Both Ways
&lt;/h2&gt;

&lt;p&gt;Frey leans on "opportunity cost neglect" — the documented tendency to overlook the value of time we give up when self-serving. He's right that we miss it. The inverse error is also documented and larger in dollar terms: we routinely overpay for professional services that don't deliver judgment over what an AI tool gives free.&lt;/p&gt;

&lt;p&gt;The $300 accountant who beats a free AI tool by $30 on your return is a net $270 loss. The lawyer who charges $400 to fill out a generic LLC formation is a net $380 loss. The travel agent who books the same flight you'd have found is a net commission loss. Self-service neglect cuts the consumer one way; expertise neglect cuts them the other. Frey only counts one direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Actually Happening
&lt;/h2&gt;

&lt;p&gt;The shift Frey describes is real, but the right read is closer to this: the post-WWII service economy normalized paying intermediaries to gatekeep our own affairs. Filing taxes was always something we could do; the IRS publishes the forms. Booking travel was always something we could do; the airlines publish their schedules. Disputing medical bills was always something we could do; the line items are itemized. We outsourced these tasks because the access was inconvenient and the time cost was real.&lt;/p&gt;

&lt;p&gt;AI dropped the access cost to near-zero and the time cost to minutes. What feels like busywork is mostly the recovery of agency over our own affairs. We're not drowning. We're doing things we could always do, finally without paying for the privilege.&lt;/p&gt;

&lt;p&gt;The argument for protecting integrated expertise still stands. The pediatrician who notices the symptom you didn't think to mention, the tax strategist who sees the structure across years of returns, the lawyer who reads the judge before the brief — these are real and AI is closer to replacing them than most professionals admit, but not there yet. Those roles deserve defense.&lt;/p&gt;

&lt;p&gt;The argument for protecting the medical billing specialist who wasn't auditing your bill, the travel agent who read the same schedule you can see, the accountant who clicked through TurboTax for you — that argument is over. It ended the day Claude found $162,000 in errors a paid system missed. As I argued &lt;a href="https://www.mpt.solutions/build-like-the-capex-already-left/" rel="noopener noreferrer"&gt;yesterday&lt;/a&gt;, workflow-automation-as-pure-interface businesses are getting eaten first. The same logic applies to the human version of those businesses.&lt;/p&gt;

&lt;p&gt;What Frey calls busywork is mostly rent we finally stopped paying.&lt;/p&gt;

</description>
      <category>aistrategy</category>
      <category>professionalservices</category>
      <category>gatekeeping</category>
      <category>aidisruption</category>
    </item>
    <item>
      <title>Build Like the Capex Already Left</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Thu, 14 May 2026 19:53:14 +0000</pubDate>
      <link>https://forem.com/michaeltuszynski/build-like-the-capex-already-left-1nh7</link>
      <guid>https://forem.com/michaeltuszynski/build-like-the-capex-already-left-1nh7</guid>
      <description>&lt;p&gt;In 2025, four companies — Microsoft, Alphabet, Amazon, Meta — spent &lt;a href="https://valueaddvc.com/blog/big-tech-ai-capex-in-2025-microsoft-google-meta-amazon-and-the-spending-race" rel="noopener noreferrer"&gt;over $300 billion on AI data centers&lt;/a&gt;. The combined 2026 number is &lt;a href="https://www.tomshardware.com/tech-industry/big-tech/microsoft-attributed-25-billion-of-its-record-ai-budget-to-memory-chip-costs" rel="noopener noreferrer"&gt;forecast at $725 billion, a 77% jump in a single year&lt;/a&gt;. For comparison, the entire global SaaS market in 2025 is roughly $295–370 billion depending on whose definition you use. The capital being poured into the thing that replaces software is now equal to or larger than the software market it competes with.&lt;/p&gt;

&lt;p&gt;If you run a software business, "how do we add AI features" is the wrong question. The right one is whether your product would exist at all if you started the company today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Receipts on the Wrong Side
&lt;/h2&gt;

&lt;p&gt;Chegg is the canonical example. The homework-help business — students paying $14.95/month for textbook answers — was structurally fragile already, but ChatGPT made it terminal. &lt;a href="https://finance.yahoo.com/markets/stocks/articles/chegg-dying-way-chatgpt-chatbots-144926172.html" rel="noopener noreferrer"&gt;Chegg's revenue fell 39% in 2025 ($618M → $377M)&lt;/a&gt;, the homework subscription business dropped 43% in the same year, and &lt;a href="https://www.forbes.com/sites/petercohan/2025/10/29/chegg-stock-down-99-learn-whether-ai-45-layoffs-make-chgg-a-buy/" rel="noopener noreferrer"&gt;the stock is down 99% from its 2021 peak&lt;/a&gt;. The CEO told investors in late 2025 that Google's AI Overviews launch was "as material" to the collapse as ChatGPT itself.&lt;/p&gt;

&lt;p&gt;Chegg did not lack AI features. They launched CheggMate, a GPT-4 study tool, in April 2023 — six months after ChatGPT's debut. They built AI tutors, AI study guides, AI essay help. None of it stopped the decline. The features were not the problem. The product was the problem. They were selling paywalled answers to questions ChatGPT was giving away free.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.pragmaticengineer.com/stack-overflow-is-almost-dead/" rel="noopener noreferrer"&gt;Stack Overflow followed a similar arc&lt;/a&gt;. Question volume collapsed almost immediately after ChatGPT's November 2022 launch — developers stopped asking on Stack Overflow because the AI was faster and trained on Stack Overflow's data. The 2025 Stack Overflow Developer Survey confirmed it: 84% of developers now use AI tools daily, and 79% rely on ChatGPT. Stack Overflow eventually licensed its data to OpenAI in 2024, but the licensing revenue does not replace the community engagement that drove the original product.&lt;/p&gt;

&lt;p&gt;The pattern in both cases is the same. A workflow-automation business — Chegg automated finding textbook answers, Stack Overflow automated finding code answers — gets eaten when the underlying knowledge becomes free to query directly. The interface that used to mediate access stops being valuable when the access is direct.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Receipts on the Right Side
&lt;/h2&gt;

&lt;p&gt;Duolingo did the opposite trade. In 2023 they introduced Duolingo Max, a higher-priced tier built around AI — conversational roleplay with characters, AI grammar explanations on every wrong answer, AI-generated personalized lessons. They didn't bolt AI onto Duolingo Plus. They built a new product tier where AI was the product, and priced it above Plus.&lt;/p&gt;

&lt;p&gt;The 2025 results: &lt;a href="https://www.reuters.com/business/duolingo-raises-2025-revenue-forecast-ai-tools-boost-user-engagement-2025-08-06/" rel="noopener noreferrer"&gt;revenue crossed $1 billion ($1.01–1.02B annual)&lt;/a&gt;, up over 50% year-over-year, with AI features driving 51% user growth. The bet was that language learning at any price point gets better with AI, and the customers who valued speed of progress would pay for the better version.&lt;/p&gt;

&lt;p&gt;Adobe took a different but related path. &lt;a href="https://news.adobe.com/news/2025/10/adobe-max-2025-firefly" rel="noopener noreferrer"&gt;Adobe Firefly&lt;/a&gt;, launched as a generative imaging model in 2023, has been embedded into Photoshop, Illustrator, Premiere, and the standalone Firefly app. As of Q3 FY2025, &lt;a href="https://futurumgroup.com/insights/adobe-q3-fy-2025-results-beat-estimates-fy-2025-outlook-raised-on-ai-demand/" rel="noopener noreferrer"&gt;Firefly recorded 29 billion total generations with 40% quarter-over-quarter growth in video&lt;/a&gt;. Adobe's FY2025 revenue hit $24.05B, up 11%. The pivot here was structural: Adobe stopped treating creative software as the product and started treating creative output as the product, with AI as the engine for generating it.&lt;/p&gt;

&lt;p&gt;Klarna sits in the middle of the framework. They took the disruption seriously enough to own it — their AI assistant &lt;a href="https://www.klarna.com/international/press/klarna-ai-assistant-handles-two-thirds-of-customer-service-chats-in-its-first-month/" rel="noopener noreferrer"&gt;handles two-thirds of customer service chats&lt;/a&gt;, doing the equivalent work of 700 full-time agents — and even after &lt;a href="https://www.customerexperiencedive.com/news/klarna-reinvests-human-talent-customer-service-AI-chatbot/747586/" rel="noopener noreferrer"&gt;partially reinvesting in human support&lt;/a&gt;, the AI still handles the volume work. The pivot wasn't "we sell AI now." It was "we automated our own cost center before someone else automated it for us." A different strategic posture from Chegg, who tried to retroactively add AI features to a product the AI was making redundant.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Strategic Question
&lt;/h2&gt;

&lt;p&gt;Three moats survive an AI capex shift of this magnitude.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;data&lt;/strong&gt;. Bloomberg's terminals survive because the data feed is proprietary and the licensing structure is decades old. MLS data for real estate survives for the same reason. If your customers cannot get your data from a public AI model, you have time.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;workflow with capture&lt;/strong&gt;. The product owns a system of record that AI tools cannot easily reach into, and the friction of integration is what holds the position. ServiceNow, Workday, and Salesforce all sit in this category, though they are each spending heavily on AI features because the moat is shrinking.&lt;/p&gt;

&lt;p&gt;The third — and most interesting — is &lt;strong&gt;owning the AI consumption layer itself&lt;/strong&gt;. This is where Duolingo and Adobe sit. AI capability becomes a commodity; packaging that commodity for a particular user job is the product. The capex flowing into hyperscaler data centers builds the substrate. The product is what sits on top of the substrate, charging users for the application of the capability.&lt;/p&gt;

&lt;p&gt;The wrong moat is &lt;strong&gt;workflow automation as a pure interface&lt;/strong&gt;. Chegg's product was, structurally, "we make it convenient to look up textbook answers." Stack Overflow's was "we make it convenient to find code answers." Both moats vanished when the AI made the underlying capability free and direct. Any business whose pitch is "we automate X" is at risk if X is a knowledge-work pattern the model can reproduce.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Tell If You're Chegg
&lt;/h2&gt;

&lt;p&gt;The diagnostic question is uncomfortable. If you started your company today, with full knowledge of ChatGPT's capabilities and access to frontier model APIs, would you build this product?&lt;/p&gt;

&lt;p&gt;If yes, you have a real moat. Build harder, faster, ship more.&lt;/p&gt;

&lt;p&gt;If no — if the honest answer is "we'd build something else, but we have customers and revenue so we're going to keep adding features" — you are Chegg in 2023. The features will not save the product. The strategic move is the pivot itself, not the feature roadmap.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://www.mpt.solutions/brand-on-the-cv-is-a-2018-heuristic/" rel="noopener noreferrer"&gt;yesterday's piece on cloud support roles&lt;/a&gt;, I argued that AWS L1/L2 customer support is the first agent target because pattern-match-on-logs-and-escalate is what an LLM with tool use eats for breakfast. The same logic applies to your product. If the customer outcome you sell is "find the answer to X" or "summarize Y" or "automate Z workflow," ask whether a $20/month ChatGPT subscription plus a willing customer can produce 80% of the outcome you charge for.&lt;/p&gt;

&lt;p&gt;If yes, the capex has already moved. Build like it.&lt;/p&gt;

</description>
      <category>aistrategy</category>
      <category>saaspivot</category>
      <category>platformengineering</category>
      <category>businessstrategy</category>
    </item>
  </channel>
</rss>
