半夜三点醒过来,客厅那盏灯还亮着,是我睡前忘了关。回电脑前坐下,屏幕上是个别人丢过来的仓库,名字叫 lights-on software factory,直译过来是“常亮的软件工厂”,一套给 Claude Code 用的起始模板。两盏灯就这么隔着半个夜对看了一眼,我一时没分清哪个更荒唐。
仓库不大,77 个 star,8 次 fork,8 次提交,MIT,作者把自己给 Votito 搭的那套环境收拾收拾扔了出来。这个体量我反而信得过;那种一上来就宣称自己是一套方法论、主页比代码还长的仓库,我这些年躲得比谁都远。说明里最老实的一句是,附带的计划与实现流程只用来示范格式,请换成你自己的。肯这么写的人,多半是真在项目里跑过,不是在写论文。
真正让我坐着没动的是那个 regulator,一段用 bash 写死的命令监管器,把 Claude 每次要执行的命令拆开来看,该放的放,该拦的拦,拦下的时候还告诉你另一条路怎么走。
妙就妙在它不是另一个更聪明的模型,是一段没有想象力的脚本。
我们这一行有些人有个改不掉的习惯,机器不听话就再套一层更聪明的机器上去,套到后来谁也说不清哪一层在替谁做决定。这个仓库反着来,把能交给正则和判断语句的部分从模型的脑子里搬出来,搬回命令行。多智能体编排里最机械的那一段,也就是把实现计划拆成工作流脚本、再配好关卡和测试的那一段,作者干脆写了个确定性的生成器,不让模型现编。理由给得很直白,机械的活交给工具,快,也省。我觉得还有半句他没写:有些事本来就不该拿去问一个模型。这是一种分寸感,知道哪一部分该让机器想,哪一部分让它照着规矩走;这个分寸如今很少有人愿意落在代码里,因为写规则费事,而让模型自由发挥看起来更像未来。
同一份文档里还有一句,我读了两遍:Claude 每次请求审批的时候,就让它把这个场景补成一条自定义规则。这话平常得像贴在冰箱上的便条,说的是把一次性的点头,攒成以后不用再点的规矩。
然后我就有点坐不住了。这半年我在多少个夜里点过允许,同一个删文件的命令批准过大概四十次,同一条 curl 批准过二十次,一次也没想过把它写成规则。我一直以为自己是在用 AI,那个瞬间忽然发现,我是在给它当门房,一遍一遍核对同一张访客名单。
lint 那一环更让我停了一会儿。PostToolUse 钩子,Claude 每动完一个 JavaScript 文件就跑一遍 lint,错了就把错误提示喂回去让它自己改。作者顺带建议,那些重复出现的设计意见、评审意见,别再一遍遍说了,写成 lint 规则。这话本身不新鲜,一句话说三遍就该变成规矩,这道理讲了很多年。变的是规矩的读者,从前这条规矩念给一个人听,现在念给一个会照着错误提示改自己的东西听。
有一点点说不上来的东西在里面。从前新人写错了,你把他叫过来讲两句,他点头,那两句话里一半是规矩,另一半是你看他神色临时加减的分量。现在规矩还是那些规矩,临时加减的那部分没有了。不,这么说不准确,那部分没有被抹掉,它只是被提前到了写规则的那一刻,之后就固定在那儿,不再随人呼吸。
容器那段我不多写,Dockerfile 在 vm/ 底下,Alpine,装了 node、make、git,宿主机只把 workspace 递进去。这套做法如今算是常识,值得说的只有一句,边界画得比很多正经项目干净;一道门,门里全归它,门外一概不碰。makefile 里那几个目标排成一列,init、claude、shell、test、lint,像走廊上一排门,我挨个推开看了一眼,workspace/.claude 底下还躺着三个子代理和四个自定义命令,名字起得规规矩矩。
幻灯片我存了书签没点开,上个月哥本哈根那场我也没去。这个岁数了,知道有些 PDF 一打开就是两个钟头,而我今晚只想知道那盏灯是谁留的。
天快亮的时候我把仓库拉下来,make init 跑完,workspace 里躺着一个 format-greeting.js 和它的测试,规规矩矩等着我换成自己的东西。所有模板的命运大概都这样,作者把格式摆好,空缺留着,谁用谁填。
我起身去关客厅的灯。黑下来的一瞬间,屏幕的余光还印在墙上。我站在那儿想,明晚多半还是这样,还是会点四十次允许,还是想不起来该把哪一次写成规则。这个岁数,改不掉的东西总比改得掉的多,好在还知道该改哪一样。
