Comad World 가이드

Ear — 뉴스 큐레이터

Discord 채널에 공유된 기사 링크를 자동 감지하여, 관련성을 3단계(필독/추천/참고)로 분류하고 마크다운으로 아카이브합니다. 매일 아침 digest HTML로 요약되고, 필독 기사는 /search로 자동 투입되어 자가진화 루프를 완성합니다.

Claude Code 세션 Discord MCP 필독 13% 일일 digest → /search 피드

개요 & 동작 방식

Ear는 하나의 롱런닝 Claude Code 세션입니다. 자체 MCP 도구(discord2 채널)로 메시지를 받아 기사 링크를 감지하고, WebFetch로 원문을 가져와 분석·분류한 뒤 파일로 저장합니다.

Discord 메시지(discord2 MCP 채널)
Ear 세션이 수신 감지
  ↓ WebFetch
원문 기사 fetchClaude (이 세션 자체가 분석)
관련성 3단계 분류ear/archive/YYYY-MM-DD-slug.mdYAML frontmatter + 요약Discord에 "아카이브 완료!" 짧게 응답
Ear 세션은 ccd라는 alias로 기동됩니다 — 별도의 Discord 토큰/채널을 쓰는 두 번째 bot입니다. 관리용 ccc와 분리되어 있어 큐레이션만 담당합니다.

Discord 봇 설정 (초회 1회)

  1. Discord Developer Portal에서 Application 생성 → Bot 추가 → Token 복사
  2. Bot → Privileged Gateway Intents에서 Message Content Intent 활성화 (필수)
  3. OAuth2 → URL Generator에서 scope=bot, 권한=Send/Read/Attach 체크 → 생성된 URL로 봇을 서버에 초대
  4. 토큰을 ~/.claude/channels/discord2/.env에 저장:
    DISCORD_BOT_TOKEN=MTQ4...

운영 모드

Ear는 두 가지 실행 방식을 지원합니다. 기본은 Mode B(LaunchAgent REST 폴링)입니다 — 터미널을 닫아도 24/7 동작하고 Discord IDENTIFY 쿼터를 소비하지 않습니다. Mode A(인터랙티브 ccd)는 실시간 반응이 필요할 때만 사용합니다.

Mode A — 인터랙티브 ccdMode B — ear-poll LaunchAgent (기본)
실행 방식터미널에서 ccd alias 실행install.sh가 자동 등록 (15분마다 REST 폴링)
지연실시간 (gateway push)최대 15분
가용성터미널 창이 열려 있는 동안만24/7 (launchd가 관리)
IDENTIFY 쿼터세션당 1회0회 (gateway 미사용)
MCP 로딩discord2 MCP 상주메시지 처리 시점에만 one-shot claude -p (MCP 미로드)

Mode A — 인터랙티브 ccd

ccd alias는 Ear 전용 Claude 세션을 시작합니다. ~/.zshrc에 다음과 같이 정의됩니다:

alias ccd='claude --dangerously-skip-permissions \
  --dangerously-load-development-channels server:discord2 \
  --append-system-prompt "$(cat ~/Programmer/01-comad/comad-world/ear/CLAUDE.md)"'

실행하면 상단에 다음과 같이 뜹니다:

  Listening for channel messages from: server:discord2
  Experimental · inbound messages will be pushed into this session...
OAuth 주의 (Mode A에 한함) — 인터랙티브 ccd는 반드시 GUI 세션(터미널 앱)에서 실행. launchd/cron에서 기동하면 OAuth keychain 잠금으로 실패합니다 (스케줄러 가이드 참고). Mode B는 launchd gui/<uid> 도메인에서 정상 동작합니다 — REST 호출만 하고 OAuth-기반 claude -p는 메시지가 도착했을 때만 invoke하기 때문입니다.

Mode B — ear-poll LaunchAgent (기본·권장)

~/.claude/channels/discord2/.envDISCORD_BOT_TOKEN만 저장해두면 install.sh가 자동으로 com.comad.ear-poll을 등록합니다 (토큰이 없으면 조용히 skip). 15분 간격으로 /channels/:id/messages?after=<last>를 polling해서 새 메시지에 대해서만 claude -p를 one-shot 실행합니다.

# 설치 (Mode B는 환경파일만 있으면 자동 등록)
zsh brain/scripts/launchd/install.sh

# 상태 확인
launchctl list | grep com.comad.ear-poll

# 즉시 실행 (다음 15분을 기다리지 않고)
launchctl kickstart gui/$(id -u)/com.comad.ear-poll

# 로그
tail -f ear/poll-ear.log

핵심: 매 메시지마다 claude -p --strict-mcp-config --mcp-config ear/poll-no-mcp.json으로 호출하므로 MCP가 절대 로드되지 않습니다 — Discord IDENTIFY 쿼터 소비량은 0입니다.

⚠ Discord IDENTIFY 함정 — Discord gateway는 bot당 1000/day IDENTIFY 쿼터가 있습니다. 과거 ccdKeepAlive=true LaunchAgent로 감싸서 상시 실행하려 시도했다가 TTY 없는 launchd 환경에서 즉시 crash → 30초마다 재시작 → 매 재시작이 discord2 MCP를 spawn → 8시간 만에 1000/1000 소진하는 사고가 있었습니다 (2026-04-16). 교훈: 절대 인터랙티브 ccd를 launchd/systemd에서 감싸지 마세요. 24/7 운영은 Mode B(REST 폴링)가 유일한 정답입니다. 응급 복구는 Discord Developer Portal에서 토큰 회전(쿼터 즉시 리셋).

아카이브 포맷

저장 경로: ear/archive/YYYY-MM-DD-slug.md — 슬러그는 기사 제목의 영문 kebab-case. 모든 기사는 동일한 frontmatter 구조를 엄격히 유지합니다.

---
date: 2026-04-12
relevance: 필독
categories: [AI/LLM, Tool, OpenSource]
geeknews: https://news.hada.io/topic?id=28419
source: https://github.com/example/repo
---

# Claude Code Auto Mode를 설계한 방법

## 핵심 요약
- (3~5개 핵심 포인트)

## 왜 알아야 하는가
(2~3문장 — 실무 영향)

## 추가 리소스
- [공식 문서](URL)
- [관련 GitHub](URL)

3단 관련성 기준

등급비율기준
필독 🔴~13%현재 스택(Claude Code/MCP/Neo4j/Bun) 직접 영향 · 보안 위협 · 패러다임 변화 · 자기 프로젝트 언급
추천 🟡~65%핵심 관심 분야지만 당장 영향 없는 기사
참고 🔵~22%트렌드 가치는 있으나 관련성 낮음

일일 digest HTML

매일 08:00 (스케줄러에 의해 자동 실행) ear/generate-digest.js어제 아카이브된 모든 기사를 모아 ear/digests/YYYY-MM-DD-digest.html로 생성합니다.

# 수동 실행
node ear/generate-digest.js              # 어제 기준
node ear/generate-digest.js 2026-04-12   # 특정 날짜
버그 수정 이력 (2026-04-13) — 이전에는 toISOString()이 UTC 반환이라 KST 08:00 cron에서 "이틀 전"을 타겟했었음. 로컬 컴포넌트 조립으로 수정 + 누락분 백필.

Brain 인제스트

Ear의 아카이브는 ingest-geeknews.sh cron(매일 09:30)이 Brain Neo4j로 임포트합니다. GeekNews 외 일반 블로그 포스트도 동일한 frontmatter 구조면 함께 처리됩니다.

bun run packages/ingester/src/geeknews-importer.ts
# → ~/Programmer/01-comad/comad-world/ear/archive/*.md 스캔
# → Article / Topic / Technology 노드 MERGE
# → 엔티티 추출(Haiku) + Claim 추출

ear-ingest가 매일 07:00 돌면서 필독 + 핵심 카테고리(AI/LLM, Tool, OpenSource, Backend, Frontend, DevOps, Database, Language) 기사를 골라 기술 토큰을 추출하고 /search에 쿼리로 투입합니다.

bun run packages/search/src/ear-ingest.ts --since 1     # 어제만
bun run packages/search/src/ear-ingest.ts --since 7     # 지난 1주
bun run packages/search/src/ear-ingest.ts --dry-run     # 쿼리만 미리보기

실제 동작 예

ear-ingest: 5 article(s) pass filter (relevance=필독, since=3d)
  2026-04-12-managed-agents-brain-hands-separation — 4 queries, 47 adopts
  2026-04-10-advisor-strategy-opus-sonnet         — 4 queries, 1 adopt
  2026-04-12-meta-hyperagents-self-referential    — 4 queries, 1 adopt

ear-ingest: 5 articles, 12 queries, 49 adopt hits
log: brain/data/ear-to-search.jsonl
자가진화 루프 폐쇄 — Ear가 읽은 기사 → Brain에 노드로 저장 → 매일 아침 /search 쿼리로 변환 → 오프토픽 게이트 통과한 레포를 adoption 후보로 축적. 사람은 아침 digest HTML과 adoption 결과만 확인.

관심사 프로필

Ear의 분류 기준은 ear/CLAUDE.md의 시스템 프롬프트와 comad.config.yamlinterests 블록으로 구성됩니다. 프리셋 전환 시 자동 재구성.

커스터마이징 포인트

  • interests.high.keywords — "필독" 판정에 가중치
  • must_read_stack — 현재 스택 (직접 영향 기준)
  • categories — 분류 태그 화이트리스트
  • 봇 응답 말투 — ear/CLAUDE.md "Voice & Tone" 섹션

관련 파일: ear/CLAUDE.md, ear/archive/, ear/digests/, ear/generate-digest.js, brain/packages/search/src/ear-ingest.ts