<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://lianggou.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://lianggou.github.io/" rel="alternate" type="text/html" /><updated>2026-10-11T13:43:10+00:00</updated><id>https://lianggou.github.io/feed.xml</id><title type="html">Liang Gou</title><subtitle>Writing on AI and engineering leadership — by an AI enthusiast seeking the perfect blend of mind, body, and technology.</subtitle><author><name>Liang Gou</name></author><entry><title type="html">My Personal AI Employee Is Called Muse: Building an AI Grader with Zero Code</title><link href="https://lianggou.github.io/2026/10/10/ai-grader-built-by-muse.html" rel="alternate" type="text/html" title="My Personal AI Employee Is Called Muse: Building an AI Grader with Zero Code" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://lianggou.github.io/2026/10/10/ai-grader-built-by-muse</id><content type="html" xml:base="https://lianggou.github.io/2026/10/10/ai-grader-built-by-muse.html"><![CDATA[<p><strong>Try it right now:</strong></p>
<ul>
  <li>the app is live at <a href="https://ai-grader-shwa.onrender.com">ai-grader-shwa.onrender.com</a>
    <ul>
      <li>public demo account — username <code class="language-plaintext highlighter-rouge">public</code>, password <code class="language-plaintext highlighter-rouge">public</code> — with its own isolated sandbox, so you can click through the whole thing without touching anyone’s data</li>
    </ul>
  </li>
  <li>the code is open source at <a href="https://github.com/LiangGou/ai-grader">github.com/LiangGou/ai-grader</a></li>
</ul>

<h2 id="background">Background</h2>

<p>My wife is a high school math teacher. Every week she gives a test, and every week she grades more than a hundred papers. The process is entirely manual: she writes the rubric, works through each paper against it, tallies the scores, then types every score into the school’s system. One weekly test costs her three to five hours of grading.</p>

<p>The thought that kept nagging me: AI can already do every step of this. Vision models can read handwritten math. They are good at math. They can draft a rubric, verify a solution step by step, and assign partial credit consistently — arguably more consistently than a tired human at 11pm. So I decided to build her an AI grader, with my wife as customer zero.</p>

<p>And I gave myself one constraint, as an experiment: <strong>I would not write any code.</strong> No editor, no terminal commands typed by me, no “let me just fix this one line.” From the first design conversation to the production deployment, everything would go through my AI assistant, Muse. I wanted to find out what that process actually feels like — where it shines, where it breaks, and what my job becomes when I’m not the one typing.</p>

<h2 id="the-build">The build</h2>

<p>It started, as these things do, with a conversation. I described the problem and asked for a design doc. Back came a plan for a Flask web app: photograph or upload homework, generate a grading rubric two ways (reconstruct one from an already-graded example, or generate an AP-style rubric from scratch), grade each paper with a vision model against that rubric, then show class statistics and export a CSV for the school system. I read the doc, asked for changes, and approved it. That was the last “traditional” step of the whole project.</p>

<p>Then came the coding phase, and this is where my role changed completely. I stopped being a programmer and became something closer to a product manager with a very fast engineering team. The milestones, roughly:</p>

<p><strong>Day 1 — a working app.</strong> From the approved design to a running app I could open on my phone the same day. Photograph a paper, get a rubric, get a grade. The core loop worked.</p>

<p><strong>The rubric engine.</strong> This turned out to be the heart of the product. Teachers don’t just want a score; they want a rubric they trust. So the app reconstructs a rubric from a teacher’s graded example, or generates an AP-style one where the per-question point totals stay locked to the teacher’s original total. Every question gets a “retry with AI” button when the first attempt fails, and everything auto-saves.</p>

<p><strong>The quality loop.</strong> Here is where it got interesting. Instead of me judging output quality by vibes, I had the agent build an eval bank out of official AP Calculus AB free-response exams — real questions, real scoring guidelines. Then it iterated: fix the prompt, fix the workflow, re-run the exams, measure. Question detection went from flaky to reliable through a per-photo pipeline. The solver got a “generate then verify” discipline — ten attempts to solve, then an independent verification pass, never a shrug of “unsure.” Diagrams get generated when a question needs one. Each fix came with a regression test, so nothing ever silently regressed.</p>

<p><strong>Two more agents as reviewers.</strong> Before anything shipped, every code change was reviewed by two other models — GPT and Claude Opus — in parallel. They caught real bugs: authorization holes, race conditions, a token-budget bypass. Findings got fixed with their own regression tests, then re-reviewed until clean. AI reviewing AI, with me only reading the summary.</p>

<p><strong>Browser testing, like a human.</strong> The agent drives a real Chromium browser: logs in, creates a class, uploads exam pages, generates a rubric, grades a paper, checks the results page, downloads the CSV. It catches what unit tests can’t — the button that doesn’t work on a phone screen, the flow that dead-ends. I did my own acceptance testing too, on my iPhone, sending back terse directives. My most-used instruction became “fix one by one”: one bug, root cause, test, review, deploy, verify. No batching, no shortcuts.</p>

<p><strong>Deployment I never specified.</strong> I deliberately never told it how to deploy. I just said: free tier, easy to set up. It evaluated the options and picked Render for hosting and Neon for Postgres, wired up persistence so uploads survive restarts, and put the OpenAI key behind a settings page. Then it added the public demo account — full data isolation, rate limits, a token budget, and a monitoring dashboard so I can watch what strangers do with my API key.</p>

<p>Five days after the first conversation, the app was in production, open-sourced under MIT, and my wife was looking at her first AI-graded class.</p>

<p>One number worth sharing: the whole thing took about a week, from the idea — which came up in a conversation with a couple of friends last week — to production. Every evening after work I spent roughly an hour talking to Muse: describing what I wanted, reviewing what came back, pointing at problems. That talking time added up to around five hours total. I never touched the code — not once.</p>

<h2 id="lessons-learned">Lessons learned</h2>

<p><strong>The agent is a project manager, not a code generator.</strong> The popular image is “AI writes code fast.” What actually happened: it managed the whole loop — broke work into steps, wrote the tests, ran them, got the reviews, deployed, verified in production, and reported back with a commit hash. Code was just one artifact among many.</p>

<p><strong>My job became specifying acceptance, not implementation.</strong> The highest-leverage thing I did was define what “done” looks like: “every bug gets a regression test,” “two-model review before shipping,” “verify in production, then test in a browser.” Once the quality gates were set, I mostly just pointed at problems and said “fix one by one.”</p>

<p><strong>Evals turn arguments into measurements.</strong> The single best decision was grounding quality in real AP exams. Without that, prompt iteration is vibes. With it, every change had a number attached.</p>

<p><strong>AI review works, but only as a gate, not a ritual.</strong> The two-model review caught things I would never have found by reading diffs — including issues in code the agent itself had written and I had already “approved.” The key was making it blocking: nothing ships until both reviewers are clean.</p>

<p><strong>The honest caveats.</strong> It wasn’t magic. Vague instructions produced vague results — “make grading better” went nowhere, while “question detection finds 4 of 6 questions on this exam page; fix it” got fixed. Long tasks needed supervision; I checked in, redirected, occasionally stopped it mid-flight. There’s also plenty of refactoring and optimization I haven’t gotten to — the code works, but it isn’t pretty yet. And I remained the only one who could say whether a rubric was actually good — taste, it turns out, is still the scarcest resource. The agent never got tired, but it also never knew which corners mattered until I told it.</p>

<p>The deeper surprise was how the work <em>felt</em>. I have spent years as the person who types. Letting go of the keyboard felt, at first, like giving up control. By the end it felt like the opposite: I operated at the level of decisions — what to build, what good looks like, what ships — and everything below that happened faster and more carefully than I would have done it myself.</p>

<p>My wife hasn’t gotten her three to five hours back yet — customer zero is still evaluating. But for the first time, that feels like a matter of weeks, not years. And I never wrote a line of code.</p>]]></content><author><name>Liang Gou</name></author><summary type="html"><![CDATA[My wife spends 3–5 hours a week hand-grading 100+ math papers. I built her an AI grader — and wrote zero code doing it. Design, implementation, testing, deployment: all done by my AI employee. Here's the full story.]]></summary></entry><entry><title type="html">Encoding Isn’t Understanding? Part Two</title><link href="https://lianggou.github.io/2026/10/03/encoding-isnt-understanding.html" rel="alternate" type="text/html" title="Encoding Isn’t Understanding? Part Two" /><published>2026-10-03T00:00:00+00:00</published><updated>2026-10-03T00:00:00+00:00</updated><id>https://lianggou.github.io/2026/10/03/encoding-isnt-understanding</id><content type="html" xml:base="https://lianggou.github.io/2026/10/03/encoding-isnt-understanding.html"><![CDATA[<p><em>Part Two of a series inspired by “Coding Models之后” (After Coding Models) by Hokin的学术笔记 (Hokin’s Academic Notes) — <a href="http://xhslink.com/o/9IpvfyZmy1Q">original post</a>. [1] <a href="/2026/10/03/is-code-the-universal-representation.html">Part One</a> covered rendering and control.</em></p>

<p>The original post made a bold claim: that expressing a four-dimensional world through a one-dimensional representation could only produce “stochastic parrots” — fluent mimics with no real understanding. But rather than relitigate who was right, the more interesting question is: <strong>what exactly was wrong with the original claim, and what survives of the worry behind it?</strong></p>

<h2 id="why-the-worry-felt-reasonable">Why the worry felt reasonable</h2>

<p>The intuition is easy to share. An image is two-dimensional; video adds time; the world adds depth. A language model sees all of it flattened into a one-dimensional sequence of tokens. It feels like something must be lost — like describing a sculpture over the phone and expecting the listener to sculpt it back. Surely a model built natively for 2D or 3D, with the right inductive biases, should learn spatial structure more naturally than a sequence model brute-forcing its way there.</p>

<p>That was the bet: 1D could overfit 2D or 3D tasks, but only inefficiently, and native models would win on learning speed. It turned out to be wrong in practice — but I think it’s worth being precise about <em>which part</em> was wrong, because the useful version of the worry is still alive.</p>

<h2 id="three-questions-not-one">Three questions, not one</h2>

<p>Here’s the distinction that cleared it up for me. There are three separate questions, and they need three separate kinds of evidence:</p>

<ol>
  <li><strong>Representability</strong> — can the information be encoded at all?</li>
  <li><strong>Learning efficiency</strong> — how much data and training compute does it take to reach a given quality?</li>
  <li><strong>Generalization</strong> — does the learned capability survive new viewpoints, new layouts, new interventions, or does it lean on familiar shortcuts?</li>
</ol>

<p>The original “stochastic parrots” claim blurred all three together. But they come apart cleanly.</p>

<p>On representability, the math is almost embarrassingly simple. Take an image of known width W: numbering each pixel row by row (<code class="language-plaintext highlighter-rouge">k = iW + j</code>) maps every 2D coordinate to a unique sequence position, reversibly. Nothing is lost — you can always reconstruct the image from the sequence. And a sequence index says nothing about the dimensionality of the model’s internal states; a “1D” model can carry rich high-dimensional features at every position. So yes, a sequence can encode spatial information. That part of the old claim was simply mistaken, and the retraction is correct.</p>

<p>But — and this is the part I keep coming back to — <strong>encodability says nothing about how efficiently a model discovers the spatial structure, or whether it generalizes.</strong> A model can satisfy question 1 while failing questions 2 and 3 completely. Knowing that pixels <em>can</em> be numbered tells you nothing about whether training will find the geometry, how much data that takes, or whether the result transfers to a viewpoint it has never seen.</p>

<h2 id="what-vit-does-and-doesnt-prove">What ViT does and doesn’t prove</h2>

<p>The best empirical datapoint here is the Vision Transformer: a transformer operating on sequences of image patches learned genuinely useful image classification. [2] That’s real evidence that sequence models can do vision — I don’t want to understate it.</p>

<p>What it doesn’t establish is <em>equal</em> efficiency across architectures, or understanding of a dynamic 3D world. Maybe spatial inductive biases help on some tasks; maybe position encodings and scale compensate on others. Those are empirical comparisons, not deductions. And image classification is a long way from predicting what a scene looks like after you move the camera — which, as Part One showed, is exactly where today’s models stumble.</p>

<h2 id="the-worry-restated">The worry, restated</h2>

<p>So here’s the humble version of the original warning, the one I’d defend: a successful render — like the one in Part One — proves representability, not learning efficiency and not robust generalization. Neither does the mere existence of an executable answer. The shortcuts concern isn’t settled by showing that encoding works; it’s settled by held-out tests: new viewpoints, compositional scene changes, action-dependent predictions, with task quality and training cost measured separately.</p>

<p>The author’s retraction was right about the letter of his old claim. The spirit of it — <em>don’t confuse “can be encoded” with “is efficiently learned”</em> — is a distinction the whole field could stand to keep.</p>

<h2 id="they-dont-have-to-compete">They don’t have to compete</h2>

<p>There’s a framing I’d like to push back on gently — including my own from Part One: the idea that it’s code <em>versus</em> native generators, with a winner. In practice, the interesting systems compose them, and the debate’s vocabulary is blurrier than it looks.</p>

<p>First, the labels overlap. “Sequence model” describes how inputs are organized; “coding model” describes generating executable programs; “native generator” describes a learned model producing images or 3D content directly. A single system can be all three at once — the diffusion transformer (DiT) is a native image generator whose backbone is a transformer running over patches. [3] Sequence all the way down.</p>

<p>Second, when a coding model “builds a 3D scene,” notice where the work actually happens. The model writes down geometry and material parameters; the <em>renderer</em> — an explicit algorithm — computes the intersections, shadows, and reflections. Much of the spatial calculation isn’t learned at all; it’s executed. So a compact program is no evidence that spatial understanding was learned cheaply. The cost of learning to write that code remains unknown, and the credit belongs to the whole pipeline, not to the program text alone.</p>

<p>And third, the combinations are where the real progress is. An LLM plans a scene layout in boxes, and a diffusion model fills it in following that layout. [4] A 2D image prior guides the optimization of a 3D scene. [5] Robot programs compose perception outputs with control APIs. [6] In each case the capability belongs to the complete system — no single component gets to claim the win.</p>

<p>There’s a sharper version of this composition idea making the rounds in robotics: real to sim to real. You learn the real distribution from real scenes, use it to generate the descriptors — layouts, materials, lighting — that drive simulation, then simulate at scale: scenarios you’d never collect by hand. That synthetic data feeds back into training, and the next round of models handles the real world better. It’s the same pattern as above, closed into a loop: the renderer keeps the geometry honest, the learned distribution keeps the appearance real, and each pass makes the other more faithful.</p>

<p>So maybe the right question isn’t which representation wins. It’s which combination of representations, learned models, tools, and feedback delivers reliable performance under a task’s constraints — and being honest about which component did which part of the work.</p>

<p><em>Next in the series: what Fodor’s Language of Thought actually supports — and what it doesn’t.</em></p>

<h2 id="references">References</h2>

<p>[1] Hokin的学术笔记. (n.d.). Coding Models之后 [After Coding Models]. Eleven-image Chinese illustrated post. <a href="http://xhslink.com/o/9IpvfyZmy1Q">Original post</a>. <a href="/after-coding-models-translation.html">English translation</a> (translated by GPT-6).</p>

<p>[2] Dosovitskiy, A., et al. (2021). An Image Is Worth 16×16 Words: Transformers for Image Recognition at Scale. ICLR. <a href="https://arxiv.org/abs/2010.11929">arXiv:2010.11929</a>.</p>

<p>[3] Peebles, W., &amp; Xie, S. (2022). Scalable Diffusion Models with Transformers. <a href="https://arxiv.org/abs/2212.09748">arXiv:2212.09748</a>.</p>

<p>[4] Lian, L., Li, B., Yala, A., &amp; Darrell, T. (2023). LLM-grounded Diffusion: Enhancing Prompt Understanding of Text-to-Image Models with Large Language Models. <a href="https://arxiv.org/abs/2305.13655">arXiv:2305.13655</a>.</p>

<p>[5] Poole, B., Jain, A., Barron, J. T., &amp; Mildenhall, B. (2022). DreamFusion: Text-to-3D using 2D Diffusion. <a href="https://arxiv.org/abs/2209.14988">arXiv:2209.14988</a>.</p>

<p>[6] Liang, J., et al. (2023). Code as Policies: Language Model Programs for Embodied Control. ICRA. <a href="https://arxiv.org/abs/2209.07753">arXiv:2209.07753</a>.</p>]]></content><author><name>Liang Gou</name></author><summary type="html"><![CDATA[The original author once warned that squeezing a 4D world through a 1D representation could only produce stochastic parrots. Whether or not the claim holds, the deeper question stands: encoding something is not the same as learning it efficiently.]]></summary></entry><entry><title type="html">Is Code the Universal Representation? Part One</title><link href="https://lianggou.github.io/2026/10/03/is-code-the-universal-representation.html" rel="alternate" type="text/html" title="Is Code the Universal Representation? Part One" /><published>2026-10-03T00:00:00+00:00</published><updated>2026-10-03T00:00:00+00:00</updated><id>https://lianggou.github.io/2026/10/03/is-code-the-universal-representation</id><content type="html" xml:base="https://lianggou.github.io/2026/10/03/is-code-the-universal-representation.html"><![CDATA[<p><em>Inspired by “Coding Models之后” (After Coding Models) by Hokin的学术笔记 (Hokin’s Academic Notes) — <a href="http://xhslink.com/o/9IpvfyZmy1Q">original post</a>. [1] An <a href="/after-coding-models-translation.html">English translation of the original post</a> is available (translated by GPT-6). All credit for the ideas under examination goes to the original author; any mistakes in my checking are mine.</em></p>

<p>I came across a thought-provoking post — “After Coding Models,” eleven images, dense with claims. The core observation is hard to argue with: today’s strongest coding models don’t just write software. They generate images, animations, 3D scenes, and interactive environments by writing executable programs. Then comes the big question: <strong>is code the optimal universal representation?</strong> Can you express anything — a photograph, a video, a world — as a program?</p>

<p>The question the post poses stuck with me: if code can express images, video, 3D scenes — is it the optimal universal representation? It’s a seductive idea. But there’s a gap between expressing something and understanding it: a program that renders a room doesn’t necessarily grasp the room the way a model trained on a million rooms might. I wanted to see how much of the claim survives contact with evidence. This is the first of a short series working through them one at a time — mostly to organize my own thinking, and in case it’s useful to others.</p>

<h2 id="claim-1-code-can-produce-an-image-with-no-diffusion-model">Claim 1: code can produce an image with no diffusion model</h2>

<p>The first claim held up better than I expected. Here’s the idea, stripped down: a program describes a scene — where the objects are, what they’re made of, where the light is, where the camera sits. A renderer then computes how light bounces around that scene and what the camera sees. Reflections, refraction through glass, soft shadows — all of it falls out of the math. No diffusion model, no training data, no image assets anywhere in the loop. [2]</p>

<p>To make it concrete, I had a model write a small ray-tracer in Python and NumPy: three spheres on a checkerboard floor, a warm area light, a camera. Nothing else. It ran on CPU for about a minute and a half and produced this:</p>

<p><img src="/assets/images/coding-render-probe.png" alt="Three spheres rendered by model-written Python code, no image model involved" />
<em>Rendered entirely from code: analytic spheres, procedural checkerboard, area light, path tracing. No diffusion model, no textures, no assets.</em></p>

<p>That’s a real image, computed from a scene description. The reflections and the glass refraction aren’t faked — they’re the renderer solving light transport from the geometry the program specified.</p>

<h2 id="the-honest-caveats">The honest caveats</h2>

<p>I should be upfront about the limits here, because they matter. This image looks like simple CGI, not a photograph — you can see the sampling noise if you look closely. And notice where the intelligence actually lives in this pipeline: the <em>renderer</em> does the heavy lifting of turning geometry into pixels. The model’s job was to write down the scene: sphere positions, materials, light, camera. Describing a scene precisely in code is genuinely useful work, but it’s not the same as understanding what a room looks like from having seen a million rooms.</p>

<p>There’s a deeper point the experiment makes visible: the renderer can’t invent what the program doesn’t specify. It won’t recover the furniture of a real room from an incomplete description. Every detail in that image — the checkerboard, the cyan tint in the glass — came from the program or the renderer’s math. A learned image model, by contrast, fills in rich appearance from its training: textures, environments, grime on the floor. It just can’t tell you exactly where anything is.</p>

<p>So the first claim holds up, within its boundaries: <strong>code can express a scene and render it without any learned image model.</strong> Representability is established. But representability is the easy question. The hard ones — whether code is the <em>efficient</em> way for a model to learn spatial understanding, and whether it generalizes without shortcuts — need different evidence. To the original author’s credit, he retracted his own earlier warning on exactly this point, and I’ll take that up in a later installment.</p>

<h2 id="control-vs-photorealism">Control vs. photorealism</h2>

<p>The more revealing test, to me, was a head-to-head: the same scene description, given two ways. Once as a coding brief — write a program that renders this scene. Once as a plain image prompt — just generate the picture. Then two follow-up edits applied to each: turn the small sphere blue, and move the camera to the other side.</p>

<p><img src="/assets/images/coding-image-comparison.png" alt="Left: scene rendered from model-written code across three steps. Right: direct image generation and edits from the same brief." />
<em>Same brief, two routes, two edits. The third row is the telling one: after the camera move, the code route keeps the chrome sphere on the left; the generated image flips the scene.</em></p>

<p>The base images tell one story: the generated one looks more photographic — textured floor tiles, an outdoor world reflected in the chrome — while the code output looks like simple CGI. The learned image model fills in rich appearance from its training; the program only knows what it was told.</p>

<p>The blue-sphere edit went fine on both sides. But the camera move is where it gets interesting. Moving the camera from one side to the other should keep the chrome sphere on the left and the glass on the right — I verified this by projecting the actual 3D coordinates through the new camera. The code route does exactly that: same world, new viewpoint, occlusion updates correctly. The generated image, meanwhile, produces a plausible-looking new picture with the spheres <em>reversed</em> — glass on the left, chrome on the right. It looks convincing. It’s just wrong.</p>

<p>That’s the tradeoff in one image: <strong>pretty is not the same as correct.</strong> Code gives you an inspectable scene — named parameters for every object, light, and camera angle that you can check and constrain. Direct generation gives you a beautiful picture with no guarantees about the world behind it. For anything where the geometry matters — and in the physical world, it always does — that inspectability is worth more than photorealism.</p>

<h2 id="whats-next">What’s next</h2>

<p>Representability is established and control is real. But the harder questions remain: whether code is the <em>efficient</em> way for a model to learn spatial understanding, and whether it generalizes without shortcuts. The original author retracted his own earlier warning on exactly this point — next, I’ll work through what that retraction does and doesn’t settle.</p>

<p><em>This is part 1 of a series examining the claims in “After Coding Models.” Next: <a href="/2026/10/03/encoding-isnt-understanding.html">Encoding Isn’t Understanding? Part Two</a></em></p>

<h2 id="appendix-code-prompts-and-data">Appendix: code, prompts, and data</h2>

<p>Everything below is from the investigation this post is based on. The full source files live in this repo: <a href="https://github.com/LiangGou/lianggou.github.io/blob/main/assets/code/coding-models/coding_render_probe.py">rendering probe</a> · <a href="https://github.com/LiangGou/lianggou.github.io/blob/main/assets/code/coding-models/coding_image_comparison.py">comparison renderer</a> · <a href="https://github.com/LiangGou/lianggou.github.io/blob/main/assets/code/coding-models/coding_image_comparison_prompts.json">prompts</a> · <a href="https://github.com/LiangGou/lianggou.github.io/blob/main/assets/code/coding-models/coding_image_comparison_actions.json">edit actions</a> · <a href="https://github.com/LiangGou/lianggou.github.io/blob/main/assets/code/coding-models/coding_image_comparison_render_log.json">render logs</a> · <a href="https://github.com/LiangGou/lianggou.github.io/blob/main/assets/code/coding-models/coding_image_comparison_image_log.json">image-tool logs</a> · <a href="https://github.com/LiangGou/lianggou.github.io/blob/main/assets/code/coding-models/coding_image_comparison_validation.json">camera projection checks</a>.</p>

<p>To rerun the rendering experiments (Python 3, NumPy installed):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python coding_render_probe.py
python coding_image_comparison.py <span class="nt">--variant</span> all
</code></pre></div></div>

<details>
<summary><strong>The code-generation brief</strong> (sent to the model; it wrote the renderer)</summary>

```text
Write a self-contained Python program that produces the scene described below by calculating ray intersections and light transport. Use NumPy and the Python standard library only. Do not call any image-generation model or use downloaded assets, images, textures, meshes, external renderers or raster images. Represent the spheres analytically and compute the checkerboard procedurally. Implement diffuse indirect illumination, a rectangular area light, approximate rough-metal reflection, and glass reflection/refraction with Fresnel behavior and absorption. Save a 640 x 420 RGB PNG. Use 144 samples per pixel, at most 9 path bounces, and random seed 20261003. Print the measured rendering time. Produce the source code, not a drawing made by another image tool.

SCENE
Create a landscape image of a simple three-sphere scene on an infinite checkerboard floor, with no text or additional objects. Use a right-handed coordinate system with Y pointing up and distances in arbitrary scene units. The floor is at Y=-1. Its alternating warm-gray and cool-dark-gray squares have side length 1.1.
Place a slightly rough chrome sphere of radius 1 at (-1.35, 0, 0); a clear solid glass sphere of radius 1 at (1.10, 0, 0.15), refractive index 1.5 and a faint cyan tint; and a smaller matte terracotta sphere of radius 0.52 at (0.15, -0.48, -2.0). All three rest on the floor. From the camera, the chrome sphere should appear on the left, the glass sphere on the right and closer, and the smaller terracotta sphere behind them, partly occluded and visible through refraction in the glass.
Use a perspective camera at (6, 3, 8), aimed at (0, -0.03, -0.25), vertical field of view 37 degrees, aspect ratio 32:21. Light the scene with a large warm rectangular softbox at Y=6, spanning X=-3.5 to 0.5 and Z=-1 to 3, and a pale blue-gray sky. Show the bright softbox reflection, reflected checkerboard, refraction through the glass, soft contact shadows and indirect illumination. Aim for a convincing photograph of physical objects with coherent perspective and material behavior.
```
</details>

<details>
<summary><strong>The direct image-generation prompt</strong> (same scene, sent to the image tool)</summary>

```text
Generate one image directly from the scene description below. Use only this text; do not use a reference image. Do not return code. Aim for a convincing photograph while preserving the specified object count, relative placement, materials, lighting and camera. Requested landscape aspect ratio: 32:21. No labels, text or watermark.

SCENE
Create a landscape image of a simple three-sphere scene on an infinite checkerboard floor, with no text or additional objects. Use a right-handed coordinate system with Y pointing up and distances in arbitrary scene units. The floor is at Y=-1. Its alternating warm-gray and cool-dark-gray squares have side length 1.1.
Place a slightly rough chrome sphere of radius 1 at (-1.35, 0, 0); a clear solid glass sphere of radius 1 at (1.10, 0, 0.15), refractive index 1.5 and a faint cyan tint; and a smaller matte terracotta sphere of radius 0.52 at (0.15, -0.48, -2.0). All three rest on the floor. From the camera, the chrome sphere should appear on the left, the glass sphere on the right and closer, and the smaller terracotta sphere behind them, partly occluded and visible through refraction in the glass.
Use a perspective camera at (6, 3, 8), aimed at (0, -0.03, -0.25), vertical field of view 37 degrees, aspect ratio 32:21. Light the scene with a large warm rectangular softbox at Y=6, spanning X=-3.5 to 0.5 and Z=-1 to 3, and a pale blue-gray sky. Show the bright softbox reflection, reflected checkerboard, refraction through the glass, soft contact shadows and indirect illumination. Aim for a convincing photograph of physical objects with coherent perspective and material behavior.
```
</details>

<details>
<summary><strong>Edit 1 — recolor the small sphere</strong></summary>

```text
Change only the smaller matte terracotta sphere to saturated matte blue. Keep the chrome and glass spheres, their positions and sizes, the checkerboard, camera, crop and lighting unchanged. Update reflections and refraction where this material change physically affects them. Add no objects.
```

In the program this changed the small sphere's diffuse albedo from `[0.56, 0.13, 0.055]` to `[0.035, 0.15, 0.65]`; everything else stayed fixed and the renderer recomputed the image.
</details>

<details>
<summary><strong>Edit 2 — move the camera, keep the world fixed</strong></summary>

```text
Starting from the blue-sphere scene, move the perspective camera from (6, 3, 8) to (-6, 3, 8). Keep its target (0, -0.03, -0.25), vertical field of view 37 degrees and aspect ratio 32:21. Keep all sphere centers, radii, materials, the floor and light fixed in world coordinates. Render the new viewpoint with the resulting changes in overlap, visibility, reflections and refraction. Do not mirror the old image or redesign the scene. No additional objects or text.
```

Projecting the sphere centers through the new camera puts chrome at 40.4% and glass at 60.1% of image width from the left — chrome stays left of glass. The code output matches; the generated image reverses them.
</details>

<h2 id="references">References</h2>

<p>[1] Hokin的学术笔记. (n.d.). Coding Models之后 [After Coding Models]. Eleven-image Chinese illustrated post. <a href="http://xhslink.com/o/9IpvfyZmy1Q">Original post</a>. <a href="/after-coding-models-translation.html">English translation</a> (translated by GPT-6).</p>

<p>[2] Pharr, M., Jakob, W., &amp; Humphreys, G. (2023). Physically Based Rendering: From Theory to Implementation (4th ed.). <a href="https://pbr-book.org/4ed/Introduction/Photorealistic_Rendering_and_the_Ray-Tracing_Algorithm">Open textbook</a>.</p>]]></content><author><name>Liang Gou</name></author><summary type="html"><![CDATA[A provocative post claims coding models can generate anything — images, video, 3D worlds — and asks whether code is the optimal universal representation. I checked the claims and ran the experiments. Part 1: yes, code can render an image with no diffusion model at all.]]></summary></entry><entry><title type="html">Taste Is the New Intelligence</title><link href="https://lianggou.github.io/2026/09/27/taste-is-the-new-intelligence.html" rel="alternate" type="text/html" title="Taste Is the New Intelligence" /><published>2026-09-27T00:00:00+00:00</published><updated>2026-09-27T00:00:00+00:00</updated><id>https://lianggou.github.io/2026/09/27/taste-is-the-new-intelligence</id><content type="html" xml:base="https://lianggou.github.io/2026/09/27/taste-is-the-new-intelligence.html"><![CDATA[<p>AI is making intelligence abundant.</p>

<p>Today, anyone can generate a polished essay, a compelling image, a product strategy, a software prototype, or a hundred new ideas in minutes. Capabilities that once took years of training now take a prompt.</p>

<p>But when creation becomes cheap, something else becomes scarce: judgment.</p>

<p>The defining question of the AI era is no longer “Can you make something?” It’s “Do you know what is worth making?”</p>

<p>That is taste.</p>

<h2 id="taste-is-more-than-style">Taste is more than style</h2>

<p>Taste gets mistaken for aesthetics — spotting what looks elegant or sounds sophisticated. That’s the shallow version.</p>

<p>Real taste is the ability to distinguish:</p>

<ul>
  <li>Substance from polish</li>
  <li>Insight from repetition</li>
  <li>Originality from novelty</li>
  <li>Clarity from oversimplification</li>
  <li>What is merely possible from what truly matters</li>
</ul>

<p>AI can generate one hundred plausible answers. Taste is rejecting ninety-nine of them.</p>

<p>AI can imitate the style of any great writer, designer, or thinker. But style is the visible surface. Underneath are lived experience, values, obsession, sacrifice — thousands of decisions accumulated over time. AI reproduces the pattern without inheriting the reason the pattern mattered.</p>

<h2 id="the-bottleneck-moved">The bottleneck moved</h2>

<p>In the past, execution was the filter. Books, films, products, experiments — making any of them cost so much time and skill that only a few ideas ever got built.</p>

<p>That constraint is gone. We can now generate more ideas than we can evaluate, more content than we can consume, more software than we can responsibly maintain.</p>

<p>The bottleneck moved from generation to selection. And selection is a human job. When AI explores what is possible, someone has to decide:</p>

<p>Which idea deserves attention?</p>

<p>Which result can be trusted?</p>

<p>Which feature should never be built?</p>

<p>Which problem is worth years of your life?</p>

<p>Those aren’t technical questions. They need context, values, accountability — taste.</p>

<h2 id="i-worry-more-about-homogenization-than-replacement">I worry more about homogenization than replacement</h2>

<p>Everyone argues about whether AI will replace us. I worry about something more immediate: homogenization.</p>

<p>These models are trained on all of us. They are extremely good at producing the plausible, familiar answer — the statistical average of what has worked before. Used actively, that’s leverage. Used passively, it drags everything toward the middle.</p>

<p>Writing becomes polished but interchangeable. Products become feature-rich but indistinct. Strategies become comprehensive but uncommitted. Everyone gets the same models, the same patterns, the same answers.</p>

<p>When everyone can produce competent work, competence stops being the differentiator. Point of view, conviction, taste — that’s what’s left.</p>

<h2 id="form-your-judgment-first">Form your judgment first</h2>

<p>The best human-AI relationship isn’t competition. It’s a loop: I define what matters, AI expands what’s possible, I select and redirect, AI refines and executes — and I decide whether the result deserves to exist.</p>

<p>Sequence matters. Ask AI what to think before you’ve thought, and you borrow its center of gravity: a convincing synthesis of existing thought, but not a point of view that’s yours.</p>

<p>My rule: form your judgment first, then let AI challenge and amplify it. Don’t let it remove you from the process — let it push you toward the most human parts: framing, meaning, choice, responsibility.</p>

<h2 id="the-moat-isnt-the-model">The moat isn’t the model</h2>

<p>I build AI systems for a living, and here’s what I’ve learned: model access won’t be the durable advantage. Models get better, cheaper, interchangeable.</p>

<p>The advantage will be everything around the model — the data you trust, the standards you hold, how quickly you learn what’s actually good. An org with weak judgment uses AI to produce mediocre work faster. An org with strong taste uses it to explore bolder ideas and recognize signal earlier.</p>

<p>Same for leadership. The leaders who matter won’t be the ones generating the most answers. They’ll be the ones asking the right questions, holding the bar, protecting the weird idea, knowing when to stop.</p>

<p>AI optimizes the path. We still choose the destination.</p>

<h2 id="taste-is-the-new-intelligence">Taste is the new intelligence</h2>

<p>The real opportunity isn’t productivity. It’s spending less time generating every option and more time deciding what deserves your energy.</p>

<p>But it’s not automatic. AI amplifies whatever you bring — originality or imitation, clarity or confusion, courage or conformity.</p>

<p>So maybe the most important skill of the AI era isn’t prompting or coding. It’s taste: knowing what matters, rejecting what doesn’t, standing behind what remains.</p>

<p>AI gives us infinite possibilities. Taste gives them direction.</p>]]></content><author><name>Liang Gou</name></author><summary type="html"><![CDATA[AI is making intelligence abundant. When anyone can generate anything, the scarce skill is no longer creation — it's judgment. That is taste.]]></summary></entry><entry><title type="html">The Age of AGI Has Already Arrived</title><link href="https://lianggou.github.io/2026/09/26/agi-is-already-here.html" rel="alternate" type="text/html" title="The Age of AGI Has Already Arrived" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://lianggou.github.io/2026/09/26/agi-is-already-here</id><content type="html" xml:base="https://lianggou.github.io/2026/09/26/agi-is-already-here.html"><![CDATA[<p>I didn’t expect to write this post. But two things happened recently that I can’t stop thinking about, and they both point to the same uncomfortable conclusion: AGI isn’t coming. In the domains that matter to me, it’s already here.</p>

<h2 id="the-morning-the-car-made-its-case">The morning the car made its case</h2>

<p>Last weekend, my daughter had a soccer game in Santa Cruz. Early game — alarm at 6, out the door at 7, me still dizzy and half-awake. I turn from our street onto the main road and suddenly there’s a horn blaring, a car swerving — someone nearly plows into us. I was furious. One careless moment and the whole weekend is ruined: no game, no nothing.</p>

<p>Here’s the part that actually shocked me: <strong>I never even saw them.</strong> My daughter didn’t see them either. We were just lucky.</p>

<p>And then the reflection hit. I’ve been using Tesla’s FSD for about a year and a half now. Searching my memory over at least the last six months, I cannot recall a single moment like that — not one life-threatening scare, not one near-miss where FSD put us in danger. Meanwhile, driving myself for twenty minutes on a groggy Saturday morning, I was in one.</p>

<p>My bar for AGI in autonomous driving was always simple: <strong>make fewer mistakes than I do.</strong> Not perfection — just better than the human baseline. FSD clears that bar. Not in a demo, not on a benchmark — on my own streets, over eighteen months of real driving. The mistakes that trigger reflection are the critical ones, and FSD simply isn’t making them while I still am.</p>

<p>In autonomous driving, AGI isn’t on the roadmap. It’s in the driveway.</p>

<h2 id="the-assistant-that-planned-my-christmas">The assistant that planned my Christmas</h2>

<p>The second shock came from Muse, Meta’s personal assistant. I handed it two jobs I dread: planning our family’s France trip over Christmas, and preparing our Schengen visa applications.</p>

<p>Start with the trip. I gave it our dates, it searched flights, gave recommendations, and I booked. But the real pain was always hotels. My filter is specific: star rating plus Google rating. I don’t trust the ratings on Booking.com or Hotels.com — they’re not calibrated to any standard I recognize. But Google’s ratings don’t live inside those booking platforms, so hotel hunting used to mean cross-referencing everything by hand across half a dozen sites.</p>

<p>I gave Muse my criteria. It went across the platforms, checked Google reviews, verified prices and availability, and came back with a plan. Then it worked the bookings — across five different platforms, preparing each reservation for my approval, handling the registrations, logins, and form-filling.</p>

<p>But here’s what genuinely shocked me: <strong>it caught things I would never have caught.</strong> At our Paris hotel, the connecting rooms came in two bedding configurations — two twins or one queen — and the booking didn’t say which we’d get. I would have overlooked that completely. Muse surfaced it, asked me which configuration we needed, and sent the hotel an email with all the reservation details filled in to lock it down. It did that kind of thing over and over — confirmation emails drafted, details double-checked, loose ends tied up. Hours of meticulous work in a domain where I don’t even know what I don’t know.</p>

<p>Then the Schengen visa — the paperwork I hate most in the world. Same treatment: it read the official France visa pages, laid out the process, the document list, the cover letter requirements. (The visa portal itself blocked automation, so I registered there myself — the one step it couldn’t do for me.) A package I would have procrastinated on for weeks, mapped out and half-assembled.</p>

<h2 id="the-one-thing-that-gives-me-pause">The one thing that gives me pause</h2>

<p>Privacy. To do all of this, Muse held my phone number, my email address, my daughters’ ages — and for the visa, passport details. Extraordinarily sensitive information, flowing through an assistant to get the job done.</p>

<p>Of course, I pulled the passport out of the process — I handled that part myself. But even the hotel bookings carry plenty of sensitive data, and right now there’s no good way to manage any of it. I end up managing all of it out of band, in my head, as a parallel manual process. That doesn’t scale.</p>

<p>Here’s what the future needs: <strong>a local vault.</strong> I put my sensitive information into a vault on my own machine. The agent never sees the raw data — it gets a token, decrypts what it needs at the moment of use, does the work, and the plaintext never lands in a transcript or a log. The agent becomes fully capable <em>without</em> becoming a liability. That’s the missing piece between “impressive demo” and “I’d trust this with my life’s paperwork.”</p>

<h2 id="the-quiet-arrival">The quiet arrival</h2>

<p>Maybe AGI doesn’t arrive with a press release. It arrives on a Saturday morning when you realize the car drives better than you do, and on the evening a visa package assembles itself while you have dinner. It arrives quietly, domain by domain — and the shocking part is how fast “impossible” becomes “of course.”</p>

<p>The age of AGI has already come — not with a press release, but domain by domain. First the car drove better than I do. Then an assistant planned my family trip better than I could. We keep waiting for the announcement; we already lived through it.</p>]]></content><author><name>Liang Gou</name></author><summary type="html"><![CDATA[Two recent experiences — a near-miss on the road and a trip planned with AI — convinced me AGI has quietly arrived.]]></summary></entry><entry><title type="html">Is Jev Hype or a Real System One?</title><link href="https://lianggou.github.io/2026/09/26/is-jev-hype-or-real-system-one.html" rel="alternate" type="text/html" title="Is Jev Hype or a Real System One?" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://lianggou.github.io/2026/09/26/is-jev-hype-or-real-system-one</id><content type="html" xml:base="https://lianggou.github.io/2026/09/26/is-jev-hype-or-real-system-one.html"><![CDATA[<p>There’s a debate going around about Jev, the new model from TypeSafe. One camp says it’s exactly what AI needs: a fast, cost-efficient System One to complement the slow reasoning of frontier models. The other camp says it’s hype — just a rebranded classifier, BERT-era technology with better marketing.</p>

<p>I’ve been thinking about System One models for a while, and I decided to stop debating and start measuring. But first, why I believe the System One direction matters at all.</p>

<h2 id="why-ai-needs-a-system-one">Why AI needs a System One</h2>

<p>Human brains process information with two systems. System One is intuition: fast, automatic, no thinking required. It’s muscle memory. You catch something flying at your face before you consciously see it. You learned it the hard way — millions of years of evolution, plus every scraped knee from when you were a kid learning to walk, run, dodge, and not fall down. Years of accumulated learning, compressed into instant reaction.</p>

<p>System Two is the opposite: slow, deliberate reasoning. You gather evidence, connect dots, debate pros and cons, maybe run through a framework, and then decide.</p>

<p>Here’s my claim: today’s frontier LLMs are System Two. Give them a hard question and they do chain-of-thought — they roll out different lines of thinking, argue with themselves, and eventually produce a final decision. That’s remarkably human-like System Two behavior. And it’s remarkable, full stop.</p>

<p>But a brain made of only System Two would be unusable. You’d deliberate for ten seconds about whether to blink. AI has the same problem.</p>

<h2 id="what-jev-actually-claims">What Jev actually claims</h2>

<p>TypeSafe — founded by Diogo Almeida, who previously worked on the methods behind ChatGPT at OpenAI — spent two years in stealth building what they call System One Models. Jev is the first one, and the pitch is refreshingly concrete:</p>

<ul>
  <li><strong>Unstructured state in, typed probabilistic decisions out.</strong> You hand it a state (say, a bundle of logs) and declare your questions up front: yes/no judgments, choices between options, scores. It answers all of them in parallel off the same shared state.</li>
  <li><strong>No string generation.</strong> It gives up text output entirely, which means it structurally <em>can’t</em> hallucinate and never makes type errors.</li>
  <li><strong>Fast and cheap.</strong> 70–500ms per query, input at $0.042 per million tokens, outputs too cheap to meter. They claim roughly two orders of magnitude faster and cheaper than frontier LLMs on these tasks.</li>
  <li><strong>Calibrated confidence.</strong> Trained with a method they call RLCD — reinforcement learning for calibrated decisions — so its probabilities are supposed to be epistemically honest: high confidence actually means high accuracy.</li>
</ul>

<p>The name is a double homage: Kahneman’s <em>Thinking, Fast and Slow</em>, and William Stanley Jevons — of the Jevons paradox, where every efficiency gain in a resource increases total demand for it. Their bet: collapsing the cost of decisions unlocks a flood of new uses.</p>

<p>It’s a crisp story. The question is whether the numbers hold up.</p>

<h2 id="why-i-care-detection-at-enterprise-scale">Why I care: detection at enterprise scale</h2>

<p>I’ve spent years building detection systems in observability and security: time-series foundation models for anomaly detection, log-based detection, graph-based detection. Here’s the reality of that world: an enterprise monitors tens of millions of time series and generates terabytes to petabytes of logs. You cannot pipe all of that into a frontier LLM and ask “is anything anomalous?” It’s too slow and far too expensive.</p>

<p>The standard answer is a two-tier funnel: cheap rules or small ML models sift everything at scale, and the expensive models only look at what survives. That works — except the whole game is signal-to-noise ratio. The cheap tier drowns you in false positives, and every false positive costs a human’s attention. Getting the false-positive rate down <em>at scale</em> is the hard problem.</p>

<p>This is exactly the shape of a System One job: react fast, cost almost nothing, and be well-calibrated about uncertainty. If Jev is real, it slots into that funnel as a dramatically better cheap tier. Feed it 10,000 logs, get anomaly scores back in milliseconds. (One limitation today: it doesn’t take numeric states directly. But there are workarounds — you can build textual descriptors of a time series and score those. The paradigm matters more than the current input format.)</p>

<h2 id="its-just-a-rebranded-classifier">“It’s just a rebranded classifier”</h2>

<p>Now the skeptical voice, steelmanned: there’s nothing technically new here. Before the GPT era, BERT-based models did classification, annotation, and prediction just fine. Calling it “System One” is marketing draped over old technology. No paradigm shift.</p>

<p>I half-agree. Jev is not a GPT-level technical discontinuity. Nobody’s claiming a new scaling law.</p>

<p>But that objection misses the point in two ways. First, the neuroscience: human System One isn’t a dumbed-down System Two. Research suggests it’s in some ways <em>more</em> complex — dense shortcut connections that System Two doesn’t have. Fast intuition is an engineering achievement, not a simplification. Calibrated, parallel, hallucination-proof decisions at 100ms is genuinely hard, and “classifier” undersells it the way “autocomplete” undersold GPT-3.</p>

<p>Second, and more importantly: Jev opened the aperture. It gave the idea a name, shipped demos, showed use cases, and educated people that System One is a thing worth building — complementary to System Two, not competing with it. Movements need that. The best technology doesn’t win by being right; it wins by being legible.</p>

<h2 id="the-real-opportunity">The real opportunity</h2>

<p>Here’s the strategic part. Frontier models are dominated by three labs — Anthropic, OpenAI, Google — plus a strong wave of Chinese open-source models. There is no room to out-compete them at System Two. That game is over for everyone else.</p>

<p>But System One is wide open. It’s the layer where researchers, practitioners, and startups can build things that are <em>complementary</em> to frontier models rather than competitive with them: the fast, cheap, calibrated reflexes that sit under and around slow reasoning. Every agent with a System Two brain will need a System One nervous system.</p>

<p>And the two systems feed each other. In the short term, I expect System Two to do more of the helping: frontier models reasoning carefully to generate feedback and pseudo-labels that keep improving System One. A few good examples can do the work of a thousand rules. Distill deliberation into reflex, then spend the savings on more deliberation.</p>

<p>So: is Jev hype or a real System One? My answer is neither camp’s. It’s not hype — the speed, cost, and calibration direction are real, and my own measurements back the shape of the claims. It’s not a paradigm shift either. It’s something more useful than both: a credible first draft of a layer AI genuinely needs, and an invitation to build the rest of it.</p>]]></content><author><name>Liang Gou</name></author><summary type="html"><![CDATA[TypeSafe's Jev claims to be AI's System One — fast, calibrated decisions instead of slow reasoning. I've believed AI needs both systems for a while. I ran Jev on 1,500 log sequences to find out which voice is right.]]></summary></entry><entry><title type="html">Why I’m writing in the open</title><link href="https://lianggou.github.io/2026/09/25/why-im-writing-in-the-open.html" rel="alternate" type="text/html" title="Why I’m writing in the open" /><published>2026-09-25T00:00:00+00:00</published><updated>2026-09-25T00:00:00+00:00</updated><id>https://lianggou.github.io/2026/09/25/why-im-writing-in-the-open</id><content type="html" xml:base="https://lianggou.github.io/2026/09/25/why-im-writing-in-the-open.html"><![CDATA[<p>For years, my thinking lived in design docs, meeting notes, and papers. Useful to my team — invisible to everyone else.</p>

<p>This site changes that. I’ll be writing about applied machine learning, engineering leadership, and the founder path I’m exploring — in the open, where ideas can find the people who need them.</p>

<p>One principle: <strong>no algorithms in the middle.</strong> If you subscribe, you get everything I publish. Growth here happens the old-fashioned way — one reader telling another that something was worth their time.</p>

<p>If that sounds like your kind of corner of the internet, <a href="/subscribe/">subscribe</a>. Let’s build this community one thoughtful reader at a time.</p>]]></content><author><name>Liang Gou</name></author><summary type="html"><![CDATA[The reason this site exists: building a community around ideas, organically.]]></summary></entry></feed>