/** * [ref] §3([ref] v2 §6 F4 的**残余采纳**)—— 默认 ON 的**休眠行审计**。 * * 🔴 这条审计存在的唯一理由:`PERMISSION_RULES_ENABLED` 的默认值在本车从 OFF 翻成 ON,而**旋钮翻转 * 与规则行的寿命是两条独立的时间线**。三张表自 [ref] 车二起就随中央 `ensureSchema` 建、并且从来没有被 * 清过,所以下面这两类部署在升级的那一刻会突然带着**既有**规则行开始放行: * · 曾经把旋钮开过一段时间又关掉的部署(行留在库里,只是没人读); * · 从旧库恢复/克隆出来的部署(行跟着数据一起来的)。 * 对运维来说,这是「我什么都没改,worker 却开始少问我了」——一次**放宽面**上的静默变化。审计做的事 * 很小但是承重:在启动日志里把它说出来,让「少问」是一条能被读到的因果,而不是一次玄学。 * * ── 三条判据,逐条有理由 ──────────────────────────────────────────────────────────────────────── * ① **店缺席 ⇒ 整条不上场**(零 I/O、零行)。店缺席包括:显式关旋钮、`local` 车道没接 File 店的旧 * 部署、以及压根没有 backend 的 env-only worker。没有店就没有行,谈不上唤醒。 * ② **零桶 ⇒ 不打行**。一条「0 条既有规则随默认 ON 激活」的行是纯噪音:它对读日志的人不传递任何 * 可行动的信息,却让真正有东西被唤醒的那一行变得不显眼。 * ③ **运维**显式**表过态(`PERMISSION_RULES_ENABLED` 被设成 true 或 false)⇒ 不打行**。那些行本来 * 就是活的(或者旋钮被显式关着、店根本没装配),默认值翻不翻转对它们零影响 —— 说「随默认 ON * 激活」是**假话**,而在启动日志里说假话比不说更坏。判据用 `permissionRulesEnabledExplicit` * (config.ts 与 `dbBackendExplicit` 同姿势),不是猜。 * * ── 失败方向 ──────────────────────────────────────────────────────────────────────────────────── * 数不出来(库抖动 / 文件读不了)⇒ **不拒启、也不编一个 0 出来**:返回 `undefined` + 一条 warn。 * 这是一条纯诊断面(它不参与任何放行/拒绝判决),所以它的降级方向是「安静地不知道」而不是「谎报 * 零」——`{ buckets: 0 }` 会被下游读成「确认没有休眠行」,那是把一次读失败伪装成一个结论。 * 因为它零判决,这条 fail-open 不属于 `docs/FAIL-OPEN-CENSUS.md` 的安全轴 P 类,故不占 `recordFailOpen` * 的标签;它的可见性由那条 warn 承担。 */ /** 审计只需要一只桶计数口——**刻意**不吃整个 `PermissionRuleStoreBundle`:诊断面对店的其余能力 * 一无所知也不该知道,窄口让测试能用四行 fixture 驱动真实现同一段代码。 */ export interface DormantRuleCounter { /** 库里已存在的规则**桶**(一只 owner 一只桶)数量。 */ countBuckets(): Promise; } export interface DormantRuleAuditCtx { /** 已装配的规则店束;`undefined` = 本部署没有规则店(判据 ①)。 */ stores: DormantRuleCounter | undefined; logger: { info(msg: string, meta?: unknown): void; warn?(msg: string, meta?: unknown): void; }; /** 运维是否**显式**设过 `PERMISSION_RULES_ENABLED`(判据 ③)。 */ explicit: boolean; } /** boot 期一次性调用。返回读数(`undefined` = 没店 / 数不出来),绝不抛。 */ export declare function auditDormantPermissionRules(ctx: DormantRuleAuditCtx): Promise<{ buckets: number; } | undefined>; //# sourceMappingURL=permission-rules-audit.d.ts.map