写了 20 年代码的 Steve Yegge,开始用 AI 指挥“一座城”:你的 AI 编码到哪一层了?
最近一段时间,我一直在研究一个人:Peter Steinberger。如果你关注 AI Agent、AI Coding,大概率已经听过他的名字。Clawdbot / Moltbot 背后的那个人,一个已经赚到 8 亿美金,却选择重新写代码的人。这段时间,我围绕他写了几篇文章,也算是一次持续追踪式的研究:这个月 29 号,他又参加了一场非常深度的博客访谈。我把整期播客从头到尾听完,也写了完整解析:但说实话,真正触动我的,并不是他讲了什么方法论,而是:在持续研究 Steinberger 的过程中,我开始不断地反思自己。去年,我把一个很久没动过的 GitHub 老账号重新拿了出来,给自己定了一个目标:Build in Public。这是 Peter 的 GitHub Activity。没有比较之前,,我甚至还有点被去年的自己感动——几乎没有休息日,每天思考、每天反思、每天试图推翻昨天的自己。我其实并不太在意 commit 数量,很多时候是尽量把改动合成一个提交的。我一直对那种为了堆代码行数、刷提交数量而提交的行为非常警惕,甚至是反感的。年中,行业开始热烈讨论Spec Driven AI Coding 。但说实话,在那之前我已经实践了很久。后来云老师 Jesse 给我推荐了 Kiro,我用 YOLO 模式折腾了几天,很快发现:我驾驭不了。花时间、花钱,还直接拖慢了项目进度。折腾了一周之后,我停下来了。AI Coding,究竟怎样才能真正提效?数量、质量、心力,如何同时推进?也正是在这个反思过程中,我看到了 Steve Yegge 的那篇文章和他的新项目。读完之后,我觉得非常有意思,也非常值得拿出来和大家一起讨论。👤 作者:Steve Yegge(前Geoworks、亚马逊、谷歌、Grab、Sourcegraph工程师)技术行业资深老兵Steve Yegge在2026年开年带来了他的最新项目——Gas Town。这是一个革命性的AI编码代理编排系统,旨在解决管理多个Claude Code实例的痛点。通过创新的"工作分子化"理念和GUPP(Gas Town通用推进原则),Gas Town让开发者能够同时高效管理20-30个AI编码代理,将软件开发转变为工业化的工作流工厂。在这篇深度长文中,Yegge详细解释了Gas Town的设计哲学、核心架构、工作流程,以及为什么这个系统代表了AI辅助编程的下一个前沿。[Gas Town](https://github.com/steveyegge/gastown)是2026年IDE的新范式。它帮助您处理运行多个Claude Code实例的繁琐工作。当您同时使用多个AI编码代理时,东西会丢失,很难跟踪谁在做什么等等。Gas Town解决了所有这些"修修补补"的问题,让您专注于Claude Code正在处理的工作。对于这篇博客文章,"Claude Code"指的是"Claude Code及其所有外观相似的竞争对手",即Codex、Gemini CLI、Amp、Amazon Q-developer CLI等等,因为它们本质上都是克隆品。整个行业就像一个尴尬的小孩足球队,追逐着2025年Claude Code的CLI形态,而不是构建下一个时代的产品。所以我继续前进,构建了下一个时代的产品。首先我在三月份的[《初级开发者的复仇》](https://sourcegraph.com/blog/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问题](https://arxiv.org/abs/2511.09030)(20盘汉诺塔),您可以从公式生成百万步的"轻雾"(wisp)。昨晚我为了好玩在几分钟内运行了10盘版本,只是为了证明一千步不是问题(MAKER论文说LLM在几百步后就会失败)。20盘的轻雾大约需要30小时。感谢参加我的TED演讲。如果您能看完接下来的23页,这一切都会变得完全合理。在《初级开发者的复仇》之后,我全年四处旅行,大声告诉每个人需要构建什么,我指的是每个人。我对此并不害羞。我会宣布:"编排器是下一个!"每个人都会慢慢点头,深思熟虑地皱眉说:"嗯。"我去了像Temporal和Anthropic这样公司的高级人员那里,告诉他们应该构建一个代理编排器,Claude Code只是一个构建块,未来将是AI工作流和"代理的Kubernetes"。我在多个活动上登台描述了我对编排器的愿景。我去了所有地方,见了所有人。"它将像Kubernetes,但是为Agent设计的,"我说。"它必须有多个级别的代理来监督其他Agent,"我说。我为此说了很多话,持续了几个月。但是,该死的,我们甚至无法让人们使用Claude Code,更不用说考虑同时使用10到20个了。所以在八月,我开始构建自己的编排器,因为似乎没有人在乎。最终它失败了,我把它扔掉并开始v2,这个也失败了,但我们从中学到了[Beads](https://github.com/steveyegge/beads)。然后是v3(Python Gas Town),这个持续了六到八周。Gas Town(Go版本)是我在2025年第四个完整、可运行的编排器。我如何达到Gas Town的故事很有趣,但我们留到下次再说。不幸的是,这篇文章已经足够长了(25页以上!),只是告诉您它如何工作的最基础知识。我们可以稍后再讲背景故事。但是首先,在我们深入Gas Town的操作之前,我需要快速摆脱您。让我们谈谈一些您不应该使用Gas Town的原因。我可以想到更多,但这些应该足够了。首先,代码库还不到3周。在"抛光钻石"到"未切割原石"到"我刚在屁股里走私了400英里上游"的尺度上,我将Gas Town描述为"您可能还不想使用它"。它需要一些消毒剂。它也是100%氛围编码的。我从未看过代码,也永远不想看,这可能会让您犹豫。当然,我也从未看过[Beads](https://github.com/steveyegge/beads),这是22.5万行Go代码,每天有成千上万的人在使用。我十月份才创建了它。如果这让您感到不舒服,现在就走。其次,您真的、认真地还没准备好。让我们谈谈2024-2026年程序员的进化,如图2所示:首先,您应该在图表上定位自己。在您的AI辅助编码旅程中,您处于哪个阶段?第1阶段:零或接近零AI:可能使用代码补全,有时问Chat问题第2阶段:IDE中的编码代理,权限开启。侧边栏中的窄编码代理请求您运行工具的权限。第3阶段:IDE中的代理,YOLO模式:信任度上升。您关闭权限,代理变得更宽。第4阶段:IDE中,宽代理:您的代理逐渐增长填满屏幕。代码只用于差异比较。第5阶段:CLI,单代理。YOLO。差异滚动而过。您可能看也可能不看它们。第6阶段:CLI,多代理,YOLO。您经常使用3到5个并行实例。您非常快。第7阶段:10+个代理,手动管理。您开始触及手动管理的极限。第8阶段:构建自己的编排器。您处于前沿,自动化您的工作流。如果您至少没有达到第7阶段,或者可能第6阶段且非常勇敢,那么您将无法使用Gas Town。您还没准备好。Gas Town是一个由超智能机器人黑猩猩操作的工业化编码工厂,当它们愿意时,它们可以瞬间毁掉您的一切。它们会毁掉其他黑猩猩、工作站、客户。如果您还不是经验丰富的黑猩猩驯兽师,它们会撕掉您的脸。所以不行。如果您有任何疑问,那么您不能使用它。在Gas Town中高效工作需要投入氛围编码。工作变得流动,成为一种不可计量的物质,您可以自由地抛掷,就像在码头上把闪亮的鱼倒进木桶里。大部分工作完成了;有些工作丢失了。鱼从桶里掉出来。有些逃回海里,或者被踩到。更多的鱼会来。重点是吞吐量:以思考速度进行创建和修正。Gas Town中的工作可能是混乱和马虎的,这就是它得名的原因。有些错误被修复了2或3次,有人必须选出获胜者。其他修复丢失了。设计消失需要重做。这没关系,因为您正在无情地推进巨大的、巨大的工作堆,Gas Town既在生成也在消耗这些工作。您可能不是100%高效,但您正在飞翔。在Gas Town中,您让Claude Code做它的事。您是产品经理,Gas Town是想法编译器。您只需构思功能,设计它们,提交实施计划,然后将工作抛给您的polecat和crew。Opus 4.5可以处理任何合理大小的任务,所以您的工作就是为它创建任务。就这样。除此之外,您还必须帮助保持Gas Town运行。它大部分时间都运行得很好,但经常出问题。需要您和工作人员付出很多努力才能让它平稳运行。这完全是一个需要手把手的编排系统。如果您不能那样工作,那么您到底还在这里做什么?回到您的IDE并就地避难。Gas Town对您不安全。Gas Town也贵得要命。如果您曾经需要思考钱从哪里来,哪怕是一瞬间,您也不会喜欢Gas Town。我终于不得不开了第二个Claude Code账户;他们不让您从单个账户无限制地吸钱,所以您需要多个电子邮件和吸管,这都很愚蠢。我的计算显示,现在Gas Town终于实现了起飞,我下周结束前将需要第三个Claude Code账户。这是一个吞金兽。Gas Town使用tmux作为其主要UI。我不得不学习tmux。这比我想象的要容易,而且更有用。3周后,我爱上了tmux。您将不得不学习一点tmux。或者,您可以等到有人为Gas Town编写更好的UI。更好的UI会来的。但tmux是您现在拥有的。而且值得学习。无论喜欢与否,Gas Town建立在Beads之上。它实际上是Beads的续集:我的《帝国反击战》对Beads的《星球大战》。Gas Town没有"替代后端"。Beads是Gas Town中发生的一切的通用Git支持数据平面(以及控制平面)。您必须使用Beads才能使用Gas Town。您可能不喜欢Beads。如果您认为Beads过于有主见,那您就等着瞧吧。Gas Town是我走进AI辅助编码的公众意见教堂,抬起腿,放出一个将在全世界闻到的屁。你们中的许多人可能会对我的品牌感到恶心。但我怀疑你们中的一些人会喜欢成为超级英雄,以至于愿意忽略Gas Town的怪癖,按照我的方式看待它。这就是工作应该完成的方式。它已经是最好的方式,而且会变得更好。Gas Town设计为今年在三个维度上扩展:(1)模型认知,(2)代理变得更加Gas Town友好,以及(3)Gas Town和Beads进入前沿模型的训练语料库。即使没有所有这些,代理如此轻松地使用Beads和Gas Town已经够令人震惊了。零训练。但现在呢?它就像一个19世纪末的工厂,机器可以在您不小心时剖开您的肚子。好了!这是不使用Gas Town的六七个充分理由。如果我还没有摆脱您,那么我猜您是疯狂者之一。坚持住。这将是一次漫长而复杂的旅程。我尝试了超级自上而下的方法,并尽可能简化,但这有点像教科书。我很抱歉。但为我辩护的是,Gas Town太有趣了。我做过的最好的东西。Gas Town工作者是常规的编码代理,每个都被提示扮演七个明确定义的工作者角色之一。我将简要介绍一些其他关键概念,如Towns和Rigs。关于Gas Town需要提前知道的一件事:它会优雅降级。每个工作者都可以独立工作,或以小组形式工作,任何时候您都可以选择运行Gas Town的哪些部分。它甚至在"无tmux"模式下也能工作,并使用裸Claude Code会话(没有实时消息)蹒跚前行。有点慢,但仍然有效。七个Gas Town角色都协同工作以帮助保持Gas Town运行。有时也需要您的帮助;Gas Town运行在等量的汽油和努力上。🏙️ 城镇(The Town):这是您的总部。我的是`~/gt`,我所有的项目钻机都在它下面:gastown、beads、wyvern、efrit等。城镇(Go二进制文件`gt`)管理并编排您所有钻机上的所有工作者。您将它保存在一个单独的仓库中,主要是为了配置。🏗️ 钻机(Rigs):您置于Gas Town管理下的每个项目(git仓库)都称为钻机。一些角色(Witness、Polecats、Refinery、Crew)是每个钻机的,而其他角色(Mayor、Deacon、Dogs)是城镇级别的角色。`gt rig add`和相关命令在Gas Town框架内管理您的钻机。钻机很容易添加和移除。👤 监督者(The Overseer):那就是您,人类。我在图片中为您画了一些眼妆。作为监督者,您在系统中有身份,有自己的收件箱,可以发送和接收城镇邮件。您是老板,头头,大人物。🎩 市长(The Mayor):这是您大部分时间交谈的主要代理。它是您的礼宾员和参谋长。但如果市长忙,所有其他工作者也都是Claude Code,所以它们都非常聪明和乐于助人。市长通常启动您的大部分工作车队,并在完成时接收通知。😺 Polecats:Gas Town是一个工作群集引擎。Polecats是按需启动的临时每钻机工作者。Polecats工作,通常以群集形式,生成合并请求(MRs),然后将它们交给合并队列(MQ)。合并后,它们完全退役,尽管它们的名称被回收。🏭 精炼厂(Refinery):一旦您开始群集工作者,就会遇到合并队列(MQ)问题。您的工作者会就变基/合并陷入猴子刀战,可能会变得丑陋。基线在群集期间可能变化如此之大,以至于最终合并的工作者试图合并到一个无法识别的新头部。它们可能需要完全重新构想其更改并重新实施。这就是精炼厂的工作:负责智能合并所有更改(一次一个)到主分支的工程师代理。不能丢失任何工作,尽管允许升级。🦉 见证者(The Witness):一旦您启动足够多的polecats,您会意识到需要一个代理来监视它们并帮助它们摆脱困境。Gas Town的推进(GUPP)有效,但现在还有点不稳定,有时您需要去催促polecats提交它们的MRs,然后催促精炼厂处理它们。见证者巡逻帮助平滑这一点,使其在大多数运行中几乎完美。🐺 执事(The Deacon):执事是守护进程信标。它以《水世界》中Dennis Hopper扮演的角色命名,该角色灵感来自《疯狂的麦克斯》宇宙中的Lord Humungus角色,使其成为跨界。执事是一个巡逻代理:它循环运行"巡逻"(明确定义的工作流)。Gas Town有一个守护进程,每隔几分钟ping一次执事并说:"做你的工作。"执事智能地将这个DYFJ信号向下传播给其他城镇工作者,确保Gas Town保持运行。🐶 狗(Dogs):灵感来自Mick Herron的MI5 "Dogs",这是执事的个人团队。与polecats不同,狗是城镇级别的工作者。它们做诸如维护(清理陈旧分支等)和为执事偶尔做杂工的事情,比如运行插件。执事的巡逻职责过载,需要助手,所以我添加了狗。这使执事专注于完成巡逻,而不是陷入某个步骤的泥潭。执事将工作抛给狗,它们处理繁琐的细节。🐕 启动狗(Boot the Dog):有一只名叫Boot的特殊狗,每5分钟被守护进程唤醒一次,只是为了检查执事。这是它唯一的工作。Boot存在是因为守护进程不断用烦人的心跳和鼓励性谈话打断执事,所以现在狗听到了它。Boot决定执事是否需要心跳、推动、重启,或者只是被留下不管,然后回去睡觉。👷 船员(The Crew):尽管在列表中最后,船员是您个人使用最多的代理,仅次于市长。船员是为监督者(您)工作的每钻机编码代理,不受见证者管理。您选择它们的名称,它们有长期身份。您可以启动任意多个。tmux绑定让您可以用`C-b n/p`为每个钻机循环遍历船员。船员是您以前使用的任何工作流的直接替代品。它只是一堆命名的claude code实例,可以接收邮件并抛掷工作。船员非常适合设计工作等工作,有很多来回。它们很棒。您会爱您的船员。[Beads](https://github.com/steveyegge/beads)是Gas Town中的工作原子单位。Bead是一种特殊的问题跟踪器问题,具有ID、描述、状态、分配者等。Beads存储在JSON中(每行一个问题)并与您的项目仓库一起在Git中跟踪。城镇邮件和消息传递(事件)使用Beads,其他类型的编排也使用。Gas Town有一个两级Beads结构:钻机Beads和城镇Beads。Gas Town中有两级工作在进行:钻机级别和城镇级别。- 钻机级别工作是项目工作:使您的项目更好。功能、错误修复等。这项工作在polecats和crew之间分配,其他工作者偶尔介入。
- 城镇级别工作是编排,包括巡逻(要遵循的长步骤串,编码为链接的Beads)和一次性工作流,如发布或生成跨钻机代码审查波。
这两种工作都使用Beads,两者之间有一些重叠。大多数情况下,它相当灵活,您在何处提交问题或实例化工作并不重要。所有工作者都了解Gas Town,如果您从错误的钻机给它们工作,它们会相当冷静。所有钻机级别工作者(精炼厂、见证者、polecats和crew)在需要时完全能够跨钻机工作。有一个`gt worktree`命令,它们可以用来获取任何钻机的自己的克隆并进行修复。但通常它们在一个项目内工作。Beads有跨钻机路由。Gas Town配置Beads根据问题前缀(如"bd-"或"wy-")将`bd create`和`bd show`等请求路由到正确的数据库。所有Beads命令在Gas Town中几乎任何地方都有效,并找到正确的位置放置它们,如果不是,移动Beads很容易。Gas Town就是Gas Town。它始于《疯狂的麦克斯》主题,但都不太强。没有角色是该系列中的适当名称,而且我正在从其他来源引入主题,包括Slow Horses宇宙、《水世界》、《猫的摇篮》、《绝命毒师》(您很快就会看到),显然还有《柳林风声》,来自Nano Banana的绘画。如果有人曾经为此给我发送C&D信,Gas Town将智能章鱼变形为Gastown,以美丽的加拿大不列颠哥伦比亚省温哥华的Gastown区命名,我们的polecats将只是在不同的杆子上。长话短说,"Gastown"也是指代项目的正确方式。说到这里...GUPP是保持Gas Town运行的原因。Claude Code的最大问题是它结束了。上下文窗口填满,它耗尽了蒸汽,然后停止。GUPP是我对这个问题的解决方案。GUPP简单地说:如果您的钩子上有工作,您必须运行它。所有Gas Town工作者,在所有角色中,在Beads中都有持久身份,这意味着在Git中。工作者身份类型由角色Bead表示,这类似于描述角色的域表。每个工作者都有一个代理Bead,这是代理的持久身份。角色Beads和代理Beads(以及钩子)都是"固定Beads"的例子,意味着它们像黄色便签一样漂浮在Beads数据平面中,永远不会像常规问题那样关闭(除非身份消失)。它们不会出现在`bd ready`(就绪工作)中,并在其他各种方面被特殊处理。在Gas Town中,代理不是会话。会话是临时的;它们是Kubernetes"宠物vs牛"比喻中的"牛"。Claude Code会话是Gas Town投向持久工作的牛。所有这些工作都存在于Beads中,连同工作者的持久身份、邮件、事件系统,甚至临时编排,正如我们将看到的。在Gas Town中,代理是一个Bead,一个具有单例全局地址的身份。它有一些插槽,包括指向其角色Bead的指针(具有该角色的引导信息等)、其邮件收件箱(所有Beads)、其钩子(也是一个Bead,用于GUPP)以及一些管理内容,如编排状态(标签和注释)。该代理所做的一切历史都记录在Git和Beads中。那么什么是钩子?每个Gas Town工作者都有自己的钩子🪝。它是一个特殊的固定Bead,只为该代理,是您挂分子(Gas Town工作流)的地方。东西如何挂在那里?当然是用`gt sling`。您将工作抛给工作者,它放在它们的钩子上。您可以立即启动它们,或推迟,甚至让它们先重启。我们稍后会讨论所有这些。将工作抛给它们意味着您可以处理其他事情,它们将继续。关于Gas Town最简单但最伟大的事情之一是,在任何会话中的任何时间,您可以说"让我们交接",工作者将优雅地清理并重新启动自己。由于GUPP,如果代理被钩住,它将自动继续工作。不幸的是,Claude Code如此令人痛苦地有礼貌,以至于GUPP在实践中并不总是有效。我们告诉代理,您必须运行您的钩子,它有时什么都不做。它只是坐在那里等待用户输入。Gas Town工作者被提示遵循"物理优于礼貌",并告诉在启动时查看它们的钩子。如果它们的钩子上有工作,它们必须在不等待的情况下开始工作。不幸的是,在实践中,Claude Code通常等到您输入某些内容——任何内容——然后才检查其邮件和钩子,报告并开始工作。有时会,有时不会。随着时间的推移这会变得更好,但现在,有时需要推动一下。因为Gas Town工作者并不总是遵循GUPP,所以有各种系统会在大约30到60秒后推动代理。有时更快,有时更慢。但如果城镇正在运行且不静止,它总会在5分钟左右得到推动。代理通过`gt nudge`获得启动推动,这是Gas Town的核心实时消息传递命令,向工作者(或整个频道)发送tmux通知。它解决了`tmux send-keys`的一些去抖问题,并确保工作者接收到通知,就像用户键入一样。这将工作者踢入读取邮件和钩子,并采取行动。随着Gupp推动"黑客"就位,以及从执事向下的分层心跳,GUPP通常嗡嗡作响,并保持Gas Town运行,只要有工作可用。车队启动、完成并着陆而无需干预。工作者跨会话继续分子。如果您提供足够的工作,Gas Town可以整夜工作。GUPP推动导致了一个有趣的功能`gt seance`,它允许Gas Town工作者直接与其角色的前任沟通。即现任市长可以与上一任市长交谈,等等。它们借助Claude Code的`/resume`功能做到这一点,该功能让您重新启动您杀死的旧会话。这很有用,因为通常工作者会说:"好的,我把这堆工作和建议交给了我的继任者!再见!`/handoff`",然后消失,然后新的工作者会启动并说:"什么?我什么都没看到。"您曾经不得不笨拙地找出哪个会话是前一个,在您最近的40多个会话中,所有这些都以"让我们开始"开头,因为您一直在手动进行GUPP推动。这真的很尴尬,几乎不值得。`gt seance`出现的方式是:您在推动中告诉代理什么并不重要。因为它们的提示如此严格地关于GUPP和Gas Town的操作理论,以及它们在机器中作为齿轮的重要性,等等等等,代理将完全忽略您键入的任何内容,除非您直接覆盖它们的钩子指令。图8:使用\`gt seance\`与已故祖先交谈所以您只需要说"嗨",或"Elon Musk说月亮是绿奶酪做的",或"做您的工作",代理就会运行钩子。我一周前的想法是:既然我们必须推动所有会话,我决定在推动中包含Claude Code的`session_id`(以及Gas Town角色和PID)。这为每个`/resume`会话提供了独特且有用/可发现的标题。使用`gt seance`,工作者实际上会在子进程中启动Claude Code,使用`/resume`恢复其前任,并问它:"你留给我的东西到底在哪里?"我想现在可能是时候谈谈MEOW堆栈了。我想您已经准备好了。Gas Town是深冰山的尖端。Gas Town本身可能不会活过12个月,但Gas Town的骨架——MEOW堆栈——可能会持续几年。这感觉更像是一个发现而不是发明。首先是Beads。十月,我沮丧地告诉Claude将我所有的工作放在轻量级问题跟踪器中。我想要Git。Claude想要SQLite。我们妥协了两者,Beads诞生了,大约15分钟的疯狂设计。这些是基本工作单位。不久之后出现了史诗(Epics):具有子级的Beads,这些子级本身也可以是史诗。这给您很多灵活性来构建自上而下的计划。史诗的子级默认是并行的,但您可以在它们之间放入显式依赖关系以强制排序。史诗允许创建"倒置"计划,其中最后要做的事情是根,首先要做的事情是史诗树的叶子。有点丑,但AI可以很好地解决。接下来是分子(Molecules)。我在12月17日有这个想法,从澳大利亚回来几天后。我对前两个编排器的工作让我想要将代理工作分解为排序的小任务,它们必须像TODO列表一样检查。它们已经这样做了,但我想提前做,以便我可以提前设置数小时的工作,它们将以正确的顺序原子性地执行。换句话说,分子是工作流,用Beads链接。它们可以有任意形状,不像史诗,并且可以在运行时缝合在一起。然后我提出了原分子(protomolecules),它们像类或模板——由实际的Beads组成,所有指令和依赖关系提前设置,整个模板问题图(例如简单的一个中的"设计"、"计划"、"实施"、"审查"、"测试"),您将实例化为分子。实例化涉及复制所有原分子Beads并对其执行变量替换以创建真实工作流。示例:我有一个20步的Beads发布流程。代理过去常常努力完成它,因为它有很长的等待状态,例如等待GitHub Actions完成、CI完成以及各种工件部署。我不得不催促代理完成,它们总是跳过步骤。有了分子,想法是:为发布步骤创建20个Beads,以正确的顺序链接它们,并让代理遍历链,一次一个问题。一个额外的好处是它会自动生成活动源,因为它们声明并关闭问题。如果工作流被捕获为分子,那么它可以在代理崩溃、压缩、重启和中断中幸存。只需在相同的沙箱中启动代理,让它找到在分子中的位置,并从它离开的地方继续。原分子很棒。Claude坚持《The Expanse》参考,确保我们将被几乎所有主要工作室起诉。但我们很快发现需要宏扩展阶段,以便正确组合具有循环和门的分子。所以我想出了工作流的源形式,公式(Formulas),采用TOML格式,它们被"烹饪"成原分子,然后实例化为Beads数据库中的轻雾或分子。公式为您提供了一种描述和组合几乎所有知识工作的方法。我正在建立一个名为Mol Mall的市场。请继续关注。最后,我需要一个词来表示"分子化工作"——代理可以一次选取和完成步骤的形式。这是您可以组合在一起的工作,分子与其他分子结合,您可以提前为整个巨大项目设置依赖关系,并让Gas Town在周末群集它,无人值守,如果您足够勇敢的话。所有世界工作分子的术语是"汽油(guzzoline)",尽管我们在文档中不经常使用它。这只是Gas Town的一个习语,有点像War Rig,这是给定钻机对跨钻机车队的贡献。您会不时听到它,但它不是日常命名的重要部分。Gas Town基于我称为非确定性幂等性(NDI)的原则运行。它类似于Temporal的确定性、持久重放,但Gas Town通过完全不同的机制实现其持久性和保证执行。在Gas Town中,基于MEOW堆栈操作,所有工作都表达为分子。其中有一点代数,这是我在过去两周发现的。分子是工作流。它们可以有复杂的形状、循环和门,实际上是图灵完备的。工作流的每个步骤都由超智能AI执行。因为AI非常擅长遵循TODO列表和验收标准,它们在遵循分子方面是可靠的。它们理解GUPP的概念,并且理解检查问题(无论多么琐碎)的官僚主义更新实时活动源并将工作放在永久分类账上。这种推理足以让它们在执行时保持嗡嗡作响并处于正轨。它们不会"无聊",并且犯错误的可能性要小得多,因为它们不管理自己的TODO列表(除非在单个小步骤内)。这意味着分子工作流是持久的。如果分子在代理的钩子上,那么:- 代理是持久的:由Git支持的Bead。会话来来去去;代理留下。
所以Claude Code是否崩溃或上下文耗尽并不重要。只要为此代理角色启动另一个会话,它将立即开始处理该分子中的步骤(通过GUPP,或当被某个巡逻代理推动时)。如果它发现它在最后一步中间崩溃了,没什么大不了的,它将找出正确的修复方法,执行并继续。所以即使路径完全是非确定性的,结果——您想要运行的工作流——最终完成,"保证",只要您不断向它投掷代理。代理甚至可能在此过程中犯错,但可以自我纠正,因为分子的验收标准大概由设计分子的人明确指定。有很多边缘情况。这个NDI描述是过度简化的。Gas Town不是Temporal的替代品。请咨询您的医生,Gas Town是否适合您。但Gas Town确实提供了对于开发工具足够好的工作流保证!如果您是我!我们的教科书中可能还有一些其他角落需要涉及。大多数时间,您不关心这些东西,您关心车队的启动和完成,以及观看您的活动源和仪表板。但Gas Town的分子"化学"有很多丰富的角落,在编排中积极使用。12月21日的一个关键扩展发明是轻雾(Wisps),它们是临时的Beads。它们在数据库中,获得哈希ID,并像常规Beads一样行动。但它们不写入JSONL文件,因此不持久化到Git。在运行结束时,轻雾被"燃烧"(销毁)。可选地,它们可以被压缩成单行摘要/摘要并提交到git。轻雾对于高速度编排工作流很重要。它们是Gas Town工作的气相。所有巡逻代理——精炼厂、见证者、执事、Polecats——为每个巡逻或工作流运行创建轻雾分子。它们确保工作流以事务方式完成,但不会用编排噪音污染Git。巡逻是巡逻工作者(特别是精炼厂、见证者和执事)运行的临时工作流。巡逻是代理循环运行的临时(轻雾)工作流。巡逻具有指数退避:如果代理在其巡逻步骤中找不到工作,它将逐渐进入睡眠状态,等待越来越长的时间才开始下一次巡逻。任何变异的`gt`或`bd`命令都会唤醒城镇,或者您可以用`gt`命令自己做,启动个别工作者、组、钻机或整个城镇。精炼厂的巡逻相当简单。它有一些预检步骤来清理工作空间,然后处理合并队列,直到它为空,或者需要回收会话。当它准备好交接时,其分子中有一些飞行后步骤。我正准备向精炼厂的巡逻添加插件,但它们还不存在。当我添加它们时,您将能够添加插件来干扰MQ并尝试智能地重新排序它,并将Gas Town的后端连接到其他系统。见证者的巡逻更复杂一些。它必须检查polecats和精炼厂的状况。它还窥探执事,只是为了确保它没有卡住。见证者运行钻机级别插件。执事的巡逻有很多重要的职责。它运行城镇级别插件,这些插件可以提供全新的UI或功能。执事还参与`gt handoff`和回收代理会话的协议,并确保一些工作者被正确清理。执事的巡逻变得足够复杂,以至于我添加了狗作为助手,执事的个人团队。现在它被提示将复杂工作和调查交给狗,以便长时间的巡逻步骤不会干扰城镇的核心事件系统,该系统是协作和基于邮件的。Gas Town将插件定义为"来自代理的协调或调度关注"。Gas Town工作者运行工作流(通常在巡逻循环中),任何工作流都可以包含任意数量的"运行插件"步骤。Gas Town的执事巡逻运行城镇级别插件,现在用狗运行,所以它们可以运行几乎无限的时间。我们对定时器和回调有一些支持,但主要是生命周期钩子。我还没有对这个子系统投入大量设计思考,所以如果您想开始使用插件系统,请告诉我,我们可以解决。我计划在Gas Town中实现大量附加功能作为插件。它们只是没有进入v1发布。它们可能最终成为Mol Mall中的公式。好的,呼。您做得很好。我们涵盖了很多理论,这尤其困难,因为它是我在过去3周从屁股里拉出来的一堆废话,我以獾等东西命名它。但它有一种优雅的一致性和连贯性。基于Git数据平面中黄色小便签的工作流编排,作为连接工作海洋中的图节点。呸!没人在乎,我知道。您想超级快速地完成任务,仅受限于您的令牌吸收速度。让我们谈谈如何实现。Gas Town中的所有工作,所有工作,都汇总到一个车队中。车队是一个特殊的Bead,它将一堆工作包装成一个您跟踪交付的单位。它不使用史诗结构,因为车队中跟踪的问题不是其子级——它们中的大多数已经有另一个父级。在Gas Town中抛掷工作的基本原语是`gt sling`。如果我告诉市长:"我们的tmux会话在状态栏中显示错误的钻机数量——提交它并抛掷它",市长将为问题提交一个Bead,然后`gt sling`它给一个polecat,后者立即处理它。真实示例:我经常告诉我的Beads船员将发布分子抛掷给一个polecat。Polecat将走过20步发布流程,完成它,然后我会收到通知车队已经着陆/完成。编辑:实际上现在甚至更花哨。当分子在门状态等待时,例如等待GH Action或CI/CD,polecat消失。然后当门Bead触发时,Gas Town唤醒一个polecat以继续工作。听到"问题`wy-a7je4`刚刚完成"会令人困惑。即使您看到标题,它可能并不反映该问题所属的更大工作块。所以现在我们用车队包装每一块抛掷的工作,从单个polecat抛掷到有人启动的大群集。车队出现在一个日益改进的仪表板中;有一个Charmbracelet TUI,带有每个车队的扩展树,所以您可以看到其个别跟踪的问题。UI和UX将改进。这是Gas Town的第一天。车队基本上是功能。无论是技术债务清理、实际功能还是错误修复,每个车队都是Gas Town工单架构的票据单位。它们相当新(可能3-4天?),但已经是最有趣的工作方式。请注意,车队在完成之前可以有多个群集"攻击"它(处理它)。群集是承担持久工作的临时代理会话。无论谁管理车队(例如见证者)都会不断回收polecats并将它们推向问题。Gas Town中最基本的工作流是交接`gt handoff`,或`/handoff`命令,或者就说"让我们交接"。您的工作者将可选地向自己发送工作,然后在tmux中为您重新启动其会话。您指导的所有工作者——市长、您的船员,有时其他——将需要您让它们知道是时候交接了。除此之外,Gas Town开发循环或多或少与使用Claude Code(和Beads)时相同,只是更多。您免费获得群集(它们只花钱),您获得一些不错的仪表板,您获得描述工作流的方式,并获得邮件和消息传递。这...差不多就是这样。我发现tmux既易于使用又令人震惊地强大,而且我几乎还没有开始学习细节。它给了我所需的一切:切换到任何代理,扫描它们都在做什么,循环不同的相关代理组。这很棒。我当然期待Gas Town的Emacs UI。而且我确信你们中的一些人期待Web UI。请便!但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` —— 循环到组中的下一个工作者(例如钻机中的下一个船员)
就是这样!我发誓,您不需要太多tmux。它不碍事,并且经常救您一命。它还支持远程云工作者(我们将在几天内连接),并且非常可定制。您只需要求Claude Code让tmux更好地为您工作,它就会做。它会制作任何您想要的视图,重新绑定键,制作自定义弹出窗口,无论什么。这太神奇了,几乎像一个婴儿Emacs。Gas Town需要很多燃料。它既消耗又产生汽油,或工作分子。除了保持Gas Town在轨道上,可能最困难的问题是保持它被喂食。它如此快速地消耗实施计划,以至于您必须做很多设计和计划来保持引擎被喂食。在消耗方面,您喂Gas Town史诗、问题和分子(构建的工作流)。它咀嚼它们,产生...嗯...我现在尽量保持在30个工作者以下,因为我还没有实现超大规模上的远程工作者(即将到来!),通常我只有十几个左右活跃,除非我真的在市长和见证者上努力。但是哇。有12到30个工作者,您可以在一次坐姿中烧掉巨大的工作积压,即使您使用"闪亮"或"镀铬"的polecat工作流,这些工作流做额外的代码审查和测试步骤(因此需要更长时间完成)。在生产方面,嗯,您可以使用自己的计划工具,如Spec Kit或BMAD,然后一旦您的计划就绪,要求代理将其转换为Beads史诗。如果计划足够大,您可能想要群集它,并为计划的不同部分在一个大车队中产生史诗。您可以使用公式生成工作。如果您希望每一块编码工作(或设计工作,或UX工作)都通过特定模板或工作流,您可以将其定义为分子,然后用您的编排模板"包装"或组合基础工作。我为Jeffrey Emanuel的"五法则"实现了一个公式,这是观察结果:如果您让LLM审查某物五次,每次关注不同领域,它会产生更优的结果和工件。所以您可以获取任何工作流,用五法则烹饪,它将使每个步骤被审查4次(实施计为第一次审查)。这可以生成大型工作流,可能需要数小时或数天才能完成,特别是如果您限制polecat数量以节流成本或令牌消耗。但Gas Town的好处是,一旦工作生成,您可以钩住它并自主完成。这是我承诺的Kubernetes比较。请随意跳过。图16:Kubernetes/Gas Town比较Gas Town可能确实有点意外地像Kubernetes。两个系统都为某个目标协调不可靠的工作者。两者都有控制平面(市长/执事 vs kube-scheduler/controller-manager)监视执行节点(钻机 vs 节点),每个都有本地代理(见证者 vs kubelet)监视临时工作者(Polecats vs Pods)。两者都使用整个系统协调的真相来源(Beads vs etcd)。这些显然是当您需要大规模放牧猫时出现的自然形状。最大的区别是,Kubernetes问:"它在运行吗?"而Gas Town问:"它完成了吗?"K8s优化正常运行时间——保持N个副本存活,重启崩溃的pods,永远维持期望状态。Gas Town优化完成——完成这项工作,着陆车队,然后核爆工作者并继续。K8s pods是匿名的牛;Gas Town polecats是有信用的工作者,其完成积累成CV链,而会话是牛。K8s向连续期望状态协调;Gas Town向终端目标前进。相似的引擎形状,根本不同的目的地。我想在圣诞节发布Gas Town,但错过了。它实际上直到12月29日晚上8点左右才开始工作,我意思是飞翔,就像我设想的那样。它飞了两个小时我才注意到。我一直在和市长交谈,抱怨事情,然后修复开始在我周围着陆,我意识到我只是通过交谈来塑造整个事情。车队在流动和着陆,工作在提交和审查...这是我几个月来一直瞄准的目标。我两天前才让它工作。足够发布了!- 联邦——即使是Python Gas Town也有对GCP上远程工作者的支持。我需要设计对联邦的支持,既为了扩展您自己城镇的容量,也为了链接和与其他人类城镇共享工作。
- GUI——我甚至没有时间制作Emacs UI,更不用说漂亮的Web UI。但有人应该完全制作一个,如果没有,我最终会做到。
- 插件——我没有机会在任何功能上实现插件作为分子步骤,但所有基础设施都已就位。
- Mol Mall——定义和塑造工作负载的分子的市场和交易所。
- 汉诺塔/MAKER——我想运行百万步的轻雾,但时间用完了。
- 自我交接无缝工作——Gas Town的核心内循环工作流
加上我们得到了一些酷功能,如`gt seance`。总而言之,17天工作的好成果。到目前为止。我和您一样筋疲力尽。这次聊天很有趣,但我必须回到Gas Town。还有更多内容。这只是尝鲜。我将发布更多关于Gas Town的博客、视频和内容。如果您想贡献,并且您足够疯狂地跳上乐队车,加入社区并开始发送讨论、GH问题和PRs!- 如果您不每天至少同时玩五个Claude Code,请不要使用Gas Town。
- 如果您身高超过4英尺,请不要使用Gas Town。我想在会议上令人印象深刻地耸立,像索伦一样。
Gas Town只有17天,至少这个版本,Go "端口"的Python Gas Town。过去两周见证了整个MEOW堆栈、轻雾、巡逻、车队、代理和身份作为Beads、群集作为Beads、角色作为Beads、"馈送作为信号"创新,以及精炼厂、执事和狗(自Python Gas Town以来)的添加。还有大量其他内容。17天,7.5万行代码,2000次提交。它终于在两天前起飞(GUPP开始工作)。这看起来是一个有趣的一年。我在十一月与Anthropic分享了Gas Town,至少是粗略草图。我想我吓到他们了。我从未见过一家公司变得如此保守,如此之快。但他们认为Beads太有主见了,所以我担心Gas Town将是一个放屁太远,正如他们所说。但我已经开始收到奇怪的报价,来自早期Gas Town谣言的人嗅探,付钱让我坐在家里做我自己:我可以在Beads和Gas Town上工作,只需要偶尔写一篇不错的博客文章或参加会议或研讨会。我现在有三个这样的报价。这几乎是超现实的。这让我想起我在Crunchyroll上看到的几集动漫,其中这只懒惰的熊猫找不到工作,整天向他开咖啡馆的北极熊朋友抱怨。然后有一天,他参观动物园,发现他们在熊猫展览中有广告招聘职位。所以他申请并接受了工作,白天坐在那里扮演熊猫,晚上回家。这太荒谬了。在我能找到"理解"的公司和团队之前,我不会回去工作。我厌倦了四处走动告诉人们未来,就在他们面前挥手,却不被相信。我宁愿坐在家里用我自己的双手创造未来。我实际上在我的财产上有六种竹子。我已经是熊猫了,享受着生命中的时光。如果您想帮助我,请联系!并感谢所有令人难以置信的Beads贡献者!下次见,更多[Gas Town](https://github.com/steveyegge/gastown)内容。新年快乐!Steve Yegge是一位拥有超过30年科技行业经验和40年编程经验的技术行业资深人士。他曾任职于Geoworks、亚马逊、谷歌、Grab和Sourcegraph等知名公司,在系统架构、软件工程和技术领导力方面有着丰富的经验。他以深刻的技术洞察力和直言不讳的写作风格而闻名,著有《咆哮的程序员》一书(人民邮电出版社,2014年)。他的博客文章经常引发行业内的广泛讨论和深度思考,被认为是技术思想领导力的重要声音。在过去的几年里,Yegge一直专注于AI辅助编程和开发工具的创新,先后推出了Beads和Gas Town等项目,探索软件开发的下一个前沿。- [《初级开发者的复仇》](https://sourcegraph.com/blog/revenge-of-the-junior-developer) - Steve Yegge对AI编程的早期思考
- [Beads项目](https://github.com/steveyegge/beads) - Git支持的轻量级问题跟踪器
- [Gas Town项目](https://github.com/steveyegge/gastown) - AI编码代理编排系统
🔗 原文链接:https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04