Difficulty Chip Full-Tier Expansion + Recommendation Card Label Platform Binding
SummaryExpands Sprint 256's conservative 3-tier (Bronze/Silver/Gold) exposure to the full platform-native tier range — BOJ Bronze~Diamond / Programmers Lv.1~5 (5 tiers). RUBY is excluded since it has no corresponding Programmers level (Lv.6). Adds PLATINUM/DIAMOND to `RECOMMENDABLE_DIFFICULTIES` + Lv.4→PLATINUM/Lv.5→DIAMOND to `PROGRAMMERS_LEVEL_BY_DIFFICULTY` (1:1 aligned with Gateway levelToDifficulty). Higher tiers are served from cross-study real data with no static-seed manipulation, showing a graceful empty state when absent to preserve data integrity. Then the recommendation **card** (result item) difficulty label is also branched by the item's own platform (BOJ→tier, Programmers→Lv.N). PR #488 `43d4307a` (chip full-tier) + PR #489 `a16d3b27` (card label binding).
Date: 2026-07-24
Goal
Sprint 256 exposed only the seed-covered range (3 tiers) as a conservative measure against empty recommendations. Now expand the difficulty selection range to the platform-native full tiers. Also, following Sprint 257 which branched the selection chip labels per platform, bind the recommendation card (result item) difficulty labels to the item platform to complete notation consistency.
Targets
- PR #488
43d4307a— difficulty chip full-tier expansion (BronzeDiamond / Lv.15) - PR #489
a16d3b27— bind recommendation card difficulty labels to item platform
Decisions
D1. Expand selection chips to 5 tiers, exclude RUBY (#488)
Add PLATINUM/DIAMOND to RECOMMENDABLE_DIFFICULTIES, expanding 3 tiers → 5 tiers. Add Lv.4→PLATINUM, Lv.5→DIAMOND to PROGRAMMERS_LEVEL_BY_DIFFICULTY, keeping 1:1 alignment with Gateway's levelToDifficulty so storage/search/recommendation filters share the same enum. RUBY is excluded as it has no corresponding Programmers level (Lv.6) — expose only tiers that both platforms can support.
D2. Higher tiers served from real data + graceful empty state (no static-seed manipulation) (#488)
The expanded higher tiers (PLATINUM/DIAMOND) are served from cross-study real data rather than force-filling static seed. When no real data exists for a tier, a graceful empty state is shown. Where Sprint 256 prevented empty recommendations by "hiding seed-uncovered tiers," Sprint 258 shifts to "expose them but honestly show an empty state when data is absent" — avoiding groundless seed labeling and prioritizing data integrity.
D3. Bind recommendation card labels to item platform (#489)
Sprint 257 branched the selection chip labels per platform, but the recommendation result card difficulty labels remained mixed. Branch card label rendering by the item's own platform (BOJ item = solved.ac tier, Programmers item = Lv.N). Export the platform-detection helper from problem-search.utils.ts for reuse.
Implementation
- #488:
SearchStep.tsxadd PLATINUM/DIAMOND toRECOMMENDABLE_DIFFICULTIES+ Lv.4/Lv.5 mappings inPROGRAMMERS_LEVEL_BY_DIFFICULTY+SearchStep.test.tsxfull-tier cases - #489:
SearchStep.tsxcard label per-item-platform branching +problem-search.utils.tsexport platform-detection helper +SearchStep.test.tsx2 per-platform label cases
Verification (Oracle re-verified directly — distrust self-reports): #488 tsc no new errors, ESLint 0 errors, jest 22+31 pass, next build exit 0. #489 per-platform card label suite green. Both PRs merged to origin/main (squash).