# files/banana — change log

## 2026-09-03 — four-loop evaluator added

- New `banana-4loop-evaluate.py`: a standalone evaluator (python3 + mpmath, no data
  files, no network) of the explicit log-Frobenius form of the four-loop equal-mass
  banana $I_{11111}$ described in the page's four-loop section — all five masters of
  the top sector, $\varepsilon^{-4}\ldots\varepsilon^{0}$, at any Euclidean point
  $p^2 < 0$. The exact $\theta$-system (integer polynomial data in both frames), the
  derived $\zeta$-ring boundary vector and the held-out reference values are written
  into the file behind a sha256 pin; a copy whose data block has been altered refuses
  with exit 3 before computing anything.
- What the default run does (about a minute on a laptop-class machine with mpmath's
  gmpy2 backend, roughly half again as long on the pure-Python backend; first line
  immediate): $p^2 = -2$ at 30 quoted digits with 30 working guard digits. Structural
  checks in exact integers (denominator $20(1+z)(1+9z)(1+25z)$, residue nilpotent of
  index 8); positive controls (the AESZ-34 recurrence returning the Hulek–Verrill
  integers, $|L_4[\varpi_0]|$ at $z = 1/128$, the $n = 0$ log-tower against the
  literature $\Gamma$-product, the three-loop sibling identity
  $\int_0^\infty x K_0(x)^4\,dx = 7\zeta_3/8$ by live quadrature); the value path with
  run-time certified tail bounds on the local series and on every transport step; then
  raising gates on the tadpole tower against the exact expansion of $\Gamma(\varepsilon)^4$
  and on all 21 non-vanishing layers against the independent auxiliary-mass-flow tower
  and the 100-digit Bessel reference at that point. Every gate names itself; a miss
  exits 1.
- `--full` recomputes the paper's held-out table against the stored references —
  $p^2 = -2$ and $-7$ at 100 digits, the controls at full depth — and gates each
  recomputed row at the printed value minus one digit; `--bessel` adds the table's
  live Bessel-moment oracle rows (quadrature at a 115-digit working cap; many minutes
  per point, which is why it is opt-in).
  `--check` adds the two-precision self-agreement gate (the run is repeated at dps+60
  guard digits; the worst nonzero layer must agree to dps+10). `--mutate` perturbs one
  connection entry by $10^{-6}$, prints the collapse of the held-out agreement and
  exits 1 (the shipped control). `--pp` and `--dps` take any Euclidean points and any
  precision. Exit codes: 0 all checks passed; 1 a check failed; 2 usage; 3 data pin
  mismatch.
- Relationship to the research script the evaluator was adapted from: same form, same
  embedded data, same certified-truncation semantics and the same starting depths. The
  transport recursion is reproduced operation for operation at mantissa level (results
  bit-identical at equal precision), the local Frobenius solve uses the exact finite
  Neumann series of the nilpotent residue in place of a general matrix inverse
  (algebraically identical; the two agree at the rounding level of the working
  precision), and the gate digits of both agree to within that rounding. These two
  changes are what make the quick default laptop-class.
- `banana-evaluate.py` (three-loop, K3) and `banana-expression.md` are unchanged. The
  two evaluators share no code; the four-loop script's $\int x K_0^4$ control is the
  $p^2 = 0$ value of the three-loop rung. `_snippet.md` carries the proposed Downloads
  line for the four-loop section.

## 2026-07-05 — banana-evaluate.py convergence hardening

- Recorded in the script's own docstring changelog: the closed-form term count is a
  starting seed only; every evaluation certifies its truncation at run time by a
  trailing-window geometric tail bound (ratio $|t|/4$) against $10^{-(\mathrm{dps}+12)}$,
  extending the series by exact continuation of the Domb recursions up to 8x the seed
  and raising there; the dps-doubling check and every stored-reference comparison are
  raising gates rather than printed comparisons.

## 2026-09-06 — banana-expression.md: the K3 max-cut CM period stated as a candidate

The 'Boundary / arithmetic data' line 'K3 max-cut CM period = (P_num)²' now reads '... up to an algebraic·π normalization not yet pinned; the banana's own deeper-layer constant has not been matched against it' (the record: K3_EICHLER_LIFT.md, ARITHMETIC_BOUNDARY_PROBE.md — a prediction, not a verified integer-relation match). Wording only; no value, digit or script changed.

## 2026-09-06 — banana-evaluate.py: the three reference strings at the full length of the AMFlow record (140 / 110 / 140 digits); the printed agreement capped by the working precision; MANIFEST.sha256

- The three stored reference strings (t = -3, -7/2, 1/2) are now the eps^0 midpoints of the
  auxiliary-mass-flow record as written: 140 significant digits at t = -3 and t = 1/2
  (goal-130 runs; ball radii 7.7e-142 and 9.65e-141) and 110 at t = -7/2 (a goal-100
  run; radius 1.33e-110). The output file each string was read from and its configuration
  are named in the script beside the strings by file name and sha256 (T02_B.json, T20_A.json,
  T05_B.json), with the run's goal digits and the ball radius it reported. The 60-digit
  literals shipped before were round-to-nearest renderings of these strings (a byte prefix
  at t = -7/2; a rounded last digit at t = -3 and t = 1/2), and they capped the printed
  agreement at 60.0 d at every precision.
- The default run (dps 130) now prints 140.0 / 110.0 / 140.0 d (was 60.0 / 60.0 / 60.0 d);
  the gate bars move with the strings, min(dps, string digits) - 8 = 122.0 / 102.0 / 122.0 d
  (were 52.0 / 52.0 / 52.0 d). At `--dps 260` the same three figures with bars
  132.0 / 102.0 / 132.0 d and the doubling check at t = -3 taken to dps 520.
- The second field of each `REFS` entry is the record's own comparison of the closed form
  against the value at the record's working precision 120 (119.9 / 110.8 /
  119.8 d; 110.4-119.9 d over its 18 points). It used to be printed as a 'full-precision
  agreement' beside a smaller measured figure; it is now printed as what it is, the
  record's figure, and no longer as a cap.
- The printed agreement is min(measured, string digits, dps + 15) and names the active
  cap. At `--dps 30` the value and the parsed string coincide at the 45 working digits, the
  measured difference is exactly zero, and the previous release printed the string's full
  digit count (60.0 d at t = -3); the line now reads 45.0 d with the cap named as the
  working precision. The gate bar was dps-aware already and is unchanged; a [gate] line
  whose measured figure is infinite says so in words.
- Value path untouched: every 'this work' string, [certified] tail bound and N at the
  default, `--dps 260`, `--dps 30`, `--point=-7/2 --dps 260`, `--point=-3 --dps 30` and
  `--point 1.25 --dps 500` is byte-identical to the previous release 46d9c538e08d95c1
  with stamps and walls masked; the lines that differ are the reference strings, the
  agreement lines, the gate bars and the doubling line, nothing else. Measured here (one
  process each, a shared 96-core host at loadavg 147-150, nice 10, wall clock by
  GNU time; the previous release then this one): default 0.87 s -> 0.73 s;
  `--dps 260` 3.07 s -> 3.12 s; `--dps 30` 0.64 s -> 0.77 s;
  `--point=-7/2 --dps 260` 3.04 s -> 4.42 s.
- Controls on copies: significant digit 80 of the t = -3 string changed -> the default run
  FAILs by name at 79.90 d < 122.00 d (rc 1; at `--dps 260` the bar is 132.00 d); digit 30 changed
  -> 29.90 d < 122.00 d (rc 1); the same digit-30 change on the previous release -> 29.90 d
  < 52.00 d (rc 1).
- NEW `MANIFEST.sha256` for this directory (the sunrise form): the three downloads pinned
  (banana-evaluate.py, banana-4loop-evaluate.py, banana-expression.md); CHANGES.md and
  _snippet.md are the unpinned companions; `sha256sum -c MANIFEST.sha256` from the
  directory -> OK on every row. banana-4loop-evaluate.py and banana-expression.md are
  unchanged.
- sha256 of the cured script: banana-evaluate.py b0eaf656815a1adb… (was 46d9c538e08d95c1…).

## 2026-09-06 — banana-evaluate.py: `--heldout18`, all 18 points of the record gated against their stored strings

- NEW `--heldout18`: the `HELDOUT18` table in the script carries all 18 points held out of
  the fit (t = -7/2, -3 and the subthreshold sweep t = 1/8, 1/4, …, 7/2), each with the
  eps^0 midpoint string of its auxiliary-mass-flow output file (140 digits at the 4
  goal-130 points t = -3, 1/2, 3/2, 7/2; 110 at the 14 goal-100 points), the output and
  configuration sha256, the goal digits, the ball radius and the record's own comparison
  at its dps 120 (119.5-119.9 d at the goal-130 points, 110.4-111.2 d at the goal-100 points). The
  tier evaluates the closed form at every point at `--dps` (default 130) and gates each
  with the rule of the default run: bar min(dps, string digits) - 8, printed figure
  min(measured, string digits, dps + 15), the cap named beside the figure only when the
  figure sits at it (a figure below the cap prints plain); one row per point (point,
  source file, record digits, the record's figure, the value to 30 digits, agreement,
  bar, PASS/FAIL), then a VERDICT; a FAIL is raised by name and exits 1. The three `REFS`
  entries are asserted byte-equal to their rows. At dps 130: 18/18 PASS, minimum printed
  agreement 110.0 d (the 110-digit strings; bars 102 / 122 d); at `--dps 260` 18/18 PASS
  with bars 102 / 132 d; at `--dps 30` every row is capped by the working precision.
- `--mutate-heldout18 T[:K]`, the shipped control: significant digit K (default 80) of the
  stored string at point T (t as in the table, or its label) incremented in memory before
  the comparison -> that row FAILs by name, rc 1: `=-3:80` -> 79.9 d < 122.0 d; `T02:30` ->
  29.9 d < 122.0 d; `T45:90` at `--dps 260` -> 89.9 d < 102.0 d. A change inside the 8-digit
  margin passes by design (`T45:105` at `--dps 260`: 104.0 d >= 102.0 d; its row prints the
  plain figure 104.0, no cap label). K is an integer from 1 to the string's significant
  digits (110 or 140); any other K (`T20:120`, `=-3:0`, `=-3:abc`) is refused with the
  constraint named (rc 2). `--heldout18` with
  `--point`, and `--mutate-heldout18` without `--heldout18`, are refused (rc 2); the previous
  release refuses `--heldout18` as an unrecognized argument (rc 2).
- Walls, measured as above: `--heldout18` 1.37 s (0.51 s inside the tier, the
  rest the import-time coefficient cache); `--heldout18 --dps 260` 3.41 s (2.74 s);
  `--heldout18 --dps 30` 0.79 s. Two runs of the tier are byte-identical.
- The table lives in the script rather than in a data file beside it: the script is
  standalone by design (python3 + mpmath, no data files), the three references already
  live in-code, and the 18 strings with their provenance are five kilobytes.

## 2026-09-06 — banana-evaluate.py: `--continue`, the closed form continued past the disk (|t| >= 4, t -> t + i0) and gated at the physical-region points of the record; two data files

- NEW `--continue --point T`: the closed form is the eps^0 layer of the top master of the banana's
  raw four-master system, and past the MUM disk it is that system's solution continued from
  t = 2 along a path in the upper half t-plane (the Feynman t -> t + i0). The eps-graded system
  (20 components m0..m3 x eps^-3..eps^1, 108 exact-rational entries over t (t - 4)(t - 16)) ships
  as `banana-graded-system.json` (28ac510821843650) and the stored gate points as `banana-minkowski-gates.json`
  (8c384e630067d5e9): the auxiliary-mass-flow values of all four masters at every eps order at t = -8 (outside
  the disk on the Euclidean side), 5, 8, 12, 31/2 (between the pseudo-threshold and the threshold) and
  18, 25, 40, 100, 200 (above the threshold, the causal t + i0 value), each a goal-100 / goal-130 pair
  (10 points, 20 runs, 660 strings), and the two fresh points t = 10 and 20, predicted before they were
  run, each a goal-60 / goal-40 pair (4 runs, 132 strings); every string verbatim from the output file it
  names by sha256, with the ball radius and the digit count (its re_digits / im_digits fields count mantissa digits). Both files are pinned in the script by
  sha256 (`CONT_PINS`; a mismatch exits 3, a missing file 4, by name, before anything is computed).
- How the value is made: the state at t = 2 is the closed form's own value (`m1_eps0`, the same
  code path as every disk tier) beside the exact -Gamma(eps)^3 tower of m0 and the dotted masters'
  towers and the eps^1 layer from the holomorphic recursion of the same system at t = 0, whose free
  constants are m1[eps^K](0) = (0, 0, 0, 7 zeta_3, alpha_1) with alpha_1 the Bessel-moment constant of
  the record (110 digits, in the script beside its provenance); the recursion's own m1[eps^0](2) is
  a RAISING gate against the closed form (144.8 d at dps 130). From there a fixed-eps
  Taylor march along [2, 2 + 2i, t + 2i, t]: each step's Taylor coefficients from the exact recurrence
  of D(t) y' = N(t) y shifted to the step point (the a_(n+1) = (n+1)^-1 sum_k M_k a_(n-k) step taken
  through the polynomial denominator, no Cauchy product), the step half the distance to the nearest
  singular point (0, 4, 16), and every step's tail certified by the zero-run-aware geometric bound of
  the record's transport ((t_a + t_b)/(1 - r), r = (t_b/t_a)^(1/gap) clamped at 3/4, over the last two
  above-floor term magnitudes) against 10^-(dps+12) ||y||, halving on a miss and raising below 1/64.
  The same march at height 3 (route independence) and the lower detour t - i0 (the Schwarz control:
  it must be the complex conjugate) are RAISING gates at dps - 8; m1's negative orders are gated as
  structural zeros; the components with a resolved imaginary part are listed.
- The gate at a stored point: every transported component against its strings, Re and Im separately
  (relative to the modulus of the reference; a difference below the string's print resolution reads
  'identical'), bar min(dps, string digits) - 8, the eps^1 layer additionally capped by alpha_1's 110
  digits; at a fresh point the bar is the floor of its goal-60 / goal-40 pair (41 at both, the
  two-precision certificate of record); a miss FAILs by name, exit 1. Measured at the default dps 130
  on the delivered bytes: between the thresholds (t = 5, 8, 12, 31/2) the continued value is real
  (0/20 components with a resolved imaginary part; upper and lower detour agree) and matches the
  record's goal-100 / goal-130 pairs to floors 109.4 d at t = 5, 109.4 d at t = 8, 109.5 d at t = 12, 109.5 d at t = 31/2
  (the 110-digit strings cap the figure; bars 102 / 122 d); above the threshold (t = 18, 25, 40, 100,
  200) it is complex (6/20 components: the m1, m2, m3 layers at eps^0 and eps^1) and matches the causal
  record to floors 109.5 d at t = 18, 109.5 d at t = 25, 109.5 d at t = 40, 109.4 d at t = 100, 109.5 d at t = 200 with
  the imaginary parts at 110.2 d, 110.3 d, 110.4 d, 109.8 d, 109.5 d; at t = -8 (the Euclidean side outside the
  disk) 109.1 d. The value at t = 18: m1[eps^0](18 + i0) = 16.013444741306023172932444229... + 6.2032525151283026358842302262... i.
  Route independence (h = 2 vs 3) floors at 141.1 d over the ten points; the Schwarz control is
  'identical (20)' at every point (the lower detour is the conjugate computation, bit for bit).
- The two fresh points, on one block as the run prints it: t = 10 `89.7 d at goal 60 / 58.9 d at goal 40 / the pair floors at 41.5 d (bar 41)`;
  t = 20 `89.8 d at goal 60 / 59.0 d at goal 40 / the pair floors at 41.5 d (bar 41)` -- the figures of the record (89.7 / 58.9 / 41.5 at t = 10,
  89.8 / 59.0 / 41.5 at t = 20) reproduced by the served evaluator. At `--dps 60` (the precision of the
  record's prediction-first leg) the goal-60 strings are identical at the cap 60 and the goal-40 twins
  read 58.9 / 59.0 d.
- The in-disk control `--continue --point=-3`: the transported m1[eps^0] vs the closed form's own series
  144.1 d and vs the stored 140-digit string 140.0 d vs T02_B.json (140 d), bar 122.0. A point with no
  stored reference (`--point 7`) prints the value with the route, Schwarz and structural-zero gates
  only and names the stored points.
- Controls on the delivered bytes: `--continue --point 18 --mutate` (significant digit 30 of the
  stored m1[eps^0] real-part string incremented in memory) FAILs by name at 29.2 d < 102 d (rc 1);
  at t = 10 the same plant collapses the goal-60 figure to 28.1 d < 41 d (rc 1); `--lower-as-physical`
  at t = 18 (the t - i0 value offered as physical) FAILs by name on the imaginary parts of all six
  complex components (0.1-0.6 d < 102 d; the real parts still agree) (rc 1), and is refused below the
  threshold (rc 2) where the two detours coincide; t = 0, 4, 16 are refused as singular points (rc 2);
  `--continue` with `--heldout18`, without `--point`, or `--mutate` without `--continue` are refused
  (rc 2). On copies: a byte of a data file with the pin untouched exits 3 by name (the disk tiers,
  which never read the files, still run), a missing data file exits 4, a planted digit in a vendored
  string with the pin re-set passes the pin check and FAILs the gate at that point by name while the
  other points stay PASS.
- |t| >= 4 on the disk path (`--point 5` without `--continue`) is now refused by name with the tier
  named (exit 2; the previous release raised the series' own ValueError, exit 1); the series units
  themselves are untouched and still raise on such a point when used as a library. The docstring's
  fence paragraph (the two lines that said continuation was not implemented) names the tier; a
  CONTINUATION paragraph, the Usage lines, the exit codes 3 / 4 and the measured rows are added.
- Value path untouched: 31 of the 33 served units are byte-identical under the masked AST (the
  docstring and the __main__ block differ; 28 units added, none removed); the default, `--dps 260`,
  `--dps 30`, `--point=-7/2 --dps 260`, `--point 1.25 --dps 500`, `--point=-3 --dps 30`, `--heldout18` (at
  dps 130 / 260 / 30) and `--heldout18 --mutate-heldout18=-3:80` tiers are byte-identical before and
  after with stamps and walls masked (10 of 13 tiers; the designed differences: `--help`, which
  gains the three options, and the |t| >= 4 refusal).
- Walls (one process each, four side by side, a shared 96-core host at loadavg 89-99, nice 10, GNU
  time): `--continue --point 10` 10.7 s; `--point 18` 26.81 s; `--point 31/2` (next to the threshold)
  26.46 s; `--point 200` 53.95 s; `--point=-8` 9.56 s; `--point 10 --dps 60` 5.3 s; the
  in-disk control 7.37 s; 42-46 MB. Two runs of every point are byte-identical after masking.
- Not established (the record's own list): the thresholds themselves are never landed on (the
  exponent-1/2 branch data at t = 4 and 16 are not materialized); t -> infinity is not reached (the raw
  system is not Fuchsian there; the largest stored point is t = 200); the eps^2.. layers are carried by
  the same system but not gated (the state stops at eps^1); the fresh points certify goal 60 / 40 only
  (their pairs floor at 41.5 d); a closed form of alpha_1 is not known.
- MANIFEST.sha256 re-emitted by the generator with two new rows (the data files) and the evaluator's
  role naming the tier; sha256sum -c OK on every row. banana-4loop-evaluate.py and
  banana-expression.md are unchanged.
- sha256 of the cured script: banana-evaluate.py 96f9d5875af8e4a6… (was b0eaf656815a1adb…).

## 2026-09-08 — banana-evaluate.py: `--eps1`, the eps^1 layer of the top master on the disk gated at the 18 points of the record; `--bessel`, alpha_1 recomputed live; the word list vendored

- NEW `--eps1`: the eps^1 layer m1[eps^1](t) = alpha_1 varpi_0(t) + Part^(1)(t) on the MUM disk |t| < 4, by the same
  eps-graded holomorphic recursion of the raw four-master system that seeds `--continue` (`banana-graded-system.json`,
  the served unit `_cont_base_series` called unchanged, its term cap raised for the call since r = |t|/4 approaches 1),
  summed at the point. With the boundary data m1[eps^K](0) = (0, 0, 0, 7 zeta_3, alpha_1) the layer is linear in
  alpha_1: the homogeneous piece is the K3 period varpi_0 (the Domb series of the closed form), the rest the holomorphic
  eps^1 particular Part^(1); alpha_1 = m1[eps^1](0) is the Bessel-moment constant already in the script (`CONT_ALPHA1`,
  110 digits: 16 int_0^oo r ln r K_0(r)^4 dr - 7 zeta_3 (2 ln 2 + gamma_E), the eps^1 coefficient of the p^2 = 0
  vacuum banana in d = 2 - 2 eps), now with its provenance beside it (`EPS1_ALPHA1_PROVENANCE`: the record's two
  quadrature legs at dps 80 and 110, their agreement 80.1 d, the B(0) = 7 zeta_3 control 120.7 d, the finite-difference
  check). The certified tail is the recursion's own trailing-8-term bound x r/(1 - r), r = |t|/4, below 10^-(dps+12).
  Observed: with the physical boundary data the series converges with the radius of the threshold t = 16, not of the
  pseudo-threshold t = 4 (at t = 7/2, dps 110: 211 terms for the value, 2085 for the alpha_1 := 0 piece alone, 2206 for the
  closed form's Domb series; 1739 at dps 200, where the residual of the 110-digit alpha_1 must fall below the tolerance too).
- The 18 eps^1 strings: `HELDOUT18_EPS1` beside `HELDOUT18`, the eps^1 midpoint of the top master read from the SAME
  output file the eps^0 row names (the same output and configuration sha256, asserted by the tier at run time: 18/18
  keyed), with the goal digits and the ball radius; 140 digits at the four goal-130 points, 110 at the fourteen
  goal-100 points, imaginary part 0. At every point the layer is gated at bar min(dps, string digits, 110) - 8 (the
  layer carries alpha_1's 110 digits and no more), the printed figure min(measured, string digits, dps + 15, 110)
  with the active cap named; three RAISING gates ride beside: the recursion's eps^0 component against the closed form
  (at dps), alpha_1 fitted from the string ((string - Part^(1)) / varpi_0) against the stored constant (the same bar),
  and at t = 7/2 (or at `--point`) the decomposition itself (the recursion re-run with alpha_1 := 0 is Part^(1); the
  difference must be alpha_1 varpi_0 to dps - 8). Measured on the delivered bytes at dps 130: 18/18 PASS, minimum printed
  agreement 109.8 d at t = 5/4 (bars 102 d), alpha_1 fitted from every string 109.8-110.0 d, the eps^0 component >= 144.5 d,
  the decomposition 148.3 d at t = 7/2 (bar 122.0 d); 12.54 s. At `--dps 200`: 18/18, minimum 109.8 d, 24.88 s; at `--dps 260`: 18/18, minimum 109.8 d, 37.66 s.
  `--eps1 --point T` runs one point: a stored one is gated (t = 7/2 at dps 110 / 200: 5.19 / 12.05 s; t = -3 at dps 260:
  8.37 s); a point of the disk without a string prints the value with the eps^0 and decomposition gates and names the
  stored points (t = 1/3, t = 0: rc 0 / 0; at t = 0 the value is alpha_1 itself); |t| >= 4 is refused by name (rc 2 at
  t = 5, rc 2 at t = -9/2), the continuation tier named.
- NEW `--bessel`: alpha_1 recomputed live by tanh-sinh quadrature at --dps (+10 working digits; the record's split
  [0, 1, 4, 12, oo)): B(0) = 8 int r K_0^4 dr against 7 zeta_3 (the positive control, RAISING at dps - 8) and
  B[eps^1] against the stored string (RAISING at min(dps, 110) - 8; the quadrature's own error estimate printed as a
  diagnostic, not a certificate). Measured: dps 30 5.46 s (identical at the working precision dps+10 = 40), dps 60 12.19 s (70.0 d, the cap of the working precision),
  the default dps 130 103.32 s (110.0 d, the cap of the 110-digit string; B(0) vs 7 zeta_3 140.0 d).
- NEW `banana-eps1-words.json` (fe0c6cfb98c15d80…), the symbolic companion: the Dyson expansion of the certified 4 x 4 connection to
  eps^6 over the six-letter alphabet, word tower [1, 3, 10, 36, 131, 476, 1726], the words surviving at every physical eps order of the top
  master (22 structural / 12 after the record's regularized zeros C_{3,2} = C_{4,1} = 0 at eps^1, over the letters f2a, f2b, f4a, one)
  and each letter's first physical order; pinned in the script (`EPS1_PINS`; a mismatch exits 3, a missing file 4, by
  name), read and printed by `--eps1`, no number computed from it. The file is the record's object (b949d5715745d967…) with its
  two path fields reduced to basenames and a vendoring block appended; nothing else.
- `--mutate-eps1 T[:K]`, the shipped control (K default 30, the record's own planted digit): digit 30 of the t = 7/2
  eps^1 string incremented in memory -> `t = 7/2 m1[eps^1] (29.7 d < 102.0 d); t = 7/2 alpha_1 fitted from the string (29.9 d < 102.0 d)`, rc 1; K outside 1..the string's
  digits (`T07:141`, `T20:111`), a non-integer K (`T02:abc`), `--mutate-eps1` without `--eps1`, with `--point`, `--eps1`
  with `--continue` or `--heldout18`, `--bessel` with `--point` are refused (rc 2 / 2 / 2 / 2 / 2 / 2 / 2 / 2). On
  copies: a byte of the word list changed with the pin untouched exits 3 by name, the file missing exits 4.
- Value path untouched: 60 of the 61 served units are byte-identical under the masked AST (the `__main__` block
  differs, the docstring differs; 16 units added, none removed); the default, `--dps 30`, `--heldout18` and
  `--continue --point=-3` tiers are byte-identical before and after with stamps and walls masked; `--help` and the
  `|t| >= 4` refusal differ by the usage line and the three new options only. Not established (the record's own
  list): a closed form of alpha_1 (an integer relation search in the zeta / ln 2 / gamma_E ring and in the ring
  extended by L(f_3, 2) found none at height 10^4); the individual eps^1 boundary data of the canonical frame (only
  their combination alpha_1 is fixed); the letters f_2b, f_4a, f_4b, f_6 as explicit functions (the record pins f_2a
  only; the words are summed implicitly through the system); the figure at the goal-100 points is capped by the
  110-digit strings and no deeper eps^1 record was run; the eps^1 layer past the disk is carried by `--continue`.
- MANIFEST.sha256 re-emitted by the generator v3 with one new row (the word list) and the evaluator's role naming the
  tiers; sha256sum -c OK on every row. banana-4loop-evaluate.py, banana-expression.md, banana-graded-system.json and
  banana-minkowski-gates.json are unchanged.
- sha256 of the cured script: banana-evaluate.py a3a23e241742c5bc… (was 96f9d5875af8e4a6…).

## 2026-09-11 — banana-evaluate.py: `--bessel-eps`, the eps-layers of the top master at a Euclidean point from the exact-in-d Bessel representation, gating the stored eps^0..eps^5 record at t = -8; reduced_statement.py, the exact check of the four-loop reduced statement, ships beside banana-4loop-evaluate.py

- NEW `--bessel-eps K` (banana-evaluate.py a3a23e241742c5bc -> c58118d7ff4e4710): with the measure d^dk/pi^{d/2} per loop and no
  e^{gamma_E eps}, the three-loop top master at a Euclidean point t = p^2/m^2 <= 0 in d = 2 - 2 eps is one radial integral exact in eps,
  m1(t; eps) = 2^(3-3eps) int_0^oo r^(1+2eps) (a r)^eps J_{-eps}(a r) K_eps(r)^4 dr, a = sqrt(-t) (the position-space product of the
  four propagators; at eps = 0 the classical 8 int r J_0(a r) K_0^4 dr; at t = 0 the vacuum banana B(eps) of `--bessel`, whose eps^0 and
  eps^1 coefficients are 7 zeta_3 and alpha_1).  The layers m1[eps^k](t), k = 0..K, are its Taylor coefficients in eps, read off the
  circle |eps| = rho by the trapezoid rule with N nodes (conjugate nodes share one tanh-sinh quadrature with complex Bessel orders on the
  split [0, 1/4, 1, 3, 8, 16, 28, 45], extended while e^(-4 r_max) exceeds 10^-(dps+12)); m1(t; eps) is analytic on |eps| < 1/3 (d = 8/3,
  the banana's first divergence), so layer k carries min(N log10(1/(3 rho)), dps - k log10(1/rho)) digits a priori (aliasing /
  roundoff; 42.3 / 60 - 4k at the tier's defaults dps 60, N 12, rho 1e-4), a second pass at dps - 15 gives the two-precision floor per
  layer, every printed value is cut to its budget, and a (dps, N, rho, K) whose budget for layer K is under 20 d is refused by name.  The
  representation shares nothing with the four-master system, its MUM recursion or the `--continue` transport, so it gates what they
  carry: at t = -8, the stored Euclidean point of `banana-minkowski-gates.json` (8c384e630067d5e9..., read after the same sha256 pin check as
  `--continue`, this one file only), every stored order of both legs (the eps^2..eps^5 layers of that record were until now carried by
  the transport and gated by nothing independent of it); at the two Euclidean points of the 18-point record (t = -7/2, -3) the eps^0 and
  eps^1 strings; at t = 0 the two constants; on -4 < t < 0 the closed form at eps^0 -- each a RAISING gate at min(budget, string digits)
  - 8, FAIL by name, exit 1.  `--N`, `--rho`, `--point=T` (default t = -8) and `--dps` set the extraction (`--N`, `--rho` or
  `--planted` given without `--bessel-eps` is refused by name, exit 2); `--dps` given no value now resolves per mode (130 everywhere
  as before; 60 for `--bessel-eps`, where N 12 caps the layers at 42.3 d whatever the working precision).  t > 0 is refused by
  name (exit 2): below the threshold the kernel continues to the modified Bessel function of the first kind and above it the
  integral needs its own prescription; the physical region stays `--continue`'s.
- Measured on the delivered bytes (each run one process under a 2-CPU / 8 GiB fence at nice 10, the four tier rows side by side on a
  shared host at loadavg 114-141, GNU time): `--bessel-eps 5` (t = -8, dps 60, N 12, rho 1e-4): exit 0, 100.90 s (62.97 s +
  35.87 s inside the two passes), 40 MB; eps^0..eps^5 against the goal-100 leg's 110-digit strings 41.4 / 41.7 / 41.9 / 42.1 / 42.1 / 42.2 d,
  against the goal-130 leg's 140-digit strings 41.4 / 41.7 / 41.9 / 42.1 / 42.1 / 42.2 d (bars 34.3 / 34.3 / 34.3 / 34.3 / 34.3 / 32.0 d: the aliasing
  term caps the first five, roundoff the last), two-precision floors 46.7 / 43.5 / 40.2 / 36.2 / 32.3 / 29.5 d (bars 34.3 / 33.0 / 29.0 / 25.0 / 21.0 / 17.0 d);
  the six layers print cut to their budgets (42 / 42 / 42 / 42 / 42 / 40 significant digits, trailing zeros kept).  The independent re-run this tier was
  built to reproduce (an evaluation of the same representation by separate code at the same t, dps, N and rho; its record
  ae084f2faab67a6b..., its code dd6ef8414af3f5c6..., read, not shipped) reads 41.4 / 41.7 / 41.9 / 42.1 / 42.1 / 42.2 d against the same strings and two-precision floors
  46.7 / 43.5 / 39.8 / 36.2 / 32.3 / 29.5 d.  `--bessel-eps 5 --planted` (J_{+eps} for J_{-eps}): exit 1 by name, 103.81 s -- eps^1 = -71.61317...
  against the stored -51.29... (0.4 d < 34.3 d on both legs), eps^0 still passing at 39.7 d (J_0 either way; only the
  aliasing tail of the flipped function differs).
  `--bessel-eps 1 --point=-3` (dps 60): exit 0, 97.54 s -- eps^0 against the 140-digit string 41.4 d and against the closed form
  m1_eps0 41.4 d, eps^1 against its string 41.8 d (bars 34.3 / 34.3 d).  `--bessel-eps 1 --point 0 --dps 40`: exit 0,
  45.10 s -- 7 zeta_3 to 41.0 d (bar 32.0), alpha_1 to 37.7 d (bar 28.0; no J at t = 0, so `--planted` is refused there,
  exit 2).  Refusals by name: `--point 5` exit 2; `--bessel-eps 5 --dps 30 --N 8 --rho 1e-3` (budget 15 d < 20 d) exit 2;
  `--planted` without the tier exit 2; `--N 8` / `--rho 1e-3` without the tier exit 2 / 2; `--bessel-eps` with `--eps1`
  exit 2.  On copies: one byte appended to the gates file exits 3 by name, the file moved away exits 4 by name.
- Value path untouched: under the masked AST 75 of the 77 served units are identical (the docstring and the `__main__`
  block differ; with string constants masked as well only `__main__` differs), 18 units added, none removed; the default,
  `--dps 30` and `--heldout18 --dps 30` outputs are byte-identical before and after with walls masked (exit 0 / 0 / 0 both sides);
  `--help` differs by the four new options and the `--dps` help text only.  Not carried, stated: t > 0; a row at dps 130 (not measured
  here: at N 12 it would carry the same 42.3 d); a certificate of the quadrature itself (its error estimate prints as a diagnostic; the
  two-precision floor and the strings are the gates).
- NEW `reduced_statement.py` (2bf25fca161bd199; the row-34 tool's bytes 52d5d1415c6e8de1 with one code unit changed and its reference notes
  re-worded: the derivation it cites is an independent reference derivation of 2026-09-10, on file with the authors): the exact check of the
  REDUCED STATEMENT of the four-loop equal-mass banana at eps^0 -- it reads the DATA block of `banana-4loop-evaluate.py` (pinned to that
  file's sha256 961496c2e17af613 and to its own DATA_SHA256; exit 3 on a mismatch; nothing imported or executed from it), rebuilds the residue
  and checks it nilpotent of index 8, runs the log-Frobenius recursion exactly in the zeta-ring Q[zeta_2, zeta_3, zeta_4], and verifies
  that the n = 0 log-tower of the top master is (0, 80 zeta_3, 0, 0, -5) and that the Picard-Fuchs operator L4 (AESZ 34) applied to
  (-s) I^(0) is -120 exactly, i.e. L4[s I^(0)] = +120 = 5!, with a numeric cross-check against -120 varpi_4 + 80 zeta_3 varpi_1 at
  z0 = 1/128.  The changed unit is `_served_default`: the evaluator BESIDE the file is found first (the two ship in one directory), then
  BANANA4_EVALUATE, BOOTSTRAP_ROOT or the tree above; `--served PATH` names it explicitly; the module docstring's resolution sentence
  follows; every other unit is the parent's under the masked AST (29 identical, 3 changed: the docstring, that function, and
  `main`, where only the wording of four message strings and one `--json` report key moved; with strings masked, 1).  Measured on the
  delivered bytes (same fence): `python3 reduced_statement.py --reduced-statement --nterms 75 --dps 60`
  exit 0, 5.59 s, 30 MB, the evaluator resolved beside the script, `=> L4[(-s) I^(0)] = -120 exactly, i.e. L4[s I^(0)] = +120 = 5! (the reference derivation's normalisation): PASS`, the numeric cross-check 70.3 d (truncation cap
  53.2 d); the parent bytes with `--served` pointed at the same evaluator print the same figures line for line: the two outputs
  differ only in the two label lines that name the reference derivation (output lines 15 and 16 of 17; every number on them identical)
  and, when `--served` names a copy of the evaluator elsewhere, in the path line (line 1);
  `--planted` (the boundary constant behind the 80 zeta_3 shifted) exit 1 by name (`boundary vector != (0, 80 zeta_3, 0, 0, -5)`); a copy
  beside an evaluator with one byte appended exits 3 by name (`REFUSED (exit 3): served file sha256 ... != the pin of this check`).
- NOT in this bundle, stated: the repeated-root cure of the CY3 coalescence engine's singular-point finder (the (1,4,4,9) operator's
  leading coefficient carries (4z+1)^2): no such engine ships under files/banana (the threshold-family evaluator of the sibling bundle
  finds its singular points with mpmath polyroots, a different code path), so that cure belongs with that engine's own home.
- `MANIFEST.sha256` re-emitted by the generator v4 (v3 of the served header plus one ROLES row for reduced_statement.py, the
  `--bessel-eps` words in the evaluator's role, the PRODUCER line, and the assertion that reduced_statement.py's pin equals
  banana-4loop-evaluate.py's sha256; every other header line and the five untouched rows byte for byte; `sha256sum -c` exits 0 on all
  7 rows).  Every `.py` of the bundle (3) passes `py_compile`.  banana-4loop-evaluate.py, banana-expression.md, the three data
  files and _snippet.md are unchanged.
- sha256 of the cured script: banana-evaluate.py c58118d7ff4e4710… (was a3a23e241742c5bc…); reduced_statement.py 2bf25fca161bd199… (parent 52d5d1415c6e8de1…).
