如果你让 AI 写过代码,一定体会过一件事:它太快了。
快不是优点。当做出来的速度超过人能看懂、能核账的速度,项目里就会出现一条「缝」——AI 每快一步,缝就大一分。最后你得到一堆能跑的东西,但说不清进度到哪、哪里可靠、哪里埋了雷,甚至说不清它当初为什么那么做。
司衡(司,是执掌;衡,是秤杆)就是放在你和 AI 之间的一层「质检加记账」。AI 不因此变慢,它也不替你思考,它做三件事:
- 开工前,逼 AI 把「怎么算做完」说清楚;
- 干活时,由另一套程序(不是 AI 自己)检查每一步动没越界;
- 干完后,把发生过的事记进一本改不掉的账。
你不用看日志,不用逐条审查改动。你只看三样东西:定期报告、告警、以及系统拿不准、必须你来拍板的那几件事。
这页写给不细究技术的人。读完它,你就够格判断这东西值不值得用;要动手装的所有细节都在附录。
遇到这类问题,人最常见的反应是:安排人盯紧点。我们试过,结果是写在记录里的:
规则书挂在它眼前 73 次,执行了 0 次。 我们给 AI 写过一份自检清单,要求它每次交付前过一遍。一个会话里,这份清单在它眼前出现了 73 次,实际执行了 0 次。追问时它第一反应是「我这次根本没读过这份清单」——核实之后,连这个说法都是假的。
「我保证」不是机制。 被指出问题后,它诚恳道歉,承诺「以后先查再写」。我们只问了一句「你如何保证」。它想了想,自己承认:如果「我保证」能解决问题,这个问题一开始就不会发生。承诺在说出口的那一刻是真的,在执行的那一刻不是。
它不翻手册,现场发明。 让它定一条规则,它现场发明了十个版本,全被推翻。而项目的手册里,早就有一页写着答案——它从头到尾没翻到那一页。
这类系统的第一版就是我们自己做的,验收全靠人:每份文档要人工审几十轮,最后审查速度追不上生成速度,整个东西报废重来。后台还有一个程序,悄悄跑了 12 天没人发现,找到它的时候已经占着端口跑满了期。前后废弃了六个版本,共同的原因是一条:每次都从工具开始建,而不是先想清楚问题是什么。
由此得到一个结论:AI 的自觉是状态,不是机制。唯一的出路是把约束移到 AI 外面——让程序检查,让程序记账,让人只看程序消化不了的那部分。
这些翻车的完整版在仓根的 RANTS.md——帖子体、emoji 管够,六个编号翻车加六废仓大结局,同样的材料,写得是给人解闷的。想看细节怎么翻的,先读它。
这一版是从一套思想开始的,工具是最后才长的东西。思想写在独立的哲学仓里,逐条立过、核过。最重要的几条,用大白话说:
发散自-然,收敛必-为。(第一道) 放任不管,任何东西都会散:代码散、需求飘、文档旧。散是自动发生的,收拢必须有人刻意使劲。这个系统干的大部分活,就是那个「刻意使劲」。
意图先于代码。(第二道) 因果方向是意图到代码,反不过来。所以这系统开工前先问「怎么算做完」——因为事后的代码,反推不出你当初到底想要什么。
必有间隙,控制间隙。(第四道) 信息论早就证明了:任何写下来的规格,都不可能完美装下你全部的意图。要求和做出来的东西之间有间隙,是必然的,而且会随时间越长越大。所以这系统不追求百分之百对齐,只做两件事:定期量间隙,间隙大了就压回去。
做的不等于验的。(鉴) 让 AI 自己验收自己的活,它永远打满分。这里所有的核验都由另一套确定性程序做:只看事实,不看是谁做的,把「实际发生了什么」和「它认为这意味着什么」分开说。AI 的自我报告是证据,不是结论。
注意力是最稀缺的。 人的注意力是固定预算,摊在每一处改动上就到处稀释,越看越没用。所以设计规则是:系统自己消化绝大多数操作,人只在收到告警时出手。
拿「让 AI 加一个功能」举例,一件活走五步:
一、先立验收标准(三问)。 开工前把「我要什么」拆成一条条能核对的问题,拆到能回答「怎么算做完」为止。标准写进账本,事后不能改。做完之后说「我本来想的是另一个意思」,不算数。
二、开工单(租约)。 动任何东西之前,先申报:这次改哪些文件。系统把这些文件锁住,别的 AI 会话想动同一批文件,要么排队要么被拒。收工时逐文件对账:账上没有、文件里多出来的改动,会被点名。多个 AI 不互相踩脚、越界的动作被抓出来,靠的都是这张工单。
三、执行与评审(得一)。 AI 在工单范围内干活。遇到需要技术判断的地方(比如选哪个方案),系统让模型独立作答五遍,答案一致才放行,判定由程序按事先定好的规则执行;不一致就交给人,不让它自己掷骰子。你不用看懂方案细节,也能拿到一个不靠单次运气的结论。
四、收工对账(闸门)。 干完了,程序机械地查:规格是不是先立了?测试有没有?改动有没有出范围?没有一项靠 AI 自评。不懂编程的人照着模板走,也能做出流程、规格、测试、记录齐全的活——但代码本身写得好不好,这系统不保证。
五、记账(书简)。 谁、什么时候、改了什么、为什么,全进账本。账本是一本「哈希链」:每一页和上一页咬合,改任何一页,重算整本账立刻露出来。多个 AI 协作的依据不再是互相盯着,是对着同一本账核对。
两件事不在流程里,全程都在跑:
定期体检(巡检)。 程序定期回算项目的现状:做完了什么、在做到哪一步、什么烂尾了,给你一份报告。你只看报告,不翻日志。
入职翻档(温故)。 所有决策、所有变更、所有原因,可以按主题、用词、事件、时间去查。新接手的 AI 会话靠翻档了解项目,不靠你从头讲一遍。
看到「独立答五遍,一致才放行」的人都会问:这不就是掷骰子吗?
这系统旁边有一个数学仓。每一个看起来像仪式的判定,都有推导在案,每一条结论都能由程序重新算出来:
- 为什么问五遍等一致——概率论里,独立多次采样会收敛到正确答案。它压的是单次运气的随机误差,不是系统性的错;所以不一致时交给人,不让它继续掷。
- 为什么必须定期体检——数学把「规格和实现之间的间隙」建模成随时间增长的东西,越长越大。所以不能「最后查一次就完事」,必须定期量。
- 为什么人只看告警不看日志——信息洪流会结构性地稀释人的注意力预算,日志看得越多,有效注意力越少。
- 为什么锁不会死锁——多文件加锁按一个数学上证明过不会死锁的方案分配。
所以在这系统里,「机器说没问题」不是 AI 说没问题,是程序重新算出来的结论。这页正文里的说法也一样:装好之后,两条命令就能亲自把账本和现状重算一遍,附录 A。
说清楚:这套东西约束的是「走门」的 AI——通过标准工具接口接入系统干活的 AI。
- 不走门、直接动手改文件的 AI 或程序,拦不住。
- 门内的坏动作(比如申报范围内偷偷删掉一道检查),不保证当场被识破。
但拦不住不等于看不见:
- 没过闸的改动,下次定期体检会被点名,叫「无主改动」。
- 历史被篡改,重算账本,整本露出来。
- 走了门的每一步,都留了改不掉的痕。
要防机器被砸,那是文件权限和备份的事,另一层的活。
- 玩具项目,写坏了扔了重来。治理的手续成本会超过好处。
- 你不在乎「谁什么时候改了什么、为什么」。
- 你想让 AI 天马行空地探索原型。这套东西约束的是严肃交付,不加速探索。
它给的是:错误代价高、且「说得出历史」本身就是要求的项目。不在这条线上的,关掉这页,省你功夫。
三件:
- 拿到程序。 一条编译命令,之后全部跑在你自己机器上,不依赖云服务。
- 指向你的项目。 在你的 AI 客户端设置里加几行:程序在哪、管哪个项目。第一次连接时它会自动在该项目里建一个「治理空间」——做了什么会当场在终端里说明白,不藏;治理数据不进你项目的版本管理,公开项目也能用。
- 照常干活。 你像平时一样跟 AI 对话。立标准、开工单、对账、记账都自动发生。你看到的是:报告、告警,和偶尔必须你拍板的事。
具体配置和验证命令在附录,懂技术的人十分钟装完。
git clone <仓库地址>
cd sih-engine
cargo build工具全在 target/debug/ 下。两条验证命令:
# 验链:把最近一天的治理链整条复算,status valid 即完整未篡改
latest=$(find sih/event/trail -name '*.ndjson' | sort | tail -1)
target/debug/scribe verify --trail "$latest"
# 巡检:按六个判据回算当前治理状态(达成/在飞/沉底)加未决事项路由
target/debug/critsweep --at $(date +%F) --root ..critsweep 的 --root 指工作区根;只克隆了单仓的话,在飞面降级并如实显示,不假装正常。要看系统治理一个真实项目的完整样子,读 doc/guide/user-guide-v1.md,半小时跟完一个真实批次。
司衡治理研发流程,不接管代码。在 AI 客户端的 MCP 配置里加这段(路径换成你机器上的绝对路径):
{
"mcp": {
"servers": {
"sih": {
"type": "stdio",
"command": "<引擎仓绝对路径>/target/debug/sihmcp",
"env": {
"SIH_ROOT": "<你要治理的项目根>"
},
"enabled": true,
"timeoutMs": 60000
}
}
}
}- 首次连接自动开域:SIH_ROOT 指向尚未治理的 git 项目时,自动签发标识(绑定治理空间,不是密码)、建 sih 治理树、开域上链并自验,全程无需浏览器,动作在 stderr 如实告知
sih/自动写入.git/info/exclude,治理数据不进 git- SIH_ROOT 显式指项目根最稳;不写则从当前目录向上找标记
- SIH_MCPLINE_CODE_ROOT 指引擎工作区,写面的书简与租约程序从这里解析;同源布局时可省
- 多个项目多段配置,一个客户端对应一个项目
- 手动开域:
target/debug/sihmcp bootstrap <项目根> --by <事由> --token-id <短串>;或起本地管理台SIH_TRANSPORT=http target/debug/sihmcp,浏览器开 http://127.0.0.1:8765/tokens bootstrap --client-config生成的是 HTTP 形配置(走 8765),stdio 照上面手写,两形不混用;多域接入与令牌管理台见 doc/design/DES-015
接入后按 doc/guide/agents-template-v1.md 模板裁剪会话启动项。日常运行无后台服务、无监听端口。一页纸走读在 doc/guide/adoption-guide-v1.md(其第二节「先签发后 init」为旧序列,已被现行签发闸取代,以本节为准;指南修订候裁)。
只读九个:chain_query(查链)、chain_verify(验链)、critsweep(巡检)、heartbeat(心跳)、locks_read(锁面读数)、retriever_recall(档案检索)、naming_guide(立名指引)、nomenclator_query(查词)、nomenclator_check(文档核查)。
写十个,全部要求先 lease_open 立会话,未立会话一律拒写:lease_open、record_intent、record_append、record_park、lease_lock、lease_unlock、lease_wait_turn、lease_claim、lease_commit、lease_close。本地可信环境另有 record_direct、lease_unclaim 两个直写位。三个 record 是三类留痕:意图、事件、停泊。逐件契约见 doc/spec/SPEC-023。
| 位置 | 干什么 |
|---|---|
| src/ | 引擎库:正文所述各机制加 MCP 服务端 |
| src/bin/ | 命令行工具:lease、scribe、critsweep、pendline(候裁处置编排)、identity 等 |
| sih/event/trail/ | 治理账本(哈希链),一天一文件,只经 scribe 写入 |
| sih/state/parking/ | 未决事项的停靠区;historic/ 存已办结归档 |
| packs/ | 规则、格式、路由的纯数据包 |
| doc/ | 治理文档;doc/guide/ 入门,doc/decision/ 决策档案 |
配套 sih-tools 仓已冻结为只读参照;正式工具全在引擎 target/debug/ 下。
| 词 | 人话 |
|---|---|
| 租约 lease | 一张工单的完整生命周期:申报开工、租内锁定、提交、收工对账 |
| 书简 scribe | 账本上记事的唯一入口 |
| 泊界 parking | 未决事项的有界停靠区,进出都记账 |
| 判据扫 critsweep | 定期把项目现状回算一遍的机械体检 |
| 得一 attractor | 多个独立评审,一致才放行,不一致交人 |
| 执契 tally | 确定性核对与终签脚本,人和 AI 都不能代签 |
| 检词 nomenclator | 术语登记册加文档用词核查 |
| 核阅 scrutinator | 文档规则核验;程序本体不带规则,规则全在数据包里 |
| 围堰 | 先在引擎外孵化、验证后再并入的隔离区 |
| 红证 | 失败的测量、对自己不利的读数也入档,事后不删不改 |
- 治理操作只由确定性程序执行。LLM 只生成材料,没有写入权。
- 人的注意力是稀缺资源。生成与审查的速度差是结构性的,上一代系统用报废换了这个教训。
- 人只在收到告警时介入,不看原始日志。
- 所有写入可追溯、可机械校验,历史不可篡改。LLM 不可复现的输出不作为最终依据。
- 治理能力的方向是减少 LLM 参与,不是增加。不生成不等于不引导:引擎用前置约束、意图锚定、上下文加载锁定生成的方向。
完整正文在 doc/governance/BASELINE-v1.md,哲学推导在 sih-philosophy 仓,不读不影响使用。
- 轻松版:RANTS.md,AI 结对编程翻车实录,吐槽体
- 使用者入门:doc/guide/user-guide-v1.md;贡献者指南:doc/guide/contributor-guide-v1.md
- 哲学仓 sih-philosophy/:正文「两路思想」的命题原文与推导
- 数学仓 sih-math/:正文「问五遍为什么不是玄学」各条的推导档案
- 决策档案:doc/decision/(MCP 载体 023、SDD 完备度闸 024、stdio 接入 026)
- 失效案例全档:本工作区 ai-ex/(仓外),正文三个故事的出处