dev.to

FinePrint: an agent that checks your hackathon entry against the rules it reads

FinePrint: 해커톤 규정을 읽고 출품작을 점검하는 에이전트

FinePrint는 해커톤 규정을 구조화하고 출품자의 사실 진술과 대조해 자격 요건을 점검하는 에이전트입니다. 규정이 바뀌면 이전 출처와 새 출처를 보존하고, 판정 근거와 모델의 해석 차이도 함께 보여줍니다. 작성자는 테스트가 일반적인 자격 판정 정확도를 입증하지 않는다고 밝힙니다.

AI 요약

해커톤 규정은 챌린지 페이지, FAQ, 공식 대회 규칙에 나뉘어 있고 서로 다른 내용을 담기도 합니다. FinePrint는 이 규정을 읽고 출품자의 상황과 대조하는 에이전트입니다. 사용자가 “8월에 앱 개발을 시작했고 이번 주에 Sanity를 추가했습니다. Path One에 출품해도 되나요?”라고 물으면, 관련 규정을 찾아 사실 진술을 추리고 구조화된 조건 검사기를 실행합니다. 답변에는 읽은 규정과 받아들인 사실, 실제 도구 호출 내역을 표시합니다.

규정을 구조화하고 변경 이력을 남깁니다

키워드 검색만으로는 “8월에 시작했다”는 말이 개발 시작일 요건에 걸리는지, 기존 구성 요소 재사용은 허용되는지 구별하기 어렵습니다. FinePrint는 조건, 적용 사건, 출처 버전을 묶어 각 요건을 구조화합니다. 규칙은 Supported, Blocked, Missing fact, Rules unclear, Not applicable 중 하나로 표시하며, 사실을 수정하면 영향을 받는 판정도 강조합니다.

첫 규칙 묶음은 Sanity Challenge입니다. 9월 20일 당시 FAQ에는 경로마다 한 번만 제출할 수 있다고 적혀 있었지만, 대회 규칙에는 출품 기간 중 제출 횟수 제한이 없다고 적혀 있었습니다. FinePrint는 같은 경로에 두 번 출품하는 경우를 Rules unclear로 표시하고 주최 측에 물을 질문을 제시했습니다. DEV가 9월 24일 대회 규칙을 경로마다 한 번만 제출하도록 바꾸자 작성자는 새 규칙 묶음 2026-09-24.1을 게시했습니다. 저장된 검토 결과에는 판정이 Rules unclear에서 Blocked로 바뀐 기록과 날짜가 표시됩니다. 이전 규칙 묶음도 Sanity에 남아 덮어쓰지 않습니다.

두 번째 행사로 GIBC V2 Open Invention 트랙을 추가했습니다. FinePrint는 Sanity 요건 19개와 GIBC 요건 18개를 검사합니다. 행사 비교에서는 팀 규모나 개발 날짜 같은 사실을 공유하지만, 한 행사의 답변을 다른 행사의 요건에 그대로 적용하지 않습니다. 9월 18일 전에 무엇이 있었는지에 대한 답변은 7월 11일 기준 상태를 증명하지 않습니다. 검토 결과는 브라우저에 자동 저장하며 Markdown으로 내려받을 수 있습니다. 사실만 담은 백업도 제공해 검증되지 않은 판정을 다른 브라우저로 옮기지 않도록 했습니다.

외부 규정 페이지는 인용과 검사 범위를 제한합니다

사용자는 공개 규정 페이지 주소를 넣어 다른 해커톤을 불러올 수도 있습니다. 모델이 제안한 요건은 페이지 원문을 정확히 인용해야 하며, 인용하지 못한 요건은 제외하고 목록에 표시합니다. FinePrint는 인용문을 팀 규모, 나이, 개발 기간, 제출 횟수 같은 정해진 사실 항목에 연결합니다. 연결 근거가 부족하거나 인용문에 숫자가 없으면 Check yourself로 분류하며, 이 항목은 Supported로 판정되지 않습니다. 가져온 행사는 출처 호스트와 함께 ‘검토되지 않음’으로 표시하고 브라우저에만 저장합니다.

작성자가 세 페이지를 시험한 결과, Zero Origin Devpost 규정에서 18개, DEV 챌린지 페이지에서 16개, lablab.ai 행사와 가이드 페이지에서 9개 규정을 찾았습니다. 각각 자동 검사 항목으로 연결된 규정은 4개, 8개, 2개였고 나머지는 Check yourself였습니다. 초기에는 “AI 도구 사용 허용”을 “AI 사용 공개”로 잘못 연결하거나 시간대가 없는 날짜를 9시간 이르게 읽는 문제가 있었습니다. 이에 날짜 인용에는 시간대가 명시되어야 하고, 인용문에 해당 요건을 가리키는 단어가 있어야 한다는 검증을 추가했습니다. 규정이 JavaScript로 렌더링되는 페이지에서는 텍스트가 적게 추출돼 별도 규칙 페이지를 추가해야 할 수도 있습니다. 자동 연결은 검토되지 않으며 실행에 따라 달라질 수 있다고 작성자는 설명합니다.

기술 구성과 검증 범위

앱은 Next.js, TypeScript, Zod, Sanity Content Lake, Context MCP를 사용합니다. 모델은 Modal의 기존 엔드포인트에서 실행하는 DeepSeek V4.1 Flash이며 앱은 Vercel에서 호스팅합니다. 공개 Sanity 데이터셋에는 두 대회의 현재 규칙 묶음에 속한 요건 37개와 날짜가 붙은 출처 버전이 들어 있습니다. 각 요건은 행사와 공식 출처를 참조합니다. GROQ로 규칙 묶음을 읽고 Zod로 검증한 뒤 검사기에 전달합니다. 저장된 판정은 검사 당시의 요건과 출처 버전을 기록합니다. 규칙이 바뀌면 관련 판정만 찾아내며, 캡처 날짜만 바뀐 경우에는 조건 변경으로 처리하지 않습니다.

질문 처리 과정은 Knowledge Base 개요를 읽고 관련 경로를 고른 다음, 출처를 가져와 사실 제안을 검사기에 넘기는 순서입니다. 서버는 요청한 경로가 개요에 있는지 검증합니다. 모델이 제안한 사실과 규칙 해석은 별도로 확인하며, 모델 해석과 조건 검사 결과가 다르면 둘 다 표시합니다. 답변 인용은 실제로 읽은 항목으로 제한하고, 유효한 인용이 남지 않으면 답변을 거부합니다. 한 질문은 모델 호출 네 번, 항목 읽기 여섯 번, 출처 문자 45,000자까지 허용합니다. 질문과 함께 명시적으로 전달한 사실은 모델 제공자에게 전송되지만 공개 Sanity 데이터셋에는 저장되지 않습니다. 로그인 없이 사용할 수 있고, 라이브 에이전트 요청은 10분마다 다섯 번으로 제한됩니다.

두 행사에서 팀 규모와 개발 날짜를 검사한 통합 테스트는 Sanity Context와 Modal을 실제로 네 번 호출했습니다. 네 건의 타입 검사 결과는 작성자가 만든 라벨과 모두 일치했고, 모델은 세 건에 동의했습니다. 한 질문에서 모델은 GIBC의 7월부터 10월까지인 개발 기간을 확인하는 데 시간대가 필요하다고 판단했지만 타입 검사기는 날짜가 요건을 충족한다고 판정했습니다. FinePrint는 이 불일치를 숨기지 않았습니다. 질문 네 개는 작은 통합 점검일 뿐 정확도 연구가 아니라고 작성자는 선을 긋습니다. 자동 회귀 테스트는 작성자가 만든 42개 시나리오와 일치했고, 모델 기준선은 당시 Knowledge Base 항목 아홉 개를 읽고 39개 라벨과 일치했습니다. 이 비교 역시 작성자 라벨과의 일치도를 보여줄 뿐 독립적인 정확도나 검색 품질을 입증하지 않습니다.

원문: dev.to / 번역·요약: Trawling

dev.to 반응

  • @aarishmansur — 진짜 멋지네요 🫡