The grain sensitivity is a property of the recording, not a curve

Rendered from gate/RESULT-GRAIN-MULTI.md
Contents
  1. What was done
  2. A control caught a run testing the wrong proposition, again
  3. A third defect, found by trying to declare the grain honestly
  4. What is recommended next

Runs: gate/tempres.py, gate/farnes.py, gate/tempres3.py, gate/tempres4.py Date: 2026-09-22 Standard: METHOD 0.4.9 → 0.4.10 (amends §3.6)


What was done

METHOD §3.6 was written yesterday on a single substrate and explicitly declined to set a tolerance, on the ground that one substrate is not a curve and that a conformance tolerance nobody had measured would repeat the §3.5 pitch defect knowingly. This run tested whether that caution was warranted. Four sweeps, each degrading a recording that already produced a register value, changing nothing but the number of samples in the response window:

Sweep Recording Response window Native grain
tempres Mouse surface EEG, 16 state-cells 800 ms @ 500 Hz 399 samples
farnes Human scalp TMS-EEG, 20 cells 300 ms @ 312.5 Hz 94
tempres3 Human subdural grid, ds004370 285 ms @ 725 Hz 207
tempres4 Mouse again, re-swept at a 300 ms window 300 ms @ 500 Hz 149

The fourth exists because the first three left window length and species confounded: the only long-window recording was also the only non-human one. The mouse data is held locally, so the mouse could be re-swept at the humans' window and asked whether it then behaved like them.

Where the window is matched, the degradation reproduces almost exactly

Read at matched fractions of each recording's own native grain:

Fraction of native Mouse 800 ms Mouse 300 ms Human scalp 300 ms Human grid 285 ms
0.50 0.708 0.806 0.942 0.880
0.30 0.582 0.705 0.819 0.822
0.20 0.454 0.546 0.680 0.751
0.10 0.330 0.398 0.383 0.674

The two short-window human recordings agree to 1.004× at 30% of native — four parts in a thousand. They differ in modality (scalp against subdural), in perturbation (TMS against direct electrical stimulation at 8 mA), in sampling rate (312.5 against 725 Hz), in channel count (60 against 32) and in geometry. Almost nothing about them is the same except the length of the window, and the degradation is the same.

Window length explains about half of the rest, and no more

The mouse re-swept at 300 ms moves from 0.582 to 0.705 at 30% of native, against the humans' 0.820. That closes a little over half the gap. Shortening the window is therefore necessary and not sufficient to make two recordings comparable, and the residual is a property of the recording that no declared parameter predicts.

Controls: the long-window arm reproduced gate/tempres.json at worst fractional disagreement 0.000 across all 16 cells, and the third sweep reproduced gate/decimation.json to machine precision, so all four sweeps are the same pipeline.

At matched absolute sample count, the substrates disagree by up to 3.3×

Which is what §3.6 indexes on, and the reason a tolerance could not be set:

Samples in response window Mouse Human scalp Disagreement
80 0.454 0.984 2.17×
60 0.386 0.960 2.49×
30 0.265 0.819 3.09×
20 0.203 0.680 3.34×

A tolerance set from the mouse alone would have been wrong for the human by more than the state contrasts this register publishes — 1.21× in human, 1.89× in mouse. Yesterday's refusal to guess was not caution. It was the finding, one sweep early.

A control caught a run testing the wrong proposition, again

The third sweep's first control compared its value against NS-0012's issued 32.26 and failed at 48%. The control was wrong, not the loader: NS-0012 is the mean of 269 site-level values across 7 subjects and 8 sessions, while the loader pools one subject's stimulation trials into a single average. They are different objects and had no reason to agree. Re-pointed at the value the same pipeline recorded in gate/decimation.json, it reproduces to machine precision.

This is the second time in two days a run has been caught auditing the wrong proposition — gate/RESULT-WIDENERS.md was the first — and both times the control stopped the run rather than a reader catching it afterwards.

A third defect, found by trying to declare the grain honestly

The reference computation will resample to any rate asked of it. A recording acquired at 312.5 Hz resampled to 725 Hz would declare 207 samples in a 285 ms window and sit beside a reading genuinely acquired at that rate. Interpolation does not create samples. response_samples is now computed from min(resample_hz, fs_hz), and the conformance rule enforces it — an earlier version took resample_hz when present and would have accepted the inflated figure.


  1. §3.6 now requires what §2.3 requires, and for the same reason. A reading that will be compared as an absolute value against a reading at a different realized sample count carries its own measured sensitivity — the same recording re-read at the other reading's grain. The comparison is made at matched grain or not at all. Where no such comparison is made, declaration alone suffices. No tolerance is set, and none should be until the residual tracks something nameable.

  2. Sweep a non-cortical substrate next. All four sweeps are cortex and three are the mammalian evoked response. The human hippocampal slice deposit (DANDI 001132, 1,009 channels at 20 kHz, optogenetic, CC-BY) is the natural fifth, and it is the same deposit the deferred MIN_CHANNELS question needs.

  3. Look for what the residual tracks. Response duration, dominant frequency and channel count are all candidates and all testable on data already held. If it tracks something declarable, §3.6 gets a formula and condition 12 gets a tolerance. If it does not, "measure it per recording" is permanent, and that is worth knowing too.