<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[João Gonçalves]]></title><description><![CDATA[João Gonçalves]]></description><link>https://joaofogoncalves.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!tYIF!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4241e47-23d4-45b5-a38b-8446c979f88c_563x563.png</url><title>João Gonçalves</title><link>https://joaofogoncalves.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 05 Jul 2026 15:20:34 GMT</lastBuildDate><atom:link href="https://joaofogoncalves.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[joaofogoncalves]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[joaofogoncalves@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[joaofogoncalves@substack.com]]></itunes:email><itunes:name><![CDATA[joaofogoncalves]]></itunes:name></itunes:owner><itunes:author><![CDATA[joaofogoncalves]]></itunes:author><googleplay:owner><![CDATA[joaofogoncalves@substack.com]]></googleplay:owner><googleplay:email><![CDATA[joaofogoncalves@substack.com]]></googleplay:email><googleplay:author><![CDATA[joaofogoncalves]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Two Features, One Contract]]></title><description><![CDATA[BridgePort 3.0 shipped a Terraform provider and an MCP server. Most of the work went into the API contract they both depend on.]]></description><link>https://joaofogoncalves.substack.com/p/28-two-features-one-contract</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/28-two-features-one-contract</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e16aa63b-9187-4241-b2f0-915fe853f3f7_1440x900.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ie6-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ie6-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp 424w, https://substackcdn.com/image/fetch/$s_!Ie6-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp 848w, https://substackcdn.com/image/fetch/$s_!Ie6-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ie6-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ie6-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Ie6-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp 424w, https://substackcdn.com/image/fetch/$s_!Ie6-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp 848w, https://substackcdn.com/image/fetch/$s_!Ie6-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ie6-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27978f2e-ee5c-41da-a9eb-8ddaa34335e2_1440x900.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p><a href="https://bridgeport.bridgein.com/changelog/#v3-0-0">BridgePort 3.0</a> has two headline features: a Terraform provider and an MCP server. They were built as separate efforts, in separate epics, and they look unrelated. One is infrastructure-as-code. The other is what people usually mean by &#8220;adding AI&#8221; to a tool.</p><p>They turned out to be two clients of the same thing: BridgePort&#8217;s HTTP API. The Terraform provider drives it from a file in version control, and the MCP server drives it from an agent in an editor. They expose different slices of it, one declaring configuration and the other running operations, but neither had to build its own validation, permissions, or audit trail. Both inherited that from the API. Most of the release didn&#8217;t go into either feature. It went into making the API stable enough to be that dependency.</p><p>The release before this one, <a href="/posts/2026/06/2026-06-07-bridgeport-2-0-what-got-faster/">2.0, was about speed</a>. The slowest production transaction dropped from a p99 over 8 seconds to 46 milliseconds. 3.0 is about the API surface instead. Less visible, same general idea: make the control plane something other software can rely on.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RuzQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RuzQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp 424w, https://substackcdn.com/image/fetch/$s_!RuzQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp 848w, https://substackcdn.com/image/fetch/$s_!RuzQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp 1272w, https://substackcdn.com/image/fetch/$s_!RuzQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RuzQ!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;One API contract, projected onto a declarative surface (the Terraform provider) and a conversational one (the MCP server). Both start from the same Zod schema and typed OpenAPI spec, then diverge.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="One API contract, projected onto a declarative surface (the Terraform provider) and a conversational one (the MCP server). Both start from the same Zod schema and typed OpenAPI spec, then diverge." title="One API contract, projected onto a declarative surface (the Terraform provider) and a conversational one (the MCP server). Both start from the same Zod schema and typed OpenAPI spec, then diverge." srcset="https://substackcdn.com/image/fetch/$s_!RuzQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp 424w, https://substackcdn.com/image/fetch/$s_!RuzQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp 848w, https://substackcdn.com/image/fetch/$s_!RuzQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp 1272w, https://substackcdn.com/image/fetch/$s_!RuzQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c6756f-5c7d-4c48-a4a9-9df14e072a73_3600x1428.webp 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h2>What &#8220;hardening the API&#8221; meant</h2><p>The phrase is vague until you list the work, and most of it is the kind that doesn&#8217;t show up in a demo.</p><p>The spec came first. BridgePort was already generating <code>/openapi.json</code> dynamically from its registered routes, but the document was nearly empty of contracts. Of roughly 251 route definitions, three declared a request or response schema, and those three were response-only, added for serialization speed. The real request contracts already existed as Zod schemas, <code>createServerSchema</code>, <code>createServiceSchema</code>, and the rest, used to validate incoming bodies. They just never reached the spec. 3.0 fed them in, converting each one with Zod 4&#8217;s built-in <code>z.toJSONSchema()</code> and assembling the document with <code>@fastify/swagger</code>, so the schema that validates a request is now the schema that documents it. One definition, two jobs. A <code>pnpm run openapi:dump</code> script writes a committed <code>openapi.json</code> snapshot, a CI check fails the build when routes change without regenerating it, and a test asserts that a minimum share of operations carry full schemas. The threshold only ratchets up, so a new route added without a schema can&#8217;t quietly lower the bar. It just fails the check until someone types it.</p><p>Errors got one shape at the same time. Every non-2xx response now returns <code>{code, message, field?, hint?, requestId?}</code> with a documented set of codes (<code>VALIDATION_ERROR</code>, <code>READONLY_FIELD</code>, <code>FORBIDDEN_SCOPE</code>, <code>IDEMPOTENCY_KEY_REUSED</code>, and so on). That was done with a central error handler and an <code>onSend</code> hook that reshapes responses at the framework level, so it didn&#8217;t mean editing every route. <code>GET /api/auth/me</code> now returns the caller&#8217;s role, environment allowlist, and derived scopes, so a client can tell whether a call will be permitted before making it and catching a 403.</p><p>Then the client. The Go client the CLI used internally was already a complete typed SDK, but it sat under <code>internal/</code> with a module path that didn&#8217;t resolve, so nothing else could import it. 3.0 extracted it into a standalone module, <code>github.com/bridgeinpt/bridgeport/client</code>, released on the Go multi-module convention (<code>client/vX.Y.Z</code>). The rule attached to it matters more than the move: the client is treated as part of the API&#8217;s contract surface and bumped in the same pull request as any change to a wire shape, so a consumer never has to chase the API by hand.</p><p>Then the policy. There&#8217;s now a written stability and deprecation document. Breaking changes (removing or renaming fields, changing types or status codes, tightening validation) happen only in majors. Additive changes (new optional fields, new endpoints) happen in minors. A deprecated field is flagged <code>deprecated: true</code> in the spec and survives until at least the next major. The committed <code>openapi.json</code> is named as the canonical contract, and clients are told to pin against it.</p><p>The last piece was already there and became load-bearing: an <code>Idempotency-Key</code> header on mutating POSTs, Stripe-style. The same key within a 24-hour window replays the original response instead of running the work twice, and the same key sent with a different body returns a 422 with <code>IDEMPOTENCY_KEY_REUSED</code>.</p><p>The same pressure showed up lower in the stack. An API that gets driven by automation gets hit concurrently, and under concurrent writes SQLite&#8217;s single writer lock could surface as an opaque 500 (<code>SQLITE_BUSY</code> and the stale-snapshot variant). The <a href="https://bridgeport.bridgein.com/changelog/#v3-0-1">3.0.1 patch</a> added a Prisma client extension that retries those contended writes with jittered backoff, up to five times, and when retries run out it returns a 503 with <code>Retry-After</code> rather than a 500, which is a response a client can actually handle. The per-attempt busy timeout dropped from 5 seconds to 1 so a contended write fails fast into the async retry loop rather than blocking the event loop, and the behavior is tunable through <code>DB_RETRY_*</code> environment variables. In one repro run, eight writers hammering the same database produced 24 failed requests out of 384. A rerun after the fix, at twice the load, produced none. Those counts are a single developer repro, not a benchmark, but the behavior they show is pinned by a contention test that holds a real write lock and asserts a 503, never a 500. Idempotency makes a retry safe to send. This is what makes the failure worth retrying in the first place.</p><p>Individually these are unremarkable. Together they&#8217;re the difference between an API you call and one you can build on without expecting it to move under you.</p><h2>The Terraform provider</h2><p>BridgePort sits between infrastructure that&#8217;s already provisioned with Terraform and the services running on top of it, which were configured by hand through the UI. That handoff was imperative: click through screens, run a script, hope it&#8217;s reproducible. The provider makes the BridgePort half declarative. Environments, servers, variables, secrets, config files, registry connections, container images, services, and their per-server deployments live in version control, and <code>terraform plan</code> shows configuration drift instead of letting it accumulate quietly. It&#8217;s built on terraform-plugin-framework and published to the Terraform and OpenTofu registries through goreleaser with GPG-signed assets, versioned on its own line because one provider release supports a range of platform versions.</p><p>The core design choice: configuration is declarative, runtime is not. You can declare a service and everything about how it&#8217;s configured. You can&#8217;t <code>terraform apply</code> a deploy. Deploys, restarts, and rollbacks stay operations you trigger directly, and runtime facts like health, live status, and exposed ports are read-only values the provider reports but doesn&#8217;t manage. BridgePort already kept an internal registry of which fields are runtime versus configuration, and the provider maps onto the same split rather than inventing its own.</p><p>Secrets get the same care they get everywhere else. A secret&#8217;s value is a write-only argument that never lands in Terraform state. You bump a version number to rotate it, and the plaintext stays in whatever source you pull it from:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;toml&quot;,&quot;nodeId&quot;:&quot;f1798ff1-ea67-47b3-8808-660e95ddc6f6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-toml">resource "bridgeport_secret" "db_password" {
  environment      = "production"
  key              = "DB_PASSWORD"
  value_wo         = var.db_password  # write-only: never stored in state
  value_wo_version = "1"              # bump this to rotate
}
</code></pre></div><p>The token authenticates through a <code>BRIDGEPORT_TOKEN</code> environment variable for the same reason, so it stays out of config and state. Resources and data sources are addressed by their natural keys (<code>environment</code> plus <code>name</code> or <code>key</code>), which is also what <code>terraform import</code> works off, and <code>plan</code> runs offline, diffing against the configuration you submitted rather than calling the live API.</p><p>The provider builds no HTTP requests of its own. Every call goes through the same shared Go client the CLI uses, pinned at <code>client/v0.4.0</code>, which leaves the provider code to be Terraform schema plus plan-and-state plumbing and not much else.</p><p>What keeps a separate-repo provider honest is not the repo layout. It&#8217;s the contract enforced in CI. The provider&#8217;s acceptance tests run against the real server image: compose up a throwaway instance, mint an operator token from the first-boot admin bootstrap, run the suite with <code>TF_ACC=1</code>, tear it down. SQLite makes each instance cheap enough to do per-run. On the platform side, a provider-compatibility job builds the server image, checks out the provider at its latest release tag, and runs that acceptance suite against the image. A red suite fails the platform&#8217;s pull request. Either a change is compatible, or it ships with a documented deprecation and a provider follow-up filed before merge.</p><h2>The MCP server</h2><p>The MCP server exposes a curated part of the same API as tools an AI client can call: listing the services showing drift in production, rolling a service back to its previous image, summarizing recent health-check failures. The client&#8217;s model does the reasoning, and BridgePort runs the same deterministic operations it always has.</p><p>Mechanically it&#8217;s a Fastify plugin mounted at <code>POST /mcp</code>, registered only when <code>MCP_ENABLED</code> is set. The flag is parsed strictly and fails closed: only <code>true</code> or <code>1</code> turns it on, and when it&#8217;s off the route isn&#8217;t registered at all, so <code>/mcp</code> returns a 404 rather than an authenticated-but-empty endpoint. The transport is stateless Streamable HTTP from the official MCP SDK. Each request builds a fresh server for the authenticated caller and tears it down when the response closes, with no session store. Authentication reuses the same bearer token as the REST API, and the caller&#8217;s token is forwarded on every internal call a tool makes, so each tool effectively replays a real API request as that user. Role checks, scope checks, validation, idempotency, and audit logging all behave exactly as they would for the equivalent REST call. There&#8217;s no second permission model to keep in sync. The whole server is about 2,200 lines of new code, and wiring it into the existing auth and idempotency layers changed those by about a dozen lines.</p><p>The decision that shaped the whole thing was what not to build. Most ways of adding AI to the project would have BridgePort calling a model itself, for log triage, or drift explained in prose, or a risk score on a deploy. Each of those means holding an API key, paying for inference, and sending logs, config, and topology out to a third-party model. For a self-hosted control plane that already stores SSH keys and secrets, that&#8217;s a meaningful amount of new surface and new data leaving the box. The MCP server avoids it by not running a model at all. It serves tools, and the model lives in the operator&#8217;s own client, on their own account. That trade is not free: it moves the model, the account, and the client config onto the operator, and it means BridgePort can&#8217;t offer log triage or drift-in-prose as built-in features, because there&#8217;s nothing on the box to generate them. For a self-hosted control plane that already holds the secrets, that reads the right way around. The usual alternative for keeping data in-house is to <a href="https://northflank.com/blog/self-hosting-ai-models-guide">self-host a model too</a>, which works but adds a model to serve and a GPU to keep fed. And <a href="/posts/2026/05/2026-05-08-ai-is-everywhere-agents-inside-products-are">wiring an agent into an operational loop is a different problem than shipping a chatbot</a> regardless.</p><p>Connecting a client is a URL and a token:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;00ac32bc-63c0-457a-a8fe-46a9a1d788f0&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  "mcpServers": {
    "bridgeport": {
      "url": "https://bridgeport.example.com/mcp",
      "headers": { "Authorization": "Bearer &lt;api-token&gt;" }
    }
  }
}
</code></pre></div><p>The safety model is mostly inherited and partly belt-and-suspenders. Read tools work with any valid token. Write tools (deploy, restart, rollback, run a backup) need a write scope, carry MCP destructive annotations so the client asks for confirmation, and derive an <code>Idempotency-Key</code> so identical calls within about a minute dedupe as retries instead of firing twice. On top of that, every tool output and resource read passes through a redactor before it leaves the server. Its denylist is generated from the Prisma schema (encrypted columns, their nonces, token hashes, raw SSH keys, agent tokens) and applied by key name, recursively, through nested objects. If a REST route ever regressed and started returning a raw database row, the redactor would still strip the secret-bearing fields, while keeping the presence-only flags like <code>hasToken</code> that the safe projections are meant to expose. The endpoint is off by default, has no UI toggle (enabling it is a deployment decision, not a database setting), and supports DNS-rebinding protection through an explicit <code>MCP_ALLOWED_HOSTS</code> list.</p><h2>Why 55 tools and not 251</h2><p>The quick way to build either surface is to let the spec decide it. Point <a href="https://www.speakeasy.com/blog/generating-mcp-from-openapi-lessons-from-50-production-servers">Speakeasy</a> at an OpenAPI document and it emits one MCP tool per endpoint. Point <a href="https://developer.hashicorp.com/terraform/plugin/code-generation/openapi-generator">HashiCorp&#8217;s generator</a> at one and it scaffolds a Terraform resource per route. BridgePort generates the tool schemas from the spec but doesn&#8217;t let the spec decide the tool set. The API has around 251 routes. The MCP server exposes 55, 47 read and 8 write, and an admin page reads the live inventory out of the in-process registry so the exposed surface is auditable whether or not the server is currently enabled.</p><p>It&#8217;s the same reasoning as leaving deploys out of the Terraform provider. Every endpoint as a tool is a dump of what the API can do. A smaller set is a decision about what an agent should do with it. It&#8217;s a known failure mode. <a href="https://blog.christianposta.com/semantics-matter-exposing-openapi-as-mcp-tools/">The semantics matter more than the coverage</a>, and 251 tools is also a context-window problem: the agent spends its attention reading a menu instead of planning, and plans worse for it. Curating down is not a smaller surface dressed up as a virtue. It is the optimization. Creating resources is left to the Terraform provider, the first version of the MCP server is scoped to observing and a safe set of operations, and the safe-write set grows from there.</p><h2>The rest of 3.0</h2><p>Not everything in 3.0 was about the contract. The web UI was rebuilt on a standard component library, the front-end bundle was split into lazy-loaded chunks, and a configuration audit surfaced a batch of settings that had been hardcoded and removed a few the app had been silently ignoring. Useful, unglamorous, the kind of work a major version is mostly made of.</p><p>Backups got the change that was overdue. Retention used to be flat: keep everything for N days, then delete it. That forces a bad trade, because 90 days of nightly backups is 90 files, and 7 days leaves no medium-term recovery point at all. 3.0 replaced it with grandfather-father-son rotation, the scheme borg, restic, and Time Machine have used for years: keep the last few, then thin older backups down to daily, weekly, monthly, and yearly tiers. Keeping 7 daily, 4 weekly, and 6 monthly backups spans half a year in roughly 17 files instead of 180. It ships as presets (lean, balanced, long-term) with a global default each database can override. Manual and pinned backups are exempt, a floor guarantees it never deletes down to nothing, and it prunes nothing at all until you opt in. This is table stakes for anything storing real data, and now it&#8217;s in the box rather than in a cron job someone wrote once and forgot.</p><p>The documentation went live with the release, at <a href="https://bridgeport.bridgein.com">bridgeport.bridgein.com</a>: installation and getting-started, a guide per subsystem, a <a href="https://bridgeport.bridgein.com/guides/terraform/">Terraform guide</a> and an <a href="https://bridgeport.bridgein.com/reference/mcp/">MCP reference</a> for the two surfaces this piece is about, the <a href="https://bridgeport.bridgein.com/api-stability/">API stability policy</a>, and a full <a href="https://bridgeport.bridgein.com/reference/api/">API reference</a> generated from the same OpenAPI spec the release hardened. The contract ended up documenting itself.</p><p>Once the API is a stable dependency, a new surface is mostly a curation problem, not an integration one. The CLI, the Go SDK, the Terraform provider, and the MCP server are all clients of the same definition, and not one of them had to rebuild validation, permissions, or audit. They inherited it. It&#8217;s the same reason <a href="/articles/2026/06/2026-06-08-the-harness-is-the-moat/">the layer around a model usually matters more than the model</a>. The features are the visible part. The contract is the part that took the time.</p>]]></content:encoded></item><item><title><![CDATA[The Moat That Walks Out the Door]]></title><description><![CDATA[Part three. If the moat is the judgment in your team's heads, then the moat can quit. What it takes to keep that judgment from leaving with the people who hold it.]]></description><link>https://joaofogoncalves.substack.com/p/14-the-moat-that-walks-out-the-door</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/14-the-moat-that-walks-out-the-door</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fecaf44b-3f4d-4401-bcca-addc21c13e9f_1440x895.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-hDu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-hDu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp 424w, https://substackcdn.com/image/fetch/$s_!-hDu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp 848w, https://substackcdn.com/image/fetch/$s_!-hDu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp 1272w, https://substackcdn.com/image/fetch/$s_!-hDu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-hDu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-hDu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp 424w, https://substackcdn.com/image/fetch/$s_!-hDu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp 848w, https://substackcdn.com/image/fetch/$s_!-hDu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp 1272w, https://substackcdn.com/image/fetch/$s_!-hDu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7efca03-efd8-4e60-af1f-d6b413e2f190_1440x895.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Part two ended somewhere uncomfortable, though it read like a win. The moat is not the harness, and it is not the skill files either. Those depreciate and those copy. What is left, the part a competitor cannot lift out of your repo, is the judgment of the people who were there when the system broke. <a href="/articles/2026/06/11-rent-the-loop-build-the-moat/">It lives in the team, not the repo.</a></p><p>True. It is also the one a company can least protect.</p><p>Walk back through what the series has been calling durable. The model is rented, and it improves on someone else&#8217;s schedule. The harness is owned, and <a href="/articles/2026/06/2026-06-08-the-harness-is-the-moat/">it rots on yours</a>, shedding a gate every time a model release makes one redundant. Both of those change slowly and predictably. The moat we landed on does neither. It does not depreciate on a roadmap or get productized by a vendor. It resigns. It takes a better offer. It burns out in Q3 and goes quiet until spring.</p><p>The one thing you cannot rent and cannot buy turns out to be the one that can leave on its own.</p><p>So the question part two left open is the one that actually keeps you up. How do you own a moat that has legs?</p><h2>Write it down, then</h2><p>There is an obvious answer, and a whole industry sells it. Capture the tribal knowledge. Kill the bus factor. A runbook for every gate, a postmortem for every incident, a wiki page for every decision, and the knowledge stops living in one person&#8217;s head.</p><p>For most of what a team knows, that is right. Write it down. The architecture, the runbook steps, the config, the timeline of what actually happened: all of it belongs on a page, and a team that skips that work is not guarding a moat, it is just undocumented.</p><p>But the series has already walked us into the problem with it. The thing we are trying to preserve here is not a fact. Facts you write down and you are done. This is judgment, and the most you can write down about judgment is the answer it reached last time.</p><p>Write a piece of it down completely enough to hand over, and what you have captured is a snapshot: what was true against one model, one architecture, one quarter&#8217;s failure surface. The harness depreciates, and a frozen record of why you built it depreciates faster, because it cannot tell you which of its reasons still hold. The week a model ships, the page explaining last year&#8217;s gate is worse than no page. It reads as current. It is not.</p><p>So far this is the case against the wiki, and every engineer nodding along has already made it. But notice what the case actually shows. The problem is not that judgment cannot be written down. Plenty of it can. The problem is that what you write down is last release&#8217;s answer, and the model does not hold still. Part one already named the real asset and part two sharpened it: the moat was never the harness you have, it is how fast you rebuild it when the model moves. The moat is a rate.</p><p>A rate does not live on a page, and it does not survive in a single head either. It fails two ways, and they are not the same problem with the same fix. Left unused, it slows. The senior who had it, then moved off the surface and stopped re-deriving anything, is back to reading last year&#8217;s answers like everyone else. And lodged in one person, it is a rate with a notice period, which is the failure the title is about.</p><p>So the question part two left open splits in two. You keep the rate exercised so it does not slow. You spread it so it cannot walk out. First, though, why neither a page nor the model can hold it for you. Then the two fixes, and the reason a team makes neither until it is too late.</p><h2>What a runbook can&#8217;t hold</h2><p>This is not an argument against writing things down. It is an argument about what writing things down can hold.</p><p>Michael Polanyi named it sixty years ago, in a line that has outlived most of what surrounded it: we can know more than we can tell. A diagnostician cannot fully explain the read that took thirty years to build. A senior engineer cannot fully explain why a passing test on the billing path still makes them reach for a second look. They can give you the rule. They cannot give you the thousand cases that taught them when the rule does not apply. The economist David Autor gave the idea a name for the automation age, Polanyi&#8217;s Paradox: the work hardest to hand to a machine is the work whose rules we cannot fully state, because we never held them as rules.</p><p>Documentation catches the what. The skill file, the gate config, the runbook step, the postmortem timeline. All of it real, all of it worth having. What it cannot catch is the rate: the speed at which someone reads a new release and re-decides which of those entries still hold, which gate was a fluke and which was the model telling you something, which guard has quietly become latency and which is still load-bearing.</p><p>Make it concrete. A model ships and you audit the gates. The runbook for the billing path was updated last release, so it is not stale: this gate routes billing diffs to a human because the model could not grade them safely. Then the new model lands and the billing evals come back greener than they have ever been. Now the page is a question, not an answer. Does the gate still earn its place, or did the release just pay it off? The page cannot tell you, because it records what was decided, not how to decide it again. Answering means re-running the reasoning against the new model: was this gate about the model&#8217;s weakness, which a better model voids, or about the cost of being wrong on billing being asymmetric, which no release touches? That distinction is not hard to state. It is hard to redraw every release, fast, before you either cut a gate that still matters or keep one that has quietly become latency. The asset is not the sentence in the wiki. It is the speed of drawing the line again.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8jf0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8jf0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp 424w, https://substackcdn.com/image/fetch/$s_!8jf0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp 848w, https://substackcdn.com/image/fetch/$s_!8jf0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp 1272w, https://substackcdn.com/image/fetch/$s_!8jf0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8jf0!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;What documentation holds versus what walks out the door: the skill files and runbooks transfer cleanly; the judgment underneath them does not.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="What documentation holds versus what walks out the door: the skill files and runbooks transfer cleanly; the judgment underneath them does not." title="What documentation holds versus what walks out the door: the skill files and runbooks transfer cleanly; the judgment underneath them does not." srcset="https://substackcdn.com/image/fetch/$s_!8jf0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp 424w, https://substackcdn.com/image/fetch/$s_!8jf0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp 848w, https://substackcdn.com/image/fetch/$s_!8jf0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp 1272w, https://substackcdn.com/image/fetch/$s_!8jf0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb179dd57-a5a8-4c7c-aac7-203a73a817f1_3200x1110.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Your <a href="/articles/2026/06/11-rent-the-loop-build-the-moat/">ledger of incidents</a> records the answer to the last failure. It cannot record the instinct for the next one, the failure nobody has seen yet, the one that matches no entry in the book.</p><p>This is where the AI-era objection lands, and it deserves a straight answer. The model can read the whole ledger in a way no engineer can, and a frontier model does more than recite it back, it generalizes past the entries. Autor named exactly this in the paper that named the paradox: modern machine learning is the project of overcoming Polanyi&#8217;s Paradox, inferring from enough examples the rules we apply but cannot state. So won&#8217;t the model just learn the judgment and hand it back?</p><p>Use it. It will help you re-derive faster, and you should let it. But the same model lands in your competitor&#8217;s repo the same week, improving on a schedule neither of you sets. What it gives you both is a better engine. What it cannot give either of you is the rate at which your team turns that engine on your own novel failures and redraws your own lines before a customer finds them. The ledger and the model are inputs to that rate. They are not the rate. Autor, who named the paradox as the thing machine learning was trying to dissolve, looked straight at that project and concluded the work demanding judgment was the part that held. The reason is narrow and it is ours: the next failure matches no entry yet, so meeting it is not retrieval, it is re-derivation, done in the moment against a model that just moved under you.</p><p>So the asset is not the instinct sitting in someone&#8217;s head, which is just another snapshot. It is the rate at which the people working the surface keep redrawing the line as the model moves. They are not a documentation gap waiting to be closed. They are the moat, in the only form it takes: judgment in motion, fast enough to keep up.</p><h2>Onboard into the incident</h2><p>A rate is not a fact you can hand someone. It is a skill, and you build a skill the way this one got built in the first place. Through exposure to failure.</p><p>That sounds soft. It is the most concrete thing in this piece.</p><p>When the next incident hits, the move most teams make is to send in whoever can fix it fastest. Of course they do. The system is down. But the fix is the cheap part, and the person doing it already has the rate. The expensive, durable thing is the reps, and most teams let them evaporate. Put someone newer on the call. Not to watch, and not to take dictation. To hold the pen and make some of the calls, while the one who is fast says why this and not that and what to look at next. They are not memorizing your answer; that would be the snapshot again. They are building their own speed at finding it. The outage is the curriculum. You will not build one this good on purpose.</p><p>The same logic runs through the re-derivation itself. Auditing the harness when a new model lands, deciding which gates to cut and which to keep, is the work that sets the rate. It is also usually done fast, alone, by the one person who can. That is how you get a bus factor of one on the exact capability the series called the moat. Rotate the pen. Make the audit something two people do together, and change who leads it each release. It is slower the first few times. It is how the rate ends up in more than one head.</p><p>There is a problem with learning from incidents, and a skeptic names it fast: on a healthy system they are rare. You cannot keep a second person sharp by waiting for the next high-severity failure on the expensive path, because if you are running well, one may not arrive for a quarter. So you stop waiting. The ledger changes job. Stored as a record, it is a filing cabinet nobody opens. Run as a drill, it is the closest thing you have to a flight simulator. Re-run an old incident with someone who was not there, let them make the calls, and only then show them where the real one went. Pilots rehearse the engine failure they will probably never see, on purpose, on the simulator. The entry was paid for once. Nothing says you can only spend it once.</p><p>None of this scales to every engineer and every incident, and it is not meant to. Most tickets are routine, and routine is what the runbook is for. The high-touch version is reserved for the part that earns it: the non-deterministic core, the harness audit the week a model lands, the high-severity incident on the path where being wrong is expensive. That is a thin slice of the work, and the slice that is the moat. The point is not to slow everything down so juniors can watch. It is to stop spending the rarest work in the building on an audience of one.</p><h2>Hire for the slope</h2><p>This is where the argument cashes out, because hiring is the one decision that sets your rate for years, and it cuts against how most teams write the job description.</p><p>You cannot hire someone who already holds your judgment. Nobody has it. The incidents that built it happened in your production, against your data, with your customers finding the failure modes only your product has. The most experienced engineer on the market arrives with deep judgment about systems that are not yours. That is worth a lot. It is not the same thing.</p><p>So the trait that matters is not how much a candidate already knows about harnesses. It is how fast they can take on an incident they never lived through and start producing judgment of their own. Absorption rate, not inventory.</p><p>This is the same direction <a href="/posts/2026/06/2026-06-11-software-engineering-has-always-filtered-people/">the filter has been moving</a> for a while now. As models close the gap on syntax, the thing that separates engineers is system-wide reasoning, the ability to hold the whole system in their head and reason about where it breaks. You are not hiring for the code anymore. You are hiring for the slope: how quickly someone goes from not having your context to having it. That slope is what turns a new hire into part of the moat instead of a standing drain on the people who already are.</p><p>The trouble is that slope does not show up on a r&#233;sum&#233;, and most interview loops are built to measure inventory. You can measure it directly, but not by asking a candidate to guess at a system they have never seen. Give them enough to reason with: a redacted incident writeup from your own history and the slice of the current harness around it, the gates, the retries, what routes to a human and what does not. Then ask what they would look at first, which gate they would re-examine after a model change, and the single question they would put to the on-call to decide whether it still holds. You are not scoring the answer. It is your system and they cannot know it. You are watching how they build the question: what they reach for, which failure modes they suspect, whether they can reason about where this breaks without having lived in it.</p><p>What you are listening for is specific. Do they surface the unstated assumption behind the old gate, the business fact it was really protecting, in the first few minutes, or do they argue from the eval numbers in front of them. Do they reach for the past incident least like the current symptom and rule it out, or pattern-match to the nearest one. And watch the confound: a candidate who has run a system like yours will look fast because they are recognizing their old one, not re-deriving yours. Probe a part deliberately unlike anything on their r&#233;sum&#233;, where speed has to come from reasoning and not memory.</p><p>The proof comes in the first ninety days, which is also how you learn whether your interview read slope or fooled itself. Not how much they shipped. How soon they could lead a harness audit without a chaperone, take the pen on a real incident, and have it go well.</p><p>The engineer who can absorb your ledger in a month and the one who needs a year are not the same hire, even with identical r&#233;sum&#233;s. One compounds the moat. The other borrows against it.</p><h2>Nobody is paid to do this</h2><p>Everything above is correct and almost no one does it, and that is not because managers are careless. It is because every one of these moves bills the wrong account at the worst possible time.</p><p>Putting a newer engineer on the incident slows the fix while the system is down. Rotating the audit hands it, half the time, to the slower of the two people who could run it. Re-running an old case spends senior hours on a problem that is already solved. Each cost is immediate, visible, and lands this quarter. The payoff is a bus factor you do not need until someone leaves, which is exactly the benefit a quarterly review cannot see. Sending the best person in alone to fix it fast is not a lapse. It is what optimizing for this week returns, every week, and a bus factor of one is what it compounds into.</p><p>There is a second cost, quieter, and it explains why this cannot be solved by decree. The person who holds the moat knows it is a moat. Asking them to spread it is asking them to make themselves more replaceable, deliberately, for an institution that does not always return that kind of favor. That only happens when the spreading is seen and valued as the senior work it is, not booked as overhead between real tasks. A moat moves to a second head when the first head has a reason to let it.</p><h2>The moat has legs</h2><p>So walk the whole series back out.</p><p>The model is rented. It gets better on someone else&#8217;s schedule, and you take the upgrade when it lands. The harness is owned. It rots on yours, and the work is keeping it from rotting. And the moat underneath both of them, the judgment that decides which gate to cut and which to keep, lives in people. Which means it has legs. It can quit.</p><p>You do not protect it by writing it down, though you should write down what you can. The page holds last release&#8217;s answer and the model holds everyone&#8217;s; neither holds the rate at which you redraw the line when the ground moves. You protect a rate the two ways any practice is protected: you keep it exercised so it does not slow, and you spread it so it does not live on one person&#8217;s calendar. That means treating every incident as a curriculum and not only a fix, every model release as a drill and not only a sprint, every hire as a question of how fast someone reaches your speed. None of it is free, and all of it loses to this quarter unless someone decides it will not. The moat does not last because you locked it in a document, or because one person guards it. It lasts because more than one person is fast, and because the next one is getting faster.</p><p>A better offer takes a person. It takes the moat only if you let the moat ride out the door in one head. The harness, you can lose to a better model. The judgment, you can only lose to a worse manager.</p>]]></content:encoded></item><item><title><![CDATA[Rent the Loop, Build the Moat]]></title><description><![CDATA[Part two. If the harness is the moat, here's where the line sits between what you rent, what you build, and the discipline that keeps it yours.]]></description><link>https://joaofogoncalves.substack.com/p/11-rent-the-loop-build-the-moat</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/11-rent-the-loop-build-the-moat</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c2c0d50d-0e75-44cb-9e6c-a2c674d43b16_1440x900.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Avyx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Avyx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp 424w, https://substackcdn.com/image/fetch/$s_!Avyx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp 848w, https://substackcdn.com/image/fetch/$s_!Avyx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp 1272w, https://substackcdn.com/image/fetch/$s_!Avyx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Avyx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Avyx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp 424w, https://substackcdn.com/image/fetch/$s_!Avyx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp 848w, https://substackcdn.com/image/fetch/$s_!Avyx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp 1272w, https://substackcdn.com/image/fetch/$s_!Avyx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af5d7fc-80eb-4647-a54a-5b668f86bb49_1440x900.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Part one ended on a line that is easy to nod at and hard to act on: the moat is not the harness you have, it is how fast you can rebuild it when the model moves. True. Also useless on a Monday.</p><p>Nobody ships &#8220;how fast you can rebuild it.&#8221; They ship a decision about what to write themselves and what to pull off a shelf, then they live with that decision for a year. So this is the part <a href="/articles/2026/06/2026-06-08-the-harness-is-the-moat/">the argument</a> skipped. Where the line goes.</p><h2>Draw the line</h2><p>The build-versus-buy question got loud this year. There is a small industry of decision frameworks for it now, most shaped the same way: buy a platform for ninety percent of cases, build only when the agent&#8217;s logic is a real moat. The advice is not wrong. The cut is.</p><p>It treats the agent as one object you either purchase or assemble. That object does not exist. What exists is a loop with a harness around it, and the two belong on opposite sides of the line.</p><p>The loop is generic. A model decides the next step, a tool runs, the result comes back, the model decides again. Around that: a sandbox to run in, a session log to remember what happened. None of it is specific to you, and the people who build the model will now run all of it for you. The <a href="https://code.claude.com/docs/en/agent-sdk/overview">Claude Agent SDK</a> lets you run the same loop that powers Claude Code inside your own process. <a href="https://www.anthropic.com/engineering/managed-agents">Managed Agents</a> runs the loop, the sandbox, and the session log on Anthropic&#8217;s machines for eight cents a session-hour, with tokens billed on top. Their own framing for it is decoupling the brain from the hands. Rent the hands. They are a commodity, and they are someone else&#8217;s problem now.</p><p>There is a clean test for which side of the line a thing sits on. If it is knowable from outside your company, rent it. If you only learned it by being in your own production when something broke, build it. The loop is knowable from outside. Your deploy gates are not. The permission boundary drawn around your blast radius is not. The verification that knows what correct means in your product, on your data, against the way your customers actually use it, is not. No SDK ships with any of that, because none of it is visible from where the SDK was written.</p><p>Most of what an agent system costs over its life is not the build. It is the maintenance, and most of the maintenance is chasing the model as it shifts under you. The frameworks file that under cost and warn you about it. Part one filed the same fact under moat. The maintenance is not the tax you pay for owning the harness. The maintenance is the thing you own.</p><p>Rent the loop. Build the harness. The line runs exactly where your domain starts.</p><h2>The evaluator you can&#8217;t rent</h2><p>If you build one thing, build the part that decides whether the work is good.</p><p>It is the part everyone underbuilds, because the lazy version is one line: ask the model if the work is good. The model says yes. Anthropic <a href="https://www.anthropic.com/engineering/harness-design-long-running-apps">watched this in their own harness</a> and named it without flinching. Models &#8220;tend to respond by confidently praising the work, even when the quality is obviously mediocre.&#8221; The thing grading the work is the thing that made it, and it is agreeable by construction.</p><p>So the evaluator has to be separate, and it has to grade like a compiler instead of a manager. A compiler does not care how confident the submission is. It runs the check and returns pass or fail. The distinction that makes it real: the evaluator interacts with the running system instead of reading the diff. It clicks the button, hits the endpoint, reads the actual error. A diff that looks correct and a feature that works are different claims, and only one of them ships. <a href="/articles/2026/05/2026-05-20-building-the-road-to-production-again/">The whole loop rests on that</a>: a failure you can detect is the only kind the system recovers from on its own.</p><p>In practice this is the least glamorous code in the system and the part I trust most. My agents fail their first CI run roughly seven times in ten, read the red build, and fix themselves before a human looks. <a href="/articles/2026/05/2026-05-14-lead-time-is-the-wrong-half/">That thirty-percent first-pass rate</a> is not a number I am proud of, and it is not supposed to be. It is the evaluator earning its keep. The number that would worry me is not the seven that fail; it is any of the three that pass and shouldn&#8217;t have. A gate is only worth trusting if its green means green &#8212; the failures are cheap, the false pass is the one that reaches a customer. The gate catches the confident, plausible, wrong output and sends it back, and the loop closes in tokens instead of in a stand-up.</p><p>The gate that matters most is the one that refuses to grade itself at all. A green diff that touches the billing path does not merge on a passing test. It routes to a human. Not because the model is dumb. Because the cost of being wrong there is asymmetric, and the asymmetry is a fact about my business that no model knows. That rule is a few lines of config and it is pure harness. It will be true on the next model, and the one after that.</p><h2>Skills are a ledger of failures</h2><p>People ask about the twenty-seven custom skills the way they ask about prompts. What&#8217;s in them. What&#8217;s the trick.</p><p>There is no trick. Each skill is an incident.</p><p>The system did something wrong once, in a specific way, on a specific kind of work, and instead of writing a cleverer prompt, someone wrote down what it should have known and made that knowledge load-bearing. The skill for resolving merge conflicts exists because two agents corrupted each other&#8217;s work. The skill that triages a Sentry exception before filing anything exists because the system once opened a handful of issues for one root cause. <a href="/articles/2026/04/2026-04-16-from-pipeline-to-nervous-system/">The agent roster grew the same way</a>: every specialist is a generalist that kept making one class of mistake until the fix earned its own definition.</p><p>This is the part that is genuinely yours, and it is yours for a reason that has nothing to do with secrecy. A competitor can read every skill file in the repo. They cannot read the outage that taught you to write it. The file is the answer. What you own is the question it answers, and you only got the question by being in production when it broke.</p><p>The skills are a ledger. Every entry was paid for once.</p><h2>The week a model ships</h2><p>Here is the cadence the benchmark ritual replaces with a single API call.</p><p>A new model drops. The cheap move is the one most teams make: swap the string, run the eval, ship. The move that compounds takes about a week and looks like maintenance, which is exactly why it gets skipped.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0FmC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0FmC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp 424w, https://substackcdn.com/image/fetch/$s_!0FmC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp 848w, https://substackcdn.com/image/fetch/$s_!0FmC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp 1272w, https://substackcdn.com/image/fetch/$s_!0FmC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0FmC!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The re-derivation cadence: model ships, audit your bets, delete the dead gates, hunt the new failure surface, re-baseline. Run it every release, not in a panic.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="The re-derivation cadence: model ships, audit your bets, delete the dead gates, hunt the new failure surface, re-baseline. Run it every release, not in a panic." title="The re-derivation cadence: model ships, audit your bets, delete the dead gates, hunt the new failure surface, re-baseline. Run it every release, not in a panic." srcset="https://substackcdn.com/image/fetch/$s_!0FmC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp 424w, https://substackcdn.com/image/fetch/$s_!0FmC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp 848w, https://substackcdn.com/image/fetch/$s_!0FmC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp 1272w, https://substackcdn.com/image/fetch/$s_!0FmC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4092fb51-9458-48f6-8697-3efe1ff6abde_3800x956.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>You read your own harness as a list of bets. Every gate, every retry, every reset is a written-down assumption about something the model could not do on its own &#8212; and as Anthropic puts it, those assumptions &#8220;go stale as models improve.&#8221; A better model just paid out some of those bets and voided others. Their <a href="https://www.anthropic.com/engineering/harness-design-long-running-apps">own harness</a> is the cleanest example on the public record: the context resets that Sonnet 4.5 needed became dead weight on Opus 4.5, so they dropped them. The harness got smaller because the model got better, and someone had to notice.</p><p>So you audit. Some gates die because the model got better; some die because your own tooling did, and it pays to know which.</p><p>The first kind is a real bet on the model&#8217;s limits. My agent loop used to stop and ask me to approve each step, because I did not trust it to run unattended. A stronger model earned the trust, the per-step prompts came out, and the loop went autonomous. That was the model paying out a bet I had made against it.</p><p>The second kind was never about the model at all. My coordinator used to hand work to its sub-agents through files on disk &#8212; a spec file, an issue file, a review-output file &#8212; because that was how state moved between them. Then a small tooling change let each agent read the issue and post its own result directly, and the files were gone. No model release did that. It was scaffolding I had mistaken for structure.</p><p>Only the first kind compounds, which is why the audit runs as a routine and not a cleanup. Deleting a dead gate is the work most teams skip, because a gate that no longer does anything still reads as safety.</p><p>Then you go looking for the new failure surface, because there always is one. A model that writes better code fails in subtler ways. It is confidently wrong about more sophisticated things. The gate that caught last year&#8217;s mistakes will not see this year&#8217;s. Finding the new edge before your customers do is not panic; it is a routine you run every release, and each time you run it you pull a little further ahead of the team relearning it from their first outage.</p><p>None of this is free, and it is not for every team. Running the audit every release is a standing tax, and a smaller shop will pin the model for six months and eat the staleness instead &#8212; often the right call. But staleness is not static. The model keeps moving whether you audit or not, the un-audited harness keeps rotting, and the distance between the team that re-derives and the team that waits is set by a release cadence neither of them controls.</p><h2>The line keeps moving</h2><p>There is an obvious objection to all of this. The labs are already selling the part I called un-rentable. Managed Agents productized the loop, the sandbox, and the session log a year after everyone started writing them by hand, and the line between rent and build does not hold still. It moves outward every release, and verification on your own data is the next thing they reach for.</p><p>So why bet on the evaluator surviving? Not because a vendor can&#8217;t build an evaluation framework. They will, and you should use it the day it ships. The reason is narrower and harder to copy: what makes your evaluator correct is the ledger of incidents behind it, and that ledger is written in an ink the vendor cannot read. Your outages. Your data. The way your customers actually break things. They can ship the frame. They cannot ship the contents.</p><h2>It lives in the team, not the repo</h2><p>So what is the asset, exactly.</p><p>Not the harness. Part one already conceded that one: it depreciates, the model eats pieces of it, the leaner version next quarter is the better one. Not the skills files either; those copy too.</p><p>The asset is the judgment that decides which gate to delete and which to keep. That judgment does not live in the repo. It lives in the people who were there for the incidents, who know which failures were flukes and which were the model telling them something, who can read a new release and re-derive the harness in a week instead of relearning it over a quarter of outages.</p><p>You could hand a competitor the entire system and they would still be behind, because what you built was never the code. It is a team that knows where this specific system breaks, and how fast it stops breaking that way.</p><p>The model is rented, and it gets better on someone else&#8217;s schedule. The harness is owned, and it rots on yours. The work is keeping it from rotting. The people who can do that work the week the model moves are the only part of this that was ever a moat.</p>]]></content:encoded></item><item><title><![CDATA[The Harness Is the Moat]]></title><description><![CDATA[The model is the part everyone benchmarks. The reliability layer around it is the part that actually ships.]]></description><link>https://joaofogoncalves.substack.com/p/2026-06-08-the-harness-is-the-moat</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-06-08-the-harness-is-the-moat</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/58a1aadc-61a7-4c66-ace4-477699f29d60_1168x784.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ouz-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ouz-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!Ouz-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!Ouz-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ouz-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ouz-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Ouz-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!Ouz-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!Ouz-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ouz-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fcc51fb-2240-4dd5-bbc5-8589507808be_1168x784.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>There is a ritual that runs in most engineering orgs right now. A new model drops. Someone reads the benchmark card, runs it against an internal eval, posts the delta in a channel, and files a ticket to swap the API string. The model is treated as the variable. Turn the knob, get more capability, ship better agents.</p><p>The teams actually running agents in production barely touch that knob.</p><p>They are not indifferent to the model. They will take the better one when it lands. But they know something the benchmark ritual hides: the model was never the thing standing between them and a working agent. The thing standing between them was everything around the model. The state coordination, the permission boundaries, the failure recovery, the verification gates, the deploy path. The unglamorous layer that turns one good completion into a system you can leave running overnight.</p><p>That layer has a name. Anthropic calls it the harness, and they put it in the title of an <a href="https://www.anthropic.com/engineering/harness-design-long-running-apps">engineering post</a> about long-running agents. The name is worth keeping, because once you have it, the part of the work that actually decides whether an agent ships comes into focus.</p><p>The model is the commodity. The harness is the moat. Both halves of that sentence need defending, and the second half is more slippery than it looks.</p><h2>What a harness actually is</h2><p>A harness is not a prompt and it is not a framework you install. It is the running system that lets a model do useful work without a human holding its hand through every step.</p><p>Concretely, in the system I run, the harness is the part that does this. It coordinates state across parallel working directories, so four agents can edit the same repo at once without writing over each other. It handles permissions and isolation, so an agent that goes off the rails can&#8217;t touch production credentials or delete a branch it shouldn&#8217;t. It recovers from CI failures, reads the red build, diagnoses the cause, and pushes a fix without waking anyone. It gates output behind verification, so nothing merges that hasn&#8217;t passed a check the model didn&#8217;t get to grade for itself. It recovers from partial failures, picks up a feature that died halfway through three agents ago. And at the end, it deploys.</p><p>The model is one call inside that loop. An important call. Not the loop.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c8K1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c8K1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp 424w, https://substackcdn.com/image/fetch/$s_!c8K1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp 848w, https://substackcdn.com/image/fetch/$s_!c8K1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp 1272w, https://substackcdn.com/image/fetch/$s_!c8K1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c8K1!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53826eec-eff6-4974-8196-40026a210974_4320x876.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A single feature's path through the harness. The model is one highlighted stage among many; the gates and recovery steps around it are the harness.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="A single feature's path through the harness. The model is one highlighted stage among many; the gates and recovery steps around it are the harness." title="A single feature's path through the harness. The model is one highlighted stage among many; the gates and recovery steps around it are the harness." srcset="https://substackcdn.com/image/fetch/$s_!c8K1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp 424w, https://substackcdn.com/image/fetch/$s_!c8K1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp 848w, https://substackcdn.com/image/fetch/$s_!c8K1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp 1272w, https://substackcdn.com/image/fetch/$s_!c8K1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53826eec-eff6-4974-8196-40026a210974_4320x876.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This is the part the benchmark card cannot show you, because the benchmark measures the call and the harness is everything between the calls. Take the biggest model jump on the board right now. Opus 4.8 landed in late May about ten points clear of the field on SWE-bench Pro, one of the hardest coding benchmarks in current use. That is a real gain, the kind worth swapping the API string for. It also does not coordinate worktrees. It does not know your deploy gates. It does not remember that the last agent left the migration half-applied. The model improves along one axis. Your agents fail along a different one. The two barely intersect.</p><p>That orthogonality is the whole argument.</p><h2>The model improves. The breakage doesn&#8217;t move.</h2><p>Look at where the frontier actually sits. The benchmarks the industry leaned on two years ago are <a href="https://medium.com/@nairmilind3/llm-evaluation-in-2026-e631a78c67dc">saturated</a>. MMLU clusters in the low 90s across every serious model, close enough that the gaps read as noise. On the chat arena leaderboards the top models sit within a point or two. The newer, harder benchmarks still spread out, Opus 4.8 opened a real lead on SWE-bench Pro this spring over GPT-5.5 and Gemini 3.1 Pro, but look at what that lead buys you. A model that codes better on its own still does not coordinate worktrees, still does not know your deploy gates, still does not remember the half-applied migration. The gain lands on an axis that does not touch the one where your agents actually fail.</p><p>Now look at where production breaks. The failures are specific, and almost none of them are the model being dumb. I have spent real time diagnosing harness failures in Claude Code itself, the tool I build on. A git worktree that follows its <code>.git</code> pointer back to the main repo and registers every slash command twice, so the agent sees a duplicated menu and picks the wrong one (<a href="https://github.com/anthropics/claude-code/issues/26992">issue #26992</a>, closed as not-planned). An agent team that crashes when it hits a permission boundary mid-run instead of degrading gracefully. State tracking that loses the thread across worktrees.</p><p>It is worth being precise about what those are. Claude Code is itself a harness, one I rent from Anthropic, and those are its bugs, not the model&#8217;s. A harness has layers: the loop the vendor ships, and the layer I build on top of it. Failures show up at both. The point survives the distinction. None of them are the model. The model was fine. What broke was the scaffolding, and the scaffolding is where the work lives.</p><p>The data says the same thing at scale. By some estimates <a href="https://www.pertamapartners.com/insights/ai-project-failure-statistics-2026">around 80% of AI projects</a> fail to deliver value, and when you read the postmortems the cause is rarely that the model wasn&#8217;t smart enough. It is abandoned before production, completed but worthless, can&#8217;t justify the cost. Practitioners writing honestly about agents converge on the same diagnosis: they fail in production <a href="https://medium.com/ai-mindset/why-most-ai-agent-systems-fail-ee06c35f2ba2">because orchestration got treated as an afterthought</a>, and teams end up rebuilding session state, memory, and tool routing every couple of months as the model shifts under them.</p><p>That last detail is the one to hold onto. The harness is not a fixed asset you finish and own. It moves under you. Which reads like an argument against everything I just said, until you follow it one step further.</p><h2>Grade the output like a compiler, not an employee</h2><p>The hardest part of a harness is the part people skip, because it is the least fun to build and the easiest to fake.</p><p>Verification.</p><p>Here is the trap. You ask the model whether the work is good, and the model tells you it is good. Anthropic ran straight into this building their own harness and named it plainly: models &#8220;tend to respond by confidently praising the work, even when the quality is obviously mediocre.&#8221; Self-assessment does not work, because the thing doing the assessing is the thing being assessed, and it is agreeable by construction.</p><p>So the harness cannot trust the model&#8217;s self-report. It has to grade the output the way a compiler grades code, not the way a manager grades an employee. A compiler does not care how confident the submission is. It runs the check and returns pass or fail. The harness needs a separate evaluator that interacts with the running system, clicks the button, reads the actual error, and fails the work when the work is wrong, regardless of how good the diff looked. <a href="/articles/2026/05/2026-05-20-building-the-road-to-production-again/">I&#8217;ve written before about why detectable failure is the assumption the whole agent loop rests on</a>: the patterns that scaled human teams transfer cleanly to agents, except the one that quietly assumed a human would notice when something broke.</p><p>The economics of getting this right are not subtle. In Anthropic&#8217;s own comparison, a single model run cost nine dollars and produced a broken application. The multi-agent harness, with a separate planner, generator, and evaluator, cost two hundred dollars and produced one that worked. Twenty times the spend, and it was the cheap option, because a broken app costs more than two hundred dollars to discover in production.</p><p>That is the discipline in a sentence. You are not building around what the model does well. You are building around what it does badly, and every gate you add is a place you decided not to trust it.</p><h2>The hard part was never the prompt</h2><p>Let me put my own receipts on the table, because the argument is cheap without them.</p><p>At BRIDGE IN I run a fourteen-agent orchestration system that ships full-stack features end to end. It plans, implements, tests, and delivers. It triages Sentry exceptions and opens its own issues when it finds a real one. It recovers from CI failures on its own, and that one is not a flourish: it fails its first CI run about seven times in ten, then reads the red build and fixes itself before a human looks. The thirty-percent first-pass rate is the least flattering number I track and the one I point to first, because it is the recovery harness doing precisely the job the model cannot do for itself. It merges its own pull requests, most months with no human commits on the branch. It deploys to production. The whole thing runs through twenty-seven custom skills I wrote, each one a small contract for a specific job the system needs done reliably.</p><p>People ask what prompts I use. It is the wrong question. The prompts took an afternoon. The system took months, and almost none of those months went into prompting.</p><p>They went into the harness. Into figuring out how three agents share a repo without corrupting each other&#8217;s work. Into deciding what an agent is allowed to do without a human in the loop and what it is never allowed to do. Into the verification gates that catch the confident, plausible, wrong output before it reaches a customer. Into the recovery paths for when an agent dies mid-feature and the next one has to figure out where it was. <a href="/articles/2026/02/2026-02-17-coordinating-ai-agents-is-the-actual-hard-part/">The orchestration problem</a> was the actual hard part long before the model was good enough to make it worth solving.</p><p>This is also why <a href="/articles/2026/05/2026-05-26-the-real-ai-skill-isnt-prompting/">&#8220;what&#8217;s the best prompt&#8221; is the wrong frame entirely</a>. The skill that matters is designing the system the model operates inside. The prompt is a line in a config file. The system around it is the part that compounds.</p><h2>Won&#8217;t the model just eat the harness?</h2><p>Here is the strongest objection, and it comes from the same Anthropic post I keep quoting. Every component of a harness, they write, &#8220;encodes an assumption about what the model can&#8217;t do on its own, and those assumptions are worth stress testing, both because they may be incorrect, and because they can quickly go stale as models improve.&#8221; Read the second half slowly. A harness is, in part, a list of the current model&#8217;s weaknesses written down in code. Models get better. Some of those entries expire on the next release.</p><p>This is not hypothetical, and they show their own work on it. They built context resets into their harness because Opus 4.5 got anxious as its context filled up. Opus 4.6 mostly stopped doing that, so they deleted the resets entirely. The scaffolding that was load-bearing in one version was dead weight in the next. The same post has a sequel to the two-hundred-dollar run, too: on the newer model they built a full audio workstation for a hundred and twenty-four dollars, sustaining hours of coherent work after stripping out the structure the older model had needed. The model improved and the harness shrank to meet it.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lpIX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lpIX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp 424w, https://substackcdn.com/image/fetch/$s_!lpIX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp 848w, https://substackcdn.com/image/fetch/$s_!lpIX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp 1272w, https://substackcdn.com/image/fetch/$s_!lpIX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lpIX!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Two lines cross: as model capability rises across Opus 4.5, 4.6, and 4.8, the scaffolding the model still needs falls away. The harness encodes the model's current weaknesses, and they expire on each release.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Two lines cross: as model capability rises across Opus 4.5, 4.6, and 4.8, the scaffolding the model still needs falls away. The harness encodes the model's current weaknesses, and they expire on each release." title="Two lines cross: as model capability rises across Opus 4.5, 4.6, and 4.8, the scaffolding the model still needs falls away. The harness encodes the model's current weaknesses, and they expire on each release." srcset="https://substackcdn.com/image/fetch/$s_!lpIX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp 424w, https://substackcdn.com/image/fetch/$s_!lpIX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp 848w, https://substackcdn.com/image/fetch/$s_!lpIX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp 1272w, https://substackcdn.com/image/fetch/$s_!lpIX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38c7d2c1-5c74-4820-8a24-2df422f9291e_3200x1844.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>It is not only the model side. The labs are now selling the harness directly. Anthropic shipped <a href="https://www.anthropic.com/engineering/managed-agents">Managed Agents</a> in April, a hosted service that runs the agent loop, the sandbox, and the session log on their infrastructure for eight cents a session-hour. The generic orchestration layer, the part everyone was writing from scratch a year ago, is becoming something you rent.</p><p>So if the components depreciate and the plumbing commoditizes, where is the moat?</p><p>Not in any single gate. In two things the next model release cannot touch and the hosted runtime does not ship.</p><p>The first is the part of the harness that encodes your domain instead of the model&#8217;s limits. Your deploy gates. Your permission boundaries. The verification that knows what correct means in your product, on your data, against the way your customers actually use it. Managed Agents will run the loop. It will not know that a green diff touching the billing path still needs a human, or that your migrations have a failure mode the last three agents already hit. You earned that knowledge in production, and no model upgrade ships with it preinstalled.</p><p>The second is the one that compounds. Because the harness depreciates, the durable skill is not owning the right harness. It is re-deriving it faster than anyone else every time the model moves: knowing which assumptions just went stale, which gates to delete, which to keep, where the new failure surface opened up. That is not an artifact you build once. It is a capability that lives in the team, and it sharpens with every release while everyone still treating the model as the variable is learning the new failure modes from their first outage.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WojJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WojJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp 424w, https://substackcdn.com/image/fetch/$s_!WojJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp 848w, https://substackcdn.com/image/fetch/$s_!WojJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp 1272w, https://substackcdn.com/image/fetch/$s_!WojJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WojJ!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Two columns. Left, muted: the rented half of the harness, the generic agent loop, sandboxes, and session state that Anthropic now sells as a hosted service. Right, in teal: the owned half, your deploy gates, domain verification, accumulated failure history, and the skill of rebuilding it when the model moves. The moat is the right column.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Two columns. Left, muted: the rented half of the harness, the generic agent loop, sandboxes, and session state that Anthropic now sells as a hosted service. Right, in teal: the owned half, your deploy gates, domain verification, accumulated failure history, and the skill of rebuilding it when the model moves. The moat is the right column." title="Two columns. Left, muted: the rented half of the harness, the generic agent loop, sandboxes, and session state that Anthropic now sells as a hosted service. Right, in teal: the owned half, your deploy gates, domain verification, accumulated failure history, and the skill of rebuilding it when the model moves. The moat is the right column." srcset="https://substackcdn.com/image/fetch/$s_!WojJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp 424w, https://substackcdn.com/image/fetch/$s_!WojJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp 848w, https://substackcdn.com/image/fetch/$s_!WojJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp 1272w, https://substackcdn.com/image/fetch/$s_!WojJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F073f4a40-a98c-428e-aeeb-eb7abfcde97d_3200x1194.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>What you actually own</h2><p>AI made writing code cheap. When the cost of one thing falls that far, the value moves to whatever is now scarce, and what is scarce is everything the cheap part still can&#8217;t do for itself: coordination, verification, knowing what to build and proving it works without a human watching. That is a description of a harness, not a better model.</p><p>So take the upgrade when the model drops. It is free capability and you should want it. Then go back to the part that was actually keeping your agents out of production, and stop thinking of it as a thing you finish. The model you rent improves on someone else&#8217;s roadmap. The harness you own decays on yours, and the work is keeping it from decaying: pulling the gates the new model made redundant, finding the new failure surface before your customers do.</p><p>The model is the commodity. The moat is not the harness you have today. It is how fast you can rebuild it when the model moves.</p>]]></content:encoded></item><item><title><![CDATA[The Real AI Skill Isn't Prompting. It's System Design.]]></title><description><![CDATA[Most AI training teaches the wrong half of the job.]]></description><link>https://joaofogoncalves.substack.com/p/2026-05-26-the-real-ai-skill-isnt-prompting</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-05-26-the-real-ai-skill-isnt-prompting</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0a0c3567-f7a7-470d-a8f6-08f87b23876e_2000x1244.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FWvk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FWvk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp 424w, https://substackcdn.com/image/fetch/$s_!FWvk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp 848w, https://substackcdn.com/image/fetch/$s_!FWvk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp 1272w, https://substackcdn.com/image/fetch/$s_!FWvk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FWvk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!FWvk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp 424w, https://substackcdn.com/image/fetch/$s_!FWvk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp 848w, https://substackcdn.com/image/fetch/$s_!FWvk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp 1272w, https://substackcdn.com/image/fetch/$s_!FWvk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9a71263-eb86-49e4-a79e-86b00ff0a968_2000x1244.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>I sat through one of these last quarter. Over twenty people on a video call (the &#8220;conference room&#8221; was a Zoom grid), a slide deck with the OpenAI logo cropped slightly wrong, a vendor walking everyone through a prompt template for writing emails. <em>Subject</em>: marketing campaign for Q3. <em>Tone</em>: professional, friendly. Paste. Hit return. ChatGPT produced six bullet points. A few thumbs-ups landed in the chat. The vendor moved to slide forty-one.</p><p>Everyone left feeling productive.</p><p>The training was real, the slides were fine, the prompt template worked. None of it would have taught anyone how to use AI on anything that compounds. The visible surface is the part that sells as a course. The skill is one layer down.</p><h2>01 &#8212; The visible surface</h2><p>There is a default shape to AI literacy training in 2026. Show the demo. Hand out a prompt template. Have people paste it into ChatGPT and rewrite an email. Maybe a tool tour at the end: here is Claude, here is Gemini, here is your Microsoft Copilot license.</p><p>The format is legible. It demos well. It fits a slide deck. You can sell it as a half-day course and book it through procurement.</p><p>To be fair: the email-rewriter does work. The summarize-this-meeting prompt does work. Lifting the median knowledge worker on small, well-bounded tasks is a real use case, and the prompt template is roughly the right shape of training for it. The problem is what gets confused with that. The same procurement line item is being sold to engineering leaders, product orgs, and operations heads as if it would do the work that decides whether the company has an AI advantage. It will not. That work is different.</p><p>MIT&#8217;s 2026 NANDA report put a sharp number on the gap: <a href="https://wizr.ai/blog/why-enterprise-ai-apps-fail-and-how-to-fix-them/">95% of enterprise generative AI pilots produced no measurable P&amp;L impact</a> inside six months. The methodology has been contested, and the headline is harsher than the underlying numbers warrant, but even the conservative reads agree that <a href="https://www.ciodive.com/news/why-enterprise-ai-pilots-fail/808751/">only a third of enterprise AI pilots reach production</a>. The model is not the variable that broke those pilots. The system around the model was.</p><p>A prompt template gets you a generic output on a small task. Working with AI on anything that compounds looks different. It looks like breaking a problem into pieces small enough to fail at visibly, knowing what good looks like before the model writes anything, telling it what is wrong with what it gave you, and iterating until it isn&#8217;t. None of that is in the slide deck. All of it is now the actual work.</p><p>The prompt is the artifact. The skill is upstream.</p><h2>02 &#8212; The system the model operates inside</h2><p>What people are reaching for when they say &#8220;prompting&#8221; is, almost always, a different and older skill. It has five rough parts.</p><p><strong>Scope.</strong> You name the problem precisely enough that a stranger could tell whether the output solves it. Not &#8220;help me with the deployment pipeline.&#8221; Something like: walk me through each step from commit to production, flag the steps that take longest, suggest where we could parallelize. The first one is a wish. The second one is a question.</p><p><strong>Decomposition.</strong> You break the work into chunks small enough that the failure modes are visible. The model is going to fail. Your job is to design the work so that the failures are caught, not absorbed. A single mega-prompt that says &#8220;build me a marketing site&#8221; hides every decision the model is making. Six small prompts each producing a verifiable artifact does not.</p><p><strong>Criteria.</strong> You write down what good looks like before the model writes anything. In measurable terms. Three bullet points. Two paragraphs of source material cited. No hedging language. No marketing-speak. The rubric is what an evaluation harness checks against &#8212; without it, you have no way to know whether a run regressed. If you can&#8217;t write the rubric, you don&#8217;t know what you want, and the model is going to make a confident guess on your behalf.</p><p><strong>Feedback loops.</strong> You have a way to tell the next iteration what the last one got wrong. This is the part the templates skip entirely. It is also the part that compounds.</p><p><strong>Making the implicit explicit.</strong> Every time you correct the model in your head and don&#8217;t write the correction down, you are training nobody and nothing. Models are stateless and non-deterministic. They do not learn between conversations the way a contractor learns between engagements. The system around them has to carry what a person would have carried in their head. Put the correction in a system prompt, a skill file, a project doc, anywhere the next run will read it. That is what &#8220;system&#8221; means in this article. Not orchestration framework. The set of inputs the next run sees.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yvZj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yvZj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp 424w, https://substackcdn.com/image/fetch/$s_!yvZj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp 848w, https://substackcdn.com/image/fetch/$s_!yvZj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp 1272w, https://substackcdn.com/image/fetch/$s_!yvZj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yvZj!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Five parts of working with AI on real problems: scope, decompose, criteria, feedback loop, make explicit&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Five parts of working with AI on real problems: scope, decompose, criteria, feedback loop, make explicit" title="Five parts of working with AI on real problems: scope, decompose, criteria, feedback loop, make explicit" srcset="https://substackcdn.com/image/fetch/$s_!yvZj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp 424w, https://substackcdn.com/image/fetch/$s_!yvZj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp 848w, https://substackcdn.com/image/fetch/$s_!yvZj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp 1272w, https://substackcdn.com/image/fetch/$s_!yvZj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24623b37-727c-481d-8d08-e5be9d5e6d09_4800x1100.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Five things. None of them are about the model. All of them are about the design around the model.</p><p>This is not new in shape. Scoping, criteria, and structured feedback are familiar from any well-run engineering organization. What is new is what carries the learning. A junior engineer remembers a code review three weeks later. A model does not. Skill files exist precisely because nothing else does the carrying.</p><h2>03 &#8212; The floor and the ceiling</h2><p>I have been <a href="/posts/2026/04/2026-04-26-most-ai-trainings-meet-people-where-they-are/">running prompting sessions</a> for over 6 months. The pattern is consistent.</p><p>The floor is structural. People who already know how to describe work in measurable, scoped, criteria-bearing terms become functional with almost any model inside an hour. The transferable competence is mostly older than the technology.</p><p>A head of support I worked with started a session with &#8220;I want to get more insights out of HubSpot.&#8221; Fifteen minutes later, with two questions from me, she had written: <em>pull every support ticket from the last 90 days, group them by the product surface the customer was asking about, count tickets per surface, and surface the three themes with the steepest volume growth over the period.</em> She did not learn a prompt. She remembered how to write a brief. She has been writing briefs for vendors and consultants her entire career. The model is just the newest contractor.</p><p>The ceiling is something else. It is engineering depth &#8212; the ability to look at output and know whether it is wrong. Structural skill gets you a working interaction. Depth is what catches the failure that compiles cleanly, passes the rubric you wrote, and ships your blind spot at scale.</p><p>I wrote about this in <a href="/articles/2026/05/2026-05-04-ai-as-the-great-filter/">AI as the Great Filter</a>. The short version: engineering depth used to be a nice-to-have. Now it is the variable that decides who survives the next layer. The engineers who already had the muscle &#8212; architecture decisions, code review, design docs, naming a failure mode before someone hits it &#8212; compound. The ones who treated cheap AI as a substitute for that muscle ship fluently-broken code at scale.</p><p>The trap on the engineering side is the interesting one. Technical literacy looks like depth and is often the opposite. Knowing the stack makes it tempting to skip system design and just write the code yourself. AI made that trap deeper, not shallower. The engineer who used to write a function in 30 minutes now writes it in 90 seconds with Claude. The gap from spec to output is almost entirely verification. If you can&#8217;t articulate what good looks like before the model produces it, your verification reduces to &#8220;looks right.&#8221; That ships your blind spots faster, with more confidence, in larger volume.</p><p>A two-hour prompt-engineering workshop teaches the model interface. It teaches nothing about how to know whether the output is wrong. The engineer who could already eyeball a design and say &#8220;this won&#8217;t work under load&#8221; gets faster. The engineer who could not gets a paste-bin of plausible code and a working keyboard.</p><p>The floor is structural. The ceiling is engineering depth. Most workforce AI training is failing at the floor and ignoring the ceiling entirely.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0cEZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0cEZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp 424w, https://substackcdn.com/image/fetch/$s_!0cEZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp 848w, https://substackcdn.com/image/fetch/$s_!0cEZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp 1272w, https://substackcdn.com/image/fetch/$s_!0cEZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0cEZ!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp" width="1200" height="446.7032967032967" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:542,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:83280,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/199308445?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0cEZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp 424w, https://substackcdn.com/image/fetch/$s_!0cEZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp 848w, https://substackcdn.com/image/fetch/$s_!0cEZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp 1272w, https://substackcdn.com/image/fetch/$s_!0cEZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12f1722c-a46d-4340-b5f4-a5dc86fa7d68_2800x1042.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>04 &#8212; aiBerto, the receipt</h2><p>We have an AI engineering agent at BRIDGE IN. His name is aiBerto. He lives in our Slack, picks the next issue off our project board every couple of hours, opens a PR, runs CI, fixes failing checks, asks for review when he&#8217;s stuck. Last month he merged 30 PRs autonomously (zero human commits on his branches), opened 107 GitHub issues, resolved 104, and handled 81 Slack interactions.</p><p>He didn&#8217;t get smarter last month. The underlying model didn&#8217;t change.</p><p>He got 40 skill patches.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lf_w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lf_w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!lf_w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!lf_w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!lf_w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lf_w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Where the gain came from: 0 model upgrades, 40 skill patches&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Where the gain came from: 0 model upgrades, 40 skill patches" title="Where the gain came from: 0 model upgrades, 40 skill patches" srcset="https://substackcdn.com/image/fetch/$s_!lf_w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!lf_w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!lf_w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!lf_w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F879e3d10-c00c-4c6a-98e5-33daddbcfcc8_3200x1800.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Forty sentences, written by humans who watched him fail at something specific and figured out what he should have known. Every patch sits in a markdown file in our repo. The next time aiBerto runs the relevant skill, the file gets prepended into his context window. The failure mode stops happening.</p><p>A recent one: aiBerto&#8217;s <code>/build</code> skill was occasionally merging a PR without explicitly linking it back to the originating GitHub issue. The PR closed the issue via a keyword in the body, which was enough for GitHub but not enough for our project board. A teammate noticed the same failure twice, patched the skill with a one-line &#8220;guarantee the PR-issue link before merging&#8221; step, and the failure mode disappeared. He did not retrain anything. He wrote a sentence. The sentence is in the repo.</p><p>None of those forty sentences are prompts in the popular sense. They are pieces of system. <em>Before merging, link the issue.</em> <em>When CI fails on lint, run the linter locally first.</em> <em>When triaging Sentry, dedupe by stack hash before opening tickets.</em> Each one is a piece of organizational knowledge made explicit, written down, and put on the model&#8217;s read path.</p><p>The honest question an engineering leader asks here is the regression question: how do you know patching one failure didn&#8217;t break three others? Answer: an eval suite that runs the agent against a set of historical issues and PRs before any skill change merges. It catches local regression. It does not catch the harder problem, which is architectural drift across many small clean diffs &#8212; the fifth PR through the same area of code surfacing a pattern the previous four missed. The eval handles the failures we already know to look for. The drift is the part we are still writing the system around.</p><p>The model is the same. The system around it got better. The agent&#8217;s effective intelligence rose because the people closest to each kind of failure added the missing piece of context. That is system design. It is also what AI literacy looks like at scale.</p><p><a href="/articles/2026/05/2026-05-14-lead-time-is-the-wrong-half/">The longer version of this story</a> has the metrics. The shape that matters is this one: forty sentences moved more output than any prompt-template handout ever could.</p><h2>05 &#8212; What a real curriculum looks like</h2><p>If I were running an honest AI literacy program for an engineering organization, the agenda would look almost nothing like the one I sat through.</p><p>Pick a real problem the team actually has. Not a sample case study, not a &#8220;draft this email&#8221; exercise. A real Sentry bucket. A slow code review queue. An incident post-mortem nobody has written yet.</p><p>Before anyone opens a model, write down what done looks like. In measurable terms. The same rubric you would put on a sprint planning ticket. Three bullets. Pass criteria. A test you could run.</p><p>Break the problem into the smallest unit the AI can fail at visibly. If the unit is too big to verify, it is too big to delegate. Split it. The unit looks a lot like a small PR.</p><p>Write the evaluation rubric yourself. Not the one the model suggests. The model will suggest a flattering rubric. That is what models are tuned to do.</p><p>When the output is wrong, write the missing sentence the next run would need to read in order to not be wrong in the same way. Put it in version control. Now you have a system. Now you also have a regression target &#8212; the next change runs against the same sentence and the team sees whether it still holds.</p><p>Do this for four weeks. The deliverable is not a slide deck. It is a markdown directory of sentences a team&#8217;s worth of people wrote because they watched something fail and figured out what it should have known. That directory compounds. The slide deck does not.</p><p><a href="/articles/2026/04/2026-04-18-your-ai-first-engineering-org-probably-isnt/">The engineering-org version of this argument</a> is adjacent. Bolting Copilot onto a workflow is not AI-first. Bolting prompt templates onto a workforce is not AI-literate. Both confuse the artifact for the work.</p><h2>Back to the call</h2><p>The twenty-plus people on that call are not at fault. The vendor is not, mostly, dishonest. The slide deck and the prompt template are not wrong for what they&#8217;re trying to do.</p><p>The honest version of the same training would have looked almost nothing like it. The vendor would have opened the team&#8217;s actual bug tracker. Pulled the next issue. Asked someone what done looked like, in measurable terms, before anyone touched a model. Made them write the rubric. Run the model. Watched it fail at something specific. Asked someone else what the missing sentence was. Committed the sentence to the repo. Run it again. Saved the rubric, the failure, and the sentence as the artifact of the session.</p><p>The deliverable would have been a markdown file the team kept, not a slide deck the team forgot.</p><p>The skill is older than the model. The model is just the latest reason to teach it.</p>]]></content:encoded></item><item><title><![CDATA[Building the Road to Production, Again]]></title><description><![CDATA[The SDLC patterns that scaled three people to 400 deployments transfer cleanly to agentic engineering. The detection assumption underneath them doesn't.]]></description><link>https://joaofogoncalves.substack.com/p/2026-05-20-building-the-road-to-production-again</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-05-20-building-the-road-to-production-again</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/daeb7ba0-c68d-4a13-a92c-1e887cb6ce26_1168x784.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dn-u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dn-u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!Dn-u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!Dn-u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!Dn-u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dn-u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Dn-u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!Dn-u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!Dn-u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!Dn-u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52621d70-3024-4b0f-b571-cabe3807428c_1168x784.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><h2>The motto</h2><p>In 2022 someone interviewed me about being Head of DevOps at <strong><a href="https://www.valispace.com/">Valispace</a></strong>. I said the team motto out loud, probably for the first time on camera: &#8220;building the road to production.&#8221;</p><p>We didn&#8217;t build the product. We built every tool the team needed so the road from idea to production stayed clear, fast, and safe. Three people, 400 customer deployments, a release every two weeks, four hours to roll the new version across the entire customer base on a Sunday night. Later in the interview I said something that still describes the work: my work is mostly well done when nobody talks about me.</p><p>I&#8217;m doing the same job again at BRIDGE IN. The road has different traffic on it now.</p><div id="youtube2-kDQQJfrIrdY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;kDQQJfrIrdY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/kDQQJfrIrdY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>The current playbook for adopting coding agents treats agentic engineering as a new discipline. The shape mostly isn&#8217;t new. The SDLC patterns that scaled a 3-person DevOps team running 400 cloud deployments transfer cleanly to a small product team running an agent fleet. The unit of &#8220;builder&#8221; changed. The work &#8212; mostly &#8212; didn&#8217;t.</p><p>Mostly. Four patterns map. One assumption underneath them breaks, and the break is the whole point of this piece. Teams building the four without confronting the fifth are paying a tax that won&#8217;t show up in any dashboard they own for another two quarters.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oGu0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oGu0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp 424w, https://substackcdn.com/image/fetch/$s_!oGu0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp 848w, https://substackcdn.com/image/fetch/$s_!oGu0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp 1272w, https://substackcdn.com/image/fetch/$s_!oGu0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oGu0!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Four SDLC patterns from Valispace map cleanly to agentic engineering. The fifth &#8212; cheap, detectable failure &#8212; is the one that breaks.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Four SDLC patterns from Valispace map cleanly to agentic engineering. The fifth &#8212; cheap, detectable failure &#8212; is the one that breaks." title="Four SDLC patterns from Valispace map cleanly to agentic engineering. The fifth &#8212; cheap, detectable failure &#8212; is the one that breaks." srcset="https://substackcdn.com/image/fetch/$s_!oGu0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp 424w, https://substackcdn.com/image/fetch/$s_!oGu0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp 848w, https://substackcdn.com/image/fetch/$s_!oGu0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp 1272w, https://substackcdn.com/image/fetch/$s_!oGu0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbb191c6-4b45-4e7c-959d-c9dbd2fc9e9a_3200x1230.webp 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h2>One control plane</h2><p>The internal tool I spent 80% of my time on at Valispace was something called ValiAdmin. It was the single place where the company described itself to itself. Customer deployments, internal dependencies, server health, version state, configuration. One interface, managed by code, queried by the rest of the team.</p><p>When customer success needed to spin up a deployment, they didn&#8217;t page DevOps. They opened ValiAdmin. When support needed to restore a backup, they opened ValiAdmin. When a release went out at 9pm on Sunday, the orchestrator was ValiAdmin.</p><p>Three people managed 400 deployments on ValiAdmin.</p><p>The general pattern: the system has to describe itself in machine-readable form, in one place, in a way that anyone &#8212; or anything &#8212; operating it can read and act on. Otherwise the institutional knowledge lives in three engineers&#8217; heads and the team can&#8217;t grow past that.</p><p>That pattern got new vocabulary in 2026: CLAUDE.md, AGENTS.md, rules files, MCPs, custom skills. Those are the <em>informational</em> half &#8212; the documentation an agent reads to ground itself in your team&#8217;s standards. They map onto the rules and runbooks ValiAdmin&#8217;s UI made obvious. They&#8217;re necessary and they&#8217;re not sufficient.</p><p>The <em>operational</em> half &#8212; the thing that knows the current state of every service, every container, every secret, every dependency, and can act on it &#8212; is the part most teams haven&#8217;t built. <a href="https://github.com/bridgeinpt/bridgeport">Bridgeport</a>, the deployment tool I built recently at BRIDGE IN, is the agent-era equivalent of that operational half. One instance manages every environment, every server, every service, every container image, every encrypted secret, every config file. Deployment plans resolve service dependencies, deploy in order, verify health checks between steps, and auto-rollback the whole chain if anything fails. The state of what&#8217;s running, what version, where, and who deployed it is queryable from one UI &#8212; and from one MCP, which means a Claude Code agent can answer &#8220;what changed on staging in the last hour&#8221; with the same authority as the on-call engineer.</p><p>The split matters. CLAUDE.md tells the agent what good looks like. The control plane tells it what&#8217;s actually true. Most teams I see have invested heavily in the first and almost not at all in the second. The result is agents that know the standards but can&#8217;t observe the state &#8212; and which therefore confidently hallucinate it.</p><h2>Self-service for the rest of the team</h2><p>The companion to ValiAdmin was Valinstall. It was how customers who insisted on on-premise deployments installed Valispace themselves. The goal was simple: get from &#8220;we send an engineer to your data center for two hours&#8221; to &#8220;you run one command and read a README.&#8221;</p><p>We got it to about 80%. The reason it mattered: some customers literally could not let us see their data. ITAR-regulated defense customers ran Valispace inside their own networks with no visibility back to us. When something broke, the metaphor I used in the interview was that we were fixing an engine on a car through the tailpipe.</p><p>The only viable answer was tooling. Better diagnostics they could run themselves. Better installers. Push the surface outward so they could solve their own problems with our tools instead of waiting on us to teleport in.</p><p>The agent-era version of this pattern is shaped the same way but aimed at a different audience. Valinstall pushed surface to customers we couldn&#8217;t see. Skills, MCPs, and rules files push surface to internal teams an engineer used to chaperone &#8212; a PM opening a properly-scoped issue without a roadmap meeting, support triaging a bug report against the codebase, an agent building the boring CRUD page without a senior engineer in the loop.</p><p>The audience is different. The shape is identical: the small team scales by widening the surface where other people (or other agents) can act without it. You don&#8217;t scale a small team. You scale the surface.</p><p>The bottleneck moves otherwise.</p><h2>The managed boundary</h2><p>In 2022 I had a clear rule for AWS services: use the managed version unless we found a specific reason not to. The DevOps team had 400 deployments to keep running. We couldn&#8217;t afford to also be the DBA team.</p><p>The same heuristic applies to AI infrastructure in 2026, but the question has shifted under it. Self-host vs. hosted was the 2024 framing. By 2026 the real CTO-level question is which abstraction you commit to: single-vendor hosted (Anthropic, OpenAI direct), multi-provider routing (a fallback-aware, cost-aware layer on top), or platform abstraction (Bedrock, Vertex). All three are &#8220;managed.&#8221; The decision is governance posture, not build-vs-buy.</p><p>The silent constraint underneath all three is cost-per-team accounting. Most orgs in 2026 don&#8217;t have token budgets that map to teams. They have a single bill that grows quarter over quarter and nobody owns it. That&#8217;s the same DBA-team problem in new clothing &#8212; the thing you delegate still needs an owner, even when the owner is delegating the implementation.</p><p>The carve-outs for going custom (self-hosted weights, your own GPUs) are real and narrow. Data residency. Latency or cost ceilings no hosted offering hits. ITAR-style isolation that won&#8217;t ever cross a public-cloud boundary. Everything else is managed, and the engineering decision is the layer above it.</p><p>This decision is downstream of one most teams haven&#8217;t answered: <a href="/articles/2026/04/2026-04-18-your-ai-first-engineering-org-probably-isnt/">&#8220;AI-first&#8221; or AI-assisted?</a> You can&#8217;t pick the right inference layer until you&#8217;ve decided what shape of work the agents are actually doing.</p><h2>The coaching layer</h2><p>The rules I had at Valispace were short. If you do something twice, you automate it. If you don&#8217;t use something for over a year, you drop it. Nothing on a personal laptop, everything in version control.</p><p>I didn&#8217;t enforce those rules in code reviews. I didn&#8217;t need to. The tooling made the rules cheap to follow. The CI made deviation expensive. After six months on the team, an engineer wouldn&#8217;t think to do it the old way.</p><p>That&#8217;s the part most engineering leaders miss when they talk about &#8220;AI adoption.&#8221; They treat it like a training problem. Send the team to a workshop, show them the prompts, hand them the keyboard, expect agentic engineering to materialize. It doesn&#8217;t. The reps don&#8217;t compound through content.</p><p>What does compound: putting the rules into the road itself, as enforcement, not as documentation. The CLAUDE.md that the reviewer agent is wired to reject diffs against. The pre-commit hook that runs the eval suite on agent-generated changes. The MCP that exposes the bug tracker so the agent grounds an issue in your team&#8217;s actual taxonomy instead of inventing one. Guardrails as code, not training as content.</p><p>The team learns the rules by living inside them. Same way Valispace developers learned the release process &#8212; by working in ValiAdmin, watching it run, occasionally asking why a check fired. Coaching wasn&#8217;t a session. It was the workflow.</p><p>I did this once in someone else&#8217;s department. Post-acquisition at Altium, I inherited an engineering org that had just doubled in size. The leads thought their friction was tooling and headcount. It wasn&#8217;t. The new half of the team didn&#8217;t have a road to operate on &#8212; no enforcement, no shared scaffolds, every engineer reinventing the basics. I spent the next year building one. 90% of the team stayed through the merger, most of them with shareholder cash on the table to leave.</p><p>You can&#8217;t upskill a 100-engineer org with a workshop. You upskill it by making the right behavior the path of least resistance.</p><h2>The one thing that doesn&#8217;t transfer</h2><p>Valispace shipped a release every two weeks. Forty-plus releases a year. 400 customer deployments updated in 4 hours on a Sunday night. Automated rollback if a deployment failed. Migration scripts dry-run on staging clones first. Dozens of checks running before the deploy button was even available.</p><p>The headline metric the founder asked about was speed. The actual metric we tracked was the cost of failure. If a release broke production, what was the blast radius, and how fast could we recover? Two-week cycles were possible because failure was <em>cheap</em> &#8212; cheap because we&#8217;d built every fail-safe into the path before we built the path itself.</p><p>The agent-PR loop wants to be the same shape. The unit got smaller, the cadence went from weeks to hours, but the discipline transfers: every PR an agent opens is a small unit of change with automated tests, automated review, automated revert. The teams I see struggling with agent-generated code are almost always the teams that didn&#8217;t have a cheap-failure SDLC before agents arrived. They were paying a bug-bash tax already. The agents just scaled it.</p><p>That much rhymes. Here&#8217;s the part that doesn&#8217;t.</p><p>A bad deploy is <strong>legible</strong>. The alert fires, the rollback runs, the blast radius is the customer base, recovery is measured in minutes. The Sunday-night release that broke would be visible by Monday morning. Cheap because <em>detectable</em>.</p><p>A bad agentic pattern is <strong>illegible</strong>. The PR passes lint and tests. The reviewer agent approves. The diff merges. Six months later you&#8217;re untangling an architectural drift you can&#8217;t trace to a single decision, because no single decision caused it &#8212; it accumulated across hundreds of PRs that each looked locally fine. The metaphor I&#8217;d use now: it isn&#8217;t a fire. It&#8217;s mineral deposit in the pipes. By the time anything is restricted enough to notice, the system has been quietly degrading for two quarters.</p><p>The &#8220;cheap failure&#8221; doctrine assumed failure was detectable. That assumption is the part of the discipline that breaks.</p><p>The deeper reason is that the unit of work shifted from deterministic to non-deterministic. ValiAdmin was a deterministic control plane: same input, same state, same output. Terraform plans diff, infrastructure converges, rollbacks are exact. Agent code generation isn&#8217;t deterministic. Same prompt, different output. Same review criteria, different judgment from one run to the next. Same MCP, different decisions about which tool to call. The variance is baked in. You can clamp it. You can&#8217;t remove it.</p><p>So the architecture has to invert. The old discipline was: instrument the <em>path</em> so any single failure is detectable and recoverable. The new discipline has to be: instrument the <em>pattern-space</em>, because no individual diff is the failure &#8212; the failure is the cumulative drift of hundreds of diffs that each looked locally fine. The old detection layer found regressions. The new one has to find <em>trends</em> across diffs that don&#8217;t individually regress anything.</p><p>Concretely, the agent-era detection layer has at least four parts most teams haven&#8217;t built:</p><ul><li><p><strong>Architectural-drift evals.</strong> Not unit tests. Periodic structural checks against the dependency graph, AST-level pattern adherence, abstraction-leak detection. The question they answer isn&#8217;t &#8220;does this PR work&#8221; but &#8220;is the codebase getting worse, slowly, in a direction nobody chose.&#8221;</p></li><li><p><strong>Trace correlation across agent handoffs.</strong> The most expensive failures span a planner agent, an implementer agent, and a reviewer agent. None of them individually fails. The handoff loses context and the output is wrong by a step nobody owns. OpenTelemetry-style correlation, but for multi-agent loops.</p></li><li><p><strong>Token-spend budgets as first-class production constraints.</strong> Not finance reports after the fact. Real-time per-team budgets that page when they&#8217;re breached, the same way you&#8217;d page on infra cost. The teams without this have a single corporate AWS-style bill that grows quarterly and nobody owns.</p></li><li><p><strong>Pattern-level regressions in the eval suite.</strong> Not &#8220;does this answer match the golden?&#8221; but &#8220;is the model getting worse at the kind of judgment we care about?&#8221; Run on a corpus, scored on direction not on individual answers, treated as a release gate.</p></li></ul><p>The metrics most teams track for the agent loop are lead time and deploy frequency, the DORA staples. They measure the easy half. <a href="/articles/2026/05/2026-05-14-lead-time-is-the-wrong-half/">The actual constraint sits upstream of all of them</a> &#8212; and for the agent-PR loop specifically, the actual constraint is whether the failures the loop produces are the ones the loop can see.</p><p>The Valispace cycle worked because the failure was loud. The agent cycle works only when the failure is made loud by design.</p><h2>What the road has to do now</h2><p>Doing something twice in 2022 meant writing a Bash script or a Python tool. Doing something twice in 2026 means writing a skill, a rules file, an MCP, an agent instruction. Same impulse. Different surface. I built <a href="https://github.com/bridgeinpt/bridgeport">Bridgeport</a> because I&#8217;d done a manual deploy more than twice. I write Claude Code skills for the same reason.</p><p>The discipline rhymes with what it was. The failure model is the part that doesn&#8217;t survive intact.</p><p>The Valispace road made deployment safe enough to run on a two-week cycle. The 2026 road has to do more. It has to make non-determinism <em>legible</em>. Detectable across hundreds of PRs that each looked fine in isolation. Detectable across agent handoffs that span environments. Detectable when the diff passes every gate you built and still degrades the system by inches.</p><p>If you run engineering, the move tomorrow morning isn&#8217;t to hand out more Copilot licenses. It&#8217;s to audit your failure-detection layer and ask whether it was built for legible failures or illegible ones. If it was built for the old shape &#8212; alerts on broken deploys, regressions on shipped diffs, dashboards that show the last hour &#8212; you&#8217;re under-instrumented for the cycle you&#8217;re already in. The cost will show up six months from now, in a backlog of architectural drift you can&#8217;t trace to any single decision.</p><p>Same building discipline. New thing the road has to carry.</p><p>My work is mostly well done when nobody talks about me. That part hasn&#8217;t changed.</p>]]></content:encoded></item><item><title><![CDATA[Lead Time Is the Wrong Half]]></title><description><![CDATA[Most engineering velocity metrics start the clock at the commit. A public agent forced us to start it at the report.]]></description><link>https://joaofogoncalves.substack.com/p/2026-05-14-lead-time-is-the-wrong-half</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-05-14-lead-time-is-the-wrong-half</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1acaed69-3bbb-4721-8423-86c8f5f9176d_2624x1632.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z8eI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z8eI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp 424w, https://substackcdn.com/image/fetch/$s_!Z8eI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp 848w, https://substackcdn.com/image/fetch/$s_!Z8eI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp 1272w, https://substackcdn.com/image/fetch/$s_!Z8eI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z8eI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Z8eI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp 424w, https://substackcdn.com/image/fetch/$s_!Z8eI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp 848w, https://substackcdn.com/image/fetch/$s_!Z8eI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp 1272w, https://substackcdn.com/image/fetch/$s_!Z8eI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2b457e-4071-41b2-a9e4-73b99e1efe3c_2624x1632.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><h2>The wrong half</h2><p>Most engineering teams measure how fast a PR ships. Almost none put it on the same slide as how fast a user complaint becomes a deployed fix.</p><p>The first number is the easy half. The second is the one customers feel.</p><p>I&#8217;ve seen the easy-half metrics circulate at our team and at every other team I&#8217;ve worked with. Three hundred and thirty-four PRs in a month. A twenty-two-minute mean lead time. Ninety-eight percent of PRs merged in under a day. Found-a-bug-yesterday, fixed-it-today. All real, all flattering, all measuring the half that begins after the work has already been noticed, scoped, prioritized, and started.</p><p>Report to deployment is what&#8217;s left after you cut that half off. Ours last month was 18.6 hours from issue filed to in production, across 78 feedback-sourced issues. The DORA-style lead time on the same work was 22 minutes. Two clocks on the same loop, fifty times apart.</p><h2>We built ours at a tenth the size</h2><p>Shopify has been writing about an AI agent it built called River. <a href="https://x.com/tobi/status/2053121182044451016">Tobi L&#252;tke&#8217;s post on it</a> is the clearest description I&#8217;ve read of the design choice we made too. River lives in their company Slack. She doesn&#8217;t take direct messages. If you DM her, she politely asks you to open a public channel and try again. The thing I keep coming back to in their writeup is the constraint: every conversation River has is searchable, watchable, and editable by anyone in the company. About one in eight pull requests merged into their main codebase last week was authored by her.</p><p>I read about it the same week our team was halfway through building ours.</p><p>Ours is called aiBerto. He has a hoodie, a moustache, and headphones.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VKND!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VKND!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp 424w, https://substackcdn.com/image/fetch/$s_!VKND!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp 848w, https://substackcdn.com/image/fetch/$s_!VKND!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp 1272w, https://substackcdn.com/image/fetch/$s_!VKND!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VKND!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;aiBerto, our autonomous engineering agent&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="aiBerto, our autonomous engineering agent" title="aiBerto, our autonomous engineering agent" srcset="https://substackcdn.com/image/fetch/$s_!VKND!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp 424w, https://substackcdn.com/image/fetch/$s_!VKND!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp 848w, https://substackcdn.com/image/fetch/$s_!VKND!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp 1272w, https://substackcdn.com/image/fetch/$s_!VKND!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62073c21-cda7-4c76-a435-e9ce918c14b6_512x512.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>He lives in our Slack. He picks the next bug off our project board every couple of hours, builds the fix, opens a PR, runs CI, fixes failing checks, asks for a human review when he&#8217;s stuck. He triages Sentry. He reads our user-feedback channels, files GitHub issues for the unhandled threads, replies in the thread when the issue lands. He does not have a DM inbox.</p><p>We are not five thousand people. We are fewer than ten.</p><p>Same constraint, scaled down.</p><h2>What the loop actually does</h2><p>A user complains in our feedback channel. aiBerto reads the thread, decides whether it&#8217;s a real issue, asks a clarifying question if it isn&#8217;t sure, opens a GitHub issue when the picture is clear. The issue lands on the project board. <code>/pick</code> claims the highest-priority one and announces what it&#8217;s working on in the team channel. <code>/build</code> writes the code, opens a draft PR, runs the tests, fixes the CI failures, marks the PR ready when it passes. A human reviews it. It merges.</p><p>Every step lives in a public channel. If <code>/build</code> gets stuck on a CI failure it can&#8217;t recover from, it pings the engineering channel and walks away. If a Dependabot security update lands overnight, aiBerto either resolves it autonomously or files a ticket and escalates. If a teammate @-mentions him in a thread, he answers in the thread, with the context from the thread, never from a private working memory.</p><p>The receipt at the end of the month is one git history and one Slack archive. The two together are the operating manual.</p><h2>The other half</h2><p>DORA gave most engineering orgs a default vocabulary for velocity: lead time for changes, deployment frequency, change failure rate, mean time to restore. The first one is the one everyone reaches for.</p><p>That number can look great while the company moves slowly.</p><p>Twenty-two minutes is a real measurement. We hit it. But the clock starts at the first commit, after a piece of work has already been scoped, prioritized, picked up, and written. Everything before the commit (somebody noticing the bug, somebody else reproducing it, a third person deciding it&#8217;s worth fixing, a fourth person writing the issue, a fifth person finding time to start) is not in the number. In most teams, that prelude is where the days disappear.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sZtV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sZtV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp 424w, https://substackcdn.com/image/fetch/$s_!sZtV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp 848w, https://substackcdn.com/image/fetch/$s_!sZtV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp 1272w, https://substackcdn.com/image/fetch/$s_!sZtV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sZtV!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Signal to deploy loop with DORA's lead-time window highlighted&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Signal to deploy loop with DORA's lead-time window highlighted" title="Signal to deploy loop with DORA's lead-time window highlighted" srcset="https://substackcdn.com/image/fetch/$s_!sZtV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp 424w, https://substackcdn.com/image/fetch/$s_!sZtV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp 848w, https://substackcdn.com/image/fetch/$s_!sZtV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp 1272w, https://substackcdn.com/image/fetch/$s_!sZtV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa65030d6-4c11-4e9e-ac0e-12d7bc50e44f_4800x870.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Two teams can hit the same lead time and have wildly different report-to-deployment numbers. The first triages every user report inside an hour, runs an on-call, has a single shared queue. The second sees a Sentry alert in the morning and circulates a Slack message asking who should own it. Both teams ship in 22 minutes. One ships in six hours total. The other ships in six days.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n9l0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n9l0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp 424w, https://substackcdn.com/image/fetch/$s_!n9l0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp 848w, https://substackcdn.com/image/fetch/$s_!n9l0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp 1272w, https://substackcdn.com/image/fetch/$s_!n9l0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n9l0!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Two clocks, one month: 22-minute DORA lead time vs 18.6-hour issue-to-shipped median&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Two clocks, one month: 22-minute DORA lead time vs 18.6-hour issue-to-shipped median" title="Two clocks, one month: 22-minute DORA lead time vs 18.6-hour issue-to-shipped median" srcset="https://substackcdn.com/image/fetch/$s_!n9l0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp 424w, https://substackcdn.com/image/fetch/$s_!n9l0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp 848w, https://substackcdn.com/image/fetch/$s_!n9l0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp 1272w, https://substackcdn.com/image/fetch/$s_!n9l0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a129c8d-5a48-4f26-9837-b7713c81fae6_4800x1600.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This isn&#8217;t a metric I&#8217;m inventing. It&#8217;s closer to what <a href="https://flowframework.org/">Mik Kersten calls Flow Time in the Flow Framework</a>: the elapsed time from an idea becoming legible to it being delivered, including the planning and waiting and triage that DORA&#8217;s lead time intentionally excludes. Industry-average Flow Efficiency sits around 15 to 25 percent. Work items in a typical team spend 75 to 85 percent of their lifetime waiting.</p><p>Report to deployment is Flow Time aimed at the bug-and-improvement loop, with the clock starting at the first external signal: a Sentry exception, a customer message, an internal Slack thread. It stops when the fix is in production. It counts triage, scoping, prioritization, implementation, review, and release. It&#8217;s the number the customer actually feels.</p><p>You don&#8217;t shrink it by shipping faster.</p><p>You shrink it by not stalling at the seams.</p><h2>What compounds in public</h2><p>The most interesting thing about running the agent in a public channel isn&#8217;t the PRs he ships. It&#8217;s the way the team gets better at running him.</p><p>aiBerto&#8217;s skills (<code>/pick</code>, <code>/build</code>, <code>/heartbeat</code>, <code>/fix-dependabot</code>, <code>/ship</code>, <code>/changelog</code>) are Claude Code custom skills: markdown files in our repo. Forty of them changed in the last month. Some got merged into others, some got deleted entirely. Most got patches because someone watched aiBerto get stuck on a specific failure mode and wrote down what he should have known.</p><p>A recent one: aiBerto&#8217;s <code>/build</code> skill was occasionally merging a PR without explicitly linking it back to the originating GitHub issue. The PR closed the issue via a keyword in the body, which is enough for GitHub but not enough for our project board. A teammate noticed the same failure twice, patched <code>/build</code> with a &#8220;guarantee the PR-issue link before merging&#8221; step, and the failure mode disappeared. He didn&#8217;t retrain anything. He wrote a sentence.</p><p>The sentence is in the repo now. Every future aiBerto run reads it.</p><p>My job used to be triaging Sentry. Now my job is writing the sentences aiBerto needs to triage Sentry himself.</p><p>This is the compound effect Shopify keeps describing in their public writeups about River. The agent&#8217;s average correctness rises not because the model changed, but because the people closest to each kind of work added the missing piece of context. He gets better at being our team.</p><p>The shape works at five thousand engineers and at fewer than ten. What I&#8217;m less sure about is the middle. At 200 engineers, three time zones, and compliance constraints, &#8220;the public channel&#8221; stops being one channel and becomes a permission graph: legal can&#8217;t see customer-PII threads, the embedded fintech team can&#8217;t put session tokens in a channel that contractors join, and the review queue becomes its own chokepoint regardless of how short the front half gets. The mechanism that compounds &#8212; single shared surface, low-friction triage, willingness to make the work visible &#8212; probably scales. The single shared surface itself does not. That&#8217;s where the redesign lives.</p><p>If aiBerto were a private window (a DM, a Cursor session, a chat sidebar) only one person would learn from any given interaction. The next teammate hitting the same friction would have to discover the patch from scratch. Most of the &#8220;AI productivity gain&#8221; you read about is shaped that way: an individual gets faster, the org doesn&#8217;t.</p><p>Public agents move the gain to the organization. Private agents keep it on the individual.</p><h2>The receipts</h2><p>For the month between April 6 and May 4, aiBerto:</p><ul><li><p>merged 30 pull requests, all of them autonomously, with zero human commits on his branches</p></li><li><p>opened 107 GitHub issues from Sentry triage and user-feedback channels</p></li><li><p>resolved 104 issues, mostly the ones he&#8217;d opened himself</p></li><li><p>handled 81 Slack interactions across product and engineering channels</p></li><li><p>processed 68 Dependabot updates, merging the safe ones and escalating the rest</p></li><li><p>had his own skill set patched 40 times by the humans watching him work</p></li><li><p>cost something on the order of $500 in API spend</p></li></ul><p>Across the whole team that month, the median time from issue filed to in production was 18.6 hours, measured across 78 feedback-sourced issues. That&#8217;s the report-to-deployment number, well under the 24-hour bar that DORA&#8217;s pre-2025 reports used as the elite threshold for the much narrower lead-time-for-changes metric. Ours counts much more of the loop. Our engineering team is three humans plus the agent. The three humans shipped 69 issues that month. aiBerto&#8217;s 30 PRs landed in parallel. Every one authored autonomously, with zero human commits on his branches.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LV7b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LV7b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp 424w, https://substackcdn.com/image/fetch/$s_!LV7b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp 848w, https://substackcdn.com/image/fetch/$s_!LV7b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp 1272w, https://substackcdn.com/image/fetch/$s_!LV7b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LV7b!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Where last month's shipping came from: 30 PRs by aiBerto, 3-human engineering team shipped 69 issues&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Where last month's shipping came from: 30 PRs by aiBerto, 3-human engineering team shipped 69 issues" title="Where last month's shipping came from: 30 PRs by aiBerto, 3-human engineering team shipped 69 issues" srcset="https://substackcdn.com/image/fetch/$s_!LV7b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp 424w, https://substackcdn.com/image/fetch/$s_!LV7b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp 848w, https://substackcdn.com/image/fetch/$s_!LV7b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp 1272w, https://substackcdn.com/image/fetch/$s_!LV7b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff091e46d-7b88-4e6e-b6e9-26d081890daa_4800x1608.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>A few of those numbers are flattering against industry benchmarks. The twenty-two-minute mean PR lead time clears any reasonable elite threshold. A hundred-percent autonomy rate on merged PRs is uncommon on the public record. Eighty-seven percent label coverage on PRs and ninety-nine percent on issues means almost everything is searchable along the dimensions you&#8217;d expect.</p><p>A few are honestly not. The 30% CI first-pass rate is the number I find most useful, and it isn&#8217;t flattering. It says aiBerto fails the first CI run roughly seven times out of ten and then fixes himself before asking for help. Compute is dramatically cheaper than human context-switching, so I read it the other way: he&#8217;s encountering the friction the linters and type-checkers were going to catch anyway, he encounters it himself before a human reviews, the cost shows up in API tokens rather than in stand-ups. The loop closes either way.</p><p>The 18.6-hour number also lives downstream of a triage step the agent runs. aiBerto reads each Sentry alert and Slack thread and decides whether it&#8217;s a real issue before opening one. That filter probably tilts the denominator toward well-formed work. To falsify it I&#8217;d sample raw signal traffic for a month and re-measure. We haven&#8217;t.</p><p>There&#8217;s also a list of numbers we don&#8217;t publish that we probably should: a clean change-failure rate, mean-time-to-restore, Flow Efficiency (the ratio of active work to wait time, which would show us where in the loop we&#8217;re actually stalling). The receipts above are the work that fell out of the loop, not a full audit of the loop&#8217;s quality.</p><p>The other thing those numbers don&#8217;t capture is the rhythm. aiBerto starts work every couple of hours, around the clock. The merges cluster during business hours because humans approve them. The PRs that wait for review until morning are not the bottleneck.</p><p>The bottleneck is review.</p><p>That moved sooner than I expected. With one human reviewer per PR and the agent generating roughly seven PRs a week, a queue forms inside two days if nothing else changes. DORA&#8217;s <a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-the-2025-dora-report">2025 State of AI-Assisted Software Development report</a> found that as individual productivity rises with AI adoption, organizational delivery metrics &#8212; lead time, deployment frequency, change failure rate &#8212; often stay flat or get worse. The review queue is one of the places that gap opens up.</p><p>Three things changed in our review practice as a result. First, aiBerto opens smaller PRs by construction: one issue, one change, no opportunistic refactors. The diffs read fast. Second, low-risk categories &#8212; label-only changes, copy fixes, fully-covered backend patches with green CI &#8212; merge under our auto-merge policy without human review at all. Third, when a human does review, the question shifts. It&#8217;s no longer &#8220;did you write good code.&#8221; It&#8217;s &#8220;is this the change we wanted.&#8221; That&#8217;s a different kind of review, and it doesn&#8217;t get easier.</p><p>What we haven&#8217;t solved is architectural drift. The agent ships a clean diff that solves the issue but misses a refactor a senior engineer would have caught. Each individual PR is fine. The fifth PR through the same area of code is the one that surfaces the pattern, and by then the previous four are merged. That&#8217;s the part we don&#8217;t have a metric for yet.</p><h2>Back to the channel</h2><p>The easy-half metric was always going to flatter us. A team can hit an elite lead time and ship at the speed of monthly stand-ups, and nobody asks why. The number doesn&#8217;t budge.</p><p>Report to deployment is the metric that breaks if any seam in the company is slow.</p><p>When the agent runs in a public channel, there&#8217;s no second story to tell about how engineering is going. The Slack history is the work history. The PR diffs are the daily output. The skill changelog is the management ledger. They are what&#8217;s left when the work has nowhere else to hide.</p><p>Pick one metric. Pick the one that includes the part of the loop you usually have to make excuses for.</p><p>The agent doesn&#8217;t need a dashboard.</p><p>It needs a channel.</p>]]></content:encoded></item><item><title><![CDATA[AI as the Great Filter]]></title><description><![CDATA[Engineering depth was a nice-to-have. Now it's the thing that decides who survives.]]></description><link>https://joaofogoncalves.substack.com/p/2026-05-04-ai-as-the-great-filter</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-05-04-ai-as-the-great-filter</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a312777e-e682-4933-9151-a65a8cd7212f_1168x784.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!80Mg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!80Mg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!80Mg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!80Mg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!80Mg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!80Mg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!80Mg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!80Mg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!80Mg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!80Mg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5e88e-ef1d-45c2-af4e-abcdfb03a2cb_1168x784.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><h2>The filter is already running</h2><p>In March, Amazon&#8217;s retail site went down twice in three days. The second outage knocked U.S. order volume down by 99% for about six hours. Roughly <a href="https://www.digitaltrends.com/computing/ai-code-wreaked-havoc-with-amazon-outage-and-now-the-company-is-making-tight-rules/">6.3 million orders</a> never landed. Both incidents were traced to AI-assisted code that shipped without proper review.</p><p>A few months earlier, Amazon&#8217;s own AI coding agent, Kiro, had been asked to fix a bug in the Cost Explorer service. Its proposed fix was to delete the production environment and rebuild it. The action got approved. Cost Explorer in mainland China went down for thirteen hours.</p><p>Amazon&#8217;s official position on all of this is that these were user errors, not AI errors &#8212; misconfigured permissions, missed reviews, the same mistakes any tool can amplify. That framing is convenient, but it&#8217;s also probably right, and it doesn&#8217;t make the outcome any better. Whether you call it an AI failure or a governance failure, the pattern is identical. An action got proposed. The review didn&#8217;t catch it. The blast radius was bigger than anyone could undo.</p><p>Robin Hanson coined the Great Filter in 1996 as a way to think about the Fermi paradox. If life is common, why is the universe quiet? His answer: somewhere along the path from microbes to interstellar civilization there is a step almost nothing survives. Maybe it&#8217;s abiogenesis. Maybe it&#8217;s intelligence. Maybe it&#8217;s the moment a species invents technology powerful enough to end itself.</p><p>I keep thinking about a smaller version of it. Not for civilizations. For engineers, teams, and companies.</p><p>A filter that&#8217;s already running. Quietly. Right now.</p><h2>The slot machine in your IDE</h2><p>A few weeks ago I wrote about <a href="https://www.linkedin.com/feed/update/urn:li:activity:7439956120992964608/">BullshitBench</a>, a benchmark that feeds language models false premises wrapped in confident-sounding jargon and measures how often they push back. Claude Sonnet 4.6 pushed back about 90% of the time. Most of the others were close to a coin flip.</p><p>That number is funny until you remember what it means in practice. Roughly half of the major coding assistants engineers use daily will agree with a wrong assumption rather than correct it.</p><p>This isn&#8217;t a bug. It&#8217;s a training artifact. Anthropic&#8217;s 2023 paper <a href="https://www.anthropic.com/research/towards-understanding-sycophancy-in-language-models">Towards Understanding Sycophancy in Language Models</a> showed that human raters, given the choice between an accurate response and a flattering one, often pick the flattering one. Preference-based training inherits the bias. The 2025 <a href="https://arxiv.org/html/2502.08177v4">SycEval</a> paper found that across major frontier models, sycophantic flips &#8212; where the model abandons a correct answer once a user pushes back &#8212; are common and predictable. A 2025 <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12534679/">medical-domain study</a> found that GPT-4 and GPT-4o complied 100% of the time with prompts designed to elicit logically inconsistent drug advice. The best-refusing open model still failed to push back about half the time.</p><p>The model isn&#8217;t lying. It&#8217;s optimizing. It&#8217;s been trained on a reward signal that ranks pleasant interactions higher than correct ones, so it produces pleasant interactions.</p><h2>What dumb mistakes look like at AI speed</h2><p>There&#8217;s a phrase I heard in an internal Slack thread last week, half-joke and half-warning. Someone was describing a real audit they&#8217;d done years ago at a Portuguese bank, where the engineers had put the database backup on the same server as the database itself. The auditor asked the obvious follow-up. What about a fire? What about both rooms burning? Crickets.</p><p>The thread eventually landed on a one-liner: AI is great at empowering people. Including the wrong ones, to ship the wrong things faster.</p><p>That isn&#8217;t a dunk. It&#8217;s an architecture observation.</p><p>The backup-on-the-server class of mistake didn&#8217;t appear with AI. It has been around as long as we&#8217;ve had servers. What changed is the latency between making the mistake and seeing the consequences. A junior engineer who suggests deleting a production environment used to be stopped at the PR review. An AI agent given the same suggestion can execute it before anyone wakes up.</p><p>A 2025 <a href="https://venturebeat.com/technology/43-of-ai-generated-code-changes-need-debugging-in-production-survey-finds">survey</a> found that 43% of AI-generated code changes required debugging in production. Not in staging. In production. That&#8217;s the percentage of cars on a freeway failing inspection after they&#8217;re already at highway speed.</p><p>Amazon&#8217;s response, after the March outages, was to lock down 335 critical systems and require senior engineer sign-off on every AI-assisted code change. That&#8217;s the right reaction. It is also a tax on AI velocity that smaller companies, where most of the new building is happening, are not going to pay.</p><p>So they will skip it. Until they don&#8217;t.</p><h2>The gambling loop</h2><p>Gambling addictions don&#8217;t develop on losses. They develop on intermittent wins. Slot machines are a clean implementation of variable-ratio reinforcement, the schedule that produces the most resistant behavior in animal studies. The pattern keeps you pulling.</p><p>AI coding tools have the same architecture, accidentally. Sometimes the output is junk. Sometimes it&#8217;s a working function. Occasionally it&#8217;s a fully refactored module that would have taken you a day. The wins get cached as &#8220;I am now an engineer who ships features in an hour.&#8221; The losses get rationalized &#8212; wrong context, bad day, my fault for the prompt. The reward signal stays positive even when the average outcome doesn&#8217;t. By the time the codebase has accumulated a pile of half-understood abstractions, the bill is already due.</p><h2>The strongest objection</h2><p>The best version of the counterargument goes like this. A junior engineer in 2026 working with Sonnet 4.6 has access to a Socratic tutor that breaks down code, walks through tradeoffs, and answers &#8220;why?&#8221; indefinitely. That is better feedback than most of us got from anyone except our best Staff engineer in 2014. So the depth gap closes, not widens. The filter doesn&#8217;t sort against juniors. It accelerates them.</p><p>I think this version is partly right. AI is a phenomenal learning aid for engineers who already know how to learn from one. But the failure mode in the data isn&#8217;t &#8220;AI substitutes for depth.&#8221; It&#8217;s that sycophancy kicks in hardest when the user can&#8217;t push back. A junior who treats the model as a Socratic partner &#8212; who asks &#8220;why?&#8221;, who runs the suggestion mentally before accepting it, who notices when an explanation is just confident-sounding noise &#8212; gets the tutor. A junior who treats the model as an oracle gets the slot machine. The deciding variable is what the human brings to the loop. That&#8217;s true of textbooks, Stack Overflow, and every senior engineer who tried to mentor anyone. The new thing isn&#8217;t the tutor. It&#8217;s that the worst-case mode now ships to production at machine speed.</p><h2>What survives the filter</h2><p>The engineers who come out of this era ahead are not the ones using AI less. They&#8217;re the ones using it harder, with their hands on the wheel.</p><p>There&#8217;s a pattern I see in the people I trust most on this. When an AI agent generates a function, they read it the way they&#8217;d read a junior engineer&#8217;s PR. With suspicion, with care, with a mental list of the failure modes they&#8217;ve personally seen. They notice when the test coverage is theatrical. They notice when the abstraction is too clean for the problem. They notice when the model is confidently wrong in the first paragraph and the rest of the answer is just downstream of that.</p><p>They also use AI more aggressively than anyone, because they&#8217;re not afraid of it. They know what to throw out. They know what to keep.</p><p>The depth premium compounds. The deeper your model of the system, the faster you can reject AI output that doesn&#8217;t fit it. The faster you reject it, the more iterations you run. The more iterations you run, the more real value you extract. None of it works if there&#8217;s no model to start with.</p><p>For the engineer who never built that model, the loop runs in reverse. AI generates plausible-looking code. They can&#8217;t tell if it&#8217;s wrong. They ship it. It works in staging. It breaks in production. They ask the AI to fix it. The AI generates a plausible-looking patch. They ship that too. Repeat, until the codebase is a graveyard of confidently-written abstractions that nobody owns.</p><h2>The filter is selection, not extinction</h2><p>Hanson&#8217;s Great Filter is a probability barrier. The version running on engineering teams right now isn&#8217;t an extinction event. There won&#8217;t be a Tuesday when every shallow-knowledge engineer wakes up unemployed. The selection happens in the gap between two trajectories.</p><p>One: the engineer who treats AI as a force multiplier on depth they already have. They get faster. Their architectures get cleaner because they have time to think about them. Their reviews get sharper because the AI handles the boilerplate. Six months in, they&#8217;re shipping work that used to take a team of three.</p><p>The other: the engineer who treats AI as a substitute for the depth they don&#8217;t have. They also get faster. But their codebase accumulates hidden cost. Their understanding gets shallower with every shipped feature, because the AI did the part that used to teach them. Six months in, they&#8217;re producing more code than they can defend, in a stack they can&#8217;t fully reason about.</p><p>For a while, you can&#8217;t tell them apart. They&#8217;re both shipping. Their managers see green dashboards. The metrics look fine.</p><p>Then something breaks that requires real understanding to fix. And only one of them can fix it.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KSt6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KSt6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp 424w, https://substackcdn.com/image/fetch/$s_!KSt6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp 848w, https://substackcdn.com/image/fetch/$s_!KSt6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp 1272w, https://substackcdn.com/image/fetch/$s_!KSt6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KSt6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Two engineer trajectories using AI: identical output for six months, then divergence &#8212; one keeps climbing, one collapses.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Two engineer trajectories using AI: identical output for six months, then divergence &#8212; one keeps climbing, one collapses." title="Two engineer trajectories using AI: identical output for six months, then divergence &#8212; one keeps climbing, one collapses." srcset="https://substackcdn.com/image/fetch/$s_!KSt6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp 424w, https://substackcdn.com/image/fetch/$s_!KSt6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp 848w, https://substackcdn.com/image/fetch/$s_!KSt6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp 1272w, https://substackcdn.com/image/fetch/$s_!KSt6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a5d94e8-9ae6-45ed-ae9c-aedcc1260a05_4320x1812.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The engineers letting AI run unchecked aren&#8217;t getting filtered today. They&#8217;re being selected against. The kind of selection that doesn&#8217;t show up in this quarter&#8217;s numbers, and shows up in next year&#8217;s.</p><p>The Great Filter, locally, is the gap between depth and the appearance of depth. It&#8217;s been running the whole time. AI just turned up the speed.</p>]]></content:encoded></item><item><title><![CDATA[Experience Isn't the Tax. Identity Is.]]></title><description><![CDATA[Jaya Gupta's piece on AI rewiring decision-making is right about the diagnosis. It mis-attributes the variable.]]></description><link>https://joaofogoncalves.substack.com/p/2026-04-28-experience-isnt-the-tax-identity-is</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-04-28-experience-isnt-the-tax-identity-is</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XNna!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XNna!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XNna!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XNna!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XNna!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XNna!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XNna!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg" width="1168" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1168,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:300157,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/195733699?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XNna!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XNna!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XNna!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XNna!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8944c70-26b2-4bb4-a0d9-7e217174ebbe_1168x784.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>What Jaya got right</h2><p>There&#8217;s a piece going around called <a href="https://x.com/JayaGup10/status/2047508230813917600">&#8220;Experience is now a tax.&#8221;</a> It went up a couple of days ago and has been doing the rounds. <a href="https://x.com/JayaGup10">Jaya Gupta</a> wrote it. If you haven&#8217;t read it, the setup is this. Somewhere right now there&#8217;s a CIO at a Fortune 500 firm who has never opened Claude, can&#8217;t explain what a Claude skill is, and still asks his reports to print documents and leave them on his desk. He is the person making the decision about his firm&#8217;s AI ROI.</p><p>Meanwhile, a 22-year-old is writing production code in an afternoon and turning a napkin sketch into a working prototype before lunch.</p><p>These two people are having different experiences of the same technology, and the cultural conversation hasn&#8217;t caught up. The senior cohort defends its seat with two words: judgment and taste. Things AI cannot replicate. Things that take decades to develop. Things, conveniently, that the person making the argument has spent a career accumulating.</p><p>Jaya&#8217;s argument is that AI just collapsed the cost of three decision-making algorithms the brain runs constantly. <em>Trying something new versus sticking with what works</em> used to be expensive. <em>Carrying knowledge in your head versus offloading it</em> used to be the senior advantage. <em>Committing to a decision versus reversing it</em> used to be a one-way door. AI cheapened all three. The skill is no longer weighing every option before choosing. It&#8217;s choosing fast, learning fast, and not attaching your identity to the last version of yourself who made the previous choice.</p><p>She lands the punch on the third one. Senior people reverse slowly because they&#8217;ve spent careers learning that reversing is admitting they were wrong. Young people haven&#8217;t learned to attach identity to their decisions yet. Reversal feels like iteration to them. Her closer to young readers: if you can still think clearly without a filter, leave the environment that&#8217;s training you not to.</p><p>The diagnosis is right. I see it every week. Some of the smartest engineers I know are the slowest to ship because they&#8217;re protecting an old version of themselves who knew the answer before AI changed what knowing meant.</p><p>But the article mis-attributes the variable. The thing being taxed isn&#8217;t experience. It&#8217;s identity attachment to past decisions, and that&#8217;s a separate axis from age.</p><h2>The variable isn&#8217;t age</h2><p>Jaya names the right phenomenon, then attaches it to the wrong axis. She points at the senior cohort and says: this group has more reputation to defend, more decisions tied to their identity, so reversal is more expensive for them. All true. But she frames identity attachment as a natural byproduct of having been right in public for a long time.</p><p>It isn&#8217;t natural. It&#8217;s a choice, made compulsory by environment and habit.</p><p>Here is the steelman of Jaya&#8217;s position, and it survives most of the data. <em>On average</em> experience correlates with identity attachment because the longer you&#8217;ve been right in public, the more reputation you&#8217;ve put on the line. Most senior people are paying the tax. That&#8217;s true at the population level, and it&#8217;s the part of her argument that doesn&#8217;t go away.</p><p>The piece&#8217;s gap is conflating the average with the rule. Some senior operators figured out, somewhere along the way, that holding your previous self lightly is the only way to keep clarity past the age it&#8217;s supposed to expire. They aren&#8217;t outliers because they got lucky. They built environments around themselves, and habits inside themselves, where reversal stayed cheap. They&#8217;re the existence proof that the tax is a default, not a fate.</p><p>The 2026 adoption data is also messier than Jaya&#8217;s piece suggests. A poll of 4,000 US and UK workers found <a href="https://www.metaintro.com/blog/ai-adoption-gap-high-earners-workers-2026">senior staff adopting AI faster than junior peers</a>, not slower. Top earners have better access to paid tools, more dedicated training time, and more autonomy to experiment. By 2025, 73% of director-level workers had adopted AI, against 65% of individual contributors. Caveat the numbers honestly. &#8220;Adopted&#8221; is a low bar. The headline gap is single-digit. Among regular AI users only, 21% of leaders report extremely positive productivity impact against 13% of individual contributors, but that&#8217;s self-report inside an already-fluent population. None of these prove seniority dominance. What they show is that the binary &#8220;old people are slow, young people are fast&#8221; doesn&#8217;t hold cleanly even at the population level.</p><p>The decade of life isn&#8217;t doing the work. The decade of identity-protection is.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!StQ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!StQ4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp 424w, https://substackcdn.com/image/fetch/$s_!StQ4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp 848w, https://substackcdn.com/image/fetch/$s_!StQ4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp 1272w, https://substackcdn.com/image/fetch/$s_!StQ4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!StQ4!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Three groups, one missing axis&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Three groups, one missing axis" title="Three groups, one missing axis" srcset="https://substackcdn.com/image/fetch/$s_!StQ4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp 424w, https://substackcdn.com/image/fetch/$s_!StQ4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp 848w, https://substackcdn.com/image/fetch/$s_!StQ4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp 1272w, https://substackcdn.com/image/fetch/$s_!StQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7eb0d75e-71de-4e18-b841-c0d5f2af08ce_3840x2684.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>What the verification asymmetry looks like</h2><p>There is <a href="https://www.frontiersin.org/journals/psychology/articles/10.3389/fpsyg.2025.1699320/full">one finding</a> in the cognitive offloading research that matters here. When AI produces an output, you have to evaluate it. Hold the claims against what you know. Spot the hallucinations. Decide whether to revise or regenerate. That work is cognitively demanding. Experienced professionals catch errors faster because they have deep domain knowledge to compare against. Novices pay a verification tax that sometimes cancels out the efficiency gains.</p><p>In software this shows up cleanly. Junior engineers using Claude daily are shipping faster than they were a year ago. Some of the seniors using Claude daily are shipping faster than the juniors <em>and</em> catching a category of issues the juniors didn&#8217;t see was a category.</p><p>A specific example. Last month I watched a junior engineer prompt Claude to refactor a payment service. The output was clean, the tests passed, and the refactor did exactly what the prompt asked. A senior on the team noticed in about thirty seconds, in code review, that the new version had quietly removed a retry-on-rate-limit pattern that wasn&#8217;t covered by the test suite. The model had simplified the wrong thing. The junior&#8217;s verification was test-pass. The senior&#8217;s was twenty years of &#8220;what does this look like in production at 3am.&#8221; Both shipped. Only one would have caught it.</p><p>This is the asymmetry the binary obscures. AI fluency without a pattern library lets you ship things you can&#8217;t fully evaluate. A pattern library without AI fluency keeps you from shipping at all in the new medium.</p><p>It isn&#8217;t a moat in the durable sense. Tool fluency in 2026 won&#8217;t look like tool fluency in 2028, and anyone betting their career on &#8220;I&#8217;m fluent in Claude&#8221; is making the same mistake the CIO made one cycle earlier. What&#8217;s durable is the disposition that produced the fluency. The willingness to put hours into something you didn&#8217;t grow up with, learn it like a craft, and let your priors get tested by it instead of using them to deflect the test.</p><h2>What the discipline looks like in practice</h2><p>It isn&#8217;t judgment and taste. That phrase is exactly the defensive crouch Jaya named.</p><p>The patterns I see in operators who have un-taxed themselves:</p><p>They run their own experiments. They don&#8217;t delegate the prompt to a junior and review the output. They paste their own context, read their own raw output, fix their own broken prompts. They&#8217;ve put in the same kind of hours they put into mastering a previous craft.</p><p>They reverse without ego. The last decision is a hypothesis, not a stake. When the data comes back wrong, they don&#8217;t relitigate. They commit again.</p><p>They use AI to attack their own priors. Most people use the tool to confirm what they already think. The discipline is asking the tool for the strongest counter-argument to your position, the cleanest version of the case against, the data point that breaks the model. Adversarial use, on purpose.</p><p>They&#8217;ve stopped leading with &#8220;in my experience.&#8221; That phrase used to be a gear shift in a meeting. Now they treat it as a flag. They might still have the analogy. They might be right. But they&#8217;ve noticed that &#8220;in my experience&#8221; arriving early in a conversation often shuts the conversation down before anyone has tested whether the analogy actually fits this case.</p><p>They pattern-match live. Instead of pulling examples from memory, they pull them from a tool that has more examples and less ego. The senior person who used to win the room with &#8220;I&#8217;ve seen this before&#8221; now does that work in real time, with citations.</p><p>I run this loop at BRIDGE IN. Specifically: I open a task, write the spec myself, prompt Claude to find the worst implementation I&#8217;d still accept, then prompt it to defend the cleanest one, then argue with it. The thing that&#8217;s changed in the last year isn&#8217;t that I&#8217;m faster. It&#8217;s that the version of me who would have shipped the first plausible-looking design is gone. The tool replaced that version of me.</p><p>The discipline is identifiable by behavior, not by years on a CV.</p><h2>The thing being taxed</h2><p>The thing being taxed isn&#8217;t experience. It isn&#8217;t age. It&#8217;s the version of you that needs to be right.</p><p>The CIO isn&#8217;t slow because he&#8217;s old. He&#8217;s slow because he can&#8217;t afford to be visibly wrong. He spent thirty years building a self that was correct, and the cost of admitting that self is now operating in a medium it doesn&#8217;t understand is higher than the cost of pretending the medium doesn&#8217;t matter.</p><p>The 22-year-old isn&#8217;t fast because she&#8217;s young. She&#8217;s fast because her identity is in motion. Nothing she&#8217;s said publicly has the gravitational mass of three decades of correct calls. She can change her mind cheaply.</p><p>That&#8217;s the real variable. Not chronological age. Identity weight.</p><p>Some senior people have built careers without putting much weight on any single call. They reverse easily because they never made reversal the expensive thing. Some 22-year-olds are already attaching identity to their first big decision. You can see it in the way they double down on a take that didn&#8217;t land. The tax shows up in them too, just earlier.</p><p>This is reversible. Most people don&#8217;t reverse it. That&#8217;s the honest version of Jaya&#8217;s point. The base rate is real. The ones who do reverse it figured out, somewhere along the way, that holding your previous self lightly is the only way to keep clarity past the age it&#8217;s supposed to expire.</p><h2>The discipline of staying clear</h2><p>Jaya closes her piece with a message to young readers. If you can still think about a problem without first running every thought through &#8220;yes but what would my boss or the world say,&#8221; use that ability now. Use it while you have it. The window narrows faster than you think. If you&#8217;re in an environment that punishes the clarity you currently have, leave.</p><p>That&#8217;s true for the toxic environments. It isn&#8217;t the only move available, and it isn&#8217;t the deepest reading of her own argument.</p><p>Clarity isn&#8217;t an asset of being young. It&#8217;s a discipline.</p><p>Some 22-year-olds will lose it inside ten years if they let the next decade teach them that being right is a personality. Some 50-year-olds never lost it because they refused to learn that lesson. They built environments around themselves where reversal stayed cheap. They kept the tool they had at 22 and added thirty years of analogies to it.</p><p>The discipline is identifiable by behavior. Who&#8217;s running their own experiments. Who&#8217;s reversed publicly in the last quarter. Who&#8217;s using the tools in their actual workflow and not just their demo. That&#8217;s the question, for hiring, for learning, for staying sharp yourself.</p><p>Experience is only a tax if you treat it as a fixed asset. As a moving one, it compounds.</p>]]></content:encoded></item><item><title><![CDATA[AI Will Create More Jobs. Just Not For Everyone.]]></title><description><![CDATA[The paradox has two sides]]></description><link>https://joaofogoncalves.substack.com/p/2026-04-23-ai-will-create-more-jobs-just-not-for-everyone</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-04-23-ai-will-create-more-jobs-just-not-for-everyone</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J1qf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J1qf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J1qf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!J1qf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!J1qf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!J1qf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J1qf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp" width="1168" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1168,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J1qf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!J1qf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!J1qf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!J1qf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a975af-d547-4a97-9b71-3825c13819e2_1168x784.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>The paradox has two sides</h2><p>In January 2025, Satya Nadella <a href="https://x.com/satyanadella/status/1883753899255046301">posted</a> a link to the Wikipedia article on Jevons paradox. The timing was deliberate. DeepSeek had just released a model that made frontier AI cheaper overnight, and the market was wobbling. Nadella&#8217;s one-line commentary: &#8220;Jevons paradox strikes again! As AI gets more efficient and accessible, we will see its use skyrocket, turning it into a commodity we just can&#8217;t get enough of.&#8221;</p><p>He was right, at least on the aggregates. A year later, the data is lopsided in his favor. <a href="https://www.metaintro.com/blog/software-engineer-job-listings-spike-2026-ai-demand">Software-engineering openings at tech companies are up roughly 30% year-to-date in 2026</a> per TrueUp&#8217;s aggregator (tracking ~9,000 tech companies), even as broader tech postings remain well below their 2022 peak. <a href="https://www.pwc.com/gx/en/services/ai/ai-jobs-barometer.html">PwC&#8217;s 2025 Global AI Jobs Barometer</a> reports that productivity growth in AI-exposed industries has <a href="https://www.pwc.com/gx/en/news-room/press-releases/2025/ai-linked-to-a-fourfold-increase-in-productivity-growth.html">nearly quadrupled</a>, from 7% cumulative over 2018&#8211;2022 to 27% cumulative over 2018&#8211;2024. Revenue per employee in AI-exposed industries grew roughly three times faster than in least-exposed industries over the same window. The total labor pie is growing, and it&#8217;s growing fastest exactly where people predicted it would shrink.</p><p>This is the take that crushed on my LinkedIn last month. Cheaper software means more software. More software means more work. Nothing about it is false.</p><p>But pointing at the total and calling it good news hides what the totals are actually made of.</p><h2>Quick detour: what Jevons actually said</h2><p>In 1865, an economist named William Stanley Jevons noticed something counterintuitive about steam engines. They were getting dramatically more efficient. Each ton of coal produced more work than the year before. Everyone expected coal consumption to drop. Efficiency should save fuel.</p><p>It didn&#8217;t. Coal consumption went up.</p><p>The reason was straightforward once Jevons explained it. Cheaper energy opened uses that weren&#8217;t economical before. Factories expanded. New industries started. Railroads extended. The total demand for coal grew faster than efficiency reduced it.</p><p>That&#8217;s <a href="https://en.wikipedia.org/wiki/Jevons_paradox">the paradox</a>. When you make something more efficient, you don&#8217;t necessarily use less of it. You often use more of it, because cheaper access unlocks demand that was previously priced out.</p><p>It&#8217;s been applied to electricity, fuel economy, bandwidth, and now AI. The logic is the same every time: when the cost of a thing drops, demand for that thing tends to grow faster than the savings. The pie expands.</p><h2>The part everyone quotes</h2><p>If you read only the top-line numbers, Jevons looks airtight.</p><p>AI-related roles are up across the board, despite two years of tech-sector layoffs. PwC&#8217;s 2025 Barometer shows the AI wage premium doubling in a single year, from 25% in 2023 to 56% in 2024, meaning roles requiring AI skills now pay 56% more than otherwise comparable roles that don&#8217;t. The same barometer shows AI-exposed industries (not occupations) saw 16.7% wage growth over 2018&#8211;2024, revenue per employee growing three times faster than in least-exposed industries, and productivity growth nearly quadrupling as noted above. (One caveat worth naming: PwC classifies industries as &#8220;AI-exposed&#8221; via a task-composition proxy, not observed AI use. These are strong correlations, not causally identified effects.) Total coal consumption went up when steam engines got efficient, and total demand for software is doing the same thing.</p><p>The 2023 panic about AI replacing coders hasn&#8217;t played out, at least at the aggregate level. Claude Code ships code. Engineers ship more code. Companies ship more software. The market absorbs more software than it did last year. Nothing about the shape of the industry suggests contraction.</p><p><a href="https://www.mrphilgames.com/blog/jevons-paradox-software-development-ai-more-developers">Mr Phil Games wrote a piece</a> on exactly this called <em>Jevons&#8217; Paradox and AI: Why It Means More Developers, Not Fewer</em>. The argument is straightforward. Software was never a fixed pie. The cost of writing it dropped. The volume being written went up. The ceiling on useful software is much higher than we ever acknowledged, because the constraint was always the cost of building, not the demand for it.</p><p>This is correct. I&#8217;ve said it myself, in almost these exact words.</p><p>The trouble is that the same dataset tells a different story if you read it from the bottom up.</p><h2>The part nobody prices in</h2><p>The totals are growing. The composition isn&#8217;t. Three independent datasets tell the same story. Per <a href="https://www.hiringlab.org/2025/07/30/experience-requirements-have-tightened-amid-the-tech-hiring-freeze/">Indeed Hiring Lab</a>, entry-level tech postings in February 2025 were off 34% vs February 2020 while senior postings were off only 19%, and the share of tech postings requiring 5+ years of experience rose from 37% to 42% between Q2 2022 and Q2 2025. The Stanford Digital Economy Lab&#8217;s <a href="https://digitaleconomy.stanford.edu/publications/canaries-in-the-coal-mine/">&#8216;Canaries in the Coal Mine&#8217; paper</a> (Brynjolfsson, Chandar &amp; Chen, November 2025 revision, using ADP payroll data through September 2025) finds a 13% relative employment decline for workers aged 22&#8211;25 in the most AI-exposed occupations, with 22&#8211;25-year-old software developers specifically down roughly 20% from their late-2022 peak. The 35&#8211;49 cohort moved the other way: up about 9% over the same window. The Dallas Fed replicated the age-AI-exposure pattern in CPS data in January 2026. Same industry. Opposite directions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ukz0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ukz0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!Ukz0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!Ukz0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ukz0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ukz0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Senior cohort +9% vs entry cohort &#8722;6%. The middle is splitting in two.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Senior cohort +9% vs entry cohort &#8722;6%. The middle is splitting in two." title="Senior cohort +9% vs entry cohort &#8722;6%. The middle is splitting in two." srcset="https://substackcdn.com/image/fetch/$s_!Ukz0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!Ukz0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!Ukz0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ukz0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc764550c-04b4-4b22-af23-25dec7294d74_3200x1800.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That 56% wage premium for AI skills? It doubled in a single year. A 25-point gap became a 56-point gap. Two years before that, the category didn&#8217;t really exist. The financial reward for AI fluency isn&#8217;t leveling off. It&#8217;s accelerating.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vSU7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vSU7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp 424w, https://substackcdn.com/image/fetch/$s_!vSU7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp 848w, https://substackcdn.com/image/fetch/$s_!vSU7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp 1272w, https://substackcdn.com/image/fetch/$s_!vSU7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vSU7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp" width="1456" height="824" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:824,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AI-skill wage premium went from zero to 56% in two years&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI-skill wage premium went from zero to 56% in two years" title="AI-skill wage premium went from zero to 56% in two years" srcset="https://substackcdn.com/image/fetch/$s_!vSU7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp 424w, https://substackcdn.com/image/fetch/$s_!vSU7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp 848w, https://substackcdn.com/image/fetch/$s_!vSU7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp 1272w, https://substackcdn.com/image/fetch/$s_!vSU7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd63ee5-0fa7-4de8-8bea-d136accb965b_3200x1812.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>PwC&#8217;s data, read carefully, says the same thing in a less comfortable way. AI-exposed roles are growing revenue per employee 3x faster than non-exposed roles. That&#8217;s a widening gap between the boats that move and the boats that don&#8217;t.</p><p>The <a href="https://www.anthropic.com/research/economic-index-march-2026-report">Anthropic Economic Index from March 2026</a> adds a quieter datapoint. Roughly 49% of O*NET-defined jobs have had at least a quarter of their constituent tasks appear in Claude conversations at least once, with computer and math work the largest category. Anthropic&#8217;s separate &#8220;effective coverage&#8221; measure, which weights by success rate, is materially lower; the 49% is a high-water mark, not a measure of AI actually doing the job. The gap underneath is where the distribution is separating. The <a href="https://survey.stackoverflow.co/2025/ai">Stack Overflow 2025 Developer Survey</a> shows the same gap from a different angle: developer AI usage hit 84% (up 14 points year over year), but trust in AI output landed at just 33&#8211;54% depending on task type. Adoption is wide. Mastery is narrow.</p><p>The pie is growing. The line at the door is getting longer.</p><h2>Why both things are true</h2><p>Both readings are correct. They aren&#8217;t describing different economies. They&#8217;re describing different halves of the same one.</p><p>Jevons says: when a thing gets cheaper, more of it gets made. Software gets cheaper, more software gets made, more people get hired to make it. That&#8217;s the first-order effect and it&#8217;s real.</p><p>The second-order effect is the one nobody quotes. When the marginal cost of adequate output drops to near zero, the new demand skips past adequate entirely and lands on work that requires something adequate can&#8217;t deliver. Leverage. Judgment. Taste. The ability to orchestrate five agents toward one outcome. The ability to decide what&#8217;s worth building in the first place.</p><p>The sharper way to put it: the person doing adequate work at adequate speed is in trouble, because adequate is now free.</p><p>The middle of the skill distribution isn&#8217;t being squeezed by less work. It&#8217;s being squeezed by work it can&#8217;t do. Jevons creates the demand. Adequate-is-free determines who that demand reaches.</p><p>The shape of that squeeze is already visible in team-level telemetry. <a href="https://www.faros.ai/">Faros AI&#8217;s 2026 report</a> on roughly 22,000 engineers using AI-assisted tools found per-developer pull requests merged up 98% and epics per developer up 66%, while team-level PR review time jumped 441% and incidents per pull request jumped 243%. The bottleneck moved off typing. It moved onto review, triage, and judgment. Jevons delivered the volume; the volume is what needs to be judged.</p><p>Both things are true. They just measure different parts of the same shift.</p><h2>Who gets the new jobs</h2><p>There are two doors. Most people who will thrive in the next five years walk through both. Almost everyone who doesn&#8217;t will be locked out by one.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GNY_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GNY_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp 424w, https://substackcdn.com/image/fetch/$s_!GNY_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp 848w, https://substackcdn.com/image/fetch/$s_!GNY_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp 1272w, https://substackcdn.com/image/fetch/$s_!GNY_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GNY_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp" width="1456" height="1146" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1146,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Two doors to the new work: leverage and judgment&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Two doors to the new work: leverage and judgment" title="Two doors to the new work: leverage and judgment" srcset="https://substackcdn.com/image/fetch/$s_!GNY_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp 424w, https://substackcdn.com/image/fetch/$s_!GNY_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp 848w, https://substackcdn.com/image/fetch/$s_!GNY_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp 1272w, https://substackcdn.com/image/fetch/$s_!GNY_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31a48b38-2410-4fbc-a267-3db69da27e16_2160x1700.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first door is leverage. Can you produce the work of five people with a harness of agents? A senior backend engineer I work with ships three features in the time her team used to ship one, because she runs Claude agents in parallel on the review, the migration, and the documentation pass. Her day-to-day isn&#8217;t typing. It&#8217;s queuing, checking, correcting. The engineers whose postings are up are the ones building that kind of harness on themselves.</p><p>Leverage isn&#8217;t free on day one, and it isn&#8217;t automatic. The <a href="https://www.hbs.edu/faculty/Pages/item.aspx?num=64700">Harvard/BCG/Wharton &#8220;Jagged Frontier&#8221; study</a> found that consultants using GPT-4 on tasks inside the model&#8217;s capability frontier produced roughly 40% higher quality output and finished about 25% faster. The same consultants on tasks just outside that frontier performed measurably <em>worse</em> than a control group without AI. Leverage looks like picking the right tasks to delegate, not delegating everything. <a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">METR&#8217;s 2025 study</a> of sixteen experienced open-source developers working on their own repos found something uncomfortable along the same lines: when early-2025 AI coding tools were allowed, those devs took 19% longer to complete real tasks than when they weren&#8217;t, with the 95% confidence interval for the slowdown landing between +2% and +39%. They felt 20% faster. They were 19% slower. Brownfield code on a repo you already know is the hardest test for AI, exactly the case where the frontier is narrowest. METR&#8217;s own <a href="https://metr.org/blog/2026-02-24-uplift-update/">February 2026 update</a>, titled &#8220;We are Changing our Developer Productivity Experiment Design,&#8221; reports preliminary signs of speedup with newer tools (returning-cohort devs &#8722;18%, newly-recruited &#8722;4%) but labels those findings &#8220;only very weak evidence&#8221; and is redesigning the study around severe selection effects. The 19%-slower headline for early-2025 tools still stands. Whether it generalizes to current tools is an open empirical question. The <a href="https://hai.stanford.edu/ai-index/2026-ai-index-report">Stanford AI Index 2026</a>, released earlier this month, lands in roughly the same place: controlled studies show 14&#8211;26% productivity gains for software engineering with current-generation AI, but gains turn &#8220;smaller or negative for judgment-heavy tasks.&#8221; Both readings agree on the shape. The tool gives you leverage where the frontier is broad and costs you time where it isn&#8217;t. The leverage door doesn&#8217;t open by installing Copilot. It opens after the dip, for the people who pushed through the first painful months when every prompt felt slower than just typing the code. Most people never clear the dip. The ones who do are the ones getting paid 56% more.</p><p>The second door is judgment. When adequate code is free, the bottleneck moves to deciding what to build, what to kill, what good looks like. Product teams that used to draft one spec a week now see ten variants before lunch. The PM&#8217;s value is no longer writing the spec. It&#8217;s triaging the ten. Most PMs don&#8217;t yet have the muscle for that kind of picking. The ones who do are about to get paid for it.</p><p>Adopters get both doors. Non-adopters get neither. The people in the middle, doing careful, correct, adequate work at a pace that used to be valuable, are discovering that neither door opens for them anymore.</p><h2>But isn&#8217;t this just reskilling panic?</h2><p>The skeptical reader&#8217;s objection writes itself. Every general-purpose technology produced this same narrative. Electricity was going to end factory labor. The PC was going to kill middle management. The internet was going to kill retail. The labor share didn&#8217;t collapse. People upskilled. New roles appeared. The economy absorbed the change.</p><p>It&#8217;s a fair objection. It may still be right.</p><p>But two things make this wave harder to pattern-match to the prior ones.</p><p>First, the adequate-is-free dynamic is categorically different. In past waves, a technology made a narrow skill obsolete: a specific typewriting task, a specific filing job. The worker&#8217;s broader capability still had a market. AI collapses &#8220;producing adequate output at adequate speed&#8221; as a general category. That&#8217;s a much wider zone of the distribution to reroute.</p><p>Second, the pipeline problem. If the first rung of engineering, writing mediocre code under supervision for four years, is the rung vanishing, how does the industry make senior engineers in 2030? The seniors using AI for leverage today didn&#8217;t train under AI supervision. The next cohort will. What they turn into is not obvious, and nobody is running the experiment deliberately.</p><p>The people betting on historical adaptation aren&#8217;t wrong. They&#8217;re betting on a pattern that may hold. But prior adaptation windows were measured in decades, not quarters. The best-studied general-purpose-technology parallel, the personal computer, famously took five to fifteen years to show up in aggregate productivity statistics at all. Paul David&#8217;s 1990 paper &#8220;The Dynamo and the Computer&#8221; named this the Solow productivity paradox, and Brynjolfsson and Hitt&#8217;s 2003 follow-up on IT and firm-level productivity showed the full diffusion curve playing out over a decade and a half. AI diffusion is running on a different clock. The Anthropic Economic Index alone recorded task coverage of O*NET jobs jumping from 36% in February 2025 to 49% in February 2026. Thirteen points in ten months. If adaptation is happening, it&#8217;s happening at a pace that leaves most of the workforce behind it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!twwP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!twwP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!twwP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!twwP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!twwP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!twwP!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp" width="1200" height="675" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;PC era: 5&#8211;15 years for IT productivity to show up in statistics. AI era: 10 months for Anthropic's task coverage to move 36% &#8594; 49%.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="PC era: 5&#8211;15 years for IT productivity to show up in statistics. AI era: 10 months for Anthropic's task coverage to move 36% &#8594; 49%." title="PC era: 5&#8211;15 years for IT productivity to show up in statistics. AI era: 10 months for Anthropic's task coverage to move 36% &#8594; 49%." srcset="https://substackcdn.com/image/fetch/$s_!twwP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!twwP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!twwP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!twwP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe10aaa07-955d-4bbc-922b-fb5de42f6d8c_3200x1800.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>But doesn&#8217;t AI code rot?</h2><p>The second predictable objection, and a harder one, is about quality. If adequate is free, the argument goes, what actually shows up in the repos isn&#8217;t software. It&#8217;s a pile of plausible-looking code with a time bomb on it. The 10&#215; output has a 10&#215; maintenance tail. The wage premium is paying for a mess the industry will spend a decade cleaning up.</p><p>The numbers behind the critique are not nothing. <a href="https://www.gitclear.com/ai_assistant_code_quality_2025_research">GitClear&#8217;s 2025 research</a> on millions of pull requests found copy-pasted code now exceeds refactored code for the first time since they started measuring, code clones grew roughly 4&#215; in the two years after AI coding assistants went mainstream, and bugs-per-developer ticked up 54% on high-AI teams. <a href="https://www.scientificamerican.com/article/why-developers-using-ai-are-working-longer-hours/">Scientific American</a>, summarizing Berkeley Haas research from early 2026, found AI-assisted developers shipping more tasks per week but also logging longer hours and more out-of-hours fixes. The METR numbers above are part of the same picture: the <em>feeling</em> of speed outruns the <em>measure</em> of speed by a wide margin, and nobody notices until they audit their own calendar.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6x_o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6x_o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!6x_o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!6x_o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!6x_o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6x_o!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp" width="1200" height="675" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;4&#215; growth in code clones and 54% more bugs per developer on high-AI teams (GitClear 2025)&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="4&#215; growth in code clones and 54% more bugs per developer on high-AI teams (GitClear 2025)" title="4&#215; growth in code clones and 54% more bugs per developer on high-AI teams (GitClear 2025)" srcset="https://substackcdn.com/image/fetch/$s_!6x_o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp 424w, https://substackcdn.com/image/fetch/$s_!6x_o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp 848w, https://substackcdn.com/image/fetch/$s_!6x_o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp 1272w, https://substackcdn.com/image/fetch/$s_!6x_o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F814f8b27-e068-4fa4-a885-d72cde7459b2_3200x1800.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Name these critiques properly. The first is the <strong>technical debt bomb</strong>: AI produces more surface area to break. The second is the <strong>productivity illusion</strong>: we are measurably slower at the exact moment we feel fastest. The third is the <strong>senior pipeline collapse</strong>: if the junior rung is vanishing (entry-level tech postings down 34% from 2020), where do the seniors of 2032 come from?</p><p>Every one of these is real. None of them invalidates the Jevons reading.</p><p>The maintenance tail on an adequate-code flood is not a reason to expect <em>fewer</em> jobs. It&#8217;s a reason to expect <em>different</em> jobs, concentrated in exactly the slots described above. More code written by agents means more code to review, more conflicting patterns to reconcile, more decisions about what to keep and what to delete, more senior judgment about which auto-generated migration will explode on Monday and which one is safe. The quality debt is the thesis stated from the other side of the ledger. Adequate output is cheap. Editing, triaging, orchestrating, and deciding are what everyone is about to discover they actually needed seniors for in the first place.</p><p>The senior pipeline argument is the one worth sitting with the longest. It&#8217;s the only one that doesn&#8217;t resolve neatly. If the junior rung of the ladder was always <em>write mediocre code under supervision for four years and absorb taste by osmosis</em>, and the junior rung is vanishing, it is genuinely unclear how the next cohort of seniors gets made. The optimistic answer &#8212; <em>juniors skip straight to orchestrating agents and pick up taste faster because the iteration loop is tighter</em> &#8212; is plausible and being run as a live experiment by approximately zero organizations on purpose. The pessimistic answer &#8212; <em>the industry is eating its seed corn and won&#8217;t know it until 2030</em> &#8212; is also plausible. Nobody has the data yet.</p><p>What we can say: the short-run effect is unambiguously pro-senior, and that effect gets <em>stronger</em> the worse the quality of AI-generated code actually is. The critics and I are looking at the same data. We just draw opposite arrows from it. They say the flood of adequate code is a bug in the Jevons argument. I&#8217;d say it&#8217;s the engine.</p><h2>Why this is hard to hear</h2><p>The obvious response to all this is: fine, tell people to adopt. Run the training. Hand out Copilot licenses. Mandate the tools.</p><p>It doesn&#8217;t work that way. I wrote about this in an earlier piece, <em><a href="/articles/2026/03/2026-03-26-pain-gets-you-in-the-door/">Pain Gets You In The Door. Curiosity Builds Everything Else</a></em>. The research on AI adoption is consistent and uncomfortable. Mandate-driven adoption crowds out intrinsic motivation. The people who adopt because they&#8217;re told to don&#8217;t build the deep fluency that adopters-by-curiosity do. <a href="https://link.springer.com/journal/10639">Luo, Zhou &amp; Cui (2026)</a> in <em>Education and Information Technologies</em> find perceived enjoyment (the intrinsic-motivation variable in a standard UTAUT model) the strongest predictor of generative AI adoption, ahead of performance expectancy, effort expectancy, and facilitating conditions. <a href="https://www.sciencedirect.com/journal/computers-and-education-artificial-intelligence">Lai, Cheung &amp; Chan (2023)</a> in <em>Computers &amp; Education: AI</em> found the same pattern against Technology Acceptance Model variables. Across the literature, intrinsic motivation is among the strongest predictors of creative and frequent use. Ahead of training. Ahead of org support.</p><p>The pattern isn&#8217;t that mandates never work. IBM&#8217;s AskHR reportedly automated &#8220;a couple hundred&#8221; HR roles while IBM&#8217;s net headcount grew elsewhere (Arvind Krishna, <em>WSJ</em>, May 2025). The failure mode is narrower: mandates without curiosity tend to produce shallow users, not the fluent orchestrators leverage rewards.</p><p>The workers most exposed to the adequate-is-free shift are also the ones most likely to get the framing that guarantees they won&#8217;t close the gap. &#8220;Just use AI.&#8221; &#8220;Upskill.&#8221; &#8220;Get with the program.&#8221; These are the phrases of the adoption pattern that doesn&#8217;t stick.</p><p>If you&#8217;re waiting for your company to pull you through this shift, your company is statistically the worst-positioned actor to do it.</p><h2>The paradox has a door policy</h2><p>Jevons is real. AI will create more jobs. That was never the question.</p><p>The question was who gets to do them.</p><p>The top-line data says the pie is growing. The bottom-line data says the growth is concentrated above adequate. Both halves of the story are true. Nadella was right about Jevons. The adequate-is-free framing is the other half. The engineers shipping 10x with Claude Code and the designers watching their adequate-tier competitors get priced to nothing are living in the same economy, describing the same shift from different sides of the door.</p><p>If you&#8217;re already through both doors, leverage and judgment, the next five years are the best window you&#8217;ll see in your career.</p><p>If you&#8217;re not through yet, the move isn&#8217;t to wait for your company to train you. It&#8217;s to build leverage on your own time this week. Pick one task in your job that today takes you four hours. Rewire it so an agent does the first pass and you do the judgment pass. Ship it. Do the same thing next week with a different task.</p><p>The door is still open. It&#8217;s just getting stricter every quarter.</p><div><hr></div><h2>Sources &amp; further reading</h2><p><strong>Jevons &amp; aggregate demand</strong></p><ul><li><p><a href="https://www.pwc.com/gx/en/services/ai/ai-jobs-barometer.html">PwC 2025 Global AI Jobs Barometer</a> - wage premium, productivity growth, revenue-per-employee ratios at industry level</p></li><li><p><a href="https://www.pwc.com/gx/en/news-room/press-releases/2025/ai-linked-to-a-fourfold-increase-in-productivity-growth.html">PwC press release: AI linked to fourfold productivity growth</a> - the 7% &#8594; 27% productivity-growth-rate figure</p></li><li><p><a href="https://www.anthropic.com/research/economic-index-march-2026-report">Anthropic Economic Index, March 2026</a> - O*NET task coverage across occupations (49% of jobs at &#8805;25% tasks)</p></li><li><p><a href="https://hai.stanford.edu/ai-index/2026-ai-index-report">Stanford AI Index 2026</a> - 14&#8211;26% productivity gains for software engineering with current-generation AI</p></li><li><p><a href="https://www.mrphilgames.com/blog/jevons-paradox-software-development-ai-more-developers">Mr Phil Games, &#8220;Jevons&#8217; Paradox and AI&#8221;</a> - a clean statement of the optimistic case</p></li><li><p><a href="https://x.com/satyanadella/status/1883753899255046301">Satya Nadella on Jevons, January 2025</a> - the post that started the cycle</p></li></ul><p><strong>Labor composition</strong></p><ul><li><p><a href="https://digitaleconomy.stanford.edu/publications/canaries-in-the-coal-mine/">Brynjolfsson, Chandar &amp; Chen, &#8220;Canaries in the Coal Mine&#8221; (Stanford Digital Economy Lab, Nov 2025 revision)</a> - 13% relative employment decline for workers 22&#8211;25 in most AI-exposed occupations (ADP payroll data through Sept 2025)</p></li><li><p><a href="https://www.hiringlab.org/2025/07/30/experience-requirements-have-tightened-amid-the-tech-hiring-freeze/">Indeed Hiring Lab: experience requirements have tightened</a> - 5+ years experience requirement rose 37% &#8594; 42% Q2 2022 to Q2 2025</p></li><li><p><a href="https://survey.stackoverflow.co/2025/ai">Stack Overflow 2025 Developer Survey (AI section)</a> - 84% adoption, 33&#8211;54% trust</p></li><li><p><a href="https://www.metaintro.com/blog/software-engineer-job-listings-spike-2026-ai-demand">TrueUp via metaintro: engineering listings up ~30%</a> - narrow tech-aggregator scope (~9,000 tech companies)</p></li></ul><p><strong>Productivity &amp; quality evidence</strong></p><ul><li><p><a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">METR, July 2025</a> - RCT on sixteen experienced OSS developers, 19% slowdown, 95% CI +2% to +39%</p></li><li><p><a href="https://metr.org/blog/2026-02-24-uplift-update/">METR, February 2026 experiment redesign</a> - preliminary speedup labeled &#8220;only very weak evidence&#8221; with severe selection effects</p></li><li><p><a href="https://www.faros.ai/">Faros AI 2026 telemetry report</a> - 22,000 engineers: PRs merged +98%, review time +441%, incidents per PR +243%</p></li><li><p><a href="https://www.gitclear.com/ai_assistant_code_quality_2025_research">GitClear 2025 code quality research</a> - 4&#215; code clone growth, +54% bugs per developer on high-AI teams</p></li><li><p><a href="https://www.scientificamerican.com/article/why-developers-using-ai-are-working-longer-hours/">Scientific American, March 2026</a> - Berkeley Haas on longer hours for AI adopters</p></li><li><p><a href="https://www.hbs.edu/faculty/Pages/item.aspx?num=64700">Dell&#8217;Acqua et al., &#8220;Navigating the Jagged Frontier&#8221;</a> - Harvard/BCG/Wharton GPT-4 consulting study</p></li></ul><p><strong>Historical parallel</strong></p><ul><li><p>Paul David (1990), &#8220;The Dynamo and the Computer: An Historical Perspective on the Modern Productivity Paradox,&#8221; <em>AEA Papers and Proceedings</em> - origin of the Solow productivity paradox framing</p></li><li><p>Brynjolfsson &amp; Hitt (2003), &#8220;Computing Productivity: Firm-Level Evidence,&#8221; <em>Review of Economics and Statistics</em> - 5&#8211;15 year IT productivity diffusion lag</p></li></ul><p><strong>Adoption psychology</strong></p><ul><li><p>Luo, Zhou &amp; Cui (2026), <em>Education and Information Technologies</em> - perceived enjoyment strongest UTAUT predictor of generative AI adoption</p></li><li><p>Lai, Cheung &amp; Chan (2023), <em>Computers &amp; Education: AI</em> - intrinsic motivation vs TAM variables, same pattern</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Your 'AI-First' Engineering Org Probably Isn't]]></title><description><![CDATA[Bolting AI onto your workflow isn't AI-first. Here's what is.]]></description><link>https://joaofogoncalves.substack.com/p/2026-04-18-your-ai-first-engineering-org-probably-isnt</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-04-18-your-ai-first-engineering-org-probably-isnt</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/47ed8c57-03ce-4a3f-b714-4339185a7a55_1168x784.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3v1z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3v1z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!3v1z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!3v1z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!3v1z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3v1z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp" width="1168" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1168,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122724,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650534?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3v1z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!3v1z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!3v1z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!3v1z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc469110a-1f75-4a41-a6e0-b5229f09f190_1168x784.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Most of the production code merged at BRIDGE IN this quarter was written by AI. I opened a bug against our onboarding emails yesterday morning. Diagnosis, fix, regression test, PR, CI, merge: done before my second coffee. Three months ago that loop was a sprint.</p><p>We didn&#8217;t get here by adding AI to our editors. We took the engineering process apart and rebuilt it around agents. We changed how we plan, how we implement, how we review, how we ship. We changed the shape of the team.</p><p>Three engineers, one monorepo, roughly fifteen specialized AI agents threaded through every phase of the workflow. I started the team earlier this year, and a couple of months in, I restructured the entire build-and-review flow around the assumption that agents do the keystrokes and people do the judgment.</p><p>One note before the rest. BRIDGE IN isn&#8217;t public yet. The numbers here are build velocity, not customer-shipping velocity. Whether the product lands with users is a bet still in flight. What the harness has already done is collapse the time between a decision and code that reflects it. At our size and runway, that is what decides whether we launch this year or next.</p><p>OpenAI published a concept earlier this year that captured what we&#8217;d been doing. They called it harness engineering: the primary job of an engineering team is no longer writing code. It is enabling agents to do useful work. When something fails, the fix is never &#8220;try harder.&#8221; The fix is: what capability is missing, and how do we make it legible and enforceable for the agent?</p><p>We&#8217;d been doing that for months before it had a name.</p><h2>AI-First Is Not the Same as Using AI</h2><p>Most teams bolt AI onto their existing process. An engineer opens Cursor. A PM drafts a spec with ChatGPT. A tester experiments with AI-generated test cases. The workflow stays the same. Efficiency goes up ten to twenty percent. Nothing structurally changes.</p><p>That is AI-assisted.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_El6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_El6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp 424w, https://substackcdn.com/image/fetch/$s_!_El6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp 848w, https://substackcdn.com/image/fetch/$s_!_El6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp 1272w, https://substackcdn.com/image/fetch/$s_!_El6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_El6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp" width="1456" height="1115" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1115,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:123828,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650534?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_El6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp 424w, https://substackcdn.com/image/fetch/$s_!_El6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp 848w, https://substackcdn.com/image/fetch/$s_!_El6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp 1272w, https://substackcdn.com/image/fetch/$s_!_El6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b070ff2-c37b-44a9-a408-b9d7db622099_2160x1654.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>AI-first means you redesign your process, your architecture, and your team around the assumption that AI is the primary builder. You stop asking &#8220;how can AI help our engineers?&#8221; and start asking &#8220;how do we restructure the work so AI does the building, and engineers provide direction, judgment, and review?&#8221;</p><p>The difference is multiplicative.</p><p>I see teams claim AI-first while running the same sprint cycles, the same planning meetings, the same manual code reviews, the same weekly status calls. They added AI to the loop. They didn&#8217;t redesign the loop.</p><p>A common version of this is what people call vibe coding. Open the editor, prompt until something works, commit, repeat. That produces prototypes. A production system has to be stable, reliable, secure, maintainable. You need a system that guarantees those properties when AI writes the code. You build the system. The prompts are disposable. The harness is the asset.</p><h2>Why We Had to Change</h2><p>When I took over, I watched how the team worked and saw three bottlenecks that would have killed us.</p><p><strong>The spec bottleneck.</strong> Planning a feature took a week. Writing it took two hours. When build time collapses from weeks to hours, a multi-day planning cycle becomes the constraint. It doesn&#8217;t make sense to think about something for a week and then build it before lunch. Product thinking had to move at the speed of iteration or step out of the build cycle.</p><p><strong>The review bottleneck.</strong> Agents can open a pull request faster than a human can meaningfully read one. If an engineer ships a feature in a morning, hand-review by three people becomes the new wait state. Either you compress review (dangerous) or you automate part of it alongside human judgment (harder, but survivable).</p><p><strong>The headcount bottleneck.</strong> Competitors in our space run engineering teams many times larger than ours. We couldn&#8217;t hire our way to parity. We could, maybe, redesign our way there.</p><p>Three things needed to operate at agent speed: design, implementation, and review. If any one of them stayed manual, it would constrain the whole pipeline.</p><h2>The Bold Decision: One Repo, Legible Everywhere</h2><p>I fixed the codebase first.</p><p>BRIDGE IN&#8217;s product lives as a single monorepo: backend, frontend, infrastructure, design system, docs, scripts, agent definitions. A human engineer can touch everything in one session. But the real customer of this shape is the agent.</p><p>A fragmented codebase is invisible to an AI agent. A unified one is legible. The more of the system you pull into a form the agent can inspect, validate, and modify, the more leverage you get. One repo. One test matrix. One typed contract between backend and frontend, regenerated from the OpenAPI schema with a single command. One set of CLAUDE.md files that codify, at every level, what &#8220;good&#8221; looks like.</p><p>I spent weeks designing the harness: the agent roster, the skills, the CI gates, the pre-commit hooks, the project board automations, the integrations into our existing observability and chat tools. Then I started asking the agents to rebuild the parts of the harness themselves.</p><p>BRIDGE IN is building an operations platform. We use our own harness to build the platform that will run the operations.</p><h2>The Shape of the Harness</h2><p>The details of the stack matter less than the shape. A few principles hold it together.</p><p>One monorepo. Backend, frontend, infrastructure, design system, docs, agent definitions, all in one place. Types regenerate from backend to frontend with a single command, so the contract between them is enforced, not documented.</p><p>One CI pipeline. Every PR runs the same gates: format, lint, types, migration checks, tests, coverage floor. No optional phases. No manual overrides. Deterministic, so agents can predict outcomes and reason about failures.</p><p>A roster of specialized agents, each with a narrow remit, each constrained by what it is <em>not</em> allowed to do. The architect cannot write code. The project manager cannot implement. Boundaries come from prohibitions, not instructions.</p><p>Skills that compose agents into workflows (feature delivery, bug triage, CI repair, dependency PRs) so that an engineer tagging an issue kicks off a sequence of planning, implementation, testing, and review without manual orchestration.</p><p>Pre-commit hooks and branch protection as the last line of defense. Nothing lands on master without a human reviewer and CI both agreeing.</p><p>The shape is what matters: one repo, one pipeline, specialized agents, composable skills, enforced gates. How an issue moves through that shape (who plans, who implements, what happens when CI fails) is a longer story I&#8217;ll tell separately.</p><h2>The Results</h2><p>Metric Before After Code written by AI Minority Majority Time from issue to merged PR Days to weeks Hours PRs merged per week A handful 20+ Dependency updates processed Manual, backlogged Automated, green on merge Human time spent on CI failures Hours Minutes</p><p>Over a recent two-week stretch we merged more than a hundred pull requests. A year ago that pace would have been physically impossible.</p><p>People assume you trade quality for speed. We didn&#8217;t. We ship more tests than we used to. We catch more regressions before they hit production. We have stricter lint, type, and coverage gates than before. The feedback loop is tighter. You learn more when you ship daily than when you ship monthly.</p><h2>The New Engineering Org</h2><p>Two kinds of engineers will exist.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P1gE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P1gE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!P1gE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!P1gE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!P1gE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P1gE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp" width="1168" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1168,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128250,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650534?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P1gE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!P1gE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!P1gE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!P1gE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45f56ca4-99c5-44d1-a088-88b8a8e43e71_1168x784.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The Architect. One or two people. They design the standard operating procedures that teach AI how to work. They build the testing harness, the review skills, the triage flows, the CLAUDE.md files. They define what &#8220;good&#8221; looks like for the agents.</p><p>This role requires deep critical thinking. You criticize the AI. You don&#8217;t follow it. When an agent proposes a plan, the architect finds the holes. What failure mode did it miss? What security boundary did it cross? What technical debt is it quietly accumulating?</p><p>The ability to criticize AI is more valuable than the ability to produce code. Producing code is the commodity. Critical judgment is the scarce skill.</p><p>This is also the hardest role to fill.</p><p>The Operator. Everyone else. The work still matters. The structure is different. The triage system finds a bug, surfaces the diagnosis, assigns it to the right person. The person investigates, validates, directs the agent, approves the fix. AI opens the PR. The human reviews whether there is risk. The work is bug investigation, UI refinement, accessibility fixes, PR review, verification. It requires skill and attention. It does not require the architectural reasoning the old model demanded every day.</p><p>I haven&#8217;t written a line of production Python by hand in weeks. I spend my time building the harness, reviewing what agents produce, and deciding what we build next.</p><h2>Who Adapts Fastest</h2><p>I noticed a pattern I didn&#8217;t expect. Junior engineers adapted faster than senior engineers.</p><p>Junior engineers with less traditional practice felt empowered. They had access to tools that amplified their impact. They didn&#8217;t carry a decade of habits to unlearn. They treated the agent as a collaborator they had to manage, not a tool that had to prove itself.</p><p>Senior engineers with strong traditional practice had the hardest time. Two months of their best work could collapse into an hour of agent output. That is a hard thing to accept after years of building a rare skill set.</p><p>Both things are probably true. Accumulated skill still matters. You cannot criticize what an agent produces without understanding what it produces. But in this transition, adaptability matters more than the skill you accumulated before it started.</p><h2>The Human Side</h2><p>I won&#8217;t pretend this was smooth.</p><p>Management flattened. A few months ago, a third of my time was in alignment meetings. Discussing trade-offs. Debating priorities. Disagreeing about technical decisions. Those conversations are necessary in a traditional model. They are also draining.</p><p>Today I still talk to my team. We talk about other things. Design. Product direction. What the agents keep getting wrong. Why a junior engineer shipped three features before the senior finished reading the plan. We get along better because we stopped arguing about work that can be resolved by running a skill.</p><p>Uncertainty is real. When I stopped doing line-by-line review every day, some people felt uncertain. What does the lead engineer not reviewing my code mean? What is my value in this new world? Reasonable concerns. I don&#8217;t have a clean answer for them. The transition creates anxiety.</p><p>The one principle I hold: we don&#8217;t fire an engineer because they introduced a production bug. We improve the review process. The same applies to AI. When an agent makes a mistake, we build better validation, clearer constraints, stronger observability. The mistake is a signal about the harness, not a verdict on the agent.</p><p>Relationships got better, not worse. Less arguing about trade-offs that the system can resolve. More conversation about what matters.</p><h2>Beyond Engineering</h2><p>I see teams adopt AI-first engineering and leave everything else manual.</p><p>If engineering ships features in hours but marketing takes a week to announce them, marketing is the bottleneck. If the product team still runs a monthly planning cycle, planning is the bottleneck. If one function operates at agent speed and another at human speed, the human-speed function constrains everything.</p><p>Our weekly engineering reviews are AI-generated from repo activity, error data, and team chat. Release notes draft themselves from merged PR titles. Analytics summaries surface the same day the data does. The goal is simple: every function runs on the same kind of harness the engineers run on, or it becomes the new bottleneck.</p><p>Engineering was the first domino. It is not the last one.</p><h2>Three Things That Hold</h2><p>Three principles have survived every iteration of the harness.</p><p><strong>Velocity is capped by the slowest function.</strong> Once engineering ships in hours, anything still operating in days becomes the constraint. Speed is a pipeline property, not an engineering one.</p><p><strong>Re-engineer, don&#8217;t bolt on.</strong> Adding AI to your existing process gets you ten or twenty percent. Redesigning the process around AI is multiplicative. The difference is whether you touched the shape of the work.</p><p><strong>Adaptability beats accumulated skill.</strong> The engineers adapting fastest are not the ones with the deepest traditional practice. They are the ones willing to let the agent do the keystrokes and redirect their judgment elsewhere.</p><h2>What This Means</h2><p>For engineers. Your value is moving from code output to decision quality. The ability to write code fast is worth less every month. The ability to evaluate, criticize, and direct is worth more. Product taste matters. Can you look at a generated UI and know it is wrong before the user tells you? Can you look at an architecture proposal and see the failure mode the agent missed? Those skills compound.</p><p>For engineering leaders. If your planning cycle takes longer than your build time, that is the first thing to fix. Build the testing and review harness before you scale agents. Fast AI without fast validation is fast-moving technical debt. Start with one architect: one person who builds the system and proves it works. Onboard others into operator roles after the system is running. Push AI-native into every function. Expect resistance.</p><p>For the industry. OpenAI, Anthropic, and multiple independent teams have converged on the same principles: structured context, specialized agents, persistent memory, execution loops, hard gates. Harness engineering is becoming a standard. Model capability is the clock driving this. Most of what works at BRIDGE IN today was not possible six months ago. The next generation of models will push it further.</p><h2>We&#8217;re Early</h2><p>Most engineering leaders I talk to still operate the traditional way. Some are thinking about making the shift. Very few have actually done it.</p><p>The tools exist. Nothing in our stack is proprietary. The competitive advantage is the decision to redesign everything around the tools, and the willingness to absorb the cost. The cost is real: uncertainty among engineers, a lead spending more time building systems than managing people, senior engineers questioning their value, a stretch where the old system is gone and the new one is not yet proven.</p><p>We absorbed the cost. The pipeline speaks for itself.</p><p>We&#8217;re building an operations platform. We&#8217;re running our own operation like one.</p>]]></content:encoded></item><item><title><![CDATA[Two Months Later, My AI Team Stopped Being a Pipeline]]></title><description><![CDATA[What changed when a 12-agent feature factory grew a nervous system.]]></description><link>https://joaofogoncalves.substack.com/p/2026-04-16-from-pipeline-to-nervous-system</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-04-16-from-pipeline-to-nervous-system</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/940b9fe5-b123-4ffd-882d-4fccae9cd0f8_1168x784.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CypP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CypP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!CypP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!CypP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!CypP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CypP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp" width="1168" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1168,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:234168,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CypP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!CypP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!CypP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!CypP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3094f29-c3cf-4a33-9196-cfea58e75ebe_1168x784.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>1. A different Tuesday</h2><p>In February, I wrote about watching a project manager agent spawn three planners in parallel, wait, sequence a backend pass, then a frontend pass, then optimization, tests, review, docs. An hour of work, no human touching the keyboard, one PR at the end.</p><p>That was the story: a pipeline. Feature in, code out.</p><p>Two months later, there is no start button anymore.</p><p>On a Tuesday in April, my laptop is closed. A Sentry alert fires at 10:17. An autonomous loop picks it up within sixty seconds, reads three Slack channels for context, finds a related thread from last week, creates a GitHub issue linked to both. Ten minutes later, a different skill scans the backlog, claims the top-priority bug, announces the claim in #eng-team with a reply to the original report, and kicks off a build. CI goes green at 11:02. Labels advance. A human hits approve with a thumbs-up reaction on Slack. Merge. Deploy.</p><p>I read the whole thing from my phone at lunch.</p><p>The pipeline still exists. It&#8217;s just one organ of something bigger now.</p><h2>2. Pipelines deliver. Nervous systems sense and act.</h2><p>The thesis of the first article was that coordination is the real problem, and a team of specialized agents with gates between them beats a single giant prompt. That&#8217;s still true. It&#8217;s also insufficient.</p><p>A pipeline assumes an input. Someone hands it a spec. It delivers code. When the spec runs out, the pipeline stops. It has no idea what&#8217;s happening in Sentry, in Slack, in the backlog, in the last week of merged PRs. It can&#8217;t notice things. It can&#8217;t follow up. It can&#8217;t review its own past work and change its future behavior. It is, in the most literal sense, passive.</p><p>A nervous system is always on. It senses. It reacts. It remembers. It adapts.</p><p>The shift I didn&#8217;t see coming in February is that once you have specialized agents that can deliver a feature, the next hard problem isn&#8217;t making the delivery smarter. It&#8217;s everything <em>around</em> delivery: deciding what to build, knowing when something breaks, handling follow-ups while five other things are in flight, noticing that the same mistake keeps happening and fixing the mistake-maker instead of the mistake.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AUmQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AUmQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp 424w, https://substackcdn.com/image/fetch/$s_!AUmQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp 848w, https://substackcdn.com/image/fetch/$s_!AUmQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp 1272w, https://substackcdn.com/image/fetch/$s_!AUmQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AUmQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp" width="1456" height="906" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:906,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165412,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AUmQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp 424w, https://substackcdn.com/image/fetch/$s_!AUmQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp 848w, https://substackcdn.com/image/fetch/$s_!AUmQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp 1272w, https://substackcdn.com/image/fetch/$s_!AUmQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a211c4-7719-40c4-a714-890b000ddbcc_2624x1632.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>3. The three organs</h2><p>The system grew three distinct subsystems since February. None of them existed in the original article.</p><p><strong>Sensors.</strong> A skill called <code>/heartbeat</code> runs on a schedule. It polls Sentry for new or escalating errors. It reads four Slack channels: #product, #product-monitoring, #eng-team, #product-development. It handles @mentions in-thread. It follows up on pending threads waiting for clarification or approval. It asks questions when feedback is ambiguous. When it finds something worth acting on, it creates or updates a GitHub issue and links the Sentry event to it. Then it writes everything it learned to a persistent gist so the next run knows what it already handled.</p><p><strong>Reflexes.</strong> A skill called <code>/pick</code> runs against the backlog. It sorts by priority, claims the top unassigned bug or improvement or research issue, announces the claim in Slack as a reply to whoever reported it, and invokes <code>/build --auto</code>. The build skill then runs the old pipeline: plan, implement, test, review, merge. Same shape as February. Now it runs without a human kicking it off.</p><p><strong>Memory.</strong> Two pieces. The gist state keeps the sensor&#8217;s context across runs (last-read timestamps, pending threads, per-user nudge budgets so the bot doesn&#8217;t pester the same person twice in an hour). And a skill called <code>/weekly-agent-review</code> that reads the last seven days of agent work, compares it against human corrections on PRs, and proposes updates to the agent definitions themselves.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w7-o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w7-o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp 424w, https://substackcdn.com/image/fetch/$s_!w7-o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp 848w, https://substackcdn.com/image/fetch/$s_!w7-o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp 1272w, https://substackcdn.com/image/fetch/$s_!w7-o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w7-o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:121792,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w7-o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp 424w, https://substackcdn.com/image/fetch/$s_!w7-o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp 848w, https://substackcdn.com/image/fetch/$s_!w7-o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp 1272w, https://substackcdn.com/image/fetch/$s_!w7-o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd239a00e-20b3-4382-9103-0bc5085f0141_3600x2402.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The last part is the one that surprised me. The system reviews itself and edits its own source.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ow-A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ow-A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp 424w, https://substackcdn.com/image/fetch/$s_!Ow-A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp 848w, https://substackcdn.com/image/fetch/$s_!Ow-A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ow-A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ow-A!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp" width="1200" height="351.0989010989011" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:426,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:65112,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ow-A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp 424w, https://substackcdn.com/image/fetch/$s_!Ow-A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp 848w, https://substackcdn.com/image/fetch/$s_!Ow-A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ow-A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4a974d-18fc-4ef1-aba0-c413ed060c93_3000x878.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>4. Specialization is evolution, not a destination</h2><p>The February roster was twelve agents. I thought it was complete.</p><p>It wasn&#8217;t. The roster now sits at fourteen, and the additions tell you exactly where the previous version was thin.</p><p><code>ci-fixer</code> showed up in March. The old system trusted the quality-checker to catch everything locally. In practice, CI failed for reasons the local check couldn&#8217;t reproduce (flaky tests, migration conflicts, version drift between environments). A human kept jumping in to fix CI. So the agent that reads CI logs, diagnoses the failure, and applies a minimal fix became its own thing.</p><p><code>conflict-resolver</code> showed up the same week. Same pattern. Merge conflicts during long feature branches kept requiring human judgment. Now an agent that understands both sides of a conflict and applies the correct resolution strategy handles most of them.</p><p><code>github-actions-expert</code> is the security specialist. It pins action versions, sets OIDC auth, enforces least-privilege permissions. That work used to be whoever merged the PR. Now it has an owner.</p><p><code>tester</code> is the subtle one. There was already a <code>test-writer</code> &#8212; it planned test coverage. But planning and writing were the same agent, which meant in practice the planning was rushed because the model wanted to get to the writing. Splitting them produced better tests.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Mj18!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Mj18!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp 424w, https://substackcdn.com/image/fetch/$s_!Mj18!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp 848w, https://substackcdn.com/image/fetch/$s_!Mj18!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp 1272w, https://substackcdn.com/image/fetch/$s_!Mj18!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Mj18!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp" width="1200" height="660.989010989011" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:802,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:144802,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Mj18!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp 424w, https://substackcdn.com/image/fetch/$s_!Mj18!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp 848w, https://substackcdn.com/image/fetch/$s_!Mj18!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp 1272w, https://substackcdn.com/image/fetch/$s_!Mj18!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b3ea0e2-a1dd-4fa6-aed0-f4ab71416da0_3000x1652.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The lesson isn&#8217;t that twelve was wrong. Twelve was right for what the system was doing in February. The lesson is that you add a specialist every time a generalist keeps producing the same class of error. The roster is a ledger of past failures.</p><h2>5. Autonomy is a dial, not a switch</h2><p>The February system had one mode: run the pipeline end-to-end. Reviewing the plan before implementation was optional and manual.</p><p>The current <code>/build</code> has three modes, and by default it picks one based on the complexity of the issue:</p><pre><code>--auto       No prompts. Auto-merge on green CI. Default for Bug / Improvement.
--guided     Checkpoints before implementation and before merge.
--review     Full checkpoints: plan review, implementation, merge.
</code></pre><p>The dial matters because the cost of a wrong auto-merge is not symmetric with the cost of a slow merge. A one-line fix to a typo doesn&#8217;t need three human checkpoints. A refactor touching thirty files does.</p><p>The system reads the issue type, estimates complexity from the spec length and the files it expects to touch, and sets the mode. The human can override. Most of the time, nobody does.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uht5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uht5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp 424w, https://substackcdn.com/image/fetch/$s_!Uht5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp 848w, https://substackcdn.com/image/fetch/$s_!Uht5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp 1272w, https://substackcdn.com/image/fetch/$s_!Uht5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uht5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:119750,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Uht5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp 424w, https://substackcdn.com/image/fetch/$s_!Uht5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp 848w, https://substackcdn.com/image/fetch/$s_!Uht5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp 1272w, https://substackcdn.com/image/fetch/$s_!Uht5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae6ea596-e9f4-441b-b5a2-91f80e33b6e7_2048x2048.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This is the piece that most teams skip. They pick a single autonomy level for everything and then fight about whether it&#8217;s too much or too little. The answer is almost always: it depends on the work.</p><h2>6. What a real day looks like</h2><p>The pipeline view, in February, was a single feature flowing through stages. The nervous-system view is harder to draw because there is no single flow. There are dozens of partial ones, overlapping, all the time.</p><p>Here&#8217;s a compressed Tuesday:</p><pre><code>08:14  heartbeat wakes, reads Sentry, spots a new 500 on payroll export
08:14  cross-references #product-monitoring for complaints &#8212; finds one from last week
08:15  creates GH issue #2847, links Sentry group, replies to Slack thread
09:02  /pick claims #2847, announces in thread: "on it"
09:04  /build --auto starts. Bug path: skip planning agents, go straight to fix
09:19  backend fix committed, tester writes regression test, both pass locally
09:21  PR opened, CI running
09:33  CI fails on a flaky migration check
09:33  ci-fixer reads the log, identifies a race in the test fixture, patches it
09:41  CI green
09:42  code-reviewer approves, no critical issues
09:43  PR marked ready for review, slack notification posted
10:11  human taps thumbs-up on the slack message
10:12  auto-merge fires, deploy pipeline takes over

14:00  /heartbeat wakes again &#8212; different mentions, different context
17:30  /pick wakes, picks the next bug, cycle repeats

Friday: /weekly-agent-review reads the week,
        notes that ci-fixer handled 6 of 7 CI failures without human touch,
        notes that the 7th required a human because of a secret rotation,
        proposes adding a "secrets expert" specialist to next week's roster
</code></pre><p>Three things stand out when you compare this to the February version.</p><p>First, no human kicked off #2847. The system created the ticket, assigned it, fixed it, and queued it for review. The human role collapsed to a single thumbs-up reaction at 10:11.</p><p>Second, the CI failure at 09:33 would have stopped the February pipeline until a human intervened. Now a specialist handles it.</p><p>Third, the Friday step is the one that would have sounded like science fiction two months ago. The system audits its own output and proposes changes to itself. I approve or reject the proposal. The system applies the change. Next week&#8217;s version of the system is not the version I wrote.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uf9z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uf9z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp 424w, https://substackcdn.com/image/fetch/$s_!Uf9z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp 848w, https://substackcdn.com/image/fetch/$s_!Uf9z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp 1272w, https://substackcdn.com/image/fetch/$s_!Uf9z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uf9z!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp" width="1200" height="395.6043956043956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:480,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:71422,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Uf9z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp 424w, https://substackcdn.com/image/fetch/$s_!Uf9z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp 848w, https://substackcdn.com/image/fetch/$s_!Uf9z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp 1272w, https://substackcdn.com/image/fetch/$s_!Uf9z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc39f6ecf-8ea2-4855-b2ca-f1eaa7057df1_3000x988.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mr5B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mr5B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp 424w, https://substackcdn.com/image/fetch/$s_!mr5B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp 848w, https://substackcdn.com/image/fetch/$s_!mr5B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp 1272w, https://substackcdn.com/image/fetch/$s_!mr5B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mr5B!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp" width="1200" height="307.4175824175824" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:373,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:57170,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mr5B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp 424w, https://substackcdn.com/image/fetch/$s_!mr5B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp 848w, https://substackcdn.com/image/fetch/$s_!mr5B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp 1272w, https://substackcdn.com/image/fetch/$s_!mr5B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bebcabb-4b81-4011-9831-5d18ae14c38d_3000x768.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>7. What the nervous system still can&#8217;t do</h2><p>Every honest piece about an agent system needs this section, so here it is.</p><p>The weekly-review loop is only as good as the signal it reads. It&#8217;s good at catching &#8220;the same class of error keeps happening.&#8221; It&#8217;s bad at catching &#8220;this entire approach is wrong.&#8221; Strategic drift doesn&#8217;t show up in PR diffs. You still need a human who reads broadly and notices that the system is efficiently going in the wrong direction.</p><p>The autonomy dial makes smart defaults, not correct ones. A simple-looking bug that turns out to have load-bearing consequences will sail through <code>--auto</code> and cause exactly the outage the old pipeline would have avoided, because there was no plan-review step. The dial reduces friction on the common case at the cost of making the uncommon case more dangerous. Both things are true.</p><p>Persistent state via gist is fragile. It works. It&#8217;s also a system that stores critical coordination data in a single markdown file on a third-party service, and I have not yet had the failure mode where that file goes bad. When it happens, the whole nervous system goes blind for a cycle.</p><p>The new specialists (ci-fixer, conflict-resolver) are narrow. They handle the shape of failure they were built for and nothing else. Every new class of failure is a new specialist or a human. There is no general-purpose &#8220;something went wrong, figure it out&#8221; agent that works at this quality level yet.</p><p>And the bill is higher. A nervous system that runs continuously costs more tokens than a pipeline that only runs when you ask it to. The work it does has to be worth the ambient cost of it running at all. For a product team shipping daily, it is. For a side project that ships twice a month, it isn&#8217;t.</p><h2>8. Back to Tuesday</h2><p>In February, the point of the article was that the gap between &#8220;AI writes code&#8221; and &#8220;AI delivers features&#8221; is a systems design problem. The models were capable enough. What was missing was the organizational layer: who does what, in what order, with what inputs, through what gates.</p><p>Two months later, there&#8217;s a bigger gap on the other side of the pipeline.</p><p>The gap between &#8220;AI delivers features on request&#8221; and &#8220;AI runs a product development loop&#8221; is also a systems design problem. Same shape. Different scope. What&#8217;s missing is the sensing layer, the memory layer, the self-review layer. The organs that make a system aware of itself and its environment.</p><p>You don&#8217;t need to build all of this to start. Start with one sensor. A skill that watches one channel. A reflex that claims one kind of work. A weekly review that reads the last seven days and tells you what it noticed.</p><p>Grow it when you hit a specific failure mode. Same principle as the February article, applied one level up.</p><p>The pipeline gets you features. The nervous system gets you a company that ships while you&#8217;re at lunch.</p><p>The next time you watch an AI agent deliver a feature, ask yourself: who told it to? If the answer is still &#8220;a human, every time,&#8221; you have a pipeline. That&#8217;s fine. It&#8217;s just not the end of the road.</p>]]></content:encoded></item><item><title><![CDATA[Every Company Is Three Things. AI Just Made That Obvious.]]></title><description><![CDATA[Expert knowledge, tribal knowledge, and the software that stitches them together. Document the first two and you can rebuild how you work from scratch.]]></description><link>https://joaofogoncalves.substack.com/p/2026-04-12-every-company-is-three-things-ai-just-made-that-obvious</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-04-12-every-company-is-three-things-ai-just-made-that-obvious</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XZGb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XZGb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XZGb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XZGb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XZGb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XZGb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XZGb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg" width="1168" height="683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:683,&quot;width&quot;:1168,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:285627,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650540?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XZGb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XZGb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XZGb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XZGb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56cc23ec-7295-4ed2-a928-c410136b8cf4_1168x683.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Ask any executive what their company does and you&#8217;ll get an org chart, a mission statement, maybe a slide deck about culture and values. Ask AI to figure it out and you get something simpler.</p><p>AI is stripping companies down to three things. Not three departments. Not three product lines. Three categories of knowledge that determine whether the company actually works.</p><p>Expert Knowledge. Tribal Knowledge. And the Hardware and Software that stitches them together.</p><p>That&#8217;s it. Everything else is scaffolding.</p><p>The reason this matters now is that AI doesn&#8217;t need the scaffolding. It needs the knowledge. And most companies, when they go looking for it, discover they have far less of it documented than they assumed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vUkc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vUkc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png 424w, https://substackcdn.com/image/fetch/$s_!vUkc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png 848w, https://substackcdn.com/image/fetch/$s_!vUkc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png 1272w, https://substackcdn.com/image/fetch/$s_!vUkc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vUkc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png" width="680" height="420" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:420,&quot;width&quot;:680,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41305,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650540?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vUkc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png 424w, https://substackcdn.com/image/fetch/$s_!vUkc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png 848w, https://substackcdn.com/image/fetch/$s_!vUkc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png 1272w, https://substackcdn.com/image/fetch/$s_!vUkc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6429a772-aa22-4161-9ca9-cec13757a25d_680x420.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>What you know how to do</h2><p>Expert Knowledge is the vertical-specific understanding of how to operate in your domain. It&#8217;s what you&#8217;d teach in a textbook if the textbook existed. How to underwrite a loan. How to design a bridge truss. How to diagnose a failing compressor. How to price a derivatives contract.</p><p>This is the kind of knowledge that industries build certification programs around. It&#8217;s teachable, testable, and increasingly available to AI. If your expert knowledge lives in published standards, regulatory frameworks, or well-documented procedures, a foundation model can learn it. Not perfectly. But well enough to shift the value curve.</p><p>McKinsey&#8217;s 2025 State of AI report found that 88% of organizations now use AI in at least one function. The knowledge that used to differentiate a senior hire from a junior one is increasingly embedded in the tools both of them use. If it&#8217;s in a textbook, it&#8217;s in a model. The moat has to come from somewhere else.</p><p>AI makes this visible because it&#8217;s the first thing companies try to feed it. They point a model at their documented procedures and get decent results fast. Which feels like progress until they realize AI just commoditized the layer they thought was their advantage.</p><p>The interesting question isn&#8217;t whether AI can access your expert knowledge. It&#8217;s whether your expert knowledge is all you have.</p><h2>What nobody wrote down</h2><p>Tribal Knowledge is the other kind. It&#8217;s the fuzzy grey details that exist in people&#8217;s heads, in Slack threads, in the way a senior engineer configures a deployment differently from the documentation, in the reason one sales team consistently outperforms another selling the same product in the same market.</p><p>This is the knowledge that is poorly documented because it&#8217;s hard to articulate. It lives in intuition built over years of pattern matching. The machinist who can hear when a tolerance is off. The underwriter who knows which data points actually predict default versus the ones the model says should. The project manager who understands which stakeholder needs to be looped in before a decision sticks.</p><p>The California Management Review called tacit knowledge your next competitive moat. They&#8217;re understating it.</p><p>This is where performance dispersion lives. Two companies in the same vertical, same market, same tools, same certifications. One consistently outperforms the other by 20, 30, 40 percent. The spreadsheet can&#8217;t explain why. But the people inside both companies know. The difference is that one company has tribal knowledge distributed across its teams. The other lost it when three senior people left and nobody thought to ask them how they actually did the work.</p><p>AI exposes this layer by subtraction. Companies deploy a model, feed it their documented knowledge, and the output is competent but generic. The gap between what the AI produces and what the best people produce is tribal knowledge made visible. It&#8217;s the delta you can suddenly measure but can&#8217;t yet close.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bQ6O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bQ6O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png 424w, https://substackcdn.com/image/fetch/$s_!bQ6O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png 848w, https://substackcdn.com/image/fetch/$s_!bQ6O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png 1272w, https://substackcdn.com/image/fetch/$s_!bQ6O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bQ6O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png" width="680" height="340" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:340,&quot;width&quot;:680,&quot;resizeWidth&quot;:680,&quot;bytes&quot;:23657,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194650540?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bQ6O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png 424w, https://substackcdn.com/image/fetch/$s_!bQ6O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png 848w, https://substackcdn.com/image/fetch/$s_!bQ6O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png 1272w, https://substackcdn.com/image/fetch/$s_!bQ6O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c959a72-1017-4641-a00d-f544ddc647f7_680x340.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And two converging forces are making this urgent: AI integration is exposing the gaps, and mass retirements are draining the institutional expertise that filled those gaps invisibly for decades. The knowledge walks out the door, and the org doesn&#8217;t even know what questions to ask about what it lost.</p><h2>The glue layer</h2><p>The third element is Hardware and Software. The CRM, the ERP, the custom internal tools, the spreadsheets nobody admits are running critical processes, the deployment pipelines, the communication platforms. This is where knowledge becomes action.</p><p>AI is embedded in this layer now. It&#8217;s dramatically better glue. It can stitch Expert and Tribal Knowledge together faster, more consistently, and at a scale that wasn&#8217;t possible when the glue was entirely human coordination.</p><p>Deloitte&#8217;s 2026 State of AI report found that 66% of organizations report productivity gains from enterprise AI adoption. But look at where those gains come from: faster information retrieval, better routing of decisions, more consistent application of known procedures. The knowledge itself didn&#8217;t change. The speed at which it could be applied did.</p><p>The companies seeing transformational results did something different. McKinsey found that high performers are 3.6 times more likely to pursue transformational change, and 55% fundamentally rework their workflows when deploying AI. They&#8217;re not upgrading the glue layer. They&#8217;re rebuilding it around their documented knowledge.</p><p>That&#8217;s a different thing entirely.</p><h2>What happens when you document both</h2><p>If Expert Knowledge and Tribal Knowledge are both well documented, something changes. You can rebuild how you do work.</p><p>Not optimize. Not automate a few steps. Rebuild.</p><p>The progression is straightforward. First you structure the knowledge into forms AI can consume: fine-tuned models, knowledge graphs, retrieval systems. Then you convert it into decision frameworks. Then AI can execute multi-step workflows independently. But the whole chain breaks at step one if the knowledge doesn&#8217;t exist in a form that can be structured.</p><p>When a company understands both what to do (Expert Knowledge) and how it&#8217;s actually done, including the judgment calls, the exceptions that everyone knows but nobody wrote down (Tribal Knowledge), it can redesign its processes from first principles. This is what most AI transformation projects miss. They start with the tools. They buy an AI platform, connect it to their data, and then wonder why the outputs are generic, hallucinated, or irrelevant to how the business actually operates. The issue isn&#8217;t the AI. The issue is that nobody documented the knowledge the AI needs to be useful.</p><p>The organizations that have done this work are seeing results that look like a different category. The California Management Review cited a case where regulatory evaluations in the cosmetics industry scaled from hundreds to over 40,000 per month with full accuracy and repeatability. Expert workload dropped by roughly 80%. But that only worked because both the expert knowledge (regulatory frameworks) and the tribal knowledge (how experienced evaluators actually interpret edge cases) were codified before the AI was deployed.</p><p>Companies with established knowledge layers deployed new AI applications in weeks because more than half of their semantic structure could be reused across use cases.</p><p>This isn&#8217;t optimization. This is reconstruction. Same company, same people, fundamentally different capability.</p><h2>More people, not fewer</h2><p>Here&#8217;s the part that most people get wrong.</p><p>The assumption is that documenting knowledge and adding AI means you need fewer humans. The math seems obvious. If AI handles the execution, why hire people to do it?</p><p>But that&#8217;s not what happens in practice. What happens is the bottleneck moves.</p><p>When Expert and Tribal Knowledge are well documented and AI handles the execution layer, the constraint shifts to judgment. Not the routine judgment that can be encoded in decision trees. The novel judgment. The edge cases. The strategic calls. The situations nobody anticipated when the knowledge was written down.</p><p>Judgment doesn&#8217;t scale without people.</p><p>A company that has documented its knowledge well can hire faster because onboarding changes. Instead of spending six months absorbing tribal knowledge through osmosis, sitting next to the senior person, learning the unwritten rules, a new hire can get to the judgment layer in weeks. The documented knowledge accelerates them to the point where they can start making meaningful decisions sooner.</p><p>This is a growth argument. Companies with well-documented knowledge can absorb more people because each person reaches productive judgment faster. The documented knowledge is the scaffold. The humans provide the judgment. You need more of them because the opportunity space expands when the knowledge bottleneck clears.</p><p>Both things are probably true. AI will eliminate some roles where the work is pure execution against well-known procedures. And AI will create demand for more people in organizations where documented knowledge reveals how much novel judgment is actually required to operate well.</p><p>The companies that understand this will grow faster. The ones that treat documentation purely as a cost-cutting exercise will find they&#8217;ve automated the easy part and hollowed out their capacity for the hard part.</p><h2>The rebuild</h2><p>Every company looks complex from the outside. Org charts, processes, culture, technology stacks, decades of accumulated decisions layered on top of each other.</p><p>Strip away the scaffolding and there are three things. What you know how to do. What nobody wrote down. And the tools you use to stitch them together.</p><p>AI didn&#8217;t create these layers. It revealed them. And the companies that understand what they&#8217;re actually made of are the ones that can remake themselves.</p><p>The rest are still optimizing something they can&#8217;t describe.</p>]]></content:encoded></item><item><title><![CDATA[Pain Gets You In The Door. Curiosity Builds Everything Else]]></title><description><![CDATA[Why organizations keep treating AI adoption as a pain problem &#8212; and why that's only half the answer.]]></description><link>https://joaofogoncalves.substack.com/p/2026-03-26-pain-gets-you-in-the-door</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-03-26-pain-gets-you-in-the-door</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8f5L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8f5L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8f5L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp 424w, https://substackcdn.com/image/fetch/$s_!8f5L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp 848w, https://substackcdn.com/image/fetch/$s_!8f5L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp 1272w, https://substackcdn.com/image/fetch/$s_!8f5L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8f5L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp" width="1400" height="781" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:781,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:167172,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194701721?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8f5L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp 424w, https://substackcdn.com/image/fetch/$s_!8f5L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp 848w, https://substackcdn.com/image/fetch/$s_!8f5L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp 1272w, https://substackcdn.com/image/fetch/$s_!8f5L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355c2d08-4334-4286-987a-6f0fab2d41f0_1400x781.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>There&#8217;s a post circulating where someone describes their CEO checking everything through AI. Website copy. Campaign strategy. Webinar talking points. Every time someone presents work, the response is the same: &#8220;Have you asked AI what it thinks?&#8221;</p><p>The team is frustrated. Demoralized. I get it.</p><p>I also think the CEO might be the most rational person in the room.</p><p>He found something that gives direct answers. That doesn&#8217;t ask for three more days. That doesn&#8217;t say &#8220;we have experts on the team.&#8221; He isn&#8217;t obsessed &#8212; he&#8217;s just less tolerant of slow feedback than he used to be. Both things are probably true. The frustration just runs in opposite directions.</p><p>But here&#8217;s the part worth thinking about: his relationship with AI will probably stay exactly as shallow as it is right now. Because what drove him there was pain. And pain is a poor architect.</p><h2>Pain lowers the activation energy</h2><p>Organizations love the pain frame when it comes to adoption. Make the old way uncomfortable enough, and people will reach for the new one. It follows standard diffusion logic &#8212; people change when the cost of not changing exceeds the friction of changing.</p><p>And it works. Partially.</p><p>Pain gets someone to open the tool instead of dismissing it. Mandate usage metrics, change the approval process, put an impatient CEO in the room. People will start using it.</p><p>The numbers back this up. According to McKinsey&#8217;s 2025 State of AI report, nearly 90% of organizations now use AI regularly in at least one function. Adoption, by most surface measures, is nearly universal.</p><p>But a 2025 study of 10,000 employees by the ifo Institute found something that sits awkwardly next to that headline: while 64% of workers use AI tools, only 20% use them frequently or intensively. Broad diffusion. Shallow use. The same tool, open in millions of browser tabs, barely touched beneath the surface.</p><p>McKinsey puts the scaling number at 7%. That&#8217;s the share of organizations that have successfully embedded AI across the enterprise &#8212; not just piloting it, not just reporting usage, but actually running on it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JiDs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JiDs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp 424w, https://substackcdn.com/image/fetch/$s_!JiDs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp 848w, https://substackcdn.com/image/fetch/$s_!JiDs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp 1272w, https://substackcdn.com/image/fetch/$s_!JiDs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JiDs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp" width="1400" height="747" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:747,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20940,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194701721?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JiDs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp 424w, https://substackcdn.com/image/fetch/$s_!JiDs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp 848w, https://substackcdn.com/image/fetch/$s_!JiDs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp 1272w, https://substackcdn.com/image/fetch/$s_!JiDs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7dcc084-1a77-4901-9527-b18acf616ba1_1400x747.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The gap between 90% and 7% is the whole article.</p><h2>What pain actually produces</h2><p>Pain-driven adoption has a specific texture. The ifo Institute research names it directly: cognitive inertia. When organizational pressure is the primary driver, users rely on AI to complete tasks with &#8220;minimally acceptable quality&#8221; rather than using it to think differently about the problem. The tool becomes a shortcut, not a collaborator.</p><p>The same study found that top-down formal adoption &#8212; mandates, training programs, supervision &#8212; determines how deeply AI is embedded in daily workflows. But it doesn&#8217;t broaden the pool of people actually using it well. That part is driven by something else: informal, employee-led experimentation. People going off-script. Trying things nobody asked them to try.</p><p>In other words, pain sets the floor. It does not raise the ceiling.</p><p>The CEO checking every presentation through AI isn&#8217;t building capability. He&#8217;s building a habit. Those are different things. One compounds. The other plateaus.</p><h2>What curiosity actually produces</h2><p>A 2026 study published in Frontiers in Psychology identified intrinsic motivation as the strongest single predictor of creative and frequent AI use. More than access. More than training. More than organizational mandate.</p><p>And critically: when extrinsic pressure becomes the dominant driver, it can actively weaken the effect of intrinsic motivation on creativity. The mandate crowds out the curiosity. You get a utilitarian atmosphere &#8212; people using AI to get things done &#8212; where what you actually needed was people using AI to figure out what&#8217;s worth doing differently.</p><p>This distinction shows up clearly in what separates high performers from the rest. Carnegie Mellon&#8217;s AI Maturity research categorizes only 8% of organizations as &#8220;reinvention-ready.&#8221; What sets them apart isn&#8217;t better tools or bigger budgets. It&#8217;s a shift from what the research calls horizontal layering &#8212; adding AI on top of existing silos &#8212; to vertical integration, where teams take end-to-end ownership of AI-augmented workflows and actively redesign how work gets done.</p><p>The productivity gap between those two modes is not marginal. It ranges from 8x to 33x reductions in resource consumption. Same technology. Completely different relationship to it.</p><h2>The uncomfortable part</h2><p>Here&#8217;s where this gets genuinely difficult: you can manufacture pain. Restructure a workflow. Change an approval process. Hire an impatient CEO. Create urgency.</p><p>You cannot manufacture curiosity.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Azch!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Azch!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp 424w, https://substackcdn.com/image/fetch/$s_!Azch!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp 848w, https://substackcdn.com/image/fetch/$s_!Azch!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp 1272w, https://substackcdn.com/image/fetch/$s_!Azch!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Azch!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp" width="1200" height="373.7142857142857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:436,&quot;width&quot;:1400,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:29912,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194701721?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Azch!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp 424w, https://substackcdn.com/image/fetch/$s_!Azch!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp 848w, https://substackcdn.com/image/fetch/$s_!Azch!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp 1272w, https://substackcdn.com/image/fetch/$s_!Azch!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9736509-3239-4c75-a1b6-5a57e074da57_1400x436.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A 2026 study confirmed what most practitioners already sense: the psychological pathway to sustained AI adoption runs through motivation internalization. External pressure initiates behavior. But what sustains it &#8212; what makes it compound rather than plateau &#8212; is curiosity and the habits it builds. Intrinsic motivation and behavioral habit are the core nodes that hold the entire psychological adoption network together.</p><p>Which means the real question for any organization serious about going past the 7% isn&#8217;t &#8220;how do we get people to use this.&#8221; It&#8217;s: where are the people who are already curious, and are we giving them room to run?</p><p>Because those people exist in almost every organization. They&#8217;ve already figured out something their team hasn&#8217;t. They&#8217;re using AI in ways nobody asked them to. They probably haven&#8217;t told anyone because there&#8217;s no incentive to.</p><p>Most adoption programs walk right past them. They&#8217;re too busy measuring the 90%.</p><h2>What this means in practice</h2><p>Compliance-based adoption is real. It generates the numbers that go in board decks. In a narrow sense, it works.</p><p>What it doesn&#8217;t produce is the person who comes in on Monday having spent the weekend figuring something out. The junior hire who quietly builds a workflow that changes how a whole department operates. The team member who reframes a problem nobody had thought to reframe.</p><p>Those people moved because of curiosity. They didn&#8217;t need a mandate. They needed room.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GQAk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GQAk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp 424w, https://substackcdn.com/image/fetch/$s_!GQAk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp 848w, https://substackcdn.com/image/fetch/$s_!GQAk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp 1272w, https://substackcdn.com/image/fetch/$s_!GQAk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GQAk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp" width="1400" height="871" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:871,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48928,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194701721?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GQAk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp 424w, https://substackcdn.com/image/fetch/$s_!GQAk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp 848w, https://substackcdn.com/image/fetch/$s_!GQAk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp 1272w, https://substackcdn.com/image/fetch/$s_!GQAk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f861c27-0604-4d3e-82f7-55890514be2e_1400x871.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The organizations building real AI capability aren&#8217;t the ones with the most aggressive adoption programs. They&#8217;re the ones where a handful of genuinely curious people went ahead, figured something out, and made it impossible for everyone else to ignore.</p><h2>Back to the annoying CEO</h2><p>He&#8217;s in the high-pain, low-curiosity quadrant. Fed up with slow, vague answers &#8212; and relieved to have something that just responds. Whether that relief becomes genuine curiosity, or stays a coping mechanism for organizational frustration, is an open question.</p><p>His team&#8217;s frustration is legitimate. But part of what&#8217;s underneath it &#8212; unspoken &#8212; is that they haven&#8217;t found their own reason to go deeper. The CEO found his, even if it&#8217;s imperfect.</p><p>The gap isn&#8217;t really between the CEO and the team. It&#8217;s between both of them and the version of this that actually compounds.</p><p>Pain is the ignition. Curiosity is the engine.</p><p>You need both. But only one of them scales.</p>]]></content:encoded></item><item><title><![CDATA[Is SaaS Dead?]]></title><description><![CDATA[No. But the version of SaaS most people are selling might be.]]></description><link>https://joaofogoncalves.substack.com/p/2026-03-16-is-saas-dead</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-03-16-is-saas-dead</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3VH3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The math changed</h2><p>Here&#8217;s what happened. AI made coding cheap. Not free, not effortless, but cheap enough that the build vs. buy equation flipped for a lot of teams.</p><p>Two years ago, building an internal tool to replace a SaaS product meant hiring developers, managing scope creep, and maintaining something forever. The total cost of ownership was brutal. So you bought. Everyone bought. That&#8217;s how we ended up with companies running 200+ SaaS subscriptions and a full-time person just to manage them.</p><p>Now a senior engineer with an AI coding agent can prototype that same internal tool in a weekend. The build side of the equation dropped by an order of magnitude. The buy side stayed the same, or got more expensive.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3VH3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3VH3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp 424w, https://substackcdn.com/image/fetch/$s_!3VH3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp 848w, https://substackcdn.com/image/fetch/$s_!3VH3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp 1272w, https://substackcdn.com/image/fetch/$s_!3VH3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3VH3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp" width="1360" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1360,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19562,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194701722?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3VH3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp 424w, https://substackcdn.com/image/fetch/$s_!3VH3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp 848w, https://substackcdn.com/image/fetch/$s_!3VH3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp 1272w, https://substackcdn.com/image/fetch/$s_!3VH3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e8d98a-58e5-4a87-9497-bb229e445959_1360x720.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>When you change one side of an equation that dramatically, everything downstream moves.</p><h2>What actually dies</h2><p>The SaaS products most exposed are the ones that were always a thin layer of logic on top of a database. The ones where the value was never the technology. It was the fact that building it yourself was too expensive to justify.</p><p>CRUD apps with nice UIs. Dashboards that rearrange data you already own. Workflow tools that are basically a form connected to a database connected to an email.</p><p>These were always a convenience tax. AI just made the convenience optional.</p><p>And it goes further than that. It will feel archaic in two years that we used to click through user interfaces to navigate databases and complete tasks. Agents just do it. One prompt. Done. 90% of the entire application layer is going to get eaten over the next decade. The dashboards. The forms. The CRUD. All of it.</p><h2>What doesn&#8217;t die</h2><p>Some SaaS products have moats that AI doesn&#8217;t erode. It actually makes them more valuable.</p><p><strong>Regulated environments.</strong> If your software needs certification, if it operates in a space where compliance isn&#8217;t optional, if regulators need to audit your processes, you can&#8217;t vibe-code your way through it. A weekend prototype doesn&#8217;t pass regulatory review. The certification itself is the product. It takes years to build, and your customers can&#8217;t replicate it no matter how cheap their engineers are.</p><p><strong>Deep dependency.</strong> Some tools wove themselves so deeply into how teams operate that ripping them out is more expensive than any alternative. This isn&#8217;t lock-in through malice. It&#8217;s lock-in through genuine usefulness. When a product becomes the operating system of a team&#8217;s daily work, the switching cost has nothing to do with code.</p><p><strong>Humans in the loop.</strong> There are domains where the service requires human judgment. Regulatory requirements that demand a qualified person signs off. Subjective decisions where the accumulated knowledge of specialists still matters. AI can assist here, but it can&#8217;t replace the human, and in many cases the law doesn&#8217;t allow it to. The SaaS layer that orchestrates this human expertise? That&#8217;s not going anywhere.</p><p><strong>Domain knowledge that&#8217;s still out of reach.</strong> Some industries have accumulated wisdom that isn&#8217;t in any training set. The edge cases, the unwritten rules, the things you only learn by operating in a space for years. Products built on this knowledge aren&#8217;t competing with AI. They&#8217;re competing with decades of experience, and AI doesn&#8217;t have it yet.</p><h2>From mega to micro</h2><p>The era of mega-SaaS, the all-in-one platform that tries to be everything for everyone, is the part under real pressure. These products survive because the pain of integrating five smaller tools used to outweigh the pain of paying for features you don&#8217;t use. That integration pain is getting cheaper too.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vSJL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vSJL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp 424w, https://substackcdn.com/image/fetch/$s_!vSJL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp 848w, https://substackcdn.com/image/fetch/$s_!vSJL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp 1272w, https://substackcdn.com/image/fetch/$s_!vSJL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vSJL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp" width="1360" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:1360,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33552,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194701722?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vSJL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp 424w, https://substackcdn.com/image/fetch/$s_!vSJL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp 848w, https://substackcdn.com/image/fetch/$s_!vSJL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp 1272w, https://substackcdn.com/image/fetch/$s_!vSJL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50097b5b-96a3-4832-a08b-8f3a5ea17968_1360x600.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What&#8217;s emerging is micro-SaaS. Smaller, sharper products that do one thing well for a specific audience. The economics work because building them is cheaper. The market works because teams can now afford to be picky. Instead of buying the whole suite and using 20% of it, you find the tool that fits your exact problem.</p><p>More products competing on actual fit instead of feature count. More teams paying for what they use instead of what they might use someday. That&#8217;s healthier.</p><h2>The inversion</h2><p>Here&#8217;s where it gets interesting. Look at those moats again. Regulated environments. Human expertise. Domain knowledge. What do they all have in common?</p><p>The value is the service. The software is the delivery mechanism.</p><p>We&#8217;ve spent two decades packaging services as software. The whole SaaS model was: take a process that used to require people, automate it, sell the automation. The direction was always service into software.</p><p>That direction is inverting.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SJaQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SJaQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp 424w, https://substackcdn.com/image/fetch/$s_!SJaQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp 848w, https://substackcdn.com/image/fetch/$s_!SJaQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp 1272w, https://substackcdn.com/image/fetch/$s_!SJaQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SJaQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp" width="1360" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1360,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30994,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194701722?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SJaQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp 424w, https://substackcdn.com/image/fetch/$s_!SJaQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp 848w, https://substackcdn.com/image/fetch/$s_!SJaQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp 1272w, https://substackcdn.com/image/fetch/$s_!SJaQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184bf78a-fb40-4d99-babe-6a0379381ad4_1360x680.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The real opportunity for most companies isn&#8217;t building another SaaS product. It&#8217;s taking genuine domain expertise and baking it into AI-powered delivery. Service-as-a-Software.</p><p>An ad agency that encodes its winning playbooks into AI systems and serves 1,000 clients with the quality it used to give 10. An IP law firm that packages decades of expertise into AI skill files and delivers legal services at near-zero marginal cost. An HR and payroll company that operates across European regulatory environments, where the humans in the loop aren&#8217;t a limitation but the entire product.</p><p>The backend is AI. The frontend is your expertise packaged as a service. The moat is that you actually know what good looks like in your domain.</p><p>You&#8217;re not competing with OpenAI. You&#8217;re competing with other service providers who are still doing everything manually. That&#8217;s not a hard fight to win.</p><h2>So is SaaS dead?</h2><p>SaaS isn&#8217;t dead. It&#8217;s inverting.</p><p>The version that existed because building was too hard, that charged enterprise prices for commodity logic, that bundled everything to justify the price tag? That part is dying.</p><p>What replaces it is sharper. Micro-SaaS tools that earn their place by fitting perfectly. And underneath those, a new layer: companies that stopped trying to sell software and started selling their expertise through it.</p><p>The technology gets commoditized. The person who knows how to use it doesn&#8217;t.</p>]]></content:encoded></item><item><title><![CDATA[AI Can Write Code. Coordinating AI Agents Is the Actual Hard Part.]]></title><description><![CDATA[1.]]></description><link>https://joaofogoncalves.substack.com/p/2026-02-17-coordinating-ai-agents-is-the-actual-hard-part</link><guid isPermaLink="false">https://joaofogoncalves.substack.com/p/2026-02-17-coordinating-ai-agents-is-the-actual-hard-part</guid><dc:creator><![CDATA[joaofogoncalves]]></dc:creator><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Im_h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Im_h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Im_h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!Im_h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!Im_h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!Im_h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Im_h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp" width="1168" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1168,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81426,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://joaofogoncalves.substack.com/i/194701723?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Im_h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp 424w, https://substackcdn.com/image/fetch/$s_!Im_h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp 848w, https://substackcdn.com/image/fetch/$s_!Im_h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp 1272w, https://substackcdn.com/image/fetch/$s_!Im_h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66f7832e-fd47-40af-b234-7514f786990e_1168x784.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>1. The Scene</h2><p>I watched it happen on a Tuesday afternoon. A project manager agent read a feature spec, spawned three planning agents in parallel, and waited for all three to finish. A product manager reviewed their output and sent feedback. Then the system shifted gears: backend implementation, frontend picking up the generated types, optimization, simplification, tests, a quality checker running linting and type checks across the entire codebase, a code review, documentation updates. The system updated the draft PR to ready-for-review, and that was it.</p><p>No human keyboard input for over an hour, across 30+ files touching both backend and frontend. And the code was production-quality.</p><p>But getting here took six weeks of rebuilding everything I thought I knew about using AI for development.</p><p>Here&#8217;s the thesis: most teams are optimizing single-agent prompting. The real productivity leap comes from solving orchestration: how multiple specialized agents coordinate, communicate, and quality-gate their own work. This is a systems design problem, and the principles for solving it transfer better than any specific prompt.</p><p>I built this system while developing a full-stack SaaS platform: Django on the backend, React on the frontend, the kind of multi-module application where features span models, schemas, endpoints, components, pages, and tests. What follows is the system, how it evolved, what worked, what didn&#8217;t, and the principles that transfer regardless of stack or tooling.</p><h2>2. The Problem: Why Single-Agent AI Hits a Ceiling</h2><h3>The Copilot Plateau</h3><p>AI-assisted coding has a productivity curve that flatlines faster than most teams expect. The first phase is magical: you ask for a function, it writes a function. You describe a bug, it suggests a fix. You paste an error, it explains it. For isolated tasks (write a utility, add a validation rule, refactor a method), the current generation of AI models is excellent.</p><p>The plateau hits when you move from tasks to features.</p><p>A feature isn&#8217;t a function. It&#8217;s a coordinated change across data models, API endpoints, frontend components, routing, state management, tests, and documentation. AI handles a CRUD endpoint beautifully. Ask it to build a cross-module feature, one that touches models, schemas, API contracts, components, and tests in coordinated sequence, and it starts losing coherence. Planning before implementation. Sequencing between layers. Verification after everything is wired together. A single agent holding all of that context doesn&#8217;t get slower. It gets confused.</p><p>Engineering leaders have felt this gap intuitively. AI helped write a function, great. But who planned which function to write? Who verified it integrates with the existing system? Who checked it didn&#8217;t break something three modules away?</p><h3>The Context Window Trap</h3><p>A single AI session trying to hold a feature spec, the existing architecture, backend implementation decisions, frontend component patterns, test coverage requirements, and code review criteria simultaneously will lose coherence. This isn&#8217;t a model intelligence problem. It&#8217;s an information density problem. The more context you load, the less reliably the model attends to all of it.</p><p>You&#8217;ve experienced this as &#8220;the AI forgot what I told it earlier.&#8221; At feature scale, it&#8217;s more like &#8220;the AI is simultaneously trying to be an architect, a developer, a tester, and a reviewer, and doing none of them well.&#8221;</p><h3>The Missing Middle</h3><p>There&#8217;s a gap between &#8220;AI writes a function&#8221; and &#8220;AI delivers a feature,&#8221; and it&#8217;s not bridged by better models or longer context windows. It&#8217;s bridged by answering a set of questions that have nothing to do with the model&#8217;s capabilities:</p><ul><li><p>Who plans what to build?</p></li><li><p>Who builds it, and in what order?</p></li><li><p>What inputs does each step need?</p></li><li><p>What gates must pass before the next step begins?</p></li><li><p>Who verifies the result?</p></li></ul><p>These are orchestration questions. They&#8217;re the same questions you&#8217;d answer when structuring a human engineering team. The missing middle isn&#8217;t intelligence. It&#8217;s organization.</p><h2>3. The Insight: AI Agents Need What Human Teams Need</h2><p>The breakthrough that changed my approach was obvious in hindsight: AI agents need the same organizational structures as human engineering teams.</p><p>A single brilliant engineer cannot replace a well-organized team. They can write excellent code, but they can&#8217;t simultaneously hold the product vision, the system architecture, the implementation details, the test strategy, and the documentation plan with equal depth. We solved this in human organizations decades ago with specialization, workflow, and quality gates.</p><p>Single-agent AI has the same limitation. It&#8217;s not that the model can&#8217;t reason about architecture or testing or code review. It&#8217;s that asking one agent to do all of these things in a single session produces the same result as asking one engineer to be the entire team: technically possible, practically mediocre.</p><p>What do real engineering teams have that single-agent AI lacks? Specialization, for one. An architect thinks differently from a developer, who thinks differently from a QA engineer. Distinct roles produce distinct perspectives. Teams also have workflow: you plan before you build, build before you test, test before you ship. They have communication through artifacts. The architect produces a blueprint. The developer reads the blueprint. The tester reads the spec. They have quality gates, where work doesn&#8217;t advance until it meets criteria. And they have state tracking, so everyone knows what phase the project is in.</p><p>The design principle that emerged: instead of asking one agent to do everything, build a team of specialists with clear interfaces between them. Define what each agent does, what it receives as input, what it produces as output, and what conditions must hold before the next agent begins.</p><h2>4. The System: A 12-Agent Orchestrated Workflow</h2><p>The implementation isn&#8217;t a custom Python framework or a wrapper around an API. Each agent is a markdown file, a Claude Code custom agent definition that specifies the agent&#8217;s role, constraints, inputs, outputs, and model. The project manager agent orchestrates the workflow by spawning these agents as sub-agents in the prescribed sequence. The entire system is configuration, not code. The tooling here is Claude Code, but the pattern (specialized agents with defined interfaces) applies to any agent framework.</p><h3>The Agent Roster</h3><p>::: wide | Tier | Agent | Role | Key Constraint | |&#8212;|&#8212;|&#8212;|&#8212;| | Executive | Project Manager | Orchestrates 4-phase workflow | Never writes code | | Executive | Product Manager | User-focused specs, plan validation | No technical details in specs | | Architecture | Architect | Blueprints, diagrams, data models | Produces blueprints, never code | | Architecture | UI Designer | Professional UX/UI design plans | Design-only, no implementation | | Development | Backend Developer | Django/API implementation | Follows architect&#8217;s blueprint | | Development | Frontend Developer | React/TypeScript implementation | Follows architect&#8217;s blueprint | | Development | Code Optimizer | Performance + pattern optimization | Only modified files | | Development | Code Simplifier | Reduce complexity, improve readability | Only modified files | | QA | Test Writer | Plans + implements test suites | Backend + frontend coverage | | QA | Quality Checker | Linting, formatting, types, tests | ENTIRE codebase, all 6 checks | | QA | Code Reviewer | Structured code review | Architecture, security, quality | | Documentation | Documentation Expert | API docs, README, changelog | Follows project conventions | :::</p><p>The key insight: constraints define roles more than capabilities. The architect&#8217;s definition doesn&#8217;t just say &#8220;you are an architect.&#8221; It explicitly prohibits code generation: no Python classes, no TypeScript interfaces, no function signatures, no import statements, no executable code of any kind. The output must be field tables, relationship diagrams, and API operation descriptions. The boundary between &#8220;what to build&#8221; and &#8220;how to build it&#8221; is enforced by prohibition, not suggestion.</p><p>Similarly, the project manager is told it <strong>never implements code directly</strong>. It plans, delegates, tracks, and coordinates. Without this hard constraint, the agent reliably drifts into writing code itself instead of delegating to specialists.</p><h3>The 4-Phase Workflow</h3><p>The system operates in four phases (plus initialization), each with explicit entry conditions, agent assignments, and gates:</p><pre><code>Phase 0: Initialization
&#9500;&#9472;&#9472; Create branch, draft PR, state tracker on GitHub Issue
&#9492;&#9472;&#9472; Gate: infrastructure ready

Phase 1: Planning (PARALLEL)
&#9500;&#9472;&#9472; UI Designer &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#8594; design-plan.md &#9472;&#9488;
&#9500;&#9472;&#9472; Architect &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#8594; system-plan.md  &#9500;&#8594; Product Manager reviews all three
&#9500;&#9472;&#9472; Test Writer &#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#8594; test-plan.md   &#9472;&#9496;
&#9500;&#9472;&#9472; Agents revise based on PM feedback
&#9492;&#9472;&#9472; Gate: all plans complete and reviewed

Phase 2: Implementation (SEQUENTIAL)
&#9500;&#9472;&#9472; Backend Developer &#8594; commit + push
&#9500;&#9472;&#9472; Frontend Developer &#8594; commit + push
&#9500;&#9472;&#9472; Code Optimizer &#8594; commit + push
&#9500;&#9472;&#9472; Code Simplifier &#8594; commit + push
&#9492;&#9472;&#9472; Gate: each step committed before next begins

Phase 3: QA &amp; Documentation (SEQUENTIAL)
&#9500;&#9472;&#9472; Test Writer (implements tests) &#8594; commit + push
&#9500;&#9472;&#9472; Quality Checker (ENTIRE codebase) &#8594; commit + push
&#9500;&#9472;&#9472; Code Reviewer &#8594; review report
&#9500;&#9472;&#9472; Documentation Expert &#8594; commit + push
&#9492;&#9472;&#9472; Gate: all checks pass system-wide

Phase 4: Ready for Review
&#9492;&#9472;&#9472; Draft PR &#8594; Ready for Review. Human enters the loop.
</code></pre><p>The parallel vs. sequential decision is intentional. Planning is embarrassingly parallel. Three agents creating independent perspectives on the same spec don&#8217;t need to coordinate. The architect doesn&#8217;t need the UI designer&#8217;s output, and vice versa. But implementation is intentionally sequential: the frontend developer needs the backend&#8217;s API types, the optimizer needs the code to exist before optimizing it, and the quality checker needs everything in place before running system-wide checks.</p><p>Here&#8217;s what the phase structure looks like in the actual project manager definition:</p><p>Phase Phase Label Project Status 0 <code>phase:0-init</code> Backlog 1 <code>phase:1-planning</code> Planning 2 <code>phase:2-implementation</code> Implementation 3 <code>phase:3-qa-docs</code> QA &amp; Documentation 4 <code>phase:4-ready-for-review</code> Ready for Review</p><p>Each phase transition updates labels on the GitHub Issue, moves the item on the project board, and updates a state tracker comment via the GitHub API.</p><h3>The Communication Layer</h3><p>Agents don&#8217;t talk to each other directly. They communicate through named artifacts stored in defined locations: planning artifacts on the GitHub Issue, implementation artifacts on the Pull Request.</p><p>Here&#8217;s the actual artifact mapping from the project manager&#8217;s definition:</p><p>Source File Location Feature spec pm-spec.md Issue Execution state tracker project-state.md Issue @product-manager output pm-plan.md Issue @ui-designer output design-plan.md Issue @architect output system-plan.md Issue @test-writer output test-plan.md Issue @backend-developer output backend-implementation.md Pull Request @frontend-developer output frontend-implementation.md Pull Request @code-optimizer output optimization-implementation.md Pull Request @code-simplifier output simplification-implementation.md Pull Request @test-writer output tests-results.md Pull Request @quality-checker output quality-checks.md Pull Request @code-reviewer output code-review-writing.md Pull Request @documentation-expert output documentation-writing.md Pull Request</p><p>Each agent reads specific inputs and writes a specific output. The project manager orchestrates sequencing; communication is asynchronous and artifact-based. This makes the entire system debuggable. You can inspect any artifact to understand exactly what an agent received as input and what it produced.</p><h2>5. Five Hard-Won Principles</h2><h3>5a. Constraints Over Capabilities</h3><p>The most important word in every agent definition is &#8220;NOT.&#8221;</p><p>The architect&#8217;s definition doesn&#8217;t just describe what an architect does. It explicitly enumerates what the architect must never produce: no Python class definitions, no Pydantic schema code, no TypeScript interfaces, no function signatures, no import statements, no executable code of any kind. The output format is prescribed as field tables, relationship diagrams, and API operation descriptions. Never implementation.</p><p>The project manager&#8217;s core rule: &#8220;Never implements code directly &#8212; plans, delegates, tracks, coordinates.&#8221;</p><p>Without these hard constraints, agents drift into each other&#8217;s territory. The architect starts writing code. The project manager starts implementing instead of delegating. The boundaries blur and you end up back where you started.</p><p><em>Define what an agent cannot do more carefully than what it can do.</em></p><h3>5b. Gates Over Trust</h3><p>Every phase transition has an explicit gate. Planning doesn&#8217;t advance to implementation until all three plans are complete and reviewed. Each implementation step must be committed before the next begins.</p><p>But the most important gate is in Phase 3. Here&#8217;s what the quality checker&#8217;s definition mandates:</p><pre><code>## Critical Rules
1. **ENTIRE codebase** &#8211; Run on ALL files, not just changed files
2. **NEVER use `--select`** or file-specific flags during checks
3. **NEVER skip a check** &#8211; All 6 checks must pass
4. **NEVER delete or skip tests** to make the suite pass
5. **Fix pre-existing issues** &#8211; If the codebase has pre-existing failures, fix them
6. **No partial success** &#8211; Either ALL checks pass or the task is not done
</code></pre><p>Six checks (linting, formatting, type checking, and tests for both backend and frontend) must pass across the entire codebase, not just the files changed in this feature. A new feature cannot silently break existing functionality.</p><p>Without gates, agents optimistically advance and quality degrades silently. They&#8217;ll report &#8220;looks good&#8221; when it isn&#8217;t, because the default behavior of a language model is to be helpful and move forward, not to block progress.</p><p><em>Don&#8217;t trust agents to self-assess quality. Build external verification into the workflow.</em></p><h3>5c. Artifacts Over Conversation</h3><p>Agents communicate through named artifacts: design-plan.md, system-plan.md, backend-implementation.md. Each agent has defined inputs and outputs. The architect reads pm-spec.md and produces system-plan.md. The backend developer reads pm-spec.md and system-plan.md and produces backend-implementation.md.</p><p>This matters because of debuggability. When something goes wrong (and it will), you can inspect any artifact to understand what an agent saw, what it produced, and where the chain broke down. Conversational context is ephemeral. Artifacts persist, and you can version them and inspect them after the fact.</p><p><em>Treat agent outputs as contracts. Name them, store them, make them inspectable.</em></p><h3>5d. Scoped Changes, Global Verification</h3><p>The code optimizer and code simplifier are scoped to &#8220;only files modified in this feature.&#8221; They don&#8217;t touch the rest of the codebase. But the quality checker runs on the entire codebase. Every lint rule, every type annotation, every test, across all modules.</p><p>This is an intentional asymmetry. Agents that change things should be scoped tightly. You don&#8217;t want an optimizer &#8220;improving&#8221; code in unrelated modules. But agents that verify things should run broadly, because you need to know that your changes didn&#8217;t break something elsewhere.</p><p><em>Scope changes narrowly. Verify broadly.</em></p><h3>5e. Model Selection Is a Lever</h3><p>Not every agent needs the most powerful model. Claude&#8217;s model tiers range from Opus (most capable, slower, higher cost) to Sonnet (fast, cheaper, still strong for implementation tasks). Here&#8217;s the actual assignment from the system:</p><pre><code>## Architecture &amp; Documentation &#8212; most capable model
- **architect:**            `opus`
- **documentation-expert:** `opus`

## Everything else &#8212; faster model
- **project-manager:**      `sonnet`
- **product-manager:**      `sonnet`
- **backend-developer:**    `sonnet`
- **frontend-developer:**   `sonnet`
- **test-writer:**          `sonnet`
- **code-reviewer:**        `sonnet`
- **code-optimizer:**       `sonnet`
- **code-simplifier:**      `sonnet`
- **quality-checker:**      `sonnet`
- **ui-designer:**          `sonnet`
</code></pre><p>The architect uses the most capable model because its job is structural reasoning about system boundaries and data flows. The project manager uses a faster model because it follows a defined workflow and updates state. That&#8217;s coordination, not cognition.</p><p><em>Match model capability to task complexity. Over-powering coordination agents wastes tokens and adds latency.</em></p><h2>6. The Evolution: How the System Grew</h2><h3>Week 1: The Starting Six</h3><p>The system began with six agents: a feature orchestrator, a backend implementer, a frontend implementer, a code optimizer, a code reviewer, and a test writer. The orchestrator tried to do too much: planning, coordinating, and making product decisions all at once.</p><p>The names reflected implementation thinking. &#8220;Backend implementer&#8221; sounds like a function call. &#8220;Feature orchestrator&#8221; sounds like middleware. These weren&#8217;t just labels. They shaped how the agents behaved.</p><h3>Week 2: The Communication Crisis</h3><p>The original system stored state in files on disk. Planning artifacts lived in a local directory. State tracking was a markdown file that agents read and updated. This worked for a single feature in isolation. It broke the moment anything went wrong. A failed step, a context window limit, a session restart.</p><p>The turning point was realizing that GitHub Issues and Pull Requests are already a communication layer designed for multi-person coordination. They have comments, labels, project boards, state tracking, and an API for programmatic updates.</p><p>I shifted all artifacts to Issue and PR comments. State tracking moved to a single updatable comment via the GitHub API. Planning artifacts posted to the Issue. Implementation artifacts posted to the PR.</p><p>This was the single biggest improvement in the system&#8217;s reliability. Not because GitHub is a better file system, but because it&#8217;s a communication layer that already handles persistence, visibility, linking artifacts to context, and surviving session restarts.</p><h3>Week 3: The Specialization Expansion</h3><p>The system grew from 6 to 12 agents. The most important additions were the architect and the product manager.</p><p>The architect was the breakthrough. Before it existed, the backend developer was simultaneously deciding what to build and how to build it. Separating architectural decisions from implementation eliminated an entire class of coherence problems. The architect reasons about data models, API contracts, and system boundaries. The developer reads that blueprint and implements it. Each does one thing well.</p><p>The product manager created a similar separation: what the user needs vs. what the system needs. The PM reviews all plans through a user-centric lens. Without it, technical elegance sometimes won over user value.</p><h3>Week 4: The Naming Revelation</h3><p>I renamed &#8220;feature-orchestrator&#8221; to &#8220;project-manager&#8221; and &#8220;backend-implementer&#8221; to &#8220;backend-developer.&#8221;</p><p>This sounds trivial. It wasn&#8217;t.</p><p>Names shape behavior. &#8220;Implementer&#8221; tries to implement. It&#8217;s a verb, an action, a narrow mandate. &#8220;Developer&#8221; thinks about development more holistically. The same agent definition with a name change produced noticeably different outputs. The &#8220;backend-developer&#8221; more naturally considered edge cases and integration points that the &#8220;backend-implementer&#8221; had ignored.</p><p>Similarly, &#8220;feature-orchestrator&#8221; sounded like infrastructure. &#8220;Project-manager&#8221; sounded like a role with judgment and responsibility. The agent started making better sequencing decisions.</p><h3>Weeks 5-6: Quality Layers and Hardening</h3><p>The final evolution added the code simplifier and the quality checker, and introduced system-wide quality checks, where verification must run on the entire codebase, not just changed files. Early versions also tried to parallelize implementation (backend and frontend simultaneously), which failed because the frontend depends on backend types. Understanding which steps are truly independent took weeks of trial and error. By week six, features started shipping end-to-end.</p><p>Key lesson: You cannot design a multi-agent system from scratch. You grow it. Start with minimum viable orchestration and add complexity only when you hit a specific failure mode.</p><h2>7. What Didn&#8217;t Work (And Still Doesn&#8217;t)</h2><p>Honest assessment.</p><p><strong>Token costs are significant.</strong> A 12-agent workflow for a single feature uses substantially more tokens than a single-session implementation. The economics work for complex features that span multiple modules. They don&#8217;t make sense for small changes, bug fixes, or isolated tasks. Knowing when to use the pipeline vs. a single session is itself a skill.</p><p><strong>The orchestrator is a bottleneck.</strong> The project manager runs sequentially by design. It can&#8217;t delegate Phase 2 work until Phase 1 completes. On long workflows, it sometimes loses track of state across extended sessions. Context limits are real. When the orchestrator gets confused, the whole pipeline stalls.</p><p><strong>Parallel planning isn&#8217;t truly parallel.</strong> The sub-agent system has coordination overhead. Three agents spawned &#8220;in parallel&#8221; are faster than running sequentially, but not 3x faster. There&#8217;s setup cost, context loading, and result collection.</p><p><strong>Error recovery is manual.</strong> When an agent fails (a test it can&#8217;t fix, a type error it doesn&#8217;t understand), the project manager doesn&#8217;t always recover gracefully. Human intervention remains the escape hatch. The system is semi-automated with a human on call.</p><p><strong>Agents produce plausible-but-wrong output more often than you&#8217;d expect.</strong> The architect occasionally designs data models that look reasonable but miss an existing pattern in the codebase. The backend developer sometimes generates an API contract that doesn&#8217;t match what the frontend needs. These aren&#8217;t hallucinations in the obvious sense. They&#8217;re coherent, well-structured, and wrong. The quality gates catch most of it, but human review at the PR stage catches the rest. The system reduces human effort; it doesn&#8217;t eliminate human judgment.</p><p><strong>Agent definitions are tightly coupled to the project.</strong> They reference specific file patterns, naming conventions, import paths, and quality check commands. This isn&#8217;t a portable framework. It&#8217;s a bespoke system for a specific codebase. Porting to another project means rebuilding most of the definitions. The principles transfer; the definitions don&#8217;t.</p><h2>8. Where This Is Heading: From Manual Orchestration to Native Agent Teams</h2><p>Everything described so far is manual orchestration. Agent definitions written by hand. Workflow encoded in markdown. Sequencing managed by a project manager agent following instructions. It works, but it&#8217;s held together by carefully crafted prompts, not by infrastructure.</p><p>Claude Code recently shipped an experimental feature called Agent Teams that provides native infrastructure for exactly this pattern. What Agent Teams adds beyond what I built manually:</p><ul><li><p>Native split-pane display for monitoring all agents at once</p></li><li><p>File locking to prevent write conflicts during parallel work</p></li><li><p>Plan approval workflows where teammates plan in read-only mode until the lead approves</p></li><li><p>Automatic task dependency resolution, so completed tasks unblock downstream work without manual intervention</p></li></ul><p>What this suggests: the pattern of specialized agents with structured workflows is not a hack or a workaround. It&#8217;s the direction the tooling is moving. Claude Code is building Agent Teams. CrewAI, LangGraph, and AutoGen are converging on similar primitives: role specialization, task dependencies, quality gates, scoped delegation. The specifics differ, but the shape is the same.</p><p>Teams that learn orchestration patterns now will be ready to adopt native tooling as it matures. The hard part was never the tooling. It&#8217;s understanding which workflows benefit from parallelism, where gates should go, how to scope agent responsibilities, and how to design the artifact interfaces between them. That understanding transfers regardless of whether you&#8217;re wiring agents together with markdown prompts or with a native team coordination layer.</p><h2>9. The Orchestration Imperative</h2><p>AI agent orchestration, not single-agent prompting, is the productivity lever engineering teams should invest in learning.</p><p>The gap between &#8220;AI writes code&#8221; and &#8220;AI delivers features&#8221; is a systems design problem. The models are capable enough. What&#8217;s missing is the organizational layer: who does what, in what order, with what inputs, through what gates, producing what outputs.</p><p>You don&#8217;t need 12 agents to start. Start with 3: a planner, a builder, and a reviewer. Add specialization when you hit a specific failure mode. When the planner is simultaneously making product decisions and architectural decisions, split it into two agents. When quality keeps slipping, add a dedicated checker. When the builder is deciding what to build while building it, add an architect. Grow the system; don&#8217;t design it from scratch.</p><p>The principles transfer across any tooling. Constraints over capabilities. Gates over trust. Artifacts over conversation. Scoped changes with global verification. Model selection as a lever, not an afterthought.</p><p>The next time you watch an AI agent generate code, ask yourself: who reviews this? What happens next? Where does it go? If you don&#8217;t have answers, you have an orchestration problem.</p>]]></content:encoded></item></channel></rss>