--- title: "Add semantic left_pole/right_pole labels to SVD_THEMES" type: fix status: active date: 2026-04-05 origin: docs/superpowers/specs/2026-04-05-svd-axis-labels-design.md --- # Add Semantic Left/Right Pole Labels to SVD_THEMES ## Problem The `positive_pole`/`negative_pole` labels in `SVD_THEMES` describe the raw SVD math poles, not the semantic left/right after flip. When the axis flips at runtime (to ensure right-wing parties appear on the right), the pole labels are swapped but still describe the raw SVD orientation — resulting in labels like "← PVV en FVD" appearing on the left side when they should be on the right. ## Solution Add `left_pole` and `right_pole` fields to each `SVD_THEMES` entry that describe what's on the left and right sides after flip. Update rendering code to use these semantic labels directly. ## Implementation Units - [ ] **Unit 1: Add left_pole/right_pole to SVD_THEMES in config.py** **Goal:** Add semantic pole labels to all 10 SVD components. **Files:** - Modify: `analysis/config.py` **Approach:** - For each component, add `left_pole` and `right_pole` fields based on the existing `positive_pole`/`negative_pole` and the `flip` value - When `flip=True`: `left_pole` = `positive_pole`, `right_pole` = `negative_pole` - When `flip=False`: `left_pole` = `negative_pole`, `right_pole` = `positive_pole` - Keep `positive_pole`/`negative_pole` for backward compatibility - [ ] **Unit 2: Update explorer.py rendering to use left_pole/right_pole** **Goal:** Use semantic pole labels in all rendering functions. **Files:** - Modify: `explorer.py` (lines 967-970, 1087-1090, 1252-1253, 2806-2807) **Approach:** - Replace the positive/negative swap logic with direct `left_pole`/`right_pole` usage - `left_label = theme.get("left_pole", pos_pole if flip else neg_pole)` (backward compat fallback) - `right_label = theme.get("right_pole", neg_pole if flip else pos_pole)` - [ ] **Unit 3: Update tests** **Goal:** Add tests for left_pole/right_pole fields. **Files:** - Modify: `tests/test_svd_labels.py` - Modify: `tests/test_explorer_chart.py` **Approach:** - Test that all 10 SVD_THEMES entries have `left_pole` and `right_pole` fields - Test that rendering functions use left_pole/right_pole correctly ## Scope Boundaries - In scope: `analysis/config.py` SVD_THEMES, `explorer.py` rendering, tests - Out of scope: `analysis/political_axis.py`, `analysis/projections.py` (uses positive_pole/negative_pole for motion projection, not UI labels)