개요
Research 페이지의 종목 검색 UX를 대폭 개선하고, 에이전트 실행 상태를 실시간으로 추적할 수 있는 라이프사이클 이벤트 시스템을 도입했다. DART API의 EPS 필드 매핑도 확장하여 더 많은 업종의 재무 데이터를 정상적으로 가져올 수 있게 되었다. 3개 세션, 총 8시간 작업.
주요 변경 사항
Research 라이브 검색 및 종목 상세 강화
Research 페이지에서 KOSPI200 종목을 실시간으로 검색할 수 있는 드롭다운을 추가했다. 백엔드에서는 로컬 KOSPI200 목록에 대해 substring 매칭을 먼저 시도하고, 결과가 없을 때만 MCP 폴백으로 넘어가도록 구현했다. 로컬 검색이 먼저 동작하기 때문에 응답 속도가 빠르고, MCP 호출 비용도 절약된다.
종목 상세 화면과 차트도 함께 개선했다. 더 풍부한 정보를 보여주도록 stock detail 컴포넌트를 리팩터링하고, price chart의 표현력도 높였다.
WebSocket 이벤트 히스토리 하이드레이션
기존에는 WebSocket 연결 시점 이후의 이벤트만 수신할 수 있었다. 페이지를 새로고침하거나 늦게 접속하면 이미 발생한 에이전트 이벤트를 놓치는 문제가 있었다. 이번에 마운트 시점에 기존 이벤트 히스토리를 먼저 가져온 뒤 구독을 시작하도록 수정했다. 이제 페이지 진입 시점과 관계없이 전체 에이전트 실행 이력을 확인할 수 있다.
에이전트 라이프사이클 이벤트
에이전트 베이스 클래스에 agent.started, agent.completed, agent.failed 세 가지 라이프사이클 이벤트를 추가했다. 에이전트가 실행을 시작하고, 완료되거나, 실패할 때 자동으로 이벤트가 발행된다. 프론트엔드의 WebSocket 하이드레이션과 결합하면 에이전트 상태를 실시간으로 표시할 수 있다.
Reports 뷰 수정
리포트 목록에서 항목을 선택할 때, 목록 페이로드에 포함된 축약 데이터 대신 전체 리포트를 별도로 fetch하도록 수정했다. 목록 API가 반환하는 데이터에는 본문이 잘려 있어서 상세 보기에서 내용이 누락되는 문제가 있었다.
DART EPS 필드 확장
DART API에서 EPS 데이터를 가져올 때 사용하는 필드명 후보를 확장했다. 업종마다 재무제표에서 EPS를 표기하는 항목명이 다른데, 기존에는 일부 업종에서 EPS를 찾지 못하는 문제가 있었다. 후보 필드명을 추가하여 더 넓은 범위의 업종을 커버한다.
기타
- 로고 및 Android Chrome 파비콘 추가로 브랜딩 정비
.claudeignore,.gitignore정리 — 로컬 도구 상태, 스크린샷, 목업 파일 제외- HarnessKit 기능 목록 및 superpowers 계획 문서 추가
커밋 로그
| 구분 | 내용 |
|---|---|
| docs | HarnessKit 기능 목록, superpowers 계획/스펙, 진행 로그 추가 |
| chore | 로고 및 android-chrome 파비콘 추가 |
| chore | 로컬 도구 상태, 스크린샷, 목업 파일 gitignore 처리 |
| feat | WebSocket 마운트 시 에이전트 이벤트 히스토리 하이드레이션 |
| fix | 리포트 선택 시 목록 페이로드 대신 전체 리포트 fetch |
| feat | Research 라이브 검색 드롭다운, 종목 상세/차트 강화 |
| feat | 로컬 KOSPI200 substring 검색 + MCP 폴백 |
| fix | DART EPS 필드명 후보 확장으로 업종 커버리지 확대 |
| feat | 에이전트 started/completed/failed 라이프사이클 이벤트 |
인사이트
- 로컬 우선 검색 패턴: 외부 API 호출 전에 로컬 데이터셋을 먼저 탐색하는 패턴은 응답 속도와 비용 모두에서 효과적이다. KOSPI200처럼 비교적 고정된 목록은 로컬 캐시로 충분하다.
- 이벤트 하이드레이션: 실시간 시스템에서 “연결 이전 이벤트"를 복원하는 것은 UX에 큰 차이를 만든다. 히스토리 fetch 후 구독을 시작하는 순서를 지키면 이벤트 중복이나 누락 없이 깔끔하게 처리할 수 있다.
- 라이프사이클 이벤트 표준화: 에이전트 베이스 클래스에서 시작/완료/실패를 일관되게 발행하면, 모니터링 UI나 로깅을 별도 구현 없이 자동으로 얻을 수 있다. 개별 에이전트가 상태 관리 코드를 중복 작성할 필요가 없어진다.
- 재무 데이터 필드명 다양성: 한국 DART 공시에서 같은 지표(EPS)라도 업종별로 항목명이 다르다. 단일 필드명에 의존하면 특정 업종이 누락되므로 후보 리스트 방식이 현실적이다.
