피드 5개가 조용히 죽었고, 그날 브리핑의 9건 중 8건이 한 매체에서 나왔다
14일 전
매일 아침 8시에 AI 뉴스 10건을 골라서 요약이랑 시사점까지 정리해주는 걸 만들어 돌리고 있어요. 사람이 안 건드리고 알아서 돕니다.
이렇게 무인으로 돌리다 보니 제일 무서운 건 에러가 아니였습니다. 성공한 척하는 실패가 '진짜'였습니다. 그 얘기를 하나 해볼게요.
어느 날 브리핑이 한 매체뿐이었어요
7월 31일 아침 브리핑을 열어봤는데 9건 중 8건이 TechCrunch였습니다.
파이프라인은 정상 종료했어요. 에러 로그도 없고 사이트도 잘 만들어졌고 메일도 나갔습니다. 그런데 결과물만 이상했죠.
원인은 수집 단계였어요. 12개 피드 중 5개가 Tunnel connection failed: 403으로 죽어 있었는데, 수집 코드가 죽은 피드를 조용히 건너뛰고 살아있는 것만으로 계속 갔더라고요. 남은 게 TechCrunch 위주였던 거고요.
범인은 서브도메인 하나였습니다
이 파이프라인은 네트워크 allowlist가 걸린 환경에서 돌아요. 허용된 도메인만 나갈 수 있습니다.
목록에는 이렇게 들어 있었어요.
theverge.com
wired.com
technologyreview.com
그런데 실제 피드 주소는 이랬습니다.
https://www.theverge.com/rss/index.xml
https://www.wired.com/feed/tag/ai/latest/rss
allowlist가 호스트명 정확 일치로 동작하거든요. wired.com은 www.wired.com을 안 덮어줍니다. 로컬에서는 그런 제한이 없으니 개발할 땐 멀쩡히 돌았고, 배포된 환경에서만 조용히 막혔던 거예요.
지금은 URL을 추가할 때마다 도메인이 아니라 urlparse(url).netloc을 그대로 비교합니다. 이걸로 세 번 당하고 나서야 습관이 됐네요.
그다음 문제는 원문이었어요
피드는 살렸는데 다른 게 남았습니다. 피드가 멀쩡해도 개별 기사 원문을 못 읽는 경우가 있어요. 페이월이나 봇 차단, 리다이렉트 실패 같은 이유로요.
처음엔 그런 기사도 그냥 실었어요. RSS에 들어있는 제목이랑 요약문만 가지고 정리하는 식으로요.
그런데 나중에 다시 읽어보니까 티가 나더라고요. "무슨 일이 있었나"는 쓸 수 있는데 "왜 중요한가"는 못 씁니다. 원문을 안 읽었으니 당연한 거였죠.
그래서 규칙을 하나 올렸어요.
원문을 읽지 못하면 싣지 않는다.
대가는 바로 왔습니다
규칙을 넣자마자 8월 11일은 8건, 12일은 9건만 나갔어요. "매일 10건"이라고 해놓고 10건이 안 되는 날이 생긴 거죠.
근데 더 나빴던 건 따로 있었습니다. 로그에는 여전히 10건으로 찍히고 있었어요.
퍼널을 이렇게 기록하고 있었거든요.
피드 12개 → 훑은 기사 1,376 → 후보 54 → 선정 10
선정 10이 선정 단계에서 찍히잖아요. 그다음에 원문을 못 읽어서 빠지는 건 그 뒤에 일어나니까 아무도 안 셌던 겁니다. 지표는 성공이라는데 결과물은 8건인 상태였어요.
중간 단계에서 성공을 찍으면 안 되더라고요. 최종 산출물에서 거꾸로 세야 맞았습니다. 지금은 저장할 때 실제 발행 수랑 대조하고, 빠진 몫은
dropped_unwritable로 따로 옮깁니다.
숨기지 말고 그냥 보여주기로 했어요
10건 안 되는 날이 생기니까 이걸 어떻게 다룰지가 고민이었는데, 조용히 넘어가는 대신 데이터 페이지를 만들어서 그날 후보가 어디로 갔는지 그대로 공개하기로 했습니다.
후보 54건은 어디로 갔나
채택 10 / 순위 미달 40 / 같은 사건 4 / 한 매체 3건 상한 0 / 원문 확인 실패 0
매체별로 몇 건 들어와서 몇 건 실렸는지도 같이 냅니다. 우리가 뭘 골랐는지가 보이면 안 고른 것도 같이 보이니까요.
남은 것 세 가지
무인 파이프라인에서 조용한 실패를 잡는 데 이게 도움이 됐어요.
하나. 실패가 예외로 안 나오는 자리를 찾습니다. 죽은 피드를 건너뛰는 것도, 매칭이 0을 반환하는 것도 전부 정상 종료예요. 에러였으면 진작 고쳤을 텐데 말이죠.
둘. 지표는 최종 산출물에서 셉니다. 중간 카운터는 그 뒤에 무슨 일이 있었는지를 모릅니다.
셋. 조각의 합이 전체랑 맞는지 테스트로 지킵니다. 퍼널 항목을 다 더하면 후보 총계가 나와야 해요. 안 맞으면 어딘가에서 조용히 사라진 겁니다.
지금 24일째 돌고 있는데, 여전히 가끔 10건이 안 되는 날이 있어요. 다만 이제는 감추는 게 아니라 그날 데이터 페이지에 그대로 적힙니다.
서비스는 여기 있어요. https://www.dailyaithread.com

