composite-stem-alignment

The bass timing question, decided by the engine

The multi-mic stem pipeline used to ask which bass offset sounded right. Choosing an offset is a measurement job. The engine now does it and locks the answer.

What changed in one line. The bass offset is set by the physical microphone delay, checked against a same-lane residual, and tie-broken by kick-and-bass low-band coherence. The engine writes TIMING_LOCKED and stops asking. Listening is kept for the one thing ears are for, whether the composite and the separated lane actually sound intact.
On this page
  1. The question that made no sense
  2. Why ears cannot answer it
  3. The rule now baked into the skill
  4. perf08, decided
  5. What still goes to your ears
  6. Where it lives now

1. The question that made no sense

The perf08 review page laid out three bass offsets and asked for a pick by ear:

+2.24 msthe physical mic offsetthe right answer
+15.9 msprior + 13.7 msone bass period away
−11.4 msprior − 13.7 msone bass period away

The two alternatives are the correct offset shifted by exactly one bass period (13.7 ms at the 73 Hz root). Those are textbook aliases, the same wrong answers the resolver carries a guard to reject. So the page asked a person to choose between the correct offset and two offsets the math had thrown out. That is why it could not be answered.

−11.4 ms +2.24 ms +15.9 ms one period, 13.7 ms one period, 13.7 ms LOCKED alias, rejected alias, rejected
The two offered alternatives are one bass period from the true offset on either side. A guard exists to reject them.

2. Why ears cannot answer it

The lane is periodic. Bass at a 73 Hz root repeats every 13.7 ms. Sliding it by a whole period puts the waveform almost on top of itself, so the mix sounds nearly the same.

The gap is under 16 ms. A sub-16 ms offset is below what the ear resolves on a sustained low note in a full band mix.

The real test is phase against the kick. The only thing an offset changes that matters is how the bass and kick sum in the low band. That is a coherence measurement, and a meter reads it better than an ear.

3. The rule now baked into the skill

  1. The physical prior is authoritative. The offset comes from a broadband GCC-PHAT delay on the raw microphone cut. Wide scatter in the same-lane attack measurements is normal on a periodic lane and does not reopen the offset.
  2. A residual is applied only when it earns it. The same-lane check may add an extra offset only if a stable, non-alias value recurs across at least five clean attacks and differs from the prior.
  3. The kick-and-bass 40 to 160 Hz coherence arbiter breaks any tie. When the prior and a proposed residual genuinely compete, the engine picks the offset with the most constructive low-band summation. Deterministic, no ear.
  4. The engine always locks an offset. It writes TIMING_LOCKED and a confidence that states the evidence. The offset never carries a REVIEW_REQUIRED flag again.

4. perf08, decided

Bass timing LOCKED at +2.24 ms
Separator residual NONE. Confidence physical_prior_authoritative. Kick-and-bass 40 to 160 Hz coherence at this offset: masking ratio 1.000, summed peak −5.55 dBFS, headroom intact.
Reason logged: the same-lane consensus of 2.25 ms confirms the physical prior of 2.24 ms. The wide same-lane IQR of 20.4 ms is expected periodic-lane scatter and does not reopen the offset.

The eight isolated bass attacks the engine measured, and the consensus that matches the prior:

attack t (s)waveenvphaseonset
6.15+22.38−23.22+22.69+58.05
12.49+15.76−29.75+10.16+261.22
39.64−9.61+2.18−5.69−55.15
110.86+4.72−4.35+3.31−29.02
112.06+26.21−26.12+21.58−49.34
112.46+26.12−21.77+12.21−49.34
225.90+2.31+2.18+16.23+95.06
231.14+3.17+2.90+9.01+29.75
consensus 2.25 msconfirms physical prior 2.24 ms → residual NONE → LOCKED

The columns disagree wildly, which is the whole point. On a periodic lane the same-lane estimators are noisy, so the broadband physical prior is the authority and the noisy spread is not a reason to ask anyone anything.

5. What still goes to your ears

Two questions are real listening questions, and the engine keeps them separate from the offset:

Composite intactness. Does the seven-lane composite hold together and beat the isolated stems? Your call on perf08: PASS.
Bass lane timbre. pYIN flagged the 731 bass pitch track, so the engine asks whether the separated lane sounds intact, free of warble or dropouts. The offset stays locked, this question is about the sound of the lane. On perf08 your composite PASS covered it.

6. Where it lives now

The fix is in the skill, so the next multi-mic run inherits it with no rebuild:

# ~/.claude/skills/composite-stem-alignment/
scripts/bass_resolver.py v2, engine-locks the offset, kick+bass arbiter, no A/B
scripts/build_review_page.py renders TIMING_LOCKED read-only, no offset A/B
SKILL.md new hard gate: the offset is never an ear question
scripts/bass_resolver_v1.py kept for lineage (the old A/B behavior)

The perf08 run was re-resolved as the proof. Its review page now shows the locked status and drops the three-way pick entirely.