v0.1.0 Release Notes — devflow-k8s-deploy
Release Date: 2026-04-21
PR: #2
HEAD commit (feature branch): 608209f
Base commit (INCEPTION 종료): 558d8e8
요약
JVM(Kotlin + Java Spring Boot) 백엔드 프로젝트를 분석하여 Dockerfile + Kubernetes manifest를 자동 생성하는 Claude Code 플러그인 v0.1.0 초기 릴리즈. AIDLC devflow 워크플로우로 INCEPTION → CONSTRUCTION 전체 사이클을 거쳐 구축.
| 지표 |
값 |
| 개발 기간 |
2026-04-15 ~ 2026-04-21 (7일) |
| 총 커밋 |
INCEPTION 종료 558d8e8 → PR HEAD 608209f (30+ 커밋) |
| Units |
16개 완성 (6 phase) |
| Tests |
613 passed, ruff/mypy strict clean |
| 리뷰 사이클 |
Claude 내부 3-Stage × 16 unit + Codex 외부 1회 |
| Critical 이슈 해결 |
5건 (Path Traversal, YAML injection, Redact, CLI entry, F-43 매트릭스) |
| 기타 이슈 반영 |
Important 60+ 건 |
INCEPTION (2026-04-15 ~ 2026-04-17)
7단계 스테이지 흐름
| 스테이지 |
Depth |
결과물 |
| workspace-detection |
— |
Greenfield 확정 (스캐폴딩만 존재: README / plugin.json / LICENSE / .gitignore) |
| brainstorming (side-skill) |
— |
v0.1.0 scope lock: JVM 전용, 13 design axes 결정. Codex 독립 리뷰 반영 |
| requirements-analysis |
Comprehensive |
71 F-* (F-09 reserved) + 17 NFR + 13 assumptions + 8 risks |
| user-stories |
Comprehensive |
22 stories (Must 17 / Should 4 / Could 1), 4 actors, 8 tech requirements |
| nfr-requirements |
GENERATE |
17 NFR (개발자 도구/CLI + MVP 프로파일), 2건 조정 + NFR-SEC-05 신규 |
| workflow-planning |
— |
3 접근법 생성 → A안 (설계 우선) 선택 |
| application-design |
Comprehensive DETAIL |
12개 컴포넌트 상세 설계 + 5-STEP 시퀀스 다이어그램 + 보조 산출물 7종 |
외부 검토 2회 (8건 반영)
- 1차 LIST: 3-페르소나 + Codex 리뷰 → 컴포넌트 15→12 (NamespaceResolver/AutoFixLoop/ContainerBuildRunner 인라인 흡수)
- 2차 DETAIL: spec-reviewer GO-WITH-CHANGES + Codex No-Go → NFR-SEC-05 픽스처 강화, 시그니처 정합, retry.py FixOutcome 구조체, F-56 pass-through, types.py 카탈로그, 서브유닛 매핑, F-* 카운트 정정(73→71) 등 전부 반영 후 양쪽 모두 GO 상태로 해소
핵심 결정 (CONSTRUCTION에서 변경 금지)
- JVM 단독 스택 (Go/Python/React는 v0.2~v0.4)
- generate-only 경계, NFR-SEC-05 CI allowlist 테스트로 회귀 방지 (런타임 가드 없음)
- build opt-in (기본 skip)
- Jinja2 템플릿 + Atomic write (SIGINT/SIGTERM 핸들러 + 7일 고아 GC)
- 비개발자 친화: F-02a 한국어 의도 질문 + F-02b "? 도움말" + NFR-17 전 STEP 한국어 요약 + 원어 병기
- summary.json
validation.skipped[] 안전 계약 (CI degraded success 오인 방지)
- Spring Boot
/tmp + /var/log 자동 emptyDir (운영 503 방지)
CONSTRUCTION (2026-04-17 ~ 2026-04-21)
Phase 전환
- 2026-04-17: INCEPTION → CONSTRUCTION 전환.
-construction worktree 분리 유지.
units-generation (Standard depth)
- 16 units / 6 phases 분해 (application-design §E 권장 SkillPipeline 서브유닛 분해 포함)
- 각 unit의 책임 / 의존성 / 인터페이스 / 테스트 경계 정의
code-generation (SDD 모드, Standard depth, TDD)
- Unit별 순차 TDD (RED-GREEN-REFACTOR) + 각 unit 3-Stage 리뷰(Spec/Quality/Security 병렬)
- Critical/Important 이슈 반영 후 다음 unit 진입
Phase 1: 기반
| # |
Unit |
Tests |
커밋 |
Stage별 Verdict 요약 |
| 1 |
shared |
35 → 96 cumulative (fileio/image_ref/text_safety 보강으로 후속 증가) |
865ba2c |
Stage 1 PASS / 2&3 CONDITIONAL → Critical 3 + Important 3 반영 |
Phase 2: 독립 컴포넌트 (shared만 의존)
| # |
Unit |
Tests |
커밋 |
Stage별 Verdict 요약 |
| 2 |
stack_module |
96 (61 신규) |
22a1215 |
Stage 1 CONDITIONAL / 2 CONDITIONAL / 3 CONDITIONAL → Critical 1 + Important 7 + Minor 8 + ValueError 대칭 2 반영. StackDetectResult에 build_system/actuator_enabled 필드 추가. defusedxml + fileio 헬퍼 도입 |
| 3 |
template_renderer |
122 (26 신규) |
06b9e81 |
Stage 1 PASS / 2&3 CONDITIONAL → Important 4 반영 (StrictUndefined + sanitization boundary docstring) |
| 4 |
config_loader |
156 (34 신규) |
95e9b60 |
Stage 1 PASS / 2&3 CONDITIONAL → Important 5 반영. ResolvedConfig.layer_raws 필드 추가(shared 보강). YAML bomb 방어 + symlink escape + OSError 구분 |
| 5 |
atomic_writer |
177 (21 신규) |
868ac9c |
Stage 1 PASS / 2 CONDITIONAL / 3 Critical 1 (symlink GC) → Critical 1 + Important 5 반영 |
| 6 |
k8s_validator |
272 (95 신규) |
b91b841 init → Stage 1 FAIL (F-43 매트릭스 전면 불일치 — 내 prompt 실수) → ebcb0a9 재작업 → 4676e8b Important 6 |
F-43 매트릭스 정합 복구. CLI(--json/--skipped CSV) + 3단계 exit code. check_yaml_refs fileio 공용화. int 예외/None-chain 방어 |
| 7 |
kubectl_dry_runner |
298 (26 신규) |
84a31dd |
Stage 1 PASS(98) / 2 CONDITIONAL / 3 Issues Found → Important 5 반영. --dry-run=client allowlist + degraded skip + timeout 10s + manifest_dir 방어 + UnicodeDecodeError 방어 |
Phase 3: 통합 컴포넌트
| # |
Unit |
Tests |
커밋 |
Stage별 Verdict 요약 |
| 8 |
project_analyzer |
348 (50 신규) |
50f4b46 init + 612ec6a + 9697950 Kotlin DSL colon |
Stage 3 Critical 1 (Path Traversal via multi-module include '..') → Critical 1 + Important 9 반영 |
| 9 |
dockerfile_generator |
372 (24 신규) |
7073155 init + 030933c Important 5 |
multi-stage(JDK builder→JRE runner) + non-root + 캐시 레이어 + OCI image regex allowlist + 개행 인젝션 방어 + build_system 토큰 분해 |
| 10 |
manifest_generator |
421 (49 신규) |
32e6e91 init + baff9b2/0bd08ab/edb6352 |
Stage 3 Critical 2 (Service/SA 입력 검증 누락 + exposure whitelist 부재) → Critical 2 + Important 6 반영. _validate_image_tag → scripts/_shared/image_ref.py 공용화 + TemplateRenderer trim_blocks/lstrip_blocks 추가 |
| 11 |
output_packager |
476 (55 신규) |
3c51dff init + 88d52c3/a86898c |
Stage 3 Critical 1 (BailOutContext redact 미적용 — types.py:290 명세 위반) → Critical 1 + Important 6 반영. redact_sensitive(Bearer/JWT/kubeconfig/token) + _shared/text_safety.py 공용화(Unit 9/10/11 공유) |
| 12 |
pipeline_build_runner |
506 (30 신규) |
d84896d init + ab08f73 Important 5 |
F-102 timeout 주입(+0=무제한) + BuildResult.stdout/stderr/exit_code 확장 + detect_engine Literal 좁힘 + fileio.is_within 재사용 + engine whitelist assert |
| 13 |
pipeline_retry_loop |
525 (19 신규) |
b01acbc init + 76c20a4 Minor 3 |
Stage 1 PASS(95) / 2 Approved(9) / 3 Secure — Critical/Important 0 (최초). Minor 3: application-design drift 교정 (exit_code <=2 → != 1, F-42 정합) + _empty_report() factory |
Phase 4: 오케스트레이터 (최대 unit)
| # |
Unit |
Tests |
커밋 |
Stage별 Verdict 요약 |
| 14 |
pipeline_orchestrator |
559 (34 신규) |
58281bf init + 4d3ce60 Important 6 |
5-STEP 전체 + PipelineDependencies DI + HelpCatalog 10 term + MessagePolicy + retry_loop + BailOutError 처리. _safe_section(config None-chain 방어) + prompt 응답 검증 + image_tag 검증 + _raise_bailout 공통화 + cast + _coerce_literal_or_default |
Phase 5: SKILL + 문서
| # |
Unit |
Tests |
커밋 |
Stage별 Verdict 요약 |
| 15 |
skill_md_and_readme |
564 (5 신규) |
970308e init + 6f92ccc/6c9fd9d/eec406b |
Stage 2 Requires Changes(72, Critical 2) → Critical 2 + Important 5 반영. orchestrator.py CLI 진입점 추가 (main + argparse + _build_default_dependencies) + F-83 summary.json 스키마 정합 + 경로 모델 통일 + CI set -uo pipefail + registry.example.com |
Phase 6: CI 보안
| # |
Unit |
Tests |
커밋 |
Stage별 Verdict 요약 |
| 16 |
security_tests |
597 (33 신규) |
5c7b5fc init + 6ad9b90/33036e2 |
Stage 3 CONDITIONAL(스펙 준수도 70%) → Important 5 반영 후 100%. autouse conftest + 글로벌 subprocess.run 패치 + 인젝션 토큰 14종(+\n/\r/\x00) + kubectl 7 forbidden verbs + 픽스처 자체 검증 |
build-and-test (Standard depth)
- pytest 597 → 602 → 607 → 613 (E2E + Codex 수정 누적)
- ruff / mypy strict clean
- CLI smoke test: 실제 Spring Boot 샘플 프로젝트로 파이프라인 실행 → 6 파일 생성 성공
E2E smoke test 통합 버그 3건 (2026-04-21)
unit 단위 테스트(MagicMock 기반)가 catch하지 못한 통합 이슈:
| 버그 |
증상 |
커밋 |
해결 |
| A |
ValueError: k8s DNS-1123 label 위반: namespace='None' |
2cd4439 |
orchestrator 자동 모드가 config_loader.resolve_namespace() 미호출 → 4단계 조회(project→org→user_input→project_dir) 정식 사용. app_name None도 project_dir.name으로 DNS-1123 정규화 fallback |
| B |
BailOut 시 troubleshoot.md 생성됐지만 AtomicWriter cleanup으로 삭제됨 |
49db1ed |
AtomicWriter.bailout_commit() 추가 — staging_dir를 {output_dir}-failed-{timestamp}/로 atomic rename. 실패 상태의 Dockerfile + manifest + troubleshoot 전체 보존 |
| C |
kubectl apply --dry-run=client가 OpenAPI 스키마 fetch 시도 (connection refused) |
34578ad/47b5145/35cd057/cb1a7ad |
--validate=false 추가(6-tuple allowlist) + kubectl 1.35에서 unable to recognize 에러는 connection refused 패턴 감지로 graceful skip (F-56 degraded 확장) |
Codex 외부 리뷰 (2026-04-21, /codex:review --scope branch)
Claude 내부 리뷰가 놓친 3건 추가 발견:
| 버그 |
Severity |
커밋 |
해결 |
| P1 |
Critical — Dockerfile builder image에 Maven/Gradle 없어 빌드 실패 |
7c2ff9e |
gradle:jdk21-alpine / maven:3.9-eclipse-temurin-21-alpine 공식 이미지로 교체. runner는 eclipse-temurin:21-jre-alpine 유지 |
| P2 |
Important — TimeoutExpired text-mode에서 str.decode() 크래시 |
abcd8ae |
_maybe_decode() 헬퍼 (bytes/str/None 방어) |
| P3 |
Important — UserInputs.output_dir 무시 (prompt 모드) |
f9f95cf |
prompt 모드에서 inputs.output_dir 우선, 자동 모드는 method arg fallback |
aidlc-finishing-a-development-branch
- 옵션 B 선택: PR 생성
git push -u origin feature/v0.1.0-construction
gh pr create --base main → PR #2 생성
- state:
complete + Finishing Choice: B (PR pending) + PR URL 기록
주요 이슈 해결 전체 타임라인
| 시점 |
이슈 |
심각도 |
해결 위치 |
| Unit 6 Stage 1 |
F-43 Rule ID 매트릭스 전면 불일치 |
FAIL |
전면 재작업 (prompt 실수 복구) |
| Unit 8 Stage 3 |
Path Traversal via multi-module include '..' |
Critical |
이름 validation + is_within(project_root) |
| Unit 10 Stage 3 |
YAML 인젝션 (Service/SA/exposure) |
Critical 2 |
공통 입력 검증 + exposure whitelist |
| Unit 11 Stage 3 |
BailOutContext redact 미적용 (Bearer/JWT/kubeconfig 누출) |
Critical |
redact_sensitive + text_safety 공용화 |
| Unit 15 Stage 2 |
orchestrator.py CLI 진입점 부재 |
Critical |
main() + argparse + _build_default_dependencies |
| E2E A |
namespace='None' 문자열 |
통합 Critical |
config_loader.resolve_namespace() 정식 호출 |
| E2E B |
BailOut troubleshoot 소실 |
통합 Critical |
AtomicWriter.bailout_commit() |
| E2E C |
kubectl --dry-run=client cluster 연결 시도 |
통합 Critical |
--validate=false + connection refused skip |
| Codex P1 |
Builder image 도구 부재 |
외부 Critical |
공식 Gradle/Maven 이미지 |
| Codex P2 |
TimeoutExpired decode 크래시 |
외부 Important |
_maybe_decode 방어 |
| Codex P3 |
UserInputs.output_dir 무시 |
외부 Important |
prompt 모드 inputs 우선 |
application-design drift 교정 2회
개발 중 실제 구현과 spec 간 불일치 발견 → 문서 보정:
-
Unit 13 리뷰 (2026-04-19) — commit 76c20a4
- §1 / §B의
success_predicate=lambda r: r.exit_code <= 2 → r.exit_code != 1
- F-42(0=PASS, 1=FAIL, 2=WARN) 기준으로
<= 2는 항상 True → retry 루프 무력화. 버그 수정.
-
E2E 버그 C (2026-04-21) — commit 35cd057
- §10 kubectl allowlist: 5-tuple → 6-tuple (
--validate=false 추가)
- cluster-less 환경에서 실제 동작하도록
공용 유틸 추출 (shared 보강 3회)
개발 중 여러 unit이 유사 로직을 반복 → 공용 유틸 승격:
| 유틸 |
파일 |
소유 unit |
공유 unit |
| OCI image regex allowlist |
scripts/_shared/image_ref.py |
신규 (Unit 10 리뷰 때) |
Unit 9 + Unit 10 + Unit 11 + Unit 12 |
reject_unsafe_chars + redact_sensitive |
scripts/_shared/text_safety.py |
신규 (Unit 11 리뷰 때) |
Unit 9/10/11 |
read_text_limited + is_within + check_yaml_refs |
scripts/_shared/fileio.py |
신규 (Unit 2 리뷰 때) + 공용화 (Unit 6) |
Unit 2/4/6/8/10/12 |
최종 산출물
devflow 산출물
devflow-docs/inception/ — requirements / user-stories / nfr-requirements / workflow-plan / application-design / units / brainstorming / workspace / references
devflow-docs/construction/build-and-test/ — build-instructions.md / test-instructions.md
devflow-docs/release/ — v0.1.0-release-notes.md (이 파일)
devflow-docs/devflow-state.md / session-summary.md / devflow-audit.md
코드 산출물
skills/devflow-k8s-deploy/SKILL.md — Claude 프롬프트 본문 + 도움말 카탈로그 10 term
README.md — 사용법 / 설정 스키마 / exit code / CI 통합 패턴
scripts/ (18 파일):
_shared/ (8): types.py / errors.py / retry.py / defaults.py / fileio.py / image_ref.py / text_safety.py / __init__.py
stacks/ (3): base.py / jvm.py / __init__.py
- 단일 (6):
template_renderer.py / config_loader.py / atomic_writer.py / validate_k8s.py / kubectl_dry_runner.py / dockerfile_generator.py / manifest_generator.py / project_analyzer.py / output_packager.py
pipeline/ (4): orchestrator.py / retry_loop.py / build_runner.py / __init__.py
templates/:
dockerfile/jvm.tmpl
manifest/{deployment,service,serviceaccount}.tmpl
tests/ (613 tests):
_shared/ / stacks/ / 개별 unit 테스트 / integration/ (conftest + boundary allowlist + E2E smoke)
pyproject.toml / .python-version / uv.lock
v0.1.0 제약 (Known Limitations)
- JVM 스택 전용 (Kotlin + Spring Boot). Go/Python/React는 v0.2~v0.4 로드맵
- Deployment만 생성 (StatefulSet 미지원 — stateful 앱 감지 시 경고만)
- auto-fix 루프 v0.2+ 예정 — 현재는 수동 개입 안내
kubeconform 같은 offline validator 미도입 (v0.2+ 로드맵) — 현재는 --validate=false + connection refused graceful skip으로 우회
- BuildPlan 일반화(JDK/JRE 2단계 가정 완화) — v0.2+ Go 추가 직전
- 도움말 카탈로그 외부 파일(
help/{lang}.yml) 분리 — v0.2+
NetworkPolicy / PodDisruptionBudget / PVC 미생성 — v0.2+
v0.2+ 백로그
devflow-docs/inception/application-design.md의 "v0.2+ 백로그" 섹션 통합 기록:
- NetworkPolicy / PDB / Stateful 신뢰도 개선 / LB 비용 경고
- BuildPlan 일반화 (Go/Python/React 확장 대비)
- 도움말 카탈로그 외부화
- StackModule
validate_compat (호환성 검증 API)
- auto-fix 루프 (retry_loop + fix_attempt 구현체)
- F-91 시그니처 정합 (
build_plan(detect_result)) requirements.md 동기화
다음 단계
- PR #2 리뷰 + 머지
- 머지 후
"devflow 재개해줘" 세션 시작 → using-devflow가 PR 머지 상태 자동 확인 → Phase complete → finished 전환 + -construction worktree 제거 안내
v0.1.0 Git tag (옵션)
- v0.2+ 로드맵 INCEPTION 착수 (Go 스택 추가가 1순위)
참고 문서