A1  density f(x, y) against scipy.stats.multivariate_normal
  max relative error over 7 rho x 225 grid points                PASS (3.09e-14)
  peak f(0,0) at rho = 0.0 = 0.159155                            PASS (0.159155)
  peak f(0,0) at rho = 0.6 = 0.198944                            PASS (0.198944)
  peak f(0,0) at rho = 0.9 = 0.365126                            PASS (0.365126)
A2  Y | X = x0 ~ N(rho x0, (1 - rho^2)^0.5)
  conditional mean = rho x0 (by integration), max error          PASS (3.9e-13)
  conditional SD = (1-rho^2)^0.5 (by integration), max error     PASS (4.5e-14)
  f(x0,y)/phi(x0) = norm(rho x0, sd).pdf(y), max error           PASS (3.4e-15)
A3  the ellipses Q = k^2
  k = 1: 1 - exp(-k^2/2) = chi2(2).cdf(k^2) = 0.3935 (label "39 %") PASS 
  k = 2: 1 - exp(-k^2/2) = chi2(2).cdf(k^2) = 0.8647 (label "86 %") PASS 
  Monte Carlo, 10^6 pairs, rho = +0.6: inside k=1 0.3944, k=2 0.8651 PASS 
  Monte Carlo, 10^6 pairs, rho = -0.9: inside k=1 0.3939, k=2 0.8644 PASS 
  61 parametric points satisfy Q = k^2, max |Q - k^2|            PASS (4.9e-15)
  right end (k, rho k) on y = rho x; top (rho k, k): all rho, k  PASS 
A4  projection: screen x = 160 + s(x cos t - y sin t),
                screen y = cy - s((x sin t + y cos t) sin p + k z cos p)
  phi = 30: floor centre cy = 215 - R3 sin 30 = 168.33 (picture too tall to centre) PASS 
  theta =  0, phi = 30, rho = .6: (+3, +0, f) -> (226, 168)      PASS (expected (226, 168))
  theta =  0, phi = 30, rho = .6: (+0, +3, f) -> (160, 135)      PASS (expected (160, 135))
  theta = 90, phi = 30, rho = .6: (+3, +0, f) -> (160, 135)      PASS (expected (160, 135))
  theta = 90, phi = 30, rho = .6: (+0, +3, f) -> (94, 168)       PASS (expected (94, 168))
  theta =  0, phi = 30, rho = .6: (-3, -3, f) -> (94, 201)       PASS (expected (94, 201))
  theta = 90, phi = 30, rho = .6: (-3, -3, f) -> (226, 201)      PASS (expected (226, 201))
  the peak (0, 0, 0.199) at theta 0: (160, 77), 91 px above the floor PASS 
  rho = 0 peak height s k f(0,0) = 84.0 px (brief: ~90)          PASS 
  every grid point, every rho/theta/phi on screen: y 1 .. 215 (0..216) PASS 
A5  the colour ramp: blue (0,60,200) -> magenta (200,0,200) -> red (255,0,0)
  ramp(1) = (0, 60, 200), ramp(16) = (255, 0, 0)                 PASS 
  ramp at t = 0.533 (index 9) = (204, 0, 187), nearest step to magenta PASS 
B1  bnInit / bnCache in the harness against SciPy
  bnAU in degrees mode = 180/pi                                  PASS (57.2957795131)
  grid values: 15 fine (step 3/7), 11 coarse (step 0.6)          PASS 
  rho = +0.6: 346 heights (rel 8.1e-15), ellipse px (max 0 px off), f(y|x0) (2.8e-16) PASS 
  rho = -0.9: 346 heights (rel 4.6e-14), ellipse px (max 0 px off), f(y|x0) (3.3e-16) PASS 
  rho = +0.0: 346 heights (rel 1.9e-15), ellipse px (max 0 px off), f(y|x0) (1.7e-16) PASS 
  rho = +0.9: 346 heights (rel 4.6e-14), ellipse px (max 0 px off), f(y|x0) (3.3e-16) PASS 
  rho = -0.3: 346 heights (rel 3.3e-15), ellipse px (max 0 px off), f(y|x0) (1.7e-16) PASS 
  N(0, 1) at all 163 panel rows                                  PASS (1.7e-16)
  3-D slice f(1.5, y), 29 points; top f(1.5, 0.9) = 0.06459      PASS 
  bnRamp(1) = #003CC8, bnRamp(16) = #FF0000                      PASS 
  rho + 0.1 past 0.9 stops at 0.9 and says so: "ρ stops at 0.9 here" PASS 
  0.6 + 0.1 is stored as 0.7 (ROUND 2)                           PASS 
  x0 snaps to 0.05: 1.2345 -> 1.25; 3.4 -> 2.9                   PASS 
     (clamped)                                                   PASS 
B2  projection in the PPL, in all three angle modes
    degrees  bnAU = 57.2957795131
    radians  bnAU = 1.0000000000
    grads    bnAU = 63.6619772368
  degrees, radians and grads give identical pixels (theta 0, 90, 35) PASS 
  PPL bnPX/bnPY = Python projection, 3 x 225 points (max px off) PASS (0)
  theta 0:  (3,0,0) -> (226, 168), (0,3,0) -> (160, 135)         PASS 
  theta 90: (3,0,0) -> (160, 135), (0,3,0) -> (94, 168)          PASS 
  bnNormTh(-0.10) -> 6.1832 in [0, 2 pi)                         PASS 
  bnNormTh(7.00) -> 0.7168 in [0, 2 pi)                          PASS 
  bnNormTh(6.58) -> 0.3000 in [0, 2 pi)                          PASS 
  bnDeg(359.7 deg) shows "0°"                                    PASS 
B3  drawing calls per frame (the frame-cost estimate)
    3-D, 15 x 15, slice off                              LINE_P 426  PIXON_P   0  TEXTOUT_P  6  RECT_P 0
    3-D, 11 x 11 while dragging, slice off               LINE_P 226  PIXON_P   0  TEXTOUT_P  7  RECT_P 0
    3-D, 15 x 15, slice on                               LINE_P 485  PIXON_P  49  TEXTOUT_P  8  RECT_P 1
    3-D, 11 x 11 while dragging, slice on                LINE_P 285  PIXON_P  49  TEXTOUT_P  9  RECT_P 1
    3-D, 15 x 15 while dragging (coarse off), slice on   LINE_P 485  PIXON_P  49  TEXTOUT_P  8  RECT_P 1
    contour, slice off                                   LINE_P 141  PIXON_P  55  TEXTOUT_P 31  RECT_P 0
    contour, slice on (the x0 drag frame)                LINE_P 435  PIXON_P 113  TEXTOUT_P 25  RECT_P 2
  3-D full frame LINE_P = 426 (420 mesh + 4 floor + 2 axes)      PASS 
  coarse frame LINE_P = 226 (220 mesh + 6)                       PASS 
B4  a scripted session in the harness
  session ran to the end with no runtime error                   PASS 
    result: 'BiNorm3D: ρ = -0.45, E[Y | X = x] = -0.45 x; ρ in BN_RHO'
    BN_RHO = -0.45; 60 screens composed; MSGBOXes: 1
    MSGBOX: '3-D frame (slice on): 0 ms at 15×15, 0 ms at 11×11.\nFrom above with the slice: 0 ms.\nOver about 250 ms a drag feels sticky.'
  BN_RHO = -0.45 after the exact-rho form                        PASS 
  every scripted event was used                                  PASS 
  no text wider than its width argument (estimate)               PASS 
  DRAWMENU straight after the blit, 54 frames                    PASS 
  five help pages shown                                          PASS (5)
  help lines <= 46 characters                                    PASS []
    verdict lines seen: ['REGRESSION TO THE MEAN: -0.96 is nearer 0', 'REGRESSION TO THE MEAN: -1.44 is nearer 0', 'REGRESSION TO THE MEAN: -1.59 is nearer 0', 'REGRESSION TO THE MEAN: -1.62 is nearer 0']
C   layout: the ellipse labels against the ellipses
  39 % / 86 % labels clear of both ellipses and inside the box, rho -0.9..0.9 PASS 

ALL CHECKS PASSED
