GPTERS 23기 에이전트하네스 2주차 · 기본과제(스킬 분해) + 확장과제(Proof·Gate)
매일 아침 브리핑을 보내주는 파이프라인 5개를 쪼개보다가, 6개월째 못 보고 있던 구멍을 찾은 이야기
*이 글을 2주차에 쓰여지고 3주차에 올려서 현재 상태와 다를 수 있습니다.
1. 하려던 일
저는 아침마다 에이전트가 요약해준 것들을 보고 있습니다.
그래서 소스마다 하나씩 자동화를 만들었습니다. 지금 4개가 돌아갑니다.
[⚠️ 아래 블록은 붙여넣으면 깨짐 — 이 부분은 캡처/PNG 이미지로 대체해서 업로드]
07:40 유튜브 9개 채널 신규 영상 + 자막
07:45 스터디 사례글 사이트맵 스윕
08:00 드라마 커뮤니티 반응
주간 소설 랭킹각자 긁어와서, 에이전트가 요약하고, 저한테 텔레그램으로 보내줍니다.
2. 흔들린 지점 — 보고가 한 번도 안 왔다
처음엔 파이프라인마다 자기가 알아서 보고하게 만들었습니다. 자연스럽죠. 자기가 만들었으니 자기가 보고한다.
그런데 사고가 났습니다. 기록을 찾아보니 이렇게 적혀 있더군요.
"에이전트의 보고가 webhook 로그로만 가고 나에게 한 번도 도착하지 않았다."
에이전트는 매일 성실하게 일하고 있었습니다. 요약도 잘 썼고요. 그런데 그 결과를 저한테 보내는 마지막 한 걸음에서, 로그 파일에만 쓰고 끝나고 있었습니다.
더 무서운 건 이걸 알아채는 데 시간이 걸렸다는 겁니다. 아무 일도 안 일어났으니까요. 에러도 안 났고, 경고도 없었고, 그냥 조용했습니다.
3. 분해 기준 — 보고는 수집과 다른 일이었다
이번 주 스터디에서 배운 게 이겁니다. 나누는 기준은 "고치는 자료도, 확인 방법도, 실패 원인도 다를 때"라는 것.
보고를 놓고 보니 정확히 그랬습니다.
수집
보고
실패 원인
사이트 구조 변경, 차단
전송 경로, 인증
확인 방법
긁어온 원문
내 폰에 왔는가
고치는 자료
스크래퍼 코드
전송 설정
그래서 보고를 통째로 떼어냈습니다. 매일 08:30에 한 번만 도는 별도 작업으로요.
떼어낸 김에 하나 더 붙였습니다. 보고만 하는 게 아니라 오늘 산출물이 없으면 경고를 보내게 했습니다. 침묵당하는 게 제일 무서웠으니까요.
4. 연결 구조
쪼개고 나니 이렇게 됐습니다.
[⚠️ 아래 블록은 붙여넣으면 깨짐 — 이 부분은 캡처/PNG 이미지로 대체해서 업로드]
[콘텐츠 우산 · 라우터]
│
┌────┬──────┼──────┬────┐
유튜브 사례글 드라마 뉴스 웹소설 ← ① 수집기 (소스마다 1개, 교체 가능)
└────┴───┬──┴──────┴────┘
▼
공용 inbox (약속된 형식)
▼
② 작성기 (에이전트)
▼
저장소 (옵시디언)
▼
③ 배달·감시 (08:30, 딱 1개) ──▶ 내 텔레그램
│
(없거나 이상)
▼
④ 진단·수리 ──▶ 문제 있는 수집기로 되돌림각 칸에 명찰을 붙였는데, 그중 제일 중요한 게 "하지 않는 일" 칸이었습니다.
수집기: 요약·판단을 하지 않는다. 원문 그대로 넘긴다.
작성기: 직접 나에게 보고하지 않는다. ← 6월 사고의 원인이 여기 적혀 있어야 했다
배달: 내용을 새로 쓰지 않는다. 있는 것을 확인해 전달만 한다.
진단: 추측으로 답하지 않는다. 로그를 보기 전에는 원인을 말하지 않는다.
5. 실행 근거 — 분해가 옳았다는 증거 하나, 아직 틀렸다는 증거 하나
옳았다는 증거
지난주에 스터디 사례글 다이제스트를 새로 추가했습니다. 그때 배달을 새로 만들지 않았습니다. 08:30에 "합류"만 했습니다.
이게 이번 주 수업의 핵심이었습니다.
재사용하려고 쪼갠 게 아니라, 실패를 고치려다 경계가 생겼고, 재사용은 나중에 발견됐다.
저는 6월에 이걸 이미 겪었고, 이번 주에 그 이름을 배운 셈입니다.
그런데 구멍이 남아 있었다
확장과제(Proof·Gate)를 하려고 배달 스크립트를 열어봤습니다. 그리고 이걸 발견했습니다.
상황
브리핑에 뜨는 문장
오늘 진짜 새 영상이 없음
"오늘 신규 영상 없음"
수집이 깨져서 0건
"오늘 신규 영상 없음"
글자가 똑같습니다. 6개월 동안 저는 이 문장을 보면서 "오늘은 없나 보네" 하고 넘겼습니다. 그게 고장이었을 수도 있는데요.
더 심한 것도 있었습니다. 파일은 있는데 내용 파싱이 0건이면, 코드가 이렇게 되어 있었습니다.
[⚠️ 아래 블록은 붙여넣으면 깨짐 — 이 부분은 캡처/PNG 이미지로 대체해서 업로드]
if not items:
return "" # ← 섹션이 통째로 사라짐경고도 없고 "없음" 표기도 없이, 그냥 조용히 없어집니다.
고친 방법 — 증거를 요구하기
수집기를 하나하나 뜯어고칠까 하다가 그만뒀습니다. 4개를 다 건드리면 위험하니까요.
대신 이미 있는 증거를 쓰기로 했습니다. 자동화 도구에 실행 기록이 남아 있거든요. 배달 쪽에서 그걸 조회하게 했습니다. 파일 한 개만 고쳤습니다.
[⚠️ 아래 블록은 붙여넣으면 깨짐 — 이 부분은 캡처/PNG 이미지로 대체해서 업로드]
실행 성공 + 결과 0건 → "신규 없음 (수집 정상 확인)"
실행 기록 없음 → ⚠️ 오늘 수집 실행기록 없음 (스케줄 점검)
실행 실패 → ⚠️ 수집 실행 실패 (로그 확인)
증거 확인 불가 → 종전 문구 + "(확인 불가)" ← 경고를 지어내지 않는다마지막 줄이 중요합니다. 증거를 못 구했을 때 경고를 만들어내면, 경고가 무의미해집니다.
그리고 제가 만든 게이트가 바로 오탐을 냈습니다
돌려봤더니 이렇게 나왔습니다.
[⚠️ 아래 블록은 붙여넣으면 깨짐 — 이 부분은 캡처/PNG 이미지로 대체해서 업로드]
YouTube 07:40 -> missing
GPTers 07:45 -> missing
Drama 08:00 -> missing셋 다 멀쩡히 돌아간 날인데 전부 "실행 안 됨"이라고 판정했습니다. 원인을 파보니:
[⚠️ 아래 블록은 붙여넣으면 깨짐 — 이 부분은 캡처/PNG 이미지로 대체해서 업로드]
실제 기록: 2026-07-28T22:45:00Z ← 협정세계시(UTC)
내 코드 : 앞 10자리가 오늘인가? → "07-28" ≠ "07-29" → 실행 안 됨한국시간 아침 7시 45분은 세계시로 전날 밤 10시 45분입니다. 제가 시차를 계산 안 하고 글자만 비교했던 겁니다. 고쳤더니 셋 다 정상으로 잡혔습니다.
이게 제일 값진 순간이었습니다. 검증 장치를 새로 달면, 그 장치부터 의심해야 한다는 걸 몸으로 배웠거든요. 만약 테스트 안 하고 그냥 켰으면, 저는 내일 아침부터 매일 가짜 경고 3개를 받았을 겁니다. 그리고 며칠 지나면 경고를 무시하기 시작했겠죠.
검증 결과
확인한 것
방법
결과
3개 소스 실행 증거 조회
실제 실행
통과 (시차 수리 후)
없는 대상 → 경고 발생
실제 실행
통과
4가지 경로 문구 렌더링
시뮬레이션
통과
라이브 브리핑 출력
실제 실행
통과
실제 실패 상황에서의 경고
—
아직 확인 못 함 (실패가 날 때 확인 예정)
마지막 줄을 굳이 남긴 이유는, 이번 스터디에서 배운 것 중 하나가 "수동으로 본 것을 실행 검증처럼 보고하지 않는다"였기 때문입니다.
6. 배운 점
하나. 침묵을 성공으로 읽지 않기.
봇이 조용한 건 두 가지입니다. 할 일이 없었거나, 죽었거나. 이 둘을 구분하는 신호가 없으면 자동화는 어느 날 조용히 멈춰 있습니다.
둘. 쪼개야 빈칸이 보인다.
한 덩어리였을 때는 이 문제가 아예 안 보였습니다. 배달을 별도 책임으로 떼어내고 나서야 "배달은 무엇을 근거로 정상이라 판단하지?" 라는 질문이 생겼고, 근거가 없다는 걸 알았습니다.
셋. 새로 단 게이트는 정상 케이스부터 걸어봐라.
원본을 떨어뜨리는 게이트는 게이트가 아니라 고장입니다. 저는 이걸 다른 작업에서 한 번 크게 겪고도 또 밟았습니다.
넷. 다 고치지 않아도 된다.
수집기 4개를 뜯어고칠 뻔했는데, 이미 있는 실행 기록을 쓰니 파일 하나로 끝났습니다. 스터디장님이 계속 말씀하신 "가장 가벼운 방법 먼저"가 이거였구나 싶었습니다.
다음에 해볼 것
지금은 실행 기록만 봅니다. 여기에 "몇 건 처리했는지"까지 증거로 남기면, "돌긴 돌았는데 0건만 긁어온" 경우도 잡을 수 있습니다.
나머지 소스(웹소설 랭킹)에도 같은 게이트를 붙일 예정입니다.
실제 실패가 났을 때 경고가 제대로 뜨는지 확인해야 합니다. 이건 실패를 기다려야 해서 아직 못 했습니다.
덧 — 쪼개놓으니 버리는 것도 쉬웠다
이 글을 쓰는 중에 안 쓰는 소스 하나(뉴스레터)를 정리했습니다. 그런데 나머지는 아무것도 건드리지 않았습니다.
수집기가 독립된 책임이었으니 한 칸만 빼면 끝이었거든요.
한 덩어리였다면 배달 로직과 작성 로직 안에서 그 소스 관련 코드를 골라내야 했을 겁니다.
쪼개는 건 고치기 위해서만이 아니라, 버리기 위해서도 필요했습니다.
(버리기 전에 참조하는 곳 4군데를 훑어서 깨질 게 없는지 확인)