欢迎来到Gas Town

新年快乐,欢迎来到燃料费之城!

Press enter or click to view image in full size

图 1:欢迎来到燃料费之城

什么鬼是燃料费之城?

Gas Town 是对 2026 年 IDE 的一种新构想。Gas Town 帮你处理运行大量 Claude Code 实例时的繁琐事务。东西会丢失,很难追踪谁在做什么,等等。Gas Town 处理所有这些琐事,让你专注于你的 Claude Codes 正在做的事情。

在这篇博文中,“Claude Code”指的是“Claude Code 以及所有看起来一模一样的竞品”,即 Codex、Gemini CLI、Amp、Amazon Q-developer ClI,等等,因为它们就是如此。克隆品。整个行业像一支令人尴尬的小孩足球队,追逐着 Claude Code 在 2025 年的 CLI 形态,而不是去构建下一个东西。

我干脆自己去构建了下一个东西。早在三月,我就在 Revenge of the Junior Developer 中预测了这一点。我预测会有人把 Claude Code 的骆驼连成战车,而这正是我用 Gas Town 所做的。我把它们驯服到你可以同时、持续且高效地使用 20–30 个实例的程度。

Gas Town 有自己的偏见——就像 Kubernetes 或 Temporal,Gas Town 与它们相似,至少如果你眯着眼看,直到几乎完全闭上眼睛的话。我会在本文末尾把它与 k8s 和 Temporal 做比较。尽管底层完全不同,三者竟然有如此相似之处,这有点令人惊讶。

但这种比较应当起到警示作用:Gas Town 很复杂。不是因为我想让它复杂,而是因为我不得不停下来不断添加组件,直到它成为一个能自我维持的机器。现在它所拥有的那些部分,看起来很像 Kubernetes 与 Temporal 结合后生下的一个非常难看的孩子。

但它有效!Gas Town 能轻松解决 MAKER 问题 (20 盘汉诺塔),用一个可以从公式生成的百万步 wisp。我昨晚为了好玩运行了 10 盘的,仅用几分钟就证明一千步没问题(MAKER 论文称 LLMs 在几百步后就会失败)。20 盘的 wisp 大约需要 30 小时。感谢大家来听我的 TED 演讲。

如果你能读完接下来的 23 页,所有这些就会完全讲得通。

毒气镇并非秘密

在《复仇:大三开发者》之后,我整年到处奔走,大声告诉每个人究竟需要构建什么,我的意思是每个人 。我一点也不羞怯。我会宣称,“编排器将会是下一个!”大家会慢慢点头,若有所思地皱眉说,“嗯。”

我去找像 Temporal 和 Anthropic 这样的资深人士,告诉他们应该构建一个代理编排器,认为 Claude Code 只是一个构建模块,一切将围绕 AI 工作流和“代理的 Kubernetes”。我在多个活动的舞台上描述了我对编排器的设想。我去过各处,找过所有人。

“它会像 Kubernetes,但用于代理,”我说。

“它必须有多个层级的代理来监督其他代理,”我说。

“它会有一个合并队列,”我说。

“它会协调工作流,”我说。

“它会有插件和质量关卡,”我说。

几个月来我说了很多,但见鬼,我们甚至都没能让人们去用 Claude Code,更别提一次同时使用十几个二十个了。

所以到八月我开始自己构建一个编排器,因为似乎没人关心。最终它失败了,我把它扔掉并从头开始做 v2,v2 也失败了,但我们从中得到了 Beads。然后是 v3(Python 燃料费小镇),它持续了六到八周。

Gas Town(用 Go 写的)是我 2025 年完成的第四个完整且可运行的编排器。我到达 Gas Town 的过程很有趣,但我们留到以后再讲。不幸的是,仅仅告诉你它如何运作的最基本内容,这篇文章就已经很长(25+ 页!)。背景故事我们以后再说。

但在深入讲 Gas Town 的运行之前,我得先把你们赶走一下。

警告 危险 谨慎

快他妈的滚出去

你会死

让我们来谈谈为什么你不应该使用 Gas Town 的一些原因。我还能想出更多,但这些就足够了。

首先,代码库不到三周的历史。从“精雕细琢的钻石”到“未经打磨的毛坯”再到“我刚把它从河上往上偷运了 400 英里塞在屁股里”这样一个尺度上,我会把 Gas Town 描述为“你可能现在还不想用它”。它需要好好消毒清理。它完全是靠感觉写的。我从没见过那些代码,也从不打算看,这可能会让你犹豫。当然,我也从没看过 Beads,而那是一个有 22.5 万行 Go 代码的项目,每天有成千上万人在用。我只是十月创建了它。如果这让你不舒服, 现在就离开 

其次,你真的,严肃地说,还没准备好。让我们来谈谈 2024–2026 年程序员的进化,见图 2,由 Nano Banana 绘制:

Press enter or click to view image in full size

图 2:走向 AI 的开发者进化的 8 个阶段

首先,你应该在图表上找到自己。你在 AI 辅助编码之旅中处于哪个阶段?

阶段 1: 零或近零人工智能: 也许是代码补全,有时向 Chat 提问

阶段 2:IDE 中的编码代理 ,权限已开启。侧边栏中的窄域编码代理会请求你许可以运行工具。

阶段 3:IDE 中的代理,YOLO 模式: 信任上升。你关闭权限,代理变得更广泛。

阶段 4:IDE 中,宽域代理 :你的代理逐渐扩展以充满屏幕。代码仅用于差异比较。

第 5 阶段: 命令行界面,单代理。YOLO。差异滚动而过。你可能会看,也可能不会看。

第 6 阶段: 命令行界面,多代理,YOLO。你常常并行运行 3 到 5 个实例。你的速度非常快。

第 7 阶段: 10+ 个代理 , 手动管理 。你开始触及手动管理的极限。

第 8 阶段: 构建你自己的协调器 。你站在前沿,自动化你的工作流程。

如果你还不是一位有经验的驯猩专家,他们会把你的脸撕下来。 如果你还没有至少到达第 7 阶段 ,或者可能是第 6 阶段且非常勇敢,那么你将无法使用 Gas Town。你还没准备好。Gas Town 是一家由超智能机器人猩猩操作的工业化编码工厂,当它们心血来潮时,可以在瞬间毁掉你的东西。它们会毁掉其他猩猩、工作站、客户。 毫无疑问所以不行。如果你有丝毫怀疑 ,那你就不能使用它。

工作变得流动起来,成了一种无法细数的物质,随意挥洒,就像在码头把油亮的鱼往木桶里堆。大部分工作都能完成;一部分会丢失。鱼从桶里掉出来,有的逃回大海,或者被踩扁。还会有更多鱼来。重点是 throughput:以思维的速度创造和修正。在 Gas Town 高效工作意味着要投入“氛围编码”。throughput:以思维的速度创造和修正。

Press enter or click to view image in full size

图3:氛围编码混乱

在 Gas Town,工作可能混乱而马虎,这也是它名字的由来。有些漏洞被修了两三次,需要有人来决定哪个是最终版本。其他修复则会丢失。设计稿会不见,需要重做。但这无所谓,因为你在巨大、巨大的工作堆上不停运转,Gas Town 既在产生这些工作也在消耗它们。你可能并非百分之百高效,但你在高速前进。

在 Gas Town,你让 Claude Code 去做它该做的事。你是一个产品经理,Gas Town 是一个创意编译器。你只需想出功能、设计它们、提交实现计划,然后把工作分派给你的帮手和团队。Opus 4.5 可以处理任何合理规模的任务,所以你的工作就是为它创建任务。仅此而已。

除此之外,你还得帮忙维持毒气雷镇的运转。大多数时候它能很好地自我运行,但问题经常发生。要让它顺畅运转,往往需要你和这些工人付出大量人力物力。这非常像一个需要亲自掌舵的协调系统。

如果你不能接受这种工作方式,那你究竟还在这里干什么?回到你的 IDE 里,把自己藏好。毒气雷镇对你来说不安全。

Gas Town 也贵得要命。如果你哪怕片刻去想钱从哪儿来,你就不会喜欢 Gas Town。我最终不得不再开一个 Claude Code 账号;他们不会让你从单个账号无限抽钱,所以你需要多个邮箱和抽取手段,整件事显得非常荒谬。我的估算显示,既然 Gas Town 已经真正起飞,我到下周末之前就得再弄第三个 Claude Code 账号。它是个吞钱机器。

Gas Town 使用 tmux 作为其主要界面。我不得不学习 tmux。比我想象的要简单得多,也实用得多。用了三周,我爱上了 tmux。你也需要学一点 tmux。或者,你可以等到有人为 Gas Town 写出更好的界面。 更好的界面会出现。但目前你能用的就是 tmux。而且值得去学。

Press enter or click to view image in full size

图 4:Mayor tmux 状态行

不管你愿不愿意,毒气镇是建立在 Beads 之上的。事实上它是 Beads 的续作:我的《帝国反击》对应 Beads 的《星球大战》。毒气镇没有“替代后端”。Beads 是毒气镇一切事务的通用基于 Git 的数据平面(而且事实证明也是控制平面)。你必须使用 Beads 才能使用毒气镇。

你可能不喜欢 Beads。如果你觉得 Beads 过于武断,那你将要经历一场风暴。Gas Town 就是我走进公众舆论的教堂,抬腿放了一个响屁,让全世界都能闻到。

你们很多人可能会对我的品牌感到反感。但我猜会有少数人喜欢成为超级英雄 ,以至于愿意忽略 Gas Town 的怪癖,接受我的观点。这才是工作的正确方式。它已经是最好的方式了,而且只会变得更好。

Gas Town 今年设计在三个维度上扩展:(1)模型认知,(2)代理变得对 Gas Town 更友好,以及 (3)将 Gas Town 和 Beads 纳入前沿模型的训练语料库。 即便没有这些,代理们毫无训练就能如此轻松地使用 Beads 和 Gas Town 已经令人震惊。

但现在?它就像十九世纪末的工厂,机器若不小心会把你肚子都掏出来。

好!这大概就是半打不该用 Gas Town 的绝佳理由。如果我还没把你劝走,那我猜你就是那群疯子之一。等一下。这会是一段漫长而复杂的旅程。我尽力自上而下讲解并尽量简化,但这有点像一本教科书。

抱歉。不过替我辩解一句,Gas Town 真是好玩到爆。是我做过的最棒的东西。

我们开始深入了解吧。

Gas Town 101

Press enter or click to view image in full size

图5:毒气雷城的工人角色

毒气雷城的工人是常规的编码代理,每个被提示扮演七个明确定义的工人角色之一。我还会简要介绍一些其他关键概念,和这些角色一起,比如城镇(Towns)和采油平台(Rigs)。

关于毒气雷城,事先要知道的一点是:它会优雅退化。每个工人都能独立完成任务,或以小组形式协作,你随时可以选择要运行毒气雷城的哪些部分。它甚至可以在“无 tmux”模式下运行,借助纯粹的 Claude Code 会话在没有实时消息的情况下勉强维持。速度会慢一些,但仍然可用。

这七个毒气雷城角色协同工作,帮助维持毒气雷城的运行。有时它也需要你的帮助;毒气雷城的运行靠的是等量的燃料费和辛勤劳动。

这里是关键角色和概念:

🏙️The Town: 这是你的总部。我的位于 ~/gt,所有我的项目工作环境都放在它下面:gastown、beads、wyvern、efrit 等。小镇(Go 二进制文件 gt)负责管理和协调你所有工作环境中的所有 worker。你把它保存在一个单独的仓库里,主要用于配置。

🏗️Rigs:每个你交由 Gas Town 管理的项目(git 仓库)都称为一个 Rig。某些角色(Witness、Polecats、Refinery、Crew)是按 Rig 划分的,而其他角色(Mayor、Deacon、Dogs)属于小镇级别。gt rig add 及相关命令用于在 Gas Town 系统中管理你的 Rig。Rigs 很容易添加和移除。

👤The Overseer:那就是你,人类。第八个角色。我在图片里给你画了些眼妆。作为 Overseer,你在系统中有一个身份,有自己的收件箱,可以发送和接收小镇邮件。你是老板,头头,大人物。

🎩市长 :这是你大部分时间交谈的主要代理。它是你的礼宾和参谋长。但如果市长很忙,其他所有工作人员也是 Claude Code,因此他们都非常聪明且乐于助人。市长通常会发起你大部分的工作车队,并在它们完成时收到通知。

😺臭鼬 :Gas Town 是一个工作群集引擎。臭鼬是按需启动的短暂按设备工人。臭鼬通常成群结队地工作,生成合并请求(MR),然后将它们交给合并队列(MQ)。合并后它们会被完全退役,尽管它们的名字会被循环使用。

🏭Refinery:一旦你开始让大量工作者同时作业,就会遇到合并队列(MQ)问题。你的工作者会在变基/合并上互相争执,情况可能变得很糟。基线在群体作业期间可能发生巨大变化,导致最终要合并的工作者试图与一个已无法识别的新 HEAD 合并。他们可能需要彻底重新构想他们的改动并重新实现。这就是 Refinary 的工作:负责将所有更改智能地一次合并到 main 的工程师代理。没有工作会丢失,尽管允许将问题升级处理。

见证者: 一旦你启动了足够多的 polecats,你会意识到需要一个代理来专门看管它们并帮助它们脱困。 Gas Town 的推进系统(GUPP)有效,但目前仍有点不稳定,有时你需要去催促那些 polecats 提交它们的 MR,然后再去催促精炼厂来处理它们。见证者巡逻有助于平滑这一流程,使多数运行几乎完美无缺。🦉 一旦你启动了足够多的 polecats,你会意识到需要一个代理来专门看管它们并帮助它们脱困。Gas Town 的推进系统(GUPP)有效,但目前仍有点不稳定,有时你需要去催促那些 polecats 提交它们的 MR,然后再去催促精炼厂来处理它们。见证者巡逻有助于平滑这一流程,使多数运行几乎完美无缺。

🐺执事 :执事是守护进程信标。它以《水世界》里丹尼斯·霍珀所饰角色命名,该角色的灵感来自《疯狂的麦克斯》宇宙中的 Lord Humungus,因此属于交叉(crossover)。执事是一个巡逻代理:它循环运行一个“巡逻”(一个定义良好的工作流程)。Gas Town 有个守护进程每隔几分钟就向执事发送一次请求,意思是“去做你的工作”。执事会智能地将这个“去做你的工作”(DYFJ)信号向下传播给其他小镇工人,确保 Gas Town 保持运转。

🐶Dogs:受 Mick Herron 的 MI5《Dogs》启发,这是 Deacon 的私人小队。与 polecats 不同,Dogs 是城镇级的工作人员。他们做维护类的事(清理过期分支等)以及为 Deacon 做偶发的杂活,比如运行插件。Deacon 的巡逻任务被责任压垮,需要帮手,于是我增加了 Dogs。这让 Deacon 能专注完成其巡逻,而不是在某个步骤上被拖住。Deacon 把活分给 Dogs,由他们处理肮脏的细节。

🐕Boot the Dog:有一只特别的狗叫 Boot,每隔 5 分钟由守护进程唤醒一次,只是为了检查 Deacon。那是它唯一的工作。Boot 的存在是因为守护进程不断用恼人的心跳和鼓励话语打断 Deacon,所以现在由这只狗来听它。Boot 决定 Deacon 是否需要一次心跳、一次提醒、一次重启,或干脆让它独自待着,然后再回去睡觉。

👷The Crew:尽管在列表中排在最后,Crew(团队)是除 Mayor 之外你将亲自最多使用的代理。Crew 是按每个 Rig 配置的编码代理,为 Overseer(你)工作,不受 Witness 管理。你可以为他们选名字,他们有长期存在的身份,你可以随意启动多个。tmux 绑定让你可以用 C-b n/p 在每个 rig 中循环切换团队成员。Crew 是对你过去使用的工作流的直接替代。它们只是一些具名的 Claude 代码实例,可以接收邮件并分派工作。Crew 非常适合像设计工作这样需要大量来回协作的任务。它们很棒。你会喜欢你的 Crew。

📬邮件与消息

Beads 是 Gas Town 中的原子级工作单元。Bead 是一种特殊的议题跟踪器条目,具有 ID、描述、状态、受托人等字段。Beads 以 JSON 存储(一行一个议题),并与项目仓库一起在 Git 中跟踪。城镇邮件和消息(事件)使用 Beads,其他类型的编排也同样使用 Beads。

Gas Town 采用两级 Beads 结构:Rig beads 和 Town beads。

Press enter or click to view image in full size

图 6:两级 Beads 流程

在 Gas Town 有两个层级的工作:Rig 级别,和城镇级别。

  • 油井级工作就是项目工作 :改进你的项目。功能、修复漏洞等。这类工作在竖线和工作人员之间分配,其他工人偶尔会参与。
  • 城镇级工作是编排 ,包括巡逻(需遵循的一长串步骤,以链接的珠子编码)以及一次性工作流程如发布或生成跨油井的代码审查波。

这两类工作都使用珠子,并且二者之间有一定重叠。大多数情况下,这相当灵活,你把问题归档或创建工作在哪里并不重要。所有工人都熟悉 Gas Town,如果你让他们处理来自错误油井的工作,他们也会很随和。

所有油井级工人(炼油厂、见证、竖线和工作人员)在需要时都能跨油井工作。他们可以使用 gt worktree 命令来获取任何油井的克隆并进行修复。但通常他们在单个项目内工作。

Beads 有跨机架路由。Gas Town 将 Beads 配置为根据问题前缀(如 “bd-” 或 “wy-”)把像 bd create 和 bd show 这样的请求路由到正确的数据库。所有 Beads 命令在 Gas Town 的几乎任何地方都能使用并能找出放置它们的正确位置,如果放错了,也很容易移动 Beads。

关于《疯狂的麦克斯》主题化的说明

Gas Town 只是 Gas Town。它起初带有《疯狂的麦克斯》主题,但都不是特别浓烈。没有哪个角色是来自该系列的专有名词,而且我也在引入其他来源的主题,包括 Slow Horses 宇宙、Waterworld、Cat’s Cradle、Breaking Bad(正如你很快会看到的)以及显然还有 Nano Banana 的插图里提到的 The Wind in the Willows。

如果有人曾经因此寄给我停止并停止(C&D)信件,Gas Town 就会像八爪章鱼一样机智变形成 Gastown,以美丽的加拿大温哥华的 Gastown 区命名,而我们的 polecats(臭鼬类)就只不过换成另一种杆子而已。

长话短说,“Gastown”也可以作为对该项目的正确称呼。话到此处……

Gastown 通用推进原理

GUPP 是让 Gas Town 保持运转的动力。Claude Code 最大的问题是它会终止。上下文窗口被填满,燃料耗尽,便会停下。GUPP 正是我为此问题提出的解决方案。

GUPP 简明表述为:如果你的钩子上有工作,你必须运行它。

在所有岗位上的所有 Gas Town 工作者,其身份都会在 Beads 中保持持久,也就是在 Git 中。工人的身份类型由一个 Role Bead 表示,类似描述该岗位的域表。每个工人还有一个 Agent Bead,代表该代理的持久身份。

Role Beads 和 Agent Beads(以及 Hooks)都是“固定 bead”的例子,意味着它们像黄色便签一样漂浮在 Beads 数据平面中,不会像普通 issue 那样被关闭(除非该身份消失)。它们不会出现在 bd ready(准备就绪的工作)中,并且在其他各种方面受到特殊对待。

在 Gas Town 中,代理不是会话。会话是短暂的;它们是 Kubernetes “宠物与牲畜”比喻中的“牲畜”。Claude Code 会话是 Gas Town 投入到持久工作中的牲畜。所有这些工作都存在于 Beads 中,连同工人的持久身份、邮件、事件系统,甚至短暂的编排,如我们将看到的那样。

在 Gas Town,agent(代理)是一个 Bead(珠子),一种拥有唯一全局地址的身份。它有若干槽位,包括指向其 Role Bead(角色珠子——包含该角色的初始化信息等)的指针、其邮件收件箱(所有 Beads 的)、其 Hook(挂钩,也同样是一个 Bead,用于 GUPP),以及一些管理类的东西比如编排状态(标签和备注)。该代理所做一切的历史都记录在 Git 中,也记录在 Beads 里。

那么 Hook 是什么?每个 Gas Town 的 worker(工作者)都有它自己的 hook 🪝。它是一个特殊的、固定的 bead,专门为该代理保留,用来悬挂 molecules(分子),也就是 Gas Town 的工作流。

Press enter or click to view image in full size

图 7:GUPP,Gastown 通用推进原理

东西怎么被挂在那里?当然是用 gt sling。你把工作掷(sling)给工作者,它就落到他们的 hook 上。你可以立刻启动它们,或延后,甚至先让它们重启。我们稍后会讨论这些。把工作掷给它们意味着你可以去处理其他事情,而它们会继续进行。

关于 Gas Town 最简单却又最棒的特点之一是,在任何会话中的任何时候,你都可以说“我们交接吧”,工作进程就会优雅地清理并重启自己。多亏了 GUPP,如果代理被挂钩,它会自动继续工作。

Claude Code 如此令人难受地礼貌,以至于 GUPP 在实践中并非总是可行。我们告诉代理,您必须运行您的 Hook,但它有时什么都不做。它只是那样坐着等待用户输入。不幸的是,这么礼貌的 GUPP 在实践中并非总是可行。我们告诉代理,您必须运行您的 Hook,但它有时什么都不做。它只是那样坐着等待用户输入。

所以我们有一个变通办法。

GUPP 推动机制

Gas Town 的工作人员被提示要遵循“物理优先于礼貌”,并被告知在启动时查看他们的 hook。如果他们的 hook 有工作,他们必须立即开始处理,不得等待。

不幸的是,在实践中,Claude Code 常常会等到你输入些什么——任何东西——才去检查邮件和 hook、汇报并开始工作。有时会,有时不会。随着时间推移会改善,但目前有时仍需要一点推动。

因为 Gas Town 的工作人员并不总是遵守 GUPP,所以有各种系统会在代理启动后大约 30 到 60 秒内提醒它。有时更快,有时更慢。但只要小镇在运行且未处于静默状态,它总会在大约 5 分钟内收到提醒。

代理会收到一次启动提醒,命令为 gt nudge,这是 Gas Town 的核心实时消息命令,向某个工作人员(或整个频道)发送 tmux 通知。它绕过了 tmux send-keys 的一些防抖问题,确保工作人员像用户亲自输入一样接收到通知。这会促使工作人员去读取他们的邮件和 hook,并采取行动。

有了 Gupp Nudge 这个“破解”手段,以及从 Deacon 向下的层级心跳,GUPP 通常能持续运转,只要有工作可做就能维持 Gas Town 的运行。车队会自动启动、完成并着陆,无需干预。工作人员可以在会话之间继续处理分子。只要你喂给它足够的工作,Gas Town 可以整晚运作。

与你已故的前任交谈

GUPP Nudge 引出了一项有趣的功能,gt seance,它允许 Gas Town 的工作人员直接与他们在职务上的前任沟通。也就是说,现任市长可以与上任市长对话,依此类推。他们借助 Claude Code 的 /resume 功能实现这一点,该功能允许你重启那些你曾终止的旧会话。

这是有用的,因为常常会出现这样的情况:一个工作人员会说,“好,我把这大堆工作和建议都交接给我的接任者了!再见!/handoff”,然后消失,接着新工作人员上线后会说,“什么?我什么都看不到。”你过去不得不笨拙地去找出以前的那个会话,从你最近大约 40 个以“let’s go”开头的会话里挑出来,因为你一直手动进行 GUPP 提示。这实在很尴尬,几乎不值得这么做。

gt seance 的产生方式是:你在提示里告诉代理什么并不重要。由于他们对 GUPP 以及 Gas Town 的运行原理、及其作为机器齿轮的重要性等的提示非常严格,代理会完全忽略你所输入的任何内容,除非你是在直接覆盖他们的 hook 指令。

Press enter or click to view image in full size

图 8:使用 `gt seance` 与已故前辈对话

所以你只需要说,“hi”,或“埃隆·马斯克说月亮是绿色奶酪做的”,或“做好你的工作”,代理就会运行 hook。

一周前我的想法是:既然我们无论如何都要推动所有会话,我决定在推动时把 Claude Code session_id(以及 Gas town 角色和 PID)一并包含进去。这样每个 /resume 会话就有了一个独特且有用/可发现的标题。

使用 gt seance 时,worker 会在子进程中真正启动 Claude Code,使用 /resume 来复活它的前身,然后问它:“你给我留的东西到底在哪儿?”

好时光,我告诉你。Gas Town 就是好时光。

我想现在应该谈谈 MEOW 堆栈了。我觉得你已经准备好了。

工作分子表达(MEOW)

燃料费小镇只是深层冰山的表面。燃料费小镇本身可能不会存在超过 12 个月,但燃料费小镇的骨架——MEOW 栈——可能会在未来几年继续存在。感觉更像是一项发现,而非发明。

Press enter or click to view image in full size

图 9:工作的分子表达(MEOW)

首先出现的是 Beads。十月份,我懊恼地告诉 Claude,把我所有的工作放进一个轻量级的问题跟踪器里。我想要类似 Git 的东西。Claude 想用 SQLite。我们两者妥协,Beads 就这样诞生了,经过大约 15 分钟的疯狂设计。这些是基本的工作单元。

不久之后出现了 Epics:具有子项的 Beads,这些子项反过来又可以是 epics 本身。这给你提供了大量自上而下构建计划的灵活性。epics 的子项默认是并行的,但你可以在它们之间加入明确的依赖关系以强制它们按序执行。epics 允许创建“颠倒”的计划,其中最后要做的是根节点,最先要做的是 epic 树的叶节点。有点难看,但 AI 完全能搞定。

接着是分子(Molecules)。我在 12 月 17 日有了这个想法,几天前刚从澳大利亚回来。我对前两个协调器的工作让想把代理的工作分解成必须逐项完成的序列化小任务,像待办事项清单那样。他们已经这么做了,但我想提前这么做,这样我就可以提前安排好数小时的工作,让他们按正确顺序原子性地执行。

换句话说,分子就是工作流程,通过珠子(Beads)链在一起。它们可以有任意形状,不像史诗(epics),并且可以在运行时拼接在一起。

然后我想出了原型分子(protomolecules),它们类似类或模板——由实际的珠子组成,所有指令和依赖都事先设置好,是一整张模板任务图(例如在一个简单的例子中有“设计”“计划”“实现”“审查”“测试”),你可以把它实例化为一个分子。实例化涉及复制所有原型分子的珠子并对其执行变量替换,从而创建一个真实的工作流程。

他们会总是跳过步骤。举例:我为 Beads 制定了一个包含 20 步的发布流程。代理常常难以完成这些步骤,因为流程中有长时间的等待状态,比如等待 GitHub Actions 完成、等待 CI 结束以及等待各种构件部署。我不得不催促代理完成,并且总是跳过步骤。

对于 molecules,想法是,把发布步骤做成 20 个 beads,将它们按正确顺序串联起来,让代理沿着链条一步步走完。一个额外好处是,当他们声称并关闭 issue 时,它会自动生成活动提要。

如果工作流被封装成一个 molecule,那么它能抵抗代理崩溃、压缩、重启和中断。只需在同一沙箱中重新启动代理,让它在 molecule 中找到自己的位置,然后从中断处继续即可。

原初分子(Protomolecules)很棒。Claude 坚持要用《The Expanse》的引用,这几乎注定会被各大影视公司起诉。但我们很快发现需要一个宏扩展阶段(macro-expansion),以便正确地用循环和门组合分子。因此我想出了一个用于工作流的源格式,TOML 格式的 Formulas,这些“配方”会被“烹制”成原初分子,然后在 Beads 数据库中实例化为 wisps 或 mols。

Formulas 提供了一种描述和组合几乎所有知识工作的方法。我正在为它们建立一个名为 Mol Mall 的市场。敬请期待。

Press enter or click to view image in full size

图 10:Formulas 与烹制

最后,我需要一个词来表示“分子化的工作”——以代理能逐步接收并完成的形式存在的工作。它是可以相互组合的工作,分子与分子结合,你可以预先为整个巨大项目设置依赖关系,如果你够勇敢,还可以让 Gas Town 在一个周末无人看管地蜂拥处理它。

表示大量工作分子、全世界所有工作的术语是“guzzoline”,尽管我们在文档中并不常用它。这只是 Gas Town 的一个习语,有点像 War Rig,指某个给定 Rig 对跨 rig 车队(Convoy)的贡献。你会偶尔听到它,但在日常命名中并不重要。

非确定性幂等

Gas Town 的运行原则我称之为非确定性幂等(Nondeterministic Idempotence,简称 NDI)。它类似于 Temporal 的确定性、持久重放,但 Gas Town 通过完全不同的机制来实现其持久性和执行保障。

Press enter or click to view image in full size

图11:非确定性幂等

在毒气镇(Gas Town),运行在 MEOW 堆栈上,所有工作都以“分子”的形式表达。我在过去两周里发现了一种代数式的东西。分子就是工作流。它们可以有复杂的形状、循环和门控,实际上是图灵完备的。工作流的每一步都由超智能 AI 执行。

因为 AI 非常擅长遵循待办事项清单和验收标准,所以它们在执行分子时很可靠。它们理解 GUPP 的概念,并明白无论多么琐碎的事项被标记完成,都会更新实时活动记录并将工作记录在永久账本上。这种推理足以让它们在执行过程中持续运转并保持在正轨上。它们不会“感到无聊”,且由于不需要管理自己的待办事项清单(除非在单个、小的步骤内),因此犯错的可能性也小得多。

这意味着分子工作流具有持久性。如果一个分子在某个代理的 hook 上,那么:

  1. 该代理是持久的:由 Git 支持的 Bead。会话来来去去;代理会留下。
  2. 钩子是持久的,也是一个由 Git 支持的 Bead。
  3. 分子是持久的——一串由 Git 支持的 Beads。

所以即便 Claude Code 崩溃了,或耗尽了上下文也无所谓。只要为该智能体角色启动另一个会话,它就会立即开始处理分子中的该步骤(通过 GUPP,或被其中一个巡逻队智能体轻推时)。如果发现上一步骤中途崩溃了,没大问题,它会找出正确的修复方法,执行并继续前进。

因此即便路径完全是非确定性的, 结果 ——你想运行的工作流程——终将“有保证”地完成,只要你不断投入智能体。该智能体在过程中甚至可能犯错,但可以自我纠正,因为分子的验收标准大概由设计分子的人明确规定。

有大量边缘情况。对 NDI 的这种描述过于简化。Gas Town 并不是用来替代 Temporal 的。问问你的医生 Gas Town 是否适合你。但对开发者工具来说,Gas Town 确实提供了足够好的工作流保证!如果你是我!

Wisps:短暂的编排珠子

我们的教科书还有一些其他角落可能需要触及。大多数时候,你并不关心这些东西,你关心的是车队的启动和完成,关注你的活动提要和仪表盘。但 Gas Town 的分子“化学”在编排中有很多丰富的角落,正在被积极使用。

一个来自 12 月 21 日的重要扩展发明是 Wisps,它们是短暂的 Beads。它们存在于数据库中,拥有哈希 ID,行为上像普通的 Beads。但它们不会被写入 JSONL 文件,因此不会持久化到 Git。在运行结束时,Wisps 会被“燃烧”(销毁)。可选地,它们可以被压缩成一行的摘要/摘要并提交到 git。

轻微气流(Wisps)对于高频率的编排工作流至关重要。它们是 Gas Town 工作的气相物质。所有巡逻代理——Refinery、Witness、Deacon、Polecats——在每次巡逻或工作流运行时都会生成 wisp 分子。它们确保工作流以事务性方式完成,同时不会用编排噪音污染 Git。

巡逻

巡逻是为巡逻工作者运行的短暂工作流,主要是 Refinery、Witness 和 Deacon。

Press enter or click to view image in full size

图 12:Gas Town 的巡逻

巡逻队是代理以循环方式运行的短暂(薄雾般)工作流。巡逻队有指数退避机制:如果在巡逻步骤中找不到工作,代理会逐渐进入休眠状态,等待更久后再启动下一次巡逻。任何会变更状态的 gt 或 bd 命令都会唤醒小镇,或者你也可以通过 gt 命令自行唤醒,启动单个工作者、组、一个装备架或整个小镇。

Refinery 的巡逻相当简单。它有一些预检步骤来清理工作区,然后处理合并队列,直到队列为空或需要回收会话。准备交接时,它在分子(molecule)中还有一些收尾步骤。我正准备为 Refinery 的巡逻添加插件,但它们尚未到位。添加后,你将能够加入干预 MQ 并尝试智能重排的插件,并将 Gas Town 的后端连接到其他系统。

Witness 的巡逻则复杂一些。它必须检查 polecats 的状况,以及各个炼油厂的运行情况。它还会窥视 Deacon,确认其没有卡住。并且 Witness 会运行 Rig 级别的插件。

执事的巡逻队承担许多重要职责。它运行城镇级插件,这些插件可以提供全新的用户界面或功能。执事还参与 gt handoff 和回收代理会话的协议,并确保一些工作进程被正确清理。执事的巡逻队变得足够复杂,以至于我增加了 Dogs 作为辅助,即执事的私人小队。现在它会将复杂的工作和调查移交给 Dogs,以便长期运行的巡逻步骤不会干扰城镇的核心事件系统,该系统是合作式并基于邮件的。

燃料城插件

燃料城将插件定义为“来自一个代理的协调或定时关注”。燃料城的工作者运行工作流(通常在巡逻循环中),任何工作流都可以包含任意数量的“运行插件”步骤。

燃料城的执事巡逻负责运行城镇级插件,现在这些插件与狗一起运行,因此它们可以几乎无限期运行。我们对计时器和回调有一些支持,但主要是生命周期钩子。我还没有对这个子系统进行大量的设计思考,所以如果你想开始使用插件系统,告诉我我们可以一起研究。

我计划把大量附加功能作为插件在 Gas Town 中实现。它们就是没赶上 v1 上线。它们很可能最终以配方的形式出现在 Mol Mall 中。

Press enter or click to view image in full size

图 13:Gas Town 的轻量级插件

🚚 车队 🚚

好了,呼。你做得很棒。我们涵盖了很多理论,而且这部分理论尤其困难,因为这是我在过去三周从我的屁股里凑出来的一堆胡扯,我还用獾什么的给它们命名。但它具有某种优雅的一致性和连贯性。基于 Git 数据平面上小黄便签的工作流编排,作为连接工作海洋中的图节点运行。

恶心!我知道没人会在意。你想把事情办成,快到超乎常人的速度,唯一受限的就是你吸代币的速度。我们来谈谈怎么做到。

在燃料费小镇(Gas Town)里,所有的工作都汇集成一个车队(Convoy)。

Press enter or click to view image in full size

图 14:Convoy 命令行界面显示

车队(Convoy)是燃料费小镇的票务或工作单系统。

车队(Convoy)是一种特殊的 bead,它将一堆工作打包为一个可追踪交付的单元。它不使用 Epic 结构,因为被追踪的问题并不是车队的子项——它们中的大多数已经有了其他父项。

在 Gas Town 中传递工作的基本原语是 gt sling。如果我告诉市长:“我们的 tmux 会话在状态栏显示的钻机数量不对——归档并 sling 它”,市长会为这个问题归档一个 bead,然后用 gt sling 把它发给一名 polecat,该 polecat 会立刻开始处理。

真实例子:我经常让我的 Beads 团队把 release molecule 发给某个 polecat。polecat 会按 20 步发布流程逐项执行,完成后我会收到车队已抵达/完成的通知。 编辑:实际上现在更复杂了。当 molecule 在 Gate 状态等待时(例如等待 GH Action 或 CI/CD),polecat 会消失。然后当 Gate bead 触发时,Gas Town 会唤醒一个 polecat 继续工作。

听到“议题 wy-a7je4 刚完成”会让人困惑。即便看到标题,也可能无法反映该议题所属于的更大工作块。因此现在我们用一个 Convoy 来收尾每一项被分派的工作单元,从单个 polecat sling 到某人发起的一大群任务,全部一并包裹起来。

这些 Convoy 会显示在一个日益完善的仪表盘上;有一个 Charmbracelet 的 TUI,为每个 convoy 提供可展开的树状视图,这样你可以看到其单独跟踪的议题。界面和用户体验会不断改进。对于 Gas Town 来说,现在是第一天。

Convoy 基本上就是特性。不论是技术债务清理、实际功能,还是修复 bug,每个 convoy 都是 Gas Town 工作订单架构中的一个工单单元。它们相当新(大概只有三到四天?),但已经是迄今为止最有趣的工作方式。

注意,一个 Convoy 在完成之前可以被多个 swarm “攻克”(并行处理)。swarms 是承担持续性工作的短暂代理会话。无论谁在管理该 Convoy(例如 Witness)都会不断循环分配 polecats 并推动它们处理议题。

Gas Town 工作流

Gas Town 中最基本的工作流是交接,即 gt handoff,或 /handoff 命令,或者直接说“我们来交接吧”。你的 worker 会选择性地把工作发给自己,然后在 tmux 中为你重启它的会话。所有你指挥的 worker——市长、你的团队,有时还有其他人——都需要你告诉他们是时候交接了。

除此之外,Gas Town 的开发循环与 Claude Code(以及 Beads)差不多,只是规模更大。你可以免费(但需要付钱才能运行)获得蜂群,你能得到一些不错的仪表盘,你能用某种方式描述工作流,你还能收到邮件和消息。大致就是这些。

我发现 tmux 既易于使用又出乎意料地强大,而我才刚刚开始学习它的各种细节。它为我提供了一切所需:切换到任意代理、扫描它们正在做的事情、在不同相关代理组之间循环切换。非常棒。

Press enter or click to view image in full size

图 15:tmux list-sessions 视图

我当然期待有一个适用于 Gas Town 的 Emacs 界面。我也确信你们中有些人期待一个 Web 界面。随便试试吧!

但 tmux 已经足够好了。你不需要学很多 tmux 命令就能熟练使用。我只用几个:

  • C-b s — 列出会话,查看它们,切换到某个会话
  • C-b b ——将光标向后移动(在许多编辑器和 Shell 中为 C-b)。在 tmux 中只是向后移动得更慢。小小的代价!
  • C-b [——进入“复制模式”,该模式会暂停输出并允许你滚动(按 ESC 退出)
  • C-b C-z C-z ——将进程挂起回到 shell
  • C-b n/p ——在组内切换到下一个工作者(例如钻机上的下一个 Crew 成员)
  • C-b a — 调出活动提要视图(我的配置)

就差不多是这样了!我发誓,你并不需要很多 tmux。它不会妨碍你,而且在很多时候能极大地救你一命。它还能让远程云端工作者可行(我们会在几天内把它们接上),并且高度可定制。你只需让 Claude Code 让 tmux 更适合你,它就会办到。它可以做出你想要的任何视图,按你喜欢的方式重绑按键,制作自定义弹窗,等等。太棒了,几乎像个小型 Emacs。

在燃料镇进行规划

燃料镇需要大量燃料。它既消耗也生产 guzzoline,或者说工作分子。除了仅仅维持燃料镇正常运转之外,可能最难的问题是保证它有足够的粮草。它把实现计划快速地消化掉,因此你必须做大量的设计和规划来不断为引擎提供燃料。

在消费端,你把 Gas Town 的史诗、问题和分子(构建的工作流)喂进去。它会吞噬这些内容,生成,嗯……我现在尽量把工人数量控制在 30 人以下,因为我还没在超大云上实现远程工人(很快会有!),通常除非我在市长和见证人上非常用力推进,否则只会有一打左右的活跃工人。

但哇。用 12 到 30 名工人,你可以在一次坐下来就清理掉巨量的待办工作,即便你使用那些需要额外代码审查和测试步骤(因此完成时间更长)的“闪亮”或“镀铬” polecat 工作流。

在生产端,你可以使用自己的规划工具,比如 Spec Kit 或 BMAD,一旦计划准备好,就让一个代理把它转换成 Beads 史诗。如果计划足够大,你可能想对其进行蜂群式处理,并在一个大车队中为计划的不同部分生成史诗。

你可以用公式来生成工作。如果你希望每一项编码工作(或设计工作、或 UX 工作)都通过某个特定的模板或工作流,你可以把它定义为一个分子,然后用你的编排模板“收工”或组合基础工作。

我为 Jeffrey Emanuel 的“五次规则”实现了一个公式,该规则的观察是:如果让一个 LLM 对某件事进行五次审阅—but 每次都侧重不同的方面—它会产生更优秀的结果和产物。 所以你可以把任何工作流用“五次规则”处理,这会让每个步骤被审阅 4 次(实现本身算作第一次审阅)。

这可能会生成非常大的工作流,可能需要你花费数小时或数天才能完成,尤其是当你限制你的 polecat 数量以控制成本或代币消耗时。但 Gas Town 的好处是,一旦工作生成完毕,你可以将其挂起并自主地快速处理完毕。

与 Kubernetes 的比较

这是我承诺给出的 Kubernetes 比较。可以随意跳过阅读。

Press enter or click to view image in full size

图 16:Kubernetes/毒气雷小镇对比

毒气雷小镇或许在外观上有点像 Kubernetes,尽管不是刻意为之。两者都将不可靠的工作者协调到一个目标上。两者都有一个控制平面(Mayor/Deacon 与 kube-scheduler/controller-manager)监管执行节点(Rigs 与 Nodes),每个节点都有一个本地代理(Witness 与 kubelet)监控短暂的工作单元(Polecats 与 Pods)。两者都使用一个事实来源(Beads 与 etcd),整个系统围绕该来源进行调和。当你需要在大规模下“赶猫”时,这些似乎是自然而然出现的结构。

最大区别在于,Kubernetes 问的是“它还在运行吗?”,而毒气雷小镇问的是“它完成了吗?”K8s 优化的是可用性——保持 N 个副本存活,重启崩溃的 pods,永远维持期望状态。毒气雷小镇优化的是完成度——把这项工作做完,让车队着陆,然后销毁工作者继续前进。K8s 的 pods 是匿名的“牲畜”;毒气雷小镇的 polecats 是有信誉的工作者,他们的完成会累积成 CV 链,而 sessions 则是“牲畜”。K8s 向一个持续的期望状态调和;毒气雷小镇朝着一个终结性目标前进。引擎形状相似,目的地却截然不同。

我只是没来得及做的东西

我本想在圣诞节那天发布 Gas Town,但错过了。直到 12 月 29 日晚 8 点左右它才真正开始运转,我是说像我设想的那种“飞起来”。在那之前它已经运行了两个小时我才注意到。我一直在跟市长聊,抱怨一些事情,然后各种修复开始在我周围落地,我意识到我其实只是通过交谈在塑造整个系统。车队在流动并着陆,工作在被提交和审查……这就是我几个月来一直追求的目标。而我只是在两天前才把它弄好。足够用于发布了!

下面是没赶上新年截点的内容。

  • Federation — 即便是 Python Gas Town 也支持在 GCP 上的远程工作者。我需要为联邦功能设计支持,既用于扩展你自己小镇的容量,也用于与其他人类小镇链接和共享工作。
  • GUI — 我甚至没有时间做出 Emacs 界面,更别提漂亮的网页界面了。但应该有人来做一个,如果没有,我最终会去做。
  • 插件 — 我没来得及把任何功能作为分子步骤的插件实现,但所有基础设施都已到位。
  • 分子商场 — 一个定义和塑造工作负载的分子市场与交易所。
  • 河内/MAKER — 我本想运行百万步的 wisp,但时间不够。

话虽如此,我对那些确实实现的内容还是相当满意:

  • 自交接 无缝运行——Gas Town 的核心内循环工作流
  • 投掷 有效, 车队 有效
  • 整个 MEOW 堆栈 正常运行
  • DeaconWitness 和 Refinery 巡逻 全部自动运行
  • 团队 很棒,远胜于原始 Claude 法典 实例
  • tmux 界面 出乎意料地好用,比我预期的更好。

此外我们还得到了像 gt seance 这样的酷炫功能。总体来说,这是 17 天的好成果。到目前为止。

敬请期待下次节目

我和你一样累了。聊天很有趣,但我得回到毒气雷镇了。

这还有更多内容。这只是一个开胃菜。我会发布更多关于毒气雷镇的博客、视频和内容。如果你愿意贡献,而且你够疯愿意上车,加入社区并开始发起讨论、提交 GH 问题和 PR 吧!

只要记住黄金守则:

  • 如果你每天不同时至少玩弄五个 Claude 代码,就别使用毒气雷镇。
  • 如果你在意钱,就别用 Gas Town。
  • 如果你身高超过 4 英尺,就别用 Gas Town。我想在聚会上高高在上、令人印象深刻,像索伦那样。
  • 别用 Gas Town。

Gas Town 只有 17 天的历史,至少这个版本是如此,是 Python Gas Town 的 Go“移植”。过去两周里发明并实现了整个 MEOW 堆栈:wisps、patrols、convoys、agents 和作为串珠的 identities、作为串珠的 swarms、作为串珠的 roles、“将 feed 作为信号”的创新,以及新增的 Refinery、Deacon 和 Dogs(自 Python Gas Town 以来)。还有许多其他东西。

17 天,7.5 万行代码,2000 次提交。它终于起飞了(GUPP 在两天前开始工作)。看来今年会很有意思。

我在十一月把 Gas Town 的大致构想分享给了 Anthropic。我想我把他们吓到了。我从未见过一家公司变得这么保守、来得这么快。但他们觉得 Beads 太有主见了,所以恐怕如俗话所说,Gas Town 会让他们受不了。

但我已经开始收到一些奇怪的邀约,有人打听到有关 Gas Town 的早期传闻,愿意付钱让我待在家里做自己:我可以继续开发 Beads 和 Gas Town,只需偶尔写一篇漂亮的博客文章或去参加一次会议或工作坊即可。我现在就有三份这样的邀约。这几乎超现实。

这让我想起在 Crunchyroll 上看过的某部动漫的几集,讲一只懒熊猫找不到工作,整天向开咖啡馆的北极熊朋友抱怨。然后有一天,他去动物园,发现熊猫馆在招人。于是他应聘,得到了这份工作,白天装成熊猫到处闲着,晚上回家。真是太荒诞了。

我就是那只熊猫。

在找到真正“懂”的公司和团队之前,我不回去上班。我厌倦了到处走动,把未来告诉别人,把它摆在他们面前,却得不到相信。

我宁愿待在家里,用我的双手创造未来。我家地里实际上种着六种竹子。我已经是那只熊猫,正享受着人生中最美好的时光。

如果你想帮我,联系我吧!非常感谢所有了不起的 Beads 贡献者!

下次见,带来更多 Gas Town 内容。新年快乐!

Press enter or click to view image in full size

了解 RecodeX 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读