外观
18 · 确认制学习
Confirmation learning
一句话定位:同一操作在 Auto 档被你反复人工确认之后,第 N 次起自动放行——且放行前仍要过一次标准在线评审。默认关(learningEnabled: false),开了也只对「低危、非锁定类别、无熔丝命中」的窄域生效。
18.1 触发与计数:四挂点构造,单汇聚点记账
四个带倒计时的人工询问点是唯一的「学习素材」入口,但它们只构造上下文,不碰账本:
| 挂点 | 行号 | 场景 |
|---|---|---|
| LOW 升级 ESCALATE | index.ts:L2696 | 评审结论是 ask |
| MEDIUM 无 LLM | index.ts:L2709 | 本档未送审 |
| MEDIUM llmTakeover | index.ts:L2720 | 竞速 + 异步复审并行 |
| HIGH | index.ts:L2791 | 高风险倒计时 |
计数/清零/持久化单汇聚于 askHuman 内紧邻 pushHistory 的一段(index.ts:L2295-2312):竞速结案后由 approvalSource 产出诚实来源(L2236-2242),confirmActionFor(source) 定动作(learning.ts:L251-255)——human-allow→increment、human-deny→reset、其余一切来源 ignore;随后在 learningMutex 锁内 resetConfirmation / recordConfirm / persistLearning。其余六个 status-less 的转人路径(规则 human、humanOnly、类别 ask、manual、熔断等)不传 learnable,永不参与记账。learnableContextFor(index.ts:L1716-1767)是 learnable 的唯一生产者,熔丝判定在 learningFuseHit(index.ts:L1688-1707)。
18.2 插位安全性:硬拒不可被学习覆盖
learnAttempt 定义于 index.ts:L2331-2405,唯一调用行 L2587 位于决策序的策略层 DENY 终端(L2569-2579)之后。接线顺序本身就是安全论证:凡是静态引擎判死的东西根本走不到学习层;学习层能放行的,至多是本来就要弹窗问人的模糊区。
18.3 可学域双门 learnGateEligible learning.ts:L265-277
enabled ∧ staticRisk ∈ {LOW, MEDIUM} ← HIGH 永不学
∧ category 非 LOCKED 四类、非 unknown/harnessInternal
∧ 无 fuse(风险名/理由正则或敏感路径命中,index.ts:L1688-1707)18.4 签名机制 signatureFor learning.ts:L192-218
学的是确定性模板,不是命令原文:
- shell 类按词法分解逐段出模板:头命令 + 子命令字面量 + 排序去重后的旗标名 +
<in:path>/<out:path>槽位(segmentTemplate,learning.ts:L143-175);工具类是name(key:type,…)参数形状(toolTemplate,learning.ts:L177-185)。同输入恒同输出,模板零原始值。 - 双向剪裁:任一词 dynamic/glob/quoted、pwsh 冒号形参
-Param:、或头命令 ∈ {tee,dd,sed,truncate,install} ——任一命中整段即 undefined,整行不学也不中(learning.ts:L209);整行再过字符白名单与 ≤512 长度复检(L213)。含变量的命令既进不了账本,也匹配不了账本。 - 落盘骨架先过
redactSecrets(L197/L214)——账本里没有秘密。
18.5 存储:learning.json(六个运行态文件之一)
SHA-256(sigVersion|kind|workspace|signature) 作键(learning.ts:L221-223);条目 TTL 默认 30 天、全库上限 100 条、按 lastAt LRU 逐出(evictLearning,learning.ts:L305-315);同步 tmp+rename 原子替换(persistLearning,learning.ts:L339-347)。工作区隔离:查找要求条目的 workspace 与当前工作区精确相等(learning.ts:L401)——A 项目攒下的确认资格带不到 B 项目。细节样例见 §11.2。
18.6 消费闸:命中也要再过一次评审
learnDecision = gate ∧ cap ∧ lookup(learning.ts:L429-445)。命中后 learnAttempt 复用 reviewWithLLM 走标准在线评审——同超时预算、同重试机制(index.ts:L2368-2372);只要不是干净的 ALLOW,或评审结果带 CRITICAL 矛盾标记(reviewerAutoAllowBlocked),一律当未命中处理、滑回原风险分支(index.ts:L2375-2378)。真正放行时:会话内 cap+1(每根会话累计上限 50,learningSessionAllowCap,constants.ts:L26)、恰达帽值的那一次放行(第 50 次)落一条 learning-cap-reached 审计告警(index.ts:L2379-2383)、notifyUser 弹「✅ 已学习放行」提示(L2384-2386),history 记 source:'learned-allow'(L2387-2399)。到帽后学习层休眠(learningCapState,learning.ts:L408-410),全部回人工。
18.7 配置与失效语义
| 项 | 默认 | 说明 |
|---|---|---|
learningEnabled | false | 总开关,默认关是铁律:不开就没有任何行为差异 |
learningThreshold | 3 | 所需人工确认次数 N;保存钳入 [2,10](clampLearningThreshold,learning.ts:L231-242),越界由 resolveConfig 发 warn(index.ts:L255-262) |
设置卡「确认制学习」子卡两控件 + 七行说明文案(buildLearningBody client/index.ts:L1761-1782,注册 L1990;locale 中英各 12 键)。失效语义一句话:任何一环不成立——开关关、类别锁定、熔丝命中、条目过期/损坏/跨工作区、到帽、评审不干净——都视同未命中,回到原有的人工/LLM 分支。学习层只做减法路上的加速器,从不当裁判。