2026年8月23日 1 分钟阅读

不想把意图埋进聊天记录:用 Huzzah 把伪代码变成可追溯的 AI 生成实现

tinyash 0 条评论

AI 编码工具把「写出第一版」变得很快,但它也改变了代码库里最容易丢失的东西:人为什么要这样设计。一个长会话通常混着尝试、纠错、临时指令和最终决定;几周后再看生成代码,即使有 Git diff,也很难知道哪段自然语言才是真正的产品意图。

Huzzah 是一个仍在实验阶段的编辑器原型。它不试图让提示词更会聊天,而是把交互改成两份并存的工件:开发者编辑一份持久化伪代码,工具将它与 AI 生成的 JavaScript 实现同步。项目作者将这一方向概括为:传统 Agent 的提示词往往是长文本、命令式且会消失;Huzzah 则希望伪代码是简短、声明式且能保留下来的规格。

这不是又一门必须记忆语法的 DSL。官方示例强调「按自己习惯写伪代码」,重点在于:保存时只把规格的变更和当前实现交给模型,接受的生成代码则在浏览器的 Web Worker 中本地执行。它适合把需求意图从一次性的聊天框,提升为可随仓库演进的可读文件。

先分清它要解决的问题

普通 Agent 工作流也能在 prompt 中写伪代码,但通常会遇到三个问题。

第一,意图没有稳定落点。会话、上下文压缩和 IDE 历史都能帮助回溯,却不等于每个代码区域都有一份短小、当前有效的设计说明。提交信息记录的是「意图发生了什么变化」,而不是当前实现应该满足什么。

第二,修改表达成本会累积。人类为了协作会写大量礼貌、背景和修辞;模型需要的往往只是约束、状态、输入输出和规则。每次都用完整自然语言重述同一规则,不但冗长,也更容易在多轮对话里漂移。

第三,生成代码与设计断开。当团队成员想理解一段 AI 生成代码时,若只能翻聊天记录,就得猜从哪一轮开始读。Huzzah 选择把伪代码文件与当前生成的实现并列呈现,让设计讨论不必只依赖聊天记录。这种关系是否能在大型、多模块项目中长期保持清晰,仍是需要通过实际试点验证的问题。

从 FizzBuzz 看「保存即同步」

官方文章用 FizzBuzz 对比两种交互。传统方式要先写一段完整要求,再在下一轮说明「循环次数改为函数参数」。在 Huzzah 的思路里,先创建 fizz_buzz.hz,用接近算法结构的形式描述规则:

fizz_buzz(n)
    loop n
        modulo 3 ? "fizz"
        5 ? "buzz"
        both ? "fizz buzz"

修改需求时,直接把 loop 100 改成 loop n 并保存。Huzzah 会捕获规格 diff,并据此重新生成受影响的源码。这里值得注意的是,它并不承诺这段伪代码会被编译成确定结果;模型仍然参与解释和生成。因此它更像「人写的可版本控制意图 + 模型驱动的实现同步」,而不是传统编译器。

这种形式特别适合规则密集、且能用状态与操作清楚表达的局部功能,例如购物车、表单校验、排班器或限流器。伪代码文件可以把 add_itemremove_itemcheckout 这类行为与数据关系写在一起,比散落于多轮 prompt 中更容易在 code review 时讨论。

可复现地跑起原型

Huzzah 当前仓库要求 Node.js 22.19 或更高版本,并依赖 Pi 的模型提供商、凭据和模型配置。README 给出的最小启动路径如下:

git clone https://github.com/danielvaughn/hz.git
cd hz
npm install
npm run dev

开发服务器默认应运行在 http://localhost:5173。启动前还需要按 Pi 的方式完成认证:可以设置所选提供商支持的环境变量,或运行 npx --workspace=poc pi 后使用 /login 完成登录。不要把密钥写进规格文件或提交到仓库。

模型选择也不在 Huzzah 自己的独立配置中完成,而是读取 Pi 的 ~/.pi/agent/settings.json。例如 README 展示了 defaultProviderdefaultModel 两个字段。Pi 支持的自定义提供商和本地模型配置同样可以被复用;这意味着团队应先把模型访问、配额与凭据轮换当作 Pi 层面的运维问题,而不要把它误解成 Huzzah 提供了模型服务。

把它放进现有工程,而不是替换工程纪律

把规格文件持久化,并不意味着把伪代码当成唯一真相。对一个已有仓库,更可靠的做法是让它与测试、类型和代码审查各自承担不同职责:伪代码记录业务约束与状态转换;测试把可观察行为固定下来;实现负责性能、错误处理和集成细节;review 则确认这几者没有悄悄背离。Huzzah 目前是实验原型,尤其不应让一次模型生成绕过这些既有门槛。

一个可操作的试点可以从「折扣计算」这类纯函数开始。先在 .hz 文件里写清输入、优先级和不可同时叠加的规则,例如会员折扣是否先于满减、优惠券失效时返回什么状态。保存并接受生成的 JavaScript 后,立刻补上独立测试:正常订单、金额临界值、空购物车、重复券码和非法输入都应覆盖。若伪代码改了而测试没有改,或生成实现改变了边界行为,CI 应把它当成普通变更失败,而不是因为代码来自 AI 就降低要求。

在协作层面,建议把 .hz 与生成代码放在同一个变更中审查,而非把伪代码留在个人工作目录。reviewer 可以先读短规格,再读 diff,询问的重点也会更具体:规则是否遗漏?改动是否只影响受影响的函数?模型是否把声明式描述误解为某种 API 调用?这不能消除模型幻觉,却能把问题从「谁还记得那段 prompt」转成可在 Git 历史中讨论的工件。

也要控制提交粒度。一次只修改一个明确规则,接受生成结果前先查看 diff;不要把规格重写、依赖升级和大段自动生成代码混在同一个提交里。若结果不符合预期,应优先回退生成实现、保留可解释的规格修改,再用更小的变更重新尝试。这样即使最终决定不用 Huzzah,团队也仍保留了干净的提交历史与可运行的测试基线。

采用前必须保留的边界

Huzzah 的价值在于把「规格」拉回版本控制,而不是替你验证生成结果。官方 README 明确提醒:规格和当前生成源码会被发送给所选模型提供商;接受的 AI 生成 JavaScript 虽在本地 Web Worker 执行,但这只是实验性的隔离,不是针对恶意代码的安全沙箱。涉及生产密钥、客户数据或不可信依赖时,不能把它当作安全边界。

此外,作者也在文章中列出限制:它更适合新代码库;跨文件依赖、模块和目录级行为尚未经过充分验证;LSP 一类体验目前不可用。换句话说,别先拿它改一套成熟单体应用的核心认证链路。更稳妥的试点是选择一个可独立测试的前端小功能或纯业务规则,保留单元测试、类型检查和人工 review,再观察伪代码是否真的比聊天历史更便于维护。

仓库是公开的,但 GitHub 元数据当前未声明许可证;在许可证补齐前,不应把它称为已明确授权的开源组件,也不应直接把代码纳入有严格合规要求的产品。它目前更适合作为一种工作流实验:让人类把关键约束写得更短、更结构化,并把这份意图与 AI 生成实现一起保存。

结语:把 prompt 当成设计资产,而非一次性消耗品

Huzzah 最有启发性的地方不是替代自然语言,而是挑战了「prompt 用完就丢」的默认习惯。自然语言仍适合探索、解释模糊业务和和非技术成员协作;当需求已经足够清楚时,持久化伪代码可以成为更紧凑的共同语言。

如果团队正在被 Agent 会话碎片化、生成代码难以追责或重复重述约束困扰,可以从一个低风险模块开始试验:把真正需要长期维护的规则写进规格文件,让生成代码、测试和规格一起提交。即便最终不采用 Huzzah,这种把意图显式化、版本化、可审查化的做法,本身也值得保留。

相关链接

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。