feat: 대시보드 Circuit Breaker 게이지 추가 (#196) #197

Merged
jihoson merged 3 commits from feature/issue-196-cb-gauge into main 2026-02-22 11:49:57 +09:00
Collaborator

Summary

  • trading_cycle() L7 context에 portfolio_pnl_pct_{market} 저장 추가 → 대시보드가 DB에서 최신 pnl_pct 조회 가능
  • /api/status에 circuit_breaker 섹션 추가 (threshold_pct / current_pnl_pct / status)
  • 헤더에 CB 게이지 표시: 점멸 도트 + 진행 바 + 수치

CB 상태 기준

status 조건
ok pnl_pct > -2.0%
warning -3.0% < pnl_pct <= -2.0% (CB까지 1% 이내)
tripped pnl_pct <= -3.0%
unknown L7 context에 데이터 없음 (트레이딩 미실행 상태)

변경 파일

  • src/main.py: L7에 portfolio_pnl_pct 저장
  • src/dashboard/app.py: circuit_breaker 섹션, os import
  • src/dashboard/static/index.html: CB 게이지 CSS/HTML/JS, --warn 색상 변수
  • tests/test_dashboard.py: CB 테스트 4개 추가 (총 23개)

Test plan

  • test_status_circuit_breaker_ok
  • test_status_circuit_breaker_warning
  • test_status_circuit_breaker_tripped
  • test_status_circuit_breaker_unknown_when_no_data
  • 전체 740 테스트 통과

Closes #196

Generated with Claude Code

## Summary - trading_cycle() L7 context에 portfolio_pnl_pct_{market} 저장 추가 → 대시보드가 DB에서 최신 pnl_pct 조회 가능 - /api/status에 circuit_breaker 섹션 추가 (threshold_pct / current_pnl_pct / status) - 헤더에 CB 게이지 표시: 점멸 도트 + 진행 바 + 수치 ## CB 상태 기준 | status | 조건 | |---|---| | ok | pnl_pct > -2.0% | | warning | -3.0% < pnl_pct <= -2.0% (CB까지 1% 이내) | | tripped | pnl_pct <= -3.0% | | unknown | L7 context에 데이터 없음 (트레이딩 미실행 상태) | ## 변경 파일 - src/main.py: L7에 portfolio_pnl_pct 저장 - src/dashboard/app.py: circuit_breaker 섹션, os import - src/dashboard/static/index.html: CB 게이지 CSS/HTML/JS, --warn 색상 변수 - tests/test_dashboard.py: CB 테스트 4개 추가 (총 23개) ## Test plan - [x] test_status_circuit_breaker_ok - [x] test_status_circuit_breaker_warning - [x] test_status_circuit_breaker_tripped - [x] test_status_circuit_breaker_unknown_when_no_data - [x] 전체 740 테스트 통과 Closes #196 Generated with Claude Code
agentson added 1 commit 2026-02-21 21:14:05 +09:00
feat: 대시보드 Circuit Breaker 게이지 추가 (#196)
Some checks failed
CI / test (pull_request) Has been cancelled
342511a6ed
- trading_cycle()의 L7 context에 portfolio_pnl_pct_{market} 저장 추가
  → 대시보드가 최신 pnl_pct를 DB에서 직접 조회 가능해짐
- /api/status 응답에 circuit_breaker 섹션 추가
  (threshold_pct, current_pnl_pct, status: ok/warning/tripped/unknown)
  - warning: CB 임계값까지 1% 이내 (-2.0% 이하)
  - tripped: 임계값(-3.0%) 이하
- 대시보드 헤더에 CB 게이지 추가 (점멸 도트 + 진행 바 + 수치)
  - ok: 녹색, warning: 오렌지 점멸, tripped: 빨간 점멸
- CB 상태 테스트 4개 추가 (ok/warning/tripped/unknown)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Owner

L7에 이런 용도를 섞어도 돼?

L7에 이런 용도를 섞어도 돼?
Author
Collaborator

좋은 지적입니다. docs/context-tree.md를 확인했습니다.

L7의 공식 use cases (문서 기준)

  • Immediate execution decisions
  • Stop-loss triggers
  • Real-time P&L tracking ← 이 항목이 명시되어 있음

예시 키는 current_position_{stock_code}, live_price_{stock_code}, volatility_5m_{stock_code}종목별 시장 데이터가 대부분입니다.

현재 구현의 어색한 점

기존 L7 데이터는 종목 수준(stock-level)인데, portfolio_pnl_pct_{market}은 포트폴리오 수준(portfolio-level)입니다. 단위가 다른 데이터가 같은 레이어에 섞이는 점이 설계상 약간 어색합니다.

또한 대시보드 표시 전용 데이터를 AI 의사결정용 context tree에 저장하는 것은 관심사 분리(separation of concerns) 관점에서도 혼재됩니다.

더 깔끔한 대안

L6_DAILY에 저장하는 것이 더 자연스럽습니다. L6의 정의가 "Daily trade logs, end-of-day P&L"이고 pnl_pct는 일별 성과 지표이기 때문입니다. 장중 갱신도 L6에서는 허용됩니다.

다만 L7 use case에 "Real-time P&L tracking"이 명시되어 있어 기술적 위반은 아닙니다.

제 판단: 설계 원칙보다 실용성을 우선한 결정이었는데, 지적이 타당합니다. L6_DAILY로 변경하거나 현재 L7로 유지하거나 — 판단에 따르겠습니다.

좋은 지적입니다. docs/context-tree.md를 확인했습니다. ## L7의 공식 use cases (문서 기준) - Immediate execution decisions - Stop-loss triggers - **Real-time P&L tracking** ← 이 항목이 명시되어 있음 예시 키는 `current_position_{stock_code}`, `live_price_{stock_code}`, `volatility_5m_{stock_code}` 등 **종목별 시장 데이터**가 대부분입니다. ## 현재 구현의 어색한 점 기존 L7 데이터는 종목 수준(stock-level)인데, `portfolio_pnl_pct_{market}`은 포트폴리오 수준(portfolio-level)입니다. 단위가 다른 데이터가 같은 레이어에 섞이는 점이 설계상 약간 어색합니다. 또한 대시보드 표시 전용 데이터를 AI 의사결정용 context tree에 저장하는 것은 관심사 분리(separation of concerns) 관점에서도 혼재됩니다. ## 더 깔끔한 대안 **L6_DAILY에 저장**하는 것이 더 자연스럽습니다. L6의 정의가 "Daily trade logs, end-of-day P&L"이고 pnl_pct는 일별 성과 지표이기 때문입니다. 장중 갱신도 L6에서는 허용됩니다. 다만 L7 use case에 "Real-time P&L tracking"이 명시되어 있어 기술적 위반은 아닙니다. **제 판단**: 설계 원칙보다 실용성을 우선한 결정이었는데, 지적이 타당합니다. L6_DAILY로 변경하거나 현재 L7로 유지하거나 — 판단에 따르겠습니다.
agentson added 1 commit 2026-02-22 00:33:22 +09:00
refactor: CB 게이지 pnl_pct 저장 레이어를 L7 → L6_DAILY로 변경
Some checks failed
CI / test (pull_request) Has been cancelled
f3491e94e4
portfolio_pnl_pct는 일별 성과 지표이므로 실시간 종목 데이터(L7)보다
일별 P&L 레이어(L6_DAILY)가 더 적합함. (PR #197 코드리뷰 반영)

- main.py: L7_REALTIME + ISO timestamp → L6_DAILY + date(YYYY-MM-DD)
- app.py: contexts 쿼리 layer/timeframe 조건 동기화
- tests: _seed_cb_context L6_DAILY + today 날짜로 수정

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Owner

아래 관점에서 물어본거야.

대시보드 표시 전용 데이터를 AI 의사결정용 context tree에 저장하는 것은 관심사 분리(separation of concerns) 관점에서도 혼재

아래 관점에서 물어본거야. 대시보드 표시 전용 데이터를 AI 의사결정용 context tree에 저장하는 것은 관심사 분리(separation of concerns) 관점에서도 혼재
Author
Collaborator

맞습니다. L6로 변경해도 그 본질적인 문제는 해결되지 않습니다.

근본 문제

context tree는 AI(Gemini)의 의사결정 메모리입니다. L1~L7 모두 brain/이 읽어서 매매 판단에 활용하는 구조입니다. 여기에 대시보드 표시용 데이터를 끼워 넣으면 두 시스템의 경계가 흐려집니다.

제안하는 해결책: system_metrics 별도 테이블

CREATE TABLE IF NOT EXISTS system_metrics (
    key      TEXT PRIMARY KEY,
    value    TEXT NOT NULL,   -- JSON
    updated_at TEXT NOT NULL
);
  • trades / decision_logs / contexts와 같은 DB에 존재하지만 context tree와 완전히 분리
  • trading_cycle에서 portfolio_pnl_pct_{market} 키로 갱신
  • 대시보드 /api/status는 이 테이블만 읽음
  • AI brain은 이 테이블을 읽지 않음

이 방향으로 변경할까요?

맞습니다. L6로 변경해도 그 본질적인 문제는 해결되지 않습니다. ## 근본 문제 context tree는 **AI(Gemini)의 의사결정 메모리**입니다. L1~L7 모두 `brain/`이 읽어서 매매 판단에 활용하는 구조입니다. 여기에 대시보드 표시용 데이터를 끼워 넣으면 두 시스템의 경계가 흐려집니다. ## 제안하는 해결책: `system_metrics` 별도 테이블 ```sql CREATE TABLE IF NOT EXISTS system_metrics ( key TEXT PRIMARY KEY, value TEXT NOT NULL, -- JSON updated_at TEXT NOT NULL ); ``` - `trades` / `decision_logs` / `contexts`와 같은 DB에 존재하지만 **context tree와 완전히 분리** - trading_cycle에서 `portfolio_pnl_pct_{market}` 키로 갱신 - 대시보드 `/api/status`는 이 테이블만 읽음 - AI brain은 이 테이블을 읽지 않음 이 방향으로 변경할까요?
agentson added 1 commit 2026-02-22 11:49:05 +09:00
대시보드 표시 전용 데이터를 AI 의사결정용 context tree에 저장하는 것은
관심사 분리 위반. system_metrics 경량 테이블을 신설하여 완전히 분리. (PR #197 코드리뷰 반영)

- db.py: system_metrics 테이블 추가 (key/value/updated_at)
- main.py: context_store.set_context(L6_DAILY) → db_conn.execute(system_metrics)
- app.py: contexts 쿼리 → system_metrics 쿼리
- tests: _seed_cb_context를 system_metrics 삽입으로 변경

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
jihoson merged commit 0e2987e66d into main 2026-02-22 11:49:57 +09:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jihoson/The-Ouroboros#197