Capturing 500 frames from tcp://localhost:5561 (read-only)...
  100/500  cycle=87580
  200/500  cycle=88580
  300/500  cycle=89580
  400/500  cycle=90580
  500/500  cycle=91580
Captured 500 frames in 71.9s (7.0 fps)
cycle step: median=10 (expect ~10), min=10, max=10
================================================================
PASSIVE PREDICT-TEST — live 5561 coarse field
================================================================
frames used: 500  (cycles 86590 -> 91580, ~4990 cycles)
channels: ['rho', 'ux', 'uy', 'sxx', 'syy', 'sxy']

Per-step RMSE (z-scored field, lower = better predictor):
  PERSISTENCE (next=current):        0.3738   <- baseline to beat
  LINEAR (const-velocity extrap):    0.2945
  RUNNING MEAN (dumb global):        1.0054

PRE-COMMITTED TEST: does LINEAR reliably beat PERSISTENCE?
  improvement: +21.22%  (need > +2.00%)
  bootstrap 95% CI of (persist_err - linear_err): [+0.0757, +0.0828]  (need lo > 0)
  VERDICT: LINEAR BEATS PERSISTENCE — field carries short-horizon dynamics

READ: The field's next state is better predicted by its trajectory than by
assuming it stays still. That means the live fast field carries structured
short-horizon motion the 9 global scalars could not show. This is the FIRST
positive signal that the live organism has learnable dynamics. It is NOT yet
memory (that needs the poke/history test). It IS a green light to proceed.

Wrote predict_report.txt and predict_capture.npz
DONE.
