# 현재 상태 · 미결 결정 작업을 이어받을 때 여기서 시작한다. **지금 시점의 상태와 다음에 할 일**만 담는다. - 프로젝트 개요·설계 원칙 → [CLAUDE.md](CLAUDE.md) - SBOM·CVE 게이트 메커니즘 → [doc/sbom-pipeline.md](doc/sbom-pipeline.md) 최종 갱신: 2026-08-03 --- ## 다음 작업 **CVE 게이트(`scripts/pipeline/cve-gate.py`)를 도입했다 — 아직 warn-only다.** `sbom.yml` 에 게이트 판정 스텝을 추가했지만 `--warn-only` 로 실행돼 실패해도 워크플로/PR 을 막지 않는다. **45+ 개 카탈로그 차트가 이 게이트로 한 번도 트리아지된 적이 없다** — 강제 게이트(`--warn-only` 제거)로 전환하려면 먼저 전체 카탈로그 스캔 1회로 몇 개 이미지가 차단되는지 파악해야 한다. `gh workflow run helm-catalog-sbom --ref main`(또는 대상 브랜치)으로 전체 스캔 후 `cve-gate.md` 아티팩트를 확인한다. **`doc/cve-exceptions.json` 이 비어 있다.** 첫 전체 스캔에서 차단 항목이 나오면 대응 우선순위(상위 태그 교체 → 베이스 OS 교체 → 자체 빌드 → 예외 승인)를 검토하고, 예외는 근거·만료일을 명시해 추가한다. **커버리지 자가진단(`CoverageProbe`)이 이식되지 않았다.** security-catalog 의 `scan-sbom.sh` 는 센티널 패키지 주입 재스캔으로 "0건"과 "측정되지 않음"을 구분하지만, dip-catalog 의 `scan-sbom.sh` 는 이 로직이 없다 — 게이트는 findings 총계 0건을 보수적으로 차단 처리하는 구버전 경로로만 동작한다. 45+ 차트 규모에서 이 판정이 오탐을 얼마나 내는지 실측 후 이식 여부를 결정한다. **`images/`에 이미지 3종(`cloudnative-pg`, `cnpg-postgresql`, `etcd`)이 security-catalog 프로젝트에서 포팅됐지만 dip-catalog 자체 CI(`build-image.yml`)로는 아직 한 번도 빌드·게이트·push 를 실행해본 적이 없다.** 현재 카탈로그 values(`custom-values.yaml`/ `dip-values.yaml`)가 참조하는 태그는 전부 security-catalog 쪽에서 이미 빌드·게이트 PASS·push 된 실제 이미지(`docker.io/wbsong111/...`)를 그대로 재사용하는 것이다 — dip-catalog 파이프라인으로 재현·재검증된 적은 없다. 최종 런타임 베이스 OS 정책은 security-catalog 의 SUSE BCI 고정 결정을 그대로 따랐다(ADR 자체는 미이관, 아래 참고). **레지스트리 마이그레이션(`docker.io/wbsong111` → `docker.io/paasup`)이 필요하다.** `build-image.yml` 의 `REGISTRY_HOST` 는 이미 `docker.io/paasup` 로 설정돼 있지만 (아래 항목 참고) 위 3개 이미지가 실제로 가리키는 곳은 아직 `docker.io/wbsong111` 다. `REGISTRY=docker.io/paasup` 로 3개 이미지를 재빌드·재게이트·재검증해 PASS 를 확인한 뒤에만 6개 values 파일(`manifests/helm/{cloudnative-pg/0.29.0,cnpg-cluster/1.0.0, etcd/1.1.12}/{custom-values,dip-values}.yaml`, cnpg-cluster 는 `dip-values.yaml` 도 `imageName` 오버라이드가 있음)의 이미지 참조를 새 태그로 교체한다. push 자격 증명 확인은 바로 아래 항목과 동일하다. **`doc/decisions/`·`doc/analysis/` 디렉토리 자체가 dip-catalog 에 없다.** 포팅된 3개 이미지의 README·values 코멘트가 `doc/decisions/000X-*.md`, `doc/analysis/*.md`, `doc/image-selection.md`, `doc/cve-zero-pipeline.md`, `doc/architecture/build-pipeline.md` 를 근거로 계속 인용하지만 이 경로들은 dip-catalog 에 하나도 없다(security-catalog 프로젝트에만 있음). 당장 급한 건 아니지만, 이 상태로는 이 레포만 보는 사람이 자체 빌드 결정의 CVE 실측·비교 근거를 확인할 방법이 없다 — 각 README 에 이미 요약된 근거(CVE 번호·후보 비교표)를 압축한 로컬 stub ADR 작성을 검토한다. **`doc/define-chart-resources.md` 에 신규 차트 3종(`cloudnative-pg`, `cnpg-cluster`, `etcd`) 의 Small/Medium/Large 리소스 프로파일이 없다.** CLAUDE.md 의 "신규 차트 추가" 규칙(리소스 프로파일 필수)을 아직 못 지켰다 — custom-values.yaml 의 기존 requests/limits/storage 값을 근거로 표를 추가하는 별도 작업으로 처리한다. **`SBOM_PIPELINE_IMAGE` 재빌드가 보류돼 있다.** 이 마이그레이션으로 빌드 컨텍스트 경로가 `doc/scripts/Dockerfile` → `scripts/pipeline/Dockerfile` 로 바뀌었다. Dockerfile 내용 자체는 안 바뀌었으므로 기존 `docker.io/wbsong111/sbom-pipeline:latest` 는 당장 깨지지 않지만, `paasup` 네임스페이스로 이전할지는 별도 결정이 필요하다. **재빌드 + push + Repo Variable `SBOM_PIPELINE_IMAGE` 갱신은 git 커밋으로 되지 않는 수동 작업**이다. **`build-image.yml` 의 `REGISTRY_HOST` 를 `docker.io/paasup` 로 설정했다.** 실제 이미지를 push 하려면 `DOCKERHUB_USER`/`DOCKERHUB_TOKEN` 시크릿이 `paasup` 조직 네임스페이스에 push 권한을 가져야 한다 — **미확인**, 실제 첫 자체 빌드 시도 전에 확인 필요. 이제 `images/` 의 3개 이미지가 실사용 후보이므로 위 "레지스트리 마이그레이션" 항목이 이 확인을 실제로 필요로 하는 첫 사례다. --- ## 미결 결정 ### 게이트 강제력 전환 시점 "45+ 차트 미검증" 문제 해소 후 결정한다. branch protection(필수 상태 체크)도 게이트 강제와 짝을 이뤄야 의미가 있다 — 지금은 미설정. ### scan-sbom.sh 커버리지 자가진단 이식 여부 위 "다음 작업" 참고. 이식하면 dip-catalog scan-sbom.sh 와 security-catalog 버전의 동작 차이가 사라지지만, 스캔 시간이 늘어난다(대상별 추가 재스캔). ### SBOM_PIPELINE_IMAGE 재빌드/네임스페이스 전환 결정 나면 `docker.io/paasup/sbom-pipeline:...` 로 빌드·push 하고 Repo Variable `SBOM_PIPELINE_IMAGE` 를 갱신한다(수동, out-of-band).