# Library 누락 전수감사 (product 단위)
AI Summary
Purpose:
- 8개 패키지 생태계의 product 단위 누락(레지스트리엔 있으나 우리 DB product 테이블에 없음)을 전수 정량화하는 감사. audit-only(수집/백필 안 함, 별도 작업).
Key points:
- 단위 = product(패키지 자체 존재 여부), version 단위 아님.
- 핵심 원칙: DB-대-DB 단순비교 금지 — 권위 레지스트리로 실검증해야 함(Go에서 61.7만 "누락"이 실제 1,369였던 교훈).
- 통일 파이프라인: 권위 인덱스 열거 → DB product raw diff(키/collation 정확히) → 레지스트리 실검증 → 분류 →
excluded.tsv+missing_real.tsv+summary.md. - 도구:
~/labrador/tool/<eco>_missing_products(8종), 전부 DB211.115.125.165:43316(composer·rubygems·swift=labradordb, 나머지=gatheringdb).
Relevant when:
- 생태계별 누락 현황/근거가 필요할 때, 또는 감사 재실행/이어가기.
Linked documents:
ai/repo-notes/crawler-lib-golang.md,ai/worklog/2026/2026-W26.md
분류 버킷 (product grain, 공통)
collected_exact이미 수집 /case_only대소문자만 /alias_or_declared정식키로 정리(go.mod 등) /subpackage상위모듈 수집 /registry_gone_404레지스트리 소멸 /real_missing레지스트리 실재 & DB 없음(=수집대상) /recheck일시오류.
통일 출력 계약
생태계별 <tool>/<date>/: missing_real.tsv(name[+meta]) + excluded.tsv(name⇥reason) + summary.md. 마지막에 아래 통합표.
통합 결과표
| 생태계 | DB(테이블, 조건) | 권위 인덱스 | product 총수 | raw 누락 | real_missing | gone | recheck | 상태 |
|---|---|---|---|---|---|---|---|---|
| golang | gatheringdb PRODUCT_GOLANG | index.golang.org/proxy | 1.93M | (gpnf 61.7만) | 1,369(수집완료) | 2,871 | 121 | ✅ W25~W26 |
| maven | labradordb TB_COMP_LIB_PRODUCT (java/MAVEN) | repo1 nexus index (g:a) | 838,155 | 1,689 | 1,689 | 0 | 0 | ✅ 2026-06-24 |
| rubygems | labradordb TB_COMP_LIB_PRODUCT (ruby/RUBYGEMS) | index.rubygems.org/names | 193,954 | 1 | 1 (shmactor) | — | 0 | ✅ 2026-06-24 |
| nuget | labradordb TB_COMP_LIB_PRODUCT (dotnet/NUGET) | nuget catalog (2026-06-18 dump) | 817,073 | 24 | 24 | — | 0 | ✅ 2026-06-24 |
| composer | labradordb TB_COMP_LIB_PRODUCT (php/COMPOSER) | packagist packages/list.json | 451,876 | 9,490 | 9,490 | — | 0 | ✅ 2026-06-24 |
| swift | labradordb TB_COMP_LIB_PRODUCT (swift/cocoapods) | cdn.cocoapods.org/all_pods.txt | 102,509 | 3 | 3 | — | 0 | ✅ 2026-06-24 |
| spm | gatheringdb PRODUCT_SPI (swift/SPM) | SwiftPackageIndex PackageList | 11,166 | 47 | 47 | — | 0 | ✅ 2026-06-24 |
| cpp·conan | gatheringdb PRODUCT_CONAN | conan-center-index git | 1,929 | 0 | 0 | — | 0 | ✅ 2026-06-24 |
| cpp·hunter | gatheringdb PRODUCT_HUNTER | cpp-pm/hunter git | 547 | 0 | 0 | — | 0 | ✅ 2026-06-24 |
| cpp·vcpkg | gatheringdb PRODUCT_VCPKG | microsoft/vcpkg git-log | — | 0 | 0 | — | 0 | ✅ 2026-06-24 |
총계 (2026-06-24, audit-only)
- 진짜 누락 product 합계(golang 제외, 미수집): maven 1,689 + composer 9,490 + spm 47 + nuget 24 + swift 3 + rubygems 1 + cpp(conan0/hunter0/vcpkg0) 0 = 11,254.
- golang은 별도로 이미 수집 완료(1,369). cpp 3종은 완전 동기화(누락 0).
- 가장 큰 갭 = composer 9,490 (다음 maven 1,689). 나머지는 모두 ≤47로 사실상 동기화 상태.
- 모든 생태계에서 DB-only(레지스트리에 없는데 DB에 있음 = yanked/삭제/과수집) 가 누락보다 큰 경우 많음: composer 73,607 · rubygems 27,751 · nuget 10,256 · spm 319 · swift 779 · cpp·vcpkg 143. → 누락보다 stale/삭제분 정리가 더 큰 이슈일 수 있음(별도 판단).
- 권위 멤버십(list.json/names/all_pods/catalog/PackageList/git)이 곧 존재검증이라, maven 외엔 건별 HTTP 불필요했음. maven만 nexus 인덱스라 별도
verify_missing_products.py로 실검증(1,689 전부 real).
참고: 도구 8종 = composer·cpp·golang·maven·nuget·rubygems·spm·swift. npm은 이
*_missing_products세트에 없음(npm 크롤러는 labrador-scrapersnpm_crawler, PRODUCT_KEY=AES-CBC; 누락감사 필요 시 별도 트랙).
생태계별 메모 / 키 함정
- maven(2026-06-24): unique 838,155, DB 존재 836,466(99.8%), 누락 1,689 전부 real(gone/recheck 0). 허수 거의 없는 이유 = 비교가
LOWER(product_key)라 case 흡수 +g:a깔끔한 1:1. 검증기verify_missing_products.py(collect_maven_missing.fetch_metadata재사용, ≤3req/s). 산출2026-06-24/{missing_real,excluded,summary}. 인덱스 2.9GB·파싱 1.04억→dedupe 838k(~41분 1회). - rubygems(2026-06-24):
index.rubygems.org/names19.3만 vs DB 22.15만 → 누락 1(shmactor)./names멤버십 자체가 권위 실검증(있으면 현존)이라 건별 HTTP 불필요 = real_missing 1 확정. 특이점: DB(221,526) > names(193,954) — DB에 names에 없는 27,751건(yanked/삭제 후보,rubygems_db_only.txt) 존재 = 누락의 반대(과수집/stale). 도구가 raw/excluded/db_only 3파일 직접 출력(별도 verify 스크립트 불필요). ~41s. - golang: 단순비교가 위험(declared module path·case-sensitive·subpath·queue backlog). proxy 실검증 필수. 이미 완료.
- nuget(2026-06-24): catalog universe 817,073 vs DB 827,305 → 누락 24. catalog 단일스레드 재순회는 ~2h라 W25 version 작업의 catalog dump 재사용(
2026-06-18/nuget_idver_existing.tmp14.18Mid:version→ 마지막:앞 고유 id 817k). catalog 멤버십=권위 검증. db_only 10,256(yanked/삭제). caveat: universe가 2026-06-18 스냅샷(이후 신규 미포함, audit 베이스라인엔 무시 가능).extract_nuget_missing_products.py는 --workers 없어 느림 → dump 재사용이 정석. - composer(2026-06-24):
packages/list.json451,876 vs DB 515,993 → 누락 9,490(조치가능 9,421, 제외 69). list.json 멤버십=권위 검증. db_only 73,607(삭제 후보). 로컬.env=165 확인(W25 164 오타깃 사고 방지). ~113s. - npm: PRODUCT_KEY =
base64(AES-CBC(name)), key=IV=b'NPMNPMNPMNPMNPMN'— 비교 시 해시 적용. - swift(CocoaPods)(2026-06-24):
cdn.cocoapods.org/all_pods.txt102,509 vs DB 103,283 → 누락 3. db_only 779. all_pods.txt 멤버십=권위 검증. ~13s. (swift_missing_products venv 없음 → composer venv 재사용.) - spm(Swift Package Index)(2026-06-24): SPI PackageList(GitHub raw) 11,166 vs DB 11,438 → 누락 47. db_only 319. W22엔 218였으나 크롤러가 따라잡아 감소. caveat(W22 분석): SPM은 version PK가 VERSION NOT NULL이라 태그 없는 repo는 version 수집 불가(영구 사각지대) — 47 중 일부는 tagless일 수 있어 실수집 가능분은 더 적을 수 있음(product 등록은 가능). 로컬 sitemap 403이라 PackageList json을 universe로 사용.
- cpp(conan/vcpkg/hunter)(2026-06-24): universe=upstream git repo 파싱(크롤러 방식 그대로). conan 0(universe 1,929/DB 1,930), hunter 0(547/547) = 완전 동기화. vcpkg는 full clone+git-log라 별도 실행중(README: vcpkg는
versions/레지스트리 말고 ports git-log가 정답 — 아니면 8,500+ 과대보고). PyYAML 필요(composer venv에 설치). db.py가gatheringdb3계열 테이블 사용. - collation: gatheringdb
as_cs(case-sensitive) vs labradordbai_ci. composer·rubygems·swift은 labradordb. - spm/cpp: 중앙 레지스트리 모호 → "권위 소스" 합의 후 진행.
운영 주의
- 공유 DB
gatherdb01가 커넥션 포화 이력(max_connections=512, 거부 2,046회, thread_cache=13). 감사 열거는 read 1~2 커넥션·단일스트림이라 영향 작지만, 백필/병렬 작업과 겹치지 말 것. 커넥션 sink는 크롤러(워커 재기동 필요, 서버).