问题
你在做一个代码评审机器人。每次有人提交,它读一遍 diff(这次改动的那几行),判断有没有违反团队的规范。你给它配了一个数:超过 0.5 就挡住合并。
第一个撞上它的同事,一次评审收到十四条阻断评论,其中十二条是错的。他照样合了代码,把机器人在自己仓库里关掉,还劝别人别装。
你想到的第一个修法是把线抬到 0.9。噪音确实没了,别的也一起没了:那两处真的违反规范的改动,概率是 0.62,现在机器人对它们也一声不吭。一条线要么吵,要么哑,它没法「小心」。
真正的毛病在于:你的机器人能做三件事——自己改掉、留一句话给人看、什么也不说——而一条线永远只能在其中两件之间挑。
解决方案
信号灯模式说:先数清楚你到底有几个动作,再从重到轻,每个动作配一条线。把动作清单老老实实写下来——自己改、提一句、不出声——因为决定的形状是这张清单,不是模型。
最难收回的动作配最高的线。这个示意策略把改代码的线放在 0.8、评论放在 0.5;两个数字都不能证明错误率可接受。先用带标签的调参样本选线,再用独立验证样本检查它是否适合自己的任务和模型版本。最低那条线以下的一律落到「什么也不做」,而「什么也不做」同样是一个决定,同样该被计数。
把这几条线放在一起,别散在代码各处的 if 里。哪天有人说机器人太吵,你想动的是一个数,而且想一眼看清跟着它动的都有什么。
问 · 答 · 拍
- 问把改动的那几行和一条团队规范放进去,问它:这次改动违反这条规范吗?
- 答0.83。
- 拍过了最高那条线,机器人自己把代码改掉。要是回来的是 0.62,它只会留一句话;0.30 就什么也不说。
名字从哪来
一个路口只有一盏灯,就只有两种状态,司机不是猛冲就是急刹。黄灯是专门为中间那种情况留的:慢下来看一眼。你的中间那一档就是黄灯——而且跟真的黄灯一样,得真有人在看,它才有用。
什么时候用
你手上确实有三个以上代价不同的动作:自动改掉、交给人看、放过去。
什么时候别用
你只有两个动作。别为了凑出档位发明一个中间动作:没人负责看的那一档,会悄悄变成「什么也不做」,而且几个月都没人发现。
做这件事的项目
- abide — 用 Jev 强制编码代理遵守项目规则。
- jev-axi — 为 TypeSafe 的 Jev 提供的 CLI:从 shell 快速获得校准判断。
- jev-review — 由 Jev 把关的分阶段代码审查工作流与本地仪表盘。
看谁的代码
- abide
packages/cli/src/lib/band.ts:48-49两条线 0.8 和 0.5,把一个概率分成三种处理:自己改、标出来给人看、什么也不做。
- jev-axi
src/safety.ts:238-261守在命令执行前面的一道门:0.8 拒绝、0.45 追问、再低就放行;轻一点的那类问题还要损失够大才升级。
- jev-review
src/domain/config.ts:5-17三个数写在一个小配置文件里:0.7、1.5、2,决定一条发现是被丢掉、送去人工,还是直接挡住合并。
想看代码
const TIERS = [[0.8, "fix"], [0.5, "comment"]]; // 示意阈值,使用前需本域验证
function route(p) {
for (const [line, action] of TIERS) if (p >= line) return action;
return "quiet";
}
switch (route(answers.violation.p)) {
case "fix": return rewrite(edit); // 不问人,自己改
case "comment": return mention(edit); // 占一个人十秒钟
default: return count("quiet"); // 什么也不做,这也是一个决定,要数
}jevbooks 怎么认出它
我们怎么知道一个项目用没用这一招?拿它的 README 问 Jev 一句话,Jev 给个百分比,数字越高说明越像。你要抄这道题,记住一点:别问「这个项目好不好」,要问「有没有讲到这一件具体的事」。
{
"tiered-thresholds": {
"type": "noul",
"instructions": {
"what": "Does the text describe two or more probability cut-offs mapping to different actions, such as act / flag / clear or deny / ask / allow?",
"not_for": "A single yes-or-no threshold at 0.5."
},
"criteria": {
"true": "The text explicitly describes this. One sentence is enough; other content does not cancel it.",
"false": "The text does not describe this."
}
}
}