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