Event Analysis Team · System Architecture

v4.0.0 — Tier 4 · Unified Composer

멀티 에이전트 파이프라인을 단일 LLM 호출로 압축. 사실 수집 + 분석 + 보고서 작성을 ContextAnalyst + UnifiedComposer 2회 호출로 완료. 보고서 자유도 최대화 + LLM 비용 ~70% 감소.

v4.0.0 (MAJOR) main · eab9678 2-call pipeline Mono Theme Standard Python 3.11+ · Pydantic v2

한 화면 요약

입력: 텔레그램에 사건 한 줄. 심층/짧게/요약 키워드로 모드 자동 결정 (fast/standard/deep — 모두 같은 2-call 파이프라인을 거치되 composer 의 분석 깊이 지시만 다름).

처리: 1) 상황 분석관 (Sonnet 4.6, 웹 검색) — 사실/타임라인/핵심 수치/출처 URL 수집 → 2) 편집장 (Opus 4.7, 단일 호출) — 행위자/구조/시나리오/모순 분석 + 보고서 본문 작성 모두 수행 → 3) HTML 렌더 + Cloudflare Pages 배포.

출력: mono 톤 HTML. 사건마다 섹션 수/제목/순서/톤이 다른 자유 형식. composer 가 명시한 watch_signals 는 SQLite 에 등록되어 /watchlist 명령으로 추적.

핵심 변화 v3.5.0 → v4.0.0: 이해관계 분석관 / 구조 분석관 / 연쇄반응 분석관 / 시나리오 설계관 / 종합 판단관 / 품질 검사관 / 시각화 분석관 / lens pool 8~11종 / archetype matrix 11종 모두 호출되지 않음. 분석 깊이는 잃되 보고서 형태 자유도와 비용 절감 확보.

파이프라인 비교 — Before vs After

v3.5.0 까지는 사건당 5~13회 LLM 호출. v4.0.0 부터는 모든 모드가 2회.

v3.5.0 (BEFORE)

9~13 단계

  1. ContextAnalyst (Sonnet)
  2. Strategy Planner (Opus)
  3. Quality Gate 1
  4. PlayerAnalyst (deep, Sonnet)
  5. DynamicsAnalyst (deep, Opus)
  6. ChainReactionAnalyst (deep, Sonnet)
  7. ScenarioArchitect (Opus)
  8. Lens Pool 1~4 lenses
  9. SynthesisJudge (Opus)
  10. Quality Gate 2
  11. VisualAnalyst (mostly deterministic)
  12. NarrativeComposer (Opus 4.7) — 편집만
  13. ReportSynthesizer (HTML)
LLM 호출: fast 5 / standard 8 / deep 13
평균 지연: ~90~180초
v4.0.0 (AFTER) — Tier 4

4 단계

  1. ContextAnalyst (Sonnet 4.6, 웹 검색)
  2. UnifiedComposer (Opus 4.7) — 분석 + 작성 단일 호출 ⭐
  3. ReportSynthesizer (HTML 렌더, LLM 0)
  4. Watchlist Registry (SQLite, LLM 0)
LLM 호출: 모든 모드 2회
평균 지연: ~30~60초 추정
mode 의 의미가 달라짐

v3.5.0 까지 mode 는 몇 개의 에이전트를 호출할지 결정했음. v4.0.0 에서는 mode 가 composer 프롬프트의 분석 깊이 지시 만 결정 (fast 3~4 섹션 / standard 4~6 섹션 / deep 5~7 섹션 + 모순 명시 필수). 호출 수는 모든 모드 동일.

v4.0.0 파이프라인 4단계

상황 분석관 — ContextAnalyst
claude-sonnet-4-6 · 웹 검색 활성
사건의 사실 / 타임라인 / 핵심 수치 / 출처 URL 수집. 모든 후속 분석의 1차 evidence. fast 모드에선 Sonnet 4.6 그대로, standard/deep 도 Sonnet (composer 가 분석 무게 담당하니 context 는 가벼움).
편집장 — UnifiedComposer ⭐
claude-opus-4-7 · 단일 LLM 호출 (max 8K tokens)
ContextAnalysis 만 받아 *내부적으로* 다음을 모두 수행:
  1. 핵심 행위자 식별 — 결정권자 / 이득 / 손해 / 숨은 영향력자
  2. 구조적 동인 — 왜 지금 이 사건이 / 비대칭 / 피드백 루프 / 전환점
  3. 인과 사슬 — 단·중·장기 파급 / 차단 가능 지점 / 와일드카드
  4. 시나리오 설계 — 3~5개 (트리거 / 확률 / 영향)
  5. 모순 표면화 — 관점 충돌 / 데이터 모순 (Anti-pattern #5)
  6. 본문 작성 — headline + deck + 3~7 sections + closing
  7. 감시 신호 추출 — watch_signals 배열 (Watchlist 통합)

출력: 확장된 ComposedReport (headline, deck, sections, watch_signals, contradictions, confidence, closing).

보고서 합성 — ReportSynthesizer
코드 결정적 · LLM 호출 0
composer 의 ComposedReportfreeform_essay.html 에 주입해 mono 테마 HTML 생성. lens_policy.select_theme() 가 사건 카테고리에서 burgundy_mono / light_mono 자동 선택. 최종 HTML 을 wrangler 로 Cloudflare Pages 배포 후 URL 반환.
Watchlist 등록
SQLite · LLM 호출 0
composed_report.watch_signals 를 SQLite Registry 에 INSERT. 텔레그램 /watchlist, /fire 명령으로 후속 추적. 이전엔 ScenarioArchitect 의 출력에서 가져왔는데 이제 composer 가 직접 emit.
composer 실패 시 폴백

편집장 호출이 실패하면 (LLM 오류 / 파싱 실패 등), context.summary 를 그대로 보여주는 1섹션 minimal 보고서 가 생성됨. archetype 폴백 (v3.5.0) 은 더 이상 사용되지 않음.

ComposedReport 스키마 (확장)

composer 가 emit 하는 단일 출력 객체. v4.0.0 에서 +4 필드 추가 (watch_signals / contradictions / confidence_summary / confidence_score).

class ComposedReport(BaseModel): headline: str # 한 줄 헤드라인 deck: str = "" # 부제 1~2 문장 sections: list[ComposedSection] # 3~7 섹션 closing: str = "" # 에필로그 (선택) # v4.0.0 — Tier 4 통합 출력 watch_signals: list[dict] # Watchlist Registry 통합 # [{signal, description, indicates, deadline?, icon?}] contradictions: list[dict] # Anti-pattern #5 (봉합 금지) # [{side_a, side_b, evidence?, resolution?}] confidence_summary: str = "" # 한 줄 자유 평가 confidence_score: float = 0.5 # 0.0~1.0 종합 신뢰도 class ComposedSection(BaseModel): heading: str # 섹션 제목 kicker: str = "" # 도입구 (선택) prose: str # 본문 (마크다운) embedded_charts: list[str] # 차트 ID (v4.0.0 거의 미사용) embedded_blocks: list[str] # 블록 type (선택) pull_quote: str = "" # 강조 인용 (선택) cited_claim_ids: list[str] # 인용 (v4.0.0 거의 미사용)

3단 모드 — composer 프롬프트 깊이만 결정

token_budget.py 의 모든 budget 플래그가 v4.0.0 에서 비활성. mode 는 composer 가 받는 분석 깊이 지시문에만 영향.

항목fast ⚡standard 🟢deep 🔬
키워드짧게/간략/요약/빠르게(기본)심층/자세히/면밀
LLM 호출 수222
composer 권장 섹션 수3~44~65~7
composer 권장 시나리오 수2~33~54~5
모순 명시 (contradictions)선택권장필수
감시 신호 (watch_signals)선택권장≥3건
Context Analyst 모델Sonnet 4.6 (downgrade)Sonnet 4.6Sonnet 4.6
UnifiedComposer 모델Opus 4.7Opus 4.7Opus 4.7

트레이드오프 — 잃은 것 vs 얻은 것

잃은 것

  • 다중 관점 분리 분석 (PlayerAnalyst / DynamicsAnalyst / ChainReactionAnalyst 가 각자 독립 perspective 로 finding emit)
  • Lens Pool 8~11종 (geopolitical / financial_transmission / tech_architecture / accident_causality / market_structure / red_team / pre_mortem 등) 의 분야별 전문 기법 체크리스트
  • Evidence-Claim 추적성 강제 (Claim.evidence_ids min_length=1 validator) — composer 자율 cited_sources 로 약화
  • Quality Gate 1 (계획 sanity) + Gate 2 (커버리지) 검증
  • AMC (AnalysisMethodContract) 의 required_inputs / mandatory_stages 검증 + 미달 경고 배너
  • Synthesis Judge 의 모순 표면화 (별도 LLM 호출로 cross-finding 검사) — composer 자율 평가로 약화
  • red_team / pre_mortem 메타 lens 자동 추가
  • archetype 11종 라우팅 매트릭스 (사건 카테고리별 고유 섹션 흐름)

얻은 것

  • 보고서 형태 완전 자유 — 사건마다 섹션 수 / 제목 / 순서 / 톤이 다름
  • 차트 무지성 박힘 영구 차단 — composer 가 reference 한 차트만 (실제로 v4.0.0 에선 거의 0개)
  • LLM 호출 수 감소: deep 13 → 2 (~85% ↓), standard 8 → 2, fast 5 → 2
  • 지연 시간 감소: ~90~180초 → ~30~60초 추정 (~60% ↓)
  • 코드 단순화: orchestrator.run_analysis 가 ~370줄 → ~120줄
  • 모드별 분기 단순화: budget 플래그 8개 → composer prompt 인자 1개
  • Opus 4.7 의 reasoning 능력에 신뢰 — 단일 호출에서 다각도 분석 수행
  • 운영 비용 ~70% 추정 절감 (단일 Opus 4.7 호출 vs 13개 호출)
잃은 것을 부분 보완하는 방안

composer 시스템 프롬프트에 7단계 분석 가이드 (행위자 / 구조 / 사슬 / 시나리오 / 모순 / 감시 신호) 를 명시 — Opus 4.7 의 reasoning 으로 단일 패스에서 다각도 커버. 다만 분리된 LLM 호출의 *독립적* 다각도 보장은 없음. 깊이 검증이 핵심인 사건은 외부 critic 호출 (현재 미구현) 추가 검토 필요.

디렉토리 변화 — 호출 안 되는 모듈

v4.0.0 에서 취소선 표시는 코드는 살아있지만 호출되지 않는 모듈. + 표시 는 신규 또는 강화. 향후 정리 commit 에서 deprecated 모듈 일괄 제거 예정.

src/ ├── orchestrator.py ← 4단계 단순화. ~370줄 → ~120줄. VERSION = v4.0.0 ├── models.py+ ComposedReport.watch_signals/contradictions/confidence ├── token_budget.py ← 모든 모드 max_llm_calls=2. budget 플래그 통일 ├── lens_policy.py ← select_theme() 만 사용. select_lenses() 호출 안 됨 ├── agents/ │ ├── context_analyst.py ← Sonnet 4.6 (사실 수집) │ ├── narrative_composer.py ← Opus 4.7. + compose_unified() — Tier 4 진입점 │ ├── report_synthesizer.py ← HTML 렌더 (LLM 호출 거의 없음) │ ├── player_analyst.py ← deprecated (호출 안 됨) │ ├── dynamics_analyst.py ← deprecated │ ├── chain_reaction_analyst.py ← deprecated │ ├── scenario_architect.py ← deprecated │ ├── synthesis_judge.py ← deprecated │ ├── quality_inspector.py ← deprecated │ └── visual_analyst.py ← deprecated ├── lenses/ ← 11종 모두 호출 안 됨 ├── archetypes/ │ ├── freeform_essay.py유일하게 사용되는 archetype │ ├── six_act_theater.py ← deprecated (10종 전부 호출 안 됨) │ └── ... ├── visual_builder.py ← 9종 차트 데이터 빌더, 호출 안 됨 ├── telemetry.py ← 유지 (LLM 호출 추적) ├── watchlist/ ← 유지 (composed_report.watch_signals 에서 등록) ├── templates/ │ ├── report.css ← Mono 2테마 (burgundy_mono + light_mono) │ ├── archetypes/ │ │ └── freeform_essay.html유일하게 사용. + contradictions/watch_signals/confidence 섹션 │ ├── report.html ← deprecated (six_act_theater 전용) │ ├── report_block.html ← deprecated (archetype 폴백 더 이상 사용 안 함) │ └── blocks/ ← 17종 블록, embedded_blocks 통해 composer 가 선택 시만 사용 └── ... samples/ ├── chart_map_mono_compare.html ├── v3_5_0_architecture.html ← v3.5.0 시점 자료 (히스토리) └── v4_0_0_architecture.html본 페이지

운영 — 봇 재기동

v4.0.0 메이저 버전 변경. 코드 + 모델 + 템플릿 모두 변경됐으니 VM 재기동 필수.

재기동 절차

cd ~/agents_reviewer
git pull origin main
kill -9 <old_pid>
source venv/bin/activate
nohup python -m src.main > bot.log 2>&1 &
disown

확인: 텔레그램 /statuscommit: eab9678 / VERSION: v4.0.0. 분석 후 보고서 footer 에 archetype: freeform_essay 표시되면 정상 (다른 archetype 표시되면 기동 실패).