Skip to content

A stored τ can be 16 samples wrong the next session with every TauConditions field matching #461

Description

@mkovero

observation

Same rig (pupu, FF400), same electrical loopback (system:playback_2 → system:capture_2), same JACK settings (96000 Hz, period 256, -S), measured by ac calibrate on two days:

session build τ samples @ 96 kHz record
2026-09-14 cb95c5aa 17.989583 ms 1727 PR #384 comment "rig-2026-09-14-pr384-tau-snr"
2026-09-15 298f77dc 17.822917 ms 1711 #347 comment (this session)

16 samples apart — 0.167 ms — and not a multiple of the 256-sample period.

what it is not (measured 2026-09-15)

  • Not the build. The 2026-09-14 build cb95c5aa, still staged on the rig and sha256-verified, read 17.8229 ms ×3 on 2026-09-15.
  • Not a JACK restart. jack-ac.service was stopped, jackd run by hand at 48 kHz, the service restarted at 96 kHz and the FF400 baseline toggle-restored; τ then read 17.8229 ms ×5, identical to before the restart.
  • Not within-session instability. 44 calibrate runs across both rates, within one daemon and across 10 daemon restarts each, agreed to the sample (τ must be measured more than once: a single reading can be one period wrong with nothing to detect it #347 record).

Cause is not identified. What changed between the sessions and is not in the table above includes at least: whatever state the FF400 / firewire stream came up in after the 2026-09-14 session ended, and the cabling work done on 2026-09-14 (outputs re-probed and recabled that day). No mechanism is claimed here.

why it matters

TauConditions keys on device, backend, sample rate, period size, output port and input port. Every one of those matched across the two sessions, so a τ stored on 2026-09-14 is resolved on 2026-09-15 as a valid match and applied 16 samples wrong, with nothing refused and nothing printed. #347's two-readings-agree rule cannot see it either: both readings in a run share the session's offset.

Epic #276's definition of done says τ "refuses rather than degrades" on mismatch. This is a degrade with no mismatch to refuse on. At 96 kHz, 16 samples is 5.7 cm of acoustic path — above the rig's 5 cm "good enough" bar.

acceptance criteria

  • Determine whether the shift is reproducible across a power cycle or cable re-seat of the same loopback, with same-build τ measured before and after — provenance: measured. Until that exists, any fix is guessing at the mechanism.
  • Whatever is stored says when (session, and ideally interface power/stream epoch) τ was measured, and an operator-facing read-out distinguishes "measured this session" from "resolved from a stored entry" — so a reader can tell which one they are trusting.
  • If the shift reproduces: stored τ is either refused across that boundary or flagged as unverified for the current session, with the boundary named. A silent match is not acceptable.

related

#347 (τ agreement within a run), #281 (τ as a scoped calibration layer), #359 / #363 (period-sized jumps), #276 (epic definition of done), #351.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingmeasurement-accuracyH1 estimator / THD floor / windowing / calibration correctnessrequires-rigsoftwareac Python/Rust codebase

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions