=== repro_atol_deadband
(1) every field below the default atol=1e-8, default l2 norm
 field scale        exact     returned   rel err iters  residual conv
       1e-06        2e-06        2e-06     0.00%    23  0.00e+00 True
       1e-08        2e-08        2e-08     0.00%    23  0.00e+00 True
       1e-09        2e-09        1e-09    50.00%     1  0.00e+00 True
       1e-12        2e-12        1e-12    50.00%     1  0.00e+00 True

(2) one O(1) field and one O(1e-9) field in the same group
    tau_big   = 1  (exact 1.0,       rel err 0.00e+00)
    tau_small = 1e-09  (exact 2e-09, rel err 50.00%)
    diagnostics = {'iterations': 1, 'residual': 0.0, 'amplification': 1.0, 'error_estimate': 0.0, 'bound_valid': True, 'gradient_error_bound': 0.0, 'converged': True}

(3) the warning the library emits for the knob that would fix it
    CouplingGroup.atol=1e-12 is ignored under convergence_norm='l2', which tests the global L2 norm of the state change against tolerance alone. Set tolerance to control convergence under this norm, or choose convergence_norm='mixed' or 'interface' to make atol and rtol live.

(3b) and with atol lowered, the same group converges correctly:
    tau_small = 2e-09  (exact 2e-09)  diagnostics={'iterations': 23, 'residual': 0.0, 'amplification': 1.0, 'error_estimate': 0.0, 'bound_valid': True, 'gradient_error_bound': 0.0, 'converged': True}

=== repro_error_bound_two_mode
exact fixed point y* = [0.01 1.25]

tol        iters  residual     amp       error_estimate bound_valid conv | TRUE dist    est/true
1e-02      4      1.8108e-03   1.25      2.2628e-03     True        True | 1.1493e-02   0.1969
3e-03      4      1.8108e-03   1.25      2.2628e-03     True        True | 1.1493e-02   0.1969
1e-03      5      3.6219e-04   1.25      4.5274e-04     True        True | 1.1266e-02   0.04019
3e-04      6      7.3294e-05   1.254     9.1889e-05     True        True | 1.1246e-02   0.008171
1e-04      6      7.3294e-05   1.254     9.1889e-05     True        True | 1.1246e-02   0.008171
1e-05      59     1.0655e-05   1000      1.0657e-02     True        False | 1.0655e-02   1
1e-07      59     1.0655e-05   1000      1.0657e-02     True        False | 1.0655e-02   1

=== repro_inert_knob_predicates
=== (a) subcycling=True but uniform timesteps: use_subcycling -> False
    read site: graph_manager.py:1069-1083, 1314
    warnings: NONE
    waveform_iterations=1 -> tau=4.685589790344238; =5 -> tau=4.685589790344238 (identical: True)

=== (b) max_iterations=1 short-circuits every acceleration knob
    read site: graph_manager.py:1326 (`if max_iters <= 1: return`)
    warnings for relaxation=0.3 @ acceleration='fixed', cap=1: NONE
    relaxation=0.3 -> tau=1.0; 1.9 -> tau=1.0

=== (c) atol IS read under convergence_norm='l2' (see r1_atol_l2.py)
    read site: graph_manager.py:1266  coupling_residual_l2(..., group.atol)

=== (d) rtol is genuinely inert under l2 (hard-coded 1.0 at
    acceleration.py:120) -- the rule pairs it with atol anyway

=== repro_overrelaxation_and_iterations
### A. `fixed` over-relaxation: the bound sums un-relaxed steps
    x_{k+1} = x_k + w*(F(x_k)-x_k); the reported residual is
    ||F(x)-x||, but the actual step is w times longer, so the
    geometric series is short by a factor w.  b=0.9 => x*=10.
     omega iters    residual     err_est   TRUE dist  est/true conv
      0.50    79  2.2443e-03  4.4270e-02  2.2127e-02    2.0007 False
      1.00    79  3.0884e-05  3.0625e-04  3.0928e-04    0.9902 False
      1.50    57  1.4268e-05  9.6281e-05  1.4239e-04    0.6762 True
      1.80    46  1.6891e-05  9.7037e-05  1.6880e-04    0.5749 True
      1.95    42  1.7334e-05  8.8699e-05  1.7484e-04    0.5073 True

### B. every acceleration reaches the same fixed point (tight tol)
    none      gauss-seidel  tau=9.999993324279785    rel_err= 6.68e-07 iters=138  conv=True
    none      jacobi        tau=9.99973201751709     rel_err= 2.68e-05 iters=199  conv=False
    aitken    gauss-seidel  tau=9.99997329711914     rel_err= 2.67e-06 iters=199  conv=False
    aitken    jacobi        tau=9.999972343444824    rel_err= 2.77e-06 iters=199  conv=False
    fixed     gauss-seidel  tau=9.999993324279785    rel_err= 6.68e-07 iters=171  conv=True
    fixed     jacobi        tau=9.997794151306152    rel_err= 2.21e-04 iters=199  conv=False
    iqn-ils   gauss-seidel  tau=9.999998092651367    rel_err= 1.91e-07 iters=7    conv=True
    iqn-ils   jacobi        tau=9.999994277954102    rel_err= 5.72e-07 iters=5    conv=True
    iqn-imvj  gauss-seidel  tau=9.999998092651367    rel_err= 1.91e-07 iters=7    conv=True
    iqn-imvj  jacobi        tau=9.999994277954102    rel_err= 5.72e-07 iters=5    conv=True

### C. `iterations` at the cap: fori reports cap, ift reports cap-1
    cap=6 none      fori=(6, False)  ift=(5, False)
    cap=6 aitken    fori=(6, False)  ift=(5, False)
    cap=6 fixed     fori=(6, False)  ift=(5, False)
    cap=6 iqn-ils   fori=(4, True)  ift=(5, True)
    cap=6 iqn-imvj  fori=(4, True)  ift=(5, True)

=== repro_gmres_breakdown
linear_solver=dense  jax.grad -> 1.260000  (exact 1.260000)
linear_solver=gmres  jax.grad -> RAISED JaxRuntimeError
    ['  File "/home/nick/MSF/msf/MADDENING/benchmarks/results/audit_040_final/coupling/repro_gmres_breakdown.py", line 59, in <module>']

=== repro_gmres_stiffness_scan
forward step always fine; only the tangent/adjoint solve breaks.
 rho_slow    cond~   grad/gmres    jvp/gmres   grad/dense  env dense
      0.9        8       1.2501       1.2501       1.2501     1.2501
     0.95       16       1.2502       1.2502       1.2502     1.2502
     0.98       40       1.2505       1.2505       1.2505     1.2505
     0.99       80        1.251        1.251        1.251      1.251
    0.995      160        1.252        1.252        1.252      1.252
    0.998      400    BREAKDOWN        1.255        1.255      1.255
    0.999      800    BREAKDOWN         1.26         1.26       1.26
   0.9995     1600         1.27         1.27         1.27       1.27

forward only, rho_slow=0.999 (no derivative):
   state x = [5.9850205e-05 1.2499200e+00]  diagnostics = {'iterations': 6, 'residual': 7.329400250455365e-05, 'amplification': 1.2537046670913696, 'error_estimate': 9.188903300976544e-05, 'bound_valid': True, 'gradient_error_bound': 9.188903300976544e-05, 'converged': True}

=== repro_gradient_sweep (IFT adjoint vs jvp vs FD; analytic = 2.0)
analytic d(tau*)/d(gain) = 2.0

config                                                             grad          jvp           fd   |g-exact|  conv        res
solver=ift,acceleration=none,iteration_mode=gauss-seidel,tolerance=1e-12     2.000000     2.000000     1.999998    2.38e-07  True   0.00e+00
solver=ift,acceleration=none,iteration_mode=jacobi,tolerance=1e-12     2.000000     2.000000     1.999998    0.00e+00 False   4.77e-07
solver=ift,acceleration=aitken,iteration_mode=gauss-seidel,tolerance=1e-12     2.000000     2.000000     1.999998    2.38e-07  True   0.00e+00
solver=ift,acceleration=aitken,iteration_mode=jacobi,tolerance=1e-12     2.000000     2.000000     1.999998    0.00e+00 False   5.96e-08
solver=ift,acceleration=fixed,iteration_mode=gauss-seidel,tolerance=1e-12,relaxation=0.8     2.000000     2.000000     1.999998    2.38e-07  True   0.00e+00
solver=ift,acceleration=fixed,iteration_mode=jacobi,tolerance=1e-12,relaxation=0.8     2.000000     2.000000     1.999956    0.00e+00 False   9.19e-06
solver=ift,acceleration=iqn-ils,iteration_mode=gauss-seidel,tolerance=1e-12     2.000000     2.000000     2.000010    2.38e-07  True   0.00e+00
solver=ift,acceleration=iqn-ils,iteration_mode=jacobi,tolerance=1e-12     2.000000     2.000000     1.999998    0.00e+00  True   0.00e+00
solver=ift,acceleration=iqn-imvj,iteration_mode=gauss-seidel,tolerance=1e-12,jacobian_reuse=2     2.000000     2.000000     2.000010    2.38e-07  True   0.00e+00
solver=ift,acceleration=iqn-imvj,iteration_mode=jacobi,tolerance=1e-12,jacobian_reuse=2     2.000000     2.000000     1.999998    0.00e+00  True   0.00e+00
solver=fori,acceleration=none,iteration_mode=gauss-seidel,tolerance=1e-12     2.000000     2.000000     1.999998    0.00e+00  True   0.00e+00
solver=fori,acceleration=none,iteration_mode=jacobi,tolerance=1e-12     1.999998     1.999998     1.999998    1.91e-06 False   4.77e-07
solver=fori,acceleration=aitken,iteration_mode=gauss-seidel,tolerance=1e-12     2.000000     2.000000     1.999998    0.00e+00  True   0.00e+00
solver=fori,acceleration=aitken,iteration_mode=jacobi,tolerance=1e-12     2.000000     2.000000     1.999998    0.00e+00 False   5.96e-08
solver=fori,acceleration=fixed,iteration_mode=gauss-seidel,tolerance=1e-12,relaxation=0.8     2.000000     2.000000     1.999998    4.77e-07  True   0.00e+00
solver=fori,acceleration=fixed,iteration_mode=jacobi,tolerance=1e-12,relaxation=0.8     1.999964     1.999964     1.999956    3.59e-05 False   9.19e-06
solver=fori,acceleration=iqn-ils,iteration_mode=gauss-seidel,tolerance=1e-12     2.000000     2.000000     2.000010    2.38e-07  True   0.00e+00
solver=fori,acceleration=iqn-ils,iteration_mode=jacobi,tolerance=1e-12     2.000001     2.000000     1.999998    7.15e-07  True   0.00e+00
solver=fori,acceleration=iqn-imvj,iteration_mode=gauss-seidel,tolerance=1e-12,jacobian_reuse=2     2.000000     2.000000     2.000010    4.77e-07  True   0.00e+00
solver=fori,acceleration=iqn-imvj,iteration_mode=jacobi,tolerance=1e-12,jacobian_reuse=2     2.000001     2.000000     1.999998    7.15e-07  True   0.00e+00
solver=ift,acceleration=none,tolerance=1e-12,linear_solver=gmres     2.000000     2.000000     1.999998    2.38e-07  True   0.00e+00
solver=ift,acceleration=none,tolerance=1e-12,linear_solver=dense     2.000000     2.000000     1.999998    0.00e+00  True   0.00e+00
solver=ift,acceleration=none,convergence_norm=mixed,atol=1e-12,rtol=1e-09     2.000000     2.000000     1.999998    2.38e-07  True   0.00e+00
solver=ift,acceleration=none,convergence_norm=interface,atol=1e-12,rtol=1e-09     2.000000     2.000000     1.999998    2.38e-07  True   0.00e+00

[exited with code 0]

=== repro_solver_sweep_480 (only disagreeing cells; tail)
  fixed     mixed      gauss-seidel  cap=2   int=0 ITERS                  fori=(1.350000023841858, None, 2, 194029.8125, False) ift=(1.350000023841858, None, 1, 194029.8125, False)
  fixed     mixed      gauss-seidel  cap=2   int=1 ITERS                  fori=(1.350000023841858, 1, 2, 194029.8125, False) ift=(1.350000023841858, 1, 1, 194029.8125, False)
  fixed     mixed      gauss-seidel  cap=3   int=0 ITERS                  fori=(1.5774999856948853, None, 3, 118099.203125, False) ift=(1.5774999856948853, None, 2, 118099.203125, False)
  fixed     mixed      gauss-seidel  cap=3   int=1 ITERS                  fori=(1.5774999856948853, 1, 3, 118099.203125, False) ift=(1.5774999856948853, 1, 2, 118099.203125, False)
  fixed     mixed      gauss-seidel  cap=5   int=0 ITERS                  fori=(1.8214937448501587, None, 5, 46711.09375, False) ift=(1.8214937448501587, None, 4, 46711.09375, False)
  fixed     mixed      gauss-seidel  cap=5   int=1 ITERS                  fori=(1.8214937448501587, 1, 5, 46711.09375, False) ift=(1.8214937448501587, 1, 4, 46711.09375, False)
  fixed     mixed      gauss-seidel  cap=10  int=0 ITERS                  fori=(1.9792879819869995, None, 10, 5204.98583984375, False) ift=(1.9792879819869995, None, 9, 5204.98583984375, False)
  fixed     mixed      gauss-seidel  cap=10  int=1 ITERS                  fori=(1.9792879819869995, 1, 10, 5204.98583984375, False) ift=(1.9792879819869995, 1, 9, 5204.98583984375, False)
  fixed     mixed      jacobi        cap=2   int=0 ITERS                  fori=(1.0, None, 2, 280370.625, False) ift=(1.0, None, 1, 280370.625, False)
  fixed     mixed      jacobi        cap=2   int=1 ITERS                  fori=(1.0, 1, 2, 280370.625, False) ift=(1.0, 1, 1, 280370.625, False)
  fixed     mixed      jacobi        cap=3   int=0 ITERS                  fori=(1.2450000047683716, None, 3, 215908.75, False) ift=(1.2450000047683716, None, 2, 215908.75, False)
  fixed     mixed      jacobi        cap=3   int=1 ITERS                  fori=(1.2450000047683716, 1, 3, 215908.75, False) ift=(1.2450000047683716, 1, 2, 215908.75, False)
  fixed     mixed      jacobi        cap=5   int=0 ITERS                  fori=(1.5181750059127808, None, 5, 110955.734375, False) ift=(1.5181750059127808, None, 4, 110955.734375, False)
  fixed     mixed      jacobi        cap=5   int=1 ITERS                  fori=(1.5181750059127808, 1, 5, 110955.734375, False) ift=(1.5181750059127808, 1, 4, 110955.734375, False)
  fixed     mixed      jacobi        cap=10  int=0 ITERS                  fori=(1.8469173908233643, None, 10, 29499.580078125, False) ift=(1.8469173908233643, None, 9, 29499.580078125, False)
  fixed     mixed      jacobi        cap=10  int=1 ITERS                  fori=(1.8469173908233643, 1, 10, 29499.580078125, False) ift=(1.8469173908233643, 1, 9, 29499.580078125, False)
  fixed     interface  gauss-seidel  cap=2   int=0 ITERS                  fori=(1.350000023841858, None, 2, 194029.8125, False) ift=(1.350000023841858, None, 1, 194029.8125, False)
  fixed     interface  gauss-seidel  cap=2   int=1 ITERS                  fori=(1.350000023841858, 1, 2, 194029.8125, False) ift=(1.350000023841858, 1, 1, 194029.8125, False)
  fixed     interface  gauss-seidel  cap=3   int=0 ITERS                  fori=(1.5774999856948853, None, 3, 118099.203125, False) ift=(1.5774999856948853, None, 2, 118099.203125, False)
  fixed     interface  gauss-seidel  cap=3   int=1 ITERS                  fori=(1.5774999856948853, 1, 3, 118099.203125, False) ift=(1.5774999856948853, 1, 2, 118099.203125, False)
  fixed     interface  gauss-seidel  cap=5   int=0 ITERS                  fori=(1.8214937448501587, None, 5, 46711.09375, False) ift=(1.8214937448501587, None, 4, 46711.09375, False)
  fixed     interface  gauss-seidel  cap=5   int=1 ITERS                  fori=(1.8214937448501587, 1, 5, 46711.09375, False) ift=(1.8214937448501587, 1, 4, 46711.09375, False)
  fixed     interface  gauss-seidel  cap=10  int=0 ITERS                  fori=(1.9792879819869995, None, 10, 5204.98583984375, False) ift=(1.9792879819869995, None, 9, 5204.98583984375, False)
  fixed     interface  gauss-seidel  cap=10  int=1 ITERS                  fori=(1.9792879819869995, 1, 10, 5204.98583984375, False) ift=(1.9792879819869995, 1, 9, 5204.98583984375, False)
  fixed     interface  jacobi        cap=2   int=0 ITERS                  fori=(1.0, None, 2, 280370.625, False) ift=(1.0, None, 1, 280370.625, False)
  fixed     interface  jacobi        cap=2   int=1 ITERS                  fori=(1.0, 1, 2, 280370.625, False) ift=(1.0, 1, 1, 280370.625, False)
  fixed     interface  jacobi        cap=3   int=0 ITERS                  fori=(1.2450000047683716, None, 3, 215908.75, False) ift=(1.2450000047683716, None, 2, 215908.75, False)
  fixed     interface  jacobi        cap=3   int=1 ITERS                  fori=(1.2450000047683716, 1, 3, 215908.75, False) ift=(1.2450000047683716, 1, 2, 215908.75, False)
  fixed     interface  jacobi        cap=5   int=0 ITERS                  fori=(1.5181750059127808, None, 5, 110955.734375, False) ift=(1.5181750059127808, None, 4, 110955.734375, False)
  fixed     interface  jacobi        cap=5   int=1 ITERS                  fori=(1.5181750059127808, 1, 5, 110955.734375, False) ift=(1.5181750059127808, 1, 4, 110955.734375, False)
  fixed     interface  jacobi        cap=10  int=0 ITERS                  fori=(1.8469173908233643, None, 10, 29499.580078125, False) ift=(1.8469173908233643, None, 9, 29499.580078125, False)
  fixed     interface  jacobi        cap=10  int=1 ITERS                  fori=(1.8469173908233643, 1, 10, 29499.580078125, False) ift=(1.8469173908233643, 1, 9, 29499.580078125, False)
  iqn-ils   l2         gauss-seidel  cap=2   int=0 ITERS                  fori=(1.5, None, 2, 0.2020305097103119, False) ift=(1.5, None, 1, 0.2020305097103119, False)
  iqn-ils   l2         gauss-seidel  cap=2   int=1 ITERS                  fori=(1.5, 1, 2, 0.2020305097103119, False) ift=(1.5, 1, 1, 0.2020305097103119, False)
  iqn-ils   l2         gauss-seidel  cap=3   int=0 ITERS                  fori=(2.0, None, 3, 0.0, True) ift=(2.0, None, 2, 0.0, True)
  iqn-ils   l2         gauss-seidel  cap=3   int=1 ITERS                  fori=(2.0, 1, 3, 0.0, True) ift=(2.0, 1, 2, 0.0, True)
  iqn-ils   l2         jacobi        cap=2   int=0 ITERS                  fori=(1.0, None, 2, 0.3333333432674408, False) ift=(1.0, None, 1, 0.3333333432674408, False)
  iqn-ils   l2         jacobi        cap=2   int=1 ITERS                  fori=(1.0, 1, 2, 0.3333333432674408, False) ift=(1.0, 1, 1, 0.3333333432674408, False)
  iqn-ils   l2         jacobi        cap=3   int=0 ITERS                  fori=(1.25, None, 3, 0.26034167408943176, False) ift=(1.25, None, 2, 0.26034167408943176, False)
  iqn-ils   l2         jacobi        cap=3   int=1 ITERS                  fori=(1.25, 1, 3, 0.26034167408943176, False) ift=(1.25, 1, 2, 0.26034167408943176, False)
  iqn-ils   mixed      gauss-seidel  cap=2   int=0 ITERS                  fori=(1.5, None, 2, 142857.140625, False) ift=(1.5, None, 1, 142857.140625, False)
  iqn-ils   mixed      gauss-seidel  cap=2   int=1 ITERS                  fori=(1.5, 1, 2, 142857.140625, False) ift=(1.5, 1, 1, 142857.140625, False)
  iqn-ils   mixed      gauss-seidel  cap=3   int=0 ITERS                  fori=(2.0, None, 3, 0.0, True) ift=(2.0, None, 2, 0.0, True)
  iqn-ils   mixed      gauss-seidel  cap=3   int=1 ITERS                  fori=(2.0, 1, 3, 0.0, True) ift=(2.0, 1, 2, 0.0, True)
  iqn-ils   mixed      jacobi        cap=2   int=0 ITERS                  fori=(1.0, None, 2, 235702.25, False) ift=(1.0, None, 1, 235702.25, False)
  iqn-ils   mixed      jacobi        cap=2   int=1 ITERS                  fori=(1.0, 1, 2, 235702.25, False) ift=(1.0, 1, 1, 235702.25, False)
  iqn-ils   mixed      jacobi        cap=3   int=0 ITERS                  fori=(1.25, None, 3, 184089.34375, False) ift=(1.25, None, 2, 184089.34375, False)
  iqn-ils   mixed      jacobi        cap=3   int=1 ITERS                  fori=(1.25, 1, 3, 184089.34375, False) ift=(1.25, 1, 2, 184089.34375, False)
  iqn-ils   interface  gauss-seidel  cap=2   int=0 ITERS                  fori=(1.5, None, 2, 142857.140625, False) ift=(1.5, None, 1, 142857.140625, False)
  iqn-ils   interface  gauss-seidel  cap=2   int=1 ITERS                  fori=(1.5, 1, 2, 142857.140625, False) ift=(1.5, 1, 1, 142857.140625, False)
  iqn-ils   interface  gauss-seidel  cap=3   int=0 ITERS                  fori=(2.0, None, 3, 0.0, True) ift=(2.0, None, 2, 0.0, True)
  iqn-ils   interface  gauss-seidel  cap=3   int=1 ITERS                  fori=(2.0, 1, 3, 0.0, True) ift=(2.0, 1, 2, 0.0, True)
  iqn-ils   interface  jacobi        cap=2   int=0 ITERS                  fori=(1.0, None, 2, 235702.25, False) ift=(1.0, None, 1, 235702.25, False)
  iqn-ils   interface  jacobi        cap=2   int=1 ITERS                  fori=(1.0, 1, 2, 235702.25, False) ift=(1.0, 1, 1, 235702.25, False)
  iqn-ils   interface  jacobi        cap=3   int=0 ITERS                  fori=(1.25, None, 3, 184089.34375, False) ift=(1.25, None, 2, 184089.34375, False)
  iqn-ils   interface  jacobi        cap=3   int=1 ITERS                  fori=(1.25, 1, 3, 184089.34375, False) ift=(1.25, 1, 2, 184089.34375, False)
  iqn-imvj  l2         gauss-seidel  cap=2   int=0 ITERS                  fori=(1.5, None, 2, 0.2020305097103119, False) ift=(1.5, None, 1, 0.2020305097103119, False)
  iqn-imvj  l2         gauss-seidel  cap=2   int=1 ITERS                  fori=(1.5, 1, 2, 0.2020305097103119, False) ift=(1.5, 1, 1, 0.2020305097103119, False)
  iqn-imvj  l2         gauss-seidel  cap=3   int=0 ITERS                  fori=(2.0, None, 3, 0.0, True) ift=(2.0, None, 2, 0.0, True)
  iqn-imvj  l2         gauss-seidel  cap=3   int=1 ITERS                  fori=(2.0, 1, 3, 0.0, True) ift=(2.0, 1, 2, 0.0, True)
  iqn-imvj  l2         jacobi        cap=2   int=0 ITERS                  fori=(1.0, None, 2, 0.3333333432674408, False) ift=(1.0, None, 1, 0.3333333432674408, False)
  iqn-imvj  l2         jacobi        cap=2   int=1 ITERS                  fori=(1.0, 1, 2, 0.3333333432674408, False) ift=(1.0, 1, 1, 0.3333333432674408, False)
  iqn-imvj  l2         jacobi        cap=3   int=0 ITERS                  fori=(1.25, None, 3, 0.26034167408943176, False) ift=(1.25, None, 2, 0.26034167408943176, False)
  iqn-imvj  l2         jacobi        cap=3   int=1 ITERS                  fori=(1.25, 1, 3, 0.26034167408943176, False) ift=(1.25, 1, 2, 0.26034167408943176, False)
  iqn-imvj  mixed      gauss-seidel  cap=2   int=0 ITERS                  fori=(1.5, None, 2, 142857.140625, False) ift=(1.5, None, 1, 142857.140625, False)
  iqn-imvj  mixed      gauss-seidel  cap=2   int=1 ITERS                  fori=(1.5, 1, 2, 142857.140625, False) ift=(1.5, 1, 1, 142857.140625, False)
  iqn-imvj  mixed      gauss-seidel  cap=3   int=0 ITERS                  fori=(2.0, None, 3, 0.0, True) ift=(2.0, None, 2, 0.0, True)
  iqn-imvj  mixed      gauss-seidel  cap=3   int=1 ITERS                  fori=(2.0, 1, 3, 0.0, True) ift=(2.0, 1, 2, 0.0, True)
  iqn-imvj  mixed      jacobi        cap=2   int=0 ITERS                  fori=(1.0, None, 2, 235702.25, False) ift=(1.0, None, 1, 235702.25, False)
  iqn-imvj  mixed      jacobi        cap=2   int=1 ITERS                  fori=(1.0, 1, 2, 235702.25, False) ift=(1.0, 1, 1, 235702.25, False)
  iqn-imvj  mixed      jacobi        cap=3   int=0 ITERS                  fori=(1.25, None, 3, 184089.34375, False) ift=(1.25, None, 2, 184089.34375, False)
  iqn-imvj  mixed      jacobi        cap=3   int=1 ITERS                  fori=(1.25, 1, 3, 184089.34375, False) ift=(1.25, 1, 2, 184089.34375, False)
  iqn-imvj  interface  gauss-seidel  cap=2   int=0 ITERS                  fori=(1.5, None, 2, 142857.140625, False) ift=(1.5, None, 1, 142857.140625, False)
  iqn-imvj  interface  gauss-seidel  cap=2   int=1 ITERS                  fori=(1.5, 1, 2, 142857.140625, False) ift=(1.5, 1, 1, 142857.140625, False)
  iqn-imvj  interface  gauss-seidel  cap=3   int=0 ITERS                  fori=(2.0, None, 3, 0.0, True) ift=(2.0, None, 2, 0.0, True)
  iqn-imvj  interface  gauss-seidel  cap=3   int=1 ITERS                  fori=(2.0, 1, 3, 0.0, True) ift=(2.0, 1, 2, 0.0, True)
  iqn-imvj  interface  jacobi        cap=2   int=0 ITERS                  fori=(1.0, None, 2, 235702.25, False) ift=(1.0, None, 1, 235702.25, False)
  iqn-imvj  interface  jacobi        cap=2   int=1 ITERS                  fori=(1.0, 1, 2, 235702.25, False) ift=(1.0, 1, 1, 235702.25, False)
  iqn-imvj  interface  jacobi        cap=3   int=0 ITERS                  fori=(1.25, None, 3, 184089.34375, False) ift=(1.25, None, 2, 184089.34375, False)
  iqn-imvj  interface  jacobi        cap=3   int=1 ITERS                  fori=(1.25, 1, 3, 184089.34375, False) ift=(1.25, 1, 2, 184089.34375, False)

[exited with code 0]

=== repro_strict_convergence
strict_convergence fires on a genuine cap-out:
   raised JaxRuntimeError -> guard works
bound_valid at max_iterations=1 (docstring says False):
   {'iterations': 1, 'residual': 1.4142135381698608, 'amplification': nan, 'error_estimate': 1.4142135381698608, 'bound_valid': False, 'gradient_error_bound': inf, 'converged': False}
strict_convergence does NOT fire on the atol dead-band case:
   tau = 9.999999717180685e-10 (exact 2e-09)  diag = {'iterations': 1, 'residual': 0.0, 'amplification': nan, 'error_estimate': 0.0, 'bound_valid': False, 'gradient_error_bound': inf, 'converged': True}

=== repro_property_test_solver_flip
drawn group  : ift dense -> built quietly
replace(solver='ift') -> ok
replace(solver='fori') -> UserWarning: CouplingGroup.linear_solver='dense' is ignored under solver='fori', which differentiates straight through the iterates and solves no tangent system. Choose solver='ift' to make linear_solver live, or leave linear_solver at its default ('gmres').
