<?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[Trevin’s Notes]]></title><description><![CDATA[Writing about AI, product, and the teams that ship.]]></description><link>https://trevinsays.com</link><image><url>https://substackcdn.com/image/fetch/$s_!yRzs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3400bb0b-8cc3-40c7-b7ab-0cf5f45847f8_1170x1170.png</url><title>Trevin’s Notes</title><link>https://trevinsays.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 12 Jun 2026 01:10:34 GMT</lastBuildDate><atom:link href="https://trevinsays.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Trevin Chow]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[trevinsays@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[trevinsays@substack.com]]></itunes:email><itunes:name><![CDATA[Trevin Chow]]></itunes:name></itunes:owner><itunes:author><![CDATA[Trevin Chow]]></itunes:author><googleplay:owner><![CDATA[trevinsays@substack.com]]></googleplay:owner><googleplay:email><![CDATA[trevinsays@substack.com]]></googleplay:email><googleplay:author><![CDATA[Trevin Chow]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[10 Principles for Agent-Native CLIs]]></title><description><![CDATA[Designing CLIs when agents are the primary user]]></description><link>https://trevinsays.com/p/10-principles-for-agent-native-clis</link><guid isPermaLink="false">https://trevinsays.com/p/10-principles-for-agent-native-clis</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Fri, 01 May 2026 14:30:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kaGr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png" 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_!kaGr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kaGr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png 424w, https://substackcdn.com/image/fetch/$s_!kaGr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png 848w, https://substackcdn.com/image/fetch/$s_!kaGr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png 1272w, https://substackcdn.com/image/fetch/$s_!kaGr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kaGr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png" width="1264" height="848" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:848,&quot;width&quot;:1264,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1972007,&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;:true,&quot;internalRedirect&quot;:&quot;https://trevinsays.com/i/196087109?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.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_!kaGr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png 424w, https://substackcdn.com/image/fetch/$s_!kaGr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png 848w, https://substackcdn.com/image/fetch/$s_!kaGr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png 1272w, https://substackcdn.com/image/fetch/$s_!kaGr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa808e7a7-ebe0-4708-a5b1-f45782632de4_1264x848.png 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>Last month I wrote <a href="https://trevinsays.com/p/7-principles-for-agent-friendly-clis">7 Principles for Agent-Friendly CLIs</a>. Since then I&#8217;ve been deep in CLI work, watching agents use them, and seeing them break in interesting ways.</p><p>Mid-April, Cloudflare published <a href="https://blog.cloudflare.com/cf-cli-local-explorer/">The CLI for all of Cloudflare</a>, describing how they rebuilt Wrangler around a TypeScript schema that generates the CLI, the SDKs, the Terraform provider, and the MCP server from one source. Their Code Mode MCP serves their entire ~3,000-operation API in under 1,000 tokens. They added <code>/cdn-cgi/explorer/api</code>, an OpenAPI-shaped runtime endpoint for agents. And they enforce naming rules across the entire CLI surface: always <code>get</code>, never <code>info</code>; always <code>--force</code>, never <code>--skip-confirmations</code>; always <code>--json</code>. Their framing for why: &#8220;manually enforcing consistency through reviews is Swiss cheese.&#8221;</p><p>Shortly after, HeyGen launched <a href="https://github.com/heygen-com/heygen-cli">their CLI</a>, and I&#8217;ve been using it heavily since. Generating videos through agents, polling jobs, routing artifacts to webhooks. The practical experience is what earned it a spot here. Plenty of companies ship CLIs; this one&#8217;s been the most agent-pleasant I&#8217;ve used.</p><p>The original 7 principles I wrote about were defensive: the things a CLI has to get right, or agents pay for it on every call. Don&#8217;t hang on a TTY check, return JSON, make errors actionable, bound the output. That layer is still necessary but not enough.</p><p>The next layer is about <em>compounding</em> instead of <em>not breaking</em>. The CLI gets more useful the more agents use it, because agents come with persistent identity, asynchronous workflows, output that has to land somewhere, and friction that maintainers should hear about.</p><p>The 10 principles below come from my own CLI work (new project coming soon!) alongside what Cloudflare and HeyGen have published. Organized into 2 tiers. Five condense the original 7; five are new.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2><strong>Tier 1: Table Stakes</strong></h2><p><strong>Don&#8217;t break the agent.</strong> Agents are good at figuring things out, but when these aren&#8217;t met, the deck is stacked against them. Every gap costs more tokens, more retries, and more failure modes that don&#8217;t surface until production.</p><h3>1. Non-interactive by default</h3><p>Commands have to run without interactive prompts when an agent invokes them. When a subagent spawns a background process, there&#8217;s nothing answering the prompt. The command hangs.</p><pre><code># Hangs forever waiting for a confirmation that will never come
$ mycli post delete post_8f2a &lt; /dev/null
Are you sure you want to delete post_8f2a? [y/N]: ^C
&#8203;
# With --force: bypasses the prompt, agent gets through cleanly
$ mycli post delete post_8f2a --force
{&#8221;deleted&#8221;:&#8221;post_8f2a&#8221;}</code></pre><p><strong>What good looks like:</strong> <code>--no-input</code> or equivalent on every command that might prompt; honest TTY detection that treats non-TTY as headless; <code>--yes</code> for confirmation bypass; structured input via flags or files for anything you used to collect through interactive menus. Cloudflare standardizes on <code>--force</code> for destructive bypass and explicitly bans <code>--skip-confirmations</code>. Pick the convention, then enforce it.</p><p>Silent hanging on a prompt is a blocker; inconsistent prompt-bypass behavior across subcommands is friction; a comprehensive non-interactive mode the agent can rely on without per-command lookups is the optimization target.</p><h3>2. Structured, parseable output</h3><p>A nicely aligned table with ANSI colors is for humans. An agent extracting a post ID needs JSON.</p><pre><code># Data on stdout, parseable directly with jq
$ mycli post list --json | jq &#8216;.posts[0].id&#8217;
&#8220;post_8f2a&#8221;
&#8203;
# Errors go to stderr, exit codes signal failure class
$ mycli post get post_does_not_exist --json
$ echo $?
4
# stderr &#8594; &#8220;error: post not found: post_does_not_exist&#8221;</code></pre><p><strong>What good looks like:</strong> <code>--json</code> on every data-returning command; exit code 0 for success, non-zero for failure with a stable taxonomy if you can manage it; results to stdout, diagnostics to stderr; ANSI suppressed when output isn&#8217;t a terminal. The newer wrinkle, from Cloudflare: pick <em>one</em> flag. Always <code>--json</code>, not <code>--format=json</code> for some commands and <code>--output json</code> for others. Inconsistency at this layer is its own category of brokenness.</p><p>No structured output at all is a blocker; coverage gaps where some commands are JSON-capable and others aren&#8217;t is friction; uniform <code>--json</code> across the CLI with clean stdout/stderr separation and a documented exit code taxonomy is the optimization target.</p><h3>3. Errors that teach, and enumerate</h3><p>The original principle was &#8220;fail fast with actionable errors.&#8221; That still holds, with one refinement I missed the first time. When the failure is &#8220;you passed an invalid value for X,&#8221; the error should include the <em>valid set</em>.</p><pre><code># Unhelpful: agent has to read --help, parse, guess, retry
$ mycli post create --json --visibility=secret --content=&#8221;hi&#8221;
error: invalid visibility
&#8203;
# Better: error names the valid set, agent self-corrects in one retry
$ mycli post create --json --visibility=secret --content=&#8221;hi&#8221;
error: --visibility must be one of: public, private, unlisted (got: &#8220;secret&#8221;)</code></pre><p><code>error: --visibility must be one of: public, private, unlisted (got: "secret")</code> is worth more than <code>error: invalid visibility</code>. The agent self-corrects from the first message in one retry. From the second, it has to read the help text, parse it, and guess. HeyGen&#8217;s CLI applies this consistently: pass an unknown delivery scheme and you get a structured refusal naming what is supported.</p><p>The pattern generalizes. Any time your CLI rejects user input against an enum, an enum-shaped resource list, or a schema, surface the enumeration in the error. Errors are the highest-signal context an agent gets, because they fire exactly when the agent doesn&#8217;t know what to do next.</p><p><strong>What good looks like:</strong> errors validated early, before side effects; correct invocation syntax in the error text; valid values enumerated when an enum is the cause; concrete examples instead of stack traces.</p><p>Silent or vague failures are a blocker; errors that name the problem but not the solution are friction; errors that include the valid set and a working invocation are the optimization target.</p><h3>4. Safe retries and explicit mutation boundaries</h3><p>Agents retry. Humans glance at a duplicate row and notice; agents don&#8217;t.</p><pre><code># Idempotent create &#8212; second call returns the existing resource, not a duplicate
$ mycli post create --json --content=&#8221;hello world&#8221;
{&#8221;id&#8221;:&#8221;post_8f2a&#8221;,&#8221;existing&#8221;:false}
$ mycli post create --json --content=&#8221;hello world&#8221;
{&#8221;id&#8221;:&#8221;post_8f2a&#8221;,&#8221;existing&#8221;:true}
&#8203;
# Destructive ops require an explicit flag; --dry-run shows what would happen
$ mycli post delete post_8f2a --dry-run
{&#8221;would_delete&#8221;:&#8221;post_8f2a&#8221;,&#8221;status&#8221;:&#8221;dry_run&#8221;}</code></pre><p><strong>What good looks like:</strong> idempotency tokens or natural keys for create operations, so a retried <code>create</code> returns the existing resource instead of a duplicate; <code>--dry-run</code> for anything consequential; explicit, non-default flags for destructive operations; identifiers returned in every mutation response so the agent has something to reference on the next call.</p><p>The new wrinkle is async, which I&#8217;ll come back to in principle 8. Retries on a long-running operation aren&#8217;t just about idempotency at submission; they&#8217;re about idempotency across the whole submit-poll-collect arc. If the agent&#8217;s first invocation submits a job and then loses connection mid-poll, the second invocation needs to find the in-flight job, not start a new one. A persistent job ledger solves this.</p><p>Silent duplication or state corruption on retry is a blocker; destructive commands that are scriptable without preview are friction; idempotent mutations, durable job state, and explicit destructive flags are the optimization target.</p><h3>5. Bounded responses, at every layer</h3><p>Tokens cost money and context. Big outputs are sometimes justified, but the default should be narrow.</p><pre><code># Default page size is bounded; truncation tells the agent how to narrow
$ mycli post list --json
{&#8221;posts&#8221;:[...20 items...],&#8221;truncated&#8221;:true,&#8221;hint&#8221;:&#8221;add --limit=N or --filter=author:...&#8221;}
&#8203;
# Cursor for explicit continuation
$ mycli post list --json --cursor=abc123
{&#8221;posts&#8221;:[...],&#8221;next&#8221;:null}</code></pre><p>The original principle covered runtime output: <code>list</code> returning ten thousand rows, <code>logs</code> dumping forever. Cloudflare added a layer the original missed: the <em>tool description surface itself</em> costs tokens. Their Code Mode MCP serves over 3,000 operations in under 1,000 tokens. Most MCP servers I&#8217;ve seen burn 1,000 tokens on a single tool&#8217;s description.</p><p>Both layers matter. A bloated MCP description never gets read by a human, but every agent that loads it pays the toll on every call.</p><p><strong>What good looks like:</strong> filtering, pagination, and limits on every list-style command; concise vs. detailed modes; truncation messages that teach the agent how to narrow the next query; summary-before-detail responses. For MCP wrappers: a budget per tool description, audited at build time, not &#8220;however much explanation felt natural.&#8221;</p><p>Routine commands dumping unbounded output are a blocker; broad defaults with available narrowing are friction; bounded defaults that guide better queries plus an MCP surface where each tool&#8217;s description fits in a tweet are the optimization target.</p><div><hr></div><h2><strong>Tier 2: Compounding</strong></h2><p><strong>Empower the agent.</strong> Tier 1 keeps you in the game. Tier 2 makes the CLI better the more it gets used. These are the principles I didn&#8217;t see when I wrote the original and feel obvious now.</p><h3>6. Cross-CLI vocabulary consistency</h3><p>This is the principle I&#8217;m most certain about, and the one most under-stated in the original.</p><p>Agents don&#8217;t memorize one CLI at a time. They build a generalized model of what CLIs do, drawn from every CLI they&#8217;ve seen. When your tool uses <code>info</code> for what every other tool calls <code>get</code>, the agent doesn&#8217;t fail; it succeeds slowly, with extra retries, after burning tokens on <code>--help</code>. Multiply that across thousands of agent invocations per week and the cost is real.</p><pre><code># Conforming to the convention &#8212; agents recognize these immediately
$ wrangler kv namespace list --json
$ heygen videos list --json
$ mycli posts list --json
&#8203;
# Off-convention versions an agent has to relearn for each tool
$ mycli posts ls               # use list, not ls
$ mycli posts info abc         # use get, not info
$ mycli post delete abc \
    --skip-confirmations       # use --force, not --skip-*
$ mycli post list \
    --format=json              # use --json, not --format=json</code></pre><p>Cloudflare made this explicit. Their schema-layer rules:</p><ul><li><p>Always <code>get</code>, never <code>info</code></p></li><li><p>Always <code>list</code>, never <code>ls</code></p></li><li><p>Always <code>--force</code>, never <code>--skip-confirmations</code></p></li><li><p>Always <code>--json</code>, never <code>--format=json</code></p></li></ul><p>The framing they used is the right one: &#8220;manually enforcing consistency through reviews is Swiss cheese.&#8221; Vocabulary consistency has to be enforced mechanically, at the codegen or schema layer, because human review will always let edge cases slip.</p><p>The principle generalizes beyond Cloudflare&#8217;s specific list. Pick the convention the broader community already uses (Unix <code>--yes</code> for skip-prompt, <code>--limit</code> for pagination, the <code>get</code>/<code>list</code>/<code>create</code>/<code>update</code>/<code>delete</code> verb set), and don&#8217;t deviate without strong reason. Where you do have to invent vocabulary because the concept is genuinely new, name it consistently across your own commands and document it once, prominently.</p><p><strong>What good looks like:</strong> a documented naming policy; a static check in CI that fails on banned verbs and flag aliases; canonical names that match the dominant convention in your language community.</p><p>Verbs and flags that contradict universal conventions (<code>info</code> instead of <code>get</code>, <code>--skip-confirmations</code> instead of <code>--force</code>) are a blocker; internal inconsistency between your own subcommands is friction; schema-enforced vocabulary that an agent trained on neighboring CLIs recognizes on first encounter is the optimization target.</p><h3>7. Three-layer introspection</h3><p>The original principle here was &#8220;progressive help discovery&#8221;: top-level <code>--help</code> lists commands, subcommand <code>--help</code> shows usage. That&#8217;s still true, but it&#8217;s now the bottom layer of a three-layer stack. Each layer answers a different question.</p><pre><code># Layer 1 &#8212; what does this command do? (human-shaped text)
$ mycli --help
mycli  Manage posts and accounts.
&#8203;
USAGE: mycli &lt;command&gt; [flags]
&#8203;
COMMANDS:
  post      Manage posts
  account   Manage accounts
  jobs      Inspect async jobs
  profile   Manage saved configurations
  feedback  Send feedback upstream
&#8203;
# Layer 2 &#8212; what&#8217;s the shape of everything? (structured, versioned)
$ mycli agent-context | jq &#8216;.schema_version, (.commands | keys)&#8217;
&#8220;1&#8221;
[&#8221;account&#8221;,&#8221;feedback&#8221;,&#8221;jobs&#8221;,&#8221;post&#8221;,&#8221;profile&#8221;]
&#8203;
$ mycli agent-context | jq &#8216;.commands.post.subcommands.create.flags&#8217;
{
  &#8220;--content&#8221;:     {&#8221;type&#8221;:&#8221;string&#8221;,&#8221;required&#8221;:true},
  &#8220;--visibility&#8221;:  {&#8221;type&#8221;:&#8221;enum&#8221;,&#8221;values&#8221;:[&#8221;public&#8221;,&#8221;private&#8221;,&#8221;unlisted&#8221;]},
  &#8220;--json&#8221;:        {&#8221;type&#8221;:&#8221;bool&#8221;,&#8221;default&#8221;:false},
  &#8220;--dry-run&#8221;:     {&#8221;type&#8221;:&#8221;bool&#8221;,&#8221;default&#8221;:false}
}
&#8203;
# Layer 3 &#8212; when would I use this? (long-form skill manifest)
$ cat $(mycli skill-path)/SKILL.md
# Publishing a post end-to-end
1. Save a profile for your default audience.
2. Create the post with --wait so the artifact returns synchronously.
3. Use --deliver=webhook:... to ship it downstream.</code></pre><p><code>--help</code> is necessary because some agents will hit it before anything else, and because a human dropping into the terminal needs it. <code>agent-context</code> is what an introspecting agent should actually consume: versioned, machine-readable JSON describing the full shape. Cloudflare&#8217;s <code>/cdn-cgi/explorer/api</code> is the runtime version of this idea; the equivalent for a CLI is a top-level subcommand. The CLIs I&#8217;ve been generating ship <code>&lt;cli&gt; agent-context</code> with a <code>schema_version</code> field, exactly so the consuming agent can detect breaking shape changes.</p><p>The skill manifest is the third layer: long-form prose teaching the agent how to <em>compose</em> operations into useful workflows. HeyGen ships a <a href="https://github.com/heygen-com/skills">skills repo</a> of SKILL.md files alongside their CLI, and Cloudflare&#8217;s MCP server is the equivalent: a description of the CLI from the perspective of the tasks an agent might use it for, not the commands it exposes.</p><p><strong>What good looks like:</strong> all three layers present, each versioned, each kept in sync with the implementation by the same generation step.</p><p>A CLI with only <code>--help</code> and nothing structured is a blocker; an <code>agent-context</code> that exists but isn&#8217;t versioned, or skill manifests that drift from the actual command surface, is friction; three layers, schema-versioned, machine-validated against the real implementation is the optimization target.</p><h3>8. Async-aware execution</h3><p>Most CLIs treat async APIs the way the underlying HTTP endpoint does: submit returns a job ID, poll returns a status, that&#8217;s the agent&#8217;s problem. Two failure modes follow. Either the agent writes its own poll loop (wasting tokens and getting it subtly wrong), or it doesn&#8217;t, and the workflow fails because the result wasn&#8217;t ready when the next step ran.</p><p>The fix is <code>--wait</code>.</p><pre><code># Without --wait: the agent has to write its own polling loop
$ mycli video render --script=story.txt
{&#8221;job_id&#8221;:&#8221;job_8f2a&#8221;,&#8221;status&#8221;:&#8221;queued&#8221;}
$ mycli video status job_8f2a
{&#8221;job_id&#8221;:&#8221;job_8f2a&#8221;,&#8221;status&#8221;:&#8221;running&#8221;,&#8221;progress&#8221;:0.34}
$ mycli video status job_8f2a
{&#8221;job_id&#8221;:&#8221;job_8f2a&#8221;,&#8221;status&#8221;:&#8221;running&#8221;,&#8221;progress&#8221;:0.71}
$ mycli video status job_8f2a
{&#8221;job_id&#8221;:&#8221;job_8f2a&#8221;,&#8221;status&#8221;:&#8221;complete&#8221;,&#8221;url&#8221;:&#8221;https://.../out.mp4&#8221;}
&#8203;
# With --wait: same workflow, one command, no polling logic
$ mycli video render --script=story.txt --wait
{&#8221;job_id&#8221;:&#8221;job_8f2a&#8221;,&#8221;status&#8221;:&#8221;complete&#8221;,&#8221;url&#8221;:&#8221;https://.../out.mp4&#8221;}
&#8203;
# The job ledger survives across invocations
$ mycli jobs list
JOB_ID    STATUS    KIND          STARTED              DURATION
job_8f2a  complete  video.render  2026-04-30T18:22:11  37s
job_7c14  running   video.render  2026-04-30T18:24:02  12s</code></pre><p><code>--wait</code> blocks until completion. Behind it, the CLI runs a poll loop with backoff and writes job state to a local ledger. A <code>jobs</code> command exposes the ledger: <code>jobs list</code> shows in-flight and recent jobs, <code>jobs get &lt;id&gt;</code> retrieves status, <code>jobs prune</code> clears old entries.</p><p>This collapses several agent turns into one. Same workflow, fewer tokens, no polling logic the agent has to get right. The job ledger matters for retries (see principle 4): if the agent&#8217;s <code>--wait</code> invocation gets killed mid-poll, the next invocation finds the existing job rather than submitting a new one.</p><p><strong>What good looks like:</strong> <code>--wait</code> on every submitting command that wraps an async API; a polling implementation with exponential backoff and jitter; a persistent job ledger (<code>~/.&lt;cli&gt;/jobs.jsonl</code> is fine); a <code>jobs</code> parent command exposing list/get/prune.</p><p>Async commands that return a job ID and stop, forcing the agent to write a polling loop, are a blocker; <code>--wait</code> that exists but doesn&#8217;t survive disconnect, or no way to inspect or recover in-flight jobs, is friction; <code>--wait</code> on every async submission with a durable, recoverable ledger is the optimization target.</p><h3>9. Persistent identity through profiles</h3><p>Agents don&#8217;t show up once. They show up tomorrow, and the day after, and a week from now, in a different shell, with the same underlying intent and a different specific input. Stateless leaf-shaped CLIs make every invocation re-specify the same eight flags.</p><p>The fix is a profile system.</p><pre><code># Save a named bundle of configuration once
$ mycli profile save my-podcast \
    --avatar=lila \
    --voice=warm-en \
    --webhook=https://podcast.example.com/hook
profile saved: my-podcast
&#8203;
# Reuse it on every subsequent invocation
$ mycli video create --profile=my-podcast --script=ep_42.txt
{&#8221;job_id&#8221;:&#8221;job_8f2a&#8221;,&#8221;using_profile&#8221;:&#8221;my-podcast&#8221;}
&#8203;
# Explicit flags win over profile values
$ mycli video create --profile=my-podcast --voice=energetic --script=...
{&#8221;job_id&#8221;:&#8221;job_a91&#8221;,&#8221;using_profile&#8221;:&#8221;my-podcast&#8221;,&#8221;voice&#8221;:&#8221;energetic&#8221;}
&#8203;
# Surfaced through introspection so agents discover available identities
$ mycli agent-context | jq &#8216;.available_profiles&#8217;
[&#8221;my-podcast&#8221;,&#8221;client-demo&#8221;,&#8221;weekly-recap&#8221;]</code></pre><p>The precedence I&#8217;d recommend: explicit flag &gt; environment variable &gt; profile &gt; default. Surfacing the available profile names in <code>agent-context</code> matters: it&#8217;s how an introspecting agent discovers which identities exist without parsing a config file.</p><p>Once an agent has a profile, the per-invocation flag burden drops to the parts that actually vary, the cross-session identity is durable without the agent having to write its own state file, and the human and the agent share the same configuration vocabulary.</p><p><strong>What good looks like:</strong> <code>profile save / use / list / show / delete</code> subcommands; <code>--profile &lt;name&gt;</code> as a persistent root flag; profile contents shown in <code>agent-context</code>; a stable storage location like <code>~/.&lt;cli&gt;/profiles.json</code>.</p><p>No way to persist configuration is a blocker; profiles that exist but aren&#8217;t discoverable via introspection are friction; named profiles with clean precedence, surfaced through <code>agent-context</code>, are the optimization target.</p><h3>10. Two-way I/O</h3><p>The original principle 6 (composable and predictable structure) covered stdin/stdout pipelining. That&#8217;s still true. But agents don&#8217;t only consume CLIs through pipes, and the CLI doesn&#8217;t only emit through stdout. There are two new mechanisms worth adding: a way for the CLI to emit artifacts where the agent actually needs them, and a way for the agent to report friction back.</p><pre><code># --deliver routes the artifact to where it&#8217;s actually needed
$ mycli video create --script=story.txt --deliver=stdout
{&#8221;video_url&#8221;:&#8221;https://.../out.mp4&#8221;,&#8221;duration_s&#8221;:47}
&#8203;
$ mycli video create --script=story.txt --deliver=file:./out.mp4
{&#8221;delivered_to&#8221;:&#8221;file:./out.mp4&#8221;,&#8221;bytes&#8221;:4823091}
&#8203;
$ mycli video create --script=story.txt \
    --deliver=webhook:https://example.com/hook
{&#8221;delivered_to&#8221;:&#8221;webhook:https://example.com/hook&#8221;,&#8221;status&#8221;:201}
&#8203;
# Unknown schemes get a structured refusal naming what&#8217;s supported
$ mycli video create --script=... --deliver=s3:bucket/key
error: --deliver scheme must be one of: stdout, file:&lt;path&gt;, webhook:&lt;url&gt;
&#8203;
# feedback closes the loop in the other direction
$ mycli feedback &#8220;the --tier flag rejects &#8216;enterprise&#8217; but the docs list it as valid&#8221;
feedback recorded locally (1 entry)
&#8203;
$ mycli feedback list
2026-04-30T18:31:02  the --tier flag rejects &#8216;enterprise&#8217; but the docs list it as valid
&#8203;
# Optional upstream POST when configured
$ MYCLI_FEEDBACK_ENDPOINT=https://maintainers.example.com/cli-feedback \
    mycli feedback &#8220;race condition in --wait when job completes during the first poll&#8221;
feedback recorded locally and sent upstream (status: 200)</code></pre><p><code>--deliver</code> routes the artifact directly: stdout, a file path, or a webhook URL. A video that lands as an MP4 at a known path, or POSTs to a webhook the agent already set up, is one fewer hop than &#8220;stdout to a temp file then move.&#8221; File sinks write atomically; webhook sinks POST and surface HTTP status; unknown schemes return a structured refusal. HeyGen&#8217;s framing for this was &#8220;fewer steps between agent output and a finished artifact.&#8221;</p><p><code>feedback</code> runs the other way. Agents hit friction constantly: flags rejected for the wrong reason, race conditions in async paths, error messages that don&#8217;t enumerate. Most of it never gets reported because there&#8217;s no channel: the agent retries, eventually succeeds, the maintainer never learns the call was painful. <code>&lt;cli&gt; feedback "..."</code> writes locally by default; with an endpoint configured, the entry POSTs upstream too.</p><p><strong>What good looks like:</strong> <code>--deliver</code> with stdout/file/webhook sinks and structured refusal on unknown schemes; <code>feedback &lt;text&gt;</code> with local JSONL by default and configurable upstream POST; both surfaced in <code>agent-context</code> so the agent knows whether the upstream channel exists.</p><p>Output that is stdout-only with no way to report friction is a blocker; output sinks that exist but aren&#8217;t atomic, or feedback that exists but the upstream channel isn&#8217;t discoverable, is friction; structured delivery and discoverable feedback, both versioned in introspection, are the optimization target.</p><div><hr></div><h2><strong>A note on the architecture beneath these</strong></h2><p>Most of Tier 2 is hard to apply by hand and easy to apply mechanically. Cross-CLI vocabulary, three-layer introspection, async detection, profile precedence, delivery routing: every one of them is the kind of thing you&#8217;d be inconsistent about across a dozen subcommands if you wrote them by hand, and trivially consistent about if a schema or codegen pipeline writes them.</p><p>That&#8217;s why Cloudflare&#8217;s TypeScript schema is the load-bearing detail of their post, not a side note. Generating the CLI, the SDKs, the Terraform provider, and the MCP server from one source is what makes ten principles hold across thousands of operations without drift. I&#8217;ve been applying the same approach in projects I&#8217;m working on right now. Everything in Tier 2 lands on each generated CLI for free, because a template wrote it, not a human.</p><p>If you&#8217;re maintaining a hand-written CLI of any size, the consistency bar will keep rising, and the only way to keep up is to move enforcement out of code review and into the schema or the build.</p><div><hr></div><h2><strong>Design for agents first</strong></h2><p>Every principle here makes the CLI better for humans too. None of these are concessions to agents. They&#8217;re good CLI design we used to be able to skip because humans worked around the gaps.</p><p>There&#8217;s a deeper assumption underneath all of it. The classic <a href="https://clig.dev">Command Line Interface Guidelines</a> treat a human at a terminal as the primary user, with agents as a tolerated secondary audience. That&#8217;s no longer the right default. Cloudflare puts it directly in <a href="https://blog.cloudflare.com/cf-cli-local-explorer/">their post</a>: &#8220;Increasingly, agents are the primary customer of our APIs.&#8221; Their whole schema approach is built around that. HeyGen launched their CLI with &#8220;agent&#8221; in the marketing copy. Design for agents first, and humans benefit. Designing for humans first and bolting on agent support is what produces the inconsistent, prompt-prone, stdout-only CLIs the first five principles exist to correct.</p><p>These 10 are what I&#8217;m currently designing against. They&#8217;ll keep evolving &#8212; I had to replace the original seven a few weeks after publishing them, and the same thing will probably happen here.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/10-principles-for-agent-native-clis?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/10-principles-for-agent-native-clis?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trevinsays.com/p/10-principles-for-agent-native-clis?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div><hr></div><p><em>This framework comes from three places: the CLIs I&#8217;ve been building and generating in the last several weeks, Cloudflare&#8217;s <a href="https://blog.cloudflare.com/cf-cli-local-explorer/">The CLI for all of Cloudflare</a> (2026-04-13), and HeyGen&#8217;s <a href="https://github.com/heygen-com/heygen-cli">CLI launch</a> and accompanying <a href="https://github.com/heygen-com/skills">skills repo</a>. The original <a href="https://trevinsays.com/p/7-principles-for-agent-friendly-clis">seven principles</a> are still online; treat this post as their replacement, not a sequel.</em></p>]]></content:encoded></item><item><title><![CDATA[7 Principles for Agent-Friendly CLIs]]></title><description><![CDATA[A design guide for your CLI's other consumer]]></description><link>https://trevinsays.com/p/7-principles-for-agent-friendly-clis</link><guid isPermaLink="false">https://trevinsays.com/p/7-principles-for-agent-friendly-clis</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Thu, 26 Mar 2026 19:28:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!odLk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png" 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_!odLk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!odLk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png 424w, https://substackcdn.com/image/fetch/$s_!odLk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png 848w, https://substackcdn.com/image/fetch/$s_!odLk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png 1272w, https://substackcdn.com/image/fetch/$s_!odLk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!odLk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png" width="1264" height="848" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:848,&quot;width&quot;:1264,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:913694,&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;:true,&quot;internalRedirect&quot;:&quot;https://trevinsays.com/i/192240547?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.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_!odLk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png 424w, https://substackcdn.com/image/fetch/$s_!odLk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png 848w, https://substackcdn.com/image/fetch/$s_!odLk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png 1272w, https://substackcdn.com/image/fetch/$s_!odLk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd94fd667-85bd-40a9-8640-f1b6d75ab5d6_1264x848.png 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><em>&#11088;&#65039; Note: This original article has been superseded by a more updated version: <a href="https://trevinsays.com/p/10-principles-for-agent-native-clis">10 Principles for Agent Native CLIs</a>.</em></p><p>I&#8217;ve been building a couple of CLIs as side projects recently, and I wanted them to be agent-first from the start. Not &#8220;an agent could probably use this&#8221; but optimized for how agents work. So I went looking for guidance.</p><p>What I found was exactly what you&#8217;d expect: great CLI design resources that are entirely about humans. The <a href="https://clig.dev/">Command Line Interface Guidelines</a> project is excellent. So is <a href="https://clianything.org/">CLI-Anything</a>. But they&#8217;re written for a world where the consumer is a person at a terminal who can read a prompt, make a judgment call, and visually parse a nicely formatted table. Agents can handle some of that when they&#8217;re running interactively, but the moment an agent or skill spawns a background subagent, interactive CLIs break. There&#8217;s no way to surface an interactive prompt back up through that chain, and both Claude Code and Codex will bail. Colored output wastes tokens. Unbounded responses eat context windows. The assumptions baked into human-first CLI design create real failure modes for agent consumers.</p><p>Anthropic published <a href="https://www.anthropic.com/engineering/writing-tools-for-agents">solid guidance on writing tools for agents</a>, but it&#8217;s tool-design guidance broadly, not CLI-specific. What was missing was a practical rubric for evaluating whether a CLI works well for agents, not whether it technically works at all.</p><p>So I wrote one. I synthesized what I found across those sources with my own experience running agents against CLIs, and landed on seven principles that cover the gap between &#8220;this works&#8221; and &#8220;this works well.&#8221; I also built a <a href="https://github.com/EveryInc/compound-engineering-plugin/pull/391">CLI Agent Readiness Reviewer</a> for the <a href="https://github.com/EveryInc/compound-engineering-plugin">Compound Engineering plugin</a> that evaluates CLI source code against these principles automatically, but more on that later.</p><p>This post walks through all seven. The examples use a fictional <code>blog-cli</code> to keep things concrete without getting tangled in any particular tool&#8217;s specifics.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>Why CLI over MCP?</h2><p>Quick context for anyone wondering why CLIs matter when MCP exists. CLIs are text in, text out, composable by design. LLMs already know common CLI tools from training data, so there&#8217;s zero schema overhead. An MCP server can burn tens of thousands of tokens just loading tool definitions before a single question gets asked. MCP earns its complexity when you need per-user auth and structured governance, but for the tools developers build and use day-to-day, a well-designed CLI is faster, cheaper, and more reliable.</p><p>CLIs still trip agents up in predictable ways. The principles below are where those problems live.</p><h2>A severity rubric, not a scorecard</h2><p>Before getting into the principles, a note on how to use them. This isn&#8217;t pass/fail. Each finding maps to one of three severity levels:</p><p><strong>Blocker</strong> means the issue prevents reliable agent use. The command hangs, requires human intervention, or produces output an agent can&#8217;t recover from. <strong>Friction</strong> means agents can use it, but inefficiently: more retries, wasted tokens, brittle parsing, extra tool calls. <strong>Optimization</strong> means the CLI works fine but could be faster, cheaper, or more reliable for agent consumers.</p><p>The severity also depends on command type. Idempotence is high-value for mutating commands but irrelevant for a streaming log tail. Structured output is a blocker for read/query commands but less critical for a one-off bootstrap wizard. Evaluate by what the command does, not by applying every principle uniformly.</p><div><hr></div><h2>1. Non-interactive by default</h2><p><strong>The principle:</strong> Any command an agent might automate should run without prompts. Interactive mode can still exist for humans, but it should be a convenience layer, not the only path.</p><p>This is the most common blocker I&#8217;ve hit. When a skill spawns a subagent that shells out to a CLI, there&#8217;s no way to surface an interactive prompt back to the user. The command just hangs, waiting for input that will never come. Even in interactive agent sessions, prompts create friction: extra round-trips, ambiguous menu navigation, wasted tokens. If stdin isn&#8217;t a TTY, the command should not prompt. Period.</p><p><strong>What good looks like:</strong></p><pre><code><code># Human at a terminal (TTY detected) &#8212; prompts fill in missing inputs
$ blog-cli publish
? Status? (use arrow keys)
    draft
  &gt; published
    scheduled
? Path to content: my-post.md
Published "My Post" to personal

# Agent or script (no TTY, or --no-input) &#8212; flags only, no prompts
$ blog-cli publish --content my-post.md --yes
Published "My Post" to personal (post_id: post_8k3m)</code></code></pre><p>The fix: support <code>--no-input</code> or <code>--non-interactive</code>, detect TTY vs non-TTY and suppress prompts when stdin isn&#8217;t interactive, accept <code>--yes</code> / <code>--force</code> for confirmation bypass, and take structured input via flags, files, or stdin.</p><p>If you want to verify this works, the test is simple: detach stdin and enforce a timeout.</p><pre><code><code>python3 - &lt;&lt;'PY'
import subprocess, sys

cmd = ["blog-cli", "publish", "--content", "my-post.md"]
try:
    result = subprocess.run(
        cmd,
        stdin=subprocess.DEVNULL,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True,
        timeout=10,
    )
    print("exit:", result.returncode)
    print("PASS: command exited without hanging")
except subprocess.TimeoutExpired:
    print("FAIL: command hung waiting for input")
    sys.exit(1)
PY</code></code></pre><p>A command that hangs waiting for input is a <strong>Blocker</strong>. A command where some prompts can be bypassed but behavior is inconsistent across subcommands is <strong>Friction</strong>. Full flag coverage with a global non-interactive mode is the <strong>Optimization</strong> target.</p><div><hr></div><h2>2. Structured, parseable output</h2><p><strong>The principle:</strong> Commands that return data should expose a stable machine-readable representation.</p><p>Agents need data contracts, not presentation formatting. A nicely aligned table with ANSI colors is great for humans and useless for an agent trying to extract a post ID. If the only output is prose or decorated tables, the agent has to scrape its own tooling, which is brittle and wasteful.</p><p><strong>What good looks like:</strong></p><pre><code><code># Human-readable
$ blog-cli publish --content my-post.md
Published "My Post" to personal
URL: https://personal.blog.dev/my-post
Post ID: post_8k3m

# Machine-readable
$ blog-cli publish --content my-post.md --json
{"title":"My Post","url":"https://personal.blog.dev/my-post","post_id":"post_8k3m","status":"published"}</code></code></pre><p>What to implement: support <code>--json</code> on data-bearing commands, use exit code 0 for success and non-zero for failure, write result data to stdout and diagnostics to stderr, return useful fields (names, URLs, IDs, status), and suppress color, spinners, and decorative output when not attached to a TTY.</p><p>That last point is easy to miss. Plenty of CLIs detect TTY correctly for prompts but still blast ANSI escape codes into piped output. An agent parsing <code>\x1b[32m&#10003; Published\x1b[0m</code> is burning tokens on noise.</p><p>No structured output at all is a <strong>Blocker</strong>. Inconsistent coverage or mixed stdout/stderr is <strong>Friction</strong>. Full <code>--json</code> on all data-bearing commands with clean separation is the <strong>Optimization</strong> target.</p><div><hr></div><h2>3. Fail fast with actionable errors</h2><p><strong>The principle:</strong> When a command fails, the error should teach the agent how to succeed on the next attempt.</p><p>This is where most CLIs are weakest for agents. Humans can infer what went wrong from a vague error message. Agents can&#8217;t. &#8220;Error: missing required arguments&#8221; tells an agent almost nothing. &#8220;Error: --content is required&#8221; tells it exactly what to fix.</p><p><strong>What good looks like:</strong></p><pre><code><code># Bad
$ blog-cli publish
Error: missing required arguments

# Better
$ blog-cli publish
Error: --content is required.
Usage: blog-cli publish --content &lt;file&gt; [--status &lt;status&gt;]
Available statuses: draft, published, scheduled
Example: blog-cli publish --content my-post.md</code></code></pre><p>The good error does four things: names the specific problem, shows the correct invocation shape, suggests valid values, and includes an example. An agent that gets this error can self-correct in one retry. An agent that gets &#8220;missing required arguments&#8221; has to guess, which means extra tool calls, wasted tokens, and a chance of getting it wrong again.</p><p>The implementation side: validate early before side effects, include the correct syntax in error output, suggest valid values when validation fails, and prefer actionable text over raw tracebacks.</p><p>Vague or silent failures are a <strong>Blocker</strong>. Errors that name the problem but not the fix are <strong>Friction</strong>. Errors with the full correction path are the <strong>Optimization</strong> target.</p><div><hr></div><h2>4. Safe retries and explicit mutation boundaries</h2><p><strong>The principle:</strong> Agents retry, resume, and sometimes replay commands. Mutating commands should make that safe when possible, and dangerous mutations should be explicit.</p><p>This matters more for agents than for humans because agents are more likely to retry automatically. A human who runs a command twice will notice the duplicate. An agent operating in a retry loop won&#8217;t, unless the CLI tells it what happened.</p><p><strong>What good looks like:</strong></p><pre><code><code># Repeating the same command doesn't create duplicate work
$ blog-cli publish --content my-post.md
Published "My Post" to personal (post_id: post_8k3m)

$ blog-cli publish --content my-post.md
Already published "My Post" to personal, no changes (post_id: post_8k3m)

# Dangerous mutation is explicit
$ blog-cli posts delete --slug my-post --confirm</code></code></pre><p>The goal isn&#8217;t strict idempotence everywhere. For create/update/deploy commands, making duplicate application a no-op or clearly detectable is high-value. For append/send/trigger commands, exact idempotence may be impossible, but the CLI should at least make mutation boundaries explicit and return identifiers that let an agent determine whether it repeated work.</p><p>Provide <code>--dry-run</code> for consequential mutations, use explicit destructive flags for dangerous operations, and return enough state in success output to verify what happened.</p><p>Retrying a mutating command that silently duplicates or corrupts state is a <strong>Blocker</strong>. Scriptable destructive commands with little preview or state feedback are <strong>Friction</strong>. Safe retries with explicit danger flags and audit-friendly identifiers are the <strong>Optimization</strong> target.</p><div><hr></div><h2>5. Progressive help discovery</h2><p><strong>The principle:</strong> Agents don&#8217;t read a CLI&#8217;s full documentation up front. They probe top-level help, then subcommand help, then examples. Help should support that incremental workflow.</p><p>Think about how an agent explores a CLI. It starts with <code>--help</code> at the top level to understand the command surface. Then it drills into a specific subcommand. It needs to go from &#8220;what can this tool do&#8221; to &#8220;how do I invoke this specific command&#8221; in two calls, not five.</p><p><strong>What good looks like:</strong></p><pre><code><code>$ blog-cli --help
Usage: blog-cli &lt;command&gt;

Commands:
  publish     Publish content
  posts       List and manage posts

$ blog-cli publish --help
Publish a markdown file to your blog.

Options:
  --content   Path to markdown file
  --status    Post status (draft, published, scheduled; default: published)
  --yes       Skip confirmation prompt
  --json      Output as JSON
  --dry-run   Preview without publishing

Examples:
  blog-cli publish --content my-post.md
  blog-cli publish --content my-post.md --status draft
  blog-cli publish --content my-post.md --dry-run</code></code></pre><p>Each subcommand&#8217;s help should include four things: a one-line purpose, a concrete invocation pattern, required arguments or flags, and the most important modifiers or safety flags. If any of those are missing, an agent has to guess or make extra calls to figure out the invocation shape.</p><p>Examples matter more than you&#8217;d think. Anthropic&#8217;s own tool-design guidance shows that concrete examples improve how well agents use tools. A help page with no examples forces the agent to synthesize the invocation from the flag descriptions, which works but burns tokens and invites mistakes.</p><p>Hard-to-discover subcommands or missing <code>--help</code> is a <strong>Blocker</strong>. Help that exists but omits invocation patterns or required arguments is <strong>Friction</strong>. Layered, example-driven help with links to deeper docs is the <strong>Optimization</strong> target.</p><div><hr></div><h2>6. Composable and predictable structure</h2><p><strong>The principle:</strong> Agents solve tasks by chaining commands. They benefit from CLIs that accept stdin, produce clean stdout, and use predictable naming and subcommand patterns.</p><p>Agents are natural pipers. They chain the output of one command into the input of another, same as any shell script. But they&#8217;re less tolerant of inconsistency than humans, because they&#8217;re pattern-matching on structure rather than reading the docs and making judgment calls.</p><p><strong>What good looks like:</strong></p><pre><code><code>cat posts.json | blog-cli posts import --stdin
blog-cli posts list --json | blog-cli posts validate --stdin
blog-cli posts list --status draft --limit 5 --json | jq -r '.[].title'</code></code></pre><p>What to implement: accept input via flags, files, or stdin where it helps automation, support <code>-</code> as a stdin/stdout alias when file paths are involved, keep command structures consistent across related resources, and prefer flags for ambiguous multi-field operations while reserving positional arguments for familiar conventional cases.</p><p>Consistency across subcommands is the subtle one. If <code>blog-cli posts list</code> supports <code>--json</code> but <code>blog-cli posts stats</code> doesn&#8217;t, the agent has to learn the exception rather than applying a pattern. If <code>blog-cli posts list</code> uses <code>--limit</code> but <code>blog-cli comments list</code> uses <code>--max-results</code>, the agent has to remember an arbitrary naming difference instead of reusing what it already knows.</p><p>Commands that can&#8217;t participate in pipelines are a <strong>Blocker</strong>. Inconsistent naming and structure across subcommands are <strong>Friction</strong>. Regular patterns with clean stdin/stdout are the <strong>Optimization</strong> target.</p><div><hr></div><h2>7. Bounded, high-signal responses</h2><p><strong>The principle:</strong> Agents pay a real cost for every extra line of output. Large outputs are sometimes justified, but the CLI should make narrow, relevant responses the default.</p><p>This is the one that most CLI authors don&#8217;t think about because it&#8217;s invisible to human users. A human scrolls past 500 lines of output and visually finds what they need. An agent consumes all 500 lines into its context window, paying for every token, and then has to figure out which lines mattered.</p><p><strong>What good looks like:</strong></p><pre><code><code># Broad but bounded
$ blog-cli posts list --limit 25
Showing 25 of 312 posts
To narrow results: blog-cli posts list --status published --since 7d --limit 10

# More precise
$ blog-cli posts list --tag javascript --status published --since 30d --limit 10 --json</code></code></pre><p>The important design move here is that when the CLI truncates, it teaches the agent how to narrow the query. &#8220;Showing 25 of 312 posts&#8221; plus a suggested narrowing command gives the agent a next step. Dumping all 312 posts gives it a parsing problem.</p><p>Support filtering, pagination, and limits on large result sets. Provide concise vs detailed response modes. When truncating, explain how to narrow or page. Return summaries and identifiers before raw detail.</p><p>A routine query that dumps huge output with no narrowing controls is a <strong>Blocker</strong>. Narrowing that exists but has too-broad defaults is <strong>Friction</strong>. Bounded defaults that teach the next better query are the <strong>Optimization</strong> target.</p><div><hr></div><h2>Making it automatic</h2><p>After writing these principles, I wanted a way to apply them without manually reviewing every CLI I work on. So I built a <a href="https://github.com/EveryInc/compound-engineering-plugin/pull/391">CLI Agent Readiness Reviewer</a> as part of the <a href="https://github.com/EveryInc/compound-engineering-plugin">Compound Engineering plugin</a>. It&#8217;s a review agent that reads your CLI source code, plans, or specs and evaluates them against all seven principles using the severity rubric.</p><p>It&#8217;s framework-aware, so it gives idiomatic recommendations whether you&#8217;re working in Click, argparse, Cobra, clap, Commander, yargs, oclif, or Thor. It distinguishes what matters by command type, so it won&#8217;t flag a streaming command for missing idempotence. And it generates per-finding test assertions, so you can enforce agent-friendliness in CI if you want to go that far.</p><p>The principles guide is bundled as a standalone reference doc in the same PR if you&#8217;d rather just read the rubric and apply it yourself. But if you&#8217;re already using Compound Engineering, the reviewer agent makes it hands-free.</p><h2>Humans &#10084;&#65039; Agents</h2><p>Every principle here makes a CLI better for humans too. Structured output, actionable errors, bounded responses, non-interactive automation paths: these aren&#8217;t concessions to agents at the expense of human experience. They&#8217;re good CLI design that we&#8217;ve been inconsistently applying because humans are forgiving enough to work around the gaps.</p><p>Agents have gotten more forgiving with every model release. They can often infer what a vague error meant, guess at the right flag name, parse messy output well enough to extract what they need. But &#8220;well enough&#8221; costs tokens, burns retries, and introduces failure modes that don&#8217;t need to exist. Designing for agents as a first-class consumer removes that tax, and the CLI ends up better for humans in the process.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/7-principles-for-agent-friendly-clis?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/7-principles-for-agent-friendly-clis?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trevinsays.com/p/7-principles-for-agent-friendly-clis?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Design exploration with AI agents]]></title><description><![CDATA[A workflow for exploring product and UI designs with AI agents]]></description><link>https://trevinsays.com/p/design-exploration-with-ai-agents</link><guid isPermaLink="false">https://trevinsays.com/p/design-exploration-with-ai-agents</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Thu, 05 Mar 2026 04:19:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U8uP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png" 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_!U8uP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U8uP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!U8uP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!U8uP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!U8uP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U8uP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/749916e9-b5e0-4801-944f-935877e98826_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1975864,&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;:true,&quot;internalRedirect&quot;:&quot;https://trevinsays.com/i/189953490?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.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_!U8uP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!U8uP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!U8uP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!U8uP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F749916e9-b5e0-4801-944f-935877e98826_1376x768.png 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>Somewhere in the shift to building with agents, the friction moved. Implementation got faster. The decisions before implementation &#8212; what to build, which direction to take, what it should look like &#8212; didn&#8217;t. When you can build fast, you get to the wrong direction fast too. Rebuilding the code is cheap. What isn&#8217;t cheap: the plans built around it, the user experiences already shipped, the competitive time spent while you corrected course.</p><p>Product discovery, design thinking, prototyping: all of it developed because building was the bottleneck. Now the bottleneck moved. The upstream thinking has to be better, not because rebuilding is hard, but because what gets built around the wrong direction can&#8217;t simply be rewritten.</p><p>The phase that absorbs that pressure most directly is design exploration. It&#8217;s where I&#8217;ve been spending most of my thinking lately.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Design thinking exists because humans converge too early</h2><p>Design thinking, in its more rigorous forms, is a human-centered problem-solving orientation. It starts with people: what do they need, what problems are they experiencing, what assumptions are we carrying that might be wrong? This inverts the usual approach, which starts with what&#8217;s technically possible and looks for a problem that fits.</p><p>IDEO&#8217;s model, the Design Council&#8217;s Double Diamond, and Stanford d.school&#8217;s model share a common structural rhythm: expand thinking before narrowing it. Discover broadly before defining the problem. Generate options before committing to one. The process isn&#8217;t linear; teams loop back, revisit, run phases at once. What the structure is compensating for is a specific tendency: humans grab the first plausible direction and commit. Designers call this premature convergence. You pick the path that feels viable, start building, and only later discover there were better answers you never considered.</p><p>These frameworks build in structured divergence before convergence happens: research, ideation, prototyping. Convergence, when it comes, requires human judgment. There&#8217;s no formula for when to stop expanding and start narrowing; that&#8217;s a call made by people with context, experience, and stakes in the outcome.</p><p>What they can&#8217;t change is the time. Running divergent exploration takes days or weeks. Each additional direction worth evaluating costs real attention from real people. So exploration gets cut short, not because you don&#8217;t want to explore, but because each alternative has a price.</p><h2>The convergence problem with AI</h2><p>If you&#8217;ve tried using AI for design exploration, you&#8217;ve probably noticed that it gives you variations on a theme. Ask for six approaches and you get a default direction with six adjustments: the visual treatment shifts, the color palette changes, but the interaction model stays the same.</p><p>This isn&#8217;t a model limitation. It&#8217;s a sequencing problem. When an AI generates options one after another, each generation borrows from what came before. Option B has read Option A. Option C has read A and B. By Option D, you&#8217;re iterating on a trajectory, not exploring a space. You get convergence dressed as variety.</p><p>One thing I&#8217;ve been playing with is to impose deliberate isolation: parallel agents working from independent briefs, with no knowledge of what the others are doing. Not one model generating sequentially, but separate agents pursuing separate directions. What comes back isn&#8217;t variations on one idea &#8212; it&#8217;s independent answers to the same design question.</p><p>Creative divergence doesn&#8217;t happen automatically with AI, any more than it does with humans; it has to be structured in.</p><h2>What current models can actually do here</h2><p>The assumption that AI is bad at design is outdated. The latest frontier models, prompted well and given the right task, perform well with UX and visual design. Where AI falls short is final design judgment: choosing what&#8217;s right for a specific user in a specific context, with the taste and experience that judgment requires. In the exploration phase, though, being right isn&#8217;t the goal. Interesting, distinct, and functional enough to evaluate are the goal. Current models can meet that bar in ways they couldn&#8217;t even 6 months ago &#8212; Opus 4.6 and Codex are pretty damn good at it.</p><p>Building an interactive prototype has gotten easier. Everything around it &#8212; hosting it, sharing it, ensuring it holds up when someone actually sits down with it &#8212; hasn&#8217;t. That overhead makes early exploration impractical: you end up prototyping the direction you&#8217;ve already committed to, not the five you&#8217;re still deciding between.</p><h2>You steer it, it steers you back</h2><p>Before I see the options, I have intuitions about what a design should do. After working through an exploration, those intuitions look different. Some were wrong in ways I wouldn&#8217;t have caught without seeing the alternatives. Some were right, but for reasons I understand better now. A few I didn&#8217;t expect at all.</p><p>Design exploration doesn&#8217;t just show you more options. It changes the question you were asking. Seeing six independent approaches to the same component is different from imagining them. You&#8217;re evaluating how something feels to interact with, not how it looks in a static comp. That produces different feedback, and it surfaces different problems.</p><p>Design exploration is an input, not an output. Paired with a PRD or a brainstorm, it becomes something more useful than either alone. The brief shapes what you ask agents to explore. What they surface reshapes the brief. The value isn&#8217;t in the files; it&#8217;s in what the exercise does to your thinking before you commit.</p><h2>A skill for design exploration</h2><p>I&#8217;ve been building a Claude Code and Codex plugin &#8212; <a href="https://github.com/tmchow/tmc-marketplace/tree/main/plugins/iterative-engineering">iterative-engineering</a> &#8212; as a place to work these ideas out. The <strong>design exploration</strong> skill is where the parallel divergence approach takes concrete form. The plugin covers the full engineering lifecycle: brainstorming, research, design exploration, tech planning, implementation, review. Each skill works standalone; you don&#8217;t need the whole pipeline to run design exploration.</p><p>The skill implements parallel isolation directly. You describe a problem &#8212; a component, a page, an MVP &#8212; and it runs multiple agents simultaneously, each working from its own brief with no visibility into what the others are producing. Each agent builds a complete, functional HTML prototype. The whole cycle, from text description to interactive gallery, takes one conversation turn. They all come back &#8212; 6&#8211;8 variations &#8212; and you have several things that don&#8217;t look like each other.</p><p>This isn&#8217;t only useful for designers. Engineers use it to understand UX implications before committing to an implementation. PMs use it to ground a requirements discussion in something concrete rather than a text description that could map to a dozen different interaction models.</p><p>Under the hood: one agent per variation, working in full isolation. The orchestrator never reads variation output &#8212; an assembly script combines the files into the final gallery HTML. The separation serves two purposes: context protection (six full variations at once would overflow the orchestrator&#8217;s window) and genuine creative independence (agents can&#8217;t unconsciously borrow patterns from each other).</p><p>By default the skill explores interaction divergence &#8212; different ways the thing <em>works</em>, not different color schemes. Variations share a clean professional treatment; what diverges is the underlying interaction model. You can shift to visual divergence for brand or landing page work, but for most component and feature exploration, seeing how something works is more useful than seeing how it looks.</p><p>Each variation comes with 4&#8211;8 built-in design controls &#8212; sliders, dropdowns, toggles &#8212; that let you explore decisions within a single approach without generating a whole new variant. The strategy doc draws a useful line here: every control has to produce a visible difference. Toggling from compact to spacious density reshapes the whole layout &#8212; that&#8217;s a design decision. Nudging shadow opacity from 6% to 8% is parameter tweaking, not exploration.</p><p>The single-file format and rating approach came from my friend Kalid &#8212; he runs <a href="https://betterexplained.com/">Better Explained</a> and had been exploring this same idea for awhile. I extended on his original idea and took on figuring out how to make it work as a repeatable skill: orchestrating parallel sub-agents, reliably assembling their output into a coherent artifact each time, and wiring it into a workflow that could stand alone or sit inside a larger pipeline. Spoiler: it was much harder than I expected &#128512;</p><p>Here&#8217;s what one output looks like for <a href="https://www.hzl-tasks.com">a project</a> I&#8217;m working on where I wanted to explore different global navigations on desktop and mobile:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;b1f0acda-7f48-4a57-88f9-b8b8c83c6998&quot;,&quot;duration&quot;:null}"></div><p>The skill features a few things that I&#8217;ve found very useful:</p><ul><li><p><strong>Rate and annotate.</strong> Each variation has a built-in rating interface &#8212; 1&#8211;5 stars, optional text notes. Flip between approaches, rate what landed, skip what didn&#8217;t, note what you&#8217;d change.</p></li><li><p><strong>Iterate with a paste.</strong> When you&#8217;re done rating, the skill produces a structured feedback block. Paste it back into Claude Code or Codex and it triggers another round &#8212; same problem, refined against your feedback. In practice I&#8217;ve typically gone 2&#8211;5 rounds before I&#8217;ve seen enough.</p></li><li><p><strong>Converge to a doc.</strong> When you settle on a direction, one more paste produces something different: a design exploration document. It records what was chosen, what was explored, and why the alternatives didn&#8217;t make the cut &#8212; which prevents the same approaches from resurfacing in every future conversation.</p></li><li><p><strong>One file, every time.</strong> Each exploration is a single self-contained HTML file. Share it as an attachment, commit it to the repo, open it anywhere. No server, no deployment.</p></li></ul><p>The agents expand what you&#8217;re choosing from. What you choose, and why, is still entirely yours. Still evolving &#8212; try it, play with it, and let me know what you find.</p><p><a href="https://github.com/tmchow/tmc-marketplace/tree/main/plugins/iterative-engineering">Iterative Engineering Plugin</a></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Your Team Is Your Flow State]]></title><description><![CDATA[The conditions for doing your best work are mostly created by the people around you]]></description><link>https://trevinsays.com/p/your-team-is-your-flow-state</link><guid isPermaLink="false">https://trevinsays.com/p/your-team-is-your-flow-state</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Sat, 21 Feb 2026 16:01:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rgbi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png" 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_!rgbi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rgbi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png 424w, https://substackcdn.com/image/fetch/$s_!rgbi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png 848w, https://substackcdn.com/image/fetch/$s_!rgbi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!rgbi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rgbi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png" width="1456" height="977" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:977,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9611252,&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;:true,&quot;internalRedirect&quot;:&quot;https://trevinsays.com/i/188693275?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.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_!rgbi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png 424w, https://substackcdn.com/image/fetch/$s_!rgbi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png 848w, https://substackcdn.com/image/fetch/$s_!rgbi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!rgbi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb16ec222-bbb5-440a-bc7b-71e83c2afd1b_2528x1696.png 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>The best work doesn&#8217;t feel like work. The hours disappear, the thinking feels easy, and you&#8217;re not grinding through a problem, you&#8217;re just inside it. When you finally look up, you can&#8217;t quite believe what got built.</p><p>Most people who care about their work have had this at least once, and most of them can&#8217;t explain why it happened when it did, or why it&#8217;s so hard to reproduce on purpose.</p><p><a href="https://en.wikipedia.org/wiki/Mihaly_Csikszentmihalyi">Mihaly Csikszentmihalyi</a> called it flow: total absorption in an activity, where the experience itself becomes so rewarding that the work continues for its own sake. I read <a href="https://amzn.to/4tKwtwk">his work</a> years ago and the concept stayed with me, not the research framework, but the feeling he was describing. What his framework doesn&#8217;t fully account for is the role of the people around you.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The framework is right, but it&#8217;s incomplete</h2><p>Csikszentmihalyi was studying individuals. The conditions he identified for flow are almost entirely about the work itself: the right challenge-to-skill ratio, clear goals, immediate feedback. His framework is right, but it treats flow as something a person either achieves or doesn&#8217;t, based on their own internal state and the nature of the task.</p><p>What I&#8217;ve come to believe, from watching teams over years, is that the environment is most of the conditions, and the environment is mostly made of people.</p><h2>The conditions are mostly other people</h2><p>Among the states Csikszentmihalyi identified as essential to flow: no worry of failure, and distractions excluded from consciousness.</p><p>These sound like individual mental disciplines, but they&#8217;re not, or at least not entirely. You can&#8217;t decide to stop worrying about failure, but you can be in an environment where failure is handled safely, where a mistake is treated as information rather than evidence of inadequacy. You can&#8217;t will away interpersonal distraction, but you can be on a team where trust is high enough that you&#8217;re not spending mental energy reading the room or second-guessing how something you said landed.</p><p>Your team isn&#8217;t separate from your capacity for great work, it&#8217;s a direct input to it.</p><h2>The highest-performing teams have one thing in common</h2><p>Google spent two years studying what actually predicted team performance. Their <a href="https://psychsafety.com/googles-project-aristotle/">Project Aristotle</a> research looked at hundreds of teams and found that the answer wasn&#8217;t individual talent, role clarity, or average IQ. It was psychological safety, defined as the belief that you won&#8217;t be punished when you make a mistake. That finding is usually discussed as a management insight, but it&#8217;s also a flow insight. The conditions psychological safety creates (reduced fear of failure, lower self-consciousness, freedom from social monitoring) are exactly the conditions that make flow accessible. A great team doesn&#8217;t put you directly into flow, it removes the friction that keeps you out of it.</p><h2>Who you hire determines whether flow is even possible</h2><p>Across every team I&#8217;ve built over the years, including at <a href="https://www.bigcartel.com/">Big Cartel</a>, I&#8217;ve watched this play out in both directions. The hires that changed the conditions for the better are easy to feel: something shifts, people seem lit up. The ones that didn&#8217;t work out taught me more. A person can be genuinely talented, even excellent at their craft, and still change the conditions of the environment for the worse. Not because they&#8217;re a bad person, but because the fit with how the team operates isn&#8217;t there.</p><p>The framing I&#8217;ve landed on isn&#8217;t culture fit. That implies the culture is a fixed target and new people need to match it. Culture is always changing; the same team evolves over time, and new people are part of that evolution. The more honest question is: does this person strengthen the conditions that make great work possible? Does their presence make it easier for the people around them to get into flow, or harder?</p><p>When it isn&#8217;t right, the signs are hard to miss: more relationship management, more ambient tension, more cognitive overhead spent on interpersonal dynamics instead of the work itself. The wrong person doesn&#8217;t just underperform. They make flow harder for everyone around them, regardless of how capable they are individually.</p><h2>Most career decisions skip the most important question</h2><p>Joining a team is a flow decision, even when nobody frames it that way. The questions most people lead with when evaluating a role (product, compensation, trajectory, growth potential) are real, but they don&#8217;t tell you whether you&#8217;ll consistently be able to do your best work there.</p><p>The problem is that the easy questions don&#8217;t surface this. &#8220;Is the culture good?&#8221; gets a yes from everyone. &#8220;Are the people smart?&#8221; Yes. &#8220;Is it a good business?&#8221; Obviously. These answers are almost always true and tell you almost nothing useful.</p><p>What&#8217;s harder to assess, and what actually matters, is more specific. Seen through the lens of what flow actually requires:</p><p><strong>Does failure carry social cost here?</strong> Not the official line, but what actually happens when someone gets something wrong. If mistakes are treated as evidence of inadequacy rather than information, part of your brain will always be managing that risk instead of doing the work.</p><p><strong>Can you lose yourself here?</strong> Flow requires self-consciousness to disappear. That only happens when you trust the people around you enough to stop monitoring yourself, to speak before an idea is fully formed, to raise a concern without gaming out how it will land. After an hour talking to these people, did you feel more like yourself, or more careful?</p><p><strong>Is feedback here something that happens with you, or to you? </strong>The distinction matters more than the timing. Fast, direct feedback exists on plenty of teams, but what&#8217;s rarer is feedback from someone who&#8217;s been paying close enough attention to say something true, and who you believe is being honest because they want you to grow rather than because it&#8217;s efficient. When that&#8217;s the context, you can push back, sit with it, have a real conversation instead of spending the rest of the day managing your reaction to it. That overhead isn&#8217;t just frustrating. It keeps you out of flow.</p><p><strong>Do people operate from shared values, not stated ones?</strong> Shared values reduce the cognitive overhead of working together. When you&#8217;re not constantly translating or interpreting, the cognitive space that frees up is exactly where flow lives.</p><p>None of these questions are on most people&#8217;s interview checklist but they probably should be.</p><p>The best career moves aren&#8217;t always to the biggest company or the most exciting product. Sometimes the right move is to the team where you consistently find yourself looking up at the end of the day, not quite believing what got built, because the conditions were right, not because you worked harder.</p><p>Those conditions are mostly the people around you. That&#8217;s worth looking for on purpose.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/your-team-is-your-flow-state?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/your-team-is-your-flow-state?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trevinsays.com/p/your-team-is-your-flow-state?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Performance Reviews Aren't Just for Feedback]]></title><description><![CDATA[AI requires no appreciation. Your team does.]]></description><link>https://trevinsays.com/p/performance-reviews-arent-just-for</link><guid isPermaLink="false">https://trevinsays.com/p/performance-reviews-arent-just-for</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Tue, 10 Feb 2026 15:03:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HdVO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png" 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_!HdVO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HdVO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png 424w, https://substackcdn.com/image/fetch/$s_!HdVO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png 848w, https://substackcdn.com/image/fetch/$s_!HdVO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!HdVO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HdVO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png" width="1456" height="977" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:977,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10324354,&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;:true,&quot;internalRedirect&quot;:&quot;https://trevinsays.com/i/187467439?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.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_!HdVO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png 424w, https://substackcdn.com/image/fetch/$s_!HdVO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png 848w, https://substackcdn.com/image/fetch/$s_!HdVO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!HdVO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22c0e8c-867e-4c99-ad64-f7d5c955b979_2528x1696.png 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>Leaders are spending more time working alongside AI agents, and these digital teammates are efficient, tireless, and require no appreciation, no development conversations, no retention strategy. You can be terse with them, demanding, even dismissive of their &#8220;feelings&#8221; because they don&#8217;t have any. They work around the clock without complaint.</p><p>I&#8217;ve written before about how we need to <a href="https://trevinsays.com/p/stop-thinking-in-human-time">stop thinking in human time</a> when it comes to AI agents. But I keep coming back to the flip side: when you spend significant time working with agents that require no care, it can shape how you perceive and interact with your human colleagues.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Stanford psychologist <a href="https://www.jamil-zaki.com/">Jamil Zaki</a> has been <a href="https://charitydigital.org.uk/topics/artificial-intelligence-and-the-empathy-crisis-12337">tracking what he calls the &#8220;empathy gap&#8221;</a> between leaders and their teams, and AI appears to be widening it. More than 80% of workers say AI will make human connection more important, but only 65% of managers agree. In surveys where leaders praise empathy as a core value, more than 90% of employees say their organizations still fall short. The disconnect is measurable&#8230;and it&#8217;s growing.</p><p>A <a href="https://pnas.org/doi/10.1073/pnas.2426766122">Duke study published in PNAS</a> last year examined how colleagues perceive workers who use AI:</p><blockquote><p>"These judgments manifest as both anticipated and actual social penalties, creating a paradox where productivity-enhancing AI tools can simultaneously improve performance and damage one's professional reputation."</p></blockquote><p></p><p>AI is already distorting how performance and competence get judged. Two popular management frameworks also aren&#8217;t helping.</p><h3>Founder Mode didn't mean what people wanted it to mean</h3><p>Paul Graham&#8217;s <a href="https://paulgraham.com/foundermode.html">&#8220;Founder Mode&#8221; essay</a> landed a few years ago and became one of those pieces that everyone wanted to cite and clap back at something they didn&#8217;t like in their companies. Graham&#8217;s actual argument was that founders should stay hands-on and make decisions themselves rather than defaulting to &#8220;hire good people and give them room to do their jobs.&#8221; He contrasts this with &#8220;manager mode,&#8221; which he critiques as leading to delegation that allows &#8220;professional fakers&#8221; to drive companies into the ground.</p><p>Graham predicted the misuse in his own essay at the very bottom in his final footnote:</p><blockquote><p>&#8220;As soon as the concept of founder mode becomes established, people will start misusing it. Founders who are unable to delegate even things they should will use founder mode as the excuse.&#8221; </p></blockquote><p>Brian Chesky, whose talk inspired the essay, has since lamented on <a href="https://www.theverge.com/24279570/airbnb-ceo-brian-chesky-founder-mode-apple-steve-jobs-management-decoder-podcast-2024">The Verge&#8217;s Decoder podcast</a> that:</p><blockquote><p>"First of all, people don't know what founder mode is. They think it means swagger. I remember a tweet that said, 'I'm going founder mode on this burrito.' I don't know what that means. That wasn't the message."</p></blockquote><p>The team at Oxide put it more bluntly in their <a href="https://oxide.computer/blog/reflections-on-founder-mode">reflection on the essay</a>: </p><blockquote><p>&#8220;Founders are at grave risk of misinterpreting Graham&#8217;s &#8216;Founder Mode&#8217; to be a license to micromanage their teams, descending into the kind of manic seagull management that inhibits a team rather than empowering it.&#8221;</p></blockquote><p>Leaders now use &#8220;Founder Mode&#8221; as justification for micromanagement, harsh accountability, and dismissing the human elements of leadership. But Graham&#8217;s essay is about decision-making authority and staying close to the work, not about abandoning care for your team. You can make strong decisions while also prioritizing retention and development, because these are independent variables.</p><p>Kim Scott&#8217;s <a href="https://amzn.to/3ZLTIsl">Radical Candor</a> framework gets misread the same way. Her model requires two dimensions working together: &#8220;Care Personally&#8221; and &#8220;Challenge Directly.&#8221; Drop the first half and you&#8217;re not practicing Radical Candor. Scott has a name for that quadrant: <em>Obnoxious Aggression</em>.</p><blockquote><p>&#8220;Obnoxious Aggression is what happens when you challenge directly but fail to care personally. It&#8217;s praise that doesn&#8217;t feel sincere or criticism that isn&#8217;t delivered kindly. Obnoxious Aggression sometimes gets great results short-term but leaves a trail of dead bodies in its wake.&#8221;<br><em>&#8212;Kim Scott, author of &#8220;Radical Candor&#8221;</em></p></blockquote><p>Leaders using &#8220;radical candor&#8221; as cover for harsh feedback without the care component aren&#8217;t being direct. They&#8217;re just being obnoxious. Period.</p><h3>Performance reviews are a retention mechanism</h3><p>Performance reviews serve multiple functions: development and improvement (what most leaders focus on), performance correction (what &#8220;candor&#8221; advocates emphasize), and forced communication of recognition and appreciation. The review is a structured, calendar-driven moment that exists in virtually every organization, a forcing function that means leaders don&#8217;t have to remember to schedule appreciation conversations because the system already requires them.</p><p>But if leaders approach reviews only as opportunities to deliver feedback and push for improvement, they miss out on a huge opportunity.</p><p><a href="https://www.npr.org/2024/09/18/nx-s1-5113918/employee-praise-recognition-retention-gallup">NPR reported on longitudinal research</a> tracking employee career paths from 2022 to 2024, finding that employees who receive high-quality recognition are 45% less likely to leave their jobs over a two-year period, and those currently receiving meaningful recognition are 65% less likely to be actively job hunting. Yet only 22% of employees say they get the right amount of recognition for their work, and in May 2024, 51% of all U.S. employees were watching for or actively seeking a new job.</p><p><a href="https://www.gallup.com/workplace/247391/fixable-problem-costs-businesses-trillion.aspx">Gallup estimates</a> that replacing an employee costs between one-half to two times their annual salary, and voluntary turnover costs U.S. businesses roughly $1 trillion annually. Those numbers get cited a lot, but the part that actually stings is more personal: losing someone you wanted to retain because they felt under-appreciated is a leadership failure. That kind of failure should haunt you, because it was preventable. The system gave you a built-in opportunity to show that person they mattered, and you spent it on pointing out what the person should be doing better at.</p><h3>The work that only humans can do</h3><p>As leaders spend more time directing AI agents, the temptation grows to apply that same efficiency-first mindset to human teams. But humans are not AI agents: they need to feel valued, they need to know their contributions matter, and they need care. As AI handles more routine work, these elements of leadership become more important, not less. Empathy, recognition, and retention strategy are what AI cannot provide. As Stefano Corazza, head of AI research at Canva, <a href="https://fortune.com/2025/12/10/ai-managers-automate-busy-work-org-chart-brainstorm-ai/">put it at the Fortune Brainstorm AI conference</a>: </p><blockquote><p>&#8220;The more AI there is, the more authenticity is valued. If your manager really shows that he will spend time with you and cares, that goes a long way.&#8221;</p></blockquote><p>If you&#8217;re heading into review conversations in the coming weeks (or months&#8230; or whenever), remember what the system is actually giving you: a scheduled moment to show your people that you see them, you value them, and you want them to stay. Accountability and genuine appreciation have always coexisted. The review is already on your calendar. That's not a burden. It's a built-in opportunity to show someone they matter.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/performance-reviews-arent-just-for?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/performance-reviews-arent-just-for?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trevinsays.com/p/performance-reviews-arent-just-for?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[HZL: A Task Ledger for AI Agents]]></title><description><![CDATA[What happens when human tools don't fit machine workflows]]></description><link>https://trevinsays.com/p/hzl-a-task-ledger-for-ai-agents</link><guid isPermaLink="false">https://trevinsays.com/p/hzl-a-task-ledger-for-ai-agents</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Tue, 03 Feb 2026 16:03:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VWk_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.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_!VWk_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VWk_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VWk_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VWk_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VWk_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VWk_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg" width="1024" height="687" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:224970,&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://trevinsays.com/i/186576698?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.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_!VWk_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VWk_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VWk_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VWk_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc78f18e-29b8-44c2-8f6e-c82c48fa29b1_1024x687.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>A few weeks ago, my friend <a href="https://www.linkedin.com/in/kalid-azad-26a75a1/">Kalid</a> and I were eating tacos at <a href="https://www.seattlechukis.com/">Tacos Chukis</a> (the best tacos in Seattle, and I will die on this hill!) and talking about OpenClaw.</p><p>If you haven&#8217;t seen it, <a href="https://openclaw.ai/">OpenClaw</a> is one of the more exciting projects in the AI tooling space right now. It&#8217;s an open-source framework that lets you build a deeply personalized AI assistant, and because it&#8217;s open source, it&#8217;s almost infinitely customizable. You can wire it into your calendar, your email, your file system, whatever services matter to your workflow.</p><p>We&#8217;d both been using it heavily. Kalid runs <a href="https://instacalc.com">Instacalc</a> and <a href="https://betterexplained.com">Better Explained</a>, and he&#8217;s always experimenting with tools that make complex work more tractable. I&#8217;d been trying to build a &#8220;morning brief&#8221; workflow where OpenClaw would synthesize my day, pulling together my calendar, family scheduling, notable events, and things I needed to know. It required access to multiple services, research capabilities, and a fairly elaborate plan.</p><p>The problem was that OpenClaw kept losing context. So. Damn. Frustrating &#129313;</p><p>Over 30 mins, my session compacted eight times. Each time, detail disappeared and I&#8217;d have to re-explain things I&#8217;d already established. Eventually I had the agent create a markdown file to use as its own memory, which worked but felt like duct tape on a structural problem.</p><p>Kalid had been hitting the same wall, so we started talking about why.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aClx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aClx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png 424w, https://substackcdn.com/image/fetch/$s_!aClx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png 848w, https://substackcdn.com/image/fetch/$s_!aClx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png 1272w, https://substackcdn.com/image/fetch/$s_!aClx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aClx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png" width="540" height="212.65486725663717" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:904,&quot;resizeWidth&quot;:540,&quot;bytes&quot;:86864,&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://trevinsays.com/i/186576698?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.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_!aClx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png 424w, https://substackcdn.com/image/fetch/$s_!aClx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png 848w, https://substackcdn.com/image/fetch/$s_!aClx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png 1272w, https://substackcdn.com/image/fetch/$s_!aClx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee8ad02b-ec16-4b4d-9282-d70b9627d4fb_904x356.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The markdown file problem</h2><p>If you&#8217;ve worked with AI agents for any length of time, you&#8217;ve probably arrived at the same workaround I did: markdown files as memory.</p><p>It&#8217;s become the de facto pattern in the post-AI world. Agents create markdown files for plans, add tasks as they go, and edit the files to mark things complete. I&#8217;ve built this into custom skills and agents myself over the past year, and it kind of works.</p><p>But it doesn&#8217;t scale well. How do you query tasks across multiple files? How do you organize them across projects? You end up with a sprawl of markdown documents scattered through your repo, using folders and your filesystem as an improvised task management platform. It functions, but it&#8217;s not optimal, and it breaks down entirely when you&#8217;re coordinating multiple agents or working on projects that don&#8217;t live in a git repository at all.</p><h2>Human tools don&#8217;t speak agent</h2><p>The obvious next step was to use a real task manager. We tried the built-in OpenClaw tools first, but they didn&#8217;t fit. Then we considered plugging in third-party services like Todoist or Linear, and those felt wrong too.</p><p>First, they&#8217;re slow. These are remote services optimized for human interaction speeds, and when you&#8217;re coordinating agent work, you want something fast. That typically means CLI-native and local.</p><p>Second, they&#8217;re built for humans. They assume workers have persistent memory, can update their own status naturally, and communicate blockers without prompting. They&#8217;re designed for people who remember what they were doing yesterday, and agents don&#8217;t have these properties. Context windows compact, sessions end, crashes happen, you close your laptop to sleep. When you resume, the agent doesn&#8217;t remember what it was doing, and there&#8217;s no durable record of where things stand.</p><p>Third, mixing agent work with your personal task list creates its own problems: agents and humans stepping on each other, different cadences of work, different granularities of tasks. It gets messy.</p><p>There&#8217;s also the multi-agent problem. It&#8217;s increasingly common to use different models for different tasks. Claude Code for some things, Gemini for others, local models when you want speed or privacy. Sometimes the choice is capability-driven because certain models handle certain tasks better, and sometimes it&#8217;s financial because you&#8217;re balancing costs across providers. Either way, you end up coordinating work across agents that have no shared memory and no awareness of each other.</p><p>We kept circling back to the same realization: the coordination infrastructure doesn&#8217;t exist. Markdown files are too unstructured, and human tools are too slow, too feature-heavy, and designed for a different kind of worker. What&#8217;s needed is something optimized for agent access.</p><h2>Building HZL</h2><p>We knew there were probably a thousand projects in this space already, but this was an excuse to build something together. We&#8217;d known each other for twenty years, our families are close, our social circles overlap, and we&#8217;ve always talked shop about technology and projects, but we&#8217;d never shipped anything as collaborators. Tacos created an opportunity.</p><p>We honestly weren&#8217;t sure it would work well, but along the way we were surprised at how right it felt for the problem at hand.</p><p><a href="https://github.com/tmchow/hzl">HZL</a> is an external task ledger for AI agents. It&#8217;s backend-first, CLI-native, and model-agnostic. The core idea is simple: give agents a durable place to track work that survives context compaction, session restarts, and switches between models.</p><p>The initial brainstorm took about fifteen minutes. We recorded our conversation using Granola, then fed the summary into the <a href="https://github.com/EveryInc/compound-engineering-plugin">Compound Engineering plugin&#8217;s</a> brainstorming skill. From there, we iterated on an implementation plan using ChatGPT 5.2 Pro for another twenty or thirty minutes.</p><p>Then we started building, using a mix of Claude Code and Gemini for implementation. The split was partly by design and partly because I ran out of my Claude Code Max limits mid-session. The switch created exactly the kind of friction HZL is meant to solve. We had to create markdown documents and ensure both Claude Code and Gemini were marking off tasks in the same file, committing updates to the repo so neither agent would re-implement completed work or miss incomplete tasks. It was ironic, and it was validating.</p><p>The first working version took about four hours end-to-end. We&#8217;ve iterated remotely over the following days, adding features and smoothing rough edges, but the core has stayed stable.</p><p></p><div><hr></div><h2>How HZL works</h2><p>Some people will immediately point to Steve Yegge&#8217;s Beads (or ports like beads-rust), which I&#8217;ve written about before. It&#8217;s an exciting project with real adoption, but it never quite resonated with my workflow. The complexity and its tight focus on repositories didn&#8217;t fit how I work, and the git hook integration in particular gave me enough grief that I never settled into a comfortable rhythm with it.</p><p>HZL is simpler by design. It&#8217;s a ledger, a task tracker. There are tasks and subtasks, one level of nesting deep, and that&#8217;s it. No epics, no bug types, no elaborate hierarchies. It doesn&#8217;t try to handle orchestration or coordination, leaving that to other tools. It just gives agents a durable, queryable place to track work with minimal structure for organization.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!27FH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!27FH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png 424w, https://substackcdn.com/image/fetch/$s_!27FH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png 848w, https://substackcdn.com/image/fetch/$s_!27FH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png 1272w, https://substackcdn.com/image/fetch/$s_!27FH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!27FH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png" width="1456" height="935" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:935,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8783906,&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://trevinsays.com/i/186576698?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.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_!27FH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png 424w, https://substackcdn.com/image/fetch/$s_!27FH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png 848w, https://substackcdn.com/image/fetch/$s_!27FH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.png 1272w, https://substackcdn.com/image/fetch/$s_!27FH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4a44610-d392-4ed6-be2f-e4e59a779204_2592x1664.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><strong>No repo required.</strong> This matters more than it might seem. In software, we naturally think of projects as GitHub repos and codebases, but complex work often involves research, planning, and execution of things that have nothing to do with code. My morning brief project wasn&#8217;t a codebase. It was a workflow involving calendar access, email parsing, and information synthesis, and that kind of work needs task tracking too without assuming a git repository exists.</p><p><strong>Machine-readable everything.</strong> JSON output, CLI-first interface, explicit status transitions. Agents can query and update programmatically without parsing human-friendly formatting.</p><p><strong>Lease support.</strong> When an agent claims a task, it can take a time-limited lease. If the agent dies, crashes, or gets stuck, the lease expires and another agent can pick up the work. Tasks don&#8217;t get permanently stuck because an agent wandered off. We may add traditional assignments in the future, but time-based leases solve a real problem that static assignments don&#8217;t.</p><p><strong>Checkpoint-oriented design.</strong> Agents can save progress snapshots as structured state that another agent instance can parse and continue from. When context compacts or a session restarts, the checkpoint gives the next agent what it needs to resume. There are comments too, but the design centers on machine-readable resumption rather than human-readable updates.</p><p>One design choice worth noting: HZL assumes a single ledger for all your projects. We&#8217;re not doing per-folder tracking with isolated ledgers in different directories. Instead, a single HZL instance supports multiple projects through project IDs within the same ledger, which keeps things simple and queryable across everything you&#8217;re working on.</p><p>The technical implementation prioritizes speed. It&#8217;s local-first SQLite with a CLI interface because fast matters when agents are querying and updating task state. Turso cloud sync is completely optional if you want to sync to the cloud, but the primary interface is local.</p><p>There&#8217;s also a web dashboard with a real-only Kanban view, plus skills for OpenClaw, Claude Code, and <a href="https://github.com/tmchow/hzl?tab=readme-ov-file#drop-in-policy-snippet">policy snippets</a> you can drop into your AGENTS.md or CLAUDE.md files.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zA0F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zA0F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png 424w, https://substackcdn.com/image/fetch/$s_!zA0F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png 848w, https://substackcdn.com/image/fetch/$s_!zA0F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!zA0F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zA0F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png" width="1456" height="925" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:925,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:345283,&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://trevinsays.com/i/186576698?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.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_!zA0F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png 424w, https://substackcdn.com/image/fetch/$s_!zA0F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png 848w, https://substackcdn.com/image/fetch/$s_!zA0F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!zA0F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f221c99-7b5e-4a90-b41c-d1a7da12759c_2578x1638.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><div><hr></div><h2>When it fits and when it doesn&#8217;t</h2><p>If you&#8217;re only using Claude Code and nothing else, the built-in task support they&#8217;re starting to build may be sufficient for your needs. But the moment you start thinking about multi-session work, even within just Claude Code, you&#8217;ll likely hit the same frustrations we did: either a sprawl of markdown files or awkward integration with human-focused project management tools.</p><p>HZL works well for multi-step work that spans sessions, workflows mixing multiple agents or models on the same project, non-code projects that still need task tracking, and &#8220;kick off a task, check back later&#8221; scenarios where you need visibility into progress.</p><p>It&#8217;s not the right tool for time-based reminders, due dates, recurring tasks, or calendar integration, and it&#8217;s not trying to replace org-wide backlogs. If you need rich human workflow features, GitHub Issues, Linear or Jira are better choices.</p><p>The sweet spot is personal and very small-team AI workflows where the tracking problem is real but the ceremony of team/enterprise tools are overkill.</p><div><hr></div><h2>From side project to public repo</h2><p>Kalid and I built HZL because we kept hitting the same frustration and wanted to solve it for ourselves. We&#8217;ve known each other for twenty years but had never actually built something together, so this was a good excuse! (and tacos!)</p><p>When I&#8217;ve shown it to people running into the same walls, the reaction has been immediate positive. My friend <a href="https://www.linkedin.com/in/darrenapfel/">Darren Apfel</a> is building <a href="https://limeriq.ai/">Limeriq</a>, a multi-agent workflow tool for VS Code that orchestrates different models from different providers.  So by design it runs directly into the tracking challenges HZL addresses. When I showed him what we&#8217;d built, his first response was:</p><blockquote><p>&#8220;Well, my first feedback is that this definitely needs to exist&#8221;.  </p></blockquote><p>Hot damn.</p><p>We&#8217;re not claiming HZL will &#8220;change everything&#8221;, but so far it&#8217;s been a hugely fun to build huge boost for our productivity and visibility into what&#8217;s going on.  It&#8217;s made some larger work items less stressful, so hopefully it&#8217;ll work for you?</p><div><hr></div><h2>Try it</h2><p>If you&#8217;re working with AI agents and running into tracking friction, <a href="https://github.com/tmchow/hzl">give HZL a look</a>. The documentation is at <a href="https://www.hzl-tasks.com">hzl-tasks.com</a>, and you can star the repo if it&#8217;s interesting or file issues or start discussions. You can also hit us up on X at <a href="https://x.com/trevin">@trevin</a>, and <a href="https://x.com/betterexplained">@betterexplained</a>.  Build on!</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/hzl-a-task-ledger-for-ai-agents?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/p/hzl-a-task-ledger-for-ai-agents?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://trevinsays.com/p/hzl-a-task-ledger-for-ai-agents?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Stop Thinking in Human Time]]></title><description><![CDATA[The economics of 'later' have changed]]></description><link>https://trevinsays.com/p/stop-thinking-in-human-time</link><guid isPermaLink="false">https://trevinsays.com/p/stop-thinking-in-human-time</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Fri, 16 Jan 2026 15:09:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tv4x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png" 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_!tv4x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tv4x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png 424w, https://substackcdn.com/image/fetch/$s_!tv4x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png 848w, https://substackcdn.com/image/fetch/$s_!tv4x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!tv4x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tv4x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png" width="1456" height="977" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:977,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9784637,&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;:true,&quot;internalRedirect&quot;:&quot;https://trevinsays.com/i/184519687?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.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_!tv4x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png 424w, https://substackcdn.com/image/fetch/$s_!tv4x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png 848w, https://substackcdn.com/image/fetch/$s_!tv4x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!tv4x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34021732-76b9-487d-8037-a2b4b434a5e3_2528x1696.png 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>Last week, Claude Code was assessing the complexity of a new feature and it came back with a work breakdown and time estimate of &#8220;10-15 hours.&#8221;</p><p>Claude wasn&#8217;t wrong, exactly. It&#8217;s been trained on our documentation, our sprint retrospectives, our Linear tickets. It gave me back likely the same estimate a human would have given in a pre-AI era. But here&#8217;s the thing: the agent itself could do the work in about 15 minutes. It was estimating in human time because that&#8217;s what we&#8217;ve taught it to do.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p>We&#8217;ve spent decades calibrating our decisions around human labor constraints. Story points, t-shirt sizing, two-week sprints, &#8220;is the juice worth the squeeze?&#8221; All of it assumes that developer time is the scarce resource. With agents working in parallel while we sleep, that assumption is starting to look like an artifact of a world that no longer exists.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fdvB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fdvB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png 424w, https://substackcdn.com/image/fetch/$s_!fdvB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png 848w, https://substackcdn.com/image/fetch/$s_!fdvB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png 1272w, https://substackcdn.com/image/fetch/$s_!fdvB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fdvB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png" width="1456" height="1022" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1022,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:208317,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://trevinsays.com/i/184519687?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!fdvB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png 424w, https://substackcdn.com/image/fetch/$s_!fdvB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png 848w, https://substackcdn.com/image/fetch/$s_!fdvB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.png 1272w, https://substackcdn.com/image/fetch/$s_!fdvB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4cf8606-6453-49c8-8d82-ff665dce4b26_1652x1160.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><figcaption class="image-caption">Example: Claude Code Opus estimates</figcaption></figure></div><h2>The hidden cost of &#8220;do it later&#8221;</h2><p>When we defer work, we tell ourselves we&#8217;re saving time, but we&#8217;re actually transferring cost to our future selves (and others) in ways that compound.</p><p>There&#8217;s the coordination overhead of tracking the work item, writing up context for whoever picks it up later, the prioritization meetings to decide if &#8220;later&#8221; ever comes. There&#8217;s the context switching tax when someone else inherits the problem and has to reconstruct what the original author was thinking. And there&#8217;s the compounding risk as more code builds on top of the deferred issue, making it progressively harder to unwind.</p><p>The <a href="https://stripe.com/files/reports/the-developer-coefficient.pdf">2018 Stripe Developer Report</a> found developers spend 33-42% of their time on rework, bug fixes, and maintenance. Southwest Airlines learned this the expensive way in 2022 when deferred system updates contributed to an <a href="https://www.investopedia.com/southwest-chaos-costs-7092236">$825 million loss</a> and triggered a <a href="https://www.ciodive.com/news/southwest-airlines-technology-data-upgrades-FAA/640890/">$1.3 billion &#8220;modernization&#8221; commitment</a>.</p><p>We historically accepted these transfer costs because <em>immediate</em> human time felt more expensive than future human time. But when an AI agent can fix something in minutes that a human would need hours/days/weeks to context-switch into, the calculus flips. The cost of deferring often exceeds the cost of just doing it now.</p><h2>The vocabulary of human time thinking</h2><p>Once you start looking for it, human time thinking still shows up everywhere in how we talk about work.</p><p>PR feedback gets marked &#8220;non blocking&#8221;, &#8220;nit pick&#8221; or &#8220;nice to have later&#8221; because asking someone to address it now feels expensive. Refactoring discussions start with &#8220;is it worth it?&#8221; as if the answer depends entirely on labor cost. Scale and performance work gets pushed off because &#8220;we don&#8217;t have that problem yet,&#8221; which is another way of saying &#8220;we don&#8217;t want to spend human time on it yet.&#8221;</p><p>The classic advice &#8220;don&#8217;t prematurely optimize&#8221; made perfect sense when optimization meant days of profiling and careful restructuring. It makes less sense when an agent can run through common optimization patterns in an afternoon while you&#8217;re in meetings.</p><p>Even agents themselves perpetuate this framing. They give estimates in hours and days because they learned from documentation written by humans for humans. They&#8217;ll tell you a migration &#8220;should take about a week&#8221; when what they mean is &#8220;this would take a human about a week, but I could do it tonight.&#8221;</p><h2>Parallelization changes everything</h2><p>The constraint isn&#8217;t capacity anymore, it&#8217;s coordination.</p><p>An agent can work while you sleep, and multiple agents can run simultaneously on different parts of a problem. Wall clock time and human time have decoupled in ways our planning processes haven&#8217;t absorbed.</p><p>When I run four Claude Code instances in parallel on related parts of a codebase, the current bottleneck is merge conflicts and integration decisions. The work itself happens fast, but making sure the parallel streams cohere into something that actually functions together is where the time goes. This particular friction point will get solved as tooling catches up, but the broader pattern holds: every time agents get faster, the constraint shifts to whatever humans are still doing manually.</p><p>This is a fundamentally different dynamic than &#8220;we don&#8217;t have enough developer hours.&#8221; It requires different processes, different tooling, and different intuitions about what&#8217;s expensive and what&#8217;s cheap.</p><h2>The API cost distraction</h2><p>Teams obsess over and scrutinize API spend, optimize prompts to reduce token usage, and track inference costs down to the penny. This makes sense as line-item accounting (which is common in large organizations), but it misses the larger picture.</p><p>Inference costs are collapsing:</p><ul><li><p>Epoch AI&#8217;s <a href="https://epoch.ai/data-insights/llm-inference-price-trends">analysis</a> shows prices falling 9x to 900x per year depending on performance level</p></li><li><p>The <a href="https://a16z.com/llmflation-llm-inference-cost/">a16z LLMflation analysis</a> found a 10x cost decrease annually for equivalent performance, faster than the PC revolution or dotcom bandwidth expansion</p></li><li><p>Stanford&#8217;s <a href="https://hai.stanford.edu/ai-index/2025-ai-index-report">2025 AI Index</a> documented a 280-fold cost reduction for GPT-class models between 2020 and 2024.</p></li></ul><p>Meanwhile, the costs we&#8217;re not measuring keep compounding: opportunity cost when deferred work blocks future features, coordination cost when context gets lost between deferrals, and risk cost when technical debt makes systems brittle in ways that only surface during incidents.</p><p>Measuring API spend while ignoring deferred work costs is like optimizing for gas mileage while ignoring that you&#8217;re driving in circles.</p><h2>What actually changes</h2><p>The tactical shifts are relatively straightforward once you accept the underlying premise.</p><p>For PR feedback, stop automatically ignoring anything marked &#8220;non-critical.&#8221; Low priority and nitpick comments become valid to fix immediately when agent time is cheap. You&#8217;re not asking a human to context-switch; you&#8217;re asking an agent to make a quick pass before the PR closes.</p><p>For backlog management, batch the &#8220;someday&#8221; items to an agent overnight. That pile of minor refactors and cleanup tasks that never quite makes it into a sprint? Let an agent work through it while you&#8217;re asleep. You might be surprised what&#8217;s feasible when the limiting factor isn&#8217;t human attention.</p><p>For estimation, challenge the implicit cost assumption in every &#8220;is it worth it?&#8221; question. The answer might have been &#8220;no&#8221; when it implied pulling someone off higher-priority work. It might be &#8220;yes&#8221; when it implies queuing something for an agent.</p><p>The cultural shifts run deeper. When someone asks "how long will this take?" we instinctively answer in human-hours, human-days, human-sprints. The entire grammar of estimation assumes human labor as the unit of cost. When agents work 24/7 in parallel, the complexity-to-cost relationship changes in ways that grammar wasn't designed to capture. I don't have a clean replacement yet, but I'm increasingly confident the current vocabulary will look as dated as waterfall diagrams within a few years.</p><h2>The tooling gap</h2><p>Our work tracking systems were designed for human workflows, and it shows.</p><p>Jira, Linear, GitHub Issues&#8212;all of them assume a human will pick up a ticket, work on it, and mark it done. None of them have good primitives for queuing work to agents, distinguishing what&#8217;s safe for autonomous handling versus what needs human judgment, or coordinating between multiple agents and humans asynchronously.</p><p>This is starting to change. Steve Yegge&#8217;s <a href="https://github.com/steveyegge/beads">Beads</a> project is exploring agent-optimized workflows. Tools like <a href="https://www.crewai.com/">CrewAI</a>, <a href="https://www.langchain.com/langgraph">LangGraph</a>, and <a href="https://microsoft.github.io/autogen/stable//index.html">AutoGen</a> are building multi-agent orchestration patterns. Visual workflow builders like <a href="https://n8n.io">n8n</a> and <a href="https://dify.ai/">Dify</a> are making it easier to design agent pipelines without writing custom code.</p><p>The patterns emerging include sequential handoffs, concurrent execution, maker-checker loops, and dynamic task building. These aren&#8217;t academic exercises but instead are responses to practical coordination problems that show up the moment you try to run lots of agents (and then nested sub-agents) on real work.</p><h2>The villain is us</h2><p>We are our own bottleneck here. We&#8217;ve internalized mental models based on constraints that no longer apply, and we keep reinforcing them in our documentation, our processes, and the training data we feed to agents.</p><p>The shift isn&#8217;t philosophical, it&#8217;s operational. Every time we ask &#8220;do we have bandwidth for this?&#8221; or &#8220;can we fit this in the sprint?&#8221; or &#8220;is this worth the engineering time?&#8221;, we&#8217;re applying a heuristic that made sense when human time was the binding constraint. When agent time is cheap and human time is better spent on judgment, taste and (some) orchestration, those questions need different answers.</p><p>The cost of inference is collapsing while the cost of deferred work compounds. The sooner our mental models catch up to that reality, the sooner we stop punting work that should just get done.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[2026: The Year of Agent Orchestration]]></title><description><![CDATA[Why the next wave of AI gains will come from coordination, not capability]]></description><link>https://trevinsays.com/p/2026-the-year-of-agent-orchestration</link><guid isPermaLink="false">https://trevinsays.com/p/2026-the-year-of-agent-orchestration</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Fri, 09 Jan 2026 20:49:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JprK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.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_!JprK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JprK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JprK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JprK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JprK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JprK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg" width="1024" height="687" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:246906,&quot;alt&quot;:&quot;&quot;,&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://trevinsays.com/i/184062581?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!JprK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JprK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JprK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JprK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F779a9702-88f9-4461-aa6b-bc771647a476_1024x687.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>A year ago, people were still questioning whether AI could do basic math. Now we&#8217;re questioning whether we can keep up with systems that work faster, longer, and in parallel. The bottleneck has flipped, and it flipped faster than most people want to admit.</p><p>The capability is there in the foundational models, but what&#8217;s missing is the orchestration layer that makes it usable at scale. In 2026, a lot of money and attention is going to pour into orchestration and observability, first in developer tooling and then throughout roles in the rest of the organization. We will watch IDEs evolve into agent control centers, and then watch those patterns spread into product, design, marketing, operations and anywhere else work is complex and interdependent.</p><p>The teams who figure out orchestration will unlock productivity gains that make &#8220;10x engineer&#8221; sound quaint. Not because engineers suddenly become superheroes, but because the unit of work stops being a single person&#8217;s output. It becomes a coordinated system.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3><strong>The bottleneck has flipped</strong></h3><p>Recently, I recently had 4 Claude Code instances working in parallel on related parts of a side project I&#8217;m working on. Each agent&#8217;s work was scoped carefully to minimize overlap while still being cohesive enough to merge. They finished over a 35-minute period.</p><p>Then I spent 25 minutes managing merge conflicts, which is a fun reminder that the agents did the hard part and I did the part nobody wants to.</p><p>I could have picked three unrelated areas and avoided most of the integration pain, but that is not how real work flows. Related problems need related solutions. Once you are operating in a single codebase, work entangles. When agents become capable enough to move quickly inside that entanglement, integration becomes the constraint. This is no different than humans working in the same codebase, it&#8217;s just the agents are able to work 24x7.</p><p>This crazy part is how quickly this has evolved from being a model problem into one of coordination.</p><p>In a remarkably short time, we have gotten MCP servers, agent systems, skills frameworks, and exponentially improving foundational models. For most situations, individual task capability is not the limiting factor anymore. The challenge has shifted toward multiplying yourself across many work streams simultaneously while keeping the work coherent.</p><p>Skeptics will look at orchestration friction and say it proves AI isn&#8217;t as capable as proponents claim. The opposite is true. Merge conflicts do not exist because the agents are failing. They exist because the agents are succeeding fast enough that human coordination becomes the bottleneck. A year ago, we would not have had multiple meaningful changes worth merging in the first place.</p><p>The struggle has moved up the value chain.</p><h3><strong>Where orchestration will emerge first</strong></h3><p>We&#8217;ve been conditioned to think of IDEs as places to write code, debug code, and browse repositories. That mental model is already outdated. Tools like Cursor expanded what an IDE does by putting agents at the center, but we are still in the messy part.</p><p>The IDE of the near future will not primarily be about writing code. It will be about spinning up and controlling agents, giving them direction and context, auditing what they&#8217;ve done, and maintaining observability into parallel workstreams. Today, most agent workflows still collapse down into terminal transcripts. That interface works when there is one thread of work. It breaks down when work becomes parallel and interdependent.</p><p><a href="https://x.com/joshpuckett/status/2007926313726939452">Josh Puckett</a> captured the interface problem perfectly:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://x.com/joshpuckett/status/2007926313726939452" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CcCD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.png 424w, https://substackcdn.com/image/fetch/$s_!CcCD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.png 848w, https://substackcdn.com/image/fetch/$s_!CcCD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.png 1272w, https://substackcdn.com/image/fetch/$s_!CcCD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CcCD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.png" width="572" height="479.741935483871" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:988,&quot;width&quot;:1178,&quot;resizeWidth&quot;:572,&quot;bytes&quot;:1243166,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://x.com/joshpuckett/status/2007926313726939452&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://trevinsays.com/i/184062581?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.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_!CcCD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.png 424w, https://substackcdn.com/image/fetch/$s_!CcCD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.png 848w, https://substackcdn.com/image/fetch/$s_!CcCD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.png 1272w, https://substackcdn.com/image/fetch/$s_!CcCD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf1e1fa5-1a21-4b32-9e0a-3fa3196503a8_1178x988.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>This hits because not only did I grow up playing real-time strategy games, but they also inherently tackled the &#8220;coordinate many parallel workers&#8221; interface problem decades ago. They make ownership, progress, dependencies, and collisions visible. As much as I adore Claude Code and the terminal, it simply isn&#8217;t a control plane.  We suffer with an inability to effectively know what agents are working on, how they intersect or how tasks relate. Once you are running even a handful of agents, you need to see the whole board.</p><p>This is why orchestration becomes inseparable from observability. Observability means you can answer, quickly and confidently, what each agent is doing, what it touched, what it assumed, what it produced, and what it is about to break. Without that, you are not orchestrating a system, you&#8217;re along for the ride (and likely in denial).</p><h3><strong>Signals that the market is already forming</strong></h3><p>The best evidence that orchestration matters is that developers are already building it for themselves. Tools are showing up because the pain is immediate and the constraint is obvious.</p><p>Steve Yegge&#8217;s <a href="https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04">&#8220;Gas Town&#8221; essay</a> is one of the clearest articulations of the new frontier:</p><blockquote><p>&#8220;I went to senior folks at companies like Temporal and Anthropic, telling them they should build an agent orchestrator, that Claude Code is just a building block, and it&#8217;s going to be all about AI workflows and &#8216;Kubernetes for agents&#8217;. &#8230;</p><p>&#8216;It will have a Merge Queue,&#8217; I said.</p><p>&#8216;It will orchestrate workflows,&#8217; I said.</p><p>&#8216;It will have plugins and quality gates,&#8217; I said.</p><p>&#8230;</p><p>So in August I started building my own orchestrator, since nobody else seemed to care.&#8221;</p></blockquote><p>That quote matters because it is not a vague prediction. It names the primitives you inevitably need once work becomes parallel: merge queues, supervision layers, workflows, plugins, and quality gates. It also captures the adoption gap. Most developers are still using a single agent as an enhanced copilot. The frontier is already thinking in terms of swarms, supervision, and reliable pipelines.</p><p>Other tools and projects are emerging for the same reason. <a href="https://conductor.build">Conductor</a> is a great example and one of my new favorite tools.  On the surface it appears to be a thin shin on top of Claude Code instances and Git worktrees.  However, once you dig deeper, you appreciate all the clever things their team has done to make this a much better orchestrator than you first realize. </p><p>Other projects like <a href="https://github.com/smtg-ai/claude-squad">Claude Squad</a>, <a href="https://github.com/ruvnet/claude-flow">Claude Flow</a>, and <a href="https://github.com/AndyMik90/Auto-Claude">Auto Claude</a> have also shown up because engineers have both the incentive and the ability to scratch their own itch.</p><p>This is not limited to developers. Workflow automation platforms are becoming the bridge that brings orchestration to technical teams outside engineering. <a href="https://n8n.io/">n8n</a> is a good example of what happens when orchestration gets packaged into something usable for people who understand their business problem but do not want to operate a developer stack.</p><p>Companies do not want &#8220;AI.&#8221; They want work to get done, reliably, without the whole thing turning into a science project where you&#8217;re lighting money on fire.</p><div class="pullquote"><p>&#8220;The AI race isn&#8217;t only about smarter models. It&#8217;s about who can actually put that intelligence to work reliably, inside actual businesses.&#8221;</p><p><a href="https://blog.n8n.io/series-c/">n8n series C announcement</a></p></div><p>The velocity of change should recalibrate expectations again.  The intelligence is compounding quickly which is forcing the bottleneck to shift to the systems that coordinate it.</p><h3><strong>The new math</strong></h3><p>We used to talk about 10x engineers. But when you can spin up multiple agents working in parallel, the math changes. Leverage is no longer limited by how fast you can type or how many hours you can work. It is limited by how many agents you can direct effectively across interconnected workstreams while keeping output coherent and integration cost low.</p><p>Over time, this also changes who can do technical work. As orchestration improves, more work that used to require deep engineering expertise will be done by product managers, designers, operations teams, and domain experts who understand the problem best, with agents handling execution. The boundaries between roles soften because the limiting factor becomes coordination and judgment, not implementation.</p><p>The individual agent capabilities are largely solved. What is missing is the layer that makes those capabilities composable, parallel, and reliable.</p><p>That is why 2026 looks like a real inflection point to me. Orchestration becomes the focus, and investment pours into the tools and interfaces that let humans direct multiple agents without losing coherence. As those patterns mature, they will spread beyond engineering into product, operations, and design through interfaces that look nothing like command lines.</p><p>2026 is the year the orchestration control plane becomes real.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[From Prompts to Pipelines: The OS Layer AI Agents Are Missing]]></title><description><![CDATA[Prompt engineering was a coping mechanism. Context engineering is the real work]]></description><link>https://trevinsays.com/p/from-prompts-to-pipelines-the-os</link><guid isPermaLink="false">https://trevinsays.com/p/from-prompts-to-pipelines-the-os</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Wed, 17 Dec 2025 06:06:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!beE8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.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_!beE8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!beE8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg 424w, https://substackcdn.com/image/fetch/$s_!beE8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg 848w, https://substackcdn.com/image/fetch/$s_!beE8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!beE8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!beE8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg" width="1024" height="687" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:236863,&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://trevinsays.com/i/181859405?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.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_!beE8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg 424w, https://substackcdn.com/image/fetch/$s_!beE8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg 848w, https://substackcdn.com/image/fetch/$s_!beE8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!beE8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ab05bb-a086-498a-a6a6-0ab6d8c78a5f_1024x687.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></p><p>In 1974, Unix introduced a radical abstraction: everything is a file. Sockets, devices, processes, all accessible through the same interface. It sounds almost obvious now. It wasn&#8217;t. Before Unix, every piece of hardware needed its own special integration. Programmers loved it. (They did not love it.)</p><p>Fifty years later, we&#8217;re building AI agents the way people built software before Unix: every integration is bespoke, state is scattered, and there&#8217;s no unified way to navigate what the system knows. It&#8217;s as if we&#8217;ve forgotten lessons of the past.</p><p>A new paper argues we need the same shift for AI. And if you look at where Claude Code, Cursor, and MCP infrastructure are headed, you&#8217;ll see it&#8217;s already happening. Slowly. Painfully. But this is the way all massive change and transformation happens.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Model intelligence isn&#8217;t the problem</h2><p>You&#8217;ve probably experienced this: an AI agent that works brilliantly for 5 minutes, then loses the thread. Same prompt, same model, same tools. But it forgot what you told it three turns ago. Or it hallucinates a information that doesn&#8217;t exist. Or it burns through your token budget loading context it didn&#8217;t need and then telling you it needs to compact the conversation.</p><p>You point this out. &#8220;<em>You&#8217;re absolutely right, I apologize for the confusion!</em>&#8221; it replies cheerfully. Then it hallucinates the same information but this time different wording that sounds slightly credible.</p><p>You try again, more firmly this time. You use capital letters. You add &#8220;<em>IMPORTANT:</em>&#8221; to the prompt. The model thanks you (again) for the clarification and does something entirely different but equally wrong.</p><p>The bottleneck isn&#8217;t &#8220;how smart is the model?&#8221; It&#8217;s &#8220;how well do we manage its context?&#8221;</p><p>That&#8217;s the argument in <a href="https://arxiv.org/abs/2512.05470">Everything is Context: Agentic File System Abstraction for Context Engineering</a>. The authors propose that context engineering, not prompt engineering, is the discipline that matters now. Prompt engineering is asking &#8220;how do I phrase this so the model understands?&#8221; Context engineering is asking &#8220;why does this thing keep forgetting everything I tell it, and what infrastructure would fix that?&#8221;</p><h2>What if everything the agent sees were a file?</h2><p>The paper&#8217;s core move is borrowed from Unix: create a unified namespace where context sources (memory, tools, knowledge bases, human input) all appear as files and directories.</p><p>In their Agentic File System (AFS):</p><ul><li><p><strong>MCP servers, vector stores, APIs, logs, and user profiles</strong> mount into a single addressable space</p></li><li><p><strong>Agents use a tiny tool surface:</strong> <code>afs_list</code>, <code>afs_read</code>, <code>afs_write</code>, <code>afs_search</code>, <code>afs_exec</code></p></li><li><p><strong>Backends vary underneath:</strong> relational DBs, vector stores, knowledge graphs. The agent doesn&#8217;t care. That&#8217;s the point.</p></li></ul><p>Why does this matter? Because right now, every new capability means new tool definitions crammed into the context window. &#8220;Here are 47 functions you can call, please read all of them carefully before doing anything.&#8221; AFS flips that: instead of eagerly loading everything, the model discovers and loads what it needs on demand. Like a file system. Because it is one.</p><p>If you read my previous post on <a href="https://trevinsays.com/p/did-docker-just-solve-mcps-two-biggest">Docker&#8217;s Dynamic MCP</a>, this is the same instinct elevated to a more general, and powerful, layer. AFS is what Dynamic MCP plus a good memory system might look like as a first-class OS abstraction. Or: what we&#8217;d build if we admitted that &#8220;just make the context window bigger&#8221; isn&#8217;t a strategy.</p><h2>3 memory layers with actual semantics</h2><p>Most &#8220;memory&#8221; in current agent systems is either RAG (retrieve relevant chunks and hope for the best) or naive caching (remember the last N messages until you don&#8217;t). The paper proposes something more structured:</p><p><strong>History.</strong> Immutable log of everything. Every interaction, every tool call, every model output. Used for provenance, debugging, compliance. Your source of truth. (Path: <code>/context/history/</code>)</p><p><strong>Memory.</strong> Indexed, structured views optimized for retrieval. Episodic memory for session summaries. Fact memory for atomic statements. User memory for preferences. Procedural memory for tool definitions. (Paths like <code>/context/memory/agentID</code>)</p><p><strong>Scratchpad.</strong> Temporary workspace. Agents draft plans, test hypotheses, do intermediate reasoning here. Can be selectively promoted to Memory or archived to History. (Path: <code>/context/pad/taskID</code>)</p><p>All transitions between layers get logged with timestamps and lineage metadata. You can trace how context evolved, which is essential once you care about governance. Or once something goes wrong and you need to figure out why.</p><p>This is exactly what all the &#8220;memory&#8221; tools we are seeing crop up: structured memory graphs that let coding agents follow linked tasks over time instead of reinventing context every session. The alternative is your agent starting fresh every time like a goldfish with a very expensive API bill.</p><h2>The pipeline that makes context manageable</h2><p>The paper formalizes three components:</p><p><strong>Context Constructor.</strong> Selects and prioritizes what enters the token window. Uses metadata to rank relevance. Compresses to fit budget. Outputs a manifest documenting what was included, what was excluded, and why. Finally, a system that can explain why it ignored your carefully written instructions. (I&#8217;d kill for just this part right now)</p><p><strong>Context Updater.</strong> Controls <strong>when</strong> and <strong>how</strong> context flows in. Static snapshots for single-turn tasks. Progressive streaming for extended reasoning. Adaptive refresh for dynamic sessions. Keeps the window coherent as the conversation evolves. This is the part most current systems skip entirely, which is why your agent gets progressively more confused over time.</p><p><strong>Context Evaluator.</strong> Closes the loop. Validates outputs against source context. Flags hallucinations and contradictions. Writes verified results back to Memory with versioning. When confidence is low, triggers human review and stores those corrections as first-class context elements. In other words: catches the model lying and takes notes for later.</p><p>The pipeline exists because GenAI has three architectural constraints that cascade upward:</p><ul><li><p>Token windows are finite and expensive</p></li><li><p>Models are stateless between sessions</p></li><li><p>Outputs are probabilistic (same input can yield different outputs, none of them necessarily correct)</p></li></ul><p>Once you internalize these constraints, &#8220;prompt engineering&#8221; definitely starts to feel like the wrong frame. Despite what every vibe coder and youtuber says, your success won&#8217;t strictly come from crafting clever prompts. You&#8217;re managing an information lifecycle. The clever prompts are a coping mechanism and you just realized you&#8217;ve been in denial this whole time.</p><h2>Humans as co-processes, not just supervisors</h2><p>Here&#8217;s a choice I appreciate: human annotations, overrides, and corrections get stored as explicit context artifacts under <code>/context/human/</code>.</p><p>They&#8217;re versioned, queryable, reusable. Humans become co-processes in the system. Their judgment enters the same context fabric as everything else. Not as an afterthought. Not as a Slack thread someone screenshots and pastes into a prompt.</p><p>If you&#8217;re building for regulated domains (healthcare, finance, legal), this matters enormously. You want human decisions and AI behavior recorded together, not scattered across logs, tickets, and random docs that nobody will find when the auditor asks.</p><h2>The tools are already converging here</h2><p>Look at what&#8217;s shipping:</p><p><strong>Claude Code</strong> now has project memory and portions of a longer term memory. 3rd party tools like <a href="https://github.com/thedotmack/claude-mem">claude-mem</a> extend it further into persistent teammates instead of stateless interns who forget your name every morning.</p><p><strong>Cursor</strong> <strong>and VS Code</strong> has a growing ecosystem of memory banks and MCP-based backends (<a href="https://github.com/getzep/graphiti">Graphiti</a>, <a href="https://docs.cline.bot/prompting/cline-memory-bank">Cline Memory Bank</a>) keeping project context alive across sessions.</p><p><strong><a href="https://github.com/steveyegge/beads">Beads</a></strong> provides structured memory and issue graphs for coding agents executing long task chains.</p><p>These are all pragmatic answers to the same pain points: stateless models, limited windows, the need for long-lived governed context. The industry is converging on this whether or not anyone&#8217;s read the paper.</p><h2>What&#8217;s still missing</h2><p>The paper is more opinionated on traceability than most current tools:</p><ul><li><p>Every context transition logged as a transaction</p></li><li><p>Evaluation results, confidence scores, and human overrides stored as auditable metadata</p></li></ul><p>Most agents today still operate as &#8220;black box but helpful.&#8221; You ask it to do something. It does something. Maybe the right thing. You find out eventually? </p><p>Observability is improving, but the paper&#8217;s implicit argument is: if you want AI in mission-critical workflows, governed context is as important as the best possible prompts. Probably more important. Your clever prompt isn&#8217;t going to save you when the model confidently fabricates information that results in disaster in a mission critical workflow.</p><h2>Where this leads</h2><p>Frontier models will keep improving. Dare I say that&#8217;s tablestakes?</p><p>The paper gives you a frame for where non-model innovation happens:</p><ul><li><p><strong>Context infrastructure.</strong> Unified namespaces, progressive tool access, agentic file systems.</p></li><li><p><strong>Memory systems.</strong> History, memory, scratchpad with lifecycle semantics, pruning, dedup.</p></li><li><p><strong>Governance.</strong> Traceable pipelines you can replay, audit, correct.</p></li><li><p><strong>Humans as data.</strong> Annotations and overrides as first-class context, not afterthoughts.</p></li></ul><p>Claude Code, Cursor, Beads, Dynamic MCP. We&#8217;re seeing early expressions of these ideas. The paper is the architectural blueprint that explains why they&#8217;re all converging. Not because anyone coordinated. Because the problems are real and the alternatives are worse.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Did Docker Just Solve MCP’s Two Biggest Problems?]]></title><description><![CDATA[The speed of this ecosystem is the real story]]></description><link>https://trevinsays.com/p/did-docker-just-solve-mcps-two-biggest</link><guid isPermaLink="false">https://trevinsays.com/p/did-docker-just-solve-mcps-two-biggest</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Sat, 06 Dec 2025 16:48:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BUOZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png" 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_!BUOZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BUOZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png 424w, https://substackcdn.com/image/fetch/$s_!BUOZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png 848w, https://substackcdn.com/image/fetch/$s_!BUOZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png 1272w, https://substackcdn.com/image/fetch/$s_!BUOZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BUOZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png" width="1456" height="839" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:839,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7905761,&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;:true,&quot;internalRedirect&quot;:&quot;https://trevinsays.com/i/180854332?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.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_!BUOZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png 424w, https://substackcdn.com/image/fetch/$s_!BUOZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png 848w, https://substackcdn.com/image/fetch/$s_!BUOZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png 1272w, https://substackcdn.com/image/fetch/$s_!BUOZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412e7138-0097-48ec-ad9d-03a11a38e2ae_2720x1568.png 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>Run this command and you&#8217;ve given a stranger access to your machine:</p><p><code>npx -y @some-random/mcp-server</code></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>That&#8217;s how most MCP servers get installed today. No sandboxing. No verification. Just arbitrary code execution with whatever permissions your terminal has.</p><p><a href="https://www.docker.com/blog/docker-mcp-catalog-secure-way-to-discover-and-run-mcp-servers/)">Docker&#8217;s blog</a> calls it what it is: developers &#8220;making a dangerous trade-off: convenience over security.&#8221;</p><p>For teams expecting to run MCP servers in trusted environments, this is usually a non-starter. You can&#8217;t have engineers pulling random servers the way they might install npm packages for a side project. The blast radius is pretty much unlimited.</p><p>But trust isn&#8217;t the only blocker.</p><h2>The Context Bloat Problem</h2><p><a href="https://www.anthropic.com/engineering/code-execution-with-mcp">Anthropic</a> recently acknowledged what power users have been experiencing:</p><blockquote><p>&#8220;Today developers routinely build agents with access to hundreds or thousands of tools across dozens of MCP servers. However, as the number of connected tools grows, loading all tool definitions upfront and passing intermediate results through the context window slows down agents and increases costs.&#8221;</p></blockquote><p>Connect 25 MCP servers and your agent loads hundreds (or even thousands?) of tool definitions before doing anything useful. That&#8217;s slower inference, higher costs, and worse performance&#8212;the <a href="https://arxiv.org/abs/2307.03172">lost in the middle</a> problem means models struggle to use tools buried deep in massive context windows.</p><p>&#8220;Just make the context window bigger&#8221; doesn&#8217;t solve this. You&#8217;re still paying for tokens you don&#8217;t need and degrading the model&#8217;s ability to find what matters.</p><h2>Docker Built What Anthropic Proposed</h2><p>Anthropic <a href="https://www.anthropic.com/engineering/code-execution-with-mcp">describes</a> solutions like &#8220;progressive disclosure&#8221;: loading tool definitions on-demand rather than upfront. They suggest a <code>search_tools</code> capability so agents can find relevant tools without loading everything.</p><p><a href="https://www.docker.com/blog/docker-sandboxes-a-new-approach-for-coding-agent-safety/">Docker&#8217;s Dynamic MCP</a> implements exactly this:</p><ul><li><p><code>mcp-find</code>: Search the catalog for MCP servers by name or description</p></li><li><p><code>mcp-add</code>: Add a server to the current session on-demand</p></li><li><p><code>mcp-remove</code>: Remove servers you no longer need</p></li></ul><p>Instead of pre-configuring every MCP server before starting a session, agents discover and add servers during the conversation. The context window contains only what&#8217;s actually being used &#10024;.</p><h2>Trust Through Containerization</h2><p>For the security problem, <a href="https://hub.docker.com/mcp">Docker&#8217;s MCP Catalog</a> layers trust through containerization plus curation.</p><p><strong>Docker-built servers</strong> get the full treatment:</p><ul><li><p>Cryptographically signed images</p></li><li><p>Complete provenance and SBOM (Software Bill of Materials) metadata</p></li><li><p>Continuous security maintenance</p></li></ul><p><strong>Community-built servers</strong> still run containerized:</p><ul><li><p>Isolated with restricted resources (1 CPU, 2GB memory)</p></li><li><p>No host filesystem access by default</p></li><li><p>Clear labeling distinguishing them from Docker-maintained options</p></li></ul><p>This isn&#8217;t blind trust. It&#8217;s trust with verification and blast radius limits. For teams, the Docker-built servers provide production-level confidence. For individuals, containerization limits the damage even a malicious server could do despite potentially lower stakes.</p><h2>The Pace Is the Point</h2><p>Here&#8217;s the timeline:</p><ul><li><p><strong>November 2022:</strong> ChatGPT launches</p></li><li><p><strong>November 2024:</strong> Anthropic launches MCP</p></li><li><p><strong>March 2025:</strong> OpenAI adopts MCP</p></li><li><p><strong>November 2025:</strong> Docker ships Dynamic MCP with containerization and curation</p></li></ul><p>MCP is 13 months old. We already have what feels like unlimited MCP servers, major competitors on the same open standard, and now at least one option for production infrastructure addressing the protocol&#8217;s biggest limitations.</p><p>We&#8217;re still rubbing sticks together to make fire, but we went from sticks to matches to lighters in a year.</p><p>The AI we use today is the worst it will ever be but that&#8217;s not criticism. It&#8217;s the most optimistic thing you can say about where we&#8217;re headed.</p><h2>The Takeaway?</h2><p>I don&#8217;t think Docker&#8217;s Dynamic MCP is the whole story.  What stands out more to me is just how quickly real problems are finding solutions in this new age of building with AI.</p><p>If you&#8217;ve been waiting because MCP felt too risky or too unwieldy for serious use, the blockers are starting to fall. Worth paying attention.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[DeepSeek V3.2 Is a Reminder: Build Flexibility Into Your AI Strategy Now]]></title><description><![CDATA[Open-source models are catching up faster than you think]]></description><link>https://trevinsays.com/p/deepseek-v32-is-a-reminder-build</link><guid isPermaLink="false">https://trevinsays.com/p/deepseek-v32-is-a-reminder-build</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Wed, 03 Dec 2025 06:32:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!E1k2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.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_!E1k2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E1k2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg 424w, https://substackcdn.com/image/fetch/$s_!E1k2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg 848w, https://substackcdn.com/image/fetch/$s_!E1k2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!E1k2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E1k2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg" width="1024" height="687" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:245710,&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://trevinsays.com/i/180576060?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.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_!E1k2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg 424w, https://substackcdn.com/image/fetch/$s_!E1k2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg 848w, https://substackcdn.com/image/fetch/$s_!E1k2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!E1k2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19dfdcd6-cdfc-4019-8582-d87633783f1b_1024x687.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>DeepSeek <a href="https://api-docs.deepseek.com/news/news251201">just dropped V3.2</a> and its high-compute variant &#8220;Speciale,&#8221; both fully open source under an MIT license. The benchmarks are striking, but the bigger story isn&#8217;t about who&#8217;s &#8220;winning.&#8221; It&#8217;s about what this means for how you should be thinking about AI strategy.</p><h2><strong>The Numbers That Matter</strong></h2><p>Let&#8217;s start with costs, because this is where it gets real:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LYCd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LYCd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png 424w, https://substackcdn.com/image/fetch/$s_!LYCd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png 848w, https://substackcdn.com/image/fetch/$s_!LYCd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png 1272w, https://substackcdn.com/image/fetch/$s_!LYCd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LYCd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png" width="1236" height="588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:1236,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83510,&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://trevinsays.com/i/180576060?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.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_!LYCd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png 424w, https://substackcdn.com/image/fetch/$s_!LYCd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png 848w, https://substackcdn.com/image/fetch/$s_!LYCd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.png 1272w, https://substackcdn.com/image/fetch/$s_!LYCd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce2b10cc-fa2a-454a-988a-1d9e657a76a5_1236x588.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><figcaption class="image-caption">Input vs Output Costs per 1M Token by Model</figcaption></figure></div><p>For a workload generating 1 million output tokens per month, that&#8217;s a 20-30x cost differential.</p><p>The performance? DeepSeek V3.2-Speciale scored 96.0% on AIME 2025 (advanced math) versus GPT-5 High&#8217;s 94.6%. On Terminal Bench 2.0 (coding workflows), DeepSeek hit 46.4% compared to GPT-5&#8217;s 35.2%. The model achieved gold-medal performance in the 2025 International Mathematical Olympiad and International Olympiad in Informatics.</p><p>They achieved this partly through <a href="https://github.com/deepseek-ai/DeepSeek-V3.2-Exp/blob/main/DeepSeek_V3_2.pdf">DeepSeek Sparse Attention (DSA)</a>, an efficient attention mechanism that cuts compute on long-context tasks while preserving output quality.</p><p>This is an open-source model matching or beating frontier closed models on key benchmarks at a fraction of the cost.</p><h2><strong>We&#8217;re Still Early. Act Like It.</strong></h2><p>Here&#8217;s what gets lost in the &#8220;who&#8217;s ahead&#8221; debates: we are still in the early, volatile phase of AI development. Today&#8217;s pricing won&#8217;t be tomorrow&#8217;s pricing. Assumptions about market structure haven&#8217;t settled.</p><p>According to <a href="https://epoch.ai/data-insights/llm-inference-price-trends">Epoch AI research from March 2025</a>, LLM inference prices are dropping between 9x and 900x per year depending on the benchmark, with a median of 50x per year. Since January 2024, that median rate has accelerated to 200x per year.</p><p>We&#8217;ve seen this pattern before. In early 2021, open-source databases overtook commercially licensed databases in popularity for the first time, <a href="https://www.riministreet.com/blog/open-source-database-roundup/">according to DB-Engines</a>. Oracle, which once dominated enterprise databases, now sits at about 12% developer usage. The premium option didn&#8217;t disappear, but it went from default choice to niche option as open alternatives matured.</p><p>AI is moving faster than databases ever did. DeepSeek caused market chaos in January with their <a href="https://api-docs.deepseek.com/news/news250120">release of R1</a>, went quiet for better part of a year while OpenAI shipped GPT-5 (then 5.1) and Anthropic released their Claude 4.5 family of models.  DeepSeek comes back hard with their release yesterday.</p><h2><strong>The Cost Nuance</strong></h2><p>There&#8217;s an important caveat. Right now, many teams chase the frontier, upgrading to GPT-5 or Claude 4.5 as soon as they ship. This means they&#8217;re not capturing the cost reductions at the capability tier they actually need. You keep paying premium prices because you keep upgrading to premium models.</p><p>But this won&#8217;t last forever. At some point, &#8220;good enough&#8221; really is good enough for most business use cases. When teams stop reflexively chasing the latest model and instead match capability to need, the dramatic cost reductions we&#8217;re seeing will finally flow through to the bottom line.</p><p>The question is whether your architecture will be ready to take advantage of it.</p><h2><strong>The Case for Model Agnosticism</strong></h2><p>I&#8217;ve talked with various product and engineering leaders over the last 6 monsh, and building model flexibility has become a consistent priority. In my own side projects, I always use <a href="https://openrouter.ai/">OpenRouter</a>, a routing layer that lets you switch between models without changing your integration.</p><p>Tools like <a href="https://openrouter.ai">OpenRouter</a>, <a href="https://Chutes.ai">Chutes.ai</a>, and self-hosted options like <a href="https://www.litellm.ai/">LiteLLM</a> aren&#8217;t fringe anymore. They&#8217;re becoming standard infrastructure for teams that smartly want optionality.</p><p>This isn&#8217;t about abandoning Claude or GPT. It&#8217;s about recognizing that when the landscape moves this fast, flexibility has real value:</p><p><strong>Vendor leverage</strong>: Viable open-source alternatives give you negotiating power, even if you never switch.</p><p><strong>Cost optionality</strong>: Having the ability to route workloads to cheaper models as capability gaps narrow is valuable as pricing continues to shift.</p><p><strong>Use-case matching</strong>: Not every task needs a frontier model. Route complex reasoning to GPT-5, handle simpler tasks with DeepSeek (or another open source model).</p><h2><strong>&#8230;so what?</strong></h2><p>The AI landscape is more dynamic than the past few months suggested. Just because closed-source models have been making impressive strides doesn&#8217;t mean open source stopped innovating.</p><p>The practical takeaway is straightforward: if you haven&#8217;t already, focus on building flexibility into your AI stack now. Not because you need to switch today, but because the cost of that flexibility is low and the optionality is valuable in a market that&#8217;s still finding its shape.</p><p>We&#8217;re early. The model that&#8217;s best today may not be best in six months. The pricing that seems fixed today will look very different soon. Build accordingly.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin&#8217;s Notes! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Your team ships faster with AI. So why are results flat?]]></title><description><![CDATA[When execution gets cheap, scarcity shifts to judgment.]]></description><link>https://trevinsays.com/p/your-team-ships-faster-with-ai-so</link><guid isPermaLink="false">https://trevinsays.com/p/your-team-ships-faster-with-ai-so</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Sat, 22 Nov 2025 21:04:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Dqlm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png" 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_!Dqlm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dqlm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png 424w, https://substackcdn.com/image/fetch/$s_!Dqlm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png 848w, https://substackcdn.com/image/fetch/$s_!Dqlm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png 1272w, https://substackcdn.com/image/fetch/$s_!Dqlm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dqlm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png" width="1024" height="585" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png&quot;,&quot;srcNoWatermark&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4df4de81-a898-46fe-a8b3-5c62985961f8_1024x585.jpeg&quot;,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:585,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124275,&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://trevinsays.substack.com/i/179610531?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df4de81-a898-46fe-a8b3-5c62985961f8_1024x585.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_!Dqlm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png 424w, https://substackcdn.com/image/fetch/$s_!Dqlm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png 848w, https://substackcdn.com/image/fetch/$s_!Dqlm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png 1272w, https://substackcdn.com/image/fetch/$s_!Dqlm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca09ce98-77c0-49d2-9681-f5524b495f95_1024x585.png 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>You open your fancy AI voice transcription app. Talk through a feature with your AI of choice. It helps you iterate, bangs out the PRD, and then an AI agent helps your engineers build it, and it ships. Done before lunch.</p><p>Everyone&#8217;s talking about teams vibe-coding their way to 10x velocity. You&#8217;re hitting those numbers too. You feel superhuman. Fifty deploys in six weeks.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin's Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Revenue is flat. Customer satisfaction moved sideways.</p><p>What&#8217;s going on?</p><h2>The constraint shifted while you were celebrating velocity</h2><p>For years, product teams pointed at engineering capacity as the obvious bottleneck. Designers waited weeks for engineers to implement simple flows. PMs watched great ideas pile up in backlogs with no path to production. You brainstormed &#8220;innovation&#8221; and &#8220;no meeting Wednesdays&#8221; to try to boost productivity.</p><p>AI seemed to solve this. Code generation turned specs into features overnight. No-code tools let designers ship without engineering. Natural language interfaces converted Slack messages into <s>JIRA</s> Linear tickets.</p><p>Teams declared victory over the bottleneck.</p><p>Oops. They were wrong.</p><p>The bottleneck moved to another place almost overnight: deciding what&#8217;s worth building at all.</p><h2>When everything becomes easy to ship, nothing feels important to ship</h2><p>Walk through a typical product team&#8217;s week after AI enters the picture:</p><p><strong>Monday</strong>: Designer generates three homepage variants, ships the one that tested highest in the moment.</p><p><strong>Tuesday</strong>: PM uses AI to write specs for five small features customers mentioned in passing.</p><p><strong>Wednesday</strong>: Engineer pairs with AI to build all five features by Thursday.</p><p><strong>Friday</strong>: Team reviews analytics. Nothing moved. The product feels less coherent than it did last month.</p><p>Here&#8217;s what went wrong: AI eliminated the friction that used to force prioritization. When shipping carried high costs, teams naturally filtered ideas through &#8220;is the juice worth the squeeze?&#8221; Now shipping feels free, so everything ships.</p><p>The backlog became an execution queue, not a strategy document.</p><h2>What AI actually automates: the shallow work</h2><p>If your version of product management means:</p><ul><li><p>Turning messy stakeholder requests into clean requirements</p></li><li><p>Routing work between teams</p></li><li><p>Sitting in status meetings documenting decisions</p></li><li><p>Tweaking copy and UX elements in isolation</p></li><li><p>Writing specs that restate obvious points</p></li></ul><p>AI handles this today. Language models convert context into artifacts. Automation tools coordinate handoffs. GenAI tools produce variants on demand.</p><p>This is the shallow layer of PM: coordination disguised as strategy, documentation disguised as decision-making.</p><p>When people say &#8220;PM is dead,&#8221; they&#8217;re describing this layer. And they&#8217;re right. It should die.</p><h2>The new bottleneck: judgment under abundance</h2><p>When execution gets cheap, scarcity moves to judgment.</p><p>Real product management now means:</p><p><strong>Conviction.</strong> Your team can ship anything. Which problems actually matter? Which customer segment deserves focus? Which ideas are technically easy but strategically wrong? Conviction means saying no when saying yes feels effortless.</p><p><strong>Taste.</strong> AI generates 20 landing page variants in 2 mins and 12 seconds. You iterate, eliminate the mediocre ones. 3 are strong and worth A/B testing. Taste means knowing the difference without running tests unnecessarily.</p><p><strong>Coherence.</strong> You team ships UX updates, add features and run experiments. Nothing contradicts the product vision because nobody is holding one. Coherence means ensuring the product feels intentionally designed, not randomly assembled.</p><p>These skills don&#8217;t scale with AI. They get harder as AI makes everything else easier.</p><h2>How the role evolves</h2><p>The PM that survives AI looks nothing like the PM that preceded it.</p><p><strong>Old PM skills</strong>:</p><ul><li><p>Writing detailed specs (ask me about Microsoft days in early 2000s with 30+ page specs commonplace)</p></li><li><p>Coordinating across teams</p></li><li><p>Managing backlogs</p></li><li><p>Triaging bugs</p></li><li><p>Running status meetings and sharing notes afterwards</p></li></ul><p><strong>New PM skills</strong>:</p><ul><li><p>Spending more time with customers while AI handles note synthesis</p></li><li><p>Using AI to explore ten product directions, then applying judgment to pick one</p></li><li><p>Maintaining product coherence when everyone can ship independently</p></li><li><p>Deciding which problems deserve solving when all problems feel solvable</p></li><li><p>Holding conviction when AI makes every tactic feel achievable</p></li></ul><p>PMs used to ask: &#8220;How do we build this?&#8221;</p><p>The best PMs should now be asking: &#8220;Should we build this at all?&#8221;</p><h2>Where you actually spend your time</h2><p>Look at what consumed your time this week.</p><p>Did you spend most of it on:</p><ul><li><p>Status updates and coordination</p></li><li><p>Ticket writing and spec drafting</p></li><li><p>Routing requests between teams</p></li><li><p>Making sure work happened on schedule</p></li></ul><p>Or did you spend it on:</p><ul><li><p>Direct conversations with customers</p></li><li><p>Turning insights into clearer strategic bets (or tests)</p></li><li><p>Aligning your team around a coherent direction</p></li><li><p>Deciding which opportunities to deliberately ignore</p></li></ul><p>The first list means you&#8217;re competing with AI. The second list means AI amplifies you.</p><h2>What comes next</h2><p>Product management isn&#8217;t dying. It&#8217;s mutating into something different and more valuable.</p><p>The shallow version (coordination, documentation, ticket management) gets automated. The deep version (conviction, taste, coherence) becomes essential.</p><p>AI didn&#8217;t remove your bottleneck. It moved it to the one place automation struggles: judgment about what matters.</p><p>Teams that realize this early stop celebrating velocity and start investing in conviction. They use AI to handle execution while building their judgment muscle.</p><p>The PM role that survives looks less like a project coordinator and more like a curator: someone who maintains intentionality when the cost of shipping drops to zero.</p><p>That&#8217;s not dead. That&#8217;s just getting started.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://trevinsays.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Trevin's Substack! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Did we break product documentation? Is AI forcing us to fix it?]]></title><description><![CDATA[The rise of Model Context Protocol (MCP) servers tells an interesting story about toolchain fragmentation.]]></description><link>https://trevinsays.com/p/did-we-break-product-documentation</link><guid isPermaLink="false">https://trevinsays.com/p/did-we-break-product-documentation</guid><dc:creator><![CDATA[Trevin Chow]]></dc:creator><pubDate>Sat, 22 Nov 2025 01:06:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6Hpr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png" 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_!6Hpr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Hpr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!6Hpr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!6Hpr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!6Hpr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Hpr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1411348,&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;:true,&quot;internalRedirect&quot;:&quot;https://trevinsays.substack.com/i/179610089?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.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_!6Hpr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!6Hpr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!6Hpr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!6Hpr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c1897ce-d4df-4c75-a641-7efe0bb878aa_1280x720.png 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>The rise of <strong>Model Context Protocol (MCP)</strong> servers tells an interesting story about toolchain fragmentation.</p><p>Anthropic released Claude with desktop integration. What felt like overnight, the ecosystem exploded with MCP servers: Notion, Linear, Jira, GitHub, file systems, etc. Each one a bridge between our AI robot friends and their necessary sources of truth and input.</p><p>We&#8217;ve distributed product context across disconnected systems, and now we&#8217;re scrambling to reconnect them for AI consumption.</p><p>Product teams adopted collaboration platforms for good reasons. Google Docs, Notion and Coda delivered real-time collab, richer formatting, cross-functional visibility. These tools improved how we all worked together.</p><p>But they also introduced distance. The PRD explaining a feature lives in Notion. The issues tracking its implementation live in Linear. The code implementing it lives in GitHub. The AI agent trying to help your engineer (or write code on its own!) needs all three.</p><p>So we build integration layers. MCPs for context retrieval, Webhooks for notifications, blah blah. Each added latency, failure modes, maintenance, etc.</p><p>Meanwhile, files (esp markdown) sitting in Git repos have always offered something different: adjacency. When documentation lives in the same repository as code, version control is unified. AI systems access context through the same interface they use for code. The integration tax drops to zero.</p><p>The tradeoff is real. Git workflows remain challenging for non-technical team members. Markdown lacks the collaborative features&#8212;inline comments, @mentions, rich tables&#8212;that product teams depend on. This isn&#8217;t a simple swap.</p><p>But it suggests an architectural question: what if the next generation of product tools built on Git as infrastructure rather than treating it as one integration target among many?</p><p>You&#8217;d preserve proximity while rebuilding the collaboration layer on top. Product context becomes a first-class artifact in the repository. AI systems get native access. PMs get the UX they need.</p><p>The interoperability boom isn&#8217;t a mistake, it&#8217;s a rational response to toolchain sprawl. But the fact that we need it signals a deeper fragmentation we&#8217;ve normalized.</p><p>Product documentation&#8217;s center of gravity is shifting back toward code. The question is whether we should continue to ride that shift or should it go in another direction?</p><p>What&#8217;s your team&#8217;s documentation strategy in the AI era?</p>]]></content:encoded></item></channel></rss>