You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Nine open issues share one physical mechanism and one failure signature, and fixing them singly is how #363 happened: #347's guard shipped, looked correct, and manufactured confidence.
The mechanism. Latency on this stack moves in discrete quanta, and the quantum is invisible to the key meant to detect change:
TauConditions keys on device, backend, sample rate, period size and the port pair. Two readings a quantum apart share all six, so #281's refuse-on-mismatch design has nothing to refuse on.
The signature. Every issue below produces a number that is stable, repeatable, physically plausible, and wrong. None looks like a bug in the output. That is what makes them one problem rather than nine.
The scale. One period at 1024 / 96 kHz is 10.67 ms — 3.66 m of apparent path, larger than most geometry it would be used to measure. At period 256 it is 0.91 m. One SYT step is 5.7 cm.
measurements this epic rests on
fact
provenance
source
Round trip jumps exactly one period between client starts, per client, no config change
A constraint on all of it: the PipeWire mechanism behind #363 and #359 was removed from the rig on 2026-08-23, and no rig in reach reproduces the sticky one-period state today — 65 runs / 130 client lifetimes afterwards showed a single value, and pupu read 1711 on every reading on 2026-09-16. Operator, 2026-08-24: "it is very much to be expected that latency can jump… testing / awareness needs to be global enough to take this into account."
So guards written here must be verifiable without the fault present — by construction, or by synthetic injection — or the issue must say plainly that its acceptance is deferred until hardware exhibits it again. A green unit test on a FakeEngine proves nothing about a sticky state.
what is already solved, so it is not re-litigated
ac calibrate cannot measure a τ larger than 13.1 ms, and does not say so #340 (closed 2026-09-16) — the τ window could not hold a large arrival and returned a pinned peak. Now a 100 ms window at n_harmonics = 1, with EdgeRefusal naming peak position, window length and half-width. calibrate measured 17.8229 ms on pupu, above the old 13.1 ms ceiling.
The capture path itself can start one period early (ring clear/enable race)
—
sequencing
#363 ─→ #347 (what "corroborated" may claim, before the mechanism is changed)
#363 ─→ #359 (same answer, applied to plot_ir's arrival)
#351 ─→ #346 (two consumers sharing a rule, before tuning either)
#461 ─→ #466 (the measured staleness, then the general per-session check)
#350 (independent; needs a rig session, not a decision)
#467 (independent; alignment, not trust — included because its
failure is indistinguishable from a one-period τ error)
definition of done
No consumer of τ composes two separately-measured absolutes without either corroboration independent of the failure mode or an explicit uncorroborated state in the output and in the stored record.
plot_ir's arrival carries the same protection as calibrate's τ, or states that it does not.
calibrate and ir_stats share a picking rule, or their non-cancellation is measured and recorded rather than left to cancel by luck.
Stored calibration reports unknown rather than a stale value across events the condition key cannot see.
Each guard has a test that can fail without a rig that reproduces the fault, or the issue records why it cannot.
deliberately not included
No "settled decisions" section.#276 carried one, and two of its decisions had to be struck through when hardware contradicted them — decision 3 survived in the body for a month after a rig comment had already falsified it, under a heading saying not to relitigate. This epic carries measurements with provenance and nothing that outranks a later measurement.
Out of scope: room-acoustic parameters; the internals of #346's estimator; the metre, settled by #391.
why these are one epic
Nine open issues share one physical mechanism and one failure signature, and fixing them singly is how #363 happened: #347's guard shipped, looked correct, and manufactured confidence.
The mechanism. Latency on this stack moves in discrete quanta, and the quantum is invisible to the key meant to detect change:
jack_iodelayon an unchanged leg:4262.064 → 5286.064frames. The fractional part survives untouched, identifying it as an integer number of periods added in software rather than anything analogue (τ must be measured more than once: a single reading can be one period wrong with nothing to detect it #347, rig 2026-08-18).TauConditionskeys on device, backend, sample rate, period size and the port pair. Two readings a quantum apart share all six, so #281's refuse-on-mismatch design has nothing to refuse on.The signature. Every issue below produces a number that is stable, repeatable, physically plausible, and wrong. None looks like a bug in the output. That is what makes them one problem rather than nine.
The scale. One period at 1024 / 96 kHz is 10.67 ms — 3.66 m of apparent path, larger than most geometry it would be used to measure. At period 256 it is 0.91 m. One SYT step is 5.7 cm.
measurements this epic rests on
calibrateruns stored a value one period short — every one printed2 readings agreeplot_ircaptures at a fixed mic position split into two clusters 1023 samples apart, each stable to ±1.5 samplescalibrate(argmax) andir_stats(onset) no longer cancel: −0.093 m on a zero-path fakedocs/rigs/pupu.mdA constraint on all of it: the PipeWire mechanism behind #363 and #359 was removed from the rig on 2026-08-23, and no rig in reach reproduces the sticky one-period state today — 65 runs / 130 client lifetimes afterwards showed a single value, and pupu read 1711 on every reading on 2026-09-16. Operator, 2026-08-24: "it is very much to be expected that latency can jump… testing / awareness needs to be global enough to take this into account."
So guards written here must be verifiable without the fault present — by construction, or by synthetic injection — or the issue must say plainly that its acceptance is deferred until hardware exhibits it again. A green unit test on a
FakeEngineproves nothing about a sticky state.what is already solved, so it is not re-litigated
n_harmonics = 1, withEdgeRefusalnaming peak position, window length and half-width.calibratemeasured 17.8229 ms on pupu, above the old 13.1 ms ceiling.a9281ac5) — the onset search's causal bound no longer reads a stored τ at all; it reads a reference leg captured in the same run. This is the first thing in the repo to follow τ must be measured more than once: a single reading can be one period wrong with nothing to detect it #347's own general remedy: a scheme that composes two separately-measured absolutes inherits the problem; one that measures a difference within a single client does not. Verified on pupu: bound enforced 5/5 at 2 m, and δ between the acoustic and reference pairs measured 0 samples across 10 captures spanning an FF400 power cycle.f7506dcd) — the reference leg's SNR gate is derived from its own stimulus, so that path stops refusing correct cables.members
calibrate(correct mechanism; its independence assumption is what fails)TAU_MIN_HALF_WINDOW_S/TAU_EDGE_MARGIN_FRACareassumed, not derived against a real noise floorcalibratepicks with argmax,ir_statswith onset — they no longer cancel inarrival − τplot_ir's arrival inherits the jump with no corroboration; #347 guards onlycalibrateagreement_countmeasures how long the state persisted, not whether the value is rightsequencing
definition of done
agreement_count) either earns its meaning or is replaced — calibrate stores a τ one JACK period short and calls it corroborated — 42 of 97 rig runs, every one labelled "2 readings agree" #363's 42/97 evidence is the bar it must clear.plot_ir's arrival carries the same protection ascalibrate's τ, or states that it does not.calibrateandir_statsshare a picking rule, or their non-cancellation is measured and recorded rather than left to cancel by luck.deliberately not included
No "settled decisions" section. #276 carried one, and two of its decisions had to be struck through when hardware contradicted them — decision 3 survived in the body for a month after a rig comment had already falsified it, under a heading saying not to relitigate. This epic carries measurements with provenance and nothing that outranks a later measurement.
Out of scope: room-acoustic parameters; the internals of #346's estimator; the metre, settled by #391.