为 AI 工作流设计明确的边界

我的工作方法:先定义决策,再把实现与验收分开,让不确定的结果明确可见。下面的实例区分自动执行的检查、需要人运行的检查,以及仍依赖判断的部分。

目标是让软件有用、可操作、可质疑,而不是为了流程增加流程。检查能降低特定风险,但不保证产品有用,也不保证推理正确。

方法笔记:前提、历史失败与适用边界

前提

这些前提是摊开写的,方便你不同意:

  1. A1一次新的模型调用,只能使用实际提供给它的上下文。

    对话历史、笔记和记忆工具可以延续之前的工作,前提是工作流把它们找出来并提供给模型。某条约定存放在某处,不代表它出现在下一次判断的上下文里。

  2. A2AI 产出改动的速度,可能超过我验证它们的速度。

    草稿可以很快出现,但理解影响、测试边界、判断它是否解决了正确的问题,仍需要工作。生成变快,不会让这些工作消失。

  3. A3错误有三种不对称的成本:犯错可能很便宜,发现它很贵,后续工作依赖它之后,修复还会更贵。

    这三种成本不只是大小不同,方向也不同。只优化最便宜的产出环节,可能把负担推给更昂贵的发现和修复环节。

由此推出

推出什么,以及每一条逼你做什么:

  1. T1检查能有多独立,取决于保护它的边界。 由 A1

    模型的自审不是独立验收证据。我还使用规则引擎、进程退出码和独立实现,但结果仍依赖检查本身及其配置:一次记录下来的探针,仅在读取行末增加注释,就使守卫失效,而它仍报告零违规。

  2. T2生成越快,验证越重要。 由 A2

    做出有用的产品仍然重要。在实现之外,我也投入精力定义怎样算完成、核查实际结果,并测试检查本身能否拒绝一个坏样例。

  3. T3检查点之间的间距,必须小于错误被垒上去的速度。 由 A3

    把便宜的检查放到靠近工具调用的位置,能在更多工作依赖错误之前发现它。但 hook 只看得见自己检查的操作:曾有两条 shell 单行命令穿过同一个 hook,文件也确实被写入。那条通道改用前后快照比较——这是检测,不是预防。

  4. T4意图需要一条执行路径,不只是一个存放文字的地方。 由 A1

    文档里的规则不会自己运行。能做成程序的地方,我为它配一项可执行检查。程序和配置也可能被改动或绕过,所以检查自身的输入与执行过程同样需要审查。

  5. T5没有可见信号的重复失败,可能在无人察觉时持续累积。 由 A3

    沉默不是信号,所以没有东西给它踩刹车。一个清理例程捕获输出,却不检查返回码。记录中的事故积累了 2,983 个泄漏工位(约 26 GB),再加约 60 GB 的 pytest 临时文件,共约 86 GB。现在即使没人盯着,失败也必须可见。

它解决不了的

它解决不了的 —— 是量出来的,不是预想的。这份清单早先有一版是动工之前写的,读起来更漂亮;下面这些是动工之后才冒出来的:

  • 检查能告诉你一个说法跟事实对不上。它没法告诉你这个说法背后的推理错了。说法本身依然是良构的,检查对它没有意见,而错误在检查看不见的地方。

    代价一个对根因的错误估计,在一块全绿的板子后面待了二十六个提交。打破僵局的是有人跑去把它量了一遍,而那不是一道关卡能被做成会去干的事。这是极限,不是缺口:诚实的回应是说清楚哪些结论靠的是判断,别再暗示机器把它们覆盖了。

  • 一个检查的覆盖范围,从它的结果上看不出来。凡是靠匹配文本找目标的检查,「什么都没匹配到」和「本来就没有可匹配的」会以同一个答案返回 —— 而它两种情况都报通过。

    代价八个检查一个一个审下来;六个有同一个缺陷,每一个都是手工复现的,不是靠推理认定的。改注释里的两个词,就能让一份超预算的文档悄悄合规。这比静默失败更糟,因为静默失败是沉默,而这个是一个绿勾。

  • 一个检查的开关,被它所检查的对象够得着。在一份受保护路径清单的某一行末尾加个注释,就让那条模式什么都匹配不上 —— 于是文件可以被改,而盯着这个文件的守卫报告零违规。一次编辑同时完成了越界和掩盖。

    代价所引用的历史记录中尚未解决;这里不宣称当前处理状态。拟议修复需要让每条模式匹配真实存在的目标,并明确声明有意为空的模式。修一半可能恢复信心,却没有恢复覆盖。

  • 2026 年 8 月 22 日的一次 nonconstant 历史审查,把二十九条协议规则分为:五条标为已机器化、十一条可实现但未完成、十二条属于判断边界,还有一条许可。其中甚至包含由人检查的要求。这记录的是当时阶段,不是今天已安装检查的数量,也不代表每项带标记的控制都会自动运行。

    代价公开这份分类,会暴露多少内容仍依赖判断或未完成的工作。后来的 README 在另一个注明日期的测量点记录了三十三条协议中五条有机器检查;协议规则与十道已登记的检查脚本,是不同的清单。

  • 把检查做得更硬,是在为一个还不存在的用户做优化,而且没有天然的停止点 —— 一套检查系统永远还能更健壮一点。

    代价连续七个工作时段整个投进了元工作,而那件真能产出一个用户的事,一寸没动。这件事本来有写下来的阈值:元工作超过百分之十五就触发一次清理。它跑在大约一百,而没有任何东西在检查这个阈值。那条「禁止不受检的规则」的规则,自己没有检查。

这些论述来自现已随 nonconstant 公开的工作笔记,也引用我的其他项目。Agent 参与了笔记撰写,其中的第一人称陈述不能自动当成我本人的观察。我的贡献是设计判断、验收标准与审查,也包括否定先前的结论。历史数字对应当时记录的阶段,不是当前总量。源码公开让主张可以核查,但不会自动证明主张正确。

公开检查与本地发布检查

使用 curl 和 SHA-256 工具,无需本站源码就能核对公开规则摘要。另外两条记录的是我在本站私有源码工作目录中运行的检查。

  • curl -s https://hh0hh.com/rules.json | sha256sum 计算公开规则表的哈希,与演示中的快照标识比较。它核对提供了哪一份规则字节,不证明规则或判定正确。
  • npm run release 在本站私有源码工作目录中,规则摘要过期、分享卡片过期或输出留有未解决的占位符会阻断发布;没有源码的访客无法直接运行此命令。
  • node scripts/check-placeholders.mjs --release 同样需要私有源码。这条单独运行占位符检查;记录中的负向探针曾把违规放回 dist/,确认它退出 1。

同一个动作,三次 —— 每次配一件仪器:

它们不是同一个标准执行的,所以每条自己标出来:

  • 已强制 在配置好的项目或主机里,检查由提交、CI 任务或工具调用触发;仍受各自注明的前提和覆盖范围限制。
  • 可运行 一条真会失败的真判据 —— 但得有人去敲那条命令。
  • 仅声明 在遵守,但没被检查。我要是停了,不会有任何东西变红。

项目证据与访问范围

nonconstant 的验证代码与设计笔记,以及 DevLoop 的历史源码已公开。Verdict 与 Terrarium 的源码仍为私有;下面关于它们的实例属于作者陈述,可结合本站公开演示和已记录证据查看。

执行主张需要可检查的记录

一个关于「跑过了」的说法,需要可检查的执行记录。记录仍可能不完整或被误读;关于检查的陈述,不能代替实际运行检查。

Verdict

规则引擎按契约是同步的。加 `async` 会让调用点在编译期就挂掉,pre-commit hook 拦下这次提交。 已强制

DevLoop

主机 hook 已注册且正常工作时,正则设置模式令牌,特定消耗额度的命令需要它才可执行。Hook 缺失或故障时,可能失效放行。 已强制

Terrarium

独立的 numpy 实现提供检查点与结构对照。它与引擎重复运行的指纹测试分开,不要求长期种群数完全一致。 可运行

这条规则出处的那篇文章,自己也得解决同一个问题:一篇反对相信机器自述的论证,材料几乎全部由机器自述组成。它里面每一条证据都标了级别 —— 机器事实,还是陈述。

守卫也被守

我信任的守卫和真能工作的守卫是两回事。在各项检查注明的范围内,刻意制造失败样例,有助于检验两者的差别。

Verdict

`build` 放在 hook 里面,因为曾经有一份报告说它在那儿通过了 —— 而那次提交的 hook 里根本没有 build 这一步。 已强制

DevLoop

一道关卡会数有多少检查真的跑了并通过。零个已验证的检查等于关卡坏了 —— 那是第三种结果,不是通过。 已强制

Terrarium

十个测试文件声明预期断言数量,并与实际执行数量比较,避免测试提前停止却因为没有打印失败而被当作通过。 可运行

一次记录中的探针没有施加成功预设的破坏,于是什么都没坏,绿色结果也没有证明拒绝能力。因此,我会检查预期的失败是否真的发生。这仍然不够:启动失败的探针同样退出非零。曾有一轮四个红检查,记录显示四个都是启动失败。

「我没查」永远不许渲染成「没问题」

没检查和检查干净,在你强行把它们掰开之前是同一个退出码。所以一个不说清自己跳过了什么的判定,本身就是一次假绿。

DevLoop

一份没有登记任何不可裁定条款的章程会拒绝加载。不是警告 —— 是配置错误,并在消息里给出理由。 已强制

Terrarium

不可裁定的条款是一张表,每一次判定都带一句「另有 N 条未覆盖」的尾巴。给它们编一个启发式规则是明令禁止的。 可运行

这个站

评测条件一行只在模型、温度、prompt 版本和运行次数齐备时渲染。分数本身另行显示;这检查的是元数据存在,不是真实性。 已强制

Verdict 有一份书面的对应物:一份列出它的自动化无法验证什么的清单 —— 监管语义、模型升级之后的 prompt 遵循度、手工提交进去的凭据。

干活的那个,不提供评判它的东西

「读了这道关卡」和「打算绕过这道关卡」逐字节看是一样的,所以在管用的地方,答案是让绕行本身失效,而不是去检测意图。在不管用的地方 —— 任何走守卫看不见的路径碰到文件系统的东西 —— 诚实的退路是检测,而说出这一点,比假装守卫是个密封盒子要便宜。

DevLoop

关卡从工作树之外一份带指纹的副本里跑。重建缓存,在干净检出上验收,用来标识被测试的版本,而不是保证它正确。 已强制

Verdict

审查配置声明只读工具集。实际执行限制依赖宿主配置;这项声明不是安全沙箱,也不证明执行隔离。 仅声明

Terrarium

测试与答案键被视为受保护的判据。更改基线需要审查:改写答案键仍能产生看似正常的分数。这不是文件系统隔离。 可运行

每一个结论都带着它的适用范围一起发

一个不带范围的结果不是结果。它覆盖什么、明确不覆盖什么、什么证据能推翻它 —— 而一个离它的主张还有一次点击的限定语,不算限定语。

Terrarium

每条裁决四个字段:覆盖什么、不覆盖什么、依据、什么能推翻它。后两个才是干活的。 仅声明

Verdict

同一组文档的两次记录运行出现差异。我把固定已校验输入上的规则计算与模型提取分开;这两次运行没有建立端到端可重复性的证据。 仅声明

这个站

账目里的一行可以陈述一个机制,但绝不放分数,因为一个分数需要它的标记、范围说明和局限一起挨着,而一行里三样都放不下。 仅声明

我先给自己开单

更正照发,哪怕它把标题结果变得更难看;而一个不明的原因就写成不明,不给它编一个。

DevLoop

一个一行的去重 bug 让输出 token 差了 30 倍。这次更正把我自己的标题结果从赢变成了输。它照发了。 仅声明

这个站

这一页曾经在源码里印过一个规则 ID、一个哈希和一个 PASS。三样都是编的。现在它是一个你可以自己重算的摘要。 已强制

Terrarium

一次 20 倍的提速被归档为「否决」:更快,但不是同一个世界。错误的历史划掉,从不删除。 仅声明

Verdict 保留着一节叫「明确没有做的部分」,列出那些界面存在、后端不存在的功能 —— 包括一个 demo 最容易糊弄过去的那一个。

← 返回站点