Commit Graph

115 Commits

Author SHA1 Message Date
vadimwit 9772e951b7 ledger: iteration 4 — SPRINT sprint-glance-and-loop COMPLETE (P-31/C-31 done; all 11 tasks green)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 10:10:20 +01:00
vadimwit 81cd230a4c feat(kb): blues piano cell — 5 progressions x 2 authored plays (task P-31)
Guide-tone/tritone dyad system with the parallel half- and whole-step
laws, 7#9 as the codified blue note, the bVI7->V7 five-voice plane,
VI7b9 turnaround hinge, RH sixths; solo two-fisted vs rootless-band
contrasts per play. KB now 164 plays. Critic returned once (turnaround
jump-kicks bars 3-4 dyad orientations flipped + 2 prose rewordings),
fixed, PASS on scoped re-gate (stepwise lap chain recomputed from
scratch; "only leap" now provably unavoidable, not just chosen).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:58:41 +01:00
vadimwit 0b982f9514 ledger: iteration 3 reconciled — L-33/L-31 done (gate notes logged); P-31 gating; C-31 ready
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:47:20 +01:00
vadimwit ce24d5490f fix(app): progression commit-layer tuning — survive fills, replace on evidence (task L-31)
COMMIT_VOTES=2 (unchanged, ~one bar), REPLACE_VOTES=3 (a transient or
flapping detection can never displace a committed loop; section change
replaces one commit later), NULL_CLEAR=6 (post-L-30, nulls only start
~28 commits after the loop last played — traced exactly). Vote ref now
{committedKey, candidateKey, candidateCount}; agreement resets rivals.
Diff = one hunk in the progression useEffect; audio-contract grep
clean. Ride-along: theory.js docstring overclaim softened (L-30 gate
finding b), comment-only. Critic PASS (independent re-trace of all
five scenarios + 3 hostile traces; REPLACE_VOTES=3 proven load-bearing).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:28:52 +01:00
vadimwit c78baf4943 feat(jamguide): glance mode — the playhead accordion (task L-33)
The station under the playhead auto-expands to the full voicing
gallery (VoicingBrowser dense) and advances with the music; other
stations keep their recommended thumb; level-filtered licks strip
below with token-boundary context sort and strip-owned "fits — now"
chrome; pin replaces tap-to-enlarge with identical onFocusChord
semantics; auto-follow never emits focus or audio; heard-live fallback
shows the live chord gallery. App.jsx and all renderers untouched.
Critic PASS (SSR 37/37, matcher proven on hostile cases, dense-less
render byte-identical to 0945a08).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:28:51 +01:00
vadimwit 5e9b4c5925 ledger: iteration 2 reconciled — P-30/L-30 done (gate notes logged); L-31/L-33 in flight; P-31 claimed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:17:30 +01:00
vadimwit 4cc0009983 feat(theory): noise-tolerant loop detection rewrite (task L-30)
detectRepeatingProgression redesigned: consecutive-dup collapse,
weak-period candidate rejection (kills self-overlap ghosts
structurally), lengths 2-8, <=1 substitution/insertion per cycle with
a >=2-exact-occurrences evidence gate, recency-weighted linear
coverage scoring. All 17 C-30 fixtures pass plain (smoke 817/817,
expectedFail markers removed). Critic PASS: 15 novel generalization
probes correct or data-faithful, 0.2-0.7 ms/call, diff confined to the
repeating-progression section, fixture contract untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:10:28 +01:00
vadimwit b51daa1339 feat(kb): neo-soul/rnb piano cell — 7 progressions x 2 authored plays (task P-30)
Signature comp voicings over the computed fallback: m9 spreads, So What
quartal planing, Stevie 9sus cadence, m6/9 borrowed iv, 13sus, one 7#9
per loop; 3 comping cells + 5 improv rows. KB now 154 plays. Critic
PASS first try (independent arithmetic on 11 prose claims, spans <=11,
all 12 keys render in the 36-key window).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:06:53 +01:00
vadimwit 7926783778 ledger: iteration 1 reconciled — D-30/C-30/D-31 done; L-30/P-30 resumed; L-33 claimed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 08:57:07 +01:00
vadimwit 6c7a1a7828 docs(design): glance-mode concept — the playhead accordion (task D-31)
Knowledge Center behaviour while a jam plays, zero clicks: the station
under the playhead auto-expands to the full D-30 voicing gallery and
advances with the music; level-filtered licks strip below with
context-first sort; pin gesture inherits onFocusChord semantics;
auto-follow never emits focus or auto-plays audio. Honest space math
(piano rail scrolls as normal state), 5-commit migration order for
L-33, four rejected alternatives. Critic returned once (piano gallery
width understated ~45%), fixed, PASS on scoped re-gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 01:00:16 +01:00
vadimwit fdd93c7158 test(loop): truth fixtures for detectRepeatingProgression + smoke wiring (task C-30)
17 fixtures (9 regression guards, 8 annotated expectedFail) pinning the
current detector failure map: len^2 self-overlap artifact on 2-chord
vamps, ghost 4-patterns under substituted/inserted misdetections,
duplicate-commit safety, 7/8-loop length cap, stale-section recency.
Stale expectedFail markers turn smoke red, forcing L-30 to flip them.
Critic PASS (arithmetic recomputed, sabotage x3 proven to bite).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 00:55:27 +01:00
vadimwit 0945a08497 feat(voicings): VoicingBrowser gallery — every shape and piano style side by side, no chips (task D-30)
All placeable guitar shapes and all four pianoVoicing styles render
simultaneously, each cell with its own play button; one-at-a-time
playback and the show prop semantics preserved. Critic PASS (SSR-verified
cell counts, zero aria-pressed, rootPc badge guard intact).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 00:50:33 +01:00
vadimwit 401d9d1f17 ledger: seed sprint-glance-and-loop (M-04) — gallery voicings, loop-detection redesign, glance mode
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 00:38:49 +01:00
vadimwit 3077ae2ac0 fix(dev): allow 127.0.0.1 HMR websocket in the CSP
Follow-up to the 127.0.0.1 bind: connect-src only whitelisted the
localhost variants, silently blocking Vite's HMR socket on the new
origin.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 23:41:56 +01:00
vadimwit fab385a612 fix(dev): pin dev server, wait-on gate, and Electron loadURL to 127.0.0.1
With plain localhost, node >=17 can bind the Vite dev server to ::1
only; on this machine IPv4/IPv6 loopback mismatch made the browser,
wait-on, and the Electron window all see connection-refused while Vite
reported ready. Explicit 127.0.0.1 on all three ends fixes dev startup
(user-verified: electron:dev window now opens).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 23:40:44 +01:00
vadimwit b5073353ef ledger: sprint-knowledge-center COMPLETE — PR #3 opened; loop closed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 01:45:20 +01:00
vadimwit 0f24c757a1 ledger: C-21 done (sprint sweep PASS); prune shipped backlog entries
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 01:39:43 +01:00
vadimwit 72c6d457b0 ledger: iterations 6-7/24 — L-24/L-25/C-22/P-23 done; C-21 claimed; log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 01:28:54 +01:00
vadimwit 2165bb571c feat(jamguide): stations render authored piano packs when a style has one (task L-24)
Piano branch prefers kb[style].instruments.piano.plays[prog][0],
resolving recipe degrees via a validator-mirrored resolveDegree +
strict-ascending stacking into MiniPiano's [0,36] space; per-station
fallback to computed pianoVoicingChain (reachable: 4 wide gospel
stations in key B); pack-less styles byte-identical to the computed
path. Critic PASS (0 drift cells vs the validator's resolveDegree;
390-cell sweep; key-B fallback confirmed rendering, not dead).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 01:28:22 +01:00
vadimwit 564a9e0a3a feat(kb): gospel piano cell — 14 plays across all 7 progressions (task P-23)
Church pillars vs rootless, hymn 12/8 vs octave-6/9, passing-dim walks
vs praise clusters, worship pads vs anticipated stabs; gospel comping
cells distinct from jazz's. KB: 140 plays. Critic returned once (one
improv-row scale claim false for vi7/iii7 — split into arithmetic-exact
rows), PASS on re-gate; 39/40 first-pass claims held.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 00:55:45 +01:00
vadimwit b4e8f12539 feat(kb): validator enforces the piano hand-span rule (task C-22)
checkPianoRecipe stacks each hand low-to-high (nearest strictly above,
repeated pc -> octave up) and fails any hand spanning > 15 semitones
(minor 10th, SCHEMA rule 3); errors name style/prog/play/chord/hand/
span; refactored to a pure exported checker surfacing all errors per
recipe. Smoke +6 checks -> 799. Independent gate PASS (injection
surfaces 10 named errors exit 1; weakened gate caught behaviorally).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 00:27:25 +01:00
vadimwit e24aa4b6ed feat(jamguide): chord modal tabs show only their instrument's voicings (task L-25)
GuitarTab/PianoTab pass show=guitar/show=piano to VoicingBrowser
(D-23 prop); Knowledge Center + station-enlarge keep both rows by
design. Critic PASS (SSR: each tab renders only its row, legacy
content intact below).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 00:25:13 +01:00
vadimwit ee009a708d ledger: iteration 5/24 — D-23/D-24/P-24 done (Critic PASS x3); log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 00:00:42 +01:00
vadimwit 0f9c87c1e8 feat(kb): licks pack #2 — 11 licks for rock, country, reggae guitar (task P-24)
Berry double-stops, unison bend, Mixolydian rail, pentatonic cascade;
Flatt G-run, chicken-pickin' 3rds, pedal-steel bend, forward roll
(first techniques:[] lick); skank-answer dyads, bass-doubling riddim,
chromatic walk into the one drop. KB: 23 licks across 6 styles.
Critic PASS (every note independently pitch-verified; conventions
script-checked; empty-techniques branch verified in the validator).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 00:00:42 +01:00
vadimwit e2110ae21f feat(design): MiniPiano voicing thumbs crop to the voicing's octave span (task D-24)
Thumb window = whole octaves from the octave-C at-or-below the lowest
note (+ closing high C): shell thumbs 266px -> 142px, level with guitar
diagram thumbs. size=full and the legacy lh/rh path byte-identical.
Critic PASS (SVG geometry decoded back to absolute notes incl. the
octave-2 offset case; 793/793 smoke).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 23:58:23 +01:00
vadimwit db397f6ceb feat(design): VoicingBrowser show prop + LickCard stack-guard hardening (task D-23)
show='guitar'|'piano'|'both' (default both — 50/50 SSR renders
byte-identical for existing mounts); LickCard double-stop collision
guard now checks all same-column notes. Critic PASS (subsumption
proven; 13/13 lick layouts unchanged; adversarial overlap dead).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 23:56:22 +01:00
vadimwit ee81326db0 ledger: iteration 4/24 — P-21/P-22/L-22 done; promote L-24/C-22/P-23; log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 23:53:35 +01:00
vadimwit 9e2567cf20 feat(kb): jazz piano cell — the KB's first authored piano pack (task P-22)
14 plays (7 progressions x 2): Bud Powell shells, rootless Type A/B,
guide-tone comps; comping rhythms; piano-angled improv. Hand spans
<= a 10th throughout. Critic returned once (6 prose voice-leading
overclaims on fifths-apart dominant alternation), fixed, PASS on
re-gate (all 6 corrected sentences arithmetic-verified both
directions); ride-along one-word polish per gate suggestion.
Rendering the authored pack in the Jam Guide is task L-24.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 23:52:23 +01:00
vadimwit 78706ce5ba feat(jamguide): Knowledge Center shell — four-section dock with level filter (task L-22)
Jam Guide (live, verbatim Roadmap move) / Explore (KB browser + famous
progressions, filter-exempt) / Voicings (picker follows live chord ->
VoicingBrowser) / Licks & Techniques (LickCard grids + one legend,
honest empty states). Shared foundation/intermediate filter chips;
ExplorePanel refactored to named exports (was orphaned, now imported).
App.jsx: exactly one additive prop (onChordClick). Critic PASS (48/48
SSR checks; audio contract grep clean; Roadmap hunks byte-identical).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 23:38:28 +01:00
vadimwit 6ea1089295 feat(kb): licks pack #1 — 12 licks for blues, jazz, funk guitar (task P-21)
4 per style using the C-20 lick schema: B.B. box, turnaround, slow-blues
curl, IV9 tritone slide; The Lick, ii-V-I enclosure, bebop dominant
descent, guide-tone rails; 9th riff, chromatic snapback, Dorian stabs
and 6-line. Every note hand-verified against its chordContext; sources
hedged. Critic PASS (independent pitch computation of all 12; validator
12 licks green; double-stop/slide glyph ordering render-checked).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 23:32:18 +01:00
vadimwit 432a238c15 ledger: iterations 2-3/24 — D-21/D-22/P-20/L-21/L-23 done; narrow P-21 lock; log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 22:57:36 +01:00
vadimwit c08b334bad feat(kb): intermediate progressions + level tags for jazz, gospel, rnb (task P-20)
6 new level:'intermediate' progressions (tritone sub, rhythm-changes
bridge, gospel passing-dim walk-up, tonicized amen w/ borrowed iv,
Just-the-Two-of-Us loop, Sir Duke chromatic vi) x 2 guitar plays each;
all progressions in the three styles now carry explicit level. KB:
56 progressions / 112 plays. Critic returned once (3 caption theory
misstatements), fixed, PASS on re-gate (voice-leading arithmetic
hand-verified from shape constants).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 22:56:58 +01:00
vadimwit 951d5440e1 feat(jamguide): playable VoicingBrowser in chord modal + enlarged stations (task L-21)
ChordDetailModal Guitar/Piano tabs mount VoicingBrowser on top with
legacy grips/technique reference preserved below; Jam Guide enlarged
station view gains the browser on both instrument tabs; parse-null
never mounts a wrong-chord fallback. App.jsx untouched. Critic PASS
(SSR-verified both entry points; onFocusChord effects byte-untouched).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 22:55:42 +01:00
vadimwit f4e0ac67e0 fix(voicings): correct movable-shape base-fret indexing in getGuitarVoicings (task L-23)
strIdx = rootStr-1 read OPEN [s6..s1] backwards: every rootStr-5 shape
sat 2 frets low, every rootStr-4 shape 5 frets low (A-shape C major
labeled fret 1 instead of 3) in ChordDetailModal/ExplorePanel/
CurrentJamPanel; rootStr-6 was accidentally correct (same pc both ends).
Now uses the shared 6-rootStr convention. Also: playChord docstring
octave example corrected. Critic PASS (6 independent fret checks +
252-entry pre/post sweep, structure unchanged).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 22:54:18 +01:00
vadimwit 3c903ad1d9 feat(design): VoicingBrowser — switchable, playable voicings per chord (task D-21)
Guitar row (placeable GUITAR_SHAPES via ChordDiagram) + piano row (4
pianoVoicing styles via MiniPiano), chips + explicit play button per
voicing through chordAudio; single shared stop handle; graceful
guitar-empty cell (only add9@E across 168 quality x root cells).
voicings.js gains an export-only GUITAR_SHAPES line. Critic returned
once (rootless voicings badged lowest voice as root — rootPc now passed
through), PASS on scoped re-gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 22:43:21 +01:00
vadimwit 44d9c4f0e8 feat(design): LickCard — tab-style SVG lick renderer with technique glyphs (task D-22)
String 1 (high e) on top per tab convention; h/p slurs, slide, bend,
vibrato, ghost, double-stop column stacking; TechniqueLegend named
export (once per grid); layoutTab pure + testable; DEMO_LICK fixture
until P-21 lands. Critic PASS (47/47 harness checks, schema-exact).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 17:29:17 +01:00
vadimwit 0eeb308aa8 ledger: iteration 1/24 — L-11/L-20/D-20/C-20 done (Critic PASS x4); file L-23; log
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 17:08:06 +01:00
vadimwit 793e60ab05 feat(kb): schema + validator + smoke for progression levels and licks (task C-20)
Optional additive shapes: progression level (foundation|intermediate)
and per-pack licks (8-word technique vocab, tab notes string 1-6 /
fret 0-15, ids global with progressions). Validator exports checkLick
as a lib for smoke (KB_VALIDATE_AS_LIB guard); smoke 776 -> 787.
Critic PASS (independent sabotage re-proof: injected bad lick exit 1
with named errors; weakened vocab fails smoke 2/787).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 17:07:10 +01:00
vadimwit 96dda6a3ef docs(design): Knowledge Center concept — unified four-section dock (task D-20)
Jam Guide (live) / Explore / Voicings / Licks & Techniques grown from
the JamGuide dock; level filter as toggle chips; 5-commit migration
order for L-22. Audit finding: ExplorePanel + EducationPanel are
orphaned (never mounted) — migration risk far lower than assumed.
Critic PASS (orphan claim, App.jsx one-prop claim, contrast ratios all
independently verified).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 17:04:16 +01:00
vadimwit 7b669f8c11 feat(jamguide): piano tab live — per-station voice-led MiniPiano voicings (task L-11)
Piano is computed (pianoVoicingChain over canonical stations), no
authored KB needed; guitar path value-identical; tap-station guide-tone
contract intact; App.jsx untouched. Critic PASS (303/303 empirical
station checks across 3 progressions x 3 keys; voice-leading threads).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 17:01:55 +01:00
vadimwit 4b0f0c84a7 feat(audio): Web Audio voicing playback engine src/lib/chordAudio.js (task L-20)
playVoicing (piano.js absolute-note space, strummed, soft envelope),
guitarShapeToNotes (tab lists / open frets / movable rootStr+offsets via
the ChordDiagram convention), playChord pc fallback, stopAll. Dedicated
lazy AudioContext; zero coupling to the detection pipeline; mic-feedback
caveat documented. Critic PASS (19/19 independent pitch-math checks).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 17:01:40 +01:00
vadimwit 396c6ba562 ledger: seed sprint-knowledge-center (M-03) — user directive 2026-07-08
Playable voicings per chord, lick/technique cards, intermediate
progressions with level tags, Knowledge Center IA revamp; L-11 hold
lifted and carried forward; /jam-loop 30m x 24 iterations scheduled.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 16:49:07 +01:00
vadimwit 4424e8d72c ledger: D-10/C-10/L-13 done (Critic PASS); L-11 held for user review; log iteration
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-16 11:00:44 +01:00
vadimwit 4727645bb9 fix(piano): dedupe duplicate absolute notes in pianoVoicing (task L-13)
A forced rootless sus2 collided the suspended-2nd and synthesized 9th onto one key
(notes [26,26,31]). Dedupe at the single funnel point ([...new Set(placed)]); pcs/bass
derived from the deduped array. No-op on default/chain path (L-11 render unaffected).
Critic: Set merges only identical absolute integers (same key) so no needed note is lost.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-16 11:00:43 +01:00
vadimwit f98528733d test(piano): smoke coverage for the piano voicing resolver (task C-10)
+705 checks (776 total): per quality x root x style, asserts pcs subset of voicingToneSet,
real 3rd present, true-7th when hasTrueSeventh, notes in [0,36], bass==min, no duplicate
absolute note, determinism, chain pcs-preservation. Surfaced the sus2 dup-note wart (fixed
by L-13). Critic adversarially confirmed the checks bite. Derived expectations, no hardcoding.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-16 11:00:41 +01:00
vadimwit fe49af36ac feat(piano): MiniPiano gains additive voicing prop for the Jam Guide (task D-10)
MiniPiano now dispatches: with a voicing={pianoVoicing(...)} prop it renders the
{notes,pcs,bass,style,label} on a 2-3 octave keyboard (root accent, bass amber-ringed,
thumb/full); without it, the legacy {rootPc,lh,rh} path is byte-unchanged so
ChordDetailModal + ExplorePanel render identically. Critic PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-16 11:00:40 +01:00
vadimwit 096e431157 ledger: seed sprint-jamguide-piano; L-10 done (Critic PASS); promote D-10/C-10; log iteration
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-15 19:05:45 +01:00
vadimwit e2a1552843 feat(piano): pure piano voicing resolver src/lib/piano.js (task L-10)
pianoVoicing({rootPc,quality},opts?) -> {notes,pcs,bass,style,label}: shells (1-3-7),
rootless A/B (3-5-7-9 / 7-9-3-5), root-position; opts.prev / pianoVoicingChain thread a
loop with octave voice-leading optimization. Helpers: hasTrueSeventh, voicingToneSet.
Pure, imports only theory.js. Critic PASS: 56 voicings (14 qualities x 4 styles), 0 wrong
notes, deterministic. New unimported module (no frontend impact yet) — D-10 renders it,
L-11 wires the piano tab.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-15 19:05:44 +01:00
vadimwit b31742e923 ledger: D-03 done (Critic PASS on re-gate); file L-12 follow-up; log iteration
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-15 13:05:22 +01:00
vadimwit 53d78ce30f feat(jamguide): tap a Roadmap station -> guide tones on the main Fretboard (task D-03)
Completes the flagship Roadmap feature. App.jsx lifts a jamFocusChord state (additive,
+10/-0, audio callbacks/refs untouched); JamGuide emits the tapped station's {rootPc,
quality} via onFocusChord; Fretboard halos the 3rd/7th with a degree badge.

Also fixes root-cause guideTones: hasSeventh now keys on real m7/M7 (interval 10/11),
not length>=4 -- so add9/maj6/min6 no longer badge their 5th/6th as a '7'. Fretboard
badge derives its label from the actual interval (belt-and-suspenders). RoadmapTrack
lane self-corrects. Critic returned-then-PASS on re-gate; build + smoke + validator green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-15 13:05:21 +01:00