// SPDX-License-Identifier: Apache-2.0 // © 2026 Lutar, Stephen P. — SZL Holdings // ORCID: 0009-0001-0110-4173 // // Layer 6 — a11oy policy gate for BekensteinSoundness (TH_L3) // // *** STAGED — ADVISORY ONLY *** // Lean status: measured/conjectured (formal proof pending lutar-lean PR #12) // // Policy rationale: // Bekenstein indicator fires at 49.5% under uniform seed (measured). // This gate validates that a submitted fire-rate measurement falls within // the expected range [45%, 55%] around the 49.5% measured value. // Advisory only until the Lean proof is formally discharged. // // Lean theorem cited: `bekensteinSoundness` (TH_L3) // Lean file: Lutar/BekensteinSoundness.lean (pending PR #12) // Lean commit SHA: 1dca00032dfc9aa8559cc6c2e4b63192fcf52371 // // References: // https://github.com/szl-holdings/lutar-lean (pending PR #12) export interface BekensteinSoundnessGateConfig { /** Expected fire rate center. Default: 0.495 (49.5%). */ expectedFireRate?: number; /** Acceptable deviation from expected rate. Default: 0.05. */ rateDeviation?: number; /** If true, block on violation. Default: false (advisory). */ enforced?: boolean; } export interface BekensteinSoundnessGateOpts { /** Measured fire rate (0..1). */ measuredFireRate: number; /** Sample size used to measure the rate. */ sampleSize: number; } export interface BekensteinSoundnessDecision { allow: boolean; rationale: string; formula: string; leanTheorem: string; leanFile: string; leanCommitSha: string; severity: 'advisory' | 'error'; staged: boolean; measuredFireRate: number; expectedFireRate: number; deviation: number; withinBand: boolean; lambdaScore: number; } const LEAN_THEOREM = "bekensteinSoundness"; const LEAN_FILE = "Lutar/BekensteinSoundness.lean"; const LEAN_COMMIT = "1dca00032dfc9aa8559cc6c2e4b63192fcf52371"; const DEFAULT_RATE = 0.495; const DEFAULT_DEVIATION = 0.05; export function bekensteinSoundnessGate( config: BekensteinSoundnessGateConfig = {} ): (opts: BekensteinSoundnessGateOpts) => BekensteinSoundnessDecision { const expectedFireRate = config.expectedFireRate ?? DEFAULT_RATE; const rateDeviation = config.rateDeviation ?? DEFAULT_DEVIATION; const enforced = config.enforced ?? false; return function gate(opts: BekensteinSoundnessGateOpts): BekensteinSoundnessDecision { const { measuredFireRate, sampleSize } = opts; if (!Number.isFinite(measuredFireRate) || measuredFireRate < 0 || measuredFireRate > 1) { throw new Error(`BekensteinSoundnessGate: measuredFireRate must be in [0,1]`); } if (!Number.isInteger(sampleSize) || sampleSize < 100) { throw new Error(`BekensteinSoundnessGate: sampleSize must be ≥ 100`); } const deviation = Math.abs(measuredFireRate - expectedFireRate); const withinBand = deviation <= rateDeviation; const severity = enforced ? 'error' as const : 'advisory' as const; const allow = withinBand || !enforced; const lambdaScore = withinBand ? 1 - deviation / rateDeviation * 0.5 : 0; const stagedNote = enforced ? '' : ' [STAGED-ADVISORY]'; const rationale = withinBand ? `BekensteinSoundness (TH_L3): rate=${(measuredFireRate*100).toFixed(1)}% within ±${(rateDeviation*100).toFixed(0)}% of ${(expectedFireRate*100).toFixed(1)}% (n=${sampleSize}).${stagedNote} Lean: ${LEAN_THEOREM} @${LEAN_COMMIT.slice(0, 12)}` : `BekensteinSoundness (TH_L3): rate=${(measuredFireRate*100).toFixed(1)}% deviation=${(deviation*100).toFixed(1)}% > band.${stagedNote} Lean: ${LEAN_THEOREM} @${LEAN_COMMIT.slice(0, 12)}`; return { allow, rationale, formula: "BekensteinSoundness", leanTheorem: LEAN_THEOREM, leanFile: LEAN_FILE, leanCommitSha: LEAN_COMMIT, severity, staged: !enforced, measuredFireRate, expectedFireRate, deviation, withinBand, lambdaScore }; }; }