== Part 1: the exact curve the program draws (cltIH) ==
  n   12-digit, symmetric   12-digit, no symmetry   double   vs scipy irwinhall   vs convolution  (max |error| / peak)
   1      0.0e+00              0.0e+00             0.0e+00         0.0e+00            0.0e+00
   2      0.0e+00              0.0e+00             1.1e-16         1.1e-16            2.5e-04
   3      0.0e+00              0.0e+00             2.2e-16         2.2e-16            6.7e-04
   4      2.2e-12              1.4e-10             3.3e-16         3.3e-16            7.5e-04
   5      9.0e-12              5.4e-10             2.8e-16         3.7e-16            9.1e-04
   6      1.7e-11              1.4e-09             4.0e-16         2.5e-16            1.0e-03
   7      2.4e-11              4.6e-09             8.7e-16         4.3e-16            1.2e-03
   8      2.5e-11              8.9e-09             6.9e-16         3.5e-16            1.3e-03
   9      4.6e-11              1.3e-08             1.1e-15         3.7e-16            1.4e-03
  10      6.9e-11              9.5e-08             1.4e-15         2.6e-16            1.5e-03
  11      8.3e-11              1.5e-07             3.2e-15         5.4e-16            1.6e-03
  12      8.6e-11              4.4e-07             4.7e-15         4.2e-16            1.6e-03
  16      3.5e-10              5.8e-06             2.1e-14         6.5e-16                nan
  25      1.5e-08              6.1e-03             8.6e-13         5.1e-16                nan
  36      6.0e-07              1.5e+01             5.2e-11         7.3e-16                nan
  49      2.7e-04              2.7e+04             1.4e-08         7.1e-16                nan
  64      1.5e-01              3.3e+08             7.3e-06         8.9e-16                nan
  81      9.2e+01              1.3e+13             1.8e-03         1.1e-15                nan
 100      2.2e+05              5.6e+17             9.7e+00         1.1e-15                nan
  At the peak s = n/2, the 12-digit sum agrees with the exact value to: n=4 12.3 digits, n=9 13.1 digits, n=16 10.1 digits, n=25 8.2 digits, n=36 6.5 digits, n=49 3.7 digits, n=64 0.9 digits
  [ok] the device keeps >= 3 digits at the peak up to n = 49 (the page accepts 1E-3)
  [ok] 12-digit symmetric sum: error < 5E-4 of the peak (0.03 px) up to n = 49, and > 1 % at n = 64 (the n limit is 49)
  The CAS polynomial (whole-number coefficients / (n-1)!) evaluated in 12-digit Horner:
    n =  4: max |error| / peak = 5.0e-13
    n =  9: max |error| / peak = 9.2e-07
    n = 16: max |error| / peak = 8.1e-01
    n = 25: max |error| / peak = 3.0e+07
    n = 36: max |error| / peak = 5.2e+16
    (the symmetric sum is better at every n: the program draws from the sum, and the CAS polynomial is shown as text)
  Exact curve against the normal curve N(n/2, n/12), in pixels on the 59-px panel:
    n =   1: max gap 29.528 px; exact peak / normal peak = 0.7236
    n =   4: max gap 2.077 px; exact peak / normal peak = 0.9648
    n =   9: max gap 0.991 px; exact peak / normal peak = 0.9832
    n =  16: max gap 0.556 px; exact peak / normal peak = 0.9906
    n =  25: max gap 0.355 px; exact peak / normal peak = 0.9940
    n =  36: max gap 0.246 px; exact peak / normal peak = 0.9958
    n =  49: max gap 0.181 px; exact peak / normal peak = 0.9969
    n =  64: max gap 0.138 px; exact peak / normal peak = 0.9977
    n =  81: max gap 0.109 px; exact peak / normal peak = 0.9981
    n = 100: max gap 0.089 px; exact peak / normal peak = 0.9985
  [ok] above n = 49 the exact and normal curves are within 0.2 px -- 0.138, 0.109, 0.089 px
  [ok] rescaled n = 1: integral 0.99995, mean 4.86976 (mu 4.87), SD 2.92978 (sigma/sqrt n 2.93000)
  [ok] rescaled n = 4: integral 1.00000, mean 4.87000 (mu 4.87), SD 1.46500 (sigma/sqrt n 1.46500)
  [ok] rescaled n = 16: integral 1.00000, mean 4.87000 (mu 4.87), SD 0.73250 (sigma/sqrt n 0.73250)
  [ok] rescaled n = 49: integral 1.00000, mean 4.87000 (mu 4.87), SD 0.41857 (sigma/sqrt n 0.41857)

== Part 2: every CAS template, desktop Giac (icas) against SymPy / fractions ==
  n =   1: peak 1 (1 chars) = 1.000000000000; round(...*10^12) = 1000000000000
  n =   4: peak 2/3 (3 chars) = 0.666666666667; round(...*10^12) = 666666666667
  n =   9: peak 259723/573440 (13 chars) = 0.452920968192; round(...*10^12) = 452920968192
  n =  16: peak 2330931341/6810804000 (21 chars) = 0.342240261355; round(...*10^12) = 342240261355
  n =  49: peak 6444121017896717... (140 chars) = 0.196819925536; round(...*10^12) = 196819925536
  n = 100: peak 6474662400555020... (298 chars) = 0.137990204076; round(...*10^12) = 137990204075
  [ok] 92 polynomial pieces: Giac expand == SymPy expand of the same sum -- 0 differ
  [ok] 19 exact peaks: Giac == fractions -- 0 differ
  [ok] the round(evalf(..)*10^E) check numbers equal the exact values -- 0 differ
  [ok] every template under 1 s in desktop Giac -- slowest 607 ms
  [ok] MGF limit: Giac exp(cltqt^2/2) == SymPy exp(cltqt**2/2) -- 95 ms
  [ok] MGF series: Giac -1/12*cltqt^4/cltqn+1/2*cltqt^2 == SymPy cltqt**2/2 - cltqt**4/(12*cltqn) -- 91 ms
  [ok] MGF check number at t = 1: 1648721271 = round(e^(1/2) 10^9) = 1648721271
  [ok] 3a: the MGF limit in the Prime's printing is e^(cltqt^2/2) (as CASProbe T17 saw), and re-fed it gives 1648721271
  numeric: cosh(t/sqrt n)^n -> e^(t^2/2) at t = 2: n=1 3.7622, n=4 5.6696, n=16 6.8335, n=100 7.2922, n=10000 7.3881, e^2 = 7.3891

== Part 3: the program in ppl_run_v3d (cas = giac, then cas = fail; 3b) ==
-- cas = giac --
  exact page n =   1: 11 lines, 2 CAS calls ( 148 ms), badge ['exact (CAS)']; exact: 1 = 1.000000000; program's sum: 1.000000000, agrees to 12 digits
  [ok] n = 1: badge "exact (CAS)" and the exact peak shown
  [ok] n = 1: the peak on the page is 1
  exact page n =   4: 16 lines, 10 CAS calls ( 675 ms), badge ['exact (CAS)']; exact: 2/3 = 0.666666667; program's sum: 0.666666667, agrees to 12 digits
  [ok] n = 4: badge "exact (CAS)" and the exact peak shown
  [ok] n = 4: the peak on the page is 2/3
  [ok] n = 4: the page is kept (a second opening makes 0 CAS calls)
  exact page n =   9: 16 lines, 6 CAS calls ( 500 ms), badge ['exact (CAS)']; exact: 259723/573440 = 0.452920968; program's sum: 0.452920968, agrees to 12 digits
  [ok] n = 9: badge "exact (CAS)" and the exact peak shown
  [ok] n = 9: the peak on the page is 259723/573440
  [ok] n = 9: the page is kept (a second opening makes 0 CAS calls)
  exact page n =  16: 14 lines, 2 CAS calls ( 122 ms), badge ['exact (CAS)']; exact: 2330931341/6810804000 = 0.342240261; program's sum: 0.342240261, agrees to 12 digits
  [ok] n = 16: badge "exact (CAS)" and the exact peak shown
  exact page n =  25: 14 lines, 2 CAS calls ( 120 ms), badge ['exact (CAS)']; exact: fraction of 59 digits = 0.274731974; program's sum: 0.274731974, agrees to 11 digits
  [ok] n = 25: badge "exact (CAS)" and the exact peak shown
  exact page n =  36: 14 lines, 2 CAS calls ( 117 ms), badge ['exact (CAS)']; exact: fraction of 73 digits = 0.229367708; program's sum: 0.229367708, agrees to 10 digits
  [ok] n = 36: badge "exact (CAS)" and the exact peak shown
  exact page n =  49: 14 lines, 2 CAS calls ( 118 ms), badge ['exact (CAS)']; exact: fraction of 139 digits = 0.196819926; program's sum: 0.196819923, agrees to 7 digits
  [ok] n = 49: badge "exact (CAS)" and the exact peak shown
  exact page n =  64: 17 lines, 2 CAS calls ( 121 ms), badge ['exact (CAS)']; exact: fraction of 165 digits = 0.172341715; program's sum: 0.172340463, agrees to 5 digits
  [ok] n = 64: badge "exact (CAS)" and the exact peak shown
  exact page n =  81: 17 lines, 2 CAS calls ( 117 ms), badge ['exact (CAS)']; exact: fraction of 275 digits = 0.153268329; program's sum: 0.153282058, agrees to 4 digits
  [ok] n = 81: badge "exact (CAS)" and the exact peak shown
  exact page n = 100: 17 lines, 2 CAS calls ( 115 ms), badge ['exact (CAS)']; exact: fraction of 297 digits = 0.137990204; program's sum: 0.369355615, agrees to 0 digits
  [ok] n = 100: badge "exact (CAS)" and the exact peak shown
  n = 4 page:
     S = the SUM of n = 4 draws from uniform(0, 1).
     On each piece [j, j+1) its density is a
     polynomial of degree 3 (from the CAS, exact):
     [0, 1): s^3/6
     [1, 2): (-3×s^3+12×s^2-12×s+4)/6
     [2, 3): (3×s^3-24×s^2+60×s-44)/6
     [3, 4): (-s^3+12×s^2-48×s+64)/6
      = μ + 2√3 σ (S/n − 1/2): the same shape,
        rescaled to your population's μ and σ.
     The peak of S's density, at s = n/2:
       exact: 2/3 = 0.666666667
       normal curve: 0.690988299; exact is 3.5% lower
       program's sum: 0.666666667, agrees to 12 digits
  [ok] Exponential population: the page says no exact curve is drawn for it -- Your population is Exponential: no exact
  MGF page: 4 CAS calls; lines: ['Flip a fair coin n times: X = +1 or -1 each time.', 'Z = (X1 + ... + Xn)/√n has mean 0 and SD 1.', 'Its MGF: M(t) = E[e^(tZ)] = cosh(t/√n)^n.', 'CAS: as n grows, M(t) -> e^(t^2/2):', '   the MGF of N(0, 1). The sum becomes a bell.', 'CAS: ln M(t) = -1/12×t^4/n+1/2×t^2 + ...', '   The t^4 term shrinks like 1/n; t^2/2 is left.']
    curve segments by colour: {'#E1E4EB': 9, '#000000': 2, '#FF0000': 276, '#FF4500': 276, '#C800C8': 276, '#003CC8': 552}
  [ok] MGF page: the CAS limit e^(t^2/2) (3a: the Prime's printing, no "exp(") and the series shown, badge exact (CAS)
  [ok] 3a: every CAS text asks for string(...), every answer arrives quoted; no CAS variable assigned, no CAS call of a variable
  [ok] MGF page: the n = 16 curve sits on cosh(t/4)^16 (to the pixel) -- worst 0 px
  dashboard n =   1: 292 black dots, legend ['exact', '& N(μ, σ/√n)'], cache n = 1, max |cache - scipy| / peak 0.0e+00
  [ok] n = 1: dots drawn, legend "exact & N(...)", cache = SciPy (< 1E-7 of the peak; doubles here, the 12-digit errors are in part 1)
  dashboard n =   4: 292 black dots, legend ['exact', '& N(μ, σ/√n)'], cache n = 4, max |cache - scipy| / peak 2.0e-16
  [ok] n = 4: dots drawn, legend "exact & N(...)", cache = SciPy (< 1E-7 of the peak; doubles here, the 12-digit errors are in part 1)
  dashboard n =  16: 212 black dots, legend ['exact', '& N(μ, σ/√n)'], cache n = 16, max |cache - scipy| / peak 1.7e-14
  [ok] n = 16: dots drawn, legend "exact & N(...)", cache = SciPy (< 1E-7 of the peak; doubles here, the 12-digit errors are in part 1)
  dashboard n =  49: 120 black dots, legend ['exact', '& N(μ, σ/√n)'], cache n = 49, max |cache - scipy| / peak 5.6e-09
  [ok] n = 49: dots drawn, legend "exact & N(...)", cache = SciPy (< 1E-7 of the peak; doubles here, the 12-digit errors are in part 1)
  dashboard n =  64:   0 black dots, legend ['curve = N(μ, σ/√n)'], cache n = 49, max |cache - scipy| / peak 0.0e+00
  [ok] n = 64 (> 49): no dots, the plain legend
  [ok] no CAS call while sampling and drawing the dashboard (0)
  [ok] the dots sit where the cache and the panel scale put them -- 0 off
  [ok] drag preview: 3 frames, no dots, no CAS call
  [ok] one-sample animation: no CAS call
  [ok] Exponential population: no exact dots, plain legend
  [ok] curves off: no dots either
-- cas = fail --
  exact page n =   1: 11 lines, 1 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 1, CAS failing: "decimal" badge, "no closed form shown", no error
  exact page n =   4: 16 lines, 5 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 4, CAS failing: "decimal" badge, "no closed form shown", no error
  exact page n =   9: 14 lines, 3 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 9, CAS failing: "decimal" badge, "no closed form shown", no error
  exact page n =  16: 14 lines, 1 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 16, CAS failing: "decimal" badge, "no closed form shown", no error
  exact page n =  25: 14 lines, 1 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 25, CAS failing: "decimal" badge, "no closed form shown", no error
  exact page n =  36: 14 lines, 1 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 36, CAS failing: "decimal" badge, "no closed form shown", no error
  exact page n =  49: 14 lines, 1 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 49, CAS failing: "decimal" badge, "no closed form shown", no error
  exact page n =  64: 17 lines, 1 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 64, CAS failing: "decimal" badge, "no closed form shown", no error
  exact page n =  81: 17 lines, 1 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 81, CAS failing: "decimal" badge, "no closed form shown", no error
  exact page n = 100: 17 lines, 1 CAS calls (   0 ms), badge ['decimal']; no exact peak; 
  [ok] n = 100, CAS failing: "decimal" badge, "no closed form shown", no error
  n = 4 page:
     S = the SUM of n = 4 draws from uniform(0, 1).
     On each piece [j, j+1) its density is a
     polynomial of degree 3 (from the CAS, exact):
     [0, 1): no closed form shown
     [1, 2): no closed form shown
     [2, 3): no closed form shown
     [3, 4): no closed form shown
      = μ + 2√3 σ (S/n − 1/2): the same shape,
        rescaled to your population's μ and σ.
     The peak of S's density, at s = n/2:
       exact value: no closed form shown
       normal curve: 0.690988299
       program's sum: 0.666666667 (decimals only)
  [ok] Exponential population: the page says no exact curve is drawn for it -- Your population is Exponential: no exact
  MGF page: 2 CAS calls; lines: ['Flip a fair coin n times: X = +1 or -1 each time.', 'Z = (X1 + ... + Xn)/√n has mean 0 and SD 1.', 'Its MGF: M(t) = E[e^(tZ)] = cosh(t/√n)^n.', 'M(1) = 1.5431, 1.6168, 1.6403, 1.6487 (n = 1, 4,', "   16, 10000) -> e^(1/2) = 1.6487, N(0, 1)'s MGF."]
    curve segments by colour: {'#E1E4EB': 9, '#000000': 2, '#FF0000': 276, '#FF4500': 276, '#C800C8': 276, '#003CC8': 552}
  [ok] MGF page, CAS failing: the decimal M(1) line and the "decimal" badge
  [ok] MGF page: the n = 16 curve sits on cosh(t/4)^16 (to the pixel) -- worst 0 px
  dashboard n =   1: 292 black dots, legend ['exact', '& N(μ, σ/√n)'], cache n = 1, max |cache - scipy| / peak 0.0e+00
  [ok] n = 1: dots drawn, legend "exact & N(...)", cache = SciPy (< 1E-7 of the peak; doubles here, the 12-digit errors are in part 1)
  dashboard n =   4: 292 black dots, legend ['exact', '& N(μ, σ/√n)'], cache n = 4, max |cache - scipy| / peak 2.0e-16
  [ok] n = 4: dots drawn, legend "exact & N(...)", cache = SciPy (< 1E-7 of the peak; doubles here, the 12-digit errors are in part 1)
  dashboard n =  16: 212 black dots, legend ['exact', '& N(μ, σ/√n)'], cache n = 16, max |cache - scipy| / peak 1.7e-14
  [ok] n = 16: dots drawn, legend "exact & N(...)", cache = SciPy (< 1E-7 of the peak; doubles here, the 12-digit errors are in part 1)
  dashboard n =  49: 120 black dots, legend ['exact', '& N(μ, σ/√n)'], cache n = 49, max |cache - scipy| / peak 5.6e-09
  [ok] n = 49: dots drawn, legend "exact & N(...)", cache = SciPy (< 1E-7 of the peak; doubles here, the 12-digit errors are in part 1)
  dashboard n =  64:   0 black dots, legend ['curve = N(μ, σ/√n)'], cache n = 49, max |cache - scipy| / peak 0.0e+00
  [ok] n = 64 (> 49): no dots, the plain legend
  [ok] no CAS call while sampling and drawing the dashboard (0)
  [ok] the dots sit where the cache and the panel scale put them -- 0 off
  [ok] drag preview: 3 frames, no dots, no CAS call
  [ok] one-sample animation: no CAS call
  [ok] Exponential population: no exact dots, plain legend
  [ok] curves off: no dots either
  Help: 3 pages: ['How to read the dashboard', 'Buttons, taps and keys', 'The exact curve and the MGF']
  [ok] Help has three pages, the third on the exact curve and the MGF
  Menu: 12 items: ['Draw new samples', 'Change sample size n', 'Number of samples', 'New population', 'Curves on / off', 'Plot population (built-in)', 'Plot sample means (built-in)', 'Square-root law', 'Exact curve (uniform)', 'Why the bell? (MGF)', 'Help', 'Leave']
  [ok] the menu has 12 items, the two CAS pages before Help
  [ok] View entries include the two CAS pages -- [('CLT dashboard', 'cltVDash'), ('Choose population', 'cltVPop'), ('Draw samples', 'cltVSamp'), ('Plot population', 'clt
  [ok] layout: no text runs off the screen on any new page (6 / 8 px a character) -- 0

== Part 4 (3a): beta 3 in harness v3b, and beta 3a against beta 3 ==
  [ok] 3a: beta 3 in v3b: its cltCas hands back its own text, so both pages say "no closed form shown" / the decimals -- the emulator's finding

G. beta 3a: beta 3 in harness v3b, and beta 3a against beta 3
  [ok] beta 3a: routines that differ from beta 3: ['cltCas'] (want cltCas)
  [ok] beta 3a: outside those routines only comments differ
  [ok] beta 3a: the #PYTHON blocks are unchanged
  routines that differ from beta 3: cltCas; everything else differs only in comments

== Part 5 (3b): the round-2 string fixes (harness v3d) ==
  [ok] R1 3b: a failed CAS call -> cltCas returns "" with no error
  [ok] R1 beta 3a in v3d: the same call stops the app -- INSTRING: Invalid input (the first argument is an empty stri
  [ok] R1 3b: an empty CAS string -> "", undef -> "", 7/2 kept
  [ok] R2 3b cas=fail, n = 1: View "Exact curve" and View "Why the bell?" open with "decimal", "no closed form shown" / the M(1) line, no error -- (None, None, ['decimal'], ['decimal'])
  [ok] R2 beta 3a in v3d, cas=fail, n = 1: both View entries stop the app -- INSTRING: Invalid input (the first argum
  [ok] R2 3b cas=fail, n = 9: View "Exact curve" and View "Why the bell?" open with "decimal", "no closed form shown" / the M(1) line, no error -- (None, None, ['decimal'], ['decimal'])
  [ok] R2 beta 3a in v3d, cas=fail, n = 9: both View entries stop the app -- INSTRING: Invalid input (the first argum
  [ok] R2 3b cas=fail, n = 16: View "Exact curve" and View "Why the bell?" open with "decimal", "no closed form shown" / the M(1) line, no error -- (None, None, ['decimal'], ['decimal'])
  [ok] R2 beta 3a in v3d, cas=fail, n = 16: both View entries stop the app -- INSTRING: Invalid input (the first argum
  [ok] R2 3b cas=fail, n = 100: View "Exact curve" and View "Why the bell?" open with "decimal", "no closed form shown" / the M(1) line, no error -- (None, None, ['decimal'], ['decimal'])
  [ok] R2 beta 3a in v3d, cas=fail, n = 100: both View entries stop the app -- INSTRING: Invalid input (the first argum
  [ok] R2 3b cas=fail, View "CLT dashboard" -> menu -> both CAS pages -> Esc: "decimal" twice, no error, the script used up -- (None, ['decimal', 'decimal'], ([], [], []))
  [ok] R2 beta 3a in v3d, the same route: stops -- INSTRING: Invalid input (the first argum
  [ok] R2 3b cas=fail, AND/OR evaluating both sides, n = 4: both pages open, no error -- (None, None)
  [ok] R2 3b cas=fail, AND/OR evaluating both sides, n = 9: both pages open, no error -- (None, None)
  [ok] R2 why the AND guards were split: beta 3a with ONLY the cltCas fix runs here (AND skips its right side) but stops when AND evaluates both sides -- INSTRING: Invalid input (the first argum
  [ok] R3 cltRepl('a*b', '*', 'x') = 'axb'
  [ok] R3 cltRepl('ab*', '*', 'x') = 'abx'
  [ok] R3 cltRepl('*ab', '*', 'x') = 'xab'
  [ok] R3 cltRepl('cltqs', 'cltqs', 's') = 's'
  [ok] R3 cltRepl('2*cltqs*cltqs', 'cltqs', 's') = '2*s*s'
  [ok] R3 cltRepl('abc', '', 'x') = 'abc'
  [ok] R3 cltRepl('', '*', 'x') = ''
  [ok] R3 cltRepl('', '', 'x') = ''
  [ok] R3 cltRepl('abc', 'z', 'x') = 'abc'
  [ok] R3 cltRepl('**', '*', '') = ''
  [ok] R3 cltShow('-9*cltqs') = '-9×s'
  [ok] R3 cltShow('cltqs') = 's'
  [ok] R3 cltShow('1/2*cltqt^2-1/12*cltqt^4/cltqn') = '1/2×t^2-1/12×t^4/n'
  [ok] R3 cltShow('e^(cltqt^2/2)') = 'e^(t^2/2)'
  [ok] R3 beta 3a in v3d: cltShow on an answer that ends in cltqs stops -- INSTRING: Invalid input (the first argum
  [ok] R4 cltF rounds first: ['0.00', '0.1', '0.0', '0.342240261', '68']
  [ok] R4 beta 3a in v3d: cltF(0.0031, 2) = '3.10ᴇ-3' (the finding)
  [ok] R4 3b D1 = {-1, 1, -2, 2, 0.003} (mu = 0.0006): ['μ = 0.00  σ = 1.41'], ["mean of the \ue000's = 0.166    (μ = 0.001)"]; no scientific text -- ['Data in D1, N = 5', 'μ = 0.00  σ = 1.41']
  [ok] R4 beta 3a in v3d, the same population: ['μ = 6.00ᴇ-4  σ = 1.41', "mean of the \ue000's = 0.166    (μ = 6.000ᴇ-4)"]
  [ok] R4 3b: an exponential population of 3000 with a one-member bar (bar 32)
  [ok] R4 3b the one-member bar's box: ['x from 31 to 32', 'count = 1', 'share = 0.0% of 3000']
  [ok] R4 beta 3a: an exponential population of 3000 with a one-member bar (bar 32)
  [ok] R4 beta 3a in v3d, the same box: ['share = 3.3ᴇ-2% of 3000']
  [ok] R4 3b "% in 1 SE" at 1 of 200: ['1% in 1 SE,']
  [ok] R4 beta 3a in v3d, the same: ['5ᴇ-1% in 1 SE,']
  [ok] R5 3b: routines that differ from beta 3a: ['cltCas', 'cltChoosePop', 'cltDash', 'cltExact', 'cltF', 'cltMgf', 'cltRepl', 'cltTipDraw']
  [ok] R5 3b: outside those routines only comments differ
  [ok] R5 3b: 61 of the 61 untouched routines are byte-identical, comments included
  [ok] R5 3b: the app is unchanged: START, Plot, the exported CentralLimit and all 9 VIEW entries byte-identical
  INSTRING sites in beta 3b: 672, 689, 717, 726, 2016, 2073, 2080, 2102, 2188, 2202
  [ok] R7 population menu: ['Uniform (flat)', 'Normal (bell)', 'Exponential (skewed right)', 'Geometric (counts, skewed)', 'Bimodal (two humps)', 'My own data, already in D1']; every item <= 28 characters (longest 26)
  harness runs: 24 of beta 3b, 14 of beta 3 / 3a (or text variants)
  h.sci_strings, beta 3b: []
  h.sci_strings, the others (for comparison): [(0.0006, 2, '6.00ᴇ-4'), (0.0006, 3, '6.000ᴇ-4'), (0.000705882353, 3, '7.059ᴇ-4'), (0.0031, 2, '3.10ᴇ-3'), (0.033333333333, 1, '3.3ᴇ-2'), (0.5, 0, '5ᴇ-1')]
  [ok] R6 3b: no scientific STRING(x, 2, d) result in any of the 24 beta 3b runs

RESULT: ALL PASS
