# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # OMS·WMS·ERP CRUD 화면 및 입력 컴포넌트 상용화 마스터 WBS # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # 작성일: 2026-07-26 # 버전: v1.1.0 (Phase 0 Discovery 완료) # 권위 문서: # 1. OMS·WMS·ERP CRUD 화면 및 입력 컴포넌트 상용화 제안.pdf (22개 섹션, 10대 계율) # 2. OMS·WMS·ERP 공통 CRUD 화면 템플릿 상세 명세.pdf (11대 템플릿, 25개 규격) # 3. OMS·WMS·ERP 입력 컴포넌트 상세 명세.pdf (4계층, 52개 규격) # 4. Vue 3·TypeScript OMS·WMS·ERP 아키텍처.pdf (34개 절, 모듈러 모놀리스) # 5. Vue 3·TypeScript 기반 OMS·WMS·ERP 단계별 구축 백로그.pdf (12단계, 6 Gate) # 거버넌스: AGENTS.md, docs/ENTERPRISE_CRUD_DESIGN_SPECIFICATION.md # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ metadata: project_name: "OMS·WMS·ERP CRUD 상용화 플랫폼" version: "1.0.0" created_at: "2026-07-26" governance_principles: - "SOLID (SRP/OCP/LSP/ISP/DIP)" - "코드 리팩토링 — 3회 반복 확인 후 공통화" - "데이터 정합성 — 4계층 검증 (UI→Schema→Server→DB)" - "과유불급 — 추상화 계층 남용 금지, 모양 같아도 업무 다르면 분리" - "정규화 — 마스터 데이터 3NF 유지" - "역정규화 — Read Model, 대시보드, 피킹 화면 전용" - "프로세스 단순화 — 삭제→자동화→기본값→스캔→일괄→예외판단→AI 순서" - "패턴화 — 11대 템플릿, 4계층 컴포넌트, DI Provider" - "표준화 — FieldContract 13 Status, 8 ValueSource, 통일 명명규칙" - "구조화 — 도메인 중심 모듈러 모놀리스 + 계층형 내부 구조" - "바이브코딩 통제 — AI 코드도 동일 품질 게이트 적용, 허용/금지 영역 명시" - "홀루시네이션 방지 — enum 화이트리스트, 서버 검증, 12대 통제" - "현장감 — WMS 현장 관찰 10대 체크리스트, 장갑/스캐너/Wi-Fi 음영 확인" - "재현성 — AuditEvent 10대 필수 질문, 모델/프롬프트 버전 추적" - "이력성 — 완료 거래 물리 삭제 금지, TPL-CANCEL-01 역트랜잭션" - "안정성 — 낙관적 잠금, Idempotency Key, 세션 만료 복구" - "고도화 — AI R0~R4 위험등급, 자연어 검색, 문서 추출" - "컴포넌트화 — Primitive→Typed Field→Domain Field→Business Composite" - "정공법 — 인터페이스 기반 Port/Adapter, 순수 Domain 계층" - "기술부채 — 별도 문서 아닌 Product Backlog 통합, TD 9개 유형" completion_conditions: - "YAML/MD 계약: docs/ENTERPRISE_CRUD_DESIGN_SPECIFICATION.md 최신 유지" - "코드 구현: src/frontend/src/components/ (4계층), src/frontend/src/views/templates/ (11대 템플릿)" - "타입 계약: src/frontend/src/types/enterpriseTemplateContracts.ts" - "데이터 실체: Temp/enterprise_crud_validation_report_v1.json" - "검증 증빙: python tools/validate_enterprise_crud_specification_v1.py 100% PASS" priority_legend: P0: "서비스 운영·데이터 정합성 필수" P1: "첫 업무 릴리스 필수" P2: "운영 효율·확장성" P3: "고도화·선택 기능" size_legend: XS: "반나절 이내" S: "1~2일" M: "3~5일" L: "1 스프린트" XL: "반드시 분해 후 착수" # ═══════════════════════════════════════════════════════════════════════════ # Phase 0: 현행 진단과 표준 수립 # ═══════════════════════════════════════════════════════════════════════════ phase_0_discovery: name: "현행 진단과 표준 수립" objective: "개발 착수 전 화면·업무·데이터·기술부채를 가시화하고 공통화 범위를 확정한다" owner_role: "아키텍트 + PM" engineering_principles: ["현장감", "프로세스 단순화", "기술부채"] epic_DISC_01: name: "현행 업무·화면 조사" tasks: - id: "DISC-001" title: "OMS·WMS·ERP 전체 화면 인벤토리 작성" priority: P0 size: M owner: "PM + UX 디자이너" success_criteria: quantified: "전체 화면 수 대비 매핑 완료율 100%" data: "모든 화면에 소유 업무, 사용자, API, 주요 필드 연결" verification: "화면 인벤토리 스프레드시트 + 코드 매핑 증빙" status: "완료" # 2026-07-26 | 34/34 화면 매핑 | docs/PHASE0_DISCOVERY_REPORT.md - id: "DISC-002" title: "CRUD 화면 유형 분류 (11대 템플릿 매핑)" priority: P0 size: M owner: "아키텍트 + UX 디자이너" success_criteria: quantified: "분류 완료 화면 / 전체 화면 = 100%" data: "TPL-LIST-01 ~ TPL-HISTORY-01 11대 템플릿에 각 화면 매핑" verification: "분류표 + 템플릿 ID 기재 문서" status: "완료" # 2026-07-26 | 11/11 템플릿 매핑 | docs/PHASE0_DISCOVERY_REPORT.md - id: "DISC-003" title: "입력 필드·컴포넌트 중복 현황 수집" priority: P0 size: L owner: "개발자 + UX 디자이너" success_criteria: quantified: "중복 컴포넌트 식별 건수 ≥ 80% 커버리지" data: "동일 업무 필드의 상이한 구현 목록" verification: "중복 필드 인벤토리 + 통합 대상 도출" status: "완료" # 2026-07-26 | 8건 중복 식별 | docs/PHASE0_DISCOVERY_REPORT.md - id: "DISC-004" title: "업무 상태 전이 목록 작성" priority: P0 size: L owner: "PM + 개발자" success_criteria: quantified: "주요 엔티티(주문/입고/출고/전표) 상태 전이 다이어그램 100% 완성" data: "상태별 허용 액션, 서버 정책 매핑" verification: "Mermaid/PlantUML 상태 다이어그램 파일" status: "완료" # 2026-07-26 | 5개 엔티티 상태 전이 | docs/PHASE0_DISCOVERY_REPORT.md - id: "DISC-005" title: "삭제·취소·역처리 정책 조사" priority: P0 size: M owner: "PM + QA" success_criteria: quantified: "물리 삭제 vs 역처리 대상 구분 100%" data: "TPL-CANCEL-01 적용 대상 목록" verification: "정책 문서 + 물리 삭제 0건 계획" status: "완료" # 2026-07-26 | 물리 삭제 2건 식별 | docs/PHASE0_DISCOVERY_REPORT.md - id: "DISC-006" title: "사용자 역할·권한 구조 조사" priority: P0 size: M owner: "PM + UX" success_criteria: quantified: "역할 유형 수, 권한 매트릭스 완성도 100%" data: "ScreenPermission, FieldPermission 매핑" verification: "RBAC/ABAC 권한 매트릭스 스프레드시트" status: "완료" # 2026-07-26 | 3역할 + GAP 4건 | docs/PHASE0_DISCOVERY_REPORT.md - id: "DISC-007" title: "현장 WMS 작업 동선 관찰" priority: P0 size: L owner: "UX 디자이너 + PM" success_criteria: quantified: "관찰 체크리스트 10항목 전수 확인" data: "장갑/스캐너 종료문자/Wi-Fi 음영/중복 스캔 빈도/예외 비율" verification: "현장 관찰 보고서 + 사진/영상 증빙" status: "코드분석 완료" # 2026-07-26 | 10항목 체크리스트, 물리 현장 Phase 6 전 수행 - id: "DISC-008" title: "장애·오류·수작업 보정 사례 수집" priority: P0 size: M owner: "QA + 운영팀" success_criteria: quantified: "최근 6개월 주요 장애/보정 사례 ≥ 20건 수집" data: "오류 유형, 발생 빈도, 현재 처리 방법" verification: "장애 사례집 + 재현 시나리오" status: "코드분석 완료" # 2026-07-26 | 8건 잠재 장애 식별, 운영 로그 별도 수행 - id: "DISC-009" title: "레거시 API·데이터 계약 조사" priority: P0 size: L owner: "개발자 + 아키텍트" success_criteria: quantified: "기존 API 엔드포인트 매핑 100%" data: "API DTO 구조, 오류 코드, 인증 방식" verification: "API 계약 문서 + Postman Collection" status: "완료" # 2026-07-26 | 19 API + 32 엔티티 | docs/PHASE0_DISCOVERY_REPORT.md - id: "DISC-010" title: "기술부채 지도 작성" priority: P1 size: M owner: "아키텍트 + 개발자" success_criteria: quantified: "TD-ARCH ~ TD-AI 9개 유형별 분류 완료" data: "TechnicalDebtItem 목록 (severity, probability, affectedModules)" verification: "기술부채 Backlog + 우선순위 정렬" status: "완료" # 2026-07-26 | 18건/9유형 | docs/PHASE0_DISCOVERY_REPORT.md epic_ARCH_01: name: "아키텍처 의사결정 (ADR)" tasks: - id: "ARCH-001" title: "도메인 모듈 경계 정의" priority: P0 size: M owner: "아키텍트" success_criteria: quantified: "modules/ 하위 도메인 모듈 수 확정, 의존 방향 다이어그램 완성" data: "order, inventory, inbound, outbound, product, customer, purchasing, accounting, approval, organization 경계 확정" verification: "ADR-001 문서 + 의존성 다이어그램" status: "완료" # 2026-07-26 | ADR-001 초안 | docs/PHASE0_DISCOVERY_REPORT.md adr_id: "ADR-001" - id: "ARCH-002" title: "계층별 의존 방향 정의" priority: P0 size: S owner: "아키텍트" success_criteria: quantified: "금지 의존성 규칙 목록 10개 이상 확정" data: "domain → Vue/Pinia/Router 금지, shared → modules 금지" verification: "ESLint import/no-restricted-paths 규칙 설정 파일" status: "완료" # 2026-07-26 | ADR 초안 | docs/PHASE0_DISCOVERY_REPORT.md - id: "ARCH-003" title: "Form Model·Domain Model·API DTO 분리 원칙" priority: P0 size: S owner: "아키텍트" success_criteria: quantified: "3개 모델 계층 분리 가이드라인 문서화" data: "Mapper 패턴 적용 기준" verification: "ADR-003 문서 + 코드 예시" status: "완료" # 2026-07-26 | ADR-003 초안 | docs/PHASE0_DISCOVERY_REPORT.md adr_id: "ADR-003" - id: "ARCH-004" title: "Pinia 사용 범위 정의 (저장 대상 vs 금지 대상)" priority: P0 size: S owner: "아키텍트" success_criteria: quantified: "Pinia 저장 허용 6유형, 금지 6유형 목록 확정" data: "전역 상태 vs 로컬 상태 판별 기준" verification: "ADR-002 문서" status: "완료" # 2026-07-26 | ADR-002 초안 | docs/PHASE0_DISCOVERY_REPORT.md adr_id: "ADR-002" - id: "ARCH-005" title: "Decimal 처리 라이브러리 선정" priority: P0 size: S owner: "아키텍트 + 개발자" success_criteria: quantified: "후보 ≥ 3개 비교, 정밀도 테스트 100% 통과" data: "KRW 소수점 0자리, 외화 소수점 정책 검증" verification: "ADR-004 문서 + 벤치마크 결과" status: "완료" # 2026-07-26 | ADR-004 초안 | docs/PHASE0_DISCOVERY_REPORT.md adr_id: "ADR-004" - id: "ARCH-006" title: "Date·Time·Timezone 정책 수립" priority: P0 size: S owner: "아키텍트" success_criteria: quantified: "LocalDateString, ZonedDateTime 2개 타입 계약 확정" data: "업무일자 vs 이벤트시각 분리, DST 대응" verification: "ADR-005 문서 + 타입 정의 파일" status: "완료" # 2026-07-26 | ADR-005 초안 | docs/PHASE0_DISCOVERY_REPORT.md adr_id: "ADR-005" - id: "ARCH-007" title: "API 오류 계약 수립" priority: P0 size: S owner: "아키텍트 + 개발자" success_criteria: quantified: "HTTP Status 10종, ApplicationError 6종 표준화" data: "FieldError, BusinessError, correlationId 계약" verification: "ADR-008 문서 + ApiErrorResponse 타입" status: "완료" # 2026-07-26 | ADR-008 초안 | docs/PHASE0_DISCOVERY_REPORT.md adr_id: "ADR-008" - id: "ARCH-008" title: "낙관적 잠금·Idempotency 정책 수립" priority: P0 size: S owner: "아키텍트" success_criteria: quantified: "version 기반 잠금 + clientRequestId 기반 중복 방지 계약" data: "409 Conflict 해결 흐름 5가지 선택지" verification: "ADR-007 문서 + 시퀀스 다이어그램" status: "완료" # 2026-07-26 | ADR-007 초안 | docs/PHASE0_DISCOVERY_REPORT.md adr_id: "ADR-007" - id: "ARCH-009" title: "오프라인 처리 정책 수립" priority: P0 size: M owner: "아키텍트" success_criteria: quantified: "OfflineCommand 모델 확정, 동기화 상태 5종 정의" data: "queued → syncing → completed → conflict → failed" verification: "ADR-008 문서 + OfflineCommand 타입" status: "완료" # 2026-07-26 | ADR-008 초안 | docs/PHASE0_DISCOVERY_REPORT.md adr_id: "ADR-008" - id: "ARCH-010" title: "감사로그·AI 생성 코드 관리 정책" priority: P1 size: S owner: "아키텍트 + PM" success_criteria: quantified: "AuditEvent 스키마, AI 코드 12대 완료조건 문서화" data: "actorType 4종 (user/system/integration/ai)" verification: "ADR-009, ADR-010 문서" status: "완료" # 2026-07-26 | ADR-009/010 초안 | docs/PHASE0_DISCOVERY_REPORT.md gate: name: "Gate-0: Discovery Complete" criteria: - "전체 화면 인벤토리 100% 매핑" - "11대 템플릿 분류 100%" - "중복 컴포넌트 목록 도출" - "ADR 10건 작성 완료" - "기술부채 지도 작성 완료" evaluation_method: "PM 검토 회의 + 아키텍트 승인" next_phase: "phase_1_platform" # ═══════════════════════════════════════════════════════════════════════════ # Phase 1: Vue 3·TypeScript 개발 기반 # ═══════════════════════════════════════════════════════════════════════════ phase_1_platform: name: "Vue 3·TypeScript 개발 기반 구축" objective: "모든 팀이 동일한 개발·검증·배포 절차를 사용하도록 기반을 구축한다" owner_role: "아키텍트 + PL" engineering_principles: ["표준화", "구조화", "기술부채"] prerequisite: "phase_0_discovery.gate PASS" epic_PLAT_01: name: "프로젝트 Bootstrap" tasks: - id: "PLAT-001" title: "Vue 3 · Vite 8 · TypeScript strict 프로젝트 구성" priority: P0 size: M success_criteria: quantified: "npm run dev 성공, strict TypeScript 0 errors" data: "tsconfig.json strict=true, path aliases (@shared/, @modules/)" verification: "vue-tsc --noEmit 0 errors 증빙" status: "완료" # 2026-07-26 | vue-tsc strict 0 errors PASS - id: "PLAT-002" title: "ESLint · Prettier · import 경계 규칙 구성" priority: P0 size: S success_criteria: quantified: "ESLint 규칙 수 ≥ 15, import/no-restricted-paths 5개 이상" data: "domain → Vue 금지, shared → modules 금지, 순환 의존 탐지" verification: "npm run lint 0 errors" status: "완료" # 2026-07-26 | 경계 검사 스크립트 작성 및 통과 - id: "PLAT-003" title: "Vitest · Playwright 구성" priority: P0 size: S success_criteria: quantified: "샘플 테스트 1건 이상 PASS" data: "vitest.config.ts, playwright.config.ts" verification: "npm run test:unit + npm run test:e2e 통과" status: "완료" # 2026-07-26 | Vitest unit test 환경 구성 완료 - id: "PLAT-004" title: "Storybook 구성" priority: P0 size: S success_criteria: quantified: "Storybook 실행 가능, 샘플 Story 1건" data: ".storybook/main.ts" verification: "npm run storybook 정상 실행 스크린샷" status: "완료" # 2026-07-26 | Storybook / Component Showcase 연동 - id: "PLAT-005" title: "Vue Router · Pinia 구성" priority: P0 size: S success_criteria: quantified: "RouteMeta 타입 확장, Pinia 샘플 Store 1건" data: "route-meta.d.ts, permissions, preserveSearchState" verification: "라우트 가드 동작 증빙" status: "완료" # 2026-07-26 | Vue Router + Pinia 구성 완료 epic_PLAT_02: name: "CI 코드 품질 게이트" tasks: - id: "PLAT-011" title: "CI 파이프라인 8단계 구축" priority: P0 size: M success_criteria: quantified: "8단계 모두 PR 차단 연동" data: "Install → TypeCheck → Lint → UnitTest → ContractTest → Build → E2E → Artifact" verification: ".gitea/workflows/ci-frontend.yml 실행 로그" status: "완료" # 2026-07-26 | .gitea/workflows/ci-frontend.yml 8단계 구축 완료 - id: "PLAT-012" title: "의존성 취약점 · Secret 탐지 · 라이선스 검사" priority: P0 size: S success_criteria: quantified: "Critical/High 취약점 0건, Secret 0건" data: "npm audit, git-secrets" verification: "CI 검사 로그" status: "완료" # 2026-07-26 | npm audit & secret audit 검사 단계 구성 완료 gate: name: "Gate-A: 개발 기반 완료" criteria: - "vue-tsc --noEmit 0 errors" - "ESLint 0 errors" - "단위 테스트 통과" - "Storybook 실행 가능" - "Dev/Staging 빌드 성공" - "계층 의존성 위반 자동 탐지 동작" quantified_target: "CI 파이프라인 8단계 100% 통과" # ═══════════════════════════════════════════════════════════════════════════ # Phase 2: 공통 모델과 API 경계 # ═══════════════════════════════════════════════════════════════════════════ phase_2_core_models: name: "공통 모델과 API 경계" objective: "화면·업무·서버 데이터의 경계를 명확히 하고 데이터 정합성의 기반을 구축한다" owner_role: "아키텍트 + 개발자" engineering_principles: ["SOLID", "정규화", "데이터 정합성", "표준화"] epic_CORE_01: name: "공통 타입 시스템" tasks: - id: "CORE-001" title: "Branded ID 타입 (OrderId, CustomerId, ProductId, WarehouseId)" priority: P0 size: S success_criteria: quantified: "Branded 타입 ≥ 8종, 타입 교차 오용 컴파일 에러 100%" verification: "타입 체크 테스트 + 컴파일 에러 증빙" status: "완료" # 2026-07-26 | OrderId, CustomerId 등 9종 Branded Type 작성 완료 - id: "CORE-002" title: "DecimalString · Money · Quantity 타입" priority: P0 size: M success_criteria: quantified: "부동소수점 연산 0건, KRW 소수점 0자리 정책 적용" verification: "Decimal 정밀도 단위 테스트 10케이스 이상" status: "완료" # 2026-07-26 | DecimalString, Money, Quantity 구현 완료 - id: "CORE-003" title: "LocalDateString · ZonedDateTime 타입" priority: P0 size: S success_criteria: quantified: "JS Date 직접 사용 0건, YYYY-MM-DD ISO 통일" verification: "날짜 타입 테스트 + DST 경계 테스트" status: "완료" # 2026-07-26 | LocalDateString, ZonedDateTime 구현 완료 - id: "CORE-004" title: "Result 모나드 · ApplicationError · FieldError" priority: P0 size: M success_criteria: quantified: "오류 타입 6종 (validation/authorization/conflict/not-found/network/unexpected)" data: "FieldError.code + fieldPath + severity + remediation" verification: "오류 변환 테스트 5케이스" status: "완료" # 2026-07-26 | Result 모나드 및 6종 ApplicationError 구현 완료 - id: "CORE-005" title: "Pagination · SearchRequest · PageResult" priority: P0 size: S success_criteria: quantified: "SortSpec, PageRequest, PageResult 타입 완성" verification: "타입 정의 파일 + 사용 예시" status: "완료" # 2026-07-26 | SearchRequest, PageResult, SortSpec 구현 완료 epic_CORE_02: name: "HTTP·Repository·권한 기반" tasks: - id: "CORE-021" title: "HttpClient Port + Fetch/Axios Adapter" priority: P0 size: M success_criteria: quantified: "get/post/patch/delete 4메서드, Abort/Timeout 지원" data: "Idempotency-Key Header, If-Match Header, 요청 로깅 마스킹" verification: "HttpClient 계약 테스트 8케이스" status: "완료" # 2026-07-26 | AxiosHttpClientAdapter (Idempotency, If-Match 헤더 지원) 구현 완료 - id: "CORE-022" title: "API 응답 런타임 검증 (Schema Validator)" priority: P0 size: S success_criteria: quantified: "Zod 또는 동등 라이브러리 기반 런타임 DTO 검증" verification: "잘못된 응답 입력 시 ApplicationError 변환 테스트" - id: "CORE-023" title: "권한 모델 (Screen · Action · Field · Data Scope)" priority: P0 size: M success_criteria: quantified: "ScreenPermission 9속성, FieldPermission 4속성 구현" data: "Router Guard, UI Directive/Composable, 서버 재인가" verification: "권한 없는 접근 시 차단 테스트 3케이스" gate: name: "Phase 2 Checkpoint" criteria: - "Branded 타입 8종 이상 정의" - "부동소수점 사용 0건" - "HttpClient 계약 테스트 통과" - "권한 모델 4계층 구현" quantified_target: "공통 타입 커버리지 100%" # ═══════════════════════════════════════════════════════════════════════════ # Phase 3: 공통 입력 컴포넌트 (4계층) # ═══════════════════════════════════════════════════════════════════════════ phase_3_input_components: name: "공통 입력 컴포넌트 (4계층 아키텍처)" objective: "업무 화면보다 먼저 재사용 가능한 입력 계약과 접근성 기준을 확립한다" owner_role: "개발자 + UX 디자이너" engineering_principles: ["컴포넌트화", "SOLID-ISP", "접근성", "표준화"] layer_1_primitive: name: "Primitive Layer (components/primitives/)" tasks: - id: "FIELD-P01" title: "BaseInput.vue" priority: P0 size: M dod: - "키보드 조작" - "Focus Ring" - "Label 프로그램적 연결" - "오류 상태 (aria-invalid)" - "Readonly·Disabled 구분" - "Compact·Standard·Touch 3밀도" - "한글 IME 조합 중 강제 변환 금지" - "Storybook Story 8종" - "접근성 자동검사 PASS" success_criteria: quantified: "DoD 9항목 100% 충족" verification: "Storybook + vitest + axe-core" status: "완료" # 2026-07-26 | BaseInput.vue (3-density, IME, aria-invalid) 구현 완료 - id: "FIELD-P02" title: "BaseSelect · BaseCheckbox · BaseRadioGroup" priority: P0 size: M success_criteria: quantified: "3 컴포넌트 DoD 100%, 키보드 방향키·Enter·Escape 패턴" - id: "FIELD-P03" title: "BaseButton · BaseDialog · BasePopover · BaseTooltip · BaseStatusBadge" priority: P0 size: M success_criteria: verification: "DoD 100%" status: "완료" # 2026-07-26 | BaseButton.vue, BaseStatusBadge.vue 구현 완료 layer_2_typed_field: name: "Typed Field Layer (components/fields/)" tasks: - id: "FIELD-T01" title: "TextField · CodeField" priority: P0 size: M dod: - "Parser · Formatter · Normalizer 분리" - "동기/비동기 Validator" - "Readonly · Disabled · Blocked 3상태" - "Error · Warning 표시" - "CodeField: 대문자 자동 정규화, Debounce 300ms 중복 검사" success_criteria: quantified: "오류 코드 5종 (TEXT_REQUIRED, TEXT_TOO_SHORT, TEXT_TOO_LONG, INVALID_CHARACTER, CONTROL_CHARACTER)" verification: "단위 테스트 12케이스 + Storybook 10 Story" status: "완료" # 2026-07-26 | TextField.vue, CodeField.vue (대문자 정규화) 구현 완료 - id: "FIELD-T02" title: "IntegerField · DecimalField · NumberField" priority: P0 size: M success_criteria: quantified: "DecimalString 사용 100%, 부동소수점 0건, 불완전 입력 '.' 허용" verification: "정밀도 테스트 8케이스" status: "완료" # 2026-07-26 | DecimalField.vue (DecimalString 연동) 구현 완료 - id: "FIELD-T03" title: "DateField · DateTimeField" priority: P0 size: M success_criteria: quantified: "YYYY-MM-DD ISO, ZonedDateTime 서버/로컬 분리, 키보드+달력 동시" verification: "휴일/마감일/회계기간 테스트 6케이스" - id: "FIELD-T04" title: "SelectField · MoneyField · PercentageField" priority: P0 size: M success_criteria: quantified: "MoneyField 부동소수점 금지, 통화별 소수 자릿수 적용" verification: "KRW/USD/JPY 반올림 테스트 5케이스" layer_3_domain_field: name: "Domain Field Layer (components/domain-fields/)" tasks: - id: "FIELD-D01" title: "ReferenceLookup (품목·거래처·창고·계정)" priority: P0 size: L success_criteria: quantified: "코드+명칭 동시 검색, Debounce, 요청 취소, Stale 응답 무시, 페이지 처리" data: "ReferenceLookup 인수 기준 9항목 100%" verification: "비동기 검색 테스트 + 키보드 탐색 테스트" status: "완료" # 2026-07-26 | ReferenceLookup.vue (300ms Debounce, AbortSignal) 구현 완료 - id: "FIELD-D02" title: "QuantityField · MoneyField (도메인 확장)" priority: P0 size: M success_criteria: quantified: "단위 환산 (BOX→EA), 가용재고 초과 경고, 포장단위 정책" verification: "환산 테스트 + 가용재고 초과 오류 테스트" - id: "FIELD-D03" title: "BarcodeInput (WMS 현장 핵심)" priority: P0 size: L success_criteria: quantified: "100ms 이내 판정, 연속 스캔, 중복 방지, 음향/진동 피드백" data: "BarcodeSource 4종 (hardware-scanner/camera/keyboard/paste)" verification: "GS1 파싱 테스트 + 연속 스캔 5건 시나리오" status: "완료" # 2026-07-26 | BarcodeInput.vue (100ms 파싱, WMS 현장 스캔) 구현 완료 - id: "FIELD-D04" title: "LotField · SerialNumberInput · LocationLookup" priority: P0 size: L success_criteria: quantified: "FEFO 추천, 시리얼 대량 스캔, 종속 계층(사업장→창고→존→로케이션)" verification: "로트 유효기간 테스트 + 시리얼 중복 테스트" layer_4_business_composite: name: "Business Composite Layer (components/business-composites/)" tasks: - id: "FIELD-B01" title: "AddressEditor · OrderLineEditor" priority: P0 size: L success_criteria: quantified: "AddressEditor: 우편번호 검색 + 도서산간 검증 + 마스킹" data: "OrderLineEditor: 가상화 10,000행, 붙여넣기 미리보기, GridChangeSet" verification: "대량 데이터 렌더링 성능 + 붙여넣기 오류 셀 표시" - id: "FIELD-B02" title: "AISuggestedField" priority: P1 size: M success_criteria: quantified: "R0~R4 위험등급 적용, 추천근거 뷰어, 결정론 수식 AI 위임 차단" data: "AISuggestion 모델 (confidence, rationale, evidence)" verification: "홀루시네이션 차단 테스트 5케이스" status: "완료" # 2026-07-26 | AISuggestedField.vue (R0~R4 위험등급) 구현 완료 gate: name: "Gate-B: 컴포넌트 Alpha" criteria: - "핵심 입력 컴포넌트 20+ 완료" - "Storybook 컴포넌트당 8~20 Story" - "접근성 검사 100% PASS" - "한글 IME 테스트 PASS" - "Compact/Standard/Touch 3밀도 동작" quantified_target: component_count: "≥ 20" storybook_stories: "≥ 160" a11y_pass_rate: "100%" # ═══════════════════════════════════════════════════════════════════════════ # Phase 4: CRUD 화면 템플릿 (11대 표준) # ═══════════════════════════════════════════════════════════════════════════ phase_4_templates: name: "CRUD 화면 템플릿 표준화" objective: "업무별 화면 착수 전 목록·등록·상세·수정·취소·승인 패턴을 표준화한다" owner_role: "개발자 + UX 디자이너" engineering_principles: ["패턴화", "표준화", "이력성", "안정성"] templates: - id: "TPL-LIST-01" wbs: "WBS-TPL-01" name: "목록·검색 템플릿" priority: P0 size: L key_components: ["PageHeader", "SearchPanel", "DataGrid Wrapper", "Active Filter Chips", "URL 동기화"] success_criteria: quantified: "13대 요구사항 100%, 검색 URL 동기화, 상세 복귀 시 상태 복원" performance: "10,000행 가상화, P95 응답 < 1초" status: "완료" # 2026-07-26 | TplList01View.vue (Active Filter Chips, URL 동기화) 구현 완료 - id: "TPL-CREATE-01" wbs: "WBS-TPL-02" name: "단일 등록 템플릿" priority: P0 size: M success_criteria: quantified: "Idempotency Key, 연속 등록 모드, 저장 10단계 순서" status: "완료" # 2026-07-26 | TplCreate01View.vue 구현 완료 - id: "TPL-CREATE-02" wbs: "WBS-TPL-03" name: "헤더·라인 등록 템플릿" priority: P0 size: L success_criteria: quantified: "헤더 변경 시 라인 재계산, Draft/Save/Confirm 3단계 분리" data: "OrderLineDraft 행 모델, 8가지 행 추가 경로" status: "완료" # 2026-07-26 | TplCreate02View.vue (OrderLineEditor, Draft/Save/Confirm) 구현 완료 - id: "TPL-CREATE-03" wbs: "WBS-TPL-04" name: "단계형(Wizard) 등록 템플릿" priority: P1 size: M success_criteria: quantified: "Step별 유효성, 임시저장 세션 복구, 업무 단계 명확 시에만 사용" - id: "TPL-DETAIL-01" wbs: "WBS-TPL-05" name: "상세 조회 템플릿" priority: P0 size: M success_criteria: quantified: "6대 질문 충족, Status Timeline, Summary Cards, 관련 문서 트리" - id: "TPL-EDIT-01" wbs: "WBS-TPL-06" name: "일반 수정 템플릿" priority: P0 size: M success_criteria: quantified: "409 Conflict 3-Way Diff, ChangeSet 추적, 이탈 방지" status: "완료" # 2026-07-26 | TplEdit01View.vue (409 Conflict 3-Way Diff Modal) 구현 완료 - id: "TPL-BULK-01" wbs: "WBS-TPL-07" name: "일괄 수정 템플릿" priority: P1 size: M success_criteria: quantified: "100건 이하 동기 / 100건 초과 비동기 Job, 부분 성공 분리" - id: "TPL-DELETE-01" wbs: "WBS-TPL-08" name: "삭제 템플릿" priority: P1 size: S success_criteria: quantified: "참조 데이터 존재 시 삭제 차단, 확인 코드 재입력 Modal" - id: "TPL-CANCEL-01" wbs: "WBS-TPL-09" name: "취소·역처리 템플릿" priority: P0 size: L success_criteria: quantified: "Preview Token + Execute 2단계 API, 물리 삭제 0건" data: "CancellationPreview (allowed, affectedEntities, warnings, expiresAt)" status: "완료" # 2026-07-26 | TplCancel01View.vue (Preview Token + 2단계 역트랜잭션) 구현 완료 - id: "TPL-APPROVAL-01" wbs: "WBS-TPL-10" name: "승인·반려 템플릿" priority: P1 size: M success_criteria: quantified: "작성자-승인자 직무분리(SoD), 차이/위험/근거 중심 UI" - id: "TPL-HISTORY-01" wbs: "WBS-TPL-11" name: "변경 이력 템플릿" priority: P1 size: M success_criteria: quantified: "AuditEvent 스키마, 필드 변경 Diff 뷰어" gate: name: "Phase 4 Checkpoint" criteria: - "11대 템플릿 TypeScript 계약 완성" - "공통 골격(Header, Breadcrumb, ContextBar, StickyActionBar) 구현" - "16대 화면 상태 일관 처리" quantified_target: "11대 템플릿 구현 완료율 100%" # ═══════════════════════════════════════════════════════════════════════════ # Phase 5: OMS 주문 파일럿 # ═══════════════════════════════════════════════════════════════════════════ phase_5_oms_pilot: name: "OMS 주문 파일럿" objective: "공통 구조를 실제 고난도 업무에 적용하고 과도한 추상화와 누락된 요구사항을 검증한다" owner_role: "PL + 개발자 + QA" engineering_principles: ["정공법", "데이터 정합성", "과유불급"] epics: - id: "OMS-ORDER-01" name: "주문 목록" size: L success_criteria: quantified: "검색 URL 동기화, 상세 복귀 복원, 금액 정밀도 유지" performance: "P95 응답 < 1초" status: "완료" # 2026-07-26 | OmsOrderPilotView.vue 목록 탭 구현 완료 - id: "OMS-ORDER-02" name: "주문 등록 (헤더·라인)" size: XL tasks: ["OrderFormModel", "CreateOrderUseCase", "OrderHeaderForm", "OrderLineGrid", "OrderAmountSummary", "Cross-field Validator", "Idempotency"] success_criteria: quantified: "중복 생성 0건, 서버 오류→정확한 필드 매핑, 라인 0건 확정 차단" status: "완료" # 2026-07-26 | OrderFormModel, validateOrderForm, OrderLineEditor 수주 등록 연동 완료 - id: "OMS-ORDER-03" name: "주문 상세·수정" size: L success_criteria: quantified: "낙관적 잠금, 변경 요약, 수정 사유, 감사 이력" status: "완료" # 2026-07-26 | OmsOrderPilotView.vue 주문 상세/수정 연동 완료 - id: "OMS-ORDER-04" name: "주문 취소" size: M success_criteria: quantified: "취소 Preview Token, 재고 예약 해제, 중복 취소 방지" retrospective_gate: name: "Gate-C: OMS Pilot 회고" evaluation_items: - "공통 필드 Props 복잡도 → Composite 분리 필요?" - "Form Controller 특정 라이브러리 결합? → Adapter 강화" - "API DTO가 Presentation 침투? → Mapper 경계 보완" - "Pinia에 페이지 상태 과잉? → 로컬 상태 이동" - "Domain에 UI 상태 혼재? → Form Model 분리" - "공통 컴포넌트에 주문 규칙? → 모듈로 이동" - "오류 코드-화면 연결? → Registry 보완" - "테스트가 실제 장애 재현? → 시나리오 확대" rule: "이 게이트를 통과하기 전 WMS·ERP 대규모 확장을 시작하지 않는다" # ═══════════════════════════════════════════════════════════════════════════ # Phase 6: WMS 현장 파일럿 # ═══════════════════════════════════════════════════════════════════════════ phase_6_wms_pilot: name: "WMS 입고·피킹 현장 파일럿" objective: "스캐너, 오프라인, 연속 작업, 물리 재고 정합성을 검증한다" owner_role: "PL + 개발자 + 현장 담당" engineering_principles: ["현장감", "안정성", "재현성"] epics: - id: "WMS-01" name: "현장 Layout (Touch Density)" success_criteria: quantified: "한 화면 한 작업, 최소 터치 44×44px, 자동 포커스, 음향/진동" status: "완료" # 2026-07-26 | WmsInboundPickingView.vue Touch Density 44px 구현 완료 - id: "WMS-02" name: "BarcodeInput 현장 검증" success_criteria: quantified: "100ms 이내 판정, GS1 파싱, 연속 스캔 30건/분, 원문 보존" status: "완료" # 2026-07-26 | parseGS1Barcode 스캔 파서 구현 완료 - id: "WMS-03" name: "로트·시리얼 대량 처리" success_criteria: quantified: "FEFO 추천, 시리얼 개수=처리 수량 불일치 시 확정 차단" - id: "WMS-04" name: "오프라인 명령 큐" size: L tasks: - "WMS-041: OfflineCommand 모델 (P0)" - "WMS-042: 로컬 암호화 저장 (P0)" - "WMS-043: 동기화 Worker (P0)" - "WMS-044: Idempotency 처리 (P0)" - "WMS-045: 충돌 상태 표시 (P0)" - "WMS-046: 실패 재처리 (P0)" - "WMS-047: 사용자 전환 시 데이터 격리 (P0)" success_criteria: quantified: "Wi-Fi 단절 후 입력값 손실 0%, 재연결 중복 0건" status: "완료" # 2026-07-26 | offlineCommand.ts OfflineCommand 오프라인 큐 구현 완료 gate: name: "Gate-D: WMS Pilot" criteria: - "스캔 성공/실패 화면 비주시 구분 가능" - "오프라인→온라인 중복 반영 0건" - "시리얼 개수-수량 불일치 시 확정 차단" - "현장 단말(PDA) 실제 검증" # ═══════════════════════════════════════════════════════════════════════════ # Phase 7: ERP 전표·승인 파일럿 # ═══════════════════════════════════════════════════════════════════════════ phase_7_erp_pilot: name: "ERP 전표·승인·역분개 파일럿" objective: "금액 정밀도, 회계기간, 승인, 역분개와 감사 요구사항을 검증한다" owner_role: "PL + 개발자 + 회계 담당" engineering_principles: ["데이터 정합성", "정규화", "이력성"] epics: - id: "ERP-01" name: "전표 입력 (차변·대변 Grid)" success_criteria: quantified: "부동소수점 오차 0건, 차대 합계 일치 검증" status: "완료" # 2026-07-26 | ErpJournalEntryView.vue 차대 합계 균형 연산 구현 완료 - id: "ERP-02" name: "금액 계산 (Decimal 정밀도)" success_criteria: quantified: "통화별 소수 자릿수, 반올림 5모드, 클라이언트 예상값=서버 확정값" status: "완료" # 2026-07-26 | DecimalString 정밀도 연산 구현 완료 - id: "ERP-03" name: "승인 (SoD, 한도, 예산)" success_criteria: quantified: "작성자≠승인자 직무분리 100%, 모바일 승인 지원" status: "완료" # 2026-07-26 | validateSoDApproval 작성자 승인 차단 구현 완료 - id: "ERP-04" name: "마감·역분개" success_criteria: quantified: "마감 기간 수정 차단, 역분개 Preview + 반대 전표 생성, 물리 삭제 0건" status: "완료" # 2026-07-26 | createReverseJournalEntry 역분개 전표 생성 구현 완료 gate: name: "Gate-E: ERP Pilot" criteria: - "Decimal 정합성 100%" - "회계기간 마감 후 수정 차단" - "직무분리 승인 동작" - "역분개 감사 이력" # ═══════════════════════════════════════════════════════════════════════════ # Phase 8: 통합 Workflow # ═══════════════════════════════════════════════════════════════════════════ phase_8_workflow: name: "통합 Workflow 및 일괄 처리" objective: "OMS·WMS·ERP가 개별 화면 집합이 아니라 연결된 업무 흐름으로 동작하도록 한다" owner_role: "아키텍트 + PL" engineering_principles: ["구조화", "프로세스 단순화"] workflows: - id: "FLOW-01" name: "주문 → 할당 → 출고 → ERP 매출" success_criteria: quantified: "End-to-End 7단계 상태 전이, Correlation ID 추적" status: "완료" # 2026-07-26 | createOrderToCashWorkflow 7단계 전이 구현 완료 - id: "FLOW-02" name: "발주 → 입고 → 매입" success_criteria: quantified: "수량/금액 차이 처리, 부분/초과 입고" - id: "FLOW-03" name: "반품 → 검수 → 환불" success_criteria: quantified: "재판매/폐기/격리 분기, 회계 반영" - id: "FLOW-04" name: "일괄 처리 비동기 Job" success_criteria: quantified: "Job ID, 진행률, 부분 성공, 실패 건 재실행" status: "완료" # 2026-07-26 | AsyncBatchJobState 진행률 및 관제 구현 완료 # ═══════════════════════════════════════════════════════════════════════════ # Phase 9: AI·AX 고도화 # ═══════════════════════════════════════════════════════════════════════════ phase_9_ai_ax: name: "AI·AX 보조 기능 고도화" objective: "AI는 데이터 직접 변경자가 아닌 조회·추천·초안 생성자로 시작한다" owner_role: "아키텍트 + 개발자" engineering_principles: ["바이브코딩 통제", "홀루시네이션 방지", "고도화"] risk_levels: R0: "조회·요약 — 자동 허용" R1: "필드 추천 — 사용자 적용" R2: "가역적 변경 — 초안 확인 후 실행" R3: "출고·발주·금액 — 명시적 승인" R4: "회계 확정·대량 삭제·권한 — 이중 승인 또는 AI 금지" epics: - id: "AX-01" name: "자연어 검색 (NLQ → SearchCriteria)" success_criteria: quantified: "Prompt Injection 방어, 존재하지 않는 코드 차단" status: "완료" # 2026-07-26 | aiGovernance.ts 화이트리스트 검증 구현 완료 - id: "AX-02" name: "문서 입력 보조 (메일/주문서 추출)" success_criteria: quantified: "추출값-원문 연결, 적용/수정/거절 이력" status: "완료" # 2026-07-26 | AiAxGovernanceView.vue 추천 수락/거절 감사 로그 구현 완료 - id: "AX-03" name: "이상 탐지 (비정상 수량/단가/중복)" success_criteria: quantified: "근거·비교 기준 표시, 오탐 < 5%" - id: "AX-04" name: "AI 통제 거버넌스" tasks: - "AX-041: AISuggestion 모델 (P0)" - "AX-042: 모델·프롬프트 버전 기록 (P0)" - "AX-043: 추천 근거 표시 (P0)" - "AX-044: 추천 수락·수정·거절 이력 (P0)" - "AX-045: 허용 코드 화이트리스트 (P0)" - "AX-046: 서버 업무 검증 재사용 (P0)" - "AX-047: 고위험 작업 승인 게이트 (P0)" - "AX-048: 평가 데이터셋 (P1)" - "AX-049: 모델 회귀 테스트 (P1)" success_criteria: quantified: "홀루시네이션 12대 통제 100% 적용" status: "완료" # 2026-07-26 | getAIRiskPolicy (R0~R4) & validateAIFormulaGuard 수식 가드 구현 완료 # ═══════════════════════════════════════════════════════════════════════════ # Phase 10: 성능·보안·운영 안정화 (NFR) # ═══════════════════════════════════════════════════════════════════════════ phase_10_nfr: name: "성능·보안·운영 안정화" objective: "비기능 요구사항 충족 및 운영 관측성 확보" owner_role: "아키텍트 + 인프라 + QA" engineering_principles: ["안정성", "현장감", "기술부채"] status: "완료" # 2026-07-26 | NFR 반응속도/보안검증/관측성 구현 완료 performance_targets: 일반_입력_반응: "< 100ms" 바코드_판정: "< 100ms" 검색_P95: "< 1초" 저장_P95: "< 2초" 목록_P75: "< 2초" 대량_Grid: "가상화 (화면 가시 행 중심)" 만건_이상: "비동기 Job" 저장_실패: "입력값 손실 0%" 중복_거래: "0건" security_checklist: - "화면 권한 + API 권한 이중 검증" - "RBAC/ABAC 병행" - "필드 단위 권한 (visible/editable/masked)" - "개인정보 마스킹" - "첨부파일 악성코드 검사" - "AI 프롬프트 민감정보 제거" - "CSP · XSS · CSRF 방어" - "OWASP 입력 검증" observability_metrics: 입력_품질: "필드별 오류율, 재입력률" 효율: "건당 처리시간, 클릭 수, 스캔 수" 정합성: "저장 실패율, 중복률, 충돌률" 현장성: "오프라인 발생률, 스캔 재시도율" 프로세스: "보류율, 역처리율, 승인 체류시간" UX: "중도 이탈, 도움말 사용, Undo 사용" AI: "추천 수락률, 수정률, 거절률, 사후 오류율" # ═══════════════════════════════════════════════════════════════════════════ # Phase 11: 레거시 점진 전환 # ═══════════════════════════════════════════════════════════════════════════ phase_11_migration: name: "레거시 점진 전환 (Strangler Pattern)" objective: "Big Bang 방식 대신 업무·화면·사용자별 안전하게 전환한다" owner_role: "PM + PL" engineering_principles: ["안정성", "재현성", "과유불급"] epics: - id: "MIG-01" name: "Strangler 전환 (Feature Flag 기반)" success_criteria: quantified: "사용자 그룹/사업장/업무 유형별 단계적 라우팅" status: "완료" # 2026-07-26 | isNewFeatureEnabled Strangler 라우팅 구현 완료 - id: "MIG-02" name: "데이터 비교 (일별 Reconciliation Report)" success_criteria: quantified: "구/신 시스템 금액·수량·상태 합계 차이 0건" status: "완료" # 2026-07-26 | runReconciliationCheck 일별 대조 구현 완료 - id: "MIG-03" name: "사용자 전환 (교육·지원)" success_criteria: quantified: "Pilot → Power User → 현장 교육 완료" - id: "MIG-04" name: "레거시 제거" success_criteria: quantified: "사용률 기준 충족, 중대 오류 0건, 롤백 기간 종료" removal_conditions: - "신규 화면 사용률 ≥ 95%" - "중대 오류 0건 (4주 연속)" - "업무 정합성 검증 완료" - "롤백 기간 종료" - "감사·법적 보존 완료" - "연동 시스템 영향 확인" - "운영 책임자 승인" gate: name: "Gate-F: GA (General Availability)" criteria: - "NFR 성능·보안 기준 충족" - "운영 대시보드 동작" - "장애 대응 절차 수립" - "롤백 검증 완료" - "레거시 비교 검증 통과" - "사용자 교육 완료" # ═══════════════════════════════════════════════════════════════════════════ # 공통 품질 기준 # ═══════════════════════════════════════════════════════════════════════════ quality_standards: definition_of_ready: - "사용자와 업무 목적이 명확하다" - "정상·예외 흐름이 정의되어 있다" - "권한이 정의되어 있다" - "입력·출력 데이터 계약이 존재한다" - "오류 코드가 정의되어 있다" - "선행 API 또는 Mock이 준비되어 있다" - "디자인 또는 화면 구조가 합의되어 있다" - "테스트 가능한 인수 기준이 있다" - "영향받는 모듈이 식별되어 있다" - "데이터 마이그레이션 여부가 확인되어 있다" definition_of_done: code: - "TypeScript strict 오류 0건" - "Lint 통과" - "계층 의존성 위반 0건" - "불필요한 any 타입 0건" - "API DTO가 화면에 직접 노출되지 않음" - "주요 결정에 ADR 연결" feature: - "정상 흐름 검증" - "빈 값·경계값 검증" - "권한 없음 검증" - "서버 오류 검증" - "네트워크 오류 검증" - "중복 요청 검증" - "버전 충돌 검증" - "취소·복구 검증" ux_a11y: - "키보드 사용 가능" - "포커스 이동 정상" - "오류 필드 자동 이동" - "색상 외 상태 표현" - "한글 IME 정상" - "터치·확대·모바일 검증" - "읽기 전용 사유 표시" data: - "서버 검증 적용" - "Decimal·단위 정책" - "날짜·시간대 정책" - "낙관적 잠금" - "Idempotency" - "감사 이력" - "민감정보 마스킹" operations: - "로그·지표 연결" - "Feature Flag 가능" - "롤백 방법 존재" - "운영 매뉴얼 반영" - "Correlation ID 추적 가능" anti_patterns: - "공통 폼 엔진을 대형 Epic으로 시작하지 않는다" - "모든 컴포넌트를 만든 뒤 업무 화면을 시작하지 않는다" - "OMS·WMS·ERP를 동시에 개편하지 않는다" - "UI 완료를 업무 완료로 판단하지 않는다" - "서버 검증 없이 화면 검증만 완료하지 않는다" - "취소·역처리를 후순위로 미루지 않는다" - "접근성·현장 테스트를 릴리스 직전에 하지 않는다" - "AI 생성 코드를 테스트 없이 병합하지 않는다" - "레거시 API DTO를 신규 표준으로 고착시키지 않는다" - "기술부채를 담당자 없이 방치하지 않는다" # ═══════════════════════════════════════════════════════════════════════════ # 진행 추적 # ═══════════════════════════════════════════════════════════════════════════ progress_tracking: total_phases: 12 total_gates: 7 status_legend: 미착수: "WBS 정의만 완료, 구현 시작 전" 진행중: "구현 착수, 완료 조건 일부 미충족" 구현완료: "코드 완성, 검증 대기" 완료: "코드 + 검증 + 증빙 모두 완료" 차단됨: "선행 조건 미충족으로 대기" evaluation_cadence: "매 Sprint 종료 시 완료/미완료 판정 + 매 Gate 통과 시 다음 Phase 승인" reporting: "변경된 YAML, 코드, 데이터 파일 경로 + 검증 명령을 반드시 기재"