/** * delayed_choice_closure.ts * * Runtime instillation of Lean theorem: * Lutar.Wheeler (DelayedChoiceClosure module) * File: Lutar/Wheeler/DelayedChoiceClosure.lean * Commit: c4d13795689601324fce0236351bfe0ade990a43 * * Lean theorems formalised here: * - `delayed_choice_idempotent` (line ~100): closing label twice yields same label. * - `wheeler_window_safety` (line ~111): late receipts → Bot (past-immutable). * - `wheeler_window_admits_zero_offset` (line ~121): receipt at span end is admissible. * - `wheeler_window_admits_max_offset` (line ~130): receipt at span end + W is admissible. * - `early_receipt_rejected` (line ~139): pre-span receipts are inadmissible. * - `wrong_span_rejected` (line ~148): wrong span ID → inadmissible. * * Runtime contract: * Given a span (id, start, endAt) and a receipt (span, closeAt, label), * determine admissibility within the Wheeler window W=1000 ticks. * Return the closed doctrine label (or Bot for inadmissible receipts). * * Citations (from Lean file): * - Wheeler (1978) — delayed-choice double-slit experiment * - Jacques et al. (2007) DOI 10.1126/science.1136303 * - Manning et al. (2015) DOI 10.1038/nphys3343 * * Doctrine v7: No new axioms. No sorries. STAGED label: FULLY WIRED. */ import { createHash } from "crypto"; // --------------------------------------------------------------------------- // Domain types — mirrors Lean types // --------------------------------------------------------------------------- /** Doctrine label — 4-level lattice. Mirrors Lean `DoctrineLabel`. */ export type DoctrineLabel = "Bot" | "L1" | "L2" | "Top"; /** Mirrors Lean `Span`. */ export interface Span { id: number; start: number; // Tick (TAI64N abstract) endAt: number; } /** Mirrors Lean `Receipt`. */ export interface WheelerReceipt { span: number; // SpanId closeAt: number; // Tick label: DoctrineLabel; } /** DSSE-shaped receipt. */ export interface DSSEReceipt { theorem: string; lean_commit_sha: string; inputs_hash: string; output: DoctrineLabel; ts: string; sig: string; } export type Signer = (payload: string) => string; // --------------------------------------------------------------------------- // Constants // --------------------------------------------------------------------------- /** Wheeler window size in abstract ticks. Mirrors Lean `W : Tick := 1000`. */ export const WHEELER_WINDOW = 1000; const LEAN_THEOREM = "Lutar.Wheeler.delayed_choice_idempotent"; const LEAN_FILE_LINE = "Lutar/Wheeler/DelayedChoiceClosure.lean:100"; const LEAN_COMMIT_SHA = "c4d13795689601324fce0236351bfe0ade990a43"; // --------------------------------------------------------------------------- // Core functions — mirror Lean definitions // --------------------------------------------------------------------------- /** * Determines whether a receipt is admissible for a span. * * Mirrors Lean: * `def admissible (s : Span) (r : Receipt) : Prop := * r.span = s.id ∧ s.endAt ≤ r.closeAt ∧ r.closeAt ≤ s.endAt + W` * * Lean theorem `early_receipt_rejected` proves pre-span receipts fail. * Lean theorem `wrong_span_rejected` proves wrong-span receipts fail. * Lean theorem `wheeler_window_safety` proves late receipts are rejected. * * @param span - The execution span. * @param receipt - The candidate receipt. * @returns true iff the receipt is admissible. */ export function admissible(span: Span, receipt: WheelerReceipt): boolean { return ( receipt.span === span.id && span.endAt <= receipt.closeAt && receipt.closeAt <= span.endAt + WHEELER_WINDOW ); } /** * Computes the closed doctrine label for a span given a receipt. * * Mirrors Lean: * `def closeLabel (s : Span) (r : Receipt) : DoctrineLabel := * if admissible s r then r.label else DoctrineLabel.Bot` * * Lean theorem `delayed_choice_idempotent`: stable under re-closure. * Lean theorem `wheeler_window_safety`: late receipt → Bot. * * @param span - The execution span. * @param receipt - The candidate receipt. * @returns The resolved DoctrineLabel. */ export function closeLabel(span: Span, receipt: WheelerReceipt): DoctrineLabel { return admissible(span, receipt) ? receipt.label : "Bot"; } // --------------------------------------------------------------------------- // Inputs hash helper // --------------------------------------------------------------------------- function hashInputs(span: Span, receipt: WheelerReceipt): string { return createHash("sha256") .update(JSON.stringify({ span, receipt })) .digest("hex"); } // --------------------------------------------------------------------------- // DSSE receipt emitter // --------------------------------------------------------------------------- /** * Applies Wheeler audit closure and emits a DSSE receipt. * * Lean theorem: `Lutar.Wheeler.delayed_choice_idempotent` * File: Lutar/Wheeler/DelayedChoiceClosure.lean:100 * Commit: c4d13795689601324fce0236351bfe0ade990a43 * * The `output` field holds the resolved DoctrineLabel. * * @param span - The execution span. * @param receipt - The candidate receipt. * @param signer - Signing function. * @returns DSSE receipt containing the resolved label. */ export function emitDelayedChoiceReceipt( span: Span, receipt: WheelerReceipt, signer: Signer ): { label: DoctrineLabel; dsse: DSSEReceipt } { const label = closeLabel(span, receipt); const inputs_hash = hashInputs(span, receipt); const ts = new Date().toISOString(); const sigPayload = JSON.stringify({ theorem: LEAN_THEOREM, lean_commit_sha: LEAN_COMMIT_SHA, inputs_hash, output: label, ts, }); const dsse: DSSEReceipt = { theorem: LEAN_THEOREM, lean_commit_sha: LEAN_COMMIT_SHA, inputs_hash, output: label, ts, sig: signer(sigPayload), }; return { label, dsse }; } /** * Gate entry point for Lutar.Wheeler.DelayedChoiceClosure. */ export function delayedChoiceClosureGate( span: Span, receipt: WheelerReceipt, signer: Signer ): { label: DoctrineLabel; admissible: boolean; dsse: DSSEReceipt } { const isAdmissible = admissible(span, receipt); const { label, dsse } = emitDelayedChoiceReceipt(span, receipt, signer); return { label, admissible: isAdmissible, dsse }; }