$0 / 결정성 강제
채점 하니스는 API 키를 빈 값으로 export — LLM이 몰래 돌 수 없어 숫자가 진짜로 무료이고 재현 가능합니다. 예측은 매 실행 byte-identical(MD5로 검증).
벤치마크 · 리스트 추출
ScreenPlay의 discover_list는 실제 운영 중인 SaaS 사이트 50곳에서 구조화된 레코드 리스트 — 채용공고·블로그·고객사례·체인지로그 — 를 휴리스틱만으로 추출합니다. LLM 없음, row당 $0, 매 실행 byte-identical.
사람-검증 결과 — 50개 사이트 / 108개 채점 태스크
휴리스틱-only, 결정적(매 실행 byte-identical), gold 사람-검증 완료(139 / 139).
CSS 셀렉터도, XPath도, 사이트별 파싱 코드도 없습니다. 원하는 필드만 선언하면 엔진이 리스트를 찾아 레코드별 한 행씩 반환 — 모든 사이트에서 같은 호출.
items = page.discover_list({title, location, url})이게 추출기의 전부입니다. 위의 0.92 F1 숫자는 이 한 줄을 50개 사이트에 그대로 돌린 결과입니다.
실제 출력 — stripe.com/jobs (64 / 64 추출, F1 = 1.00):
title | location | url |
|---|---|---|
| Account Executive - Enterprise, Grower | South San Francisco HQ | stripe.com/jobs/listing/account-executive-enterprise-grower/7993151 |
| Account Executive, Commercial Hunter (Japanese fluency) | Tokyo | stripe.com/jobs/listing/account-executive-commercial-hunter-japanese-fluency/7789539 |
| Account Executive, Cross Border China | Singapore | stripe.com/jobs/listing/account-executive-cross-border-china/7893199 |
| Account Executive, Enterprise - Grower | New York | stripe.com/jobs/listing/account-executive-enterprise-grower/7997555 |
태스크 종류별 micro 평균 정밀도 / 재현율 / F1.
| 유스케이스 | 정밀도 | 재현율 | F1 | 태스크 |
|---|---|---|---|---|
| 채용공고 | 0.999 | 0.960 | 0.979 | 24 |
| 제품 업데이트 | 0.978 | 0.960 | 0.969 | 12 |
| 블로그 | 0.973 | 0.834 | 0.898 | 46 |
| 고객사례 | 0.861 | 0.784 | 0.821 | 26 |
먼저 gold를 사람-검증(엔진 불변 — 큐레이션은 gold만 바꿈)하고, 그 다음 벤치가 찾아낸 엔진 픽스 1건을 반영했습니다. 모든 단계는 zero-regression 검증 + 2회 byte-identical.
| 단계 | micro-F1 | 정밀도 | 재현율 | 채점 |
|---|---|---|---|---|
| 원본 candidate gold (검증 0건) | 0.9023 | 0.9584 | 0.8524 | 116 |
| + gold 큐레이션·검증 (139/139) | 0.9194 | 0.9662 | 0.8769 | 108 |
| + query-facet 픽스 (F14) | 0.9210 | 0.9668 | 0.8793 | 108 |
채점 하니스는 API 키를 빈 값으로 export — LLM이 몰래 돌 수 없어 숫자가 진짜로 무료이고 재현 가능합니다. 예측은 매 실행 byte-identical(MD5로 검증).
139개 gold 전부 문서화된 재현 가능한 큐레이터로 verified:true 처리. 실제 데이터를 삭제할 뻔한 솔깃한 규칙 2개는 측정으로 기각.
35개 태스크는 정적 DOM에 레코드별 URL이 없음(JS/크로스-호스트 ATS 보드, 클라이언트 렌더 로고 그리드). 커버리지를 부풀리려 버리지 않고 skip으로 기록.
모든 엔진 변경은 새 baseline 대비 태스크별 점수를 전부 diff하고, byte-identical 예측을 위해 2회 재실행한 뒤에만 머지.
WebLists는 공개된 리스트 추출 벤치마크로, 보고된 SOTA(LLM 에이전트)가 약 31% 재현율입니다. ScreenPlay의 결정적·LLM-없는 추출기는 자체 코퍼스에서 88% 재현율에 도달합니다.
이건 사과-대-사과 비교가 아닙니다:
더 어려운 사이트 배치마다 다음 실제 버그가 드러났고, 각 픽스는 zero-regression 검증되어 집계를 끌어올렸습니다.
채용 페이지는 Greenhouse/Ashby를 임베드하므로 실제 채용 링크는 절대 크로스-호스트 URL; 블로그의 /tag/* facet 리스트는 글 리스트와 똑같이 생김. 엔진이 크로스-호스트 ATS id를 구제하고 택소노미 facet에는 coherence를 거부하도록 학습.
부서별로 쪼개진 채용 리스트, 월별로 페이징된 체인지로그는 fragment 하나만 잡힘. 전역 class-signature union이 전체 리스트를 후보로 제안(coherence + LCA chrome 페널티 + distinct-URL 비율로 게이팅).
product/solutions 내비는 레코드 리스트처럼 coherent해서 콘텐츠를 이김. 지배적 부모가 content 단어 없는 마케팅-내비 섹션일 때 coherence 구제를 거부 — 전체 gold 코퍼스로 검증.
datadog 카드는 실제 /blog/<slug> 링크 앞에 /blog/search/?tag= 칩을 노출; path 기반 가드가 놓침. non-facet 우선 규칙이 search-view query-facet도 건너뛰게 해 datadog-blog 0 → 0.76 회복.
엔진을 라이선스하거나, 크롤링을 함께 진행하세요. 전체 화이트페이퍼 — 방법론, 원본 vs 큐레이션 숫자, 모든 finding, 재현 명령 — 는 엔진과 함께 제공됩니다.