<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Max</title>
    <description>The latest articles on DEV Community by Max (@maxaibuilds).</description>
    <link>https://dev.to/maxaibuilds</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4069351%2F2a25f7d8-101a-42e4-a4fd-29f419eba0e9.png</url>
      <title>DEV Community: Max</title>
      <link>https://dev.to/maxaibuilds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maxaibuilds"/>
    <language>en</language>
    <item>
      <title>CLIs for Humans, APIs for Programs — Now What for Agents?</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Sun, 09 Aug 2026 12:05:02 +0000</pubDate>
      <link>https://dev.to/maxaibuilds/clis-for-humans-apis-for-programs-now-what-for-agents-gnj</link>
      <guid>https://dev.to/maxaibuilds/clis-for-humans-apis-for-programs-now-what-for-agents-gnj</guid>
      <description>&lt;p&gt;I've been thinking about a shift in software interfaces.&lt;/p&gt;

&lt;p&gt;CLIs were designed for humans. APIs were designed for programs. Now we're designing interfaces for agents.&lt;/p&gt;

&lt;p&gt;That framing is a simplification — CLIs were always partly machine-operated, since shell scripts have driven them non-interactively for decades, which is exactly why they're a natural substrate for agents in the first place. But the emphasis is changing. We're no longer just tolerating non-human callers; we're now deliberately designing for a specific one — the agent.&lt;/p&gt;

&lt;p&gt;The first two we've had decades to figure out. The third is still open — and it's the question this piece keeps circling: what should an interface designed for agents actually be?&lt;/p&gt;

&lt;p&gt;There's already a lot of useful work happening around making CLIs safer, more predictable, and easier for agents to operate. I've been applying many of those ideas while redesigning the CLI for an open-source project, and the more I worked through the details, the more I started wondering whether there's another layer to the problem.&lt;/p&gt;

&lt;p&gt;Maybe we shouldn't just make existing CLIs easier for agents to use. Maybe we should also rethink &lt;strong&gt;what a command is supposed to represent in the first place&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making a CLI agent-friendly isn't the same as designing it for agents
&lt;/h2&gt;

&lt;p&gt;Recent work on agent-friendly CLIs covers a lot of important ground. Zbigniew Sobiecki's &lt;a href="https://zbigniew.me/writing/building-agent-friendly-clis/" rel="noopener noreferrer"&gt;&lt;em&gt;Building Agent-Friendly CLIs&lt;/em&gt;&lt;/a&gt; is a great example, and the following list summarises the kind of discipline that work advocates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structured output&lt;/li&gt;
&lt;li&gt;stable exit codes&lt;/li&gt;
&lt;li&gt;predictable errors&lt;/li&gt;
&lt;li&gt;clean stdout/stderr separation&lt;/li&gt;
&lt;li&gt;non-interactive behaviour&lt;/li&gt;
&lt;li&gt;dry runs&lt;/li&gt;
&lt;li&gt;idempotency&lt;/li&gt;
&lt;li&gt;progressive discovery&lt;/li&gt;
&lt;li&gt;machine-readable help&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Agent-facing &lt;em&gt;skills&lt;/em&gt; usually show up alongside this work as a companion layer rather than a CLI feature per se — more on that later.)&lt;/p&gt;

&lt;p&gt;I've been applying many of these ideas while redesigning the CLI for &lt;strong&gt;loomloom&lt;/strong&gt;, a compiler that turns &lt;em&gt;AI work&lt;/em&gt; — an author's instructions and workflow — into executable systems. But the more I worked through the details, the more I suspected we're solving only part of the problem.&lt;/p&gt;

&lt;p&gt;Here's the distinction I keep coming back to: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent-friendly design asks how an agent can reliably operate an interface. Intent-first design asks whether the interface exposes the right abstraction in the first place.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Most of the work above is about the first. This piece is about the second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources vs. intent
&lt;/h2&gt;

&lt;p&gt;Consider a traditional resource-oriented CLI. The system exposes its domain model directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;work create
execution get
execution retry
template publish
listing update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a perfectly reasonable model. The resource hierarchy tells you what exists, and commands operate on those resources.&lt;/p&gt;

&lt;p&gt;But an agent may know the resource model perfectly and still not want to &lt;em&gt;start&lt;/em&gt; from it. Imagine the user says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Run this work."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Something does have to figure out what "this work" is — resolve the identifier, decide whether it's a template, a private spec, or a market item, and create the right execution. The real question is &lt;em&gt;who does that, and when the agent has to think about it.&lt;/em&gt; In an intent-first design the agent issues one operation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;run &amp;lt;work&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the system performs that resolution underneath, as part of translating the intent. The agent doesn't have to navigate &lt;code&gt;Work → Execution → Artifact&lt;/code&gt; just to get started.&lt;/p&gt;

&lt;p&gt;Those resource commands become the tool the agent reaches for when it needs to &lt;em&gt;observe or recover&lt;/em&gt; — fetch results, inspect a failure, retry deliberately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;execution get
execution retry
artifact get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the question isn't whether agents understand resources. They often need to. The question is &lt;strong&gt;whether they should have to start from the resource model to do a routine thing&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowing the resource model vs. wanting to operate through it
&lt;/h2&gt;

&lt;p&gt;This is where agent-facing skills, MCP schemas, documentation, and machine-readable help earn their place. They can teach an agent what resources exist, how they relate, which commands operate on them, what inputs are required, what outputs to expect, and which operations are safe to retry. For a complex system, that knowledge can be essential.&lt;/p&gt;

&lt;p&gt;But there's an important distinction between &lt;strong&gt;knowing the resource model&lt;/strong&gt; and &lt;strong&gt;wanting to operate through the resource model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Consider a deployment system whose resource model looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
  └── Deployment
       └── Revision
            └── Instance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An agent can understand this entire hierarchy. But when the user says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Deploy the latest version."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the agent might reason through something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find application → find latest revision → create deployment → inspect deployment → verify instances
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resource model helps the agent reason about &lt;em&gt;what is happening&lt;/em&gt;. The intent provides a more direct way to express &lt;em&gt;what should happen&lt;/em&gt;, including the relevant parameters and constraints, without first navigating the hierarchy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deploy &amp;lt;application&amp;gt; --version latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while the system resolves which application, revision, and deployment are involved underneath. The intent isn't just the verb &lt;code&gt;deploy&lt;/code&gt; — it represents the desired operation at a higher level, while the resource model describes the concrete objects and state involved in carrying it out.&lt;/p&gt;

&lt;p&gt;That points at &lt;strong&gt;three conceptual layers&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        Agent
          │
          ▼
   Knowledge layer      what exists / how the system works
   (skills, MCP, schema)
          │
          ▼
   Intent layer         what the agent wants to accomplish
   (run / deploy / verify)
          │
          ▼
   State layer          what actually exists and what happened
   (application / revision / deployment / instance)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The intent usually traces back to a human goal, but the agent is the one expressing it at this boundary — and it adds operational intents of its own (quote, watch, retry) that the human never spelled out.&lt;/p&gt;

&lt;p&gt;The interesting design question is how these layers should interact — and, in particular, which one the agent should enter from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resource-oriented interfaces are still valuable
&lt;/h2&gt;

&lt;p&gt;It would be easy to dismiss resource-oriented design as legacy baggage — an artifact of software built before agents existed. It &lt;em&gt;is&lt;/em&gt; older than agents; that part is true. But being old isn't the same as being obsolete, and two things keep it relevant. &lt;/p&gt;

&lt;p&gt;First, resources expose state, and agents need state. Second, the model has been refined across generations of API and CLI design, which makes it flexible enough to carry into the agent era.&lt;/p&gt;

&lt;p&gt;An agent recovering from a failed operation may need to know what was created, what state it's in, which execution failed, which inputs were used, what artifacts exist, what version actually ran, and whether a retry is safe. Those are resource-level questions.&lt;/p&gt;

&lt;p&gt;A high-level command such as &lt;code&gt;retry&lt;/code&gt; is convenient, but eventually the agent needs to understand &lt;strong&gt;what exactly is being retried and why&lt;/strong&gt;. Resources are also how the agent sees state during normal operation — fetching results and checking status are resource reads too, not just break-glass moves. That combination — routine observation &lt;em&gt;plus&lt;/em&gt; a lower-level control surface for when automation goes wrong — is why I don't want to throw them away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why intent-oriented interfaces are attractive
&lt;/h2&gt;

&lt;p&gt;The real problem isn't resources — it's &lt;em&gt;leaky&lt;/em&gt; resources. Exposing every internal object directly tends to expose the system's &lt;strong&gt;implementation&lt;/strong&gt; model rather than its domain. Resource-oriented interfaces can even offer high-level operations — &lt;code&gt;kubectl apply&lt;/code&gt; deploys an app without making you hand-create a ReplicaSet, then a Pod. So the enemy was never resource orientation. It's when the interface leaks internal distinctions the caller shouldn't have to resolve.&lt;/p&gt;

&lt;p&gt;That's exactly what I ran into with the existing &lt;strong&gt;loomloom&lt;/strong&gt; CLI. A walk of the built binary counted 17 top-level command groups and 67 leaf commands — but the count isn't really the problem. The problem is &lt;em&gt;semantic fragmentation&lt;/em&gt;: running a single AI work was spread across six different commands, depending on the resource —&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;template submit-file
run execute
template-spec submit-workbook
template-spec run
market run
market workbook run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;— and lifecycle verbs were renamed per group (validating a work is &lt;code&gt;validate-file&lt;/code&gt; / &lt;code&gt;validate&lt;/code&gt; / &lt;code&gt;validate-workbook&lt;/code&gt;; estimating its cost is &lt;code&gt;precheck-file&lt;/code&gt; / &lt;code&gt;precheck&lt;/code&gt; / &lt;code&gt;precheck-workbook&lt;/code&gt; / &lt;code&gt;quote&lt;/code&gt;). A large CLI isn't necessarily bad. A CLI that makes one user intent choose among several internal execution paths is. Those are internal distinctions the caller shouldn't have to care about.&lt;/p&gt;

&lt;p&gt;For a human, that's a learning problem. For an agent, it's a &lt;strong&gt;decision problem&lt;/strong&gt;. The agent doesn't just need to know "how do I execute this?" — it also has to figure out "which of these execution paths corresponds to what I want?" That's unnecessary decision-making — every extra branch is another chance to pick the wrong path, read more documentation, or recover from a failed attempt.&lt;/p&gt;

&lt;p&gt;Neither is acceptable for a project as ambitious as loomloom. It's built to run large, parallel batches rather than one task at a time, and at that scale both costs compound — the learning friction across every new user, and the per-task decision overhead across every task in a run — so a small cost per task becomes a large one across the workload.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/cogfoundry-labs/loomloom/blob/main/docs/rfc/0001-intent-first-cli.md" rel="noopener noreferrer"&gt;loomloom intent-first CLI RFC (RFC-0001)&lt;/a&gt; proposes organising the surface around intent rather than internal resources, and the &lt;a href="https://github.com/cogfoundry-labs/loomloom/blob/main/docs/rfc/0002-cli-command-model.md" rel="noopener noreferrer"&gt;command-model RFC (RFC-0002)&lt;/a&gt; makes that concrete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;loom run quote &amp;lt;work&amp;gt; ...
loom run start &amp;lt;work&amp;gt; ...
loom run watch &amp;lt;run-id&amp;gt;
loom run results &amp;lt;run-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of requiring the user or agent to first know whether something is a &lt;code&gt;template&lt;/code&gt;, &lt;code&gt;template-spec&lt;/code&gt;, or &lt;code&gt;market&lt;/code&gt; object, the CLI resolves the appropriate underlying type when it can do so safely. The user or agent says what they want to do; the CLI handles more of the translation. For example, &lt;code&gt;loom run start &amp;lt;work&amp;gt;&lt;/code&gt; will resolve the work's type and validate its input on its own, but it won't cross the paid boundary without an explicit &lt;code&gt;--yes&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This isn't about hiding those distinctions forever. An experienced user or agent will eventually care whether something is a template, a spec, or a market item — and will want that control when they need precision. It's about &lt;em&gt;deferring&lt;/em&gt; the distinction. Someone trying loomloom for the first time should be able to run a &lt;code&gt;work&lt;/code&gt; and see a result before they've learned the taxonomy. For a young project, that gap — between "installed it" and "got something to happen" — is often what decides whether anyone comes back.&lt;/p&gt;

&lt;p&gt;That sounds attractive — and within limits, it is. But push that same helpfulness too far and it starts to create a new problem of its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The danger of being too helpful
&lt;/h2&gt;

&lt;p&gt;If we're designing for agents, why not go further? Why not let &lt;code&gt;loom run &amp;lt;work&amp;gt;&lt;/code&gt; automatically identify the work, select the version, estimate the cost, start the execution, watch it, retry failures, optimise model selection, and converge on the desired result?&lt;/p&gt;

&lt;p&gt;At that point it looks less like a CLI and more like an &lt;strong&gt;intent interface&lt;/strong&gt;. There's interesting prior art here in &lt;a href="https://www.cisco.com/c/en_au/solutions/intent-based-networking.html" rel="noopener noreferrer"&gt;Intent-Based Networking&lt;/a&gt;: express a desired outcome, translate it into concrete operations, activate it, continuously verify the result, and remediate when the system drifts. That model is surprisingly relevant to agent-operated software.&lt;/p&gt;

&lt;p&gt;But there's a catch. In networking, autonomous remediation is often exactly what you want. In a CLI that an AI agent controls, autonomous remediation might mean &lt;strong&gt;spending more money than the user intended&lt;/strong&gt; — a very different failure mode, especially in production workflows where many tasks run in parallel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 tasks running
      ↓
20 fail
      ↓
automatic retry
      ↓
some failures were actually permanent
      ↓
20 additional executions / API calls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A retry policy that looks harmless for a single task can become surprisingly expensive when multiplied across a batch. That matters particularly for &lt;strong&gt;loomloom&lt;/strong&gt;, which is optimised to run AI work as potentially large, parallel workloads rather than completing one task and stopping. It gets there by compiling each workflow into a fixed execution graph ahead of time — buying &lt;em&gt;structural&lt;/em&gt; determinism (a predictable execution shape, plus the parallelism and cost optimisation the runtime can schedule for you) rather than leaving control flow for an agent to improvise. The graph is fixed; the model steps inside it stay semantically stochastic. That's a deliberate trade — structural determinism for performance and reliability, without pretending the outputs are deterministic too — and it's exactly why retry policy has to be handled carefully at batch scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I currently draw the line
&lt;/h2&gt;

&lt;p&gt;The interesting part of this design isn't "intent-first wins." It's figuring out &lt;strong&gt;where intent should stop and explicit control should begin.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm experimenting with a simple principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assisted intent, gated at the wallet.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let the system do as much safe inference as possible before an operation becomes consequential, but make meaningful cost or mutation boundaries explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;intent → check / quote → explicit approval → start → watch → results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system can infer things that are safe to infer: what type of work an ID refers to, the input format, configuration from the normal resolution chain, and a stable identity for the logical operation so a retry can be recognised as the same request. But it should not silently infer things that spend money or mutate remote state.&lt;/p&gt;

&lt;p&gt;It's worth being honest about what this costs. Intent-first doesn't delete the resource model — it relocates responsibility for it. The caller stops navigating types; the system takes over resolution — ambiguity, precedence, version selection, defaults, authorisation. A good intent interface doesn't so much hide the resource model as take responsibility for resolving it, which is why &lt;em&gt;resolve safely or fail loudly&lt;/em&gt; matters more than &lt;em&gt;resolve cleverly&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;loom run quote ...&lt;/code&gt; can calculate what &lt;em&gt;will&lt;/em&gt; happen, while &lt;code&gt;loom run start ... --yes&lt;/code&gt; is an explicit activation boundary. An ambiguous work type should fail rather than silently pick one. And a failed paid operation should not automatically retry itself and potentially charge the user again.&lt;/p&gt;

&lt;p&gt;This is where the design became concrete for me. For long-running or parallel workloads, an agent may not know whether a previous request actually reached the backend — a timeout can happen &lt;em&gt;after&lt;/em&gt; the server has already accepted the work. If the agent simply resends, it could create a second execution. The standard fix is &lt;strong&gt;idempotency&lt;/strong&gt;: associate the request with a stable identifier so the backend can recognise repeated submissions of the same logical operation and handle them consistently instead of blindly creating another one. The key distinction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The system can make a retry safe without deciding that a retry should happen.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent or user still decides whether to retry. This is where &lt;strong&gt;intent-first&lt;/strong&gt; and &lt;strong&gt;agent-native&lt;/strong&gt; design start pulling in different directions: intent-first leans towards doing more for the caller — infer, automate, converge — while agent-native leans towards determinism and explicit control, so the agent can see what happened and decide the consequential steps itself. Auto-retry is exactly the "helpful" automation the first favours and the second resists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent-native doesn't mean fully autonomous
&lt;/h2&gt;

&lt;p&gt;Much of the recent thinking about agent-friendly CLIs focuses on making operations predictable, scriptable, and safe to retry. That makes sense — agents need deterministic interfaces and clear mutation boundaries, especially when they operate software without a human watching every command.&lt;/p&gt;

&lt;p&gt;But it raises a question: if we're making software easier for agents to operate, how much autonomy should we actually give the agent? There's a tempting direction — &lt;em&gt;agent-native = hide complexity + let the agent do everything&lt;/em&gt; — and I'm not sure that's the right endpoint. An agent needs abstraction, but it also needs to know what will happen, what happened, what failed, what it can safely retry, what requires approval, and how to recover.&lt;/p&gt;

&lt;p&gt;That's why RFC-0002 deliberately keeps the individual stages available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;run check
run quote
run start
run watch
run results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while still making the higher-level intent obvious. Note that this is &lt;em&gt;more&lt;/em&gt; commands, not fewer — intent-first doesn't mean command-minimal, it means decision-minimal: the agent faces one obvious path per goal rather than a menu of internal execution routes. The agent can take the convenient path when appropriate without losing access to the underlying control surface. In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hide the implementation model, not the operational state.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One clarification on "deterministic," since it's easy to overclaim: an intent like &lt;code&gt;run start&lt;/code&gt; isn't deterministic across &lt;em&gt;time&lt;/em&gt; — &lt;code&gt;--version latest&lt;/code&gt; may resolve differently tomorrow. What matters is that it's deterministic given the &lt;em&gt;same inputs and system state&lt;/em&gt;, and that the agent can always inspect exactly what the intent resolved to. And that time-sensitivity is the intent being honoured, not a bug: &lt;code&gt;--version latest&lt;/code&gt; is a request to &lt;em&gt;track&lt;/em&gt; the latest version, so resolving it freshly each run is exactly right. Pinning it to yesterday's version would be more deterministic across time — and wrong, because it would no longer match what was asked for. The result should always follow the intent, not a frozen snapshot of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two operational layers, one loop
&lt;/h2&gt;

&lt;p&gt;Putting it together: the knowledge layer tells the agent &lt;strong&gt;what exists and how the system works&lt;/strong&gt;, the intent layer expresses &lt;strong&gt;what the agent wants to accomplish&lt;/strong&gt;, and the state layer reports &lt;strong&gt;what actually exists and what happened&lt;/strong&gt;. The two things that sit &lt;em&gt;between&lt;/em&gt; those layers — translation on the way down, observation on the way back up — are where most of the real design work lives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              Agent
                │
                ▼
        Knowledge / skills
                │
                ▼
            Intent            run / deploy / verify
                │
                ▼
         Translation          resolve types, gate cost
                │
                ▼
              State           execution / artifact / …
                │
                ▼
    Observation / recovery    inspect, decide, retry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is that the agent doesn't have to start at the bottom. For common operations it can start with intent; when it needs to reason about state, recovery, debugging, or precise control, it descends into the state layer.&lt;/p&gt;

&lt;p&gt;This resembles how people actually learn unfamiliar systems: start with the goal, then learn the underlying structure as needed. Agents work the same way — they don't just execute commands, they &lt;em&gt;plan → act → observe → reason → recover → act again&lt;/em&gt;. The interface has to support both &lt;strong&gt;goal expression&lt;/strong&gt; and &lt;strong&gt;state inspection&lt;/strong&gt;. The point isn't to hide the system from the agent; it's to let the agent start at the level of abstraction it needs and go deeper when the task requires it. It's the same principle that lets a newcomer run their first &lt;code&gt;work&lt;/code&gt; before learning the taxonomy — start where you are, go deeper only when you must — now serving the agent mid-task rather than the human on day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  This changes what "agent-friendly" means
&lt;/h2&gt;

&lt;p&gt;A CLI being agent-friendly isn't only about whether an LLM can parse its output. It's about whether the interface offers the right &lt;strong&gt;abstraction at the right moment&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Planning&lt;/strong&gt; — high-level operations: &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;publish&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution&lt;/strong&gt; — predictable, explicit transitions: &lt;code&gt;quote&lt;/code&gt;, &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;watch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observation&lt;/strong&gt; — structured state: &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;results&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovery&lt;/strong&gt; — precise control over what happened: &lt;code&gt;get run&lt;/code&gt;, &lt;code&gt;inspect error&lt;/code&gt;, &lt;code&gt;retry&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which suggests that "should the CLI be resource-oriented or intent-oriented?" is the wrong question. The more interesting one is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Which abstraction should an agent use at each stage of planning, execution, observation, and recovery?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Protocol doesn't determine abstraction
&lt;/h2&gt;

&lt;p&gt;You might be thinking: why not just stand up an MCP server and be done with it? But MCP — like function calling, a REST API, or an SDK — defines &lt;em&gt;how&lt;/em&gt; an agent discovers and calls a capability. It doesn't decide &lt;em&gt;what&lt;/em&gt; the capability should be. You can expose &lt;code&gt;template submit-file&lt;/code&gt;, &lt;code&gt;run execute&lt;/code&gt;, and &lt;code&gt;market run&lt;/code&gt; over MCP just as faithfully as you can expose a single &lt;code&gt;run &amp;lt;work&amp;gt;&lt;/code&gt;; both are valid MCP. Protocol doesn't determine abstraction.&lt;/p&gt;

&lt;p&gt;Which is why none of this is really about the CLI. The CLI is just the concrete surface I happened to be redesigning. The real question — should an agent-facing interface hand the agent the resource model, or an intent-oriented operational surface? — sits above the protocol. Whatever the transport, something still has to decide what the agent operates on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think I've settled — challenge it
&lt;/h2&gt;

&lt;p&gt;Before the open questions, it's worth stating the positions this piece &lt;em&gt;does&lt;/em&gt; commit to — plainly, so they can be argued with. I'm reasonably confident about these, which is exactly why I'd like them stress-tested:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent-friendly isn't the same as designed-for-agents.&lt;/strong&gt; Parseable output is table stakes; the real question is whether the interface offers the right abstraction at each stage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents shouldn't have to start from the resource model&lt;/strong&gt; for routine work. Start from intent; descend to resources to observe and recover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The problem was never resources — it was &lt;em&gt;leaky&lt;/em&gt; resources&lt;/strong&gt; that expose the implementation model instead of the domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource-oriented interfaces are still worth keeping.&lt;/strong&gt; They're how an agent sees state, both routinely and during recovery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expose operational state, hide implementation.&lt;/strong&gt; What the agent can see and act on should be the system's real state — what exists, what happened — never the internal plumbing that produced it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe isn't the same as automatic.&lt;/strong&gt; Idempotency can make a retry safe without deciding that a retry &lt;em&gt;should&lt;/em&gt; happen — the decision stays with the agent or user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent-native doesn't mean fully autonomous.&lt;/strong&gt; Agents need determinism and explicit control as much as they need abstraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Resource- or intent-oriented?" is the wrong question.&lt;/strong&gt; The useful one is which abstraction fits each stage — planning, execution, observation, recovery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of these is obviously wrong — or obviously already solved — that's among the most useful things you could tell me.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is still an open question
&lt;/h2&gt;

&lt;p&gt;I'm not presenting this as solved. The loomloom RFCs are deliberately proposals for discussion. Working through them, though, I've realised these aren't all the same &lt;em&gt;kind&lt;/em&gt; of open question.&lt;/p&gt;

&lt;p&gt;Some I've taken a working position on — at least for loomloom — even if I'm not sure the answer generalises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How much inference is too much?&lt;/strong&gt; For loomloom, as much as is &lt;em&gt;safe&lt;/em&gt;, stopping at cost or mutation boundaries — "gated at the wallet." Whether that's the right general rule, I don't know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When should an agent be allowed to choose between resources?&lt;/strong&gt; My current answer is &lt;em&gt;not silently&lt;/em&gt;: an ambiguous type should fail rather than guess. But that may be too strict for lower-stakes systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Should intent-level commands always expose lower-level resource operations for precise control?&lt;/strong&gt; I've argued yes, but "always" is a strong word, and I'd like to know where it breaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much state should be exposed directly?&lt;/strong&gt; My rule of thumb is operational state yes, implementation model no; the line in between is still fuzzy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can a CLI stay predictable while still being high-level?&lt;/strong&gt; I think so — as long as it's deterministic given the same inputs and state, and the agent can inspect exactly what an intent resolved to. I'm less sure that holds under drift or adversarial use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Others I genuinely don't have an answer for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where should CLI, API, and MCP share the same intent model?&lt;/li&gt;
&lt;li&gt;Should an agent-facing skill count as part of the interface contract?&lt;/li&gt;
&lt;li&gt;How do we test whether a CLI is actually &lt;em&gt;easier for agents&lt;/em&gt; rather than merely easier to &lt;em&gt;describe&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;At batch scale, what's the right remediation policy when many parallel tasks fail — one where each per-task retry decision accounts for the total cost, not just per-task safety?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And an honest caveat under all of this: I'm relatively new to CLI design, and the CLI has decades of accumulated practice behind it. It's entirely possible that some of these were settled long ago and I just haven't found the answer yet. If you've built CLIs and one of these is a solved problem — or a famously hard one — I'd genuinely like to know which is which. Part of why I'm writing this is to reach the people who've been doing this far longer than I have.&lt;/p&gt;

&lt;p&gt;And most importantly: &lt;strong&gt;what have people actually observed when agents operate real software?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you've built an agent that operates a CLI, API, MCP server, or other developer tool — what abstraction worked better in practice? Did the agent benefit from higher-level intent? Did exposing resources make recovery and debugging easier? Where did abstraction help, and where did it get in the way?&lt;/p&gt;

&lt;p&gt;I'm still working this out, and I'd love to hear what you've seen.&lt;/p&gt;

&lt;p&gt;Disclosure: Drafted with a multi-agent assistant; direction and review are mine.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
