<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Ju Lin's AI Weblog: Agents</title><subtitle>An independent research notebook on AI engineering, agents, models and the systems around them.</subtitle><id>https://julin.ai/atom/tags/agents/index.xml</id><link rel="self" type="application/atom+xml" href="https://julin.ai/atom/tags/agents/index.xml"/><link rel="alternate" type="text/html" href="https://julin.ai/tags/agents/"/><author><name>Ju Lin</name></author><updated>2026-08-27T00:00:00+12:00</updated><entry><title>Where MCP Is Headed Next</title><id>https://julin.ai/2026/08/27/mcp-roadmap/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/27/mcp-roadmap/"/><published>2026-08-27T00:00:00+12:00</published><updated>2026-08-27T00:00:00+12:00</updated><category term="field-notes"/><category term="mcp"/><category term="agents"/><content type="html">&lt;p&gt;&lt;a href="https://blog.modelcontextprotocol.io/posts/mcp-roadmap/"&gt;The MCP maintainers published an updated roadmap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since March, MCP went stateless (no more session handshakes), turned Tasks into an official extension for long-running work, and shipped enterprise auth pieces like issuer validation and Client ID Metadata Documents.&lt;/p&gt;
&lt;p&gt;Next up: one HTTP-native transport instead of separate stdio and HTTP paths, real agent identity (workload federation, token exchange), and progressive tool discovery for large catalogs. No firm dates yet.&lt;/p&gt;
&lt;p&gt;MCP is leaving its single-session, request/response origins behind for something built for long-running, multi-agent systems.&lt;/p&gt;</content></entry><entry><title>What Is an Agent Harness?</title><id>https://julin.ai/2026/08/26/agent-harness/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/26/agent-harness/"/><published>2026-08-26T00:00:00+12:00</published><updated>2026-08-26T00:00:00+12:00</updated><category term="explainer"/><category term="agents"/><content type="html">&lt;p&gt;An oversimplified equation: &lt;strong&gt;agent harness = ai agent − model.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="overview"&gt;Overview&lt;/h3&gt;
&lt;p&gt;&lt;img src="/2026/08/26/agent-harness/diagram-equation.svg" alt="AI Agent minus Model equals Harness."&gt;&lt;/p&gt;
&lt;p&gt;An agent harness is everything in an AI agent besides the model — everything outside the LLM inference call. It&amp;rsquo;s a piece of software that provides an environment for the LLM to observe and take actions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The agent harness has a &lt;strong&gt;system prompt&lt;/strong&gt; that defines the LLM&amp;rsquo;s basic behavior and controls how it puts out tokens.&lt;/li&gt;
&lt;li&gt;The agent harness includes a set of &lt;strong&gt;tools&lt;/strong&gt; that the LLM can call.&lt;/li&gt;
&lt;li&gt;The agent harness interacts with the LLM to get tokens back.&lt;/li&gt;
&lt;li&gt;The agent harness interleaves LLM outputs and tool calls, typically called the &lt;strong&gt;agent loop&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="the-system-prompt"&gt;The system prompt&lt;/h3&gt;
&lt;p&gt;&lt;img src="/2026/08/26/agent-harness/diagram-sequence.svg" alt="Sequence diagram: the harness sends the system prompt, then the user message, and the LLM sends tokens back."&gt;&lt;/p&gt;
&lt;p&gt;Before the user&amp;rsquo;s message arrives, the harness sends the model a fixed set of instructions: the &lt;strong&gt;system prompt.&lt;/strong&gt; It sets the model&amp;rsquo;s baseline behavior and constrains how it generates tokens.&lt;/p&gt;
&lt;h3 id="tools"&gt;Tools&lt;/h3&gt;
&lt;p&gt;&lt;img src="/2026/08/26/agent-harness/diagram-tools.svg" alt="An LLM connected to four labeled tool boxes: read file, run command, search web, send email."&gt;&lt;/p&gt;
&lt;p&gt;The harness also defines a set of &lt;strong&gt;tools&lt;/strong&gt; the model can invoke: named actions, each with a description of what it does and how to call it. The model doesn&amp;rsquo;t execute these actions itself — it only requests them.&lt;/p&gt;
&lt;h3 id="the-model-call"&gt;The model call&lt;/h3&gt;
&lt;p&gt;&lt;img src="/2026/08/26/agent-harness/diagram-call.svg" alt="The harness sends a prompt to the LLM and receives tokens back."&gt;&lt;/p&gt;
&lt;p&gt;The harness communicates with the model through a single interface: it sends a prompt and gets tokens back. That call is the only boundary between the harness and the model.&lt;/p&gt;
&lt;h3 id="the-agent-loop"&gt;The agent loop&lt;/h3&gt;
&lt;p&gt;&lt;img src="/2026/08/26/agent-harness/diagram-loop.svg" alt="LLM sends tokens to the harness, the harness runs a tool and sends the result back, or stops with an answer."&gt;&lt;/p&gt;
&lt;p&gt;The harness inspects the returned tokens for a tool call. If one is present, it executes the tool, appends the result to the context, and calls the model again. If not, it returns the output as the final answer. This send-inspect-act cycle is the &lt;strong&gt;agent loop.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="further-reading"&gt;Further reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://earendil.com/posts/what-is-a-harness/"&gt;What is a Harness?&lt;/a&gt; — Earendil&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/agent-framework/concepts/harness"&gt;Agent Harness&lt;/a&gt; — Microsoft Learn, Agent Framework docs&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.langchain.com/blog/the-anatomy-of-an-agent-harness"&gt;The Anatomy of an Agent Harness&lt;/a&gt; — Vivek Trivedy, LangChain&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry><title>Agents Should Be Durable, Not Long-Lived</title><id>https://julin.ai/2026/08/26/durable-agents/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/26/durable-agents/"/><published>2026-08-26T00:00:00+12:00</published><updated>2026-08-26T00:00:00+12:00</updated><category term="agents"/><category term="ai-engineering"/><content type="html">&lt;p&gt;A common way to build an AI agent is to treat it as a long-running process. A worker receives a request, enters an agent loop, calls models and tools, waits for results, and eventually returns an answer.&lt;/p&gt;
&lt;p&gt;This works well until agents start doing real work.&lt;/p&gt;
&lt;p&gt;An agent may spend twenty minutes researching a problem, wait ten minutes for a build, ask a user for approval, or come back hours later when an external job finishes. Keeping a worker alive for the whole run wastes resources and makes failures expensive. A deployment, crash, or machine restart can also destroy work that has already happened.&lt;/p&gt;
&lt;p&gt;A better model is to separate the &lt;strong&gt;agent run&lt;/strong&gt; from the &lt;strong&gt;process executing it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The agent run is durable. Its state, messages, tool results, budget, and current position are stored outside the worker. The worker is temporary. It leases a runnable agent, performs useful work for a short period, checkpoints the new state, and disappears.&lt;/p&gt;
&lt;p&gt;Conceptually:&lt;/p&gt;
&lt;p&gt;&lt;img src="/2026/08/26/durable-agents/diagram-loop.svg" alt="A run loads, cycles through think and tool steps inside a durable session, checkpoints, and the worker exits."&gt;&lt;/p&gt;
&lt;p&gt;Another worker can later continue from the checkpoint.&lt;/p&gt;
&lt;p&gt;This does not mean every model or tool call needs its own process. That would create unnecessary scheduling and state-reconstruction overhead. A worker might instead receive a 30- or 60-second lease and execute several agent steps while progress is being made.&lt;/p&gt;
&lt;p&gt;The important boundary is &lt;strong&gt;waiting&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If an agent needs to wait five minutes for CI, it should not sleep for five minutes. It records that it is waiting and exits. When CI finishes—or a timer fires—the run becomes runnable again.&lt;/p&gt;
&lt;p&gt;The same pattern works for rate limits, human approval, scheduled actions, external callbacks, and communication between agents.&lt;/p&gt;
&lt;p&gt;This changes how we think about an agent.&lt;/p&gt;
&lt;p&gt;Instead of:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;one agent = one process
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;we get:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;one agent = durable state
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; + a sequence of short compute leases
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That model has an interesting scaling property. A system might contain one million active agent runs without needing one million running processes. Most agents will usually be waiting. Only the agents with something useful to do need compute.&lt;/p&gt;
&lt;p&gt;There are costs. State must be cheap to reconstruct. Side effects must survive retries without being executed twice. Browsers, shells, and sandboxes may need their own longer-lived services. Streaming also needs to be independent from whichever worker currently owns the run.&lt;/p&gt;
&lt;p&gt;But these are infrastructure problems we already know how to solve.&lt;/p&gt;
&lt;p&gt;Large web systems stopped assigning a permanent server process to every user long ago. Agent systems may eventually make the same transition.&lt;/p&gt;
&lt;p&gt;The useful abstraction is therefore not a &lt;em&gt;short-lived agent&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It is a &lt;strong&gt;durable agent with a leased executor&lt;/strong&gt;.&lt;/p&gt;</content></entry><entry><title>AI Engineering SKill Map</title><id>https://julin.ai/2026/08/22/ai-engineering-skill-map/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/22/ai-engineering-skill-map/"/><published>2026-08-22T00:00:00+12:00</published><updated>2026-08-22T00:00:00+12:00</updated><category term="ai-engineering"/><category term="agents"/><category term="evals"/><content type="html">&lt;p&gt;Andrew Ng&amp;rsquo;s wrote an &lt;a href="https://x.com/AndrewYNg/status/2090840747738374568"&gt;AI Engineering Skills Map&lt;/a&gt;, which lists six things to learn: LLM foundations, grounding models with data, building agentic systems, evaluation-driven development, operating in production, and machine learning foundations.&lt;/p&gt;
&lt;p&gt;As he broke it down, I think the most important skill is learning how to build reliable systems from LLM&amp;rsquo;s uncertain behavior.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You don’t know in advance what an LLM will output&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the only only truth you need to take away in this post, if you can&amp;rsquo;t remember all.&lt;/p&gt;
&lt;p&gt;You can&amp;rsquo;t design AI software the way you design normal software — plan it, build it, ship it — because you can&amp;rsquo;t plan around an output you haven&amp;rsquo;t seen yet.&lt;/p&gt;
&lt;p&gt;The AI engineering stack is packed with jargons now: MCP, CLI tools, sandboxes, memory and context management, harness, loop, RAG, prompt, multi-agent, (sorry, I cannot name them all, too much). But the core of AI engineering is surprisingly simple:&lt;/p&gt;
&lt;p&gt;Build something, observe what it does, evaluate whether that&amp;rsquo;s good enough, change the weakest part, and repeat.&lt;/p&gt;</content></entry></feed>