Skip to content

feat(brief): #569 follow-up — payload schema extension (price levels / position context / horizon / provenance) #571

@researcherhojin

Description

@researcherhojin

Why

#569 (squash-merged 2026-05-02) 의 single-writer outbox + bucketed digest mechanism 은 verified — quiet-period (60s), HIGH bypass, bucket layout (Action Now / Blocked / Lower) 모두 production 동작 확인.

하지만 content schema 가 thin 하여 사용자가 #brief 만으로 매매 의사결정을 내릴 수 없음. 검증 결과 (2026-05-02 23:13/23:22 KST screenshots, A1/A2 burst):

Action Now (1)
TST_A | BUY | conv 0.81 | regime: bull 0.72 | causal: 0.68

→ "BUY TST_A 어디서 사고 어디서 끊고 어디서 익절?" 답이 없음. 사용자는 다시 dashboard / DB / broker 앱을 열어야 함 = 인지 부담 감소 절반만 해결.

Missing fields (사용자 본인 룰 기준)

항목 Why Source
price levels (entry / stop / TP1 / TP2 / trailing) "Every recommendation must include entry/stop/target prices" — 사용자 룰 nuri/trading/recommend/price_targets.py + config/rules.yaml ladders
position context 신규 진입 vs 추가매수 vs 일부 익절 — 같은 BUY 라도 의미 다름 config/portfolio.yaml
horizon growth (수개월) vs swing (≤7d) — 룰셋 다름 (-7% vs -5% stop) config/rules.yaml swing/growth/value ladder
signal provenance (top-2) regime: bull 0.72 같은 abstract score 가 아니라, "RSI<30 + breakout 50DMA" 같은 실제 시그널 명시 nuri/agents/actors/* upstream signals
counter-evidence / invalidation bear case / 무효화 조건 — "추천의 근거를 증명" (사용자 신념) agents consensus loser side
external cross-check freshness 6 사이트 + ARK cross-confirm 결과 (e.g., cross-checked: 5/6 sites @ 2h ago) external collectors
conflict 분해 (Blocked bucket) sector cap / SIEGE veto / agent disagreement / freshness — 어떤 종류의 block 인지 nuri/core/axis.py + agents
next action "broker 앱에서 $X 지정가 매수" 같은 actionable 한 줄 derived

Scope

  • stage_brief() 호출자 (12 actors) 가 payload 에 위 fields 추가
  • _format_event_line() 또는 새 multi-line layout — 1줄 → event 당 3-5줄
  • bucket_brief_digest() Discord embed limit (총 6000자, field 1024자) 안에서 fit — overflow 시 priority truncate

Out of scope

Sub-issue candidates (escalation 시 분리)

  • #brief snapshot/visual regression test (Qwen 지적: manual screenshot 비교는 QA debt)
  • dispatcher dead-letter queue (Qwen 지적: 중간 사망 시 silent drop 위험)

이 두 항목은 infra hardening 이라 별도 PR scope. 본 issue 는 product schema 만.

Verification (#569 partial-pass evidence)

  • A1 (3-row normal burst) → 1 embed @ 23:13 KST: ✅ quiet-period + bucket
  • A2 (1-row HIGH bypass) → 즉시 dispatch @ 23:22 KST (+11s vs 70s 정상): ✅ bypass
  • Discord screenshot — title/desc/bucket/footer 모두 spec 일치
  • 사용자 verdict: "이것만으로는 brief 못 함" — content gap 확인

#569 mechanism done. 본 issue 는 content (data 풍부화) 담당.

Acceptance

  • payload schema doc 업데이트 (docs/STRATEGY.md 또는 nuri/agents/discord/CLAUDE.md)
  • price_levels / position_state / horizon / signal_top2 / invalidation 5 fields actor 12개 cutover
  • new layout 사용자 visual review (synthetic A1 burst 재실행)
  • 자연 actor stage 후 production #brief 사용자 verdict — "이걸로 매매 결정 가능" 확인

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions