/** * `let` runtime semantics. * * Operational semantics: * 1. Evaluate the required initializer exactly once in the current block. * 2. If initializer evaluation completes abruptly, propagate that completion * and create no binding. The executable Phase 1 domain accepts only * portable scalar expressions, so fixtures exercise the normal path. * 3. Create a binding local to the current block and emit one observable * assignment trace event: `{op:"assign", target:name, value}`. * 4. Complete normally. * * Portability domain: * - `name` is a cross-target identifier, not already bound in the current * semantic environment, and not a known JS/Python/KERN builtin name. * - `value` is required and evaluates to a portable scalar: string, finite * number, boolean, or null. * - Expressions are the shared portable-scalar subset (see * `./portable-scalar.ts`): literals, identifiers resolving to portable * scalars, arithmetic over numbers, comparisons over same-typed scalars, * boolean/nullish operators over portable truthiness, and conditionals. * * Exclusions: * Bare declarations, destructuring, same-block redeclaration, builtin * shadowing, TDZ/use-before-declare, and block-scope leaks are outside this * contract because TS and Python disagree on at least one observable edge. */ import { type NodeContract } from './index.js'; export declare const letContract: NodeContract; /** Idempotent registration. Test cleanup that clears the registry must re-call. */ export declare function registerLetContract(): void; /** Reset registration flag — only for test cleanup that clears the registry. */ export declare function _resetLetContractForTest(): void;