HyperChecker
인스타그램 릴스를 DM으로 보내면, 소개된 개발 도구를 공개 자료로 확인해 답장하는 에이전트입니다.
문제
릴스에는 "이 MCP 하나면 끝", "별이 몇 만 개" 같은 소개가 많습니다. 사실인지 확인하려면 레포를 찾고, 이름이 같은 복제본을 가려내고, README와 대조하고, 설치 스크립트까지 봐야 합니다. 이 과정을 릴스 공유 한 번으로 끝내려고 만들었습니다.
원칙: 판정은 코드가 한다
LLM에게 "이 도구 좋아?"라고 묻지 않습니다. 등급과 점수는 측정값을 보고 코드가 계산합니다. LLM은 도구 추출, 화면 글자 읽기, 원문 근거 찾기 같은 일을 맡고, 그 결과도 코드가 검증한 뒤에만 판정에 씁니다. 확정할 수 없으면 추측하지 않고 판정을 보류합니다.
등급은 "게시물이 얼마나 확인됐나"이고, 추천 점수(0~10)는 "도구 자체를 얼마나 권하나"입니다. 점수는 스타·업데이트·경고 신호로만 계산하고, 계산 과정을 답장에 그대로 보여 줍니다.
| 등급 | 뜻 |
|---|---|
| 👍 공식 설명 기준 확인됨 | 위치·측정·활동에 문제가 없고, 게시물 설명이 공식 문서와 맞음 |
| 🤔 주의해서 | 위치는 찾았지만 확인되지 않은 부분이나 경고가 있음 |
| 👎 권하지 않아요 | 공식 문서와 다른 주장, 보안 자리표시 패키지, 사칭 복제 |
| ❔ 판정 보류 | 공식 위치를 하나로 정하지 못함 |
실제 답장
실제 게시물을 현재 코드로 돌린 출력입니다. 확인된 도구는 점수 계산까지 보여 줍니다.
2. morphic — 추천 7/10 · 👍 🔗 github.com/miurla/morphic ⭐ 9,257 · 최근 30일 안에 업데이트 👍 좋은 점 · 게시물의 '나만의 AI 검색엔진' 설명이 공식 문서와 맞아요 · 공식 위치 하나를 찾았어요 📊 기본 5점 · 스타 규모 +1 · 업데이트 +1 → 7점
확정할 수 없으면 확정이 아니라고 밝힌 후보만 보여 줍니다.
1. puck — 추천 판단 보류 · ❔ 🔎 이 도구일 수 있어요(확정 아님): github.com/puckeditor/puck ⭐ 13,606 ⚠️ 살펴볼 점 · 공식 위치를 하나로 정하지 못했어요 · 측정한 코드 정보가 없어요
구조
Instagram DM → serve 서명 검증 웹훅, 파일 큐 → work 한 건씩 처리 → 영상 읽기 전사 · 화면 글자 → 도구 추출 Claude → 식별 캡션 링크 → 레지스트리 → 이름 검색 → 읽기 전용 측정 GitHub · npm · PyPI · MCP registry → 주장 대조 원문 인용 검증 → 등급 · 점수 코드 규칙 → DM 답장
| 영역 | 사용 기술 |
|---|---|
| 런타임 | Python 3.14 표준 라이브러리 중심, Docker Compose, Oracle Cloud |
| LLM | Claude Haiku 5.5 (추출, 화면 글자, 주장 대조, 같은 도구 확인) |
| 영상 | yt-dlp, ffmpeg, Groq Whisper |
| 측정 | GitHub API, npm, PyPI, MCP registry, deps.dev |
| 저장 | 파일 큐, SQLite 캐시(같은 게시물 7일, 같은 도구 3일) |
| 입구 | Meta Instagram API, Cloudflare Tunnel + WAF |
가드레일
LLM 출력과 게시물 입력을 신뢰하지 않는다는 전제에서 시작했습니다.
- LLM의 말을 그대로 믿지 않습니다. 주장이 공식 문서와 맞다고 하려면 Claude가 문단 번호와 원문 구절을 내야 하고, 그 구절이 실제로 그 문단에 있는지 코드가 확인합니다.
- 게시물은 신뢰하지 않는 입력입니다. 캡션, 전사, 화면 글자, README는
<untrusted>블록에 데이터로만 넣고, 출력은 정해진 값과 원문 인용으로 제한합니다. 영상 속 지시문이 판정에 미치는 영향을 줄이기 위해서입니다. - 판정 대상을 실행하지 않습니다. 설치도
npx도 하지 않고 공개 메타데이터와 문서만 읽습니다. 서브프로세스는 허용 목록으로 제한하고, 컨테이너는 읽기 전용 루트에 권한을 모두 뺀 상태로 돌립니다. - 비용과 남용에 상한을 둡니다. 계정당 하루 2건, 전체 60건, 추정 비용 하루 $2까지입니다. 항목마다 180초 마감이 있고, 일반 문자 DM에는 Claude를 쓰지 않습니다.
- 개인정보를 오래 들고 있지 않습니다. 영상과 프레임은 처리 직후 지우고, 처리 기록은 7일 뒤 삭제합니다. 외부 API에는 보낸 계정 ID를 넘기지 않습니다. Anthropic으로는 캡션과 공개 공식 문서가 전송됩니다.
평가
사람이 판정한 카드와 적대적 사례로 만든 정답셋 32건을 씁니다. 통과 기준은 👍 정밀도 90% 이상(자동 👍 중 사람이 👍 또는 🤔로 본 비율), 치명 오류(사람 👎 → 자동 👍) 0건, 👎 오탐 1건 이하, ❔ 비율 40% 이하(정답이 ❔인 도구는 분모에서 제외)입니다. 결과가 실행마다 달라져서 여러 번 돌려 비교했습니다(2026-11-03).
| 개선 전 코드 | 현재 코드 | |
|---|---|---|
| 개발셋(도구 19개) 통과 | 2회 중 2회 | 2회 중 2회 |
| 홀드아웃(도구 9개) 통과 | 3회 중 1회 | 3회 중 2회 |
| 치명 오류가 나온 홀드아웃 | 3회 중 2회 | 3회 중 1회 |
현재 코드는 5회 모두 프롬프트 인젝션 같은 적대적 사례에서 등급 상한을 지켰습니다.
이 수치의 한계도 함께 적습니다. 표본이 작고, 홀드아웃은 규칙을 고치는 동안 여러 번 봐서 독립 검증이 아닙니다. 초기 CLI 단계에서는 첫 실행 전에 보류 검증셋을 커밋해 고정했는데, 첫 실행 식별은 9/36으로 낮았습니다. 대신 확정한 9건은 모두 정답이었습니다. 틀린 27건 중 24건은 정답이 상위 3위 안에 있었지만 이름이 같은 복제·사칭 레포 때문에 하나로 정하지 못한 경우였습니다.
초기 CLI 단계에서는 추출·식별 과제를 나눠 따로 채점하고, 식별은 분모를 고정했습니다. 그때 정답셋을 열 수 없는 별도 세션이 화면을 보고 후보를 고르게 해, 정답셋 노출로 점수가 부풀지 않았는지도 확인했습니다. 지금 DM 판정의 수치는 위 표가 전부입니다. 자세한 기록:eval-history ↗
공개 뒤 실제 로그로 고친 것
공개 후 실제 답장을 읽어 보니, 정답셋이 잡지 못한 문제가 나왔습니다.
| 발견 | 원인 | 조치 |
|---|---|---|
| 👍가 한 번도 안 나옴. 주장 42개 중 일치 3개 | Claude가 맞다고 답한 20건 중 9건을 코드가 탈락시킴([3] 표기, 마크다운 차이) | 표기를 정규화하되, 인용이 문단에 있어야 한다는 규칙은 유지 |
| 캡션에 GitHub 링크가 있는데 ❔ | 이름으로만 검색 | 게시물의 링크를 검색보다 먼저 사용 |
| TOP 10 게시물에서 찾은 도구 4개 누락 | 못 찾은 도구가 판정 자리를 차지 | 찾은 도구부터 판정하고, 빠진 도구는 이름을 표시 |
| 스타 0개와 7천 개가 똑같이 5점 | 소유자의 커밋만으로 받는 활동 가산점 | 사용자가 적으면 가산하지 않고 감점 강화 |
NSA ghidra에도 스타 급증 경고 | 한 번 화제가 돼도 조작처럼 표시 | 안내만 남기고 감점과 👍 차단 제거 |
설계 판단: 포크하지 않고 기준만 가져오기
스타 조작 탐지에는 공개 도구 Starguard(★500, Apache-2.0)를 쓸 수 있는지 먼저 코드를 읽었습니다. 설치·실행은 하지 않았습니다. 수집 계층은 오류가 나도 그때까지 받은 데이터만 성공처럼 반환했고, 핵심 신호 두 개(lock-step·clone 사칭)에 판정 근거가 성립하지 않는 버그가 있었습니다. 자동 테스트도 없었습니다.
그래서 포크하지 않고 판정 기준만 출처를 밝혀 다시 구현했습니다. 계정 기반 신호는 남의 레포에 대해 계산할 수 없어서, 스타 개수 시계열 신호와 fork/star 비만 가져왔습니다. 포크해서 얻는 것은 상수 몇십 줄인데, 고치고 혼자 유지하는 비용이 더 컸기 때문입니다.정독 기록 ↗
알려진 한계
- README 자체의 과장은 못 잡습니다. 👍는 "개발자의 설명과 게시물이 맞다"는 뜻입니다. 문서에는 맞게 적혀 있지만 실제 동작이 다른 경우는 놓칠 수 있습니다.
- 기능이 실제로 되는지는 확인하지 않습니다. 실행하지 않는 것이 원칙이기 때문입니다.
- 판정 도구는 게시물당 6개까지입니다. 비용 때문이며, 빠진 도구는 이름을 알려 줍니다.
- 한 번에 한 건씩 처리합니다. 건당 약 1분이라 요청이 몰리면 결과가 늦어집니다.
- 자동 결과는 틀릴 수 있습니다. 그래서 답장마다 고지하고
정정답장 경로를 둡니다.