Recording (`15 Oct` bezel campaign & `16 Oct` articulated-arm campaign). The 15 Oct campaign used calibrated mode (`1/64 K`), automatic shutter off, and a manual shutter 5 s before every load start (`60 s on / 120 s off`, 6 cycles at 25 fps). The 16 Oct articulated-arm campaign (`experiments/sensitivity/arm_campaign.py`) recorded three uninterrupted 25.0 Hz runs over `/stream.raw.z`: arm-cpu-lockin (14-bit raw NUC `nuct_bypass=1`, `25 s on / 30 s off`, 3 cycles, 4,851 frames), arm-gpu-metal (14-bit raw NUC `nuct_bypass=1`, `25 s on / 30 s off`, 2 cycles, 3,476 frames), and arm-cal-wave (16-bit calibrated `1/64 K`, `45 s on / 50 s off`, 2,976 frames), while `experiments/sensitivity/mac_sensors.py` sampled `AppleSMC` (`IOServiceGetMatchingService("AppleSMC")`, selector `2`) and `IOHIDEventSystemClient` at 2 Hz without `sudo`.
Analysis (`flow.py` & `arm_visualize.py`). In 14-bit raw NUC mode (`nuct_bypass=1`), wire `uint16` values are `14-bit_NUC << 2` with target radiance sensitivity `+38.622 mK / count` (`+9.6555 mK / wire LSB`). Frames are averaged into 1.0 s bins, referenced to the pre-workload cold baseline (`base_u16`), and common-mode FPA drift is removed per bin using the median of the unheated palm-rest cold reference ROI (`rows 170..235, cols 5..55`). Phase-locked cycle folding is followed by a `1.5 px` 2D Gaussian blur and Marchenko–Pastur SVD thresholding against a synthetic noise movie of matching spatial/temporal variance.
Remote observation (`tools/p3_observe.py`). Connects to the phone over USB/Wi-Fi/Tailscale (`/stream.raw.z`), direct Cellular LTE (`--cell`), or Spacesheep (`--spacesheep`, decrypting `priv_enc` via `AES-256-GCM` when the operator key is present) to display and log live sub-LSB ROI temperatures (`--csv`) alongside local `AppleSMC` hardware sensors (`--mac-sensors`).
Code and the runs' settings, logs and results are in the repo yaroslavvb/thermal-android, under experiments/sensitivity/ and tools/p3_observe.py; the multi-GB raw `.p3rec` recordings stay on the M5.