Send light OUT of glass into air. The refracted ray bends away from the normal and races toward grazing as you steepen the incidence — is there an angle past which it cannot escape at all, and does a stopwatch that knows only path times and speeds find it exactly at asin(n₂/n₁)?
Units: critical angle θ_c = asin(n₂/n₁) = asin(1/1.5) = 0.7297277 rad = 41.8103149° for crown glass n₁ = 1.500 → air n₂ = 1.000; Hecht, Optics 5e, §4.7
▶ Run this simulationRead how it works
Total internal reflection: validated → validated + honest-module — the screen now EARNS its critical angle: the circular bisection-on-Snell is replaced by in-module timed races (golden-section on travel-time COMPARISONS over 12 deterministic glass→air geometries, winner sines measured from segments, through-origin line extrapolated to grazing), returning sinθ_c = 0.666666687518428 → θ_c = 41.8103165° vs asin(n₂/n₁) = 41.8103149° (+3.8e-8 rel, both rendering the IDENTICAL 41.81°); the derisk EXECUTES 9 sha256-pinned slices of TotalInternalReflectionModule.ts (mechanical strip only) and recomputes every screen value strict-=== (sinθ_c, θ_c, 24 measured sweep sines, 4 HUD strings covering sub-critical AND TIR branches, the 2456-char chart SVG whose plotted points ARE the raced winners); the bisection-root slope reproduces n₂/n₁ to the LAST BIT (aRoot − 2/3 = 0.0), so the entire screen excess IS the sqrt(eps) comparison basin — worst stall 61.8% of δx = √(2·4eps·t*/t″) (the golden ratio itself, the geometry of the final uncomparable interval), slope dev 17.4% of the propagated bound, ZERO fitted parameters; tick schedule bit-exact (2·fl(1/120) === fl(1/60), accumulator ∈ {0, fl(1/120)} at all 20000 steps); the module 12-race and oracle 40-geometry protocols agree to 5.9e-8; the noisy grand 41.7627° sits 1.05·SE from the screen; 19/19 ~0.1s first attempt; tamper three ways exit 1
The generator computes ONE thing: the arrival time of a broken glass→air path A→(x,0)→B, t(x) = n₁·|A→(x,0)| + n₂·|(x,0)→B| at c = 1, with n₁ = 1.5 (dense glass, below) and n₂ = 1.0 (air, above) — no sines, no angles, no asin, no critical-angle formula, no stationarity condition anywhere in the recovery path. The least-time crossing is located purely by comparing measured times: noiseless by golden-section on comparisons (float floor 9.8e-8); noisy by argmin over an 801-point grid of independently-jittered chronometer readings (0.1% Gaussian per candidate) refined by a windowed least-squares CUBIC vertex, with the per-geometry crossing averaged over 8 races BEFORE the slope fit (removes the regression-dilution bias that otherwise attenuates the slope and pushes θ_c ~0.17% high). The winner's two sines are MEASURED from its segments as opposite/hypotenuse; a free through-origin slope m = Σsinθ₁sinθ₂/Σsinθ₁² over a strictly sub-critical sweep (sinθ₁ ≤ 0.60, θ₂ ≤ 64°, away from grazing) is inverted to θ_c = asin(1/m). The closed form θ_c = asin(n₂/n₁) lives ONLY in the reference, loaded to score. 8 seeds draw their own geometry AND noise. 12 gates in scripts/tir-derisk.mjs (~0.1 s); tamper ⇒ exit 1. ?world=tir.
41.7627
0.0454
0.00533
0.00108
The critical angle of total internal reflection, θ_c = asin(n₂/n₁) (Hecht, Optics 5e §4.7), the grazing limit of Snell's law n₁ sinθ₁ = n₂ sinθ₂ (Snellius 1621 / Descartes 1637) read for light leaving the dense medium. Non-circular: the generator contains only path lengths and per-medium speeds — the refraction slope m is measured off raced winners' geometry and inverted to θ_c = asin(1/m); asin(n₂/n₁) is never written in the recovery, and the grazing gate recovers sinθ_c by extrapolating measured refraction data to sinθ₂ = 1 rather than assuming it. Distinct from the snell world (which recovers the sine RATIO n₂/n₁ from the same Fermat machinery): TIR adds the THRESHOLD's existence and its one-directionality (the falsified rare→dense rival), and an independent Fresnel energy route showing the reflection is TOTAL (R = 1) at that angle — content Snell's ratio alone does not carry. Complements the mirage world (graded index, n·sinθ conserved) and rainbow (caustic minimum) as the optics arc.
CLOSED this run (validated → validated + honest-module). The module (?world=tir, src/modules/TotalInternalReflectionModule.ts) previously displayed a CIRCULAR θ_c — an 80-step bisection on ((n₁/n₂)·sin(mid) < 1), i.e. the closed form solved directly. That bisection is GONE: the on-screen θ_c is now measured in-module by the same physics as the oracle — the only physics coded is the travel time t = n·length per leg of a broken glass→air path; golden-section on time comparisons locates each of 12 least-time crossings, the winners sines are measured from their segments, and the through-origin line sinθ₁ = a·sinθ₂ extrapolated to grazing gives sinθ_c = a = 0.666666687518428. asin(n₂/n₁) survives only as the theory label rendered beside the measurement. Remaining (disclosed, visual-only): the rays/Fresnel dimming/theory curve use Snell + Fresnel closed forms — they are the illustration, not the headline number. The derisk EXECUTES the module source (module_certificate, gates M1–M8) so any numeric edit to the recovery trips by sha256 and any drift trips strict-=== pins.
Rung climbed: validated → validated + honest-module (the gap the previous run disclosed). Module edit: bisection-on-the-formula replaced by 12 deterministic timed races at init (bx grid 1.4..12 spanning incidences ~7°..37°, golden-section 100 comparisons each, ~0.1 ms — honest numbers cost no frame budget); chart points switched from optics()-generated to the raced winners; HUD/chart/branch logic all read the measured θ_c. Certificate: 9 slices sha256-pinned (consts, optics, raceTime, physics, fixedUpdate, step, renderHud, chartConsts, chart), executed via mechanical strip (TS-syntax removal only) + new Function; all pins strict-=== first attempt; 19/19 gates ~0.1 s. Tamper three ways, each exit 1, recovery unchanged: known_value 0.72973→0.75 (7 gates FAIL incl. A at 41.7627° unchanged); module numeric edit 10.6→10.7 (M1 hash + M2/M3/M6 trip); last-ulp pin edit sinCMeas …428→…429 (M2 strict-=== trips); all restored by hand, re-run green. Basin gates set at 1.0 — the a-priori bound itself, not a padded tolerance (observed 61.8%/17.4%). Live headless-Chrome read-back: HUD θ_c tail and chart byte-identical to pins (see discovery fragment). Scope: module + catalog entry (its own tir entry only — shared file, so gate = build + smoke:all + derisk) + oracle pair + finding + fragment + one loop-runs line. Micro-lesson #74: a golden-section-by-comparisons minimizer stalls at ~φ·δx, not δx — the final uncomparable interval is a φ-section of the basin, so an a-priori bound of 1.0·δx holds with the observed worst case landing on 0.618.
npm run derisk -- tir (scripts/tir-derisk.mjs)scripts/oracles/tir.reference.jsonW. Snellius (1621); R. Descartes, La Dioptrique (1637); E. Hecht, Optics, 5th ed., Pearson (2017), §4.7 'Total Internal Reflection', Table 4.1 (crown glass 1.50, water 1.333, diamond 2.417); J. Tyndall (1854), light-guiding by TIR in a water jet — the basis of the optical fibre.