Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
5fa6f13
fix(grading-display): fix copy-card accuracy + restore 3D highway hit…
ChrisBeWithYou Jul 10, 2026
6f60d70
docs(roadmap): log v0.1.10 grading-display fixes + correct stale vers…
ChrisBeWithYou Jul 10, 2026
d1f1157
feat(ui): host-parity topbar — Tuner/Instrument/Profile badges + host…
ChrisBeWithYou Jul 10, 2026
143a391
fix(generators): string-count-aware system defaults + bass shape guar…
ChrisBeWithYou Jul 10, 2026
9e234f6
feat(ui): 2D Highway joins the view lineup; view pills become a dropd…
ChrisBeWithYou Jul 10, 2026
af8fed8
feat(ui): highway_2d slot borrows the host Classic 2D Highway when av…
ChrisBeWithYou Jul 10, 2026
a5d04ec
test(smoke): seed the L1 instrument store per suite (host-sync contam…
ChrisBeWithYou Jul 12, 2026
4ee1f3a
fix(generators): interval-aware power-chord grip — the drop-tuning ba…
ChrisBeWithYou Jul 12, 2026
40cb71d
feat(generators): bass low-fifth reach — rfoPattern 'low5' (v0.1.15)
ChrisBeWithYou Jul 12, 2026
3a4efe9
feat(render): Classic 2D Highway parity — perspective falling-fret re…
ChrisBeWithYou Jul 13, 2026
cb6cc0d
feat(ladder): add guitar + bass tapping ladders (concept_tapping pack…
ChrisBeWithYou Jul 14, 2026
13a9c8f
docs(roadmap): mark tapping ladders shipped to dev + folded into PR #4
ChrisBeWithYou Jul 14, 2026
190fa5e
feat(coach): prescriptive coach loop on the results modal (v0.1.17)
ChrisBeWithYou Jul 14, 2026
b7211f5
feat(coach): bass Pocket-Diagnosis under the felt verdict (v0.1.18)
ChrisBeWithYou Jul 14, 2026
d68121a
feat(coach): localize the timing diagnosis to the worst bars (v0.1.19)
ChrisBeWithYou Jul 14, 2026
df2eabc
feat(coach): anti-thrash hysteresis — keep the player on one fix (v0.…
ChrisBeWithYou Jul 14, 2026
b22c15b
feat(ear-mode): "Hear it" — audition the target phrase (2.1, v0.1.21)
ChrisBeWithYou Jul 14, 2026
161801c
merge: reconcile main (Byron's Gold-rung 0.2.0, #11) into dev → 0.2.1
ChrisBeWithYou Jul 14, 2026
c022065
merge: land topbar stack #5-#10 (v0.1.11-0.1.16) onto dev (0.2.1)
ChrisBeWithYou Jul 14, 2026
8cc4076
merge: land coach loop #12 (v0.1.17-0.1.20) onto dev (0.2.1)
ChrisBeWithYou Jul 14, 2026
4f9bf8e
merge: land ear-mode 2.1 #13 (v0.1.21) onto dev; batch → v0.2.2
ChrisBeWithYou Jul 14, 2026
f0c78c6
feat(ui): read exact tuningMidis from GET /api/tunings (host #829)
ChrisBeWithYou Jul 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,19 @@ Verification: 18 Playwright smoke suites (`.claude/skills/run-virtuoso/`, `npm t

## Open threads

- **STOPPED HERE (2026-07-14 session) — TAPPING LADDERS (guitar + bass) SHIPPED to `virtuoso-dev` (v0.1.11, commit `cb6cc0d`), PUSHED. Folded into PR #4 (dev→main) at Christian's call — PR #4 now carries BOTH the v0.1.10 grading fixes AND the v0.1.11 tapping ladders; title/body updated to match.** New `concept_tapping` Concepts pack, carved out of Legato (the lone `leg_tapping` rung re-homed as `tap_articulation`). Full 6-agent group-design (learning-design chair + guitar/bass-pedagogy + metal-idiom + harmony + rhythm). Detail + decisions: memory `project_tapping_ladders_2026-07-14`.
- **Engine:** `buildTappingExercise` split — plain `tapping` = the single-string tap→pull ARTICULATION drill (replaces the off-idiom "scalar tap +12 across the neck" metal-idiom flagged); new `tapArp` flag → `buildTappedArpeggioExercise`/`buildTapCascadePath` = idiomatic tap→pull→hammer CASCADE cells (reuses `sweepArpeggioPositions` grid; guitar = 3-note EVH cell, bass = 2-note tap→pull; wide interval always routed to the RH tap; fret cap 22; no-unison adjacency pass incl. the dim7-symmetry seam). `tapArp` plumbed like `sweepStrings` (hidden field + readConfig + anti-leak default).
- **Rungs:** guitar 5 (`tap_articulation`→`tap_cell`→`tap_cascade`→`tap_sevenths`→`tap_changes`, descending tempo ceilings, `tap_cascade` density-ramps triplet→sixteenth_triplet); bass 4 (`btap_articulation`→`btap_arpeggio`→`btap_groove`→`btap_apply`, register-clamped frets 5–12). Both in the one `concept_tapping` band (bass rungs instrument-hidden). Edges + FORM_CUE + `screen.html` options wired.
- **Verified:** `node --check` + `probe-tapping-ladders.mjs` (9/9 rungs: startup guards pass, tp/po/ho present, frets ≤22, no adjacent unison, bass on bass strings) + smoke-generators 134/134, core-purity 40/40, strings, renderers 8/8. Screenshots confirm the `17ᵀ→5ᵖ→9ʰ` cell renders in Tab. **No HOST CHECK needed — generation-path (core) work, our USP, not shell.**
- **DEFERRED (v2, engine gaps flagged by the panel):** bass two-hand independence (needs a two-voice engine), bass open-string cascades, guitar tapped-pedal-point color rung. Not gated the ladder on these.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the grammar in the deferred-work note.

Change “Not gated the ladder on these” to “The ladder was not gated on these.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ROADMAP.md` at line 33, Update the deferred-work note in ROADMAP.md by
replacing “Not gated the ladder on these” with “The ladder was not gated on
these.”

Source: Linters/SAST tools

- **NEXT:** review/merge **PR #4** (dev→main — now the combined grading+tapping PR, https://github.com/got-feedBack/feedBack-plugin-virtuoso/pull/4); on merge `main` goes 0.1.9→0.1.11 (skips a standalone 0.1.10 tag — both land together). Then re-cut beta (`node scripts/cut-beta.mjs --push`). Smoke still MOCKS the contained verifier, so the grading fixes remain real-desktop-DI-dogfood-verified only (standing owe).
Comment on lines +57 to +59

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Separate tapping verification from grading verification.

“No HOST CHECK needed” is valid only for the tapping generation path. This combined PR also ships grading-display fixes, whose installed-desktop/real-detector verification is a release requirement; the current note says that verification is still owed.

🧰 Tools
🪛 LanguageTool

[grammar] ~59-~59: Ensure spelling is correct
Context: ...g. Not gated the ladder on these. - NEXT: review/merge PR #4 (dev→main — no...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ROADMAP.md` around lines 57 - 59, Update the ROADMAP verification note to
distinguish tapping generation verification from grading-display verification:
retain “No HOST CHECK needed” only for the tapping path, and explicitly state
that grading fixes still require installed-desktop verification with the real
detector before release. Keep the existing note that smoke tests mock the
contained verifier and grading verification remains outstanding.

- **STOPPED HERE (2026-07-10 session) — v0.1.10 grading-DISPLAY fixes SHIPPED to `virtuoso-dev` (`5fa6f13`); PR #4 dev→main OPEN (not merged), so `main` is still 0.1.9 and beta is NOT yet re-cut.** Detail + lessons: memory `project_grading_display_fixes_2026-07-10`.
- **Card `0%`/`0-of-0` hero** — `shareCardAction` was STILL delegating to note_detect's `renderResultsCard`/`copyResultsCard` (a stale v0.1.3 path that survived the ratified v0.1.4 "keep our renderer" decision). nd's card hero reads top-level `d.accuracy`/`d.hits`/`d.misses` we never set (only `stats[]`) → 0/0, while the delegation silently suppressed our skins + crest on desktop. **Retired the delegation** → Virtuoso always draws its own skinned `renderShareCardImage`. (`_ndCardApi`/`_resultsCardData`/`_virCardOverlay` kept dormant; the `virtuoso_beta` brand was `cut-beta.mjs`'s token-rename, not note_detect.)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
- **3D highway hit-flare invisible** — highway_3d's **feedBack#254** per-note PROVIDER (`getNoteState`) is authoritative over the `notedetect:hit` window-event marks and culls the gem ~100ms past the strike line unless the provider returns a live verdict THAT FRAME; ours only returned `'hit'` after the async contained drain (~150-400ms late) → gem culled first. Fix: a display-only `{ state:'active', live:true }` **live-ear keep-alive** (`_ptLive` captured in `ptOnPitch`; mirrors note_detect's own `noteStateFor`), pitch-gated ≤ the credit floor + level-gated + ±0.12s window; it renders NO judgment and credit stays verifier-only via `_ptScored`. notedetect-expert APPROVED (not a parallel grader). Return the OBJECT with `live:true` (highway's non-latched `hit-live` branch) — a bare `'active'` string sticks green. **Flare CONFIRMED lighting on Christian's real DI** ("nailed it") → the `_ptHandle` minigames ear DOES hear his DI.
- **⭐ DEPLOY-TARGET GOTCHA (cost a fully-broken build):** Christian dogfoods the **INSTALLED app** at `C:\Program Files\feedback\current\resources\slopsmith\plugins\virtuoso` (hand-copied; needs an **ELEVATED** shell to write), NOT the `%APPDATA%\slopsmith-desktop` dev symlink (which → the working tree). A **PARTIAL** copy (`screen.js` over an older `screen.html`) → version SKEW → `screen.js` boots against a mismatched DOM → total break (no theming/highway/buttons; `node --check` still passes since nothing runs at load). **Always copy the FULL runtime set** (`screen.js` `screen.html` `plugin.json` `routes.py` `settings.html` + `static/` + `assets/`). highway_3d there is NOT symlinked (uses its stale bundle).
- **VERSION CORRECTIONS (supersede the stale refs in the older threads below):** **highway_3d = 3.30.0** (installed desktop bundle) / **3.31.3** (core checkout) — NOT 3.26.0/3.22.0. **note_detect on the desktop = 1.28.0** (via the `%APPDATA%` symlink → repo checkout) — NOT 1.19.0/1.15.3. Both highway_3d versions carry the feedBack#254 provider contract.
- **NEXT:** merge PR #4 → `main` (ships all users via `update_manager`); re-cut beta (`node scripts/cut-beta.mjs --push` → 0.1.10-beta.1). Smoke still MOCKS the contained verifier → both fixes are **real-desktop-DI-dogfood-verified only** (the standing owe).

- **STOPPED HERE (2026-07-09 session) — v0.1.8 + v0.1.9 grading-DISPLAY fixes SHIPPED to main + dev + beta (all pushed). `main` 0.1.6 → 0.1.9.** Full detail + lessons: memory `project_grading_display_fixes_2026-07-09`.
- **REFRAME (headline):** tester reports (MajorMokoto/Kyri, Discord) of "grading broken / scored 0 / B-standard 24%" were **NOT detection** — notes count correctly (95/95, 100% on the HUD + our own card). All three bugs were grading-**DISPLAY**.
- **Fix 1 — structural tunings mis-scored (v0.1.8 `51ab8d7`).** drop-\*/B-standard/BEAD/DADGAD/open on a KEYED rung charted on STANDARD opens while the player was physically re-strung → verifier targets missed → 24%. Built the `applyTuningAdaptL1` STRUCTURAL branch (chart on the player's REAL opens at concert pitch; degree-driven resolver re-fingers the line) = the bass-ruling Phase-2 gap, **now BUILT**. Guarded by new smoke-strings `8-struct` rows.
Expand Down
2 changes: 1 addition & 1 deletion plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "virtuoso",
"name": "Virtuoso",
"version": "0.1.9",
"version": "0.1.11",
"description": "Practice studio for guitar & bass — scale, technique, and rhythm drills, timed workouts, and jam backing that teach skills you take off the screen.",
"category": "practice",
"icon": "assets/thumb.png",
Expand Down
16 changes: 15 additions & 1 deletion screen.html
Original file line number Diff line number Diff line change
Expand Up @@ -2454,7 +2454,15 @@ <h1>Virtuoso<span class="virtuoso-version" id="virtuoso-version"></span></h1>
<option value="pick_herta">Herta Burst</option>
<option value="leg_hopo">Hammer-Ons &amp; Pull-Offs</option>
<option value="leg_runs">Legato Runs (3NPS)</option>
<option value="leg_tapping">Tapping</option>
<option value="tap_articulation">Tap &amp; Pull-Off</option>
<option value="tap_cell">The Tapped Cell</option>
<option value="tap_cascade">Tapped Arpeggio Cascade</option>
<option value="tap_sevenths">Seventh &amp; Diminished Cascade</option>
<option value="tap_changes">Tapping the Changes</option>
<option value="btap_articulation">Bass Tap &amp; Pull-Off</option>
<option value="btap_arpeggio">Tapped Arpeggio Reach</option>
<option value="btap_groove">The Tapped Figure</option>
<option value="btap_apply">Tapping Over a Vamp</option>
<option value="rhy_odd_meter">Odd Meters</option>
<option value="rhy_over_barline">Over the Barline</option>
<option value="rhy_trade_bars">Trade Bars — Make a Groove</option>
Expand Down Expand Up @@ -2755,6 +2763,12 @@ <h1>Virtuoso<span class="virtuoso-version" id="virtuoso-version"></span></h1>
rung). Pathway-driven; 0 = full box. Same setFieldSilent→readConfig
contract; anti-leak defaulted in applyPathwayConfig. -->
<input type="hidden" name="sweepStrings" id="virtuoso-sweep-strings" value="0">
<!-- Tapping ladder: tapArp='true' routes the 'tapping' type through the
idiomatic tapped-arpeggio CASCADE builder (tap→pull→hammer per string)
instead of the single-string tap→pull articulation drill. Pathway-driven;
'' = the articulation drill. Same setFieldSilent→readConfig contract;
anti-leak defaulted in applyPathwayConfig. -->
<input type="hidden" name="tapArp" id="virtuoso-tap-arp" value="">
<!-- Bass Groove & Right-Hand ladder: plucking-hand mode
(pulse|crossing|rake|three_finger). Pathway-driven; 'pulse' default;
anti-leak defaulted in applyPathwayConfig. -->
Expand Down
Loading