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
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):
→ "BUY TST_A 어디서 사고 어디서 끊고 어디서 익절?" 답이 없음. 사용자는 다시 dashboard / DB / broker 앱을 열어야 함 = 인지 부담 감소 절반만 해결.
Missing fields (사용자 본인 룰 기준)
nuri/trading/recommend/price_targets.py+config/rules.yamlladdersconfig/portfolio.yamlconfig/rules.yamlswing/growth/value ladderregime: bull 0.72같은 abstract score 가 아니라, "RSI<30 + breakout 50DMA" 같은 실제 시그널 명시nuri/agents/actors/*upstream signalscross-checked: 5/6 sites @ 2h ago)nuri/core/axis.py+ agentsScope
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 truncateOut of scope
feedback_no_buy_sell_recommendations메모리Sub-issue candidates (escalation 시 분리)
이 두 항목은 infra hardening 이라 별도 PR scope. 본 issue 는 product schema 만.
Verification (#569 partial-pass evidence)
→ #569 mechanism done. 본 issue 는 content (data 풍부화) 담당.
Acceptance
docs/STRATEGY.md또는nuri/agents/discord/CLAUDE.md)