/** * **运维写下的 ask 一律自报为「显式 ask 规则」** —— 本仓所有 operator/治理面 `ask` 裁决的**唯一**铸造点。 * * ── 为什么存在(成因是一次真红,不是预防性设计)──────────────────────────────────────────────── * core 7.11.0 [ref] 给 allow 层加了**第二位成员**:一条被 `readOnlyShellVerdict` 证明只读的 shell 命令, * 在每一道收紧车道之后**直接放行**(`decisionReason:"read_only"`),没有分类器轮次、没有卡、没有 park。 * 它的消费谓词(`allowLayerMayClear`,与持久 allow 规则**同一只**)明写不会越过的几件事里,有一件是 * **显式 ask 规则**(`PermissionResult.matchedAskRule`)。 * * 而本仓的 operator 门此前铸的是**裸** `{action:"ask", message}` —— 一条「someone WROTE 了这条规则」的 * 事实,从来没有在裁决上说出口。于是 7.11.0 提货那一拍,`APPROVAL_REQUIRE=Bash` 的部署上 * `echo x` / `cd sub` / `grep -r … ` 这一类**全部静默自动执行**:运维亲手写下的「这只工具必须人批」被 * 一个自动层清掉了,而且**一声不响**(本仓 7.68.0 的四条 e2e 当场红,那是这条缺口的机器证据)。 * * ── 修法:一条规则,一个铸点 ──────────────────────────────────────────────────────────────── * core 的 `matchedAskRule` 顶注逐字给了自声明的授权与方向:「A policy self-declaring the member only ever * OPTS ITS OWN ask OUT of classifier auto-resolution (**tightening** — the false-claim direction is safe)」。 * 所以本仓把它做成**不变量**而不是补丁:凡是「运维/部署写下的声明产生的 ask」,一律经本函数铸,自带那条 * 声明的原文。于是**任何**自动放行层(今天的持久规则与只读判词,明天的第三位成员)都够不着它 —— 规则从 * 「每来一个新 allow 层就回来补一次名单」变成「运维写的 ask 不可被自动清除」这一句。 * * 🔴 **副作用是有意的、且方向只有一个**:带 `matchedAskRule` 的 ask 同时**退出 auto 模式分类器的自动 * 裁决**(core:「a person's standing "ask me each time" is not classifier hesitation」)。对 * `APPROVAL_NEVER_AUTO` 这是把一条**本来就漏**的缝补上(那张表的语义逐字是「always human」,而分类器 * 今天能替它答);对 `APPROVAL_REQUIRE` / `commandPolicy` 这是收紧一格 —— 与这两个旋钮的字面语义 * (「必须批准」)一致,且方向是 fail-closed。 * * 🔴 **谁不进这扇门**(逐条,判据在 core 的同一段顶注): * · **模式默认**的 ask(`task-settings.ts` 的 plan/default 档折叠)—— core 明写 `matchedAskRule` * 「never for a `defaultAction:"ask"` fallback(an unmatched call is default-closed posture, not a * per-call instruction)」;把姿态默认伪装成一条写下的规则会让分类器车道的资格判据整条失真。 * · **钩子**的 ask(`hooks/hook-runner.ts`)—— core 在钩子面**自己盖** `decisionReason:"hook"` * (`dist/core/gate-fold.js`),那是 `allowLayerMayClear` 的另一条独立豁免;本仓再盖一次是第二个写者。 * · **问答工具**(`deployment-governance.ts` 的 `AskUserQuestion`)—— core 的谓词把保留问答工具单列豁免。 */ import type { PermissionResult } from "@sema-agent/core"; /** * 铸一条**运维声明产生的** `ask`。 * * @param rule 产生这条 ask 的**声明原文**(进 `matchedAskRule`)。它是 gate 内部消费的机器位 —— * core 顶注逐字:「consumed inside the gate and deliberately NOT copied onto the park/approval-card * request」,所以它既不上 wire、也不进卡,写的必须是**真实的那条声明**而不是一句好看的话。 * @param message 给人看的那句话(照旧上卡)。 */ export declare function operatorAsk(rule: string, message: string): PermissionResult; //# sourceMappingURL=operator-ask.d.ts.map