877b1fd4f8
melContext is 480 because melspectrogram.onnx returns N/160-3 frames and frame i covers [i*160, i*160+400). With 480 samples of history the buffer is 8 frames and the oldest continues exactly one hop after the previous call's newest. Less history leaves a gap. Feed reports the threshold CROSSING, not the state. A keyword held above the threshold for a second is one wake, and firing on every chunk of it would make the gate look open when it is merely slow to fall. Nil is the CLOSED gate rather than the open one. A nil that answers "yes, keyword" reads as a working wake word in every log line it produces. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013ptwopxyo3Z2kwFckHkLvN