Repository navigation
Description
Effort: L
Target File / Section
plugin.json— descriptionREADME.md:128-160settings.html:33-36screen.js:1165-1215— tier-to-glass presentation helpersscreen.js:1725-1778—difficulty_ladder.sections.v2screen.js:2370-2522— standalone canvas HUDINTEGRATION.md— Section Map contract
Category
Calibration | Consistency | Workflow | Omission
Flaw Analysis
The glasses should be retired, not cosmetically restyled.
The metaphor attempts to encode two different facts at once:
- vessel height /
glassSize= the tier where the phrase or section reaches full detail (top_difficulty); - liquid height /
fillPercentage= the currently presented tier relative to that threshold.
That mapping is not self-explanatory. A short full glass, tall half-full glass, and medium nearly-full glass require users to infer both object size and fill ratio, then translate them back into chart tiers while playing. The UI has no visible legend or numeric label.
The two implementations are also not one coherent component:
- The standalone canvas shows five phrases, changes fill color blue → gold → red, and outlines the current phrase in gold.
- Section Map shows sections, uses a fixed amber fill, and relies on section opacity/playhead for current state.
- Installing Section Map silently suppresses and relocates the standalone HUD through
window.__slopsmithSectionMapHooksInstalled. showGlassestherefore does not identify a stable location or granularity.- The canvas is pointer-inert and has no accessible name or keyboard-readable details; Section Map exposes information only through hover titles.
- The standalone HUD occupies a fixed top-center overlay at z-index 15 and redraws on every animation frame even though its meaningful inputs change at song load, phrase transition, or mastery change.
The cross-plugin event compounds the separation problem. Difficulty Ladder emits UI decisions (fillPercentage, glassSize) instead of semantic tier values. That makes Section Map inherit this metaphor and prevents alternative renderers from presenting the same data appropriately.
Remediation
Replace the glasses with a difficulty tier rail:
- Emit a render-neutral event contract containing, per phrase/section:
- stable id/index and time range;
currentTier;topTier(tier where full detail is reached);maxTier;- whether the entry is current;
- optional player context.
- Render a compact segmented rail. Lit segments show
currentTier; a distinct notch/outline markstopTier. Do not encode difficulty by changing the component's physical size. - Provide readable detail such as
Tier 2 of 4 · full detail at 3on hover, focus, and an accessible label. - Use the same tokens, tier semantics, and current/upcoming treatment in standalone and Section Map presentations. Location/granularity may differ; meaning must not.
- Make the standalone component event-driven. Update on song/phrase/mastery/settings changes, not every rAF frame.
- Rename the setting to
Show difficulty guide, migrateshowGlasses, and state where the guide appears when Section Map is installed. - Keep the v2 event available for a transition period or version the new event/schema explicitly so Section Map upgrades do not break by load order.
- Remove
glassSize, glass drawing helpers, glass-specific docs, and the plugin description's glass terminology after the consumer migration lands.
Acceptance Criteria
- A first-time user can identify current tier and full-detail threshold without documentation.
- Standalone and Section Map renderers report identical tier values and visual semantics.
- Missing phrase data produces no guide rather than a zero-tier value.
- Keyboard and screen-reader users can inspect the current and upcoming values.
- No difficulty-guide work runs continuously at 60 fps.
- Split Screen/player-context instances remain isolated.
- Contract tests cover v2 transition behavior and the semantic v3 payload.
Activity
pullfrog commentedon Sep 26, 2026
cchacs commentedon Sep 26, 2026
Section Map consumer implementation is tracked in get-flashbacks/feedBack-plugin-sectionmap#14: get-flashbacks/feedBack-plugin-sectionmap#14
cchacs commentedon Oct 2, 2026
Split into sub-issues (proposed; adjust freely). Suggested order, with what blocks what. The numbered titles ("Tier rail N/4") map to issue numbers as shown:
showGlasses+ migrate the stored valueglassSize, glass drawing and glass terminologyThe acceptance criteria stay on this parent; each sub-issue carries the ones relevant to it. #159 is last on purpose: the v2 event must keep working until every consumer has migrated, since plugins load alphabetically and Section Map would otherwise break by load order.
Generated by Claude Code
cchacs commentedon Oct 7, 2026
Sequenced into milestones (M1-M6 cover all 43 open issues; this tracker closes in M6). Order: v3 contract #156 done -> #157 standalone tier rail (M3) -> rename #158 done -> #159 glass removal (M6, needs #157 + sectionmap#14 migrated +
git grep -i glassclean). Keep v2 fallback until M6 verify passes. One agent per issue; claim via assignee before starting.cchacs commentedon Oct 7, 2026
Status: n/a - meta (parent tracker, never a work item)
Track: meta
Milestone: M6 Cross-repo & Final Removal
Closes with: #159
Children (open): #157, #159
Already closed: #156 (v3 contract) and #158 (rename) are closed - keep closed
Tier rail: #159 additionally needs sectionmap#14 migrated and git grep -i glass clean.
Sequenced per the repository's issue-sequencing plan (milestones M1-M6, ordered; this comment is the Status/Track/Blocked-by coordination line while the board is milestones-only). Update this comment when claiming, blocking, or handing off - claim protocol: one agent per issue; comment
Claimed in <branch> (<milestone>); branch namingm<M>-<issue>-<slug>; set Status to In Progress/In Review/Done here as work proceeds. Never take this issue as a work item if Track is meta.docs: waive the Song Mastery deprecation notice and scope out #159 (#86)
test: prove and record dual-plugin coexistence policy; close #86/#81 (#…
feat: remove glassSize, glass drawing and glass terminology (#159) (#231