Bench time is the scarce resource, so Cascade can run procedures by itself. A script is a short .cscript text file dropped into a folder. The app validates the whole script first, locks the controls, shows an ABORT button and a banner while it runs, and writes the results to a "done" folder. A script reads like this:
view fft; set channels AB; set size 8192; set amplitude -20; set frequency 1000; capture; screenshot site_fft
The safety limits are built in. Scripts use only operations the app already has, so nothing new goes out on the wire. Generator level is capped at +6 dBV. Every script ends with the generator off and the instrument disconnected, and each script states its expected cabling at the top. Chris authorised Claude to run these on the loopback rig unattended ("No overcooking the voltages"). New protocol experiments still go through Chris. Scripts 00 to 10 have run unattended. The FFT and multitone screenshots in this section came from two of them (scripts 09 and 06); the others are Chris's own bench screenshots.
Every run can also be saved with EXPORT CSV, and is auto-exported to a session folder. The CSV header records the instrument state that applied (input, level, ranges, Ch B results), so a file found weeks later still says how it was measured.
How we know the numbers are right
The project's working rule is to suspect the measurement first. When a number disagrees with expectation, check the measuring path before inventing an explanation in the device. That rule exists because it was broken once: a DUT reading 7.4 dB low was explained as cable loss, twice, until Chris objected ("i am pretty suspicious of this cabling taking 7.4dB out of the signal. that doesn't sound right to me."). It was a decode bug, and it cost three sessions.
Checks against something independent of Cascade:
A voltmeter for generator level (−20, −10, 0, +6 dBV), then 43 levels by the app's own AMPL VERIFY, worst 0.037 dB.
An oscilloscope for generator frequency (from 2.5 kHz up), the IMD signals and every arb playback.
APWIN's own exported results: FFT level (−20.02 vs −19.99 dBV), the THD floor (−110 to −113 dB), two-channel THD of an external DUT, and SINAD (to 0.047 dB, under the condition above).
Known-distortion files. AP ships test waveforms with 1 kHz harmonics at exactly −40, −60 and −80 dB, so the correct answer follows from how they were built. Cascade's THD matched them in tests to 0.06 dB.
Real DUTs: a Schiit SYS preamp (flat 0 dB, followed its volume knob) and a Heathkit oscillator with real harmonics up to the 20th.
The software also has offline unit tests (123 as of 10-04) that run in about 30 ms. Many are invariant tests: rather than pinning a number, they check a property that must hold. For example, "SINAD must not change when the whole spectrum moves 40 dB." That one would have caught a bug where THD was computed from absolute dBV instead of relative to the fundamental. It hid for months because the test tone sat near 0 dBV, where the error vanishes.
Where it is still unverified or uncertain:
Channel B's level decode (needs a specific bench run).
The watts axis and load conversion (needs an amplifier).
FFT absolute level on the DUT input: about 1 dB uncertain.
FFT absolute level on GenMon: recently −20.15 to −20.19 dBV at −20 set, against −20.01 to −20.03 earlier. Not to be trusted to better than 0.2 dB until checked.
Generator frequency below 2.5 kHz has not been checked on a scope.
Some constants are fitted to this unit only (the sample rate is +160 ppm on this crystal), and calibration cannot be read from the instrument, so another 2522 would need its own.
The roadmap lists every feature with its verification status and the evidence behind it.
Read the FFT to 32 768 Hz instead of 20 kHz. One bound in the code, at about 64 % more read time. It gives high-frequency THD its missing harmonics.
FFT readouts and crosshair from the stronger channel, or both, and fix the snap.
Fix the intermittent arb failure with a closed-loop replay of the setup that checks each reply against a known-good run. Waiting on Chris's go.
Replace the blob replays with explicit setup (about 400 real packets out of 122 703). That removes the roughly one-minute first-FFT cost and several timing-sensitive failures.
IMD and crosstalk as proper tests, not a sidebar probe.
Run on other AP units, and prove it: a calibrate-to-this-hardware step plus a pass/fail self-check with limits taken from AP's specifications, not from this unit's numbers. That is the step that would let Chris hand the app to someone else.