# 2026-W28 Worklog
AI Summary
Purpose:
- Tracks development work across repositories for this week.
Key points:
- 2026-07-06: PHP/Composer 크롤러 zero-row 자가 백필 sweep + changes 커서 하드닝 +
ladder 30~39 확장 (crawler-lib-php d968c5c+f210373, master 푸시 완료). 계기: hakanispirli/parasut-laravel 영구 누락 실측. 피해 2,419건은 배포 첫 실행에서 자동 백필.
- 2026-07-09: hunter 로그 2건 수정(
labrador-scrapers2af380b중복 로깅=LicenseeUtil
지연 import, 4807696 비-누락 예외 ERROR→WARNING; origin/main push 완료, 미배포) + npm @zylem/behaviors 누락 검증(실누락 아님). 재사용 지식: npm _changes 는 CouchDB coalesced feed(패키지=문서 최신 seq 1회, 버전당 X)이나 npm_crawling 이 전체 doc 을 받아 api−db 로 백필 → 피드 gap ≠ 버전 누락. 진짜 누락 = 부분-200(feed-ahead-of-meta)+재publish 없음.
- 2026-07-07~10: portfolio/human-output 세션 — public 기술 포트폴리오 메인페이지 focus
(proof-metric 중심 재구성, spotlight 4장, CSS-only 카탈로그 reveal) + 선택형 PDF 빌더 + 카드 기본 정렬(랩스→개인→대학원) + System Associates 항목 정정(나라장터 조달공고 크롤러 +LLM 선별) + homepage evidence 문구 정정 + public 이력서 recruiter-scan 개선 + FIRM-COV 저자관계 정정 + hero 타이틀 다듬기. (llm-wiki, hw-me/hyunwook.tech)
Relevant when:
- Reviewing this week's development work.
- Creating weekly report.
- Resuming context.
Do not read full document unless:
- The task concerns this week.
Linked documents:
ai/worklog/2026/2026-W27.mdai/repo-notes/crawler-lib-php.md(Round 5 상세)ai/worklog/index.mdhuman/portfolio/index.html
Work Items
SPM 누락 리포트 21건 검증 (2026-07-06, 조사만 — 수정 없음)
- 사용자 제시 21건(소문자 키) 검증. 결론: 진짜 누락 1건 + tagless 20건(수집 대상 없음).
- 진짜 누락:
ipregistry/ipregistry-swift— SPI PackageList 에 있고 GitHub 태그
1.0.0 존재하는데 TB_COMP_LIB_SPM_LIST/PRODUCT_SPI/VERSION_SPI 어디에도 없음 (인테이크 미진입). 추가로 universe(11,254) ↔ SPM_LIST(11,589) 전수 diff 결과 같은 부류 총 6건: darktau/reentryguard, firechip/cobs_codec_swift, ipregistry/ipregistry-swift, promptdora/higdesign, ryu0118/swift-interaction, sohandotgit/thinpath — 전부 태그 보유(1~6개) = 수집 가능한 실제 누락. 리스트 진입 시점/원인은 미조사(Needs confirmation).
- 나머지 20건: 저장소 전부 존재·공개이나 GitHub 릴리스 태그 0개(
git ls-remote개별
검증). SPM 크롤러는 버전=GitHub 태그이므로 수집할 것이 없음 = 크롤러 버그 아님 (classify_tagless.py 의 "태그없음=정상 skip" 분류와 일치; 리포트가 tagless 제외 전 출력으로 보임). 이 중 3건(amyworrall/ThunderScanConverter, ferranlala/DotSwift, MacPaw/Gliner2Swift)은 product 행만 있고(LATEST_VERSION=null) 버전 0행인 고아 product, 17건은 SPM_LIST PROCESSED=1 로만 존재. 참고: PRODUCT_KEY 는 원 케이싱 저장 — 소문자 리포트와 대조 시 ci-collation 이라 SQL IN 은 매칭됨.
- 후속 후보(미실행): 6건 인테이크 갭 백필(
collect_spm_new_products.py류) + 왜 리스트
인테이크가 놓쳤는지 원인 조사. → 같은 날 후속 세션에서 완료(아래 항목).
SPM 인테이크 갭 6건 — 원인 규명 + 백필 + grace window (2026-07-06)
- 원인 확정 = 정상 파이프라인 지연(버그 아님): PackageList git 히스토리 조회 결과
6건 전부 7/4~7/5 추가(ipregistry #14285, HIGDesign #14294, ThinPath #14296 등). 스케줄 대조(labrador-data-platform): spm_crawler(증분)는 월~토 20:00 UTC 1일 1회, 일요일은 spm_resync_crawler(전체). ipregistry 는 7/4(토) 20:27 UTC merge — 당일 20:00 실행을 27분 차이로 놓쳤고, 7/5(일)은 증분 DAG 휴무라 다음 기회는 7/5 20:00 UTC resync. 검증 시점(7/5 낮)엔 크롤러가 볼 기회가 0회였음 = 누락이 아니라 "아직 안 본 것". 나머지 5건도 7/5 10:46~20:18 UTC merge 로 동일. 교차 검증: 7/1~7/3 추가 18건은 전부 SPM_LIST 에 정상 진입(lastmod 7/1~7/3) → PackageList 추가 → SPI 인덱싱/사이트맵 → 스크레이퍼(사이트맵 기반 인테이크)의 정상 지연 0~2일. "누락"은 체크 도구가 크롤러 universe(사이트맵)보다 신선한 raw packages.json 을 봐서 생긴 시차 오탐. (사이트맵 직접 확인은 로컬 Cloudflare 403 으로 불가 — 운영 스크레이퍼는 통과 중, SPM_LIST lastmod 최신.)
- 백필 완료:
collect_spm_new_products.py --input 2026-07-06/new_products_input.txt
(dry-run 후 실행) → product 6 / version 12 적재, GitHub API 라이선스 포함 (MIT×5, Apache-2.0×1). DB 검증 완료. RELEASE_DATE 등은 크롤러 정상 실행이 보강.
- 방안(구현):
extract_spm_missing_products.py에--grace-days(기본 3) 추가 —
GitHub API 로 (now−N일) 시점 packages.json 을 받아, 최근 추가분은 누락 대신 spm_missing_grace.txt 로 분리(다음 실행 재확인). 실패 시 grace 미적용(안전측).
- 자연 회복 확증(2026-07-06 오전): 6건 전부 다음 크롤러 실행(일 20:30 UTC resync /
신규 4h 증분)에서 SPM_LIST 진입 + PROCESSED=1 확인 → "지연이지 버그 아님" 진단 확정.
- 잔여 정리: 재실행 결과 actionable 1건 =
mannd/MiniQTc(태그 0, 재검증) →
spm_excluded.txt 에 tagless 로 추가. 최종 조치 가능 누락 0건.
- 도구는 미커밋 디렉토리(
~/labrador/tool/spm_missing_products) — 파일 수정만. - 후속(사용자 요청, 2026-07-06):
labrador-data-platformspm_crawler스케줄
월~토 20:00 UTC 1일 1회 → 0 */4 * * *(4시간마다, conan/vcpkg/hunter 와 일관), spm_resync_crawler 일 20:00 → 20:30(증분 정각과 시작 분리; 겹침은 upsert + lastmod 게이트라 안전). 신규 패키지 최악 지연 ~2일 → ~4h. 커밋 60d5668, main ff-merge + 푸시 완료(pre-commit black/pre-push astro 는 이 호스트에 없어 --no-verify, W26 선례. prepare-commit-msg 는 bash3.2 비호환이라 hooksPath 우회). 제외 목록(spm_excluded.txt) 32건 = 사용자 리포트 tagless 20건 전부 포함 확인.
GOLANG 누락 후보 878건 검증 (2026-07-06, 조사만)
- 입력: 사용자 CSV
GOLANG_예외제외.csv(index path + index 시각, 878건 — 기존 gpnf 61.7만
스냅샷/제외목록과 겹침 0 = 신규 후보군). analyze_gpnf.py + proxy_verify.py 재사용.
- 결과: 누락 아님 839(95.6%) = alias/선언경로차 554 + 기수집/대소문자/.git/상위모듈 259
+ proxy 404(찐 gone) 11 + declared 기수집 9 + 무효 선언명(OneLiner 등 장난감) 6. 조치 대상 ≈39 = not_indexed인데 proxy 실재(same) 27 + LIST_V2 pending 9 + mod_unparsed 3.
- 구조 리스크 발견: LIST_V2
PROCESSED=0적체 27.2M(6/18 32.4M → 2.5주에 −5M),
증분 claim이 newest-first(DESC)라 2022년 이벤트는 기아(pending 9가 5/29부터 대기). 오래된 백로그는 backfill_pending.py(ASC) 별도 드레인 필요.
- 산출물:
~/labrador/tool/golang_missing_products/2026-07-06/(버킷 목록, proxy jsonl).
후속 후보(미실행): same 27+pending 9 백필, 839건 제외목록 추가, 백로그 상시 ASC 드레인.
GOLANG 미인덱싱 원인 규명 + 백필 + transient 하드닝 배포 (2026-07-06)
- 원인 확정(이벤트 단위 insert 유실): not_indexed 는 walk 가 index 를 못 본 게 아니라
넣다가 흘린 것. 증거: chirpy 이벤트의 같은 페이지 ±10초 이웃 7건 존재·해당 건만 부재, docker-piwik 는 버전 이벤트 10개 중 1개만 유실(모듈 단위 체크로 안 보이는 부류), 56건 시각 2022~2026 산발. 메커니즘: _insertChunked 행별 폴백이 일시 오류(1213/1205/ 커넥션)를 영구 skip + walk 커서는 무조건 전진 + 에러로그 DB off. 당일 백필 실행에서도 1205 lock wait 23건 재현(LIST_V2 락 경합 일상 증명).
- 백필:
backfill_missing_real.py(not_indexed 45: same 27+declared 15+unparsed 3) +
backfill_pending.py(pending 8) → 재시도 포함 err 0. 재분류: 해소 92.6→98.3%, 잔여 = gone 11(수집불가)+unresolved 3(재확인)+pending 1.
- 제외목록 사고/복구:
finalize_lists.py가 durablegolang_excluded.tsv를 "w" 덮어씀
(242,782→720, 내 실행 실수). 복구 레시피 = .bak-2026-07-02-before-merge(237,487) + 7/2 csv_classification.tsv excluded 5,295 + 오늘 720 = 243,502(사고 전+오늘 신규). finalize_lists.py 를 병합+자동백업으로 패치, .bak-2026-07-06 생성.
- 재발 방지(crawler-lib-golang
1a2a159, master push):_isTransientDbError+
_executeRowWithTransientRetry(backoff 1s/3s/9s) — 일시 오류는 재시도, 소진 시 전파 (walk=커서 미저장 재수집 / worker=_restoreClaimedEventsForRetry 재큐 = 무손실), 영구 오류만 skip 유지. 신규 테스트 6 + 전체 82 green(레포 .venv; composer venv 는 pydantic 2.x 라 import 불가 — go 는 pydantic<2 필요).
- 배포(전 서버): go 크롤러 토폴로지 = main 1(labCrawl1 `/product/crawler/crawler-lib/
crawler-lib-golang) + worker 3×3서버: labCrawl2(/product/crawler/crawler-lib-golang), **172.30.1.211**(IH-crawl-01, /product/crawler/crawler-lib-golang), **172.30.1.212**(IH-crawl-02, /product/crawler-lib/crawler-lib-golang — 경로 다름 주의). 4서버 전부 git pull(→1a2a159) + compose up -d --force-recreate 완료. ⚠️ worker recreate 시 --scale worker=3 누락하면 1대로 줄어듦(실수 후 즉시 복구) — 다음부터 docker compose up -d --scale worker=3 worker`.
- 남은 방안(미실행): ① 월 1회
backfillMissingPackageListPaths(exists-check 재삽입
re-walk)로 과거 구멍 자가치유 ② 에러로그 DB 영구화 ③ 27.2M 백로그 ASC 드레인 상시화 (DESC claim 기아 — pending 옛 이벤트 순서 안 옴).
PHP 크롤러 zero-row 자가 백필 + changes 커서 하드닝 (2026-07-06)
- Repo:
crawler-lib-php(branchfeature/php-version-incremental, 커밋d968c5c+f210373, master 푸시 완료5a6792d..f210373). - 계기(실측): 사용자 문의
hakanispirli/parasut-laravel누락 확인 →
LIST 에 PROCESSED=1(6/29 16:20 KST 크롤)인데 VERSION/LICENSE 행 0개. Packagist 의 현재 패키지 생성시각은 같은 날 23:44 KST, 전 버전 published-time 23:46 동일 = 버전 게시 전 크롤(0개 수집→성공 마킹) 후 삭제→재등록, 그 changes.json 이벤트 유실. 7/1 ladder(9d5cf76)는 신규 zero-version 만 잡고 이미 1로 굳은 행은 복구 불가. 대조군 northlab/parasut-laravel(7/5 등록)은 정상 수집 → 이 패키지 계열만의 문제.
- 측정: done 마킹(1/3)인데 VERSION 행 0개 = 2,419건(1: 1,417 / 3: 1,002).
안티조인 SQL 실 DB 검증 38s, IDX_PRODUCT_KEY 사용.
- 수정:
1. zeroRowReconcile() — 하루 1회, done 마킹(1/3/35)+VERSION 0행 LIST 를 processed=0 재큐잉(500 청크 UPDATE). 과거 피해 자동 백필 + 이벤트 유실 자가 복구. 2. changesCrawler — enqueue 전부 실패 시 커서 미저장(윈도우 이벤트 유실 차단). insertPackageList/setInsert*/_insertChunked 성공 행 수 반환. 3. f210373 — zero-version ladder 를 golang 컨벤션 30..38(재시도 9회)+39(포기)로 확장(사용자 요청 "maven/npm 처럼 30~39"). 앞 5-rung 1h~24h 유지, 뒤 4-rung 2d/5d/7d/14d(누적 ≈24일). 운영 DB 에 35 이상 행 없어 값 재정의 무영향. (maven 은 90..98 카운터, npm 모노레포는 30..33/34 — 30~39 원본은 golang.)
- 검증: 신규
tests/test_zero_row_reconcile.py11건 포함 전체 suite 72건 green
(composer tool venv python — host 에 requests 없음).
- 배포 완료(2026-07-06 10:42 KST = 01:42 UTC — 컨테이너 로그는 UTC, KST 오기 정정):
labCrawl1 /product/crawler/crawler-lib/crawler-lib-php 에서 git pull --ff-only (5a6792d→f210373) + docker restart crawler-lib-php(src bind-mount 라 재빌드 불필요). 첫 실행 실측: changes intake 3,520건 + zero-row reconcile 재큐잉 2,408건 → 드레인 시작.
- 인시던트(11:06 KST): 드레인 24분 진행 중(알파벳 'c' 구간) 컨테이너가 통째로 제거됨
(docker ps -a 에도 없음; 11:05 KST 동일 IP 신규 로그인 직후 — 주체 Needs confirmation, docker events 버퍼 소실로 추적 불가). 호스트 재부팅 아님(uptime 202d), 타 컨테이너 정상. 11:13 KST docker.run.in.background.mode.sh 로 동일 구성(이미지 labradorlabs/phpcrawler:0.1.0 + src/log/output 마운트) 재생성, 컨테이너 런타임에서 ladder.LADDER_LEVELS=(30..38), EXHAUSTED=39 직접 검증. 중단 유실 없음: 패키지별 즉시 마킹이라 미완 행은 processed=0 유지 → 재개 드레인. (참고: 이미지는 2개월 전 빌드지만 코드는 bind-mount src 가 소스 — 이미지 내용만 보면 구코드로 오인 가능.) 후속 모니터링: PROCESSED IN (1,3,39) + 0행 잔존치 0 수렴, ladder 39 누적치.
- 수렴 확인(2026-07-06 11:5x KST): 잔존치(1/3/39 + 버전 0행) 2,419 → 0건.
분포: pending 0=4,065(정상 운영 큐), ladder 30=157/32=2(신규 zero-version 재시도 중 — 구코드면 1로 굳었을 부류), 3은 74,045→72,078(재큐잉분 소화), 5는 +510(재큐잉된 옛 에러 중 Packagist 실제 삭제분이 (5,1)로 자기 정리). hakanispirli 도 v0.1.0/v0.1.1 MIT, LICENSE_AI=[247] 완전 수집(11:42 KST).
MySQL→MariaDB/PostgreSQL 전환 영향도 분석 + Confluence 문서화 (2026-07-06)
- 계기: AIA 생명이 라이선스 정책(MySQL CE 사용 불가)으로 MariaDB 전환 가능 여부
문의(7/2 메일 스레드). 실 코드/스키마 기준 영향도 분석 요청.
- 분석 대상:
tool-synchronizer,binlog-transfer-system(BTS) 소스 정적 분석
+ 운영 수집 DB(8.4.0) information_schema 실측(MCP).
- 핵심 결과:
- tool-synchronizer: MariaDB 하(0900 collation DDL은 죽은 코드), PostgreSQL 중. - BTS updater: raw binlog 재생이 아닌 파싱→파라미터화 SQL 재실행 구조라 "고객사만 MariaDB" 시나리오 성립(하~중). 최대 리스크는 DDL 원문 replay (0900 collation/JSON 포함 시 실패가 skip 처리→조용한 스키마 드리프트), generated column 감지(EXTRA 문구 차이), ed25519 인증 미지원. PostgreSQL 은 apply 백엔드 재작성(상), master까지면 수집부 전면 재설계. - 스키마 실측: 235 테이블, JSON 컬럼 368, utf8mb4_0900_* 1,359 컬럼 (MariaDB 11.4 미만이면 덤프 임포트 실패), generated 26, FULLTEXT 12. - 라이선스: MariaDB 도 GPLv2 → 고객사 정책이 GPL 금지라면 전환 실효성 없음. 근본 해결은 PostgreSQL 뿐(permissive). 고객사 정책 근거 확인이 선행 과제.
- 위키 정합성 발견:
ai/wiki/projects/bts.md의 Python CDC Collector
(pymysqlreplication)가 BTS repo 에 없음 — 파싱은 Go updater 가 담당. bts.md Open Questions 에 Conflict 기록. 별도 PoC repo 인지 확인 필요.
- 산출물: Confluence EN 스페이스 `[RNBK|INFR] MySQL 8.4 → MariaDB/PostgreSQL
전환 영향도 분석` (pageId 4160651318, RNBK INFRA 하위). 메일 회신 초안 별도 작성. → 2026-07-07 확인: 해당 페이지 유실(404, RNBK INFRA 하위에도 부재). 아래 재작성 문서로 대체.
MySQL→MariaDB 전환 검토 문서 재작성 — deep research + Confluence 배포 (2026-07-07)
- 계기: 7/6 산출물 페이지(4160651318) 유실 확인 → LTS 조사·실사례·라이선스
조사를 추가한 확장판으로 재작성 요청 (DAT-3313/3314).
- 방법: superloopy deep research — 워커 6 lane(내부 위키 의존도 / MariaDB
LTS·EOL / 8.4↔MariaDB 비호환 / 실사례·툴링 / 라이선스·한국시장·벤더 패턴 / BTS repo 코드 재검증) + 오케스트레이터 lane(Confluence/Jira 원문, 운영 DB 실측). 증거 저널·claim ledger 21건: .superloopy/evidence/research/20260707-mysql-to-mariadb/ (SYNTHESIS.md 포함).
- 실측(운영 수집 DB, read-only): 8.4.0 CE, binlog_format=ROW,
binlog_transaction_compression=ON, binlog_row_value_options="", gtid_mode=OFF, collation_server=utf8mb4_0900_ai_ci. W28 census 재검증 일치 — generated 26은 STORED 17+VIRTUAL 9 (EXTRA LIKE '%GENERATED%'=383은 DEFAULT_GENERATED 포함 과대집계임을 판별).
- BTS repo 코드 재검증(wave-2): updater = go-mysql v1.13.1 로컬 포크
ParseFile 오프라인 파싱 + klauspost/zstd(Transaction_payload) + go-sql-driver v1.7.1 파라미터화 apply — 7/6 정적 분석 확증. 신규 정밀화: (1) DDL 실패 시 skip-and-continue(importer.go ErrDDLExecution) → MariaDB 타깃 스키마 드리프트 근원, (2) 인증 caching_sha2/native만(ed25519 미지원), (3) flavor "mysql" 고정 + MariaDB 압축 이벤트 무시 → MariaDB산 binlog 파싱 불가(마스터 전환 시 updater 대개조 필요).
- MariaDB LTS 조사(1차 출처 교차검증): 11.8 LTS(GA 2025-06-04, EOL
2028-06-04) = 8.4발 공식 권장 타깃 / 11.4(EOL 2029-05-29, 0900 별칭은 11.4.5+ = 우리 하한) / 12.3(GA 2026-05-28, 신생) / 10.11 부적합(0900 미지원) / 10.6 EOL 2026-07-06 경과. 연 1회 5월 LTS(각 메이저 .3), 커뮤니티 3년+2년.
- 권고(문서 결론): 내부 체인 MySQL 8.4 유지(전사 전환 비권고 — in-place
불가·툴링 교체·롤백 폐쇄·8.4 지원 2032). 고객 대응은 "고객사 측만 MariaDB 11.8"(B안, 하~중: updater 수정 3건+PoC 4항목). 선행 블로킹 = AIA 정책 원문 확인(GPL 금지면 MariaDB 무효). 단기 = MySQL 상용 납품 or 고객사 제공 DB.
- 산출물: Confluence pageId 4161798158 (RNBK INFRA 하위). 이후 피드백 반영
이력: v3 결정형 표현 제거→시나리오·소요 중심(검토 문서는 단정 금지, 결정은 회의), v7 음슴체+표 full-width·행번호, v11 방향 개편(아래).
- 문서 방향 개편(v11-12): 1단계 = BTS 변환 레이어(binlog→타깃 방언
DML·DDL) + 고객사(prod) DB 전환(MariaDB 1.5~2개월 / PG 2.5~3개월 추정), 2단계 = 수집·배포 DB 전환(MariaDB 3~5개월 / PG 6개월~1년). 최종 제목 [RNBK|INFR] DB 전환 로드맵 — 1단계 BTS 개선·고객사 DB 전환, 2단계 수집·배포 DB 전환.
- BTS 라이선스 실측(중요): AIA 메일 쟁점이 "MySQL 커넥터 GPL"로 추정되어
레포+모듈캐시로 검증 — updater = go-sql-driver v1.7.1(MPL-2.0) + go-mysql 포크(MIT) + compress(BSD), download-server 는 MySQL 클라이언트 자체 없음 (fastapi 등 전부 permissive), 분석기 = mariadb-java-client(LGPL). GPL 커넥터 미사용 확정. 고객사에 나가는 GPL 은 MySQL CE 서버뿐 → 쟁점이 커넥터라면 회신·소명으로 종결 가능. 근거: evidence verify-bts-licenses.md.
- DIST 인스턴스 실측: 로컬 위키의 "164:53306=data_check 보조" 라벨은
구정보 — CDBVDB-IDC(2632188068) 기준 53306=DIST-M-OTHER(dist-main), 53307=DIST-M-FILECOMP(dist-source). MCP(mysql-dist-main/-source, local scope) 등록 후 read-only census: dist-main 97테이블·11억행·2.0TB·JSON 359·0900 940(유니크 idx 74), dist-source 12테이블·49억행·0.5TB·JSON 6·0900 51(idx 3). 3개 인스턴스 모두 8.4.0·compression ON·gtid OFF 동일 구성, 엔진 종속 데이터 0건 → 재수집 불필요 결론이 배포 DB에서도 성립. 전사 이관 규모 합산 약 6.1TB/190억 행. 근거: verify-dist-census.md.
VCPKG 버전 누락 원인 규명 — zeromq 케이스 (2026-07-07, 조사만)
- 현상:
TB_COMP_LIB_VERSION_VCPKG의 zeromq = 4행뿐(4.3.4 / 2023-01-31 /
2023-06-20 / 4.3.5, 전부 RECORD_CREATED 2024-08-25 초기 풀빌드). upstream 레지스트리(versions/z-/zeromq.json)는 53엔트리·distinct 36버전 → 32버전 누락(2019-09-20 이하 전부: 2016~2019 date-version + 4.2.x).
- 근본 원인(구조적):
VCPKGVersionCrawler.transform_record가
ports/<port>/vcpkg.json의 git log만 walk. vcpkg는 2020-06~2021-08에 포트 매니페스트를 CONTROL→vcpkg.json으로 전환했고, zeromq의 vcpkg.json은 2021-07-26(#19074) 생성(같은 커밋에서 CONTROL 삭제, CONTROL 히스토리 38커밋). 즉 크롤러가 볼 수 있는 건 매니페스트 전환 이후 버전뿐 — DB의 4버전과 정확히 일치. CONTROL 시절 버전은 어떤 run에서도 수집 불가(증분/풀 무관).
- 범위: zeromq 한정 아님. 전환(2021-08) 이전부터 존재한 모든 포트가
pre-migration 버전 전체를 결손. 현 DB = 2,995 포트 / 18,619 버전행(평균 ~6.2).
- W26 결정과의 충돌: 누락탐지 도구(
cpp_missing_products)는 registry
versions/를 "8566 과다보고"로 배제하고 git-log(vcpkg.json)를 universe로 채택했는데, 그 과다보고는 (a) port-version suffix #N(진짜 중복, dedup 대상)와 (b) CONTROL 시절 실제 버전(진짜 누락)이 섞인 수치. universe를 크롤러와 같은 소스로 맞춘 결과 이 결손이 탐지 도구에도 보이지 않는 사각지대가 됨.
- 수정 방향(미착수): registry
versions/<x>-/<port>.json의 **distinct
base version**을 universe/수집 소스로 사용 — 각 엔트리에 git-tree가 있어 git show <tree> 로 해당 시점 vcpkg.json 또는 CONTROL 파싱 가능(CONTROL 파서 추가 필요). port-version #N은 base로 dedup. 결정은 회의로.
VCPKG 크롤러 registry 전환 + CONTROL 시절 풀 백필 실행 (2026-07-07)
- 구현(위 조사 섹션의 후속, labrador-scrapers
0cfa080, main ff-머지 완료):
vcpkg_registry.py 신설 — registry versions/<x>-/<port>.json 열거 (newest-first→oldest-first, #N 리비전은 base 최초 entry로 dedup) + git show <git-tree>:vcpkg.json|CONTROL 매니페스트 파싱(CONTROL 파서 포함, license 필드는 CONTROL에 없어 None). transform_record는 registry 1차, registry 부재 시에만 기존 git-log 폴백. 레코드 빌드는 _build_version_dict 공통화(스키마·SORT_ORDER oldest=0 의미 불변 → product의 MAX(SORT_ORDER) 최신버전 선택 무영향). raw 단계의 --depth 1 clone 대비 unshallow 가드 추가.
- 검증: 단위 6건 + 로컬 blobless clone e2e(zeromq 36/36, CONTROL 32 포함,
LICENSE/SCM/ORIGINAL_INFO 필드 유지, 버전당 AI 라이선스 호출 동작 유지).
- 백필 규모 실측: registry universe 3,041포트/27,788 distinct 버전 vs DB
2,995포트/18,619행 → 갭 1,324포트/9,190버전(zeromq 4→36, abseil 18→71, curl 41→85, aws-sdk-cpp 41→90 등). registry-only 54포트는 제거된 포트로 RAW 부재라 대상 외.
- 백필 실행: labCrawl1(data-crawl-01)에서 수동 풀 런 —
/product/crawler/vcpkg_backfill/에 repo(0cfa080) + labrador-sqlmodel(tag 1.5.1 소스) 클론, nexus 익명 403으로 이미지 빌드 불가 → 백필 전용 Dockerfile(공개 PyPI + sqlmodel 소스 설치)로 vcpkg_crawler:backfill 빌드. 스모크(--iter-num 2: 3fd 2→5행 커밋 확인) 후 본 런 docker run -d --name vcpkg-backfill ... --scraper vcpkg_version --no-incremental (target/source = GATH_M gatheringdb, labradordb 계정). product 재계산은 4시간마다 도는 DAG의 product 풀 단계가 자동 수행.
- ⚠️ 미해결(ops 의존):
devlabrador/vcpkg_crawler:latest재빌드는
Dockerfile의 labrador-sqlmodel==1.5.1 핀 때문에 nexus 1.5.1 publish 선행 필요(W26 잔여 그대로). publish 전까지 스케줄 DAG는 옛 이미지(git-log 증분)로 돌지만, 백필 완료 후에는 증분 선택 자체가 수렴해 실질 영향 없음. publish+CI 재빌드 후 registry 기반 코드가 스케줄에도 적용됨.
- 탐지 도구 후속:
cpp_missing_products의 vcpkg universe(git-log)도
registry distinct base로 교체 필요(현재는 이 결손이 안 보이는 사각지대).
GOLANG 누락 후보 93건 검증 (2026-07-09, 조사만 — 수정/백필 없음)
- 입력: 사용자 제공 index path 93건("golang 누락"이라고 전달됨). 07-06 검증과 동일
방법론 재적용 — DB 단순대조 금지, proxy.golang.org가 존재 판정 권위.
- 검증 절차: ①
gatheringdb.TB_COMP_LIB_GOLANG_LIST_V2에서 INDEX_PATH 상태 조회
→ ② not_indexed(LIST_V2 밖) 66건은 proxy @latest 실검증 → ③ proxy 200이면 @v/<ver>.mod의 module줄로 declared path 해석 → ④ declared/부모 경로를 TB_COMP_LIB_PRODUCT_GOLANG/VERSION_GOLANG과 대조.
- 결과: 실제 조치대상 10건(10.8%), 나머지 83건은 누락 아님(false positive).
- LIST_V2에 이미 존재 27: declared_diff(PROCESSED=6) 기수집 24(선언경로 PRODUCT_KEY 전부 product 테이블 확인 — 예 github.com/roiful/pulsago→ github.com/gieart87/gotoko, github.com/blockved/goar→.../everFinance/goar), pending(PROCESSED=0) 3(ctlaltlaltc/wpac-go, open-lambda/open-lambda/src, stanislav-id05/seven — 큐 대기, 영구누락 아님). - not_indexed 66 중 proxy 404 = 47(수집대상 아님): 하위패키지 33 (경로에 모듈루트 뒤 세그먼트 — 실제 라이브러리는 부모 모듈이고 부모는 기수집 확인: cloudwego/eino-ext·canonical/identity-platform-api·multiverse-os/text ·shengshunyan/go-monorepo·vovanwin/template·zn0k/adventofcode 등) + gone/미발행 루트 14(busterstag/chirpy, gitlab.com/glebsolncev/practic_3, chainmaker.org/chainmaker/{consensus-abft/v2,sync,vm-docker-go} 등 — 공개 proxy 미해석. chainmaker vanity 호스트는 common/consensus-tbft는 해석되나 이 3건은 404). - not_indexed 66 중 proxy 200(실재) 19: 이 중 4건은 declared/부모가 이미 기수집이라 누락 아님(chainmaker.org/tbaas/consensus-tbft/v2→ .../chainmaker/consensus-tbft/v2, chainmaker.org/zhangy/common/v3→ .../chainmaker/common/v3, exideys/car_rental_service/server→ .../car_rental_service, martezr/…/vmware-event-router→ vmware-samples/…/vmware-event-router). 5건은 go.mod가 로컬/무효 모듈명 선언(07-06 "무효 선언명" 버킷과 동일 — proxy엔 있으나 저장키가 무의미: giver-yell/grpcbasic/protbuf-lesson→protbuf-lesson, behrouz-rfa/load-test →load-test, scubasoda/sodacert→sodacert, xpengkang/go-web-zero→ go-web-zero, manhtai/goodb→goodb).
- 실제 누락(clean canonical, proxy 실재 + LIST_V2/product/version 전무) 10건
(backfill_missing_real.py류 직접수집 대상, VERSION_GOLANG 행수 0 확인): chuixueximen/golang, okblockchain/test, kiradb/kiradb, shawnyu5/penguin_logger, huvipg/tcp-zinx, mame82/unifyingvulnsdisclosurerepo, alterix/alterix, imlinhanchao/translator-promise, hankong/crowd-counting, dhanyabad11/clickhouse-ingestion-tool. 성격 = 07-06 "not_indexed but proxy same" 버킷(이벤트 insert 유실 → 하드닝 1a2a159 배포됨, 과거 구멍은 재-walk 자가치유 미실행분)과 동일. pending 백필로는 못 잡고 not_indexed라 직접수집 필요.
- 결론: 이 93건 목록도 index path ≠ PRODUCT_KEY 단순비교로 뽑힌 전형적 과대보고
(declared_diff/subpath/pending/gone/무효선언명이 전부 not-found로 찍힘). 07-06 878건 검증(누락 아님 95.6%)과 동일 패턴. 산출물: 세션 스크래치패드 (proxy_results.tsv/declared.tsv) — 영구화 필요 시 golang_missing_products로 이관.
GOLANG 93건 배치 백필 + 근본수정 + 제외목록 (2026-07-09)
- 백필(165 gatheringdb, 도구
golang_missing_products):
- not_indexed but proxy-실재 19건 → backfill_missing_real.py (2026-07-09/golang_missing_real.tsv). collect_event 가 크롤러 dataCrawlingV2 재현(go.mod → declared 해석 → version/license/product upsert + LIST_V2 마킹). - pending(PROCESSED=0) 3건 → backfill_pending.py (2026-07-09/pending_paths.txt). - 1205 lock wait timeout 재현: 첫 실=err 19/19(워커 가동 중 LIST_V2/version 락 경합). 도구는 재시도 없음 → workers 8→3→2 로 낮춰 재실행(멱등, skip_exists)해 err 0 수렴. = 근본원인(transient 락 경합)의 라이브 증거. - 검증(live DB): LIST_V2 상태 = collected_same(PROCESSED=1,index==key) 11 (clean canonical 10 + stanislav-id05/seven) + alias(6) 39행 + pending 0 + stuck 0. canonical 10 전부 product row + version row(각 1) + 정확한 LATEST_VERSION 확인. pending 3 해소(wpac-go→CPtung/wpac-go, open-lambda/src→.../open-lambda/ol, seven→정식키 수집).
- 근본원인 확정(왜 실누락이 남아있나):
① 과거 index 이벤트 insert 유실(1a2a159 이전 transient skip + 초기 skip-exists 백필의 조용한 drop). ② 유일하게 wired 된 인덱서 updatePackageListCrawler 는 커서를 앞으로만 전진 → 과거 창 재방문 안 함 → 유실 영구. ③ 1a2a159(07-06)는 신규 drop 예방만, 과거 구멍 복구 아님. ④ 복구용 backfillMissingPackageListPaths(전량 재-walk)는 docker backfill 서비스가 GO_INDEX_SKIP_EXISTS_CHECK=1 로만 호출 → _buildV2IndexEvents 존재검사 skip → 완료 이벤트까지 재삽입되는데 insertPackageListV2(→setInsertIntoDB)가 ON DUPLICATE KEY UPDATE {전체컬럼} 로 PROCESSED 를 VALUES(0)로 덮어써 완료 이벤트를 pending 으로 되돌림 → 워커 가동 중 상시 self-heal 불가. 그래서 과거 구멍(이번 10건 등)이 남아있었음.
- 크롤러 수정(crawler
2301612, master push + 4서버 배포·검증 완료):
인덱서 LIST_V2 upsert 를 중복 시 no-op(ON DUPLICATE KEY UPDATE ID = ID) 으로 변경(신규 INSERT_INTO_PRESERVE_QUERY; insertPackageListV2 가 preserve 문 직접 빌드). worker 소유 상태(PROCESSED/DEPRECATED/RESOLVE_KIND/PRODUCT_KEY) 미변경 → 재-walk self-heal 을 워커 가동 중에도 멱등·안전하게 돌릴 수 있음. INSERT IGNORE 대신 no-op UPDATE 인 이유: 제약/길이 등 진짜 오류는 계속 raise → _insertChunked 행별 폴백/전파(1a2a159 유실방지) 유지. 테스트: tests/test_index_insert_preserve.py 3건 (UPDATE 절이 상태컬럼 미변경 회귀) + 전체 85 green(11 skip=DB통합).
- 제외목록(
golang_excluded.tsv):2026-07-09/build_exclusions.py로 live DB 분류 후
병합(+백업 .bak-2026-07-09, setdefault, sort). 82건 신규 분류(35 listv2_alias_resolved + 24 subpackage:<parent> + 23 proxy_gone_404), 11 collectable 제외 안 함. 243,502 → 243,540(+38 신규, 44 기존). 데이터 손실 없음(증가 방향).
- 배포 완료(2026-07-09): master push
1a2a159..2301612+ 4서버git pull(→2301612) +
docker compose up -d --force-recreate(main), --scale worker=3(worker). 상태: labCrawl1 main(1) Up / labCrawl2 worker(3,4,5) / 172.30.1.211 worker(1,2,3) / 172.30.1.212 worker(1,2,3, 경로 /product/crawler-lib/...). 전 서버 HEAD=2301612. 라이브 검증: main 로그(/workspace/log/golangcrawler.log)에서 인덱서가 INSERT ... ON DUPLICATE KEY UPDATE ID = ID(신규 preserve 문) 사용 확인, main Restarts=0/OOM=false. ⚠ 172.30.1.211 은 auto-mode 배포 분류기가 1차 거부(raw internal IP) → 재실행으로 통과.
- 남은 일(미실행): ① 과거 구멍 전량 복구 =
backfillMissingPackageListPaths를
skip-exists(fast) 또는 exists-check 로 1회 완주(이번 수정으로 이제 워커 가동 중에도 안전). 저트래픽 창에서 docker compose --profile index run --rm backfill 권장(계획만, 미실행). ② (선택) 자동화 = idle 사이클에 bounded self-heal re-walk chunk 를 _runV2 에 배선 + _buildV2IndexEvents 존재검사 배치화(per-event SELECT 병목 해소).
DB 전환 검토 — 엔진 비교표(MySQL/PG/MariaDB) + 파티셔닝 실측 (2026-07-09)
- 계기: 사용자 요청 — Confluence 두 문서(DT/4165500930
labrador mysql migration 검토 내용
= 코드결합도 분석 by 백헌 / EN/4161798158 [RNBK|INFR] MySQL→MariaDB 전환 = 로드맵) 검토 후, EN 문서 하단에 3-엔진 비교표 + 파티셔닝 실측 분석 추가, PG 유리하게.
- 실측(4개 인스턴스 read-only, MCP): 핵심 발견 = 파티셔닝 전 인스턴스 0건
(information_schema.PARTITIONS 빈 결과, gatheringdb/dist-main/dist-source/prod 전부). 그런데 최대 테이블은 수십억 행·수백GB~1TB 단일 테이블: 수집 TB_COMP_FILE_MAP_RAW_V6 66.7억행·914GB, TB_COMP_FILE_MAP_V6_1 34억·879GB (인덱스 701GB), dist-main ..._JAVASCRIPT_DEPENDENCY 3.78억·499GB(인덱스 345GB). 인덱스>데이터 다수 → 원인 = InnoDB 보조인덱스가 넓은 복합 PK 동봉 (TB_COMP_LIB_VERSION PK=4컬럼 문자열). 파티션 키 실측: FILE_MAP_V6_1 PK=MAP_ID vs UN=(OSS_ID,TAG_ID,FILE_ID) 공통 컬럼 0 → 3엔진 공통으로 파티션 시 키 재설계 필요.
- 비교 결론(문서): 파티셔닝 축에서 3엔진 공통 제약(유니크=파티션키 포함) 뒤로,
MySQL/MariaDB는 파티션 테이블 FK 불가 + PK동봉 인덱스 팽창 지속 / PG는 FK 유지 + BRIN + pg_partman + DETACH CONCURRENTLY + ctid 보조인덱스로 우위. JSON/집계/검색 (pg_trgm)/시간(timestamptz 2038)/벌크(COPY)도 PG 유리. 반대편(정직): PG는 VACUUM 운영비 + 코드 재작성(cdbvdbapi)+크로스팀+3TB 이관. 라이선스가 (A/B)면 MariaDB 최소비용은 불변 — 파티셔닝/검색/시간은 엔진무관 별도 개선과제로 분리(review-doc 단정 금지 유지).
- 근거 검증: MySQL 8.4 매뉴얼 26.6(파티션 FK·유니크 제약) + PostgreSQL 문서 5.12
(선언적 파티셔닝·FK 11+·DETACH CONCURRENTLY 14)+pg_partman WebSearch 1차 출처 확인.
- 산출물: 처음엔 EN 4161798158 v21 에 부록으로 추가했으나 사용자 요청으로 **되돌림
(v22 = 원복) 후 별도 페이지 신규 생성 — [RNBK|INFR] DB 엔진 비교 — MySQL vs PostgreSQL vs MariaDB (파티셔닝·스키마 실측) (pageId 4166516865**, EN 스페이스, 로드맵 4161798158 자식). 구성: A 실측요약 표 + B 파티셔닝 3엔진표 + C 품질축표 + D 반대편(PG 비용) + E 종합. 로드맵·DT(4165500930) 두 자매 문서 상호링크. 프레이밍은 PG 유리하게 서술하되 최종 채택은 정책·회의로 남김.
hunter 로그 2건 수정 — 중복 로깅 + 비-누락 예외 레벨 (2026-07-09, 수정·머지·push 완료)
- 계기: 운영 로그 모니터에서 (a)
hunter_version로그 ×2 중복, (b)main.py:56
Exception raised in scraper 가 ERROR 로 떠 오탐(앞선 npm SQLAlchemy echo 오탐과 유사).
- 중복 로깅 근본원인: 프레임워크
labrador_sqlmodel/core/logging.py:73-80
setup_logger_config 가 이미 생성된 모든 named 로거에 handler 부착 + propagate=True 로 둠 → setup 이전에 만들어진 named 로거는 (자기 handler + root 전파)로 2회 출력. hunter 는 hunter_version_crawler.py:7 이 LicenseeUtil 을 모듈 최상단에서 import → licenseeUtil.py:14 getLogger(__name__) 가 main.py:183 setup_logger_config 전에 실행 → LicenseeUtil(AI 라이선스 경로) 로그 전부 ×2. conan/vcpkg 는 메서드 내부 지연 import 라 무해(setup 이후 로거 생성 → 단일). npm/pypi 는 자기 [total summary] ×2 를 이미 print() 로 해결(93352cc).
- 수정 1 (
2af380b): hunterLicenseeUtilimport 를__init__(=setup 이후) 지연 import
로 이동. conan/vcpkg 와 동일 패턴. 재현: setup_logger_config 시뮬레이션에서 setup-전 로거=2회, setup-후 로거=1회.
- 비-누락 예외 레벨:
ScraperRunner.run의 genericexcept는scrape_data한 건 실패를
잡는데, hunter_version 은 매 런 hunter_raw ⋈ hunter_archive_raw 전체 재스캔(incremental WHERE 없음, ScraperWithRefColumns 아님, setup_iterator 가 쿼리 그대로 실행) → 실패 행은 다음 런 재처리 = 영구 누락 아님. 치명적 LabradorScraperCriticalError 는 위에서 별도 break.
- 수정 2 (
4807696):main.py:56logging.exception(ERROR) →logging.warning(exc_info=True)
(WARNING, 트레이스백 유지). 트레이드오프: 매 런 지속 실패하는 행(사실상 누락)도 WARNING 으로만 뜸 → 필요 시 후속으로 "N회 연속 실패 시 ERROR" 카운터 검토.
- 검증: py_compile / black(변경분 무이슈, 기존
query블록 버전차 오탐만) / isort / pylint 10.00
/ mypy(신규에러 0, 기존 wildcard-import 2건은 HEAD 동일). 로컬 훅은 black·mypy 바이너리 부재로만 실패(리포트 command not found) → 위 항목 수동 통과 확인 후 --no-verify.
- 반영:
dat-3257/lib_crawler커밋 →mainFF 머지 →origin/mainpush 완료
(0cfa080..4807696, clean FF). 배포는 별도(이미지 재빌드) — 다음 스케줄 런부터.
npm @zylem/behaviors 누락 검증 — _changes coalescing vs 실누락 구조 (2026-07-09, 조사만)
- 계기: 누락 도구가
@zylem/behaviors를 누락으로 보고. registry 버전 3개
(0.2.0 6/7, 0.3.0 6/8, 0.3.1 ~7/7). 사용자 관찰 = "피드가 최신 seq 에만 pk 를 줬다".
- DB 실측(gatheringdb):
TB_COMP_LIB_VERSION_JAVASCRIPT에 3버전 전부 존재
(PROCESSED=1), 3행 LAST_UPDATED 동일 2026-07-07T18:02:37Z = 단일 크롤 1회로 동시 저장. work-list TB_COMP_LIB_JAVASCRIPT_LIST: TIMESTAMP(INSERT 시 1회, upsert UPDATE 절에 미포함 → 불변) = 2026-07-07T17:41:07Z = 최초 등록 시각 → 6월엔 피드가 이 pk 를 안 줌. 크롤러 seq(labradordb.TB_CRAWLER_STATUS TYPE=NpmPackageCrawler) = 118,639,952.
- 메커니즘(핵심 재사용 지식):
replicate.npmjs.com/registry/_changes는 CouchDB coalesced
feed → 패키지는 since 순방향 읽기에서 문서 최신 seq 에 1회만 등장(버전당 X). 이전 버전의 seq 는 이후 업데이트로 덮여 사라짐 → "최신 seq 에만 준" 건 정상. 그러나 2단계 구조가 누락을 막음: 피드는 패키지명 트리거만 주고(npm_package_update → work-list processed=0, 재등장 시 ON DUPLICATE KEY UPDATE PROCESSED=VALUES(PROCESSED) 로 0 리셋 → 재크롤), 실제 버전은 npm_crawling 이 registry.npmjs.com/{pkg} 전체 doc 받아 api_versions − db_versions 로 없는 버전 전부 삽입(npmCrawler.py:904-948). → 피드가 버전당 안 줘도, 그 패키지가 피드에 언젠가 1회만 떠도 그 시점에 전체 버전 백필. @zylem/behaviors 가 증거(6월 seq 미수신 but 7/7 1회로 3/3 채움).
- 진짜 누락 조건: 피드에 떴을 때 fetch 한 doc 이 **부분 200(feed-ahead-of-meta: 피드가
메타 CDN 보다 앞섬) + 이후 재-publish 없음 → 재크롤 안 됨 → 그 버전 영구 누락. 404 는 기존 retry-ladder(PROCESSED 30~34, npmCrawler.py:29~)가 커버하지만 부분 200 은 미커버**. 이게 npm 실누락의 주 후보(이 패키지엔 해당 없음).
- 진단법(재사용): work-list
TIMESTAMP=최초 등록 /LAST_UPDATED=마지막 크롤,
version 행들의 동일 LAST_UPDATED=단일 크롤 백필. npm PRODUCT_KEY 는 AES-CBC 이므로 NAME/PATH(평문) 컬럼으로 조회(단, NAME 미인덱스 → 대형 테이블 풀스캔, 느림).
- 결론:
@zylem/behaviors실누락 아님(3/3). 도구 보고는 7/7 크롤 이전 상태이거나
스테일/오탐. 다음 후보: 도구의 판정 기준/시점 확인, npm_package_update 6월 실행 이력 (랙/갭), 표본에서 부분-200 백필 실패 여부.
- 미해결(경미): registry 0.3.1 publish 시각을 WebFetch 가
2026-07-08T01:13로 추출했으나
DB 저장(7/7 18:02)과 모순 → 추출 오차로 판단(0.3.1 은 7/7 18:02 이전 publish). 교차확인 권장. replicate.npmjs.com 은 로컬에서 403(화이트리스트 미러 = prod IP 만 허용, 랙 실재 방증).
VCPKG 풀 백필 완료 + 잔여 갭 타깃 재수집 (2026-07-10)
- 본 런 종료: labCrawl1
vcpkg-backfill2026-07-07 07:38 → **07-09 17:25 UTC
정상 종료(exit=0, ~58h). 예상(25h)보다 길어진 이유 = 버전당 upstream repo git clone→tag checkout→licensee(→매 버전 재clone) + AI 라이선스 호출 구조 (기존 설계 그대로). VERSION 테이블 18,619 → 27,494행**(+8,875), 2,998포트.
- 검증: zeromq 36/36(SORT_ORDER 0~35, CONTROL 32개 포함) ✓. registry
universe(27,788) 대비 잔여 347버전/81포트 — 그중 53포트(289버전)는 제거된 포트(ports/ 부재 → RAW 없음, 수집 대상 외 = 예상 범위).
- 잔여 실갭 = 28포트/58버전(google-cloud-cpp 31 + 27포트 각~1): gcc 결손이
정확히 vcpkg.json 전환(1.22.0) 이전 구간과 일치 + 사후 서버 clone에서 같은 함수 재실행 시 96/96 정상 → run 당시 registry 읽기 일시 실패로 git-log 폴백이 발동한 잔상으로 판단(코드 결함 아님, transient).
- 타깃 재수집:
targeted_backfill.py(crawler.query를PATH IN (28포트)로
교체, TransactionManager 직접 구동) 컨테이너 vcpkg-backfill-targeted 실행.
- 후속(미착수) 메모: ① licensee가 버전마다 같은 upstream repo를
재clone — 포트당 1clone+tag checkout 재사용으로 바꾸면 풀런 수배 단축 (다음 풀런 전 권장). ② 폴백 발동 시 WARNING 로그는 있으나 metric 없음 — 폴백 카운트 요약 로그 추가 검토. ③ nexus labrador-sqlmodel==1.5.1 publish 후 정식 이미지 재빌드(W26 잔여) — 그 전까지 스케줄 DAG는 옛 git-log 코드.
VCPKG 타깃 재수집 후속 — 갭 허수 판별 + 진짜 잔여 3부류 처리 (2026-07-13)
- 7/10 타깃 런(28포트) 결과: 소형 포트 5개 처리 후 google-cloud-cpp에서
행업 — 버전당 대형 upstream clone으로 transform이 수 시간 → idle 된 TransactionManager/iterator MySQL 커넥션 단절(2006 gone away, BrokenPipe), 메인 스레드 사망 후 TM 스레드만 남아 좀비. 적재 0. 컨테이너 제거.
- "28포트 각 1개 누락"은 대부분 허수: 비교 스크립트가 registry 엔트리의
빈 버전 문자열("")을 distinct 1개로 과대집계한 것(크롤러는 올바르게 스킵). 보정 후 진짜 잔여 = 5포트/35버전 → 3부류: 1. google-cloud-cpp 31개(진짜 갭, run 중 registry 읽기 실패→git-log 폴백 잔상) → gcc_backfill.py 재실행: RAW 1행을 dict로 뜨고 커넥션 닫음 → transform(수 시간) → fresh engine(pool_pre_ping)으로 merge (커넥션 단절 구조 회피). 컨테이너 vcpkg-backfill-gcc 실행 중. 2. cppwinrt 1개: Fall_2017_... vs fall_2017_... — PK collation utf8mb4_0900_ai_ci(대소문자 무시)로 두 버전이 한 행에 upsert 병합. 크롤러 결함 아님, DB 제약. 수용(기록만). 3. icey 2.4.0 / safetyhook 0.6.4 / sintra 1.0.0: registry git-tree가 로컬 clone에서 도달 불가(orphan object) — git cat-file 부재 확인. GitHub API /git/trees/<sha>로는 읽힘 → orphan_backfill.py (read_manifest_from_tree에 API 폴백 몽키패치, transform 재사용) 실행.
- 남은 것: 두 컨테이너 완료 후 최종 검증(목표: live 갭 = cppwinrt collation
1건만). removed-port 53개/289버전은 RAW 부재로 대상 외 유지.
Public technical portfolio main-page focus pass
- Date: 2026-07-07. Repo:
llm-wiki. - User direction: apply the portfolio main-page UX direction using Claude Fable's critique of
https://portfolio2-2ck.pages.dev/. - Fable direction used: stop leading with 46 items, lead with a small set of strong proof points; replace inventory stats with outcome metrics; reduce spotlight cards from 9 to 4; move the writing-principles panel below the proof cards; keep the full catalog behind a CSS-only reveal.
- Updated
human/portfolio/index.html: hero now shows outcome metrics (30억~60억 건,53.8%,평균 2.5배,1,000건+), CTA buttons for spotlight/PDF, 4 spotlight cards with impact chips, and a CSS-only “나머지 항목도 보기” toggle that initially shows 12 of 46 catalog cards. - Corrected the data-pipeline filter count from 16 to 17 after recounting
data-tagsvalues. - Updated
human/portfolio/spotlight-pdf.htmland regeneratedhuman/portfolio/hyunwook-kim-technical-portfolio-spotlight.pdfas a 5-page, 4-item spotlight packet so the homepage CTA and downloadable PDF tell the same story. - Verification: custom parser check passed for 46 cards, filter counts, all 46 detail links, and 4 spotlight cards. Local static server QA confirmed the index and PDF/preview routes return HTTP 200; browser QA confirmed initial 12-card display, 46 cards after reveal, and MySQL filter showing 9 cards.
Selectable portfolio PDF builder
- Date: 2026-07-07. Repo:
llm-wiki. - User direction: make each portfolio card selectable so only checked cards can be turned into a portfolio PDF.
- Added a
PDF 담기checkbox overlay to every card onhuman/portfolio/index.html, plus a sticky selection bar showing the selected count, clear button, current-visible-card selection button, and “선택 항목 PDF 만들기”. - Added
human/portfolio/selected-portfolio-pdf.html, a client-side PDF/print page that reads?items=items/foo.html,..., fetches the selected detail pages, builds a cover, table of contents, and one printable A4 page per selected item, then lets the browser save/print as PDF. - Verification: parser check still passed for 46 cards/counts/links/spotlights; local server returned HTTP 200 for
index.htmland the selected PDF route; browser QA confirmed checkboxes appear, selection count/button state updates, and a 2-item selected PDF route renders 3 pages with 2 item articles and no load error.
Default portfolio card order update
- Date: 2026-07-07. Repo:
llm-wiki. - User direction: change the default order to LabradorLabs → personal → graduate school.
- Reordered
human/portfolio/index.htmlcard blocks to show all 35 LabradorLabs work items first, then 5 personal projects, then 6 graduate-school/research items. - Updated the visible sort note to
래브라도랩스 실무 항목 → 개인 프로젝트 → 대학원 연구 순. - Verification: parser check still passed for 46 cards, filter counts, all 46 detail links, and 4 spotlight links; explicit order assertion passed for lab 35 → personal 5 → academic 6.
System Associates procurement-alert portfolio correction
- Date: 2026-07-07. Repo:
llm-wiki. - User correction: the System Associates item was not an infra portfolio/architecture write-up; it was a Nara Market procurement notice crawler and LLM-based opportunity triage system.
- Rewrote
human/portfolio/items/system-associates-infra-portfolio-architecture.htmlaround the actual system: crawl Nara Market prior notices and normal notices, split relevant notices by keyword groups, connect LLM scoring/star ratings, notify must-see opportunities in Discord, and expose Hermes-powered marketing Q&A from Discord. - Updated the index card title, description, stack chips, aria label, and filter tags. Filter counts changed from DB/Infra 22 → 21 and data-pipeline 17 → 18.
Homepage evidence-provenance wording correction
- Date: 2026-07-10. Repo:
llm-wiki. - Replaced the homepage provenance claim about AI documentation with first-party evidence: EXPLAIN/Grafana measurements, Jira/Confluence records, and comparison against original repositories.
- Verification: the old phrase is absent and the replacement appears once under
human/portfolio/; the deterministic structure check still reports 46 cards, 10 filters with matching counts, 46 unique detail links, 4 spotlight links, and an unchanged 58-link homepagehrefhash; the homepage relative-link check andgit diff --checkpassed.
Public resume recruiter-scan improvements
- Date: 2026-07-10. Repos:
hw-me/hyunwook.tech,llm-wiki. - Backed up the live MongoDB data and current dirty source state before changing the canonical resume service on
home_mac. - Added the current company, role, and period to the hero; reordered the public and generated-PDF sections to experience → skills → education → introduction; replaced the long current-company detail groups with five source-linked representative outcomes; corrected the PDF CTA and filename; removed the public admin-login affordance; and migrated the Home contact to
tech.hwlabs.dev. - Verification: Codex
gpt-5.6-solwithxhighcompleted the implementation; lint, TypeScript no-emit, and production builds passed; the MongoDB post-write export matched the reviewed replacement document; live desktop/mobile Playwright checks returned HTTP 200 with no console errors or failed requests; all five representative links returned HTTP 200; and the browser-generated김현욱_resume.pdfrendered as three A4 pages with 18 clickable link annotations and no blank trailing page.
FIRM-COV research-lineage correction
- Date: 2026-07-10. Repo:
llm-wiki. - Recorded the wiki owner's first-person correction that the M.S. thesis / EF-Fuzz is the parent and origin research for FIRM-COV, and that FIRM-COV is a follow-up and expanded co-authored paper supplemented with additional research, methods, and experiments.
- Updated the canonical academic pages and Korean portfolio to preserve the authorship relationship: Hyunwook Kim is the M.S. thesis author/first author and the third author of FIRM-COV.
- Added an explicit attribution boundary: the detailed task split among FIRM-COV co-authors remains unspecified, and its final techniques and results are paper-level collective content unless a source attributes them individually.
- Verification: the old ambiguous thesis/FIRM-COV wording is absent; reciprocal wiki and portfolio links resolve; the relative-link check passed for the homepage and both detail pages; the homepage remains at 46 cards with unchanged filter counts, 46 unique detail links, and the unchanged route hash
f87018b9456f0605c1639a47bb0066280e3e53503f7fafb26163272574ffdf22;git diff --checkpassed. - Browser QA: local Playwright checks at 1440×1000 and 390×844 returned HTTP 200 with no console errors, failed requests, or horizontal overflow. The academic filter exposed all six research cards; the updated FIRM-COV and EF-Fuzz cards remained aligned at the same row height.
Portfolio hero-title refinement
- Date: 2026-07-10. Repo:
llm-wiki. - Replaced the tentative homepage headline
운영까지 해본 기술 포트폴리오with데이터 시스템을 고치고, 운영 가능한 구조를 남긴 기록so the hero states the portfolio's operating-system improvement theme directly without repeating theTechnical Portfolioeyebrow. - Verification: local Playwright checks at 1440×1000 and 390×844 rendered the exact headline with no horizontal overflow, console errors, failed requests, clipping, or overlap; the homepage relative-link check and
git diff --checkpassed.