diff --git a/docs/superpowers/specs/2026-05-26-saju-ui-design.md b/docs/superpowers/specs/2026-05-26-saju-ui-design.md
new file mode 100644
index 0000000..8e8ac4c
--- /dev/null
+++ b/docs/superpowers/specs/2026-05-26-saju-ui-design.md
@@ -0,0 +1,387 @@
+# saju-lab UI v1 — 호령 사주 페이지 설계
+
+**작성일**: 2026-05-26
+**상태**: Spec (구현 plan 작성 전)
+**전제**: saju-lab 백엔드 완성 (474 tests, SHA 8123f75) + web-ui Task 28 (api helpers + placeholder pages)
+
+---
+
+## 1. 목표
+
+사용자 시안 4종(`source/images/saju_page/horyung_saju_main.png`, `_today.png`, `_gunghab.png`, `_saju.png`) + 캐릭터 시트(`source/characters/horyung.png`) + 컬러시트(`saju_color_sheet.png`) 기반으로 web-ui `/saju/*` 페이지를 호령 마스코트와 함께 구축한다.
+
+v1 범위: **메인 / 오늘의 운세 / 사주풀이** 3개 페이지. 궁합은 v2 placeholder.
+
+---
+
+## 2. 결정된 핵심 사항
+
+| 항목 | 결정 |
+|------|------|
+| 캐릭터 자산 | horyung.png + saju_color_sheet.png에서 PNG 6개 추출 |
+| 백엔드 확장 | saju-lab에 fortune_scores + lucky + monthly_flow 산출 추가 |
+| 입력 흐름 | 메인에서 사주 1회 입력 → reading_id를 다른 페이지 URL query로 공유 |
+| v1 페이지 | 메인 + 사주풀이 + 오늘운세 (궁합은 v2) |
+| 반응형 | 데스크탑(1280+) 우선 + 태블릿 그라데이션 |
+| 컬러 | 시안 추출 — 크림 베이스 + 다크 네이비 + 골드 + 살구 + 청록 |
+| 폰트 | Pretendard (본문) + Noto Serif KR (큰 제목, Google Fonts) |
+| CSS 격리 | `.saju-page` scope (다른 페이지에 새지 않음) |
+
+---
+
+## 3. 백엔드 확장 (saju-lab)
+
+### 3-1. 신설 모듈
+
+**`saju-lab/app/calculator/fortune_scores.py`** — 4 카테고리 점수:
+
+```
+calculate_fortune_scores(saju, analysis, current_year) → {
+ wealth: 0-100 (재물운)
+ romance: 0-100 (연애운)
+ social: 0-100 (인간관계)
+ career: 0-100 (직장운)
+ overall: 0-100 (가중평균: wealth*0.3 + career*0.3 + romance*0.2 + social*0.2)
+}
+```
+
+알고리즘 (각 base 60에서 가산/감산, clamp 0-100):
+
+- **wealth**: +정재 강도 / +편재 강도 / +식상→재 통로 / -비겁 강도 / +세운재성
+- **romance**: +일지 합 / +정관·정재 균형 / -일지 충 / +세운 도화살
+- **social**: +인성 / +비겁 적정 / +식상 / +격국 균형 / +천을귀인
+- **career**: +정관 강도 / +편관 제어 / +일간 신강 / +세운 관성
+
+**`saju-lab/app/calculator/lucky.py`** — 럭키 데이터:
+
+```
+calculate_lucky(saju, analysis, target_date) → {
+ color: [str, str] # 용신 오행 컬러 1~2개 (예: ["청록", "녹색"])
+ number: int 1-9 # (일진 천간 idx + 시진 천간 idx) % 9 + 1
+ direction: str # 용신 오행 방향 (동/남/중앙/서/북)
+ good_signs: [str] # 세운 천간이 일간 재성 → "재물 기회" 등
+ warnings: [str] # 세운 지지가 일지 충 → "대인 갈등 주의"
+}
+```
+
+오행→컬러/방향 매핑은 정적 dict. 럭키 숫자는 일진+시진(시간 미상 시 일진만)으로 산출.
+
+**`saju-lab/app/calculator/monthly_flow.py`** — 12개월 운세 흐름:
+
+```
+calculate_monthly_flow(saju, year) → [
+ {month: 1, stem: "壬", branch: "寅", score: 65, label: "변동"},
+ {month: 2, stem: "癸", branch: "卯", score: 70, label: "성장"},
+ ... 12 entries
+]
+```
+
+각 월: 해당 월의 60갑자(寅월부터 12월 사이클) → 일간 관계(상생/상극/충/합) → score 0-100 + label(`변동`/`성장`/`안정`/`도전`/`정체` 등).
+
+### 3-2. `routers/saju.py` 응답 확장
+
+`SajuInterpretResponse`에 3 필드 추가:
+
+```python
+fortune_scores: dict # {wealth, romance, social, career, overall}
+lucky: dict # {color, number, direction, good_signs, warnings}
+monthly_flow: list[dict] # 12 entries
+```
+
+`interpret_saju_endpoint`에서 계산 + DB 저장 + 응답 포함.
+
+### 3-3. `db.py` 스키마 마이그레이션
+
+`saju_records` 테이블에 ALTER TABLE로 3 컬럼 추가 (idempotent):
+- `fortune_scores_json TEXT`
+- `lucky_json TEXT`
+- `monthly_flow_json TEXT`
+
+`init_db()`에 try/except OperationalError 패턴 (이미 존재하면 skip).
+
+`_saju_row_to_dict`에서 3 컬럼 JSON 파싱하여 응답에 포함.
+
+### 3-4. 테스트
+
+- `test_fortune_scores.py` — 5-8 case (정재 강함 → wealth 80+, 일지 충 → romance 50-, clamp 검증)
+- `test_lucky.py` — 5 case (오행→컬러/방향 매핑, 럭키 숫자 1-9 범위)
+- `test_monthly_flow.py` — 3 case (12 entries 정확, 일간 충 월 score 낮음)
+
+기존 30 reference fixture 비교는 영향 없음 (응답에 새 필드만 추가).
+
+---
+
+## 4. 프론트엔드 구조 (web-ui)
+
+### 4-1. 디렉토리
+
+```
+web-ui/
+├── public/images/saju/
+│ ├── horyung/
+│ │ ├── horyung-front.png # 시안 main hero용 (정면, 큰 사이즈)
+│ │ ├── horyung-bust.png # 작은 카드용 (가슴샷)
+│ │ ├── horyung-greeting.png # 인사 표정 (메인 좌상단)
+│ │ ├── horyung-thinking.png # 생각하는 표정 (사주풀이)
+│ │ ├── horyung-pointing.png # 가르치는 표정 (오늘운세)
+│ │ └── horyung-happy.png # 기쁜 표정 (점수 높을 때)
+│ ├── frame-cloud.png # 시안의 한국화 산 배경 (hero용)
+│ ├── pattern-cloud.svg # 한국 전통 구름 패턴
+│ └── icons/
+│ ├── icon-today.svg
+│ ├── icon-heart.svg
+│ └── icon-book.svg
+└── src/pages/saju/
+ ├── Saju.css # 모든 saju 페이지 공통 스타일 (격리)
+ ├── data/
+ │ └── constants.js # 4 카테고리 메타, 컬러 토큰
+ ├── hooks/
+ │ ├── useSajuForm.js
+ │ └── useSajuReading.js # reading_id → fetched data + 캐시
+ ├── components/
+ │ ├── HoryungMascot.jsx
+ │ ├── SajuNav.jsx # 시안 상단 네비게이션 (호령사주 로고 + nav)
+ │ ├── SajuInputForm.jsx
+ │ ├── ActionCard.jsx # 3 카드 (오늘운세/궁합/사주풀이)
+ │ ├── ScoreCard.jsx # 카테고리 점수 카드
+ │ ├── FortuneRing.jsx # 종합점 ring SVG
+ │ ├── LuckyBox.jsx # 럭키 컬러/숫자/방향
+ │ ├── ElementBarChart.jsx # 오행 5색 가로 바
+ │ ├── SajuPillars.jsx # 4기둥 8자 표시
+ │ ├── MonthlyFlow.jsx # 12개월 운세 흐름 차트
+ │ ├── InterpretAccordion.jsx # AI 12항목 아코디언
+ │ └── HoryungQuote.jsx # 호령 말풍선
+ ├── Saju.jsx # 메인 페이지
+ ├── SajuResult.jsx # 사주풀이 결과
+ ├── Today.jsx # 오늘의 운세
+ └── Compatibility.jsx # v2 placeholder
+```
+
+### 4-2. 라우팅 (변경 없음, Task 28에서 등록됨)
+
+| 경로 | 컴포넌트 | reading_id 필요 |
+|------|---------|----------------|
+| `/saju` | Saju.jsx (메인) | 아니오 |
+| `/saju/result?rid=N` | SajuResult.jsx | 예 |
+| `/saju/today?rid=N` | Today.jsx | 예 |
+| `/saju/compatibility` | Compatibility.jsx (placeholder) | — |
+
+기존 `/saju/result` 등은 Task 28에서 placeholder로 등록 — 본 task에서 실제 컴포넌트로 교체.
+
+### 4-3. 데이터 흐름
+
+```
+[사용자] → /saju (메인)
+ ↓ 사주 입력
+ ↓ sajuInterpret(form)
+ ↓ POST /api/saju/interpret
+[saju-lab] 계산 + Claude AI + fortune_scores + lucky + monthly_flow
+ ↓ 응답: { reading_id, ... 풍부한 데이터 }
+[프론트] navigate(`/saju/result?rid=${reading_id}`)
+
+[사주풀이 페이지] /saju/result?rid=N
+ ↓ useSajuReading(N) → sajuGetReading(N)
+ ↓ GET /api/saju/readings/N
+ ↓ saju_data + analysis_data + daeun_data + interpretation_json + fortune_scores + lucky + monthly_flow
+ ↓ 렌더
+
+[오늘운세] /saju/today?rid=N — 사용자가 메인 또는 사주풀이에서 클릭
+ ↓ useSajuReading(N) + sajuCurrentFortune(N)
+ ↓ 렌더: ring + 4 score + lucky + 오늘 세운
+```
+
+### 4-4. 호령 마스코트
+
+`HoryungMascot.jsx` — `pose` prop으로 6개 PNG 중 선택.
+
+```jsx
+
두 사람의 사주를 함께 풀어보는 기능을 준비 중입니다.
+ 메인으로 돌아가기 +