* feat(tuner): mic-verify — promote the working tuning assumed→verified via a per-string check (working-tuning PR 9b)
Adds the choreographed per-string mic verification the design reserved for
'verified' provenance (audio-engine's honesty rule — nothing else may claim it):
the player plays each string, and once every one reads in tune (±6 cents) and
holds stable for 8 frames, the tuner stamps the working tuning
provenance:'verified' + verifiedStrings via workingTuning.set.
- screen.js: a pure verify state machine (verifyStart/verifyFeed/verifyCancel/
verifyState, exposed on the tuner API) + the set-verified writer; cancels on close.
- ui.js: updateUI feeds each processed frame (matched string + cents) into the
session; a "Verify tuning" button + per-string progress + status, shown for a
selected (non-free) tuning.
Pairs with the 9a lifecycle: a 'verified' decays back to 'assumed' on the next
song load, so mic-verify is a per-session confidence boost, never a sticky claim.
Tests: tests/js/tuner_auto_open.test.js +4 (all-strings->verified, out-of-tune
never completes, streak resets on drift, API exposed / only it claims verified) —
33/33. The state machine is headless-verified with synthetic frames; the real
per-string mic detection + the button flow need an on-device pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QbexxfTt8q2tAn436MqGWF
* fix(tuner): mic-verify writes the confirmed tuning + no clobber + stricter streak (PR #670 review)
Review fixes for mic-verify (working-tuning PR 9b):
- 'verified' could attach to STALE offsets: _publishVerified stamped provenance
without writing offsets, so the slot's pre-tuning offsets got marked verified.
verifyStart(targets, offsets) now captures the confirmed tuning's offsets, and
_publishVerified writes offsets + stringCount + instrument + referencePitch +
verifiedStrings ATOMICALLY with provenance:'verified' into the selected slot
(and refuses to stamp verified with no concrete offsets).
- The assumed publish-on-clear immediately clobbered a just-earned 'verified':
disable() now skips it when a mic-verify wrote verified this session
(_verifiedPublished).
- The per-string streak could accumulate across silence / wrong-string frames.
verifyFeed now requires CONSECUTIVE in-tune frames: the one confirmed string
advances, every other unfinished string resets each frame.
- A mid-verify tuning change (song switch) left stale captured offsets; verify is
now cancelled in _syncCurrentTuning when the song tuning changes.
Tests: verify writes the confirmed offsets (not stale); source-guard for the
no-clobber path. 47 tuner + 77 tuner/capability tests green. Codex-reviewed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: byrongamatos <xasiklas@gmail.com>