콘텐츠로 이동

S340 — 디스커버리 차트 서브에이전트 정리 + 원자화 사전 설계

작성: 2026-06-01 (Mon) 목적: 원자화 설계에 들어가기 전, 현행 디스커버리 루틴의 차트 관련 에이전트 구성과 질문을 전수 정리하고, 어떻게 정리(=원자 분할)해야 할지 PM 결정 사항을 확정한다. (PM 지시: "원자화 설계에 들어가기 앞서 먼저 정리")


1. 현황 — 디스커버리에서 차트는 누가 보는가

1.1 실제 호출되는 것: D2 chart-judge 단 1개

DISCOVER 파이프라인 Phase 4(step_loop_d2to6.py)가 종목별로 D2~D6 빌더+에이전트를 순회 호출한다. 차트 축은 D2 하나뿐.

구성요소 위치 역할
빌더 build_d2_input.py D2Input 패키지 조립
지표 chart_indicators.py schema_v6 지표 산출(cum_delta·상위TF·vsa_events 흡수)
에이전트 chart-judge.md 단일 질문 1개에 통합 답변
폴백 step_loop_d2to6.py:140 LLM 실패 시 range_pos 룰(confidence LOW)
  • 호출 방식: call_agent(prompt) — chart-judge.md를 읽고 따르라는 프롬프트. 에이전트가 다른 에이전트를 호출하지 않음(계층 없음).
  • verdict 산출 후 D2_chart_judge_{code}.json envelope로 dump → D7 score_compose가 chart_verdict로 흡수.

1.2 D2 chart-judge가 던지는 질문: 1개 상위질문 + A1~A8 하위질문 (한 reasoning에 전부)

  • 상위 단일 질문: "이 종목 차트가 매수 진입 가치 있는가 — 불균형이 어느 단계이고 유지·가속 가능성이 높은가?"
  • 그 안에 원자 질문 A1~A8이 모두 한 reasoning 단락에 들어감:
질문 내용 주 입력
A1 이날 무슨 일? (급등천장/투매/매집) exceptional_days ret/amt/ohlc
A2 종가 지키며 끝났나? clv, close_vs_vwap
A3 그 가격 지지됐나? next3d_low_held, next10d
A4 거래량 줄며 눌림목? next3d_vol_shrink
A5 저항 돌파/거부? range_pos, high_proximity
A6 거래량 동의받은 가격? intraday_cvd, late_session
A7 지금(is_today) 어느 국면? is_today + 시퀀스 종합
A8 이전 사건 대비 강한가(재점화)? 시퀀스 amt_vs_self 비교

추가로 매물대(VP)·VSA·cum_delta·상위TF·trajectory/energy/exceptionality까지 전부 이 한 에이전트가 종합.

1.3 폐기/방치된 차트 파일 (참고, 호출 금지)

위치 상태 비고
chartist/ 9개 (C1~C9) [DEPRECATED]/[INTEGRATED] "C10이 해석" 4묶음. C10 본체는 이미 삭제
trader/imbalance-* 4개 (Layer1~4) [DEPRECATED S339] discover 호출 금지, trader 보유관리에서만
domain/chart-analyst.md 표시 없음(방치) 구 4Layer + evr_residual/journey/SL·TP·R:R(폐기·제외 대상). PM: 지금 손대지 않음

2. 핵심 문제 — "1에이전트=1질문" 위반

현행 chart-judge 1개가 A1~A8 + 매물대 + VSA + 상위TF를 한꺼번에 처리한다. S339 work_log가 명시한 우려:

"한 에이전트가 차트 여러 질문을 관장하면 강한 신호로 결론 내고 약한 질문(매물대·델타)을 흐릿하게 넘긴다."

단, A1~A8을 그대로 8개 에이전트로 쪼개는 것은 답이 아니다 (PM 점검 확정): - A1~A4·A8 = "이례일 시퀀스 읽기" 한 작업의 세부단계 (같은 exceptional_days 입력, 연속 추론) - A7 = A1~A6의 종합 결과 (다른 축 결과를 봐야 함) - 8개로 1:1 분리 시 → 같은 입력 6번 중복 읽기 + A7이 다른 에이전트 결과 못 봐 오히려 흐려짐

원자 경계 = "질문 개수"가 아니라 "관찰 단락 단위"여야 한다.

2.1 원자화의 목적 (PM 교정, 핵심)

"원자화는 지금 데이터를 보고 현상을 파악하는 것이지 해석을 하는 게 아니다. 에이전트가 a-z 작업을 진행할 때 빼먹거나 사용하지 않는 행동을 막기 위해 원자화를 한다. 데이터를 주고 에이전트에게 해석을 시키면 한두 개 데이터만 가지고 해석을 해버리기 때문이다."

  • 원자화 = 관찰의 누락 방지. 현행 chart-judge가 강신호로 결론 내고 매물대·델타를 흐릿하게 넘기는 것 = "빼먹는 행동". 이걸 막는 게 원자화.
  • 원자 단계 = 현상 파악(서술)이지 해석/verdict/국면판정이 아니다. "overhang 0.01이다", "5일 cvd 궤적이 붕괴다" 같은 사실 관찰을 단락으로 완성.
  • 해석·verdict·국면판정은 그 다음(종합) 단계. 모든 관찰 단락이 채워진 뒤에 한다.
  • 따라서 "국면 먼저 인지 → 국면별 질문 분기"는 틀린 구조 — 그러면 어떤 국면에선 매물대를 아예 안 보게 되어 다시 "빼먹는 행동"이 된다. 원자화는 국면 무관하게 모든 현상을 다 관찰한다.

3. 원자 분할안 — "원자 관찰 리포트"를 단락별 에이전트가 완성 (PM 확정)

구조: 하나의 관찰 리포트, 단락마다 다른 에이전트가 자기 데이터만 받아 그 단락을 완성한다. 이유 = 데이터를 통째로 주면 한두 개만 보고 해석해버리므로, 단락을 쪼개 각 관찰을 강제한다. 근거: D2Input 스키마(schemas.py:232-363) 입력 블록 경계가 그대로 관찰 단락 경계가 된다.

관찰 단락 (원자) 받는 데이터 (이것만) 완성할 관찰 (현상 서술, 해석 X) 흡수 A질문
관찰1. 추세·위치 trend(ma_slope·drawdown·range_pos·high_proximity·tf_monthly/weekly/alignment), trajectory, exceptionality, vsa.cum_delta_5d/20d/accel 가격 위치(신고가/조정/저점), 추세 방향·기울기, 누적 델타 추세(5/20일), 상위TF 정합, 평소 대비 특별함 — 수치 그대로 기술 A5(위치)
관찰2. 이례일 사건 exceptional_days(시퀀스 전체 — 변동폭+거래대금+당일수급 한 몸) 이례일 each: 무슨 일(A1)/종가위치(A2)/거래량 동의·일중수급(A6: cvd·late·clv)/지지여부(A3)/눌림(A4)/재점화(A8) — 사건 사실 나열 A1·A2·A3·A4·A6·A8
관찰3. 매물대 volume_profile(poc_dist·overhang·up_down_ratio·asymmetry·in_lvn) 머리 위 매물 유무, POC 대비 위치, 매집/분배 비대칭 — 매물 구조 사실 A5(저항)
관찰4. VSA·캔들 vsa(events·strength_sum·spring), candles(last_10·wick_ratio) VSA 이벤트 시점·강도, 최근 캔들 형상·꼬리 — 형상 사실

관찰2 병합 근거 (PM): 한 이례일은 변동폭(ret)·거래대금(amt_vs_self)·종가위치(clv)·일중수급(cvd/late)을 한 몸으로 봐야 "흡수냐 분배냐 돌파냐"가 나온다. 분리하면 변동폭만 보고 "급등"이라 하고 거래대금 미달·분배를 놓침. (코드는 chart_indicators.py:447-454에서 거래대금 amt_vs_self만으로 후보일을 뽑고, 변동폭 동반 여부 해석은 에이전트 — 동반/괴리 자체가 흡수·고갈 신호이므로.)

cum_delta 위치 (PM): cum_delta_5d/20d는 개별 이례일이 아닌 5/20일 추세 누적 → 관찰1(추세·위치)로. 당일 수급(intraday_cvd/late)은 이례일 단위라 관찰2. 시간축이 단락별로 일관됨.

설계 원칙: - 각 단락 에이전트는 자기 데이터만 받는다 → 그 데이터를 안 보면 단락이 안 채워짐 = 관찰 누락 구조적 불가. - 단락은 "현상 서술"만 — verdict/점수/국면판정/매수의견 금지. (예: "overhang 0.01 = 거래량 99%가 머리 위"까지가 관찰. "그러므로 회피"는 해석 단계 몫.) - A7("지금 어느 국면인가")은 관찰 아님 → 종합 단계로 (관찰1~4를 다 봐야 답할 수 있는 해석). - 사이징/손절/목표가는 차트 역할 아님 (PM 제외 확정) — 어느 단락에도 없음.

4단락 확정 (PM): 관찰2(사건)+당일수급 병합, cum_delta→관찰1. 데이터 블록 경계 기준.


4. 관찰 리포트 → 해석/verdict (다음 단계, §3 확정 후)

관찰1~5 단락이 다 채워진 리포트를 받아 해석 단계에서 국면 판정 + verdict + 다음 분기를 낸다. PM 지시("원자화 먼저 만들고 → (a)원자→종합 / (b)원자→점수화→해석 / (c)다른 방법 검토")는 이 해석 단계를 어떻게 구성할지의 문제다.

  • 이 결정은 관찰 단락을 실제로 만든 뒤로 미룬다 (PM 지시 순서). 관찰 리포트가 나와봐야 "해석이 점수로 환원 가능한지 / 서사가 필요한지"를 판단할 수 있다.
  • 현 시점 보류 — §3 단락 경계부터 확정하고 관찰 에이전트를 만든다.

5. 진행 상태

  1. ~~§3 관찰 단락 경계 확정~~ ✅ 4단락 확정 (PM).
  2. ~~관찰 단락 에이전트 md 작성~~ ✅ 완료 (2026-06-01):
  3. chart-obs-trend.md — 관찰1 추세·위치 (+cum_delta)
  4. chart-obs-events.md — 관찰2 이례일 사건 (변동폭+거래대금+당일수급 한 몸)
  5. chart-obs-volume-profile.md — 관찰3 매물대
  6. chart-obs-vsa-candles.md — 관찰4 VSA·캔들
  7. 공통: 자기 블록만 입력 / "verdict·점수·매수의견·국면단정 금지" 명시 / ## observation 서술 + envelope 사실 필드.
  8. 빌더/스텝 (다음) — build_d2_input의 블록을 4단락 input으로 슬라이스 + step_loop_d2to6에 관찰 4호출 등록. 데이터는 이미 schemas.py에 다 있음 (새 수집 X). 단락별 input 슬라이스 함수만 필요.
  9. 해석 단계 구성 (다음) — 관찰 리포트 4개 산출 확인 후 (a)/(b)/(c) 검증해 확정 (§4).
  10. chart-judge.md 처리 — 관찰+해석 체계로 대체 시 deprecated 표시 (단 PM 승인 후).

결정 로그 (이 문서)

일시 항목 PM 결정
2026-06-01 원자화 목적 현상 파악(누락 방지)이지 해석 아님. 데이터 통째로 주면 한두개만 보고 해석 → 단락별 강제 관찰
2026-06-01 구조 "원자 관찰 리포트"를 단락별 에이전트가 자기 데이터만 받아 서술 완성. 해석/국면판정은 종합 단계
2026-06-01 국면 분기 하지 않음 — 국면 무관 모든 현상 관찰 (분기하면 어떤 국면서 매물대 누락 = 빼먹는 행동)
2026-06-01 관찰2 병합 이례일은 변동폭+거래대금+당일수급 한 몸 (동반/괴리 자체가 신호) → 사건+당일수급 병합
2026-06-01 cum_delta 위치 5/20일 추세 누적 → 관찰1. 당일 intraday_cvd만 관찰2
2026-06-01 관찰 단락 수 4단락 확정 (추세·위치 / 이례일사건 / 매물대 / VSA·캔들)
2026-06-01 해석 단계 (a/b/c) 관찰 단락 만든 뒤로 보류 (PM 지시 순서)
2026-06-01 chart-analyst.md 지금 손대지 않음