Seoul Weekly · System Documentation

Seoul Weekly System Documentation

서울 위클리 매거진 시스템 구조 · 에이전트 · 인프라 · 운영 원칙
작성 기준 2026-07-08 · 갱신 2026-07-09
작업선 seoul_weekly_v2 (main)
배포 weekly.swarm56.com
상태 W28 라이브 · 카톡 채널 가동 · 측정 루프 자동화
1. Seoul Weekly 개요
서울 전체의 전시·음악·공연예술·스포츠·축제·팝업·도시 이벤트를 매주 국문판(화)·영문판(목)으로 발행하는 주간 매거진. 행사 나열이 아니라 판단이 붙은 해석된 도시 정보지. 제품 본체 = 발송판(자기완결 HTML 문서) — "나만의 매거진을 받아보는 느낌".
제품 본체<lang>.email.html — 커버·메인 전문·Top Pick 8·심층 6편 전문(모달)·전체 목록이 한 파일. 링크는 예매·원문으로 나가는 출구
배포링크 (weekly.swarm56.com/<주>/<lang>.html) — 파일 직접 전송 금지. 채널: 카카오톡(주력) + 이메일(보조). 메일 본문 발송 없음
홈페이지전면 보류 — Peter 언급 전까지 생성 금지
설계 우선순위① 폰 가독성 → ② 정보밀도 → ③ A4 인쇄 호환. "브리프는 밀도가 가치다" — 본문 13~15px대, 이미지=썸네일급 보조, 깊이=분량. 기준 독자 20~40대 모바일
편집 구조초입 기획·큐레이션(메인·픽·심층 6편) / 후반 정보성 목록(전량·7구획). EN판 +Culture & Heritage Experiences(문화체험)
인터랙션 문법"컴팩트 유닛 + 리치 모달" — 커버·픽·심층·문화체험 전 유닛: 지면은 압축 카드, 제목 클릭 시 사진·상세가 든 모달. 모달 수 KO 15 / EN 23
정본basic_plan_v0.4.md (2026-07-08 개정)
별도 트랙 문서제휴 마케팅 전략(이티고 모델) = marketing_v0.1.md · 애널리틱스 매뉴얼 = documentation/analytics_manual.md · 인수인계 = documentation/HANDOVER_2026-07-08.md · 결정 원장 = documentation/decisions_ledger.md · 주간 운영 런북 = documentation/weekly_ops_runbook.md
2. 버전 구조 (2026-07-08 분리)
v1 (동결)d:\Agent_Workspace\seoul_weekly + git v1-legacy — 구 지침·구 에이전트·홈페이지 산출물 보존. 수정 금지
v2 (작업선)d:\Agent_Workspace\seoul_weekly_v2 + git main — 현행. hermes 크론도 main 기준
같은 Private repo(github.com/hudalisque/seoul_weekly) 공유. 디자인 canon = v1 디자인 언어 유지 + 밀도 파라미터만 압축.
3. 제작 아키텍처 — 멀티에이전트 파이프라인
데이터 레이어 (repo — 마크다운이 원본, DBMS 없음) basic_plan_v0.4 (스키마·URL규칙) / taxonomy_v0.1 (7섹션·audience_fit) / source_pages_v0.2 events/ ★진실 소스 (행사 1건 = 파일 1개) / indexes/events_index.jsonl (색인) │ ▼ 트리거: hermes 크론 — 수집 월·금 10:00 / 발행 화 KO·목 EN 07:00 source-scout ───────── 공공 API 1순위 수집 (편집 섹션 내 행사만) │ → scout/<주>-scout.mdevent-clipper ──────── 행사 1건=파일 1개 · 7섹션 + audience_fit 판정 · ID 단독 채번 │ → events/YYYY-MM/seoul-YYYY-MM-NNNN.mdindex-builder ──────── 기계 인덱싱 (멱등 재생성 · 판단 없음) │ → indexes/events_index.jsonlbrief-curator ──────── ★필수 1단계 = 카테고리 집계표 (커뮤니티·상설 제외) │ 앵커 = 집계 1위 기계 도출 · Top Pick 8 · 심층 6편 · 문화>50% │ → briefs/<주>/_editorial-plan.md[편집장 게이트] ─────── 앵커 == 집계 1위 검증 · 상설 혼입·문화<50% 반려 ▼ fact-checker ───────── PASS / WARN / FAIL + disposition · FAIL 잔존 시 집필 차단 │ → briefs/<주>/_factcheck.md ├────────────────────┐ ▼ ▼ ko-writer en-writer ── EN 독립 구성권 · Culture & Heritage (풀 = visitor+both) │ │ → ko.md → en.md └─────────┬──────────┘ ▼ publisher ──── 발송판 조립 (§6 규격) · 발송·업로드 금지 │ ▼ ko.email.html / en.email.html ★제품 본체 (자기완결 매거진 문서)
에이전트 9개(§4)가 순차 실행되며, 각 단계는 앞 단계 산출물이 디스크에 실재함을 확인 후 진행한다 (체크포인트 = _state.md). 게이트에 걸리면 반려·재작업 — 대체 결과 생성 금지.
3-1. 배포·측정 아키텍처 — 승인 → 독자 → 데이터 환류
ko.email.html / en.email.html (제품 본체) │ ▼ [Peter 승인 게이트] ── 텔레그램 봇 "Seoul Weekly Gate" (승인/취소/보류) │ upload_site.sh — scp + HTTP 200 자동 검증 ▼ VPS nginx — weekly.swarm56.com /<주>/<판ID>.html (URL 규칙 §14.2 — ko·en은 영구 특례, 배포된 링크 불파괴) /subscribe.html · /privacy.html (운영 고정 페이지 — 파이프라인 무관) │ ├──────────────────┬───────────────────────┐ ▼ ▼ ▼ 카카오톡 채널 이메일 공유/포워딩 pf.kakao.com/_ztbwX weekly@swarm56.com 발행물 하단 구독 CTA · 웰컴메시지(자동) → Cloudflare 라우팅 → 재유입 (확산 루프) · 브로드캐스트(화·목) → seoulweekly@gmail.com ▲ 구독자 저장소: 집서버 seoul_weekly_data/ (subscribers.jsonl · 메일 .env) │ ▼ 독자 열람 — UTM: channel / welcome / chat / cta · 무꼬리표 = 포워딩 신호 측정 레이어 Google Analytics 4 (G-J1BKNHTP3Y, 전 발행물 gtag) ── 체류·스크롤·아웃바운드·유입처 (보조 지표) nginx access.log ── 전수 실측 (1차 진실 소스 — 봇·내부IP·스캐너 제외 집계) │ ▼ VPS 리포터 crontab ── 화·목 17:00 일간 / 월 10:00 주간 (LLM 없음 — 순수 스크립트) │ ▼ 텔레그램 @seoulweekly_alert_bot ──► Peter ──► 편집·목록 큐레이션·언어 확장 결정에 환류
개수 로직 (정본 §5.4): 메인 앵커 카테고리 = 그 주 앵커 집계 1위 (스포츠가 1위면 스포츠 메인). W28 실사례: 커뮤니티 분리(B안) 후 K-POP·대중음악 8건 1위 → 앵커 TWICE, 야구는 스포츠 2건 최하위로 자연 강등.
4. 에이전트 (.claude/agents/ — 2026-07-08 백지 재구축)
에이전트모델핵심 내장 규칙
editor-in-chiefopus개수 로직 게이트(기계 검증·반려), 심층 6편·문화>50%·FAIL 게이트, 리드 흡수 금지
source-scoutsonnet수집 범위=편집 섹션 내 행사만, 문화체험(템플스테이·고궁·쿠킹클래스) 정례 수집
event-clippersonnetID 단독 채번, 중복 키, genre_hint 태깅(EN 재편성 키), low 비차단
index-builderhaiku판단 금지, 멱등 재생성
brief-curatoropus집계표 의무 1단계, 앵커=1위 기계 도출, 커뮤니티=목록 전용, 앵커 심층 재사용 금지
fact-checkersonnetFAIL은 disposition까지, 원문 실확인(기억 판정 금지)
ko-writeropus4층·목록 전량·내부 편집 신호 지면 노출 금지
en-writeropus독립 구성권, Culture & Heritage(7섹션), 생략 예외 보고, 언어 장벽 명기
publishersonnet발송판 규격 전체 + 커버 이미지 자격 심사 + 잔재 0 + 판권
writers에게 WebFetch를 주지 않음 — 사실 유입 경로를 clipper·fact-checker로 일원화.
5. 분류 구조 (7섹션 — 2026-07-08 개편)
행사 6카테고리① 전시 ② K-POP·대중음악 ③ 클래식·국악·재즈(+오페라·뮤지컬) ④ 공연예술 ⑤ 스포츠 ⑥ 축제/팝업/도시이벤트
목록 전용 +1⑦ 커뮤니티/강연/밋업 — 메인·심층·픽 상위 자격 없음, 앵커 집계 제외 (catch-all 인플레 교정, B안)
음악 경계장르 기준: 대중음악 계열 vs 무대 음악 계열(오페라·뮤지컬 포함)
판정 절차§1 정의 → §3 판례(P-01~18) → §2 우선순위 → 확신 없으면 low + Peter 리뷰(비차단)
EN 재편성"Culture & Heritage Experiences" 섹션 — section_hint 불변, genre_hint(전통체험/고궁/템플스테이/쿠킹클래스)로 발행 시점 재편성
audience_fit (07-09 신설)독자 적합성 축 resident / visitor / both — 기준서 §5 판정(애매하면 both), 기존 47건 전량 재태깅(both 31·visitor 12·resident 4). EN판 후보 풀 = visitor+both 기계 추출. 빅픽처(독자층×언어 판 구조)의 데이터 기반
상설 제외 (07-09)end_date null(오픈런·연중 상시) = 앵커 집계 제외 (정본 §5.4) — 매주 자동 인플레 방지. 지면 게재는 무관
아카이브 (2026-07-09): 행사 47건(전량 audience_fit 태깅) · 판례 18건(P-13~18 Peter 확정) · W28 국문·영문판 라이브
6. 발송판 규격 (제품 본체)
  • 자기완결 + 컴팩트 유닛·리치 모달 — 4층 한 파일. 커버=압축 히어로+전문 모달(사진들·앵커 상세), 픽=카드+상세 모달(이미지·이유·메타 표·공식 버튼), 심층=카드+멀티 이미지 기획기사 모달, 문화체험(EN)=픽 문법. 텍스트만 있는 모달 금지
  • — 유동 100%·최대 794px·외곽 여백 0 (어느 경로로 열어도 화면 꽉 참)
  • 목록 = 아젠다 행 — 빨간 날짜 / 제목(링크) / 둘째 줄 "가격 · 장소" + FREE 태그, 전량 수록
  • 커버 이미지 자격 — 라이트 타이포 헤더+하단 이미지, 다크 블록 금지. 일러스트·타이포 범벅 포스터는 크롭으로 사진 영역만
  • 형식·톤 통일 — 전 큐레이션 섹션 동일 카드 문법·동일 보이스. 내부 편집 신호·내부 사정 지면 노출 금지. 구분선 이중 룰 금지
  • OG 카드 + GA4 — 카톡 공유 카드, gtag G-J1BKNHTP3Y
  • 판권 + 사업자 정보 — "발행인·편집인 원종석 · weekly@swarm56.com · © 2026 Seoul Weekly" + "주식회사 에스더블유오십육 · 사업자등록번호 220-88-65416" (카카오 심사 증빙 겸)
  • 잔재 0 — 백틱·id 주석 grep 검증
7. 서버·인프라 (2026-07-08 구축)
배포 서버AWS Lightsail 54.116.19.34 (홈피 swarm56.com과 공용, ubuntu·nginx). vhost sites-available/weekly, 웹루트 /var/www/weekly/<주>/. HTTPS=certbot, DNS=Cloudflare(A, DNS only). 새 데몬·DB 추가 금지 (RAM 1GB급)
업로드scripts/upload_site.sh <주> <ko|en> — scp + HTTP 200 자동 검증. 업로드=공개 배포 → Peter 승인 후
클릭 추적/r?e=행사ID&i=호수 → nginx 매핑(weekly_redirects.map) 302, 전용 로그 weekly_clicks.log. 오픈 리다이렉트 차단. 미구현: 링크 리라이팅·주간 집계
유입처 분석 (GA4)발송 링크 UTM (카톡=utm_source=kakao, 이메일=email, 무꼬리표=포워딩 최소치) + GA4 G-J1BKNHTP3Y (체류·스크롤 90%·아웃바운드 — 향상된 측정 기본). 1차 진실 소스는 자체 nginx 로그. 콘솔 설정: Data retention 14개월(필수), Google Signals(선택 — 인구통계, 쿠키 고지 필요), 내부 트래픽 필터(선택). 주간 확인: Realtime / Traffic acquisition(채널별) / Engagement→Pages
공식 메일 (07-09 분리)weekly@swarm56.com(대외, 불변) → Cloudflare 라우팅 → seoulweekly@gmail.com (전용 계정, 2FA — 개인 Gmail 연동 해제). 에이전트 접근 = 집서버 seoul_weekly_data\.env 앱 비밀번호. IMAP·SMTP·라우팅 도착 전 구간 실측 검증. 대량 발신은 미구축(발송 서비스 별도 트랙)
카톡 채널 (07-09 가동)pf.kakao.com/_ztbwX — 비즈 인증 승인(3차). 친구추가=구독. 웰컴메시지(자동·무료)가 신규 구독자에게 현재 호 배달 (실증 오픈율 80%) + 브로드캐스트(수동·15원/건) 화·목 발행 후 — 첫 발송 = 창간 인사(07-09 12:00, 10명). 광고성 20:55~08:00 발송 불가. 관리자센터=business.kakao.com (성별·연령 익명 분포)
집서버 크론hermes 등록 3건 — 수집 월·금 10:00(751c56ccd7e8) / KO 발행 화 07:00(534bc4ef0fba) / EN 발행 목 07:00(7a15d2347a37). 매 실행 git pull, 실패 시 텔레그램 알림, 에이전트 실재 가드, 발행은 텔레그램 승인 게이트(봇 "Seoul Weekly Gate", exit 0/1/2). 수칙(07-09): 실패=중단·보고만, 재량 수리·push 금지 (repo CLAUDE.md) — 쓰기 권한 회수(읽기 전용 토큰) 진행 중
트래픽 리포터 (07-09)VPS 자체 crontab — 화·목 17:00 일간 / 월 10:00 주간 → 텔레그램 @seoulweekly_alert_bot. LLM 없음(셸+curl)·hermes 무관(집서버↔VPS 자격증명 왕래 0). 집계: 봇·내부IP·스캐너 제외, UTM 분해(channel/welcome/chat/cta/무꼬리표=포워딩), 시간대 피크
구독자 저장소 (07-09)집서버 중립 폴더 C:\Users\USER\seoul_weekly_data\subscribers.jsonl이메일 구독자만(카톡은 익명 집계뿐, 0명=정상). 8필드 스키마 + 추론 규칙("구독"=ko/"subscribe"=en, 베타=resident). PII: repo 금지·외부 전송 금지·백업 규칙 (폴더 README = 에이전트 교체 가이드 겸)
SSH집서버 ssh server(172.30.1.28, cmd 셸 — git pull 불가, git은 hermes 담당) / VPS는 Lightsail pem (homepage_project 폴더)
법적 고지개인정보 처리방침 weekly.swarm56.com/privacy.html (국문+영문) — 쿠키·GA·이메일·국외 이전(Google) 고지, 거부 수단, 보호책임자. 전 지면 푸터 링크(규격 8-2). ⚠️ 전문가 검토 트리거: 구독자 규모·광고 계약·개인 단위 데이터 도입 시
시크릿.env gitignore. 수신자 CSV는 서버 로컬만 (repo 금지)
7-2. 서비스 운영 현황 (2026-07-09)
창간2026-07-08 (W28 창간호 KO·EN 라이브). 07-09 12:00 첫 브로드캐스트(창간 인사, 10명) — 이틀차 오픈율 80%(순 8/친구 10), 첫 독자 반응 접수
구독 체계KO = 카톡 채널 추가(주력) + 이메일 옵션 / EN = 이메일 주력 + 카톡 옵션. 안내 = subscribe.html + 발행물 하단 CTA
베타 방침현 가입자 전원 = 베타테스터(지인) — 언어 선택 없이 KO·EN 모두 발송. 채널 분리·가입 폼 보류. "unknown problem은 지금 겪는 게 낫다"
배달 구조신규 = 웰컴메시지(자동) / 기존 = 화·목 브로드캐스트(수동). 이중 발송 방지 — 브로드캐스트의 "새 친구에게도 발송" 끔
운영 절차weekly_ops_runbook.md — 발행일 체크리스트(게이트 승인→검수→브로드캐스트→17시 리포트)·문안 템플릿·수시 응대
결정 원장decisions_ledger.md — 확정·실험 중·보류·판단 대기·트리거 대기. 개발 판단은 이 원장 기준
8. Memory · Provenance 규칙
원문에 없는 사실 날조 금지 · 확인 실패의 통과 처리 금지 · 실패의 대체 결과 생성 금지. 표기: [미확인] [Agent Timeout] [Execution Failed]. 실행 증거주의(완료=디스크 실재+경로) · 행위자 명시(<역할> (Claude Code))
실사례 (2026-07-08): publisher가 커버 지시(데몬슬레이어 포스터)를 이미지 실물 심사 후 규칙 위반으로 거부, 대체 선정 — 판단 근거 전체를 _state.md에 기록하고 Peter 확인 대기로 이관.
9. 용어
발송판
제품 본체. <lang>.email.html, §6 규격의 자기완결 문서. Peter 용어: "HTML판=발송 문서, 홈페이지=웹사이트".
앵커 집계
배분 결정용 집계 (행사 6카테고리만). 1위 = 메인 앵커 카테고리 (기계 도출).
목록 전용 카테고리
커뮤니티/강연/밋업. 목록에는 실리지만 편집 지면 자격·앵커 집계 제외.
Culture & Heritage Experiences
EN판 전용 섹션 (기본 7섹션). genre_hint 기반 발행 시점 재편성 — 데이터 불변.
커버 이미지 자격
사진 > 절제된 키비주얼 > 무이미지 타이포 헤더. 만화풍 일러스트·타이포 범벅 포스터 금지 (크롭 시 사진 영역만).
10. 현재 한계 및 진행 중
Peter 확인 대기 (_state.md·Working Notes)
예인시대 KO 잔존 처리 · 04-0001 재판정 · EN 목록 40행 전수안 · 커버 TWICE 크롭 · audience_fit 판례 미비 4건. (카톡 채널·상설 정책·트래픽 집계는 07-09 해소됨)
hermes 쓰기 권한 회수 — 진행 중
읽기 전용 토큰 교체 (프롬프트 준비 — 별도 세션). 수칙(실패=중단·보고만)은 배포 완료.
클릭 리라이팅 — 미구현
인프라(/r·로그) 가동, publisher 링크 감싸기 미구현. 주간 집계는 VPS 리포터로 해소(§7).
이메일 발송 — 미구현
명단 인프라·메일함 분리는 완료. SMTP 대량 발송 + hermes 폴링 임무 부여 미착수 (이메일 구독자 0명 단계).
목록 범위·문체 — 실험/미확정
"전량 시작 → 클릭 데이터로 조정" (유력안). 문체는 현행 통과 톤 유지 중, 명문화 대기.
로드맵 트리거 대기 (T4~T6)
판 설정화(3번째 판 착수 시) · shell/content 분리(판 확장 직전) · 발송 라우팅(채널 추가 시) — architecture_roadmap_v0.1.md.
기타
KOPIS 승인 대기 · 이미지 저작권 미검증(핫링크) · 마케팅은 메모 단계(이티고 모델, marketing_v0.1.md — 별도 세션 구체화 예정).