LLM WikiAccess-protected knowledge portal

WIKI

2026-W25 Worklog

AI Summary Purpose Tracks development work across repositories for this week. Key points Add coding work entries here after meaningful agent sessions. Keep entries concise. Promote durable knowledge to ai/repo notes/ or ai/wiki/ . Relevant

경로ai/worklog/2026/2026-W25.md
카테고리Worklog
태그#ai-review #backfill #crawler #kubernetes #malicious-packages #maven #mysql #report #security #study #w25 #worklog

# 2026-W25 Worklog

AI Summary

Purpose:

Key points:

Relevant when:

Do not read full document unless:

Linked documents:

Work Items

Study blog MySQL core chapter added

OpenSSF 악성 패키지(MAL) RAW 수집 PoC + 설계 확정

우리 인벤토리와 즉시 조인하지 않고 독립 RAW 자산으로 수집. 인벤토리 매핑은 이후 레이어로 분리.

(osv/malicious/<eco>/<pkg>/MAL-*.json), data/manifest.json에 head_commit·생태계 카운트 기록.

nuget 773 · go 18 · vscode 20 · crates.io 9 · maven 2 · packagist/git 1. OS 배포판 0건 (OpenSSF malicious-packages는 언어 레지스트리 전용).

=출처/감사추적(다중 출처 신뢰도). 버전 표현 ranges만 89.6% / versions만 7.4% / 둘 다 3.1%. 상한 있는 케이스 희소(fixed 33 / last_affected 128 / introduced≠0 1,709) — 탈취 후 수정된 고가치 케이스. versions는 불연속 많음(min~max 합치기 금지). 한 product에 range 다중 747건.

- 스키마: 단일 TB_COMP_LIB_MAL(RAW는 git 보존, RAW_DATA/_RAW/V1 없음), PK (VULN_ID, ECOSYSTEM, PRODUCT_KEY) — 실측상 advisory당 1패키지·중복 0 검증. - VULN_RANGE: | 구분 토큰(구간/단일버전)의 합집합. versions는 v1|v2|v3, range 다중은 union. - DEPRECATED(0/1) 소프트삭제 + VIEW_COMP_LIB_MAL(활성만) — 배포(distribution) sync로 흘러가므로 물리 삭제 금지(상태 전이). - ecosystem 정규화: OSV→내부 대문자 코드(Packagist→COMPOSER, crates.io→CARGO, Go→GOLANG …), 케이싱 불일치(pypi/PYPI, Cargo/CARGO)는 조인 시 UPPER() 흡수, vscode/git은 매핑 없음 → 스킵+로그. - 증분 복구: prev 유효성은 merge-base --is-ancestor로 판정, 무효 시 commit_time 폴백(반드시 내림 ≤), 최후엔 full reconcile(HEAD 트리 ↔ DB 활성 행 대조, 주기 실행 시 self-heal). 상태는 TB_CRAWLER_STATUS TYPE='OPENSSF_MAL'{commit_id, commit_time}.

key=IV=b'NPMNPMNPMNPMNPMN', ai/labradorlabs/util/aesCbc.py(deterministic). 2026-W24 npm missing-products 작업에서 확인된 것과 동일. → 적재 시 npm만 이 해시 적용하면 됨.

상태 전이를 소비하는 연동 방식.

DB 적재/증분은 미구현(설계만). llm-wiki 커밋: 35bc508(문서 3종) → 638b951(정규화/스키마/RANGE) → 27e61df(증분 복구).

OpenSSF MAL 수집기 구현 + DAG + K8s 배포 디버깅

dat-3242/openssf_created→main), ~/labrador/platform/labrador-data-platform (DAT-3242/openssf_mal→main), llm-wiki. 설계의 "미구현"을 실제 구현·배포로 진행.

서브클래스 + LabradorDB, 모델 TB_COMP_LIB_MAL(+공유 CrawlerStatus), repo_sync.py (git clone/pull·증분 기준점 복구), mal_transform.py(REPOSITORY 정규화·npm AES PRODUCT_KEY·RANGE | 합집합), main.py. 커밋 f3e8a4e(pre-commit black/isort/pylint/ mypy/docstring 전부 통과).

로 통일(코드+설계 문서 4종).

단일 태스크, /resources PVC 마운트, schedule="0 6 * * *", full_reconcile param. osv_vuln.py 모델. 커밋 0ed7e6a.

(rustdecimal=CARGO (,), pyrefly=NPM 해시키, easyascii=불연속 v1|v2|..., styled-components=range 다중 union (,), intercom-php=COMPOSER 5.0.2, pyphetools=[0.9.120,0.9.121)) 변환 확인. (DB/git/컨테이너 동작은 클러스터에서.)

- 067b83f git -c safe.directory=* → git은 -c(CLI)의 safe.directory를 보안상 무시 → 실패. - df0a56a GIT_CONFIG_GLOBAL env → 베이스 이미지 bullseye git 2.30이 미지원(2.32+) → 실패. - 94609dd HOME.gitconfig* + 명시 repo 경로 등록 → 명시 경로는 전 버전 지원 → 해결. - 교훈: python:3.12-slim-bullseye = git 2.30.x. safe.directory 명시 경로가 버전 무관 안전. _git 실패 시 stderr를 예외에 포함하게 바꿔 원인 가시화.

추출해 검증 → main 직접 커밋 불가, feature 브랜치 커밋 후 FF 머지가 정석. data-platform은 prepare-commit-msg(bash 3.2 ^^ 비호환)·pre-push(astro 미설치)가 로컬에서 깨져 그 커밋만 훅 우회(품질검사 black/mypy는 통과 확인).

mermaid 시퀀스 추가(파서 호환 위해 ;/%%/alias 괄호 제거).

소유권 통과까지 확인, 이후 파싱·적재 단계 검증 예정.

OpenSSF MAL: advisory 메타 테이블 TB_COMP_LIB_MAL_INFO 추가

ID=VULN_ID, 생성·업데이트 라이프사이클은 MAL과 동일하게.

osv.references — REFERENCES는 예약어라 MAL_ 접두), ALIASES(JSON, osv.aliases), DEPRECATED(0/1) + RECORD_CREATED/UPDATED. + VIEW_COMP_LIB_MAL_INFO(활성만).

양쪽 deprecate→재upsert, full sweep도 양쪽. MAL 행 생긴 advisory에 대해서만 INFO 생성(정합). 같은 컨테이너/DAG가 두 테이블 함께 적재(DAG·이미지 변경 없음).

직렬화), pre-commit(black/isort/pylint 10·mypy·docstring) 통과. 커밋 debf1b7(scrapers branch+main), 설계 문서·repo-note 반영 fb28fd9(llm-wiki).

증분은 변경분만 건드려 기존 데이터로는 MAL_INFO가 안 채워짐.

maven 누락 백필: not_found 원인 규명 + collect 버전수집 결함 수정

날짜 워크디렉터리 2026-06-16/(recover99·fill_missing·fill_springai·recover_topup_wd· maven_not_found_reasons.md).

146건이 여전히 누락 → 원인 규명 요청.

기본 DB(gatheringdb)만 보면 java/MAVEN product 0건으로 오판 → 반드시 labradordb 스키마로 조회. 실측 product 909,797건. (MCP mysql-gatheringdb는 동일 서버지만 default db라 product 안 보임.)

Central은 artifact-level metadata.xml을 항상 보장하지 않음 — (a) metadata 404인데 디렉터리·버전은 실재(org.onosproject:* 등), (b) metadata 200이나 플러그인 그룹 메타데이터라 <versions> 없음 (org.openidentityplatform:openicf). 이 경우들이 통째로 "gone/no-version"으로 스킵됨.

metadata 404 또는 <versions> 비면 {artifact}/ HTML에서 첫글자 숫자 디렉터리를 버전으로 열거. dir도 404면 gone 유지.

디렉터리명≠artifactId인 비표준 배치(예: org/neodatis/odb/1.9.21.672/neodatis-odb-*.pom/.jar)에서 404. 표준명 404 시 버전 디렉터리를 리스팅해 실제 .pom(*-<version>.pom 메인 우선)·.sha1 파일을 찾아 재시도 (헬퍼 _list_dir_files/_pick_pom_file). 표준 경로면 추가 요청 없음. 검증: neodatis odb → POM 파싱 (선언 좌표 org.neodatis.odb:neodatis-odb)·sha1 수집 성공, 표준/gone 케이스 회귀 없음.

POM 없어 thin) / B.404 완전소멸 43(metadata·dir 모두 404, 복구불가) / C.meta있지만 누락 4 (플러그인메타·빈네임스페이스·case불일치) / D.가짜좌표 2(group.springframework.ai:* — groupId가 group.으로 깨진 인덱스 노이즈, 실제 org.springframework.ai:*는 이미 DB 존재).

POM-less coord(onos *-features.xml)가 96개라 version 행 4,104개는 thin(license/sha1/deps null) — POM이 원천 없어 메타 채울 수 없음. 사용자 결정 = thin 유지.

제거분 .recoverable.txt.

deps를 VALUES(=phase1단계 null)로 덮음. 기존 상세행이 있는 패키지에 phase1 --sink db를 그냥 돌리면 기존 메타 전멸. 안전 절차 = --sink file로 받고 → 기존 DB버전을 out_phase2_done.txt에 seed해 누락분만 phase2 → --phase load(detailed는 upsert, thin은 INSERT IGNORE로 기존 보호).

(maven 5,160/DB 2,736 → 5,160, 단 신규 2,288은 metadata엔 있으나 실아티팩트 없는 유령 버전=thin, 유지 결정), com.gitee.huanminabc:null-chain(6→15, -release/-RELEASE case는 collation 0900_ai_ci로 병합), org.springframework.ai:spring-ai-bom(35→40, 신규 5버전 POM 상세까지 정상).

PK collation utf8mb4_0900_ai_ci(악센트/대소문자 무시)라 clean 키 INSERT가 중복판정되어 갱신만 됨. finder는 파이썬 exact 비교라 매번 누락으로 재플래그(고착).

깨진 좌표(group.*)·깨진 키(bgg-clienẗ́) 정정. durable 트랩은 repo-note 승격 후보.

dotnet 크롤러: LIST pending(PROCESSED=0) 안 줆 — all-or-nothing 페이지 완료 디버깅 + leaf fetch 재시도

버전 단위 누락 체크(maven/rubygems/composer) + composer 165 백필·LATEST 보정

- maven extract_maven_missing_versions.py: nexus 인덱스 g:a:v − DB gatheringdb.TB_COMP_LIB_VERSION_JAVA(2,057만), sort -u+comm 외부정렬. 결과 누락 1,045,271. - rubygems extract_rubygems_missing_versions.py: rubygems.org/versions 전역 인덱스(yanked 제외, 버전-플랫폼→버전번호) − DB(186만). 결과 누락 9,895. - composer extract_composer_missing_versions.py: Packagist는 전역 버전 인덱스가 없어 패키지별 repo.packagist.org/p2/{name}.json(stable; dev는 ~dev.json이라 자동 제외) 전수(52만), resume 가능. 결과 누락 718,431 버전 / 91,322 패키지 / gone-404 69,874.

NuGet(dotnet) 버전 단위 누락 체커 추가

go 크롤러 queue-lock stuck 진단 + main indexer↔worker 인터리브(데몬화)

go "60만 누락" 전수 분해 — 진짜 누락 거의 없음 확인

go pending 백필 — "60만 누락" 99.3% 해소 + proxy 실검증

GBrain MCP applied to Claude Code, Codex, and Hermes

- Claude Code: claude mcp add -s user gbrain -- /home/khw-bot/.bun/bin/gbrain serve. - Codex: codex mcp add gbrain -- /home/khw-bot/.bun/bin/gbrain serve. - Hermes: hermes mcp add gbrain --command /home/khw-bot/.bun/bin/gbrain --args serve with all 92 GBrain tools enabled.

- claude mcp list reports gbrain ... ✔ Connected. - codex mcp list and codex mcp get gbrain show enabled stdio server with command /home/khw-bot/.bun/bin/gbrain and arg serve. - hermes mcp list shows gbrain enabled. Hermes needs a new session before the tools appear in the active toolset.