Cuesheet v0.16.2
Fixed: three unit counts read ungrammatically — "Countdown 1 beats" in the cue editor, and "1 minutes 1 seconds elapsed" in the Dynamic run-mode strip's VoiceOver label. Crowded cue pills keep their digits.
New & improved
- Crowded cue pills keep their digits. When several same-lane cues sat close together on the swim-lane strip (the "Midnight Sun" burst of stacked RPM badges), the crowded pills were clamped below the width a two-digit value needs and drew as blank rings. Each pill's floor is now its own natural width, so a crowded run shingles at full size instead of erasing its numbers.
- Cues appear as soon as they enter the lookahead window, not seconds before they fire. The strip used to trim cues to the visible window *before* deciding how to merge and crowd them, so a pill's shape and timing depended on whichever neighbours happened to be on screen. Every pill is now resolved against the whole plan first and the window only decides when an already-final pill is visible.
- Paired POSITION and GEAR cues line up. Two GEAR cues in "All the Things She Said" sat 1–2 s off their SIT/STAND partners, so the strip drew them out of line. The seed data is corrected, and AI-generated cues on different axes that land within one beat of each other are now pinned to the same timestamp.
- The NEXT SONG preview and "Final cool-down" text are readable from the bike. The preview's shape summary moves from 22 pt to 34 pt and the end-of-class label from eyebrow size to 22 pt. The redundant "Starts in 0:xx" line is gone — the countdown at the top already says it.
- The Class Complete CUES count is honest. It could balloon (881 on a ride with 146 cues) because every nudge of the playhead within a song re-added cues already counted; it could also fall short when a class was ended by hand mid-song, because those cues were never counted at all. Both paths now count each delivered cue exactly once.
- The −5 s / +5 s scrub buttons are marked testing-only. They stay in internal and TestFlight builds for now (this one included) behind a new feature flag that will be switched off for the App Store; Prev, Pause and Next are unaffected. spec.md's Run Mode section is reconciled to what actually shipped. ### Authoring
- "Copy for next week" works without AI. It threw `modelUnavailable` for anyone with AI features off or no on-device model, because it asked the AI for a title it was never meant to need. The copy is now titled "<source title> · copy" with no AI call.
- The Create button on New Cuesheet matches every other primary button instead of towering over Cancel. ### Error messages
- No screen shows a raw Swift error any more. "modelUnavailable"-style case names were reaching the Class Complete screen, the Classes and Cuesheets tabs, the builder, the song and track pickers, the versions sheet, the segment builder's cue actions, New Cuesheet, Run mode's start path and Dynamic mode's generator. Each now shows short, human-authored copy that says what to do next. ### Settings
Fixed
- Fixed: three unit counts read ungrammatically — "Countdown 1 beats" in the cue editor, and "1 minutes 1 seconds elapsed" in the Dynamic run-mode strip's VoiceOver label. Both now inflect correctly ("1 beat", "1 minute 1 second elapsed"), routed through the shared `Pluralize` formatter so the fix can't regress site by site.
- The RPM the cue editor suggests can no longer be absurd. "Happy" pre-filled 32 RPM: the song-tempo fallback halves the detected BPM, and the tempo detector can already be an octave low. The suggestion is now clamped to the same 40–200 range the app enforces on typed RPMs, and spec.md documents the half-time fallback and its clamp.
- Plain info rows no longer draw a chevron. Music's Service, Permission and Subscription, Cuesheet Defaults' Class template and Freshness window, Storage's Cuesheet data and About's Version all looked tappable and were not.
- The DIAGNOSTICS section — Playback diagnostics, Share Run-mode event log, Export gateway trace — is Debug-only. It no longer ships in TestFlight or App Store builds; a public build had a working "Share" button with nothing meaningful behind it. "Share diagnostics" (the telemetry switch in the ABOUT section) is unchanged and present in every build.