Skip to content

Replace difficulty glasses with a semantic tier rail #131

Closed
5 of 5 issues completed
Closed

Description

@cchacs

Effort: L

Target File / Section

  • plugin.json — description
  • README.md:128-160
  • settings.html:33-36
  • screen.js:1165-1215 — tier-to-glass presentation helpers
  • screen.js:1725-1778 — difficulty_ladder.sections.v2
  • screen.js:2370-2522 — standalone canvas HUD
  • INTEGRATION.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.
  • showGlasses therefore 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:

  1. 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.
  2. Render a compact segmented rail. Lit segments show currentTier; a distinct notch/outline marks topTier. Do not encode difficulty by changing the component's physical size.
  3. Provide readable detail such as Tier 2 of 4 · full detail at 3 on hover, focus, and an accessible label.
  4. Use the same tokens, tier semantics, and current/upcoming treatment in standalone and Section Map presentations. Location/granularity may differ; meaning must not.
  5. Make the standalone component event-driven. Update on song/phrase/mastery/settings changes, not every rAF frame.
  6. Rename the setting to Show difficulty guide, migrate showGlasses, and state where the guide appears when Section Map is installed.
  7. 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.
  8. 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

  1. pullfrog commented on Sep 26, 2026

    @pullfrog
    Contributor
  2. cchacs commented on Sep 26, 2026

    @cchacs
    CollaboratorAuthor
  3. added theissue type on Sep 26, 2026
  4. cchacs commented on Oct 2, 2026

    @cchacs
    CollaboratorAuthor

    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:

    Order Sub-issue Covers remediation steps Depends on
    1 #156 Tier rail 1/4: v3 sections event + transition policy 1, 7 none
    2 #157 Tier rail 2/4: standalone tier rail renderer 2, 3, 4, 5 #156
    2 #158 Tier rail 3/4: rename showGlasses + migrate the stored value 6 none (can ship independently)
    2 feedBack-plugin-sectionmap#14 Section Map consumer (existing issue, now linked as a sub-issue) Section Map side of 1, 2, 3, 4 #156
    3 #159 Tier rail 4/4: remove glassSize, glass drawing and glass terminology 8 #156, #157, #158, sectionmap#14

    The 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

  5. added
    Track: metaParent roadmap/tracker — never taken as a work item
    on Oct 7, 2026
  6. cchacs commented on Oct 7, 2026

    @cchacs
    CollaboratorAuthor

    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 glass clean). Keep v2 fallback until M6 verify passes. One agent per issue; claim via assignee before starting.

  7. cchacs commented on Oct 7, 2026

    @cchacs
    CollaboratorAuthor

    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 naming m<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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Track: metaParent roadmap/tracker — never taken as a work itemenhancementNew feature or request

    Type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions