v4 Phase 3: unified timeFeel — swing/humanize/rubato as one family

resolveTimeFeel(state) resolves the time dimensions to one spec applied in two stages: grid stage (applyGroove refactored — SWING_GRIDS table replaces the hardwired 8th special-case: "8th" byte-identical default, "16th" e/a offbeats, "triplet" generalized shuffle

• Kernel: state.timeFeel {grid, pushPull} blendable zero-rng (dominant grid, pushPull union + value-lerp)

• Charter deviation, justified: the shuffle-kit placement (L372) was NOT deleted — skip=0.5+(2/3-0.5)*sw/0.3 IS the blues triplet ride, not avoidance code; deleting it drifts blues for no sonic gain.

Verified: verify.sh --no-cache PASS (matrix 63/63, validate, engine). Perf noise-dominated, no regression (medians overlap; best-of-8 1.15 vs 1.35 ms/state).

▶ Play it: Mercury Interrogation — where the harmony organ has the least anywhere to hide https://stellate.app/?genre=bebop&seed=4734&path=694.13834,713.13867,675.13867&xdur=13.122

922b5a6 https://github.com/aboard-io/stellate/commit/922b5a6e56e6ef550684e463fd454fc9df58fe30