Anthropic Engineering 1:1 复刻 · 中英对照存档
← Blog 时间线 中文详解 Markdown Anthropic 原文 ↗

Engineering at Anthropic

Harness design for long-running application development

Harness design is key to performance at the frontier of agentic coding. Here's how we pushed Claude further in frontend design and long-running autonomous software engineering.

Harness design 是 agentic coding 前沿性能的关键。下面讲我们如何在前端设计和长程自主软件工程两个方向,把 Claude 推得更远。

Published Mar 24, 2026 · Written by Prithvi Rajasekaran, a member of our Labs team.

视图
原文:anthropic.com/engineering ↗
EN

Over the past several months I've been working on two interconnected problems: getting Claude to produce high-quality frontend designs, and getting it to build complete applications without human intervention. This work originated with earlier efforts on our frontend design skill and long-running coding agent harness, where my colleagues and I were able to improve Claude's performance well above baseline through prompt engineering and harness design—but both eventually hit ceilings.

中文

过去几个月,我一直在处理两个彼此关联的问题:让 Claude 产出高质量的前端设计,以及让它在没有人类干预的情况下构建完整的应用。这项工作源于我们早先在 frontend design skill 和长程 coding agent harness 上的努力——当时我和同事通过 prompt engineering 和 harness design,把 Claude 的表现提升到远高于 baseline 的水平,但两个方向最终都撞到了天花板。

To break through, I sought out novel AI engineering approaches that held across two quite different domains, one defined by subjective taste, the other by verifiable correctness and usability. Taking inspiration from Generative Adversarial Networks (GANs), I designed a multi-agent structure with a generator and evaluator agent. Building an evaluator that graded outputs reliably—and with taste—meant first developing a set of criteria that could turn subjective judgments like "is this design good?" into concrete, gradable terms.

为了突破,我去寻找在两个差异很大的领域里都成立的新颖 AI 工程方法:一个领域由主观品味定义,另一个由可验证的正确性和可用性定义。受 Generative Adversarial Networks(GANs,生成对抗网络)启发,我设计了一个由 generator 和 evaluator 两个 agent 组成的多智能体结构。要构建一个能可靠打分、并且有品味的 evaluator,首先得开发出一套标准,把"这个设计好不好?"这类主观判断转化为具体、可打分的指标。

I then applied these techniques to long-running autonomous coding, carrying over two lessons from our earlier harness work: decomposing the build into tractable chunks, and using structured artifacts to hand off context between sessions. The final result was a three-agent architecture—planner, generator, and evaluator—that produced rich full-stack applications over multi-hour autonomous coding sessions.

随后我把这些技术应用到长程自主 coding 上,沿用了我们早期 harness 工作的两条经验:把构建过程拆解成可处理的小块,以及用结构化的 artifact 在多次会话之间交接上下文。最终成果是一个三智能体架构——planner、generator、evaluator——能够在长达数小时的自主 coding 会话中,产出功能丰富的全栈应用。

Why naive implementations fall short

为什么朴素实现不够用

We've previously shown that harness design has a substantial impact on the effectiveness of long running agentic coding. In an earlier experiment, we used an initializer agent to decompose a product spec into a task list, and a coding agent that implemented the tasks one feature at a time before handing off artifacts to carry context across sessions. The broader developer community has converged on similar insights, with approaches like the "Ralph Wiggum" method using hooks or scripts to keep agents in continuous iteration cycles.

我们此前已经表明,harness design 对长程 agentic coding 的效果有实质性影响。在更早的一个实验里,我们用一个 initializer agent 把 product spec 拆解成任务清单,再用一个 coding agent 一次实现一个 feature,然后通过交接 artifact 在多次会话之间传递上下文。更广泛的开发者社区也收敛到了类似的洞见,比如 "Ralph Wiggum" 方法,用 hook 或脚本让 agent 保持在持续的迭代循环中。

But some problems remained persistent. For more complex tasks, the agent still tends to go off the rails over time. While decomposing this issue, we observed two common failure modes with agents executing these sorts of tasks.

但有些问题始终存在。对于更复杂的任务,agent 仍然会随着时间推移逐渐"脱轨"。在拆解这个问题时,我们观察到 agent 执行这类任务时有两种常见的 failure mode。

First is that models tend to lose coherence on lengthy tasks as the context window fills (see our post on context engineering). Some models also exhibit "context anxiety," in which they begin wrapping up work prematurely as they approach what they believe is their context limit. Context resets—clearing the context window entirely and starting a fresh agent, combined with a structured handoff that carries the previous agent's state and the next steps—addresses both these issues.

第一,随着 context window 被填满,模型在长任务上往往会失去连贯性(参见我们关于 context engineering 的文章)。有些模型还会表现出 "context anxiety"(上下文焦虑):当它们接近自认为的 context 上限时,会开始过早地草草收尾。Context reset——彻底清空 context window、启动一个全新的 agent,再配合一份承载前一个 agent 状态和后续步骤的结构化交接——能同时解决这两个问题。

This differs from compaction, where earlier parts of the conversation are summarized in place so the same agent can keep going on a shortened history. While compaction preserves continuity, it doesn't give the agent a clean slate, which means context anxiety can still persist. A reset provides a clean slate, at the cost of the handoff artifact having enough state for the next agent to pick up the work cleanly. In our earlier testing, we found Claude Sonnet 4.5 exhibited context anxiety strongly enough that compaction alone wasn't sufficient to enable strong long task performance, so context resets became essential to the harness design. This solves the core issue, but adds orchestration complexity, token overhead, and latency to each harness run.

这与 compaction(压缩)不同:compaction 是就地把对话中较早的部分总结掉,让同一个 agent 在缩短后的历史上继续工作。compaction 保留了连续性,但并没有给 agent 一块干净的白板,这意味着 context anxiety 仍可能存在。reset 提供了干净白板,代价是交接 artifact 必须包含足够的状态,让下一个 agent 能干净地接手工作。在我们早期的测试中,我们发现 Claude Sonnet 4.5 的 context anxiety 强到仅靠 compaction 不足以支撑强劲的长任务表现,因此 context reset 成了 harness design 中不可或缺的一环。这解决了核心问题,但也给每次 harness run 增加了编排复杂度、token 开销和延迟。

A second issue, which we haven't previously addressed, is self-evaluation. When asked to evaluate work they've produced, agents tend to respond by confidently praising the work—even when, to a human observer, the quality is obviously mediocre. This problem is particularly pronounced for subjective tasks like design, where there is no binary check equivalent to a verifiable software test. Whether a layout feels polished or generic is a judgment call, and agents reliably skew positive when grading their own work.

第二个问题是我们此前没有处理过的:self-evaluation(自我评估)。当被要求评估自己产出的工作时,agent 往往会自信地夸赞这份工作——哪怕在人类观察者看来,质量明显很平庸。这个问题在设计这类主观任务上尤其突出,因为这里没有等同于"可验证软件测试"的二元检查。一个布局到底是显得精致还是泛泛,这是一种判断,而 agent 在给自己的工作打分时,会稳定地偏向正面。

However, even on tasks that do have verifiable outcomes, agents still sometimes exhibit poor judgment that impedes their performance while completing the task. Separating the agent doing the work from the agent judging it proves to be a strong lever to address this issue. The separation doesn't immediately eliminate that leniency on its own; the evaluator is still an LLM that is inclined to be generous towards LLM-generated outputs. But tuning a standalone evaluator to be skeptical turns out to be far more tractable than making a generator critical of its own work, and once that external feedback exists, the generator has something concrete to iterate against.

不过,即便是在确有可验证结果的任务上,agent 有时仍会表现出糟糕的判断力,妨碍它在完成任务时的表现。把"干活的 agent"和"评判的 agent"分开,事实证明是解决这个问题的一个有力杠杆。这种分离本身并不会立刻消除那种宽容:evaluator 仍然是一个 LLM,天生倾向于对 LLM 生成的输出手下留情。但事实证明,把一个独立的 evaluator 调教得多疑(skeptical),远比让 generator 对自己的工作变得挑剔要可行得多;而一旦这种外部反馈存在,generator 就有了可以据以迭代的具体依据。

Frontend design: making subjective quality gradable

前端设计:让主观质量变得可打分

I started by experimenting on frontend design, where the self-evaluation issue was most visible. Absent any intervention, Claude normally gravitates toward safe, predictable layouts that are technically functional but visually unremarkable.

我从前端设计入手做实验,因为 self-evaluation 问题在这里最明显。在没有任何干预的情况下,Claude 通常会倾向于安全、可预测的布局——技术上能用,但视觉上平平无奇。

Two insights shaped the harness I built for frontend design. First, while aesthetics can't be fully reduced to a score—and individual tastes will always vary—they can be improved with grading criteria that encode design principles and preferences. "Is this design beautiful?" is hard to answer consistently, but "does this follow our principles for good design?" gives Claude something concrete to grade against. Second, by separating frontend generation from frontend grading, we can create a feedback loop that drives the generator toward stronger outputs.

有两点洞见塑造了我为前端设计构建的 harness。第一,尽管美学无法被完全还原成一个分数——而且个人品味总会因人而异——但可以通过把设计原则和偏好编码进打分标准来加以改进。"这个设计美吗?"很难给出一致的回答,但"它是否遵循我们对优秀设计的原则?"就给了 Claude 一个具体的、可据以打分的对象。第二,通过把前端生成和前端打分分离,我们可以构造一个反馈循环,推动 generator 朝更强的输出前进。

With this in mind, I wrote four grading criteria that I gave to both the generator and evaluator agents in their prompts:

带着这个想法,我写了四条打分标准,并把它们写进 generator 和 evaluator 两个 agent 的 prompt 里:

  • Design quality: Does the design feel like a coherent whole rather than a collection of parts? Strong work here means the colors, typography, layout, imagery, and other details combine to create a distinct mood and identity.
  • Originality: Is there evidence of custom decisions, or is this template layouts, library defaults, and AI-generated patterns? A human designer should recognize deliberate creative choices. Unmodified stock components—or telltale signs of AI generation like purple gradients over white cards—fail here.
  • Craft: Technical execution: typography hierarchy, spacing consistency, color harmony, contrast ratios. This is a competence check rather than a creativity check. Most reasonable implementations do fine here by default; failing means broken fundamentals.
  • Functionality: Usability independent of aesthetics. Can users understand what the interface does, find primary actions, and complete tasks without guessing?
  • Design quality(设计质量):这个设计是否感觉像一个连贯的整体,而不是一堆零件的拼凑?这一项做得好,意味着色彩、字体排印、布局、图像和其他细节共同营造出一种独特的氛围与识别度。
  • Originality(原创性):是否能看出定制化的决策,还是只是模板布局、库的默认样式和 AI 生成的套路?一个人类设计师应该能认出其中有意为之的创意选择。未经修改的现成组件——或者像"白卡片上叠紫色渐变"这种 AI 生成的典型痕迹——在这一项会不及格。
  • Craft(工艺):技术执行层面:字体层级、间距一致性、色彩和谐、对比度。这是一项能力检查,而非创意检查。大多数合理的实现默认就能做得不错;不及格意味着基本功是坏的。
  • Functionality(功能性):与美学无关的可用性。用户能否理解这个界面是做什么的、找到主要操作、并且无需猜测就完成任务?

I emphasized design quality and originality over craft and functionality. Claude already scored well on craft and functionality by default, as the required technical competence tended to come naturally to the model. But on design and originality, Claude often produced outputs that were bland at best. The criteria explicitly penalized highly generic "AI slop" patterns, and by weighting design and originality more heavily it pushed the model toward more aesthetic risk-taking.

我把 design quality 和 originality 看得比 craft 和 functionality 更重。Claude 在 craft 和 functionality 上默认就得分不错,因为所需的技术能力对模型来说往往是水到渠成的。但在 design 和 originality 上,Claude 产出的结果往往充其量只能算乏味。这套标准明确惩罚高度套路化的 "AI slop"(AI 流水线垃圾)模式,并且通过给 design 和 originality 更高的权重,把模型推向更敢于冒险的美学表达。

I calibrated the evaluator using few-shot examples with detailed score breakdowns. This ensured the evaluator's judgment aligned with my preferences, and reduced score drift across iterations.

我用带有详细分数拆解的 few-shot 示例来校准 evaluator。这确保了 evaluator 的判断与我的偏好对齐,并减少了跨迭代的分数漂移(score drift)。

I built the loop on the Claude Agent SDK, which kept the orchestration straightforward. A generator agent first created an HTML/CSS/JS frontend based on a user prompt. I gave the evaluator the Playwright MCP, which let it interact with the live page directly before scoring each criterion and writing a detailed critique. In practice, the evaluator would navigate the page on its own, screenshotting and carefully studying the implementation before producing its assessment. That feedback flowed back to the generator as input for the next iteration. I ran 5 to 15 iterations per generation, with each iteration typically pushing the generator in a more distinctive direction as it responded to the evaluator's critique. Because the evaluator was actively navigating the page rather than scoring a static screenshot, each cycle took real wall-clock time. Full runs stretched up to four hours. I also instructed the generator to make a strategic decision after each evaluation: refine the current direction if scores were trending well, or pivot to an entirely different aesthetic if the approach wasn't working.

我把这个循环建在 Claude Agent SDK 上,这让编排保持简单。一个 generator agent 先根据用户 prompt 创建一个 HTML/CSS/JS 前端。我给 evaluator 配了 Playwright MCP,让它在为每条标准打分、撰写详细 critique 之前,能够直接与实时页面交互。实际运行中,evaluator 会自己浏览页面、截图、仔细研究实现,然后才给出评估。那份反馈又会作为下一轮迭代的输入流回 generator。我每次 generation 跑 5 到 15 轮迭代,每一轮通常都会随着 generator 回应 evaluator 的 critique 而把它推向更有辨识度的方向。因为 evaluator 是在主动浏览页面,而不是给一张静态截图打分,所以每个循环都要消耗真实的 wall-clock 时间。完整的 run 可以拉长到四小时。我还指示 generator 在每次评估之后做一个策略性决策:如果分数走势良好,就精炼当前方向;如果这条路走不通,就转向一种完全不同的美学。

Across runs, the evaluator's assessments improved over iterations before plateauing, with headroom still remaining. Some generations refined incrementally. Others took sharp aesthetic turns between iterations.

在各次 run 中,evaluator 的评估随着迭代不断提升,然后趋于平台期,但仍留有上升空间。有些 generation 是渐进式精炼,另一些则在迭代之间做出了急剧的美学转向。

The wording of the criteria steered the generator in ways I didn't fully anticipate. Including phrases like "the best designs are museum quality" pushed designs toward a particular visual convergence, suggesting that the prompting associated with the criteria directly shaped the character of the output.

标准的措辞以我没有完全预料到的方式引导着 generator。加入像"最好的设计是博物馆级别的(museum quality)"这样的措辞,会把设计推向某种特定的视觉收敛,这表明与标准绑定的 prompting 直接塑造了输出的性格。

While scores generally improved over iterations, the pattern was not always cleanly linear. Later implementations tended to be better as a whole, but I regularly saw cases where I preferred a middle iteration over the last one. Implementation complexity also tended to increase across rounds, with the generator reaching for more ambitious solutions in response to the evaluator's feedback. Even on the first iteration, outputs were noticeably better than a baseline with no prompting at all, suggesting the criteria and associated language themselves steered the model away from generic defaults before any evaluator feedback led to further refinement.

尽管分数总体上随迭代提升,这个模式却并不总是干净的线性。后期的实现整体上往往更好,但我也经常遇到自己更偏爱中间某一轮、而非最后一轮的情况。实现复杂度也倾向于逐轮增加,generator 会为了回应 evaluator 的反馈而去够更有野心的方案。即便在第一轮迭代,输出也已经明显优于完全没有 prompting 的 baseline,这表明标准及其相关语言本身,就在任何 evaluator 反馈带来进一步精炼之前,把模型从泛泛的默认值引开了。

In one notable example, I prompted the model to create a website for a Dutch art museum. By the ninth iteration, it had produced a clean, dark-themed landing page for a fictional museum. The page was visually polished but largely in line with my expectations. Then, on the tenth cycle, it scrapped the approach entirely and reimagined the site as a spatial experience: a 3D room with a checkered floor rendered in CSS perspective, artwork hung on the walls in free-form positions, and doorway-based navigation between gallery rooms instead of scroll or click. It was the kind of creative leap that I hadn't seen before from a single-pass generation.

有一个很值得一提的例子:我让模型为一家荷兰艺术博物馆创建网站。到第九轮迭代时,它为一家虚构的博物馆做出了一个干净的深色主题落地页。页面在视觉上很精致,但基本符合我的预期。然后,在第十个循环,它彻底推翻了这个方案,把网站重新构想成一种空间体验:一个用 CSS perspective 渲染、带棋盘格地板的 3D 房间,墙上以自由的位置挂着艺术作品,展厅之间用"门廊"导航,而不是滚动或点击。这是那种我此前从未在单次生成中见过的创意跃迁。

[ 原文图像 / 视频占位 ]荷兰艺术博物馆网站第十轮迭代:CSS 3D 空间画廊(原文为交互/截图素材,未在此转载原始文件)
[ media placeholder ]对应原文该处的演示素材;如需查看原始视觉,请见 Anthropic 原文 ↗

Scaling to full-stack coding

扩展到全栈 coding

With these findings in hand, I applied this GAN-inspired pattern to full-stack development. The generator-evaluator loop maps naturally onto the software development lifecycle, where code review and QA serve the same structural role as the design evaluator.

有了这些发现,我把这种受 GAN 启发的模式应用到全栈开发上。generator-evaluator 循环很自然地映射到软件开发生命周期上——其中 code review 和 QA 扮演着与设计 evaluator 相同的结构性角色。

The architecture

架构

In our earlier long-running harness, we had solved for coherent multi-session coding with an initializer agent, a coding agent that worked one feature at a time, and context resets between sessions. Context resets were a key unlock: the harness used Sonnet 4.5, which exhibited the "context anxiety" tendency mentioned earlier. Creating a harness that worked well across context resets was key to keeping the model on task. Opus 4.5 largely removed that behavior on its own, so I was able to drop context resets from this harness entirely. The agents were run as one continuous session across the whole build, with the Claude Agent SDK's automatic compaction handling context growth along the way.

在我们早先的长程 harness 里,我们用一个 initializer agent、一个一次只做一个 feature 的 coding agent,以及会话之间的 context reset,解决了跨多会话的连贯 coding 问题。context reset 是一个关键的突破口:那套 harness 用的是 Sonnet 4.5,它表现出前面提到的 "context anxiety" 倾向。构造一个能在 context reset 之间良好运转的 harness,是让模型保持专注的关键。Opus 4.5 在很大程度上自行消除了这种行为,所以我得以把 context reset 从这套 harness 里彻底去掉。这些 agent 在整个构建过程中作为一个连续会话运行,沿途由 Claude Agent SDK 的自动 compaction 来处理上下文增长。

For this work I built on the foundation from the original harness with a three-agent system, with each agent addressing a specific gap I'd observed in prior runs. The system contained the following agent personas:

在这项工作中,我在原始 harness 的基础上搭建了一个三智能体系统,每个 agent 都针对我在先前 run 中观察到的某个具体缺口。系统包含以下几种 agent persona:

Planner: Our previous long-running harness required the user to provide a detailed spec upfront. I wanted to automate that step, so I created a planner agent that took a simple 1-4 sentence prompt and expanded it into a full product spec. I prompted it to be ambitious about scope and to stay focused on product context and high level technical design rather than detailed technical implementation. This emphasis was due to the concern that if the planner tried to specify granular technical details upfront and got something wrong, the errors in the spec would cascade into the downstream implementation. It seemed smarter to constrain the agents on the deliverables to be produced and let them figure out the path as they worked. I also asked the planner to find opportunities to weave AI features into the product specs. (See example in the Appendix at the bottom.)

Planner(规划者):我们之前的长程 harness 要求用户预先提供一份详细的 spec。我想把这一步自动化,于是创建了一个 planner agent,它接收一段简单的 1–4 句话 prompt,并把它扩展成一份完整的 product spec。我在 prompt 中要求它在 scope 上要有野心,并且聚焦于产品语境和高层技术设计,而不是细粒度的技术实现。之所以这样强调,是出于一种担忧:如果 planner 试图预先指定细粒度的技术细节、却搞错了某处,那么 spec 中的错误就会向下游实现层层级联。更聪明的做法似乎是:在"要产出的交付物"上约束 agent,让它们在干活过程中自行摸索路径。我还要求 planner 寻找机会,把 AI 功能编织进 product spec 里。(示例见文末的 Appendix。)

Generator: The one-feature-at-a-time approach from the earlier harness worked well for scope management. I applied a similar model here, instructing the generator to work in sprints, picking up one feature at a time from the spec. Each sprint implemented the app with a React, Vite, FastAPI, and SQLite (later PostgreSQL) stack, and the generator was instructed to self-evaluate its work at the end of each sprint before handing off to QA. It also had git for version control.

Generator(生成者):早期 harness 里"一次一个 feature"的做法在 scope 管理上效果很好。我在这里沿用了类似的模型,指示 generator 以 sprint 为单位工作,每次从 spec 里取出一个 feature。每个 sprint 都用 React、Vite、FastAPI 和 SQLite(后来换成 PostgreSQL)这套技术栈来实现应用,并且 generator 被要求在每个 sprint 结束、交接给 QA 之前先 self-evaluate 自己的工作。它还配有 git 用于版本控制。

Evaluator: Applications from earlier harnesses often looked impressive but still had real bugs when you actually tried to use them. To catch these, the evaluator used the Playwright MCP to click through the running application the way a user would, testing UI features, API endpoints, and database states. It then graded each sprint against both the bugs it had found and a set of criteria modeled on the frontend experiment, adapted here to cover product depth, functionality, visual design, and code quality. Each criterion had a hard threshold, and if any one fell below it, the sprint failed and the generator got detailed feedback on what went wrong.

Evaluator(评估者):早期 harness 产出的应用往往看起来很唬人,但你真去用的时候仍然有实打实的 bug。为了抓住这些问题,evaluator 用 Playwright MCP 像用户那样把运行中的应用点一遍,测试 UI 功能、API 端点和数据库状态。然后它会对照两样东西给每个 sprint 打分:它发现的 bug,以及一套仿照前端实验建立、并在此处调整以覆盖产品深度、功能性、视觉设计和代码质量的标准。每条标准都有一个硬阈值,只要其中任何一条低于阈值,这个 sprint 就算失败,generator 会收到关于哪里出错的详细反馈。

Before each sprint, the generator and evaluator negotiated a sprint contract: agreeing on what "done" looked like for that chunk of work before any code was written. This existed because the product spec was intentionally high-level, and I wanted a step to bridge the gap between user stories and testable implementation. The generator proposed what it would build and how success would be verified, and the evaluator reviewed that proposal to make sure the generator was building the right thing. The two iterated until they agreed.

在每个 sprint 开始前,generator 和 evaluator 会协商一份 sprint contract(冲刺契约):在写任何代码之前,先就这块工作"做完是什么样"达成一致。之所以有这一步,是因为 product spec 被有意写得很高层,而我想要一个环节来弥合 user story 与可测试实现之间的鸿沟。generator 提出它要构建什么、成功将如何被验证,evaluator 则审查这份提案,确保 generator 在构建正确的东西。两者反复迭代,直到达成一致。

Communication was handled via files: one agent would write a file, another agent would read it and respond either within that file or with a new file that the previous agent would read in turn. The generator then built against the agreed-upon contract before handing the work off to QA. This kept the work faithful to the spec without over-specifying implementation too early.

智能体之间的通信通过文件来完成:一个 agent 写一个文件,另一个 agent 读它,然后要么在该文件内回应,要么用一个新文件回应、再由前一个 agent 读取。随后 generator 对照已达成一致的 contract 进行构建,再把工作交接给 QA。这样既让工作忠实于 spec,又不至于过早地把实现规定得太死。

Running the harness

运行这套 harness

For the first version of this harness, I used Claude Opus 4.5, running user prompts against both the full harness and a single-agent system for comparison. I used Opus 4.5 since this was our best coding model when I began these experiments.

这套 harness 的第一个版本,我用的是 Claude Opus 4.5,把用户 prompt 同时跑在完整 harness 和一个单 agent 系统上做对比。我用 Opus 4.5,是因为在我开始这些实验时它是我们最好的 coding 模型。

I wrote the following prompt to generate a retro video game maker:

Create a 2D retro game maker with features including a level editor, sprite editor, entity behaviors, and a playable test mode.

我写了下面这个 prompt 来生成一个复古游戏制作器:

创建一个 2D 复古游戏制作器,功能包括关卡编辑器(level editor)、精灵编辑器(sprite editor)、实体行为(entity behaviors),以及一个可游玩的测试模式(playable test mode)。

The table below shows the harness type, length it ran for, and the total cost.

HarnessDurationCost
Solo20 min$9
Full harness6 hr$200

下表显示了 harness 类型、运行时长和总成本。

Harness时长成本
Solo(单 agent)20 分钟$9
Full harness(完整 harness)6 小时$200

The harness was over 20x more expensive, but the difference in output quality was immediately apparent.

这套 harness 贵了 20 倍以上,但输出质量的差距立刻就显现了出来。

I was expecting an interface where I could construct a level and its component parts (sprites, entities, tile layout) then hit play to actually play the level. I started by opening the solo run's output, and the initial application seemed in line with those expectations.

我期待的是这样一个界面:我可以构建一个关卡及其组成部分(sprite、entity、tile 布局),然后按下"play"就能真正玩这个关卡。我先打开了 solo run 的产物,最初的应用看起来还算符合这些预期。

As I clicked through, however, issues started to emerge. The layout wasted space, with fixed-height panels leaving most of the viewport empty. The workflow was rigid. Trying to populate a level prompted me to create sprites and entities first, but nothing in the UI guided me toward that sequence. More to the point, the actual game was broken. My entities appeared on screen but nothing responded to input. Digging into the code revealed that the wiring between entity definitions and the game runtime was broken, with no surface indication of where.

然而当我一路点下去,问题开始浮现。布局浪费空间,固定高度的面板让视口的大部分区域空着。工作流很僵硬。我想往关卡里填东西,结果它要求我先创建 sprite 和 entity,但 UI 里没有任何东西引导我走这个顺序。更要命的是,游戏本身是坏的。我的 entity 出现在屏幕上,却没有任何东西对输入做出响应。深入代码后发现,entity 定义和游戏运行时之间的接线断了,而且表面上完全看不出断在哪里。

[ 原文图组:Opening screen · Sprite editor · Game play ]solo harness 创建的应用在打开时的初始界面(原文为截图素材)
Initial screen when opening the app created by the solo harness.
[ media placeholder ]原文该处为三张截图:打开界面、精灵编辑器、游戏运行
solo harness 所创建应用打开时的初始界面。

After evaluating the solo run, I turned my attention to the harness run. This run started from the same one-sentence prompt, but the planner step expanded that prompt into a 16-feature spec spread across ten sprints. It went well beyond what the solo run attempted. In addition to the core editors and play mode, the spec called for a sprite animation system, behavior templates, sound effects and music, an AI-assisted sprite generator and level designer, and game export with shareable links. I gave the planner access to our frontend design skill, which it read and used to create a visual design language for the app as part of the spec. For each sprint, the generator and evaluator negotiated a contract defining the specific implementation details for the sprint, and the testable behaviors that would be tested to verify completion.

评估完 solo run 之后,我把注意力转向 harness run。这次 run 从同样一句话的 prompt 出发,但 planner 这一步把它扩展成了一份 16 个 feature、分布在十个 sprint 上的 spec。它远远超出了 solo run 的尝试范围。除了核心的编辑器和 play 模式之外,spec 还要求一个 sprite 动画系统、行为模板、音效与音乐、一个 AI 辅助的 sprite 生成器和关卡设计器,以及带可分享链接的游戏导出。我让 planner 能访问我们的 frontend design skill,它读了之后,把它用来为应用创建一套视觉设计语言,作为 spec 的一部分。对每个 sprint,generator 和 evaluator 都协商出一份 contract,定义该 sprint 的具体实现细节,以及用来验证完成情况的、可测试的行为。

The app immediately showed more polish and smoothness than the solo run. The canvas used the full viewport, the panels were sized sensibly, and the interface had a consistent visual identity that tracked the design direction from the spec. Some of the clunkiness I'd seen in the solo run did remain—the workflow still didn't make it clear that you should build sprites and entities before trying to populate a level, and I had to figure that out by poking around. This read as a gap in the base model's product intuition rather than something the harness was designed to address, though it did suggest a place where targeted iteration inside the harness could help to further improve output quality.

这个应用立刻就比 solo run 显得更精致、更顺滑。画布用满了整个视口,面板尺寸安排得合理,界面有一套与 spec 里设计方向一致的视觉识别。我在 solo run 里见到的一些笨拙之处确实还在——工作流仍然没有讲清楚你应该先构建 sprite 和 entity 再去填充关卡,我还得靠自己四处摸索才弄明白。这读起来像是 base model 在产品直觉上的一个缺口,而不是这套 harness 本就要解决的东西;不过它的确指出了一个地方:在 harness 内部做有针对性的迭代,有助于进一步提升输出质量。

Working through the editors, the new run's advantages over solo became more apparent. The sprite editor was richer and more fully featured, with cleaner tool palettes, a better color picker, and more usable zoom controls.

把这些编辑器逐个用下来,新 run 相较 solo 的优势就更明显了。sprite 编辑器更丰富、功能更完整,工具面板更干净、取色器更好,缩放控制也更好用。

Because I'd asked the planner to weave AI features into its specs, the app also came with a built-in Claude integration that let me generate different parts of the game through prompting. This significantly sped up the workflow.

因为我要求 planner 把 AI 功能编织进 spec,这个应用还自带了一个内置的 Claude 集成,让我可以通过 prompting 来生成游戏的不同部分。这大大加快了工作流。

[ 原文图组:Opening screen · Sprite editor · AI game design · Game play ]用完整 harness 构建的应用:新建游戏时的初始界面(原文为截图素材)
Initial screen: Creating a new game, in the app built with the full harness.
[ media placeholder ]原文该处为多张截图:打开界面、精灵编辑器、两张 AI 关卡生成、游玩生成的游戏
初始界面:在完整 harness 构建的应用中新建游戏。

The biggest difference was in play mode. I was actually able to move my entity and play the game. The physics had some rough edges—my character jumped onto a platform but ended up overlapping with it, which felt intuitively wrong—but the core thing worked, which the solo run did not manage. After moving around a bit, I did hit some limitations with the AI's game level construction. There was a large wall that I wasn't able to jump past, so I was stuck. This suggested there were some common sense improvements and edge cases that the harness could handle to further refine the app.

最大的差别在 play 模式。我真的能移动我的 entity 并玩这个游戏。物理有一些粗糙的地方——我的角色跳上一个平台,结果却和平台重叠在一起,直觉上感觉不对——但核心的东西能跑起来,而这是 solo run 没做到的。四处移动了一会儿之后,我确实碰到了 AI 构建关卡的一些局限。有一面很大的墙我跳不过去,于是卡住了。这表明还有一些常识性的改进和 edge case,是这套 harness 可以去处理、以进一步打磨应用的。

Reading through the logs, it was clear that the evaluator kept the implementation in line with the spec. Each sprint, it walked through the sprint contract's test criteria and exercised the running application through Playwright, filing bugs against anything that diverged from expected behavior. The contracts were granular—Sprint 3 alone had 27 criteria covering the level editor—and the evaluator's findings were specific enough to act on without extra investigation. The table below shows several examples of issues our evaluator identified:

通读日志可以清楚看到,evaluator 让实现始终贴合 spec。每个 sprint,它都会逐条走一遍 sprint contract 的测试标准,通过 Playwright 实地操作运行中的应用,对任何偏离预期行为的地方提 bug。这些 contract 很细——单是 Sprint 3 就有 27 条覆盖关卡编辑器的标准——而且 evaluator 的发现足够具体,不需额外调查就能直接动手。下表展示了我们的 evaluator 识别出的几个问题示例:

Contract criterionEvaluator finding
Rectangle fill tool allows click-drag to fill a rectangular area with selected tile FAIL — Tool only places tiles at drag start/end points instead of filling the region. fillRectangle function exists but isn't triggered properly on mouseUp.
User can select and delete placed entity spawn points FAIL — Delete key handler at LevelEditor.tsx:892 requires both selection and selectedEntityId to be set, but clicking an entity only sets selectedEntityId. Condition should be selection || (selectedEntityId && activeLayer === 'entity').
User can reorder animation frames via API FAILPUT /frames/reorder route defined after /{frame_id} routes. FastAPI matches 'reorder' as a frame_id integer and returns 422: "unable to parse string as an integer."
Contract 标准Evaluator 发现
矩形填充工具支持点击拖拽,用选中的 tile 填满一块矩形区域 FAIL(不通过) — 工具只在拖拽的起点/终点放置 tile,而没有填满整个区域。fillRectangle 函数存在,但在 mouseUp 时没有被正确触发。
用户可以选中并删除已放置的 entity 出生点 FAIL(不通过)LevelEditor.tsx:892 处的 Delete 键处理要求同时设置 selection 和 selectedEntityId,但点击一个 entity 只会设置 selectedEntityId。条件应为 selection || (selectedEntityId && activeLayer === 'entity')
用户可以通过 API 重排动画帧顺序 FAIL(不通过)PUT /frames/reorder 路由定义在 /{frame_id} 路由之后。FastAPI 把 'reorder' 当作 frame_id 整数来匹配,返回 422:"unable to parse string as an integer"。

Getting the evaluator to perform at this level took work. Out of the box, Claude is a poor QA agent. In early runs, I watched it identify legitimate issues, then talk itself into deciding they weren't a big deal and approve the work anyway. It also tended to test superficially, rather than probing edge cases, so more subtle bugs often slipped through. The tuning loop was to read the evaluator's logs, find examples where its judgment diverged from mine, and update the QAs prompt to solve for those issues. It took several rounds of this development loop before the evaluator was grading in a way that I found reasonable. Even then, the harness output showed the limits of the model's QAing capabilities: small layout issues, interactions that felt unintuitive in places, and undiscovered bugs in more deeply nested features that the evaluator hadn't exercised thoroughly. There was clearly more verification headroom to capture with further tuning. But compared to the solo run, where the central feature of the application simply didn't work, the lift was obvious.

让 evaluator 达到这种水平是花了功夫的。开箱即用的 Claude 是个糟糕的 QA agent。在早期的 run 里,我眼看着它识别出了正当的问题,然后又说服自己认定这些问题没什么大不了,照样批准了工作。它还倾向于做表层测试,而不去探查 edge case,所以更微妙的 bug 经常溜过去。调优循环就是:读 evaluator 的日志,找出它的判断与我分歧的例子,再更新 QA 的 prompt 来解决那些问题。这个开发循环要跑好几轮,evaluator 的打分才达到我认为合理的程度。即便如此,harness 的输出仍暴露了模型 QA 能力的极限:细小的布局问题、某些地方感觉不直观的交互,以及 evaluator 没有彻底操作过的、更深层嵌套功能里未被发现的 bug。显然,通过进一步调优还有更多的 verification 上升空间可以挖。但相比 solo run——那里应用的核心功能根本不工作——这种提升是显而易见的。

Iterating on the harness

迭代这套 harness

The first set of harness results was encouraging, but it was also bulky, slow, and expensive. The logical next step was to find ways to simplify the harness without degrading its performance. This was partly common sense and partly a function of a more general principle: every component in a harness encodes an assumption about what the model can't do on its own, and those assumptions are worth stress testing, both because they may be incorrect, and because they can quickly go stale as models improve. Our blog post Building Effective Agents frames the underlying idea as "find the simplest solution possible, and only increase complexity when needed," and it's a pattern that shows up consistently for anyone maintaining an agent harness.

第一批 harness 结果令人鼓舞,但它同样笨重、缓慢、昂贵。合乎逻辑的下一步,是找到办法在不损害性能的前提下简化这套 harness。这部分是常识,部分则源于一条更普遍的原则:harness 里的每一个 component 都编码了"模型自己做不到什么"的一个假设,而这些假设值得做压力测试——既因为它们可能本就是错的,也因为随着模型变强,它们会很快过时。我们的博客文章《Building Effective Agents》把背后的思路概括为"找到尽可能简单的方案,只在需要时才增加复杂度",而这是任何维护 agent harness 的人都会反复遇到的一种模式。

In my first attempt to simplify, I cut the harness back radically and tried a few creative new ideas, but I wasn't able to replicate the performance of the original. It also became difficult to tell which pieces of the harness design were actually load-bearing, and in what ways. Based on that experience, I moved to a more methodical approach, removing one component at a time and reviewing what impact it had on the final result.

在我第一次尝试简化时,我把 harness 大刀阔斧地砍回去,并试了几个有创意的新点子,但没能复现原版的性能。同时也变得很难判断 harness 设计中哪些部分真正是 load-bearing(承重)的、以及是以什么方式承重的。基于那次经验,我转向了一种更有条理的做法:一次移除一个 component,再检查它对最终结果有什么影响。

As I was going through these iteration cycles, we also released Opus 4.6, which provided further motivation to reduce harness complexity. There was good reason to expect 4.6 would need less scaffolding than 4.5 did. From our launch blog: "[Opus 4.6] plans more carefully, sustains agentic tasks for longer, can operate more reliably in larger codebases, and has better code review and debugging skills to catch its own mistakes." It also improved substantially on long-context retrieval. These were all capabilities the harness had been built to supplement.

在我跑这些迭代循环的过程中,我们还发布了 Opus 4.6,这给"降低 harness 复杂度"提供了进一步的动力。有充分理由预期 4.6 会比 4.5 需要更少的脚手架。引用我们的发布博客:"[Opus 4.6] 规划得更谨慎,能把 agentic 任务维持更久,能在更大的代码库里更可靠地运作,并且有更好的 code review 和 debugging 能力来抓住自己的错误。"它在 long-context 检索上也有大幅提升。而这些恰恰都是当初构造 harness 想要去补足的能力。

Removing the sprint construct

移除 sprint 这一构造

I started by removing the sprint construct entirely. The sprint structure had helped to decompose work into chunks for the model to work coherently. Given the improvements in Opus 4.6, there was good reason to believe that the model could natively handle the job without this sort of decomposition.

我从彻底移除 sprint 这一构造开始。sprint 结构原本帮助把工作拆成小块,好让模型连贯地推进。考虑到 Opus 4.6 的提升,有充分理由相信模型不靠这种拆解也能原生地胜任这项工作。

I kept both the planner and evaluator, as each continued to add obvious value. Without the planner, the generator under-scoped: given the raw prompt, it would start building without first speccing its work, and end up creating a less feature-rich application than the planner did.

我把 planner 和 evaluator 都保留了下来,因为两者都还在带来显而易见的价值。没有 planner 的话,generator 会把 scope 估得过小:给它原始 prompt,它会不先把工作写成 spec 就开始构建,最后做出一个比有 planner 时功能更少的应用。

With the sprint construct removed, I moved the evaluator to a single pass at the end of the run rather than grading per sprint. Since the model was much more capable, it changed how load-bearing the evaluator was for certain runs, with its usefulness depending on where the task sat relative to what the model could do reliably on its own. On 4.5, that boundary was close: our builds were at the edge of what the generator could do well solo, and the evaluator caught meaningful issues across the build. On 4.6, the model's raw capability increased, so the boundary moved outward. Tasks that used to need the evaluator's check to be implemented coherently were now often within what the generator handled well on its own, and for tasks within that boundary, the evaluator became unnecessary overhead. But for the parts of the build that were still at the edge of the generator's capabilities, the evaluator continued to give real lift.

移除 sprint 构造后,我把 evaluator 改成在整个 run 结束时只过一遍,而不是逐个 sprint 打分。由于模型能力强了很多,这改变了 evaluator 在某些 run 中的承重程度——它的用处取决于任务相对于"模型自己能可靠完成的范围"落在什么位置。在 4.5 上,那条边界很近:我们的构建处在 generator 单干也能做好的边缘,而 evaluator 在整个构建过程中抓到了有意义的问题。在 4.6 上,模型的原始能力提高了,于是这条边界向外移动。那些过去需要 evaluator 检查才能被连贯实现的任务,如今往往落在 generator 自己就能做好的范围之内;对于这条边界之内的任务,evaluator 就成了不必要的开销。但对于构建中仍处在 generator 能力边缘的那些部分,evaluator 继续带来实打实的提升。

The practical implication is that the evaluator is not a fixed yes-or-no decision. It is worth the cost when the task sits beyond what the current model does reliably solo.

其实际含义是:evaluator 并不是一个固定的"要或不要"的决定。当任务超出当前模型单干能可靠完成的范围时,它才值这个成本。

Alongside the structural simplification, I also added prompting to improve how the harness built AI features into each app, specifically getting the generator to build a proper agent that could drive the app's own functionality through tools. That took real iteration, since the relevant knowledge is recent enough that Claude's training data covers it thinly. But with enough tuning, the generator was building agents correctly.

在做结构性简化的同时,我还加了一些 prompting,来改进 harness 把 AI 功能构建进每个应用的方式——具体来说,是让 generator 构建一个像样的 agent,能够通过工具来驱动应用自身的功能。这花了实打实的迭代,因为相关知识足够新,Claude 的训练数据对它覆盖得很薄。但经过足够的调优,generator 就能正确地构建 agent 了。

Results from the updated harness

更新后 harness 的结果

To put the updated harness to the test, I used the following prompt to generate a Digital Audio Workstation (DAW), a music production program for composing, recording, and mixing songs:

Build a fully featured DAW in the browser using the Web Audio API.

为了检验更新后的 harness,我用下面这个 prompt 来生成一个 Digital Audio Workstation(DAW,数字音频工作站)——一个用于作曲、录音和混音的音乐制作程序:

用 Web Audio API 在浏览器里构建一个功能完整的 DAW。

The run was still lengthy and expensive, at about 4 hours and $124 in token costs.

这次 run 仍然又长又贵,大约 4 小时、约 $124 的 token 成本。

Most of the time went to the builder, which ran coherently for over two hours without the sprint decomposition that Opus 4.5 had needed.

大部分时间花在了 builder 上——它在没有 Opus 4.5 当初所需的 sprint 拆解的情况下,连贯运行了两个多小时。

Agent & PhaseDurationCost
Planner4.7 min$0.46
Build (Round 1)2 hr 7 min$71.08
QA (Round 1)8.8 min$3.24
Build (Round 2)1 hr 2 min$36.89
QA (Round 2)6.8 min$3.09
Build (Round 3)10.9 min$5.88
QA (Round 3)9.6 min$4.06
Total V2 Harness3 hr 50 min$124.70
Agent 与阶段时长成本
Planner4.7 分钟$0.46
Build(第 1 轮)2 小时 7 分$71.08
QA(第 1 轮)8.8 分钟$3.24
Build(第 2 轮)1 小时 2 分$36.89
QA(第 2 轮)6.8 分钟$3.09
Build(第 3 轮)10.9 分钟$5.88
QA(第 3 轮)9.6 分钟$4.06
V2 Harness 合计3 小时 50 分$124.70

As with the previous harness, the planner expanded the one-line prompt into a full spec. From the logs, I could see the generator model did a good job planning the app and the agent design, wiring the agent up, and testing it before handing off to QA.

和上一版 harness 一样,planner 把这一句话的 prompt 扩展成了一份完整的 spec。从日志里可以看到,generator 模型在规划应用和 agent 设计、把 agent 接好线、并在交接给 QA 之前测试它这几件事上,都做得不错。

That being said, the QA agent still caught real gaps. In its first-round feedback, it noted:

This is a strong app with excellent design fidelity, solid AI agent, and good backend. The main failure point is Feature Completeness — while the app looks impressive and the AI integration works well, several core DAW features are display-only without interactive depth: clips can't be dragged/moved on the timeline, there are no instrument UI panels (synth knobs, drum pads), and no visual effect editors (EQ curves, compressor meters). These aren't edge cases — they're the core interactions that make a DAW usable, and the spec explicitly calls for them.

话虽如此,QA agent 仍然抓到了实打实的缺口。在它第一轮的反馈中,它指出:

这是一个很强的应用,设计还原度极佳、AI agent 扎实、后端也不错。主要的失败点在 Feature Completeness(功能完整度)——虽然应用看起来很唬人、AI 集成也运作良好,但好几个核心 DAW 功能只是"展示性"的,没有交互深度:clip 无法在 timeline 上拖动/移动,没有乐器 UI 面板(合成器旋钮、鼓垫),也没有可视化的效果器编辑器(EQ 曲线、压缩器表头)。这些并不是 edge case——它们正是让一个 DAW 可用的核心交互,而 spec 里明确要求了它们。

In its second round feedback, it again caught several functionality gaps:

Remaining gaps:
- Audio recording is still stub-only (button toggles but no mic capture)
- Clip resize by edge drag and clip split not implemented
- Effect visualizations are numeric sliders, not graphical (no EQ curve)

在它第二轮的反馈中,它又抓到了几个功能缺口:

剩余缺口:
- 音频录制仍然只是 stub(按钮会切换状态,但没有麦克风采集)
- 按边缘拖拽调整 clip 大小、以及 clip 切分,都尚未实现
- 效果器可视化是数字滑块,而非图形化(没有 EQ 曲线)

The generator was still liable to miss details or stub features when left to its own devices, and the QA still added value in catching those last mile issues for the generator to fix.

放任 generator 自己干时,它仍然容易漏掉细节或把功能做成 stub,而 QA 在抓出这些"最后一公里"问题、交给 generator 去修这件事上,仍然带来了价值。

Based on the prompt, I was expecting a program where I could create melodies, harmonies, and drum patterns, arrange them into a song, and get help from an integrated agent along the way. The video below shows the result.

[ 原文视频占位 ]更新后 harness 构建的 DAW 运行演示(原文为视频素材,此处未转载原始文件)

基于这个 prompt,我期待的是这样一个程序:我可以创建旋律、和声和鼓点,把它们编排成一首歌,并在过程中获得一个内置 agent 的帮助。下面的视频展示了结果。

[ video placeholder ]原文该处为演示视频;如需观看请见 Anthropic 原文 ↗

The app is far from a professional music production program, and the agent's song composition skills could clearly use a lot of work. Additionally, Claude can't actually hear, which made the QA feedback loop less effective with respect to musical taste.

这个应用远谈不上是专业的音乐制作程序,agent 的作曲能力显然还有很大改进空间。此外,Claude 实际上听不见声音,这让 QA 反馈循环在"音乐品味"这件事上的效果打了折扣。

But the final app had all the core pieces of a functional music production program: a working arrangement view, mixer, and transport running in the browser. Beyond that, I was able to put together a short song snippet entirely through prompting: the agent set the tempo and key, laid down a melody, built a drum track, adjusted mixer levels, and added reverb. The core primitives for song composition were present, and the agent could drive them autonomously, using tools to create a simple production from end to end. You might say it's not pitch-perfect yet—but it's getting there.

但最终的应用具备了一个可用音乐制作程序的全部核心部件:一个能工作的编排视图(arrangement view)、混音器(mixer)和走带控制(transport),都跑在浏览器里。除此之外,我完全通过 prompting 就拼出了一小段歌曲片段:agent 设定了速度和调性,铺了一段旋律,搭了一条鼓轨,调整了混音器电平,还加了混响。作曲所需的核心原语都在,而且 agent 能自主驱动它们,用工具从头到尾完成一段简单的制作。你或许会说它还没到"绝对准音"的程度——但它正在接近。(原文 "pitch-perfect" 一语双关:既指音准完美,也指"无可挑剔"。)

What comes next

接下来会怎样

As models continue to improve, we can roughly expect them to be capable of working for longer, and on more complex tasks. In some cases, that will mean the scaffold surrounding the model matters less over time, and developers can wait for the next model and see certain problems solve themselves. On the other hand, the better the models get, the more space there is to develop harnesses that can achieve complex tasks beyond what the model can do at baseline.

随着模型持续进步,我们大致可以预期它们能工作得更久、能处理更复杂的任务。在某些情况下,这意味着围绕模型的脚手架会随时间变得不那么重要,开发者可以等下一个模型,看着某些问题自行解决。另一方面,模型越好,就越有空间去开发那种能完成"超出模型 baseline 能力"的复杂任务的 harness。

With this in mind, there are a few lessons from this work worth carrying forward. It is always good practice to experiment with the model you're building against, read its traces on realistic problems, and tune its performance to achieve your desired outcomes. When working on more complex tasks, there is sometimes headroom from decomposing the task and applying specialized agents to each aspect of the problem. And when a new model lands, it is generally good practice to re-examine a harness, stripping away pieces that are no longer load-bearing to performance and adding new pieces to achieve greater capability that may not have been possible before.

带着这个想法,这项工作中有几条经验值得继续沿用。一个始终值得做的实践是:拿你正在针对开发的那个模型做实验,读它在真实问题上的 trace,并调优它的表现以达到你想要的结果。在处理更复杂的任务时,把任务拆解、对问题的每个方面派上专门的 agent,有时能挖到上升空间。而当一个新模型落地时,重新审视 harness 通常是个好做法:剥掉那些对性能不再承重的部分,再加入新的部分,去实现此前可能做不到的更强能力。

From this work, my conviction is that the space of interesting harness combinations doesn't shrink as models improve. Instead, it moves, and the interesting work for AI engineers is to keep finding the next novel combination.

从这项工作出发,我的信念是:有趣的 harness 组合所构成的空间,并不会随着模型变强而缩小。相反,它在移动——而对 AI 工程师而言,有趣的工作就是不断去找到下一个新颖的组合。

Acknowledgements

致谢

Special thanks to Mike Krieger, Michael Agaby, Justin Young, Jeremy Hadfield, David Hershey, Julius Tarng, Xiaoyi Zhang, Barry Zhang, Orowa Sidker, Michael Tingley, Ibrahim Madha, Martina Long, and Canyon Robbins for their contributions to this work.

Thanks also to Jake Eaton, Alyssa Leonard, and Stef Sequeira for their help shaping the post.

特别感谢 Mike Krieger、Michael Agaby、Justin Young、Jeremy Hadfield、David Hershey、Julius Tarng、Xiaoyi Zhang、Barry Zhang、Orowa Sidker、Michael Tingley、Ibrahim Madha、Martina Long 和 Canyon Robbins 对这项工作的贡献。

也感谢 Jake Eaton、Alyssa Leonard 和 Stef Sequeira 在塑造这篇文章上的帮助。

Appendix

附录

Example plan generated by planner agent.

由 planner agent 生成的示例计划。

RetroForge - 2D Retro Game Maker Overview RetroForge is a web-based creative studio for designing and building 2D retro-style video games. It combines the nostalgic charm of classic 8-bit and 16-bit game aesthetics with modern, intuitive editing tools—enabling anyone from hobbyist creators to indie developers to bring their game ideas to life without writing traditional code. The platform provides four integrated creative modules: a tile-based Level Editor for designing game worlds, a pixel-art Sprite Editor for crafting visual assets, a visual Entity Behavior system for defining game logic, and an instant Playable Test Mode for real-time gameplay testing. By weaving AI assistance throughout (powered by Claude), RetroForge accelerates the creative process—helping users generate sprites, design levels, and configure behaviors through natural language interaction. RetroForge targets creators who love retro gaming aesthetics but want modern conveniences. Whether recreating the platformers, RPGs, or action games of their childhood, or inventing entirely new experiences within retro constraints, users can prototype rapidly, iterate visually, and share their creations with others. Features 1. Project Dashboard & Management The Project Dashboard is the home base for all creative work in RetroForge. Users need a clear, organized way to manage their game projects—creating new ones, returning to works-in-progress, and understanding what each project contains at a glance. User Stories: As a user, I want to: - Create a new game project with a name and description, so that I can begin designing my game - See all my existing projects displayed as visual cards showing the project name, last modified date, and a thumbnail preview, so that I can quickly find and continue my work - Open any project to enter the full game editor workspace, so that I can work on my game - Delete projects I no longer need, with a confirmation dialog to prevent accidents, so that I can keep my workspace organized - Duplicate an existing project as a starting point for a new game, so that I can reuse my previous work Project Data Model: Each project contains: Project metadata (name, description, created/modified timestamps) Canvas settings (resolution: e.g., 256x224, 320x240, or 160x144) Tile size configuration (8x8, 16x16, or 32x32 pixels) Color palette selection All associated sprites, tilesets, levels, and entity definitions ...
RetroForge —— 2D 复古游戏制作器 概述(Overview) RetroForge 是一个基于 Web 的创作工作室,用于设计和构建 2D 复古风格的电子游戏。它把经典 8-bit 和 16-bit 游戏美学的怀旧魅力,与现代、直观的编辑工具结合起来——让从业余爱好者到独立开发者的任何人,都能在不写传统代码的情况下把游戏创意变为现实。 平台提供四个集成的创作模块:用于设计游戏世界的、基于 tile 的关卡编辑器(Level Editor);用于打磨视觉素材的像素画精灵编辑器(Sprite Editor);用于定义游戏逻辑的可视化实体行为系统(Entity Behavior);以及用于实时试玩测试的即时可游玩测试模式(Playable Test Mode)。通过在全流程中编织进 AI 辅助(由 Claude 驱动),RetroForge 加速了创作过程——帮助用户通过自然语言交互来生成 sprite、设计关卡、配置行为。 RetroForge 面向那些热爱复古游戏美学、但又想要现代便利的创作者。无论是重现童年的平台跳跃游戏、RPG 还是动作游戏,或是在复古约束内发明全新的体验,用户都能快速做原型、做可视化迭代,并把自己的作品分享给他人。 功能(Features) 1. 项目仪表盘与管理(Project Dashboard & Management) 项目仪表盘是 RetroForge 中所有创作工作的大本营。用户需要一种清晰、有条理的方式来管理他们的游戏项目——创建新项目、回到进行中的作品,并一眼看懂每个项目包含什么。 User Stories(用户故事):作为一个用户,我想要: - 用一个名称和描述创建一个新的游戏项目,这样我就能开始设计我的游戏 - 看到我所有已有的项目以可视化卡片的形式展示,显示项目名称、最近修改日期和一张缩略图预览,这样我就能快速找到并继续我的工作 - 打开任意项目进入完整的游戏编辑器工作区,这样我就能开发我的游戏 - 删除我不再需要的项目,并带一个确认对话框以防误操作,这样我就能让工作区保持整洁 - 把一个已有项目复制一份作为新游戏的起点,这样我就能复用我之前的工作 Project Data Model(项目数据模型):每个项目包含: 项目元数据(名称、描述、创建/修改时间戳) 画布设置(分辨率:例如 256x224、320x240 或 160x144) Tile 尺寸配置(8x8、16x16 或 32x32 像素) 调色板选择 所有关联的 sprite、tileset、关卡和 entity 定义 ……