ZIP
CAPSTONE 2 / MARKET DESK ON WEB / 135 MIN

웹 시황 대시보드

FastAPI + React + Bedrock SSE, 서브에이전트와 함께 짓는 시황 데스크

시세와 차트가 브라우저에 흐르고, AI 분석이 타자기처럼 스트리밍되는 웹 시황 데스크를 빈 폴더에서 빌드합니다. 이번에는 긴 스펙을 쓰지 않습니다. 원작 stock-monitoring은 서브에이전트가 읽고, 참가자는 미션마다 두세 줄짜리 짧은 프롬프트로 지휘하며 결과를 확인합니다. 배포 없이 로컬에서 끝나고, 다른 참가자와의 의존성도 없습니다.

소요 시간 135분 미션 5개 + DoD 산출물 브라우저에서 뛰는 내 시황 데스크 Update 2026.11
MISSION BRIEFING

목표물과 기조

숙지

다른 캡스톤처럼 빈 폴더에서 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 직접
AIBedrock 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)
L학습 목표, Level 200

이 캡스톤을 마치면 다음 다섯 가지를 설명할 수 있고, 다시 만들 수 있습니다.

목표검증되는 순간
조사, 구현, 리뷰를 서브에이전트에 나눠 맡기고 결과를 검증하는 법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에서 두세 줄 지시만으로 소화될 때
R챕터 연결 지도, 배운 내용이 재등장하는 곳

이 캡스톤은 새 기술을 가르치지 않습니다. Ch1~6에서 배운 것을 실전 배치합니다.

챕터이 캡스톤에서 재등장하는 곳
Ch1 설치부터 Headless까지M0~전체: 세션 운용, 지시 → 실행 → 검증 루프, CLAUDE.md를 존중하는 습관
Ch2 SubagentsM1~M4: Task 디스패치 3패턴이 그대로 나옵니다. 병렬 호출(M1 원작 분석), 명시적 호출(M2 code-reviewer), 자동 디스패치(M3 리뷰), 그리고 Phase를 태스크별 서브에이전트로 돌리는 subagent-driven-development
Ch3 Admin SetupM0/M4: Bedrock 라우팅과 자격의 배경, Bearer 키가 조직 통제선 안에서 도는 이유
Ch4 Settings, 훅과 스킬OPT: 하네스 성숙화, 훅과 스킬을 프로젝트 자산으로 승격하는 마무리 의식
Ch5 CLI ReferenceM1: --add-dir로 원작 폴더를 세션 범위에 추가. 확장 방향: 헤드리스 패턴으로 /api/health 스모크를 파이프라인화
Ch6 Agent SDK확장 방향: 백엔드에 in-process 도구로 Claude를 심는 다음 단계의 방향
규칙, 캡스톤 공통 ① 코드와 파일 구성을 직접 하지 않고, Claude에게 지시해서 만듭니다 ② 각 Phase의 DoD를 통과해야 다음으로 ③ 원작은 참고본입니다. config의 종목 데이터는 옮겨 써도 되지만 코드는 Claude가 새로 작성합니다 ④ 막히면 "막힐 때 열어보기"의 힌트를 씁니다. 다른 참가자와의 의존성은 없습니다.
이번 캡스톤의 프롬프트 원칙 프롬프트에는 무엇을 원하는지만 짧게 씁니다. 어떻게 만들지는 원작을 읽은 서브에이전트와 brainstorming이 채웁니다. 결과가 기대와 다르면 스펙을 늘리지 말고 다른 점을 한 문장으로 말하세요. 예: "상승이 초록으로 보여, 원작처럼 빨강으로 바꿔 줘".
BLUEPRINT

구현 청사진, 서브에이전트 결과와 대조하기

참고

원작 stock-monitoring(2026.09 기준)의 실코드에서 뽑은 정답지입니다. M1에서 서브에이전트가 돌려준 docs/blueprint.md를 이 표와 대조하고, 빠진 항목이 있으면 한 문장으로 보충을 지시하세요. 계획이 이상하게 흐를 때도 여기로 돌아옵니다.

0요청 흐름 한 눈에
두 개의 데이터 경로, 폴링과 스트리밍
[폴링 경로]  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의 핵심 구분입니다: 완결된 결과를 주기적으로 당기는 경로(폴링)와 부분 결과를 밀어 받는 경로(스트리밍)는 캐시 전략도, 프런트 도구도 다릅니다. 이 캡스톤은 둘을 한 앱에서 병용합니다.

1화면과 컴포넌트 지도 (원작 실물)
화면구성 컴포넌트전환
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. 나머지는 퀄리티 강화 라운드의 카드로 남깁니다.

2API 계약 (원작 라우트 실측)
라우트역할
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도 제공
3데이터와 운영 계약
계약내용
종목 유니버스원작은 미국 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 토큰으로만
4기술 선택 5
선택이유
FastAPI라우트 = 계약, pydantic 응답 모델로 프론트가 그대로 그린다
react-query폴링/캐시/로딩 상태를 선언형으로, 45초 갱신이 한 줄
lightweight-charts금융 캔들 차트의 표준, 가볍고 기간 전환이 빠르다
SSEAI 응답을 한 글자씩, WebSocket보다 단순한 단방향 스트림
make run프론트 빌드를 backend/static에 넣어 :8000 하나로 통합 서빙
MISSION 00

사전 준비

10분

Python과 Node 확인, 프로젝트 폴더, 원작 참고본, 그리고 Bearer 키(.env)까지 준비합니다. 키는 Phase 4의 AI 스트리밍에 필요합니다.

Terminal, 전체 복사
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는 건너뛰세요.

Terminal 1/2, .env에 Bearer 토큰 저장
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
Terminal 2/2, 로드 + Converse 스모크
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
CHECKPOINT
MISSION 01

원작 분석과 설계

20분

서브에이전트 두 개가 원작을 병렬로 읽어 청사진과 config를 돌려주면, 그것을 바탕으로 짧은 프롬프트 하나로 설계합니다.

이 미션의 바탕 학습: Ch2 Task 디스패치의 병렬 호출 패턴과 Capstone Setup의 superpowers 워크플로.

Terminal (~/capstone/capstone-2)
cd ~/capstone/capstone-2 && claude --add-dir ~/capstone/ref/stock-monitoring

--add-dir는 프로젝트 밖의 원작 폴더를 이 세션의 작업 범위에 넣습니다 (Reference 2). 서브에이전트가 원작 파일을 읽을 때마다 권한 확인이 뜨지 않습니다.

Claude 세션 입력 1/4, 원작 병렬 분석
~/capstone/ref/stock-monitoring 에 원작 시황 대시보드가 있어. Explore 서브에이전트 두 개를 병렬로 띄워 조사해 줘.
- 하나는 구조, API 라우트, 화면 구성, 캐시와 AI 스트리밍 방식을 요약
- 하나는 backend/app/core/config.py에서 지수, 종목(미국 100, 한국 100, 한글명과 섹터 포함), 경제지표 상수를 추출
요약은 docs/blueprint.md로, 상수는 backend/app/core/config.py로 저장하고 커밋해 줘. 코드는 참고만 하고 옮기지 마.

두 서브에이전트는 백그라운드로 돕니다. 기다리는 동안 다음 입력으로 리뷰어를 미리 만들어 둡니다. 이 리뷰어는 M2~M4에서 계속 씁니다.

Claude 세션 입력 2/4, 기다리는 동안 리뷰어 만들기
조사가 도는 동안 이 프로젝트에 code-reviewer 서브에이전트를 만들어 줘.
도구는 읽기 전용(Read, Grep, Glob, git diff)만 주고, 버그와 캐시 동시성 문제 중 확신이 높은 것만 보고하게. 만들고 커밋해 줘.
관찰 포인트, 병렬 호출 두 서브에이전트가 프롬프트 아래 패널에 나란히 뜹니다. /tasks로 진행을 보고, 끝나면 메인이 결과를 합쳐 파일로 씁니다. Explore는 읽기 전용이고 결론만 돌려줍니다. 원작 코드가 메인 컨텍스트에 통째로 실리지 않으니 "코드는 옮기지 않는다"는 규칙이 구조적으로 지켜집니다.
대조 포인트, blueprint.md docs/blueprint.md가 위 구현 청사진의 라우트 6개, single-flight 캐시, SSE 이벤트 순서(phase, delta, final), 상승 빨강/하락 파랑 규칙을 담았는지 훑어보세요. 빠졌다면 "blueprint.md에 SSE 이벤트 순서가 없어, 원작에서 찾아 보충해 줘"처럼 한 문장으로 지시합니다.
Claude 세션 입력 3/4, 설계
/superpowers:brainstorming docs/blueprint.md를 바탕으로 원작을 135분 버전으로 줄인 "Market Desk on Web"을 설계하자.
범위는 대시보드, 종목 상세(캔들 차트), AI 분석 스트리밍까지. 화면은 원작의 터미널 UI를 따르고 종목은 시장별 20개만 켜.
배포와 테스트는 생략하고 curl과 브라우저로 검증한다. 결정이 필요하면 최소한으로만 물어봐.
자동화 옵션, auto mode 세션에 auto mode on을 선언해 두면 superpowers가 brainstorming → writing-plans → 실행의 단계 전환과 승인 대기를 자동으로 이어 갑니다. 시간이 빠듯할 때 유용합니다. 단계마다 직접 검토하려면 기본(수동)을 유지하고, 되돌리려면 auto mode off입니다.

브레인스토밍이 끝나면 아래 한 줄로 계획을 만들고 Phase 4개 구성을 승인하세요. 계획 끝에 실행 방식을 묻는 질문이 나오면 Subagent-Driven을 고릅니다. 태스크마다 새 서브에이전트가 구현하고, 태스크 사이에 리뷰가 붙는 방식입니다.

Claude 세션 입력 4/4, 계획
/superpowers:writing-plans Phase 4개로 나눠 줘: 백엔드 코어, 대시보드, 종목 상세, AI 스트리밍과 통합 서빙.
원작이 안 읽힌다면 ① clone이 실패했다면 M0의 clone 줄을 다시 실행하세요 ② GitHub clone이 막힌 환경이라면 입력 1/4의 경로 대신 https://github.com/whchoi98/stock-monitoring을 주고 웹에서 읽게 합니다 ③ 서브에이전트가 원작 코드를 길게 붙여 오면 "결론과 표만 남겨 줘"라고 줄이게 하세요.
CHECKPOINT
MISSION 02

Phase 1, 백엔드 코어

30분

FastAPI가 overview / quotes / 종목 상세 / 차트를 캐시 뒤에서 돌려주면 이 Phase는 끝입니다. 구현은 서브에이전트가, 리뷰는 M1에서 만든 code-reviewer가 맡습니다.

이 미션의 바탕 학습: Ch1의 지시 → 실행 → 검증 루프, Ch2의 명시적 호출 패턴.

Claude 세션 입력 1/2, 구현
/superpowers:subagent-driven-development 계획의 Phase 1만 진행하고 멈춰줘. 끝나면 uvicorn 실행과 curl 검증 방법을 알려줘.
관찰 포인트, 태스크마다 새 서브에이전트 subagent-driven-development는 계획의 태스크마다 새 서브에이전트를 띄워 구현하고, 스펙 준수와 코드 품질을 리뷰한 뒤 다음 태스크로 넘어갑니다. 메인 세션은 지휘와 기록만 하므로 Phase가 길어져도 컨텍스트가 덜 찹니다. 중간에 "계속할까요?"를 묻지 않고 지정한 Phase 끝까지 이어 가는 것이 정상 동작입니다.
Terminal, 실행과 스모크
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 호출이 즉시 오는지입니다.

Claude 세션 입력 2/2, 리뷰
code-reviewer 서브에이전트로 캐시 모듈을 리뷰해 줘. 지적마다 맞는지 직접 확인하고, 확인된 것만 고쳐서 커밋해.
개념 짚기 (Level 200), 캐시와 single-flight TTL 캐시는 "45초 안에는 같은 답을 다시 묻지 않는다"는 약속이고, single-flight는 "같은 질문이 동시에 40개 와도 업스트림엔 한 번만 간다"는 잠금입니다. 워크샵장에서 전원이 동시에 새로고침해도 yfinance가 평온한 이유가 이 두 줄에 있습니다. 원작은 여기에 DynamoDB L2를 얹어 컨테이너가 재시작돼도 캐시가 살아남게 합니다.
리뷰 결과를 그대로 믿지 않기 리뷰어의 지적도 서브에이전트의 주장입니다. Ch2에서 본 것처럼 메인이 코드와 실행 결과로 다시 확인한 뒤에만 고칩니다. quotes가 비거나 429가 오면 전원이 같은 IP에서 Yahoo를 부르는 탓일 수 있습니다. 활성 종목을 더 줄이고 TTL을 지키세요.
막힐 때 열어보기, single-flight 캐시 핵심 힌트
cache.py 골격 (참고 조각)
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
DEFINITION OF DONE
MISSION 03

Phase 2 + 3, 대시보드와 상세

45분

React 대시보드가 45초마다 숨 쉬고, 종목을 클릭하면 캔들 차트가 있는 상세 화면이 열립니다.

이 미션의 바탕 학습: Ch2의 자동 디스패치 패턴. 이번에는 리뷰어 이름을 부르지 않아도 메인이 description을 보고 code-reviewer를 고릅니다.

Claude 세션 입력, Phase 2
/superpowers:subagent-driven-development Phase 2(대시보드)를 진행하고 멈춰줘. 끝나면 dev 서버 실행 방법을 알려줘.
Terminal, 미리보기
cd frontend && npm run dev   # 브라우저에서 /proxy/5173/
Claude 세션 입력, Phase 3
/superpowers:subagent-driven-development Phase 3(종목 상세)를 진행하고 멈춰줘.
Claude 세션 입력, 자동 디스패치 리뷰
지금까지의 프런트 변경 사항을 리뷰해 줘

화면이 원작과 다르게 느껴지면 스펙을 새로 쓰지 말고 원작을 다시 읽게 하세요. 서브에이전트가 원작의 규칙을 찾아오고, 메인은 우리 구조에 맞춰 반영합니다.

Claude 세션 입력, 화면이 원작과 다를 때 (예시)
종목 테이블이 원작보다 밋밋해. Explore 서브에이전트로 원작 StockTable과 tokens.css를 확인하고, 우리 테이블을 그 규칙에 맞춰 줘.
개념 짚기 (Level 200), 폴링 vs 스트리밍 폴링(react-query refetchInterval)은 완결된 스냅샷을 주기적으로 당깁니다, 시세처럼 "최신 한 장"이면 충분할 때. SSE는 서버가 부분 결과를 밀어 줍니다, AI 답변처럼 "생성되는 과정"이 가치일 때. WebSocket은 양방향이 필요할 때만 꺼내는 무거운 도구입니다. 이 앱이 폴링과 SSE를 병용하고 WebSocket을 쓰지 않는 것 자체가 하나의 설계 결정입니다.
이 미션의 함정 네 가지 ① 프론트에서 API가 404 = dev 프록시 미설정, vite.config의 proxy로 /api를 :8000에 물리세요. ② 차트가 빈 화면 = OHLC 시간 포맷 불일치, lightweight-charts는 time을 유닉스 초 또는 "YYYY-MM-DD"로 받습니다. ③ KR 종목이 0원 = 장 마감 시간대의 정상 동작, 백엔드도 600초 절전 주기로 도는 중입니다. ④ 상승이 초록으로 보임 = 서구 관례가 섞인 것, "원작처럼 상승 빨강, 하락 파랑으로"라고 한 문장이면 됩니다.
DEFINITION OF DONE
MISSION 04

Phase 4, AI 스트리밍과 통합 서빙

30분

분석 버튼을 누르면 Bedrock의 답이 한 글자씩 흘러드는 것, 이 캡스톤의 하이라이트입니다.

이 미션의 바탕 학습: Ch3에서 본 Bedrock 라우팅과 자격의 배경, 그 위에서 도는 스트리밍 계약.

Claude 세션 입력 1/2, 구현
/superpowers:subagent-driven-development Phase 4(AI 스트리밍과 통합 서빙)를 진행해 줘. 키는 환경변수 AWS_BEARER_TOKEN_BEDROCK을 쓰고, 키가 없으면 AI 패널만 꺼지게.
Terminal, 키 로드 후 통합 실행
set -a; source ~/capstone/.env; set +a   # Bearer 키 로드
make run    # 프론트 빌드 → :8000 통합 서빙, 브라우저에서 /proxy/8000/
Claude 세션 입력 2/2, 최종 리뷰
code-reviewer로 이번 작업 전체를 마지막으로 리뷰해 줘. 확인된 문제만 고치고 make run으로 다시 띄운 뒤 커밋해.
개념 짚기 (Level 200), SSE 와이어 포맷 스트리밍이 도는지 눈으로 확인하고 싶다면 curl로 원문을 보세요: curl -N -X POST localhost:8000/api/ai/stocks/AAPL. event: phase 한 줄, 이어서 event: delta와 data: {"text": "..."}가 반복되다가 event: final로 닫힙니다. 프런트의 타자기는 이 delta들을 이어 붙인 것뿐입니다, 마법이 아니라 계약입니다.
스트리밍이 침묵하거나 인증 에러라면 ① uvicorn을 띄운 셸에 키가 로드됐는지(위 로드 라인 후 재실행) ② 503이 즉시 오면 키 미로드/오탈자, UnrecognizedClient는 만료 ③ 델타가 한 번에 몰려서 오면 프록시 버퍼링, SSE 응답에 X-Accel-Buffering: no 헤더와 미디어타입 text/event-stream을 확인하세요.

대시보드 → 종목 상세 → 분석 스트리밍까지 한 바퀴 돌리고, 흐르는 화면의 스크린샷을 Slack에 공유하세요. 그게 배포입니다. 원작은 여기에 계층형 캐시(DynamoDB L2)와 ECS Fargate 배포까지 얹혀 운영 중입니다, 다음 단계가 궁금하다면 그 방향입니다. 그리고 Ch5의 헤드리스 패턴으로 /api/health 스모크를 파이프라인화하면 운영의 첫 발입니다.

DEFINITION OF DONE
BONUS

데스크 퀄리티 강화 라운드, 기능을 올려라

+α 자유

핵심 구성이 돌았다면 이제 데스크를 내 것으로 만드는 시간입니다. 강화 카드는 모두 원작에 실제로 있는 기능입니다. 요령은 M1과 같습니다: 원작 구현은 서브에이전트가 읽고, 참가자는 기능 이름과 조건 한 줄만 말합니다. 한 번에 하나, 화면으로 확인하고, 마음에 들면 커밋.

0이식 프롬프트 틀
Claude 세션 입력, 빈칸만 바꿔 쓰기
원작의 [기능 이름]이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. [지킬 조건 한 줄]
A강화 카드 1, 한글 초성 검색
Claude 세션 입력
원작의 종목 검색(SymbolSearch, ⌘K)이 한글명과 초성을 어떻게 맞추는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. "ㅅㅅㅈㅈ"로 삼성전자가 나와야 해.
B강화 카드 2, 관심 종목과 가격 알림
Claude 세션 입력
원작의 관심 종목 ★과 가격 알림이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 사용자 상태는 원작처럼 브라우저 localStorage에만 둬.
C강화 카드 3, 차트 보조지표
Claude 세션 입력
원작 PriceChart의 MA5/MA20, 볼린저 밴드, RSI, MACD가 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 보조 패널은 크로스헤어를 공유하게.
D강화 카드 4, AI 자유 질문
Claude 세션 입력
원작 AIPanel의 자유 질문이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 질문은 1~200자, 프롬프트 안에서 구분자로 격리해.
E강화 카드 5, 호가창과 투자자 동향
Claude 세션 입력
원작의 호가창(OrderBook)과 투자자 동향(InvestorPanel)이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 시뮬레이션 데이터는 응답에 "simulated": true를 붙여.
F강화 카드 6, 종목 뉴스와 기사 분석
Claude 세션 입력
원작의 종목 뉴스(StockNews)와 기사 분석(ArticleAnalysis)이 어떻게 구현됐는지 Explore 서브에이전트로 확인해 줘.
우리 구조에 맞게 줄인 계획을 먼저 보여 주고, 승인하면 구현해. 기사 본문 조회에는 원작의 SSRF 가드를 꼭 넣어.
G강화 카드 7, 나만의 데스크로

여기부터는 정해진 카드가 없습니다. 당신이 프로덕트 오너입니다. 원작에 있는 기능(섹터 등락 바, 라이트 테마, 설치형 PWA)은 위의 이식 틀로, 원작에 없는 기능(지표 스파크라인, 등락률 순위 하이라이트 등)은 아래처럼 brainstorming으로 시작하세요.

Claude 세션 입력, 빈칸을 내 아이디어로
/superpowers:brainstorming 내 데스크에 [내가 원하는 기능]을 추가하고 싶어.
기존 캐시, 폴링, 스트리밍 계약은 깨지 않는 선에서 설계하고, 결정은 최소한으로만 물어봐.
강화 라운드의 요령 ① 카드 하나 = 커밋 하나, 되돌아갈 지점을 만들며 갑니다. ② 서브에이전트가 가져온 원작 방식이 내 구조와 다르면 내 구조가 우선입니다. 원작은 답안이 아니라 참고서입니다. ③ 서로 다른 화면을 고치는 카드 두 장은 서브에이전트에 병렬로 맡길 수 있고, 같은 파일을 고치는 카드는 차례로 진행합니다. ④ 마지막엔 make run으로 통합 서빙을 다시 굳혀 Slack의 스크린샷을 최신으로.
BONUS DONE, 진행률 미집계
BONUS

바이브 코딩 라운드, 원작을 향해

+α 자유

Phase 빌드가 끝났다면 이제 바이브 코딩입니다: 완성 화면의 묘사를 주고 "이렇게 나오게 해줘"를 반복하는 루프. 아래 세 장면은 원작이 실제로 도달한 터미널 화면을 글로 옮긴 것입니다. 내 화면과 다른 점을 찾아 하나씩 주문하세요.

1장면 A, Dashboard의 마감 디테일
타깃 묘사, 프롬프트에 붙여 쓰세요
- 상단 sticky 마켓 스트립: 지수 5종과 지표가 한 줄로 흐르고, 등락은 상승 빨강 ▲ / 하락 파랑 ▼
- 패널 그리드: 위젯마다 1px 테두리와 6px 라운드 패널, 헤더는 대문자 영문 eyebrow + 한국어 제목
- 종목 테이블: US/KR 탭, 숫자와 심볼은 고정폭 서체로 우측 정렬, 행 호버 하이라이트, 선택은 앰버
- 하단 상태 바: 장 상태 점(초록은 상태 전용), 폴링 주기, KST 시계
2장면 B, StockDetail의 마감 디테일
타깃 묘사, 프롬프트에 붙여 쓰세요
- StockHeader: 심볼과 이름, 현재가 크게, 등락은 색 + ▲▼, 거래량은 축약(1.2M)
- 캔들 차트: 기간 탭(1W/1M/3M/6M/1Y/5Y) 중 활성 탭은 앰버, 상승 빨강/하락 파랑 캔들, 크로스헤어
- ReturnsRow: 기간 수익률이 한 줄에, 양수 빨강/음수 파랑
- Week52Bar: 52주 저가~고가 바 위에 현재가 마커
- 확장 후보(원작에 있는 것): 워치리스트 레일, 호가창 OrderBook, 투자자 동향 InvestorPanel, 종목 뉴스 StockNews,
  기사 AI 분석 ArticleAnalysis - 끌리는 것 하나를 강화 카드의 이식 틀로 추가
3장면 C, AI 패널의 마감 디테일
타깃 묘사, 프롬프트에 붙여 쓰세요
- 분석 버튼(앰버)을 누르면 phase 배지가 fetching → analyzing 으로 바뀌고
- 본문은 delta가 도착하는 대로 타자기처럼 자라며, 마크다운(## 절, 굵은 키워드)이 살아 있다
- 스트리밍 중 다시 누르면 진행 중인 요청을 취소하고 새로 시작
- 키가 없을 때는 "AI 분석 비활성" 안내만 조용히
바이브 코딩의 요령 ① 한 번에 한 화면, 한 번에 한 디테일. ② 실행해 보고 다른 점을 말로 알려주는 반복이 핵심입니다, "델타가 뭉쳐서 온다"처럼. ③ 묘사만으로 감이 안 오면 "원작의 해당 컴포넌트를 서브에이전트로 확인해 줘"를 덧붙이세요. ④ 마음에 든 순간마다 커밋해 되돌아갈 지점을 만드세요. 스펙은 방향을 잡고, 바이브는 마감을 만듭니다.
BONUS DONE, 진행률 미집계
OPTION

하네스 엔지니어링, 작품을 성숙시키고 등급을 받다

+15분 옵션

지금까지 만든 것은 결과물입니다. 이 옵션은 그 결과물을 만든 작업 환경, 즉 하네스 (CLAUDE.md, hooks, skills, commands, agents)를 표준 구조로 성숙시키고(project-init), 그 품질을 6개 차원(정확성, 안전성, 완전성, 실행 가능성, 일관성, 검증 가능성)에서 채점받는(harness-eval) 단계입니다. superpowers의 3단(brainstorm, writing-plans, executing-plans) 뒤에 4단 성숙화와 5단 평가를 붙이는 셈입니다. 캡스톤 공통의 마무리 의식입니다.

이 미션의 바탕 학습: Ch4의 훅과 스킬을 팀 자산으로 승격하는 감각, 그리고 Reference 3의 플러그인 생태계.

1플러그인 2종 설치
Terminal, 전체 복사
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 때와 같은 규칙입니다.

2성숙화, /project-init:init-project와 /project-init:sync-docs
Claude 세션 입력 (새 세션, worktree에서)
/project-init:init-project .

이 프로젝트의 하네스는 아직 얇습니다(FastAPI 앱과 React 앱 하나씩). 기존 프로젝트 감지 모드가 있는 것은 보존하고, 없는 것(문서 스캐폴딩, 시크릿 스캔 훅, /review 커맨드, 테스트 골격 등)만 채웁니다. CLAUDE.md가 이미 있으면 덮어쓰기 전에 물어봅니다. 끝나면 이어서:

Claude 세션 입력
/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
3평가, /harness-eval로 등급 받기
Claude 세션 입력
/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가 같은 원칙으로 확장합니다. 여유가 있다면 결정을 기록으로 남기세요:

Claude 세션 입력
/add-adr streaming-ai-contract
/add-runbook market-web-run
시간과 신뢰 가드 잔여 시간이 빠듯하면 설치와 /harness-eval:quick(30초 체크리스트)만으로 충분합니다, /project-init:init-project는 17단계라 수 분이 걸립니다. /harness-eval:standard의 동적 분석은 대상 프로젝트의 훅과 테스트를 실제로 실행합니다. 방금 본인이 만든 프로젝트라 안전하지만, 남의 저장소를 평가할 때는 --static-only 플래그가 예의이자 안전입니다.
OPTION DONE, 진행률 미집계

미션 종료

시세는 캐시 뒤에, 키는 서버에, AI는 스트림으로. 웹 시황 데스크의 문법입니다.

가져가는 것내용
캐시가 곧 예의업스트림은 캐시 뒤에서 한 번만, single-flight로 동시 요청도 한 번만
스트리밍 계약phase → delta → final, 그리고 "점진 델타에는 react-query가 아니라 fetch"라는 도구 선택의 근거
절전 설계장이 닫히면 600초로 늦춘다, 시스템은 세상의 리듬을 알아야 한다
위임과 검증조사와 구현은 서브에이전트에게, 대조와 판단은 내가. 리뷰어의 지적도 직접 확인한 뒤에 고친다
NEXT

포털로

다른 캡스톤(1 Press Start, 3 Frame It, 4 Trend Radar)도 같은 리듬입니다. 워크샵 포털에서 다음 미션을 고르세요.

실제 결과 샘플

이 미션을 완주하면 나오는 결과물을 실제 배포 URL로 확인할 수 있습니다. 시작 전에 목표 화면을 먼저 보거나, 완주 후 내 결과와 비교해 보세요.

LIVE SAMPLE, 이 미션의 결과물

Market Desk on Web

https://stock-monitoring.whchoi.net/ (새 탭에서 열립니다)

미션결과물샘플 URL
Capstone 1, Press StartClawd 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 Lens4개 매체 관점 비교newslens.whchoi.net
Claude Code Deep Dive Workshop, Capstone 2
기준: Claude Code 2.1.x + FastAPI + React(Vite) + Bedrock SSE, Sonnet 4.6, 원작 stock-monitoring 2026.09, 2026.11

READING CHECK

이 페이지를 읽으셨나요?

읽음 표시는 실습 체크포인트와 별도로 관리됩니다. 아직 읽지 않음

이 페이지에서맨 위로 ↑