<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Ju Lin's AI Weblog: Ai-Engineering</title><subtitle>An independent research notebook on AI engineering, agents, models and the systems around them.</subtitle><id>https://julin.ai/atom/tags/ai-engineering/index.xml</id><link rel="self" type="application/atom+xml" href="https://julin.ai/atom/tags/ai-engineering/index.xml"/><link rel="alternate" type="text/html" href="https://julin.ai/tags/ai-engineering/"/><author><name>Ju Lin</name></author><updated>2026-08-26T00:00:00+12:00</updated><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>