웹 시황 대시보드
시세와 차트가 브라우저에 흐르고, AI 분석이 타자기처럼 스트리밍되는 웹 시황 데스크를 빈 폴더에서 빌드합니다. 이번에는 긴 스펙을 쓰지 않습니다. 원작 stock-monitoring은 서브에이전트가 읽고, 참가자는 미션마다 두세 줄짜리 짧은 프롬프트로 지휘하며 결과를 확인합니다. 배포 없이 로컬에서 끝나고, 다른 참가자와의 의존성도 없습니다.
목표물과 기조
숙지다른 캡스톤처럼 빈 폴더에서 superpowers 워크플로로 설계하고 Phase 단위로 빌드합니다. 다른 점은 일하는 방식입니다. 조사, 구현, 리뷰를 서브에이전트에게 나눠 맡기고, 참가자는 짧게 지시한 뒤 결과를 대조합니다. 목표물은 실존 프로젝트 stock-monitoring(FastAPI + React + Bedrock, AWS ECS 운영)을 135분 스코프로 줄인 웹 시황 데스크입니다. 실데이터이며 45초마다 바뀝니다.
| 레이어 | 구성 | 핵심 원칙 |
|---|---|---|
| 백엔드 | FastAPI, /api/market/*, /api/stocks/*, 인메모리 TTL 캐시 | 업스트림 호출은 캐시 뒤로, 같은 키 동시 요청은 한 번만(single-flight) |
| 프런트 | React(Vite) + react-query + lightweight-charts, 원작의 터미널 UI | 화면은 우리 API만 본다, 45초 폴링, AI만 fetch 직접 |
| AI | Bedrock converse_stream, SSE(phase → delta → final) | AWS_BEARER_TOKEN_BEDROCK, 키 없으면 503과 패널 비활성 |
| 위임 | Explore 서브에이전트(원작 분석), subagent-driven-development(Phase 구현), code-reviewer(리뷰) | 조사와 구현은 맡기고, 대조와 판단은 내가 한다 |
| 완결성 | make run 한 번으로 :8000 통합 서빙, 배포 없음 | 프록시(/proxy/8000/)로 확인, 스크린샷이 피날레 |
1. Dashboard (메인 화면)
| 기능 | 설명 |
|---|---|
| 마켓 스트립 | 지수 5종(S&P 500, NASDAQ, DOW, KOSPI, KOSDAQ)과 경제지표(WTI, Gold, 환율, 금리, Bitcoin 등)를 화면 상단에 고정 |
| 종목 테이블 | US/KR 탭, Symbol/Name/Price/Change/%/Volume, 상승 빨강/하락 파랑(한국 관례) |
| 자동 갱신 | react-query 45초 폴링, 장 마감 시간대는 백엔드가 600초 절전 |
| 화면 무드 | 원작의 터미널 UI: 다크 패널 그리드, 앰버 액센트, 고정폭 숫자 |
2. StockDetail (종목 상세)
| 기능 | 설명 |
|---|---|
| 가격 헤더 | 현재가, 등락률, 거래량 (StockHeader) |
| 캔들 차트 | lightweight-charts, 1W/1M/3M/6M/1Y/5Y 기간 탭 (PriceChart) |
| 수익률과 52주 | 기간 수익률(ReturnsRow) + 52주 범위 내 현재 위치(Week52Bar) |
| AI 종목 분석 | 버튼 → SSE 스트리밍, 기술적 분석/투자 포인트/리스크 요인 3절 (AIPanel) |
이 캡스톤을 마치면 다음 다섯 가지를 설명할 수 있고, 다시 만들 수 있습니다.
| 목표 | 검증되는 순간 |
|---|---|
| 조사, 구현, 리뷰를 서브에이전트에 나눠 맡기고 결과를 검증하는 법 | M1의 병렬 분석이 blueprint.md로 돌아오고, M2에서 리뷰 지적을 직접 확인해 처리할 때 |
| 업스트림 API를 캐시와 single-flight 뒤로 정리하는 백엔드 계약 설계 | M2에서 같은 curl 두 번, 두 번째가 즉시 도착할 때 |
| 폴링(react-query)과 스트리밍(SSE)을 구분해 쓰는 프런트 데이터 전략 | M3의 45초 폴링과 M4의 델타 누적이 다른 코드 경로로 공존할 때 |
| Bedrock 스트리밍(converse_stream)을 제품 기능으로 포장하는 법 | M4에서 phase 배지와 타자기 렌더가 동작할 때 |
| 짧은 의도 프롬프트와 superpowers Phase 리듬으로 풀스택을 조립하는 법 | M1의 계획이 M2~M4에서 두세 줄 지시만으로 소화될 때 |
이 캡스톤은 새 기술을 가르치지 않습니다. Ch1~6에서 배운 것을 실전 배치합니다.
| 챕터 | 이 캡스톤에서 재등장하는 곳 |
|---|---|
| Ch1 설치부터 Headless까지 | M0~전체: 세션 운용, 지시 → 실행 → 검증 루프, CLAUDE.md를 존중하는 습관 |
| Ch2 Subagents | M1~M4: Task 디스패치 3패턴이 그대로 나옵니다. 병렬 호출(M1 원작 분석), 명시적 호출(M2 code-reviewer), 자동 디스패치(M3 리뷰), 그리고 Phase를 태스크별 서브에이전트로 돌리는 subagent-driven-development |
| Ch3 Admin Setup | M0/M4: Bedrock 라우팅과 자격의 배경, Bearer 키가 조직 통제선 안에서 도는 이유 |
| Ch4 Settings, 훅과 스킬 | OPT: 하네스 성숙화, 훅과 스킬을 프로젝트 자산으로 승격하는 마무리 의식 |
| Ch5 CLI Reference | M1: --add-dir로 원작 폴더를 세션 범위에 추가. 확장 방향: 헤드리스 패턴으로 /api/health 스모크를 파이프라인화 |
| Ch6 Agent SDK | 확장 방향: 백엔드에 in-process 도구로 Claude를 심는 다음 단계의 방향 |
구현 청사진, 서브에이전트 결과와 대조하기
참고
원작 stock-monitoring(2026.09 기준)의 실코드에서 뽑은 정답지입니다. M1에서 서브에이전트가 돌려준
docs/blueprint.md를 이 표와 대조하고, 빠진 항목이 있으면 한 문장으로 보충을 지시하세요.
계획이 이상하게 흐를 때도 여기로 돌아옵니다.
[폴링 경로] 45초마다 (장 마감 시 600초)
Browser ── react-query ──> FastAPI ──> TTL Cache ──(miss, single-flight)──> yfinance (US + KR .KS/.KQ)
^ | |
+──── JSON 완결 응답 ──────+ (hit) 즉시 반환, 업스트림 무호출
[스트리밍 경로] 버튼 눌렀을 때만
Browser ── fetch(SSE) ──> FastAPI ── converse_stream ──> Bedrock (Sonnet 4.6)
^ |
+── phase → delta* → final + (한 글자씩, react-query를 쓰지 않는 유일한 경로)
Level 200의 핵심 구분입니다: 완결된 결과를 주기적으로 당기는 경로(폴링)와 부분 결과를 밀어 받는 경로(스트리밍)는 캐시 전략도, 프런트 도구도 다릅니다. 이 캡스톤은 둘을 한 앱에서 병용합니다.
| 화면 | 구성 컴포넌트 | 전환 |
|---|---|---|
| Dashboard (/) | MarketStrip(지수 + 지표 크롤), MarketPulse(상승/하락/보합 집계), SectorBars, StockTable(US/KR/★관심 탭), MacroPanel, NewsFeed, StatusBar | 종목 클릭 → StockDetail |
| StockDetail (/stocks/:symbol) | Watchlist 레일, StockHeader, PriceChart(캔들 + MA, 볼린저, RSI, MACD), ReturnsRow, Week52Bar, FundamentalCards, OrderBook, InvestorPanel, StockNews, AIPanel(자유 질문) | react-router, 뒤로 가기 복귀 |
| ArticleAnalysis (/articles) | 기사 URL 입력 + AI 분석 SSE 결과(react-markdown 렌더) | 뉴스 링크 또는 직접 입력으로 진입 |
워크샵 스코프는 핵심 구성만: MarketStrip + StockTable + StockHeader + PriceChart(캔들) + ReturnsRow + Week52Bar + AIPanel. 나머지는 퀄리티 강화 라운드의 카드로 남깁니다.
| 라우트 | 역할 |
|---|---|
| GET /api/health | 살아있음 확인, 소스별 상태(yahoo/rss/bedrock) |
| GET /api/market/overview | 지수 5종 + 경제지표 (마켓 스트립) |
| GET /api/market/quotes?market=us|kr | 시장별 종목 시세 일괄 |
| GET /api/stocks/{symbol} | 가격 헤더 + 기간 수익률 + 52주 범위, 유니버스 밖 심볼은 404 |
| GET /api/stocks/{symbol}/chart?period= | 캔들 OHLC. period는 1w|1m|3m|6m|1y|5y (1w 시간봉, 5y 주봉, 나머지 일봉), 기간별 TTL 캐시 |
| POST /api/ai/stocks/{symbol} | SSE 스트리밍 분석. 원작은 선택 본문 {"question"}으로 자유 질문을 받고, 기사 분석 POST /api/ai/articles도 제공 |
| 계약 | 내용 |
|---|---|
| 종목 유니버스 | 원작은 미국 100 + 한국 100(영문명, 한글명 name_ko, 섹터 포함). 워크샵은 config에 전부 두되 시장별 20개만 활성: 참가자 전원이 같은 IP에서 Yahoo를 부르므로 호출량을 줄인다 |
| 데이터 소스 | yfinance 하나. 한국 종목은 .KS/.KQ 접미사, 지수는 ^KS11/^KQ11. 개별 심볼 실패는 건너뛴다 |
| 응답 envelope | 모든 데이터 응답은 {"asOf", "marketOpen", "data"} 한 형태. 프런트는 asOf로 갱신 시각을 그린다 |
| 갱신 주기 | 주가 45초, 뉴스 120초, 장 마감 시간대 600초 절전 (market-hours-aware) |
| 캐시 | 원작은 L1 메모리 + L2 DynamoDB 계층형(TTL: 차트 1w 10분부터 1y/5y 24시간, 펀더멘털 12h, AI 6h, L2 24h) + single-flight 잠금 + 시세 캐시 가격 오버레이. 워크샵은 L1 메모리 + single-flight만 |
| AI 스트리밍 | 호출은 converse_stream 하나, SSE 이벤트 phase → delta* → final. final은 모든 경로에서 보낸다(스트림이 열린 뒤의 오류는 final 안의 {"error", "status"}로). 원작의 비용 방어는 IP당 분당 3회, 6시간 결과 캐시, 전역 동시 2 |
| 프런트 데이터 | react-query가 45초 폴링으로 화면을 살리되, AI 스트리밍만 fetch 직접: react-query는 "완결된 결과 하나"를 캐시하는 모델이라 델타 누적에 맞지 않는다(원작 주석) |
| 키의 거처 | Bedrock 인증은 boto3 기본 해석에 맡긴다 = AWS_BEARER_TOKEN_BEDROCK 환경변수를 그대로 인식. 자격 실패는 503으로 매핑, 앱은 정상 |
| UI 규칙 | 터미널 디자인 언어(원작 ADR-001): 패널 그리드, 앰버 액센트, 상승 빨강/하락 파랑/보합 본문색, 초록은 장 상태 점 전용, 색은 CSS 토큰으로만 |
| 선택 | 이유 |
|---|---|
| FastAPI | 라우트 = 계약, pydantic 응답 모델로 프론트가 그대로 그린다 |
| react-query | 폴링/캐시/로딩 상태를 선언형으로, 45초 갱신이 한 줄 |
| lightweight-charts | 금융 캔들 차트의 표준, 가볍고 기간 전환이 빠르다 |
| SSE | AI 응답을 한 글자씩, WebSocket보다 단순한 단방향 스트림 |
| make run | 프론트 빌드를 backend/static에 넣어 :8000 하나로 통합 서빙 |
사전 준비
10분Python과 Node 확인, 프로젝트 폴더, 원작 참고본, 그리고 Bearer 키(.env)까지 준비합니다. 키는 Phase 4의 AI 스트리밍에 필요합니다.
python3 --version && node --version # Python 3.11+, Node 20+
mkdir -p ~/capstone/capstone-2/.claude/agents && cd ~/capstone/capstone-2
git init -q 2>/dev/null; git config user.name "capstone"; git config user.email "capstone@lab.local"
[ -d ~/capstone/ref/stock-monitoring ] || git clone -q --depth 1 https://github.com/whchoi98/stock-monitoring ~/capstone/ref/stock-monitoring
ls ~/capstone/ref/stock-monitoring # backend docs frontend infra ...
~/capstone/ref/stock-monitoring은 M1에서 서브에이전트가 읽을 원작 참고본입니다.
프로젝트 폴더 밖에 두어 내 git 이력과 섞이지 않게 합니다. .claude/agents를 세션 시작 전에 만들어 두면
M1에서 만드는 서브에이전트를 세션 재시작 없이 인식합니다.
다른 캡스톤에서 이미 만들었다면 ~/capstone/.env가 있으니 1/2는 건너뛰세요.
mkdir -p ~/capstone
grep -q AWS_BEARER_TOKEN_BEDROCK ~/capstone/.env 2>/dev/null || cat >> ~/capstone/.env << 'ENVEOF'
AWS_BEARER_TOKEN_BEDROCK=<발급받은 Bedrock API 키>
ENVEOF
set -a; source ~/capstone/.env; set +a
aws bedrock-runtime converse \
--region ap-northeast-2 \
--model-id global.anthropic.claude-sonnet-4-6 \
--messages '[{"role":"user","content":[{"text":"ping"}]}]' \
--inference-config '{"maxTokens":30}' \
--query 'output.message.content[0].text' --output text
원작 분석과 설계
20분서브에이전트 두 개가 원작을 병렬로 읽어 청사진과 config를 돌려주면, 그것을 바탕으로 짧은 프롬프트 하나로 설계합니다.
이 미션의 바탕 학습: Ch2 Task 디스패치의 병렬 호출 패턴과 Capstone Setup의 superpowers 워크플로.
cd ~/capstone/capstone-2 && claude --add-dir ~/capstone/ref/stock-monitoring
--add-dir는 프로젝트 밖의 원작 폴더를 이 세션의 작업 범위에 넣습니다
(Reference 2). 서브에이전트가 원작 파일을 읽을 때마다 권한 확인이 뜨지 않습니다.
~/capstone/ref/stock-monitoring 에 원작 시황 대시보드가 있어. Explore 서브에이전트 두 개를 병렬로 띄워 조사해 줘.
- 하나는 구조, API 라우트, 화면 구성, 캐시와 AI 스트리밍 방식을 요약
- 하나는 backend/app/core/config.py에서 지수, 종목(미국 100, 한국 100, 한글명과 섹터 포함), 경제지표 상수를 추출
요약은 docs/blueprint.md로, 상수는 backend/app/core/config.py로 저장하고 커밋해 줘. 코드는 참고만 하고 옮기지 마.
두 서브에이전트는 백그라운드로 돕니다. 기다리는 동안 다음 입력으로 리뷰어를 미리 만들어 둡니다. 이 리뷰어는 M2~M4에서 계속 씁니다.
조사가 도는 동안 이 프로젝트에 code-reviewer 서브에이전트를 만들어 줘.
도구는 읽기 전용(Read, Grep, Glob, git diff)만 주고, 버그와 캐시 동시성 문제 중 확신이 높은 것만 보고하게. 만들고 커밋해 줘.
/tasks로 진행을 보고, 끝나면 메인이 결과를 합쳐 파일로 씁니다.
Explore는 읽기 전용이고 결론만 돌려줍니다. 원작 코드가 메인 컨텍스트에 통째로 실리지 않으니
"코드는 옮기지 않는다"는 규칙이 구조적으로 지켜집니다.
docs/blueprint.md가 위 구현 청사진의 라우트 6개, single-flight 캐시, SSE 이벤트 순서(phase, delta, final),
상승 빨강/하락 파랑 규칙을 담았는지 훑어보세요. 빠졌다면 "blueprint.md에 SSE 이벤트 순서가 없어, 원작에서 찾아 보충해 줘"처럼
한 문장으로 지시합니다.
/superpowers:brainstorming docs/blueprint.md를 바탕으로 원작을 135분 버전으로 줄인 "Market Desk on Web"을 설계하자.
범위는 대시보드, 종목 상세(캔들 차트), AI 분석 스트리밍까지. 화면은 원작의 터미널 UI를 따르고 종목은 시장별 20개만 켜.
배포와 테스트는 생략하고 curl과 브라우저로 검증한다. 결정이 필요하면 최소한으로만 물어봐.
auto mode on을 선언해 두면 superpowers가
brainstorming → writing-plans → 실행의 단계 전환과 승인 대기를 자동으로 이어 갑니다.
시간이 빠듯할 때 유용합니다. 단계마다 직접 검토하려면 기본(수동)을 유지하고, 되돌리려면
auto mode off입니다.
브레인스토밍이 끝나면 아래 한 줄로 계획을 만들고 Phase 4개 구성을 승인하세요. 계획 끝에 실행 방식을 묻는 질문이 나오면 Subagent-Driven을 고릅니다. 태스크마다 새 서브에이전트가 구현하고, 태스크 사이에 리뷰가 붙는 방식입니다.
/superpowers:writing-plans Phase 4개로 나눠 줘: 백엔드 코어, 대시보드, 종목 상세, AI 스트리밍과 통합 서빙.
https://github.com/whchoi98/stock-monitoring을 주고 웹에서 읽게 합니다
③ 서브에이전트가 원작 코드를 길게 붙여 오면 "결론과 표만 남겨 줘"라고 줄이게 하세요.
Phase 1, 백엔드 코어
30분FastAPI가 overview / quotes / 종목 상세 / 차트를 캐시 뒤에서 돌려주면 이 Phase는 끝입니다. 구현은 서브에이전트가, 리뷰는 M1에서 만든 code-reviewer가 맡습니다.
이 미션의 바탕 학습: Ch1의 지시 → 실행 → 검증 루프, Ch2의 명시적 호출 패턴.
/superpowers:subagent-driven-development 계획의 Phase 1만 진행하고 멈춰줘. 끝나면 uvicorn 실행과 curl 검증 방법을 알려줘.
cd backend && .venv/bin/uvicorn app.main:app --port 8000 &
sleep 3
curl -s localhost:8000/api/market/overview | head -c 300; echo
time (curl -s "localhost:8000/api/market/quotes?market=kr" | head -c 200; echo)
time (curl -s "localhost:8000/api/market/quotes?market=kr" | head -c 200; echo) # 두 번째는 캐시로 즉시
curl -s "localhost:8000/api/stocks/AAPL/chart?period=1m" | head -c 200; echo
라우트 모양이 이 명령과 조금 다르게 설계됐다면 Claude가 알려 준 검증 명령을 쓰세요. 중요한 것은 두 번째 quotes 호출이 즉시 오는지입니다.
code-reviewer 서브에이전트로 캐시 모듈을 리뷰해 줘. 지적마다 맞는지 직접 확인하고, 확인된 것만 고쳐서 커밋해.
막힐 때 열어보기, single-flight 캐시 핵심 힌트
import time, threading
_store, _locks = {}, {}
def get_or_fetch(key: str, ttl: int, fetch):
now = time.time()
hit = _store.get(key)
if hit and now - hit[0] < ttl:
return hit[1]
lock = _locks.setdefault(key, threading.Lock())
with lock: # 같은 키 동시 요청은 한 번만
hit = _store.get(key)
if hit and time.time() - hit[0] < ttl:
return hit[1]
val = fetch()
_store[key] = (time.time(), val)
return val
Phase 2 + 3, 대시보드와 상세
45분React 대시보드가 45초마다 숨 쉬고, 종목을 클릭하면 캔들 차트가 있는 상세 화면이 열립니다.
이 미션의 바탕 학습: Ch2의 자동 디스패치 패턴. 이번에는 리뷰어 이름을 부르지 않아도 메인이 description을 보고 code-reviewer를 고릅니다.
/superpowers:subagent-driven-development Phase 2(대시보드)를 진행하고 멈춰줘. 끝나면 dev 서버 실행 방법을 알려줘.
cd frontend && npm run dev # 브라우저에서 /proxy/5173/
/superpowers:subagent-driven-development Phase 3(종목 상세)를 진행하고 멈춰줘.
지금까지의 프런트 변경 사항을 리뷰해 줘
화면이 원작과 다르게 느껴지면 스펙을 새로 쓰지 말고 원작을 다시 읽게 하세요. 서브에이전트가 원작의 규칙을 찾아오고, 메인은 우리 구조에 맞춰 반영합니다.
종목 테이블이 원작보다 밋밋해. Explore 서브에이전트로 원작 StockTable과 tokens.css를 확인하고, 우리 테이블을 그 규칙에 맞춰 줘.
Phase 4, AI 스트리밍과 통합 서빙
30분분석 버튼을 누르면 Bedrock의 답이 한 글자씩 흘러드는 것, 이 캡스톤의 하이라이트입니다.
이 미션의 바탕 학습: Ch3에서 본 Bedrock 라우팅과 자격의 배경, 그 위에서 도는 스트리밍 계약.
/superpowers:subagent-driven-development Phase 4(AI 스트리밍과 통합 서빙)를 진행해 줘. 키는 환경변수 AWS_BEARER_TOKEN_BEDROCK을 쓰고, 키가 없으면 AI 패널만 꺼지게.
set -a; source ~/capstone/.env; set +a # Bearer 키 로드
make run # 프론트 빌드 → :8000 통합 서빙, 브라우저에서 /proxy/8000/
code-reviewer로 이번 작업 전체를 마지막으로 리뷰해 줘. 확인된 문제만 고치고 make run으로 다시 띄운 뒤 커밋해.
curl -N -X POST localhost:8000/api/ai/stocks/AAPL.
event: phase 한 줄, 이어서 event: delta와
data: {"text": "..."}가 반복되다가 event: final로 닫힙니다.
프런트의 타자기는 이 delta들을 이어 붙인 것뿐입니다, 마법이 아니라 계약입니다.
X-Accel-Buffering: no 헤더와 미디어타입 text/event-stream을 확인하세요.
대시보드 → 종목 상세 → 분석 스트리밍까지 한 바퀴 돌리고, 흐르는 화면의 스크린샷을 Slack에 공유하세요. 그게 배포입니다. 원작은 여기에 계층형 캐시(DynamoDB L2)와 ECS Fargate 배포까지 얹혀 운영 중입니다, 다음 단계가 궁금하다면 그 방향입니다. 그리고 Ch5의 헤드리스 패턴으로 /api/health 스모크를 파이프라인화하면 운영의 첫 발입니다.
데스크 퀄리티 강화 라운드, 기능을 올려라
+α 자유핵심 구성이 돌았다면 이제 데스크를 내 것으로 만드는 시간입니다. 강화 카드는 모두 원작에 실제로 있는 기능입니다. 요령은 M1과 같습니다: 원작 구현은 서브에이전트가 읽고, 참가자는 기능 이름과 조건 한 줄만 말합니다. 한 번에 하나, 화면으로 확인하고, 마음에 들면 커밋.
원작의 [기능 이름]이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. [지킬 조건 한 줄]
원작의 종목 검색(SymbolSearch, ⌘K)이 한글명과 초성을 어떻게 맞추는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. "ㅅㅅㅈㅈ"로 삼성전자가 나와야 해.
원작의 관심 종목 ★과 가격 알림이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 사용자 상태는 원작처럼 브라우저 localStorage에만 둬.
원작 PriceChart의 MA5/MA20, 볼린저 밴드, RSI, MACD가 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 보조 패널은 크로스헤어를 공유하게.
원작 AIPanel의 자유 질문이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 질문은 1~200자, 프롬프트 안에서 구분자로 격리해.
원작의 호가창(OrderBook)과 투자자 동향(InvestorPanel)이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 시뮬레이션 데이터는 응답에 "simulated": true를 붙여.
원작의 종목 뉴스(StockNews)와 기사 분석(ArticleAnalysis)이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 기사 본문 조회에는 원작의 SSRF 가드를 꼭 넣어.
여기부터는 정해진 카드가 없습니다. 당신이 프로덕트 오너입니다. 원작에 있는 기능(섹터 등락 바, 라이트 테마, 설치형 PWA)은 위의 이식 틀로, 원작에 없는 기능(지표 스파크라인, 등락률 순위 하이라이트 등)은 아래처럼 brainstorming으로 시작하세요.
/superpowers:brainstorming 내 데스크에 [내가 원하는 기능]을 추가하고 싶어.
기존 캐시, 폴링, 스트리밍 계약은 깨지 않는 선에서 설계하고, 결정은 최소한으로만 물어봐.
make run으로 통합 서빙을 다시 굳혀 Slack의 스크린샷을 최신으로.
바이브 코딩 라운드, 원작을 향해
+α 자유Phase 빌드가 끝났다면 이제 바이브 코딩입니다: 완성 화면의 묘사를 주고 "이렇게 나오게 해줘"를 반복하는 루프. 아래 세 장면은 원작이 실제로 도달한 터미널 화면을 글로 옮긴 것입니다. 내 화면과 다른 점을 찾아 하나씩 주문하세요.
- 상단 sticky 마켓 스트립: 지수 5종과 지표가 한 줄로 흐르고, 등락은 상승 빨강 ▲ / 하락 파랑 ▼
- 패널 그리드: 위젯마다 1px 테두리와 6px 라운드 패널, 헤더는 대문자 영문 eyebrow + 한국어 제목
- 종목 테이블: US/KR 탭, 숫자와 심볼은 고정폭 서체로 우측 정렬, 행 호버 하이라이트, 선택은 앰버
- 하단 상태 바: 장 상태 점(초록은 상태 전용), 폴링 주기, KST 시계
- StockHeader: 심볼과 이름, 현재가 크게, 등락은 색 + ▲▼, 거래량은 축약(1.2M)
- 캔들 차트: 기간 탭(1W/1M/3M/6M/1Y/5Y) 중 활성 탭은 앰버, 상승 빨강/하락 파랑 캔들, 크로스헤어
- ReturnsRow: 기간 수익률이 한 줄에, 양수 빨강/음수 파랑
- Week52Bar: 52주 저가~고가 바 위에 현재가 마커
- 확장 후보(원작에 있는 것): 워치리스트 레일, 호가창 OrderBook, 투자자 동향 InvestorPanel, 종목 뉴스 StockNews,
기사 AI 분석 ArticleAnalysis - 끌리는 것 하나를 강화 카드의 이식 틀로 추가
- 분석 버튼(앰버)을 누르면 phase 배지가 fetching → analyzing 으로 바뀌고
- 본문은 delta가 도착하는 대로 타자기처럼 자라며, 마크다운(## 절, 굵은 키워드)이 살아 있다
- 스트리밍 중 다시 누르면 진행 중인 요청을 취소하고 새로 시작
- 키가 없을 때는 "AI 분석 비활성" 안내만 조용히
하네스 엔지니어링, 작품을 성숙시키고 등급을 받다
+15분 옵션지금까지 만든 것은 결과물입니다. 이 옵션은 그 결과물을 만든 작업 환경, 즉 하네스 (CLAUDE.md, hooks, skills, commands, agents)를 표준 구조로 성숙시키고(project-init), 그 품질을 6개 차원(정확성, 안전성, 완전성, 실행 가능성, 일관성, 검증 가능성)에서 채점받는(harness-eval) 단계입니다. superpowers의 3단(brainstorm, writing-plans, executing-plans) 뒤에 4단 성숙화와 5단 평가를 붙이는 셈입니다. 캡스톤 공통의 마무리 의식입니다.
이 미션의 바탕 학습: Ch4의 훅과 스킬을 팀 자산으로 승격하는 감각, 그리고 Reference 3의 플러그인 생태계.
claude plugin marketplace add https://github.com/whchoi98/project-init
claude plugin install project-init@project-init
claude plugin marketplace add https://github.com/whchoi98/harness-eval
claude plugin install harness-eval@harness-eval
claude plugin list
설치 후 새 Claude 세션을 시작하세요, superpowers 때와 같은 규칙입니다.
/project-init:init-project .
이 프로젝트의 하네스는 아직 얇습니다(FastAPI 앱과 React 앱 하나씩). 기존 프로젝트 감지 모드가 있는 것은 보존하고, 없는 것(문서 스캐폴딩, 시크릿 스캔 훅, /review 커맨드, 테스트 골격 등)만 채웁니다. CLAUDE.md가 이미 있으면 덮어쓰기 전에 물어봅니다. 끝나면 이어서:
/project-init:sync-docs
## Sync Report
### Quality Scores (Before -> After)
| ./CLAUDE.md | D (48) | B (82) | +34 |
| ./backend/CLAUDE.md | F (10) | C (61) | +51 |
### Changes Made
- Files created: 4 / Files updated: 2 / Runbooks missing: 1
/harness-eval:quick
{"mode": "quick", "scores": {"overall": 7.0, "grade": "B"}, "checklist": {"pass": 12, "warn": 3, "fail": 1}}
이 캡스톤의 비자명한 지식은 스트리밍 계약입니다. "왜 AI만 fetch를 직접 쓰는가, 왜 장 마감엔 600초로 늦추는가"를 CLAUDE.md의 패턴으로 기록해 두면 sync-docs 점수가 오르고, 다음에 이 저장소를 여는 Claude가 같은 원칙으로 확장합니다. 여유가 있다면 결정을 기록으로 남기세요:
/add-adr streaming-ai-contract
/add-runbook market-web-run
미션 종료
시세는 캐시 뒤에, 키는 서버에, AI는 스트림으로. 웹 시황 데스크의 문법입니다.
| 가져가는 것 | 내용 |
|---|---|
| 캐시가 곧 예의 | 업스트림은 캐시 뒤에서 한 번만, single-flight로 동시 요청도 한 번만 |
| 스트리밍 계약 | phase → delta → final, 그리고 "점진 델타에는 react-query가 아니라 fetch"라는 도구 선택의 근거 |
| 절전 설계 | 장이 닫히면 600초로 늦춘다, 시스템은 세상의 리듬을 알아야 한다 |
| 위임과 검증 | 조사와 구현은 서브에이전트에게, 대조와 판단은 내가. 리뷰어의 지적도 직접 확인한 뒤에 고친다 |
실제 결과 샘플
이 미션을 완주하면 나오는 결과물을 실제 배포 URL로 확인할 수 있습니다. 시작 전에 목표 화면을 먼저 보거나, 완주 후 내 결과와 비교해 보세요.
| 미션 | 결과물 | 샘플 URL |
|---|---|---|
| Capstone 1, Press Start | Clawd Jump, 에이전틱 게임 | clawd-game.whchoi.net |
| Capstone 2, Market Desk (이 미션) | 웹 시황 대시보드 | stock-monitoring.whchoi.net |
| Capstone 3, Generative Hours | 코드로 그린 미디어 아트 전시 | zerojin.art |
| Capstone 4, Trend Radar | 유튜브 급상승 30 트렌드 레이더 | youtube-trend.whchoi.net |
| Capstone 5, Quake Watch | 실시간 지진 워치 | quake-watch.whchoi.net |
| Capstone 6, Newsroom Lens | 4개 매체 관점 비교 | newslens.whchoi.net |
READING CHECK
이 페이지를 읽으셨나요?
읽음 표시는 실습 체크포인트와 별도로 관리됩니다. 아직 읽지 않음