// SPDX-License-Identifier: Apache-2.0 // © 2026 Lutar, Stephen P. — SZL Holdings // ORCID: 0009-0001-0110-4173 // // Layer 6 — a11oy policy gate for LambdaMinMaxBounds (TH_L2) // // Policy rationale: // Λ_k lies in [0,1] with min=0 iff any axis=0 and max=1 iff all axes=1. // This gate validates that a submitted Λ score and axis vector satisfy the // min/max bound theorem, rejecting any score outside [0,1] or inconsistent // with the all-zero/all-one boundary conditions. // // Lean theorem cited: `lambdaMinMaxBounds` (TH_L2) // Lean file: Lutar/Bound.lean // Lean commit SHA: 1dca00032dfc9aa8559cc6c2e4b63192fcf52371 // Lean status: proven (2 sorrys in Lutar/Bound.lean — see architect report) // // References: // Zenodo: https://doi.org/10.5281/zenodo.20053148 export interface LambdaMinMaxBoundsGateConfig { /** Floating-point tolerance for boundary checks. Default: 1e-9. */ tolerance?: number; } export interface LambdaMinMaxBoundsGateOpts { lambdaScore: number; axisScores: number[]; } export interface LambdaMinMaxBoundsDecision { allow: boolean; rationale: string; formula: string; leanTheorem: string; leanFile: string; leanCommitSha: string; inRange: boolean; boundaryConsistent: boolean; hasZeroAxis: boolean; allOnesAxes: boolean; lambdaScore: number; } const LEAN_THEOREM = "lambdaMinMaxBounds"; const LEAN_FILE = "Lutar/Bound.lean"; const LEAN_COMMIT = "1dca00032dfc9aa8559cc6c2e4b63192fcf52371"; const DEFAULT_TOL = 1e-9; // ── Inline formula ──────────────────────────────────────────────────────────── // TH_L2: Λ_k ∈ [0,1]; min=0 ⟺ ∃i: x_i=0; max=1 ⟺ ∀i: x_i=1 export function lambdaMinMaxBoundsGate( config: LambdaMinMaxBoundsGateConfig = {} ): (opts: LambdaMinMaxBoundsGateOpts) => LambdaMinMaxBoundsDecision { const tolerance = config.tolerance ?? DEFAULT_TOL; return function gate(opts: LambdaMinMaxBoundsGateOpts): LambdaMinMaxBoundsDecision { const { lambdaScore, axisScores } = opts; if (!Number.isFinite(lambdaScore)) throw new Error(`LambdaMinMaxBoundsGate: lambdaScore must be finite`); if (!Array.isArray(axisScores) || axisScores.length === 0) throw new Error(`LambdaMinMaxBoundsGate: axisScores required`); const inRange = lambdaScore >= -tolerance && lambdaScore <= 1 + tolerance; const hasZeroAxis = axisScores.some(s => s <= tolerance); const allOnesAxes = axisScores.every(s => s >= 1 - tolerance); // Boundary consistency: if has zero axis → lambda ≈ 0; if all ones → lambda ≈ 1 const minBoundOk = !hasZeroAxis || lambdaScore <= tolerance; const maxBoundOk = !allOnesAxes || lambdaScore >= 1 - tolerance; const boundaryConsistent = minBoundOk && maxBoundOk; const allow = inRange && boundaryConsistent; const rationale = allow ? `LambdaMinMaxBounds (TH_L2): Λ=${lambdaScore.toFixed(6)} ∈ [0,1]; boundary consistent (zero=${hasZeroAxis}, ones=${allOnesAxes}). Passes. Lean: ${LEAN_THEOREM} @${LEAN_COMMIT.slice(0, 12)}` : !inRange ? `LambdaMinMaxBounds (TH_L2): Λ=${lambdaScore} outside [0,1]. Denied. Lean: ${LEAN_THEOREM} @${LEAN_COMMIT.slice(0, 12)}` : `LambdaMinMaxBounds (TH_L2): boundary inconsistency — zero axis=${hasZeroAxis} but Λ=${lambdaScore.toFixed(6)} not near 0. Denied. Lean: ${LEAN_THEOREM} @${LEAN_COMMIT.slice(0, 12)}`; return { allow, rationale, formula: "LambdaMinMaxBounds", leanTheorem: LEAN_THEOREM, leanFile: LEAN_FILE, leanCommitSha: LEAN_COMMIT, inRange, boundaryConsistent, hasZeroAxis, allOnesAxes, lambdaScore }; }; }