AlgoSu TechKO

Recommendation Difficulty Chips — Platform-Native Labels (BOJ Tier / Programmers Lv)

SummaryThe Sprint 256 difficulty selection chips were hard-coded to Bronze/Silver/Gold (solved.ac tier names) regardless of platform, so BOJ tier names appeared even on the Programmers tab — a label mismatch. Since BOJ (solved.ac tiers) and Programmers (Lv.1~5) use different difficulty systems, `difficultyChipLabel(platform, difficulty)` branches the label per platform (BOJ→Bronze/Silver/Gold, PROGRAMMERS→Lv.1/Lv.2/Lv.3). The transmitted enum values (BRONZE/SILVER/GOLD) stay identical, preserving the seed band mapping (Lv.1→BRONZE, etc.) and the BE contract — a pure display-layer change. PR #487 `1263c3a0` (FE only: SearchStep label branching + platform prop wiring + per-platform label/enum-transmit tests).

Date
ImpactMedium

Date: 2026-07-23

Goal

The difficulty selection chips introduced in Sprint 256 had labels hard-coded to Bronze/Silver/Gold (solved.ac tier names) regardless of platform. Even though BOJ and Programmers use different difficulty systems (BOJ = solved.ac tiers, Programmers = Lv.1~5), BOJ tier names appeared even on the Programmers tab — a label mismatch. Branch the chip labels into each platform's native notation to eliminate user confusion.

Target

  • PR #487 1263c3a0frontend recommendation chip label per-platform branching (FE only)

Constraint: Change only the displayed label; never break the difficulty enum contract sent to the server (BRONZE/SILVER/GOLD) or the seed band mapping (BE/data unchanged).

Decisions

D1. Branch labels per platform, keep transmitted enum invariant (#487)

Introduce a difficultyChipLabel(platform, difficulty) helper that branches chip labels per platform:

  • BOJ: Bronze / Silver / Gold (solved.ac tier names)
  • PROGRAMMERS: Lv.1 / Lv.2 / Lv.3 (Programmers native levels)

The key is separating the transmitted value from the displayed value. Only the user-visible label changes per platform; the enum sent to the server on click (BRONZE/SILVER/GOLD) stays identical. This preserves the seed band mapping (Lv.1↔BRONZE, etc.) and the BE difficulty-filter contract intact, confining the change scope to the pure display layer.

Implementation

  • SearchStep.tsx: difficultyChipLabel(platform, d) label branching + platform prop wiring into RecommendationSection
  • SearchStep.test.tsx: per-platform label verification (PROGRAMMERS = Lv notation / BOJ = tier names) + assertion that the transmitted enum on click is platform-independent

Verification (Oracle re-verified directly — distrust self-reports): FE suite green on both per-platform label rendering and enum-transmit invariance. PR merged to origin/main (squash).