<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Ju Lin's AI Weblog</title><subtitle>An independent research notebook on AI engineering, agents, models and the systems around them.</subtitle><id>https://julin.ai/atom/index.xml</id><link rel="self" type="application/atom+xml" href="https://julin.ai/atom/index.xml"/><link rel="alternate" type="text/html" href="https://julin.ai/"/><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>Training Qwen to Paint Watercolors with Pure RL</title><id>https://julin.ai/2026/08/24/qwen-watercolor-rl/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/24/qwen-watercolor-rl/"/><published>2026-08-24T00:00:00+12:00</published><updated>2026-08-24T00:00:00+12:00</updated><category term="field-notes"/><category term="reinforcement-learning"/><content type="html">&lt;p&gt;&lt;a href="https://surya.website/rling-qwen-to-paint-with-code"&gt;Surya trained Qwen 3.5&lt;/a&gt; to have taste in watercolor painting. &lt;a href="https://x.com/kickingkeys/status/2091570990048276897"&gt;The results are stunning&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s purely RL:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The system is a four-step loop, run thousands of times during training.&lt;/p&gt;
&lt;p&gt;The model receives a prompt, something like draw a peach hibiscus in watercolour, and writes a complete p5.brush JavaScript sketch. The sketch is rendered in a sandboxed Puppeteer environment, which produces a PNG. The PNG is judged against two random reference paintings sampled from a hand-rated pool, with a separate judge model picking the better watercolour. The judgment is converted into a reward signal, GRPO updates the model, and the loop runs again.&lt;/p&gt;
&lt;p&gt;The non-obvious choices live in what is being judged, how the judgment is made, what is in the reference pool, and how the system prompt is written.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;I ran into the same problem with pixel art generation. I built a harness around it, and the results still weren&amp;rsquo;t good enough. A harness can&amp;rsquo;t save you if the model itself puts out slop. This article shows a good way to fix that for art specifically.&lt;/p&gt;
&lt;p&gt;The reference pool isn&amp;rsquo;t big: 581 AI-generated paintings, narrowed down from 1,664 candidates. The author hand-rated them into &amp;ldquo;love-tier,&amp;rdquo; &amp;ldquo;okay,&amp;rdquo; and a supplementary batch. The candidates themselves came from Opus 4.6, GPT-5.4, and Gemini 3.1 Pro, iterating against reference photographs under a VLM judge. It&amp;rsquo;s a niche enough domain that there wasn&amp;rsquo;t enough human-made reference art to draw from, so the training data had to be manufactured this way.&lt;/p&gt;
&lt;p&gt;A few other takeaways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t do rubric judge, just do pairwise comparisons.&lt;/strong&gt; The author tried a 1-10 rubric first and the scores compressed near zero. Switching to &amp;ldquo;which of these two is the better watercolour&amp;rdquo; opened up the dynamic range.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Just handpick a golden set and compare outputs to a random one from there, instead of a reward model.&lt;/strong&gt; The 117 love-tier paintings became the comparison pool, and every rollout got judged against those. Training an actual reward model was the next step they never got to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple prompts are better, don&amp;rsquo;t add too much detailed specs.&lt;/strong&gt; A long reference doc in the system prompt made the model hallucinate APIs. A short, opinionated allowlist worked better than the full spec, and the generated code compressed from 13,500 tokens to under 2,000.&lt;/li&gt;
&lt;li&gt;To do RL on subjective work, you have to author the reward by hand, and then design it carefully enough that it generalises.&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry><title>Marin 535B-A23B Starts Training, in the Open</title><id>https://julin.ai/2026/08/24/marin-open-training/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/24/marin-open-training/"/><published>2026-08-24T00:00:00+12:00</published><updated>2026-08-24T00:00:00+12:00</updated><category term="pretraining"/><category term="field-notes"/><category term="training"/><content type="html">&lt;blockquote&gt;
&lt;p&gt;🚢 Marin 535B-A23B started training this week! As usual, the whole process is open.&lt;/p&gt;
&lt;p&gt;Voyage plan: pretraining (80%) + midtraining (20%) on 18.75T tokens on 11 x GB200 NVL72 for ~3 months (2.7e24 FLOPs). Post-training will follow.&lt;/p&gt;
&lt;p&gt;Before kicking off the run, we trained a 4-rung scaling ladder from 1.6B-A61M (48B tokens) to 27.7B-A1.2B (926B tokens) to debug issues, and to make a forecast of our hero run. This is by far our biggest run, so definitely expecting the unexpected.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://x.com/percyliang/status/2090918065634684997"&gt;Percy Liang&lt;/a&gt;, announcing the run on X.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The Marin project is a great example of being open to AI. The whole process is public: the scaling ladder they ran to debug the pipeline before committing GPU-months to the real thing, the exact token counts, the exact FLOPs, even the admission that they&amp;rsquo;re &amp;ldquo;expecting the unexpected&amp;rdquo; on their biggest run yet.&lt;/p&gt;
&lt;p&gt;Most labs treat a run like this as a trade secret until the model ships. It&amp;rsquo;s great we see another public model build. The last public run at this scale was &lt;a href="https://huggingface.co/bigscience/bloom"&gt;BLOOM&lt;/a&gt;, BigScience&amp;rsquo;s 176B model. Marin&amp;rsquo;s 535B total parameters (23B active) puts it well past that, the biggest public pretraining run that I&amp;rsquo;m aware of.&lt;/p&gt;</content></entry><entry><title>Four Ways to Teach an AI to Draw a Cat</title><id>https://julin.ai/2026/08/24/four-ways-to-teach-ai-eli5/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/24/four-ways-to-teach-ai-eli5/"/><published>2026-08-24T00:00:00+12:00</published><updated>2026-08-24T00:00:00+12:00</updated><category term="explainer"/><category term="training"/><summary>A visual explainer comparing SFT, DPO, RL, and on-policy distillation through the analogy of teaching someone to draw a cat.</summary></entry><entry><title>What Is Agentic UI?</title><id>https://julin.ai/2026/08/23/agentic-ui/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/23/agentic-ui/"/><published>2026-08-23T00:00:00+12:00</published><updated>2026-08-23T00:00:00+12:00</updated><category term="ux"/><category term="field-notes"/><category term="agentic-ui"/><content type="html">&lt;p&gt;You already know ChatGPT&amp;rsquo;s style, but it moved away from the old chat interface some time ago. A chat interface works like ping-pong: one message bubble, then another. Agentic UI does not work that way, because it often runs a long process behind the scenes. Between your prompt and the agent&amp;rsquo;s reply, many details happen. The interface must show you these details.&lt;/p&gt;
&lt;p&gt;Here is what I believe agentic UI must give you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Progress.&lt;/strong&gt; Show you where the agent stands in the task, not just that it is working.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool use.&lt;/strong&gt; Show you which tools ran and what input each one used.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direction.&lt;/strong&gt; Show you if the reasoning is still on track.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control.&lt;/strong&gt; If it is not on track, let you stop, redirect, or undo the action.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="ui-styles"&gt;UI styles&lt;/h2&gt;
&lt;p&gt;Here lists a few agentic UI styles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chat interface.&lt;/strong&gt; Chat bubbles, streaming responses, expandable tool-call sections, and &amp;ldquo;thinking&amp;rdquo; indicators. Example: &lt;a href="https://chatgpt.com"&gt;ChatGPT&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot interface.&lt;/strong&gt; A sidebar you can show or hide, instead of a full conversational app — a good fit as you evolve an app from non-agentic to agentic. Example: &lt;a href="https://github.com/microsoft/vscode"&gt;VS Code&lt;/a&gt; Copilot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Canvas interface.&lt;/strong&gt; Chat on one side, a canvas or file explorer on the other. Must persist artifacts, support versioning, and let you edit them. Examples: &lt;a href="https://chatgpt.com"&gt;ChatGPT Canvas&lt;/a&gt;, &lt;a href="https://claude.ai"&gt;Claude Artifacts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dashboard interface.&lt;/strong&gt; Built for observability — real-time status, resource usage, queue status, warnings — so you can monitor and steer long-running agents. You can start by building a &lt;a href="https://github.com/grafana/grafana"&gt;Grafana&lt;/a&gt; dashboard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collaborative interface.&lt;/strong&gt; A chat variant that treats humans and agents as peers, with collaborator badges and multiple roles in one thread. Example: &lt;a href="https://github.com/yetone/cumora"&gt;Cumora&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow interface.&lt;/strong&gt; Node-based graphs, common in creative tools. Example: &lt;a href="https://github.com/Comfy-Org/ComfyUI"&gt;ComfyUI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminal interface (TUI).&lt;/strong&gt; Runs fully in the terminal, common for coding agents. Examples: &lt;a href="https://claude.com/claude-code"&gt;Claude Code&lt;/a&gt;, &lt;a href="https://cursor.com"&gt;Cursor&lt;/a&gt;, &lt;a href="https://github.com/openai/codex"&gt;Codex&lt;/a&gt;, &lt;a href="https://github.com/Aider-AI/aider"&gt;Aider&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ui-components"&gt;UI components&lt;/h2&gt;
&lt;p&gt;Regardless of style, most agentic UIs draw from the same set of primitive components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agent status indicator.&lt;/strong&gt; Shows the agent&amp;rsquo;s current state, such as Thinking, Searching, Coding, or Waiting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streaming response.&lt;/strong&gt; Exposes output incrementally as it&amp;rsquo;s generated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reasoning display.&lt;/strong&gt; A dedicated area for the model&amp;rsquo;s reasoning, like &lt;code&gt;&amp;lt;think&amp;gt;...&amp;lt;/think&amp;gt;&lt;/code&gt; output.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool use visualization.&lt;/strong&gt; Shows which tool ran and what input it used.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Approval gate.&lt;/strong&gt; Pauses for human approval before a risky action runs — human-in-the-loop control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scheduled-task card.&lt;/strong&gt; Asks whether to create a background task that tracks an event.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compaction.&lt;/strong&gt; Shown when the conversation nears the context window&amp;rsquo;s limit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Completion.&lt;/strong&gt; Reports what got done, such as &amp;ldquo;Done: 13 sites checked, 4 options found.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error.&lt;/strong&gt; Handles failures gracefully: tool errors, hallucinations, an aborted plan, or a max-turn limit reached.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Questionnaire.&lt;/strong&gt; Pops up a short question list when the agent is uncertain, so you can fill in the gaps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generative UI.&lt;/strong&gt; The agent picks a native component, such as a stock quote, weather card, or data chart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input.&lt;/strong&gt; More than a textarea: file select, thinking-level control, model switch, dictation, and send/steer/pause buttons.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sources drawer.&lt;/strong&gt; Collects the evidence the agent consulted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP/tool list.&lt;/strong&gt; Lists the tools and MCP servers available to the agent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This list will keep growing as people discover fun, engaging agentic UX. I&amp;rsquo;ll update it every now and then. :P&lt;/p&gt;
&lt;h2 id="ui-frameworks"&gt;UI frameworks&lt;/h2&gt;
&lt;p&gt;A few frameworks stand out for building agentic UI today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/vercel/ai"&gt;Vercel ai-sdk&lt;/a&gt;.&lt;/strong&gt; The most widely used framework for production web-based agent UIs. It gives you good low-level control, and I use it in my own work. Its generative UI feature is neat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/CopilotKit/CopilotKit"&gt;CopilotKit&lt;/a&gt;.&lt;/strong&gt; Getting popular too. It is built around a protocol called &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;ag-ui&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/assistant-ui/assistant-ui"&gt;assistant-ui&lt;/a&gt;.&lt;/strong&gt; It supports multiple backends, such as ai-sdk, ag-ui, and LangChain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/gradio-app/gradio"&gt;Gradio&lt;/a&gt;.&lt;/strong&gt; Popular for building AI and ML prototypes quickly. You will see lots of Gradio apps on Hugging Face Spaces.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/streamlit/streamlit"&gt;Streamlit&lt;/a&gt;.&lt;/strong&gt; Popular for building data dashboards. It has a simple mental model, but it is hard to extend and cannot expose an API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/Chainlit/chainlit"&gt;Chainlit&lt;/a&gt;.&lt;/strong&gt; It has native LangChain support, an out-of-the-box experience, and little boilerplate.&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry><title>Neural Network, Explained in Plain Language</title><id>https://julin.ai/2026/08/23/neural-network-eli5/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/23/neural-network-eli5/"/><published>2026-08-23T00:00:00+12:00</published><updated>2026-08-23T00:00:00+12:00</updated><category term="explainer"/><summary>A six-part visual explainer of how a neural network learns, with animated diagrams for every step.</summary></entry><entry><title>Linus Torvalds on Debugging the Kernel with AI</title><id>https://julin.ai/2026/08/23/linus-ai-debug/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/23/linus-ai-debug/"/><published>2026-08-23T00:00:00+12:00</published><updated>2026-08-23T00:00:00+12:00</updated><category term="field-notes"/><category term="linux"/><content type="html">&lt;blockquote&gt;
&lt;p&gt;And this was a debug session from hell, enormously helped by an AI doing much of the grunt-work.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to call it my tireless helper, but the AI several times stated flat out that this was impossible and unsolvable and that we should just write a report about it.&lt;/p&gt;
&lt;p&gt;I suspect those things have been trained by people who may not be quite as stubborn as I am.&lt;/p&gt;
&lt;p&gt;But while the AI was ready to give up several times, it did keep adding debug code and analyzing it faithfully when I pushed. So credit where credit is due and I let the AI write the commit message above.&lt;/p&gt;
&lt;p&gt;This is basically a one-liner fixing a bogus &lt;code&gt;round_up()&lt;/code&gt; to a &lt;code&gt;round_down()&lt;/code&gt;, but there were 24 patches adding more and more debug information to this, and 18 kernel boot to finally narrow it down to this. — Linus&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Linus Torvalds, in the &lt;a href="https://github.com/torvalds/linux/commit/818bebeb63dd6bf5f4e07e145f6cdbace520a34c"&gt;commit message&lt;/a&gt; for a kernel fix.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I troubleshoot every now and then myself, and it&amp;rsquo;s way harder than programming, tbh. AI can&amp;rsquo;t always find the root cause. But it&amp;rsquo;s still a tireless companion to have on-call — it surfaces details I&amp;rsquo;d have missed on my own, and some of them are the ones that end up pointing the way.&lt;/p&gt;</content></entry><entry><title>Evals, Explained in Plain Language</title><id>https://julin.ai/2026/08/23/evals-eli5/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/23/evals-eli5/"/><published>2026-08-23T00:00:00+12:00</published><updated>2026-08-23T00:00:00+12:00</updated><category term="explainer"/><summary>A visual explainer of how you actually know an AI system got better — not by feel, but by testing and scoring it.</summary></entry><entry><title>Next Token Prediction, Explained in Plain Language</title><id>https://julin.ai/2026/08/22/next-token-prediction-eli5/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/22/next-token-prediction-eli5/"/><published>2026-08-22T00:00:00+12:00</published><updated>2026-08-22T00:00:00+12:00</updated><category term="explainer"/><summary>A visual explainer of how a language model writes text one small piece at a time.</summary></entry><entry><title>ELI5</title><id>https://julin.ai/2026/08/22/eli5-neural-networks/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/22/eli5-neural-networks/"/><published>2026-08-22T00:00:00+12:00</published><updated>2026-08-22T00:00:00+12:00</updated><category term="eli5"/><category term="claude-plugins"/><category term="learning"/><category term="field-notes"/><content type="html">&lt;p&gt;&lt;a href="https://x.com/trq212/status/2090884854590382515"&gt;Thariq at Anthropic posted&lt;/a&gt; that it&amp;rsquo;s a skill people there have been using a lot recently: &lt;code&gt;/eli5 &amp;lt;what you want to explain&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I tried it on neural networks. &lt;a href="https://claude.ai/public/artifacts/dedbd15e-76ff-4cdf-9ac7-eaf317d947e4"&gt;Here&amp;rsquo;s what it made&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The first pass had bad colors, low contrast, hard to read. One follow-up prompt asking for a color fix and it was done.&lt;/p&gt;
&lt;p&gt;No formulas, no sigmoid, no softmax, none of the math that actually makes a neural network work. It&amp;rsquo;s missing for good. What&amp;rsquo;s left is the dataflow — inputs go in, get combined, come out the other end as a decision — drawn simply enough to follow at a glance.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the trade the skill makes, and it&amp;rsquo;s the right one for someone who isn&amp;rsquo;t about to read a textbook. eli5 is good exactly because it throws out the complexity most explanations lead with. I imagine this isn&amp;rsquo;t just for self-learning — it&amp;rsquo;s a genuinely useful tool for collaboration, communication, meetings. Conveying an idea isn&amp;rsquo;t easy. ;P&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Updated at 2026-08-23. The neural network example is ported to &lt;a href="/2026/08/23/neural-network-eli5/"&gt;julin.ai&lt;/a&gt; now.&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><entry><title>Pretraining a Mini Kimi K3 for $252</title><id>https://julin.ai/2026/08/21/mini-k3/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/21/mini-k3/"/><published>2026-08-21T00:00:00+12:00</published><updated>2026-08-21T00:00:00+12:00</updated><category term="pretraining"/><category term="moe"/><category term="kimi"/><category term="field-notes"/><content type="html">&lt;p&gt;Vizuara AI Labs trained a miniature Kimi K3 from scratch: 1.02B parameters, 145M active, 5B tokens, one H200, $252.35.&lt;/p&gt;
&lt;p&gt;Not simplifying the architecture like &lt;a href="https://karpathy.github.io/2026/02/12/microgpt/"&gt;Karpathy&amp;rsquo;s microgpt&lt;/a&gt;, they kept &lt;a href="https://books.vizuara.ai/book/pretraining-a-mini-k3"&gt;Kimi K3&amp;rsquo;s MoE and attention design&lt;/a&gt; intact.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a surprisingly cheap way to learn pretraining (in real-world). They worked through expert collapse, data-mixing bugs, distributed-training bugs, kernels, and GPU utilization on a modern MoE architecture.&lt;/p&gt;
&lt;p&gt;A few things worth noting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5B tokens is probably too little for a 1B model. The authors agree the run was budget constrained. So the cheap cost might due to the training stopped early.&lt;/li&gt;
&lt;li&gt;Beating GPT-2 isn&amp;rsquo;t particularly meaningful when Mini K3 has roughly 10× the parameters.&lt;/li&gt;
&lt;li&gt;MoE at this scale is debatable. A smaller dense model trained on more tokens would likely be better if the goal was capability.&lt;/li&gt;
&lt;/ul&gt;</content></entry></feed>