# 0610
hermes 플러그인을 claude Fable5으로 만들어보라는 미션이 와서...
1단계:
🤖 우선 제미나이한테 뭐를 해야할지 정리 & 프롬프트 짜기
https://gemini.google.com/share/7ae9bf337621
Gemini - 헤르메스 CLI 설정 및 메신저 연동
Gemini로 생성됨
gemini.google.com
2단계: 프롬프트 정리
🤖 with 다른 제미나이.. 위 계정이 말을 안들어서..
https://gemini.google.com/share/dc86d06c2e60
Gemini - AI 논문 큐레이션 봇 프롬프트
Gemini로 생성됨
gemini.google.com
3단계: claude fable한테 넘기기 & 텔레그램으로 봇 생성 후 토큰 연결
위에 나온 영문 프롬프트 전달 후 나온 결과
안녕하세요! AI 과정 5주차 학습을 위한 "하루 2회, 역할 분담형" 논문 큐레이션 텔레그램 봇을 만들어 드리겠습니다.
코드를 작성하기 전에 잠재적 오류 시나리오(arXiv API 타임아웃/빈 결과, JSON 파손, 중복 발송, 한글 인코딩 깨짐)를 먼저 시뮬레이션하고, 이를 모두 방어하는 구조로 설계한 최종본을 바로 제공합니다. 파일은 ~/paper_curation_bot/ 폴더에 직접 생성해 드릴게요.
실행됨
프로젝트 폴더 생성
폴더를 만들었습니다. 이제 메인 스크립트를 작성합니다.
생성됨 파일 3개
스크립트 문법 검증을 해보겠습니다.
실행됨
paper_bot.py 문법 검사
완성했습니다! ~/paper_curation_bot/ 폴더에 3개의 파일을 생성했고, 문법 검사까지 통과했습니다.
📁 생성된 파일
파일 역할
paper_bot.py 메인 봇 스크립트 (큐레이션 로직 + 스케줄러)
requirements.txt 의존성 (requests, APScheduler)
com.......paperbot.plist macOS launchd 자동 실행 설정
🔄 자가 개선 루프(Self-Improvement Loop) 결과 보고
요청하신 대로 코드를 출력하기 전에 잠재적 오류를 내부적으로 시뮬레이션했고, 다음과 같이 자가 수정을 완료했습니다.
arXiv API 장애 (타임아웃 / 빈 결과 / 레이트 리밋)
요청당 15초 타임아웃 + 3회 재시도(지수적 백오프) 적용 — paper_bot.py:354 부근의 fetch_arxiv_papers
키워드 1개가 실패하면 그 주차의 다음 키워드로 자동 전환하고, 키워드 간 3초 간격(arXiv 공식 권장)을 지킵니다.
모든 키워드가 실패하면 역사적 필독 논문으로 폴백 발송 → 어떤 경우에도 저녁 메시지가 비지 않습니다.
JSON 파싱 오류 (이력 파일 파손)
파손 감지 시 파일을 삭제하지 않고 sent_history.corrupt.타임스탬프.json으로 백업 후 새로 시작합니다.
저장은 임시 파일에 쓴 뒤 os.replace로 교체하는 원자적 쓰기 방식이라, 저장 도중 프로세스가 죽어도 파일이 깨지지 않습니다.
중복 발송
아침/저녁 발송이 하나의 통합 이력(sent_history.json)을 공유하며, arXiv ID뿐 아니라 정규화된 제목(소문자화 + 특수문자 제거)으로도 비교해 표기 차이로 인한 중복까지 차단합니다.
텔레그램 발송이 실패하면 이력에 기록하지 않으므로, 해당 논문은 다음 기회에 다시 발송됩니다.
추가 방어 사항
한글·이모지 깨짐 방지: sys.stdout.reconfigure(encoding="utf-8") + 모든 파일 I/O encoding="utf-8" + plist에 PYTHONIOENCODING/LANG 환경변수 고정
텔레그램 4096자 제한 절단, HTML 파싱 오류 시 평문으로 재시도
맥이 잠들었다 깨어난 경우 misfire_grace_time=3600으로 정시에서 1시간 이내면 밀린 발송을 실행
디스패치 함수 전체를 try-except로 감싸 단발 오류로 스케줄러 자체가 죽지 않도록 설계
⚙️ 핵심 동작 방식
🌅 오전 9시: 내장된 16편의 역사적 필독 논문(Transformer, ResNet, BERT, GPT-1/2/3, AlphaGo, LSTM, GAN, AlexNet 등 — 한글 3줄 요약 내장)에서 미발송 논문을 랜덤 선택해 발송. 전부 소진되면 리스트 추가 안내 메시지를 보냅니다.
🌆 오후 6시: WEEKLY_TOPICS 테이블에서 현재 주차 키워드를 가져와 arXiv 검색 → 미발송 논문 랜덤 선택 → Hermes CLI로 한글 3줄 요약 생성 후 발송.
주차 자동 전환: COURSE_START_DATE를 2026-05-11(1주차 월요일)로 설정해 두어 오늘 기준 자동으로 5주차가 계산됩니다. 6주차가 되면 자동으로 RAG 키워드로 전환됩니다. 수동 고정을 원하면 MANUAL_WEEK = 5로 설정하세요.
Hermes CLI 연동: generate_korean_summary()가 hermes -p "<프롬프트>" 형태로 호출합니다. 본인의 Hermes CLI 사용법이 다르면 파일 상단의 HERMES_CLI_PATH, HERMES_PROMPT_FLAG만 수정하면 됩니다. Hermes가 없거나 실패하면 영문 초록 발췌로 폴백합니다.
🚀 배포 가이드 (단계별)
1단계: 텔레그램 봇 준비
텔레그램에서 @BotFather 검색 → /newbot 입력 → 봇 이름 설정 → 토큰 발급받기
생성된 봇에게 아무 메시지나 하나 보낸 뒤, 브라우저에서 아래 주소를 열어 chat.id 값을 확인:
https://api.telegram.org/bot<토큰>/getUpdates
2단계: 가상환경 생성 및 의존성 설치
cd ~/paper_curation_bot
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
3단계: 설정값 입력
com........paperbot.plist의 ★여기에_봇_토큰_입력★, ★여기에_채팅_ID_입력★ 두 곳을 본인 값으로 교체하세요. (환경변수로 주입되므로 코드에 토큰을 직접 적지 않아도 됩니다)
터미널 테스트 시에는 export TELEGRAM_BOT_TOKEN=... 방식으로 주입하면 됩니다.
4단계: 테스트 발송 (스케줄 기다릴 필요 없이 즉시 실행)
export TELEGRAM_BOT_TOKEN="본인토큰"
export TELEGRAM_CHAT_ID="본인채팅ID"
.venv/bin/python paper_bot.py --test-morning # 아침 발송 테스트
.venv/bin/python paper_bot.py --test-afternoon # 오후(arXiv) 발송 테스트
5단계: launchd로 상시 구동 (✅ 추천)
macOS에서는 nohup/tmux보다 launchd가 정석입니다. 재부팅·크래시 시 자동 재시작되기 때문입니다.
cp ~/paper_curation_bot/com.......paperbot.plist ~/Library/LaunchAgents/
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.......paperbot.plist
# 상태 확인
launchctl list | grep paperbot
tail -f ~/paper_curation_bot/logs/paper_bot.log
# 중지/제거가 필요할 때
launchctl bootout gui/$(id -u)/com......paperbot
대안: tmux / nohup (간단하지만 재부팅 시 수동 재시작 필요)
# tmux 방식 — 세션에 다시 들어가 로그를 볼 수 있어 디버깅에 좋음
tmux new -s paperbot
.venv/bin/python paper_bot.py # 실행 후 Ctrl+B, D 로 빠져나오기
tmux attach -t paperbot # 다시 접속
# nohup 방식 — 가장 간단
nohup .venv/bin/python paper_bot.py > logs/nohup.log 2>&1 &
⚠️ M3 Pro 맥북 사용 시 주의사항
맥북 뚜껑을 닫으면 잠자기 상태가 되어 9시/18시에 스케줄이 실행되지 않을 수 있습니다. 대처법:
전원 연결 + 뚜껑 닫은 상태 유지: 시스템 설정 → 잠금 화면에서 디스플레이 끄기를 허용하되, caffeinate -s &로 시스템 잠자기를 방지
또는 발송 시각 직전에 깨어나도록 예약: sudo pmset repeat wakeorpoweron MTWRFSU 08:58:00
잠들었다 깨어난 경우라도 정시에서 1시간 이내면 misfire_grace_time 설정 덕분에 밀린 발송이 자동 실행됩니다.
궁금한 점이나, Hermes CLI의 실제 호출 형식(-p 플래그가 맞는지 등)을 알려주시면 그에 맞게 바로 조정해 드릴게요. 즐거운 5주차 학습 되세요! 📚
4단계: 총 13주차이고, 지금이 5주차인데 못 알아 듣는것 같아서 그냥 커리큘럼을 다 보냄
진도표 감사합니다! 주신 일정을 보니 두 가지를 고쳐야 합니다:
주차 계산 방식: 주차 시작일이 화/월요일로 불규칙해서(1주차 5/12 화 → 2주차 5/18 월은 6일 간격, 3주차 5/26 화는 8일 간격) 단순 "시작일 ÷ 7" 계산은 오차가 납니다. → 주차별 실제 시작일 테이블로 교체하겠습니다.
키워드 테이블: 상세 커리큘럼에 맞춰 arXiv 검색이 더 잘 되는 키워드로 보강하겠습니다 (예: 5주차에 Transfer Learning·Fine Tuning 추가, 6주차에 HyDE·RAGAS 추가 등).
바로 수정하겠습니다.
편집됨 파일 1개, 실행됨 명령 3개
수정 완료했고, 실제 동작 검증까지 모두 통과했습니다.
저장됨 메모리 2개
실행됨
텔레그램 getUpdates로 채팅 ID 조회
모든 수정과 검증을 마쳤습니다. 정리해 드릴게요.
✅ 수정 완료 내역
1. Hermes CLI 사용 확인 — 네, 맞습니다. 오후 발송 시 arXiv 논문의 한글 3줄 요약을 hermes -p "<프롬프트>" 호출로 생성합니다. 만약 실제 Hermes CLI의 플래그가 -p가 아니라면 paper_bot.py 상단의 HERMES_PROMPT_FLAG만 바꾸면 됩니다.
2. 주차 계산을 실제 진도표 기반으로 교체 — 주신 진도표를 보니 개강 요일이 화/월로 불규칙해서(1주차 5/12 화, 2주차 5/18 월, 3주차 5/26 화) 기존의 "7일 나눗셈" 방식은 오차가 생길 수 있었습니다. 13개 주차의 실제 개강일 테이블(WEEK_START_DATES)로 교체하여, 오늘 날짜 이전에 시작한 가장 늦은 주차를 반환하도록 했습니다. 13주차 이후에는 계속 13주차로 유지됩니다.
3. 키워드 테이블을 상세 커리큘럼에 맞게 보강 — arXiv에서 검색이 잘 되는 학술 용어 위주로 재구성했습니다. 예를 들어:
5주차(현재): Transfer Learning, Fine Tuning, ResNet, VGG, Transformer, LSTM, Pre-trained Model, Early Stopping, Hyperparameter Tuning, Overfitting
6주차(다음 주 월요일부터 자동 전환): Retrieval-Augmented Generation, Semantic Chunking, Hybrid Search, Reranking, HyDE, RAGAS, HNSW 등
🧪 검증 결과 (실제 실행 확인)
가상환경(.venv) 생성과 의존성 설치까지 끝냈고, 두 가지를 실제로 테스트했습니다:
주차 자동 판정: 7개 날짜 케이스 전부 통과 — 오늘(6/10) → 5주차, 6/15 → 6주차, 8/3 이후 → 13주차 유지 ✓
arXiv API 실제 호출: 5주차 키워드 "Transfer Learning"으로 25건 정상 검색 ✓
📌 마지막 한 단계: 채팅 ID
토큰은 plist에 잘 넣으셨는데, getUpdates를 조회해 보니 결과가 비어 있습니다("result": []). 아직 봇에게 메시지를 보내지 않으셨기 때문입니다.
텔레그램에서 만드신 봇을 찾아 아무 메시지나 하나 전송 (/start 등)
저에게 "채팅 ID 확인해줘"라고 하시면 다시 조회해서 plist까지 채워 드리겠습니다.
채팅 ID만 들어가면 launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com......paperbot.plist로 바로 가동할 수 있습니다.
5단계: 텔레그람 id를 몰라서 (토큰에도 나와있는데,, 바보) 어떻게 하냐고 물어봄
그랬더니 알아서 다 해줌...
4단계 진행 전에 한 가지 막힌 부분이 있습니다. 정리하면:
현재 상태 점검 결과
✅ 봇 토큰: 정상입니다. getMe 조회 결과 봇이 잘 만들어져 있어요 (이름: Reasercher, 아이디: @reasercher_bot)
❌ 채팅 ID: plist에 봇 이름(reasercher_bot)을 넣으셨는데, 여기엔 숫자 ID가 들어가야 합니다. 봇 이름은 "보내는 사람"이고, 채팅 ID는 "받는 대화방 번호"라서 다른 값이에요.
❌ 그 숫자를 알아내려고 getUpdates를 조회했더니 결과가 비어 있습니다 — 아직 사용자님이 봇에게 첫 메시지를 보내지 않으셨기 때문입니다. 텔레그램 봇은 먼저 말을 걸어온 상대에게만 메시지를 보낼 수 있어서, 이 과정이 꼭 필요합니다.
지금 하실 일 (1분 소요)
휴대폰이나 맥의 텔레그램 앱에서 @reasercher_bot 검색
대화방에 들어가서 하단의 시작(Start) 버튼을 누르거나 아무 메시지나 전송 (안녕 같은 것도 OK)
끝나면 저에게 **"보냈어"**라고만 말씀해 주세요.
그러면 제가 이어서 자동으로 처리하겠습니다:
getUpdates로 숫자 채팅 ID 조회
plist의 TELEGRAM_CHAT_ID를 그 숫자로 교체
4단계 테스트 발송 실행 — --test-morning(역사적 논문)과 --test-afternoon(arXiv 5주차 논문)을 제가 직접 돌려서 텔레그램으로 실제 메시지가 도착하는지 확인
테스트까지 통과하면 마지막 5단계(launchd 등록)도 바로 이어서 해 드릴게요.
스크린샷 보니 봇에게 /start를 잘 보내셨네요! 채팅 ID는 어디서 따로 보는 게 아니라 API로 조회하는 건데, 제가 바로 확인해 드릴게요.
실행됨 명령 4개
감시를 시작했습니다. 📡
채팅 ID가 어디서 확인되는지 궁금하셨죠 — 텔레그램 앱 화면 어디에도 표시되지 않고, 봇 API(getUpdates)로 조회해야만 보이는 값입니다. 그래서 제가 대신 조회하고 있는 거예요. (참고로 텔레그램에서 @userinfobot에게 말을 걸면 본인의 숫자 ID를 바로 알려주는 방법도 있습니다. 개인 대화방의 채팅 ID는 본인 사용자 ID와 같은 숫자입니다.)
지금 봇에게 메시지 하나만 더 보내주시면, 도착하는 즉시 제가:
숫자 채팅 ID 추출
plist의 TELEGRAM_CHAT_ID 교체
4단계 테스트 발송(아침/오후) 실행
까지 한 번에 진행하겠습니다.
이제 5단계 — launchd에 등록해서 상시 가동을 시작합니다.
실행됨 명령 2개
🎉 모든 단계가 완료됐습니다! 봇이 지금 가동 중입니다.
진행 결과 요약
1. 채팅 ID 해결 — 새로 보내주신 메시지("Id 알려줘")가 잡혀서 채팅 ID .... 을 확인했고, plist에 반영했습니다. 채팅 ID는 텔레그램 앱 화면에는 안 나오고 이렇게 API로만 조회할 수 있는 값이에요.
2. 4단계 테스트 발송 — 둘 다 성공 ✅ 지금 텔레그램을 열어보시면 봇에게서 메시지 2개가 도착해 있을 겁니다:
🌅 아침 테스트: Batch Normalization (역사적 필독 논문)
🌆 오후 테스트: PyramidTNT (5주차 "Transformer" 키워드로 arXiv에서 실시간 검색)
3. Hermes 연동 수정 — 코드의 호출 플래그가 잘못되어 있어서 -p → -z로 고쳤고, launchd 환경에서도 찾을 수 있게 절대 경로(~/.local/bin/hermes)로 바꿨습니다. 다만 한 가지 발견한 게 있는데:
⚠️ Hermes가 localhost:8080의 로컬 MLX 모델 서버(Qwen3.5-9B)를 사용하도록 설정되어 있는데, 그 서버가 현재 꺼져 있습니다. 그래서 방금 오후 테스트는 한글 요약 대신 영문 초록 발췌(폴백)로 나갔어요. 평소 그 서버를 어떻게 켜시는지 알려주시면 봇 시작 시 자동으로 함께 뜨도록 만들어 드릴 수 있습니다. 서버만 켜져 있으면 별도 수정 없이 한글 3줄 요약이 나갑니다.
4. 5단계 launchd 등록 완료 ✅ 서비스가 등록되어 지금 실행 중입니다 (PID ....). 로그에 "Scheduler started"가 찍혔고, 이제부터:
매일 09:00 역사적 필독 논문, 18:00 주차별 arXiv 논문이 자동 발송됩니다
맥을 재부팅해도 로그인하면 자동으로 다시 시작됩니다 (KeepAlive 설정)
참고 명령어
tail -f ~/paper_curation_bot/logs/paper_bot.log # 실시간 로그 보기
launchctl bootout gui/$(id -u)/com......paperbot # 봇 중지
마지막 당부: 맥북 뚜껑을 닫고 잠자기 상태면 정시 발송이 안 될 수 있으니, 전원 연결 상태로 두시거나 발송 시각 전 깨어나도록 sudo pmset repeat wakeorpoweron MTWRFSU 08:58:00 설정을 고려해 보세요. (잠들었다 1시간 이내에 깨어나면 밀린 발송은 자동 실행됩니다)

6단계: 본인이 터미널까지 다 실행한 것 같아서, 내가 텔레그램으로 알람 받을 때 따로 터미널 켜놔야하는 상태냐고 물어봄
제가 이미 실행해 놓은 상태고, 터미널을 켜둘 필요가 없습니다. 지금 살아있는지 한 번 더 확인해 드릴게요.
실행됨
봇 프로세스 가동 상태 확인
네, 지금 이미 실행 중입니다. 터미널을 열어둘 필요가 전혀 없어요.
확인 결과 봇 프로세스(PID 29493)가 10분째 정상 가동 중입니다.
왜 터미널이 필요 없나요?
아까 5단계에서 nohup이나 tmux 방식이 아니라 launchd 방식으로 등록했기 때문입니다. launchd는 macOS의 시스템 서비스 관리자라서, 봇이 터미널과 무관하게 백그라운드 서비스로 돌아갑니다:
✅ 터미널을 다 닫아도 계속 실행됩니다
✅ 봇이 오류로 죽으면 자동으로 재시작됩니다 (KeepAlive)
✅ 맥을 재부팅해도 로그인하면 자동으로 다시 시작됩니다 (RunAtLoad)
딱 하나만 신경 쓰시면 됩니다
맥이 잠자기 상태가 아니어야 9시/18시 정각에 발송됩니다. 맥북 뚜껑을 닫아두면 잠들어서 발송이 밀릴 수 있어요 (깨어난 시점이 정시로부터 1시간 이내면 밀린 발송이 자동 실행되긴 합니다). 데스크탑처럼 항상 깨어 있는 환경이면 신경 쓸 것 없고, 맥북이라면 전원을 연결해 두시는 걸 추천합니다.
잘 돌아가는지 궁금할 때는 터미널에서 이것만 치시면 됩니다:
tail -f ~/paper_curation_bot/logs/paper_bot.log
내일 아침 9시에 첫 정기 발송이 올 겁니다. 📬
# 0611 (1)
아침 9시에 온다길래 기다렸지만 안와서..
1단계: 터미널도 클로드가 열어놨던거라 "9시5분인데 안왔어"라고 클로드에게 발송.
🤖 문제는 컴퓨터를 끄면서 시간도 멈춰버림
바로 확인해 보겠습니다. 로그와 프로세스 상태부터 볼게요.
실행됨 명령 5개, 편집됨 파일 1개, 생성됨 파일 2개
✅ 문제 해결 완료! 오늘 아침 논문(GAN)도 방금 보내드렸으니 텔레그램을 확인해 보세요.
무슨 일이었나
맥은 9시에 깨어 있었는데도(07:59에 깨어남) 발송이 안 됐습니다. 원인은 macOS의 특성인데, 맥이 잠자는 동안 파이썬 내부 타이머도 같이 멈춥니다. 봇이 어젯밤 "9시까지 8시간 51분 남았다"고 알람을 맞춰놨는데, 밤새 맥이 잠든 약 7시간 동안 그 카운트다운이 정지해서 알람이 오후 4시쯤으로 밀려버린 거예요.
어떻게 고쳤나
시간 관리를 파이썬(APScheduler)이 아니라 macOS launchd에 직접 맡기는 구조로 바꿨습니다:
이전: 봇이 24시간 떠 있으면서 스스로 시간을 재는 방식 → 잠자기에 취약 ❌
현재: launchd가 매일 09:00 / 18:00에 봇을 깨워서 1회 발송 후 종료시키는 방식 ✅
launchd 예약은 시스템 달력 기준이라 잠자기의 영향을 받지 않고, 잠자기 때문에 정시를 놓쳐도 맥이 깨어나는 즉시 밀린 발송을 실행해 줍니다.
새로 등록된 서비스 2개를 확인했습니다:
com.hwangsubin.paperbot.morning — 매일 09:00 (예약 등록 확인 완료)
com.hwangsubin.paperbot.afternoon — 매일 18:00
이제 동작 방식
상황 (9시/18시 기준) 결과
맥이 깨어 있음 (화면 잠금 포함) 정시에 발송 ✅
맥이 잠자는 중 다음에 깨어나는 순간 바로 발송 ✅
맥이 완전히 꺼져 있음 그날 발송은 건너뜀 ❌
그래서 어제 말씀드린 잠자기 걱정도 거의 사라졌습니다 — 이제 뚜껑을 닫고 잤더라도 아침에 맥북을 여는 순간 논문이 도착합니다. 오늘 저녁 18:00 발송이 새 구조의 첫 자동 실행이니, 그때 메시지가 오는지 봐주시면 완벽합니다. 📬

이제 18시에도 잘 오는지 다시 한 번 확인하기.....
2단계: 근데 터미널을 클로드가 잡고 있어서, 어떻게 내가 수동으로 작업할 수 있는지 궁금해서 물어봄
근데 궁금한게, 지금 너랑 한 대화창을 꺼도 터미널은 켜져있어? 그렇다면 만약 터미널 실행을 종료하려면 어떻게 해야해? 실행하진 말고 그냥 방법만 글로 설명해줘
좋은 질문이에요. 결론부터: 이 대화창(터미널)을 꺼도 봇은 계속 동작합니다. 둘은 완전히 분리되어 있어요.
왜 분리되어 있나
어제 구조를 바꾸면서 봇은 더 이상 "켜져 있는 프로그램"이 아니게 됐습니다. 지금은 macOS 시스템(launchd)의 예약 작업 목록에 등록된 상태예요. 비유하면:
이전 방식 = 알람 시계를 들고 밤새 깨어 있는 직원 (터미널/프로세스가 떠 있어야 함)
현재 방식 = macOS 달력에 적어둔 일정 (9시/18시가 되면 macOS가 알아서 봇을 깨워 발송시키고, 끝나면 봇은 스스로 종료)
예약 정보는 ~/Library/LaunchAgents/ 폴더의 설정 파일 2개에 저장되어 있어서, 이 대화를 닫든, 터미널을 다 끄든, 심지어 맥을 재부팅해도 일정은 유지됩니다. 평소에는 봇 프로세스가 아예 떠 있지도 않습니다 (발송하는 몇 초 동안만 잠깐 실행됐다가 사라져요).
봇 발송을 멈추고 싶을 때 (실행 방법만 설명)
터미널을 열고 아래 두 줄을 입력하면 예약이 해제됩니다:
launchctl bootout gui/$(id -u)/com.....paperbot.morning
launchctl bootout gui/$(id -u)/com......paperbot.afternoon
다만 위 명령만으로는 설정 파일이 남아 있어서, 환경에 따라 다음 로그인 때 다시 살아날 수 있습니다. 완전히 제거하려면 설정 파일까지 지워주세요:
rm ~/Library/LaunchAgents/com......paperbot.morning.plist
rm ~/Library/LaunchAgents/com.......paperbot.afternoon.plist
나중에 다시 켜고 싶을 때
원본 파일은 ~/paper_curation_bot/ 폴더에 그대로 있으니, 다시 복사하고 등록만 하면 됩니다:
cp ~/paper_curation_bot/com.hwangsubin.paperbot.*.plist ~/Library/LaunchAgents/
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.....paperbot.morning.plist
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com......paperbot.afternoon.plist
현재 등록 상태가 궁금할 때
launchctl list | grep paperbot
두 줄(morning, afternoon)이 나오면 예약이 살아 있는 것이고, 아무것도 안 나오면 해제된 상태입니다. 앞자리 숫자가 -로 표시되는 건 정상이에요 — "지금 실행 중은 아니지만 예약은 등록됨"이라는 뜻입니다.
# 0611 (2)
오후 6시에 와야할 메세지가 19:36에 와서 질문..
🤖 결론부터: launchd는 18:00 정각에 봇을 정상적으로 실행했습니다. 문제는 그 시각에 맥북이 배터리 상태로 잠들어 있어서, 봇이 1시간 36분 동안 "기어가며" 일을 마쳤기 때문입니다.
맞아요, 18:00 예약입니다. 왜 19:36에 왔는지 로그를 보고 정확히 분석해 드릴게요.
실행됨
오후 발송 로그와 잠자기 기록 대조
원인을 정확히 찾았습니다. 결론부터: launchd는 18:00 정각에 봇을 정상적으로 실행했습니다. 문제는 그 시각에 맥북이 배터리 상태로 잠들어 있어서, 봇이 1시간 36분 동안 "기어가며" 일을 마쳤기 때문입니다.
타임라인 재구성 (로그 + 시스템 기록 대조)
시각 일어난 일
18:00 launchd가 예약대로 봇 실행 ✅ — 하지만 맥은 잠자는 중
18:07 → 18:24 → 18:39 → 19:03 arXiv 접속 시도가 계속 실패. 원래 515초 간격인 재시도가 **1520분 간격**으로 벌어짐
19:03 짧게 깨어난 틈에 "Fine Tuning" 키워드 검색 성공 (25건 확보)
19:36:34 맥이 잠깐 깨어남 (시스템 기록 확인)
19:36:36 그 2초의 틈에 텔레그램 발송 성공 → 메시지 도착 📬
왜 이렇게 됐나
맥북은 잠자는 동안에도 몇 분마다 2초 정도씩 살짝 깨어나는데(DarkWake — 시스템 유지보수용), 이때의 특징이 두 가지입니다:
인터넷이 거의 안 됩니다 — 로그에 Failed to resolve 'export.arxiv.org'(DNS 실패)가 반복적으로 찍혀 있어요. 잠자기 중엔 Wi-Fi가 제대로 동작하지 않기 때문입니다.
봇 프로세스는 그 2초씩만 실행됩니다 — 그래서 "재시도 → 다시 잠듦 → 15분 뒤 또 2초 실행 → 재시도..."를 반복하며 시간이 늘어진 겁니다.
그러다 19:36의 짧은 깨어남 순간에 마침 네트워크가 잡혀서 발송에 성공한 거예요. 역설적으로 재시도/폴백 로직 덕분에 발송이 누락되지 않고 결국 도착한 것이라, 봇 입장에서는 설계대로 버텨낸 셈입니다.
정시(18:00)에 받으려면
발송 시각에 맥이 깨어 있기만 하면 됩니다. 어제 말씀드린 조합 그대로예요:
전원 어댑터 연결 + 뚜껑 열어둔 채 화면 잠금(Ctrl+Cmd+Q) + "디스플레이가 꺼져 있을 때 자동으로 잠자기 방지" 설정 ON
뚜껑을 닫아두는 날은 → 정시는 놓치지만, 맥북을 여는 순간 밀린 논문이 도착합니다 (오늘처럼 운 좋게 잠자기 중 틈새 발송이 될 수도 있고요)
원하시면 개선할 수 있는 부분 (선택)
지금 구조도 결국 도착은 하지만, "잠자기 중 틈새 실행" 때 네트워크가 안 되는 상태로 재시도를 소모하는 게 비효율적이긴 합니다. 봇 시작 시 "네트워크가 연결될 때까지 대기" 단계를 추가하면, 깨어나는 순간 곧바로 깔끔하게 발송되도록 만들 수 있어요. 필요하시면 말씀해 주세요 — 분석만 원하신 것 같아 일단 코드는 건드리지 않았습니다.
더 고쳐볼까 싶지만
우선은 다른게 우선이니까.. 여기서 마무리
더 추가할게 생기면 새로 글을 적어야겠다
'AI' 카테고리의 다른 글
| 클로드 사용량 잔디심기 (0) | 2026.06.24 |
|---|---|
| hermes ai - #2 mlx-community/Qwen3.5-9B-OptiQ-4bit 설치하기 & 텔레그램 연결 (0) | 2026.06.10 |
| MLX #2 multi_layer_perceptron test 해보기 (0) | 2026.06.09 |
| MLX #1 linear regression test 해보기 (0) | 2026.06.09 |
| hermes ai - #1 설치하기 (0) | 2026.06.09 |