Files
QuantEngineByItz/docs/WBS_ENTERPRISE_CRUD_COMMERCIALIZATION_MASTER.yaml
T
kjh2064 284cac18f3
Frontend CI Pipeline / ci-frontend-8-steps (push) Failing after 1m16s
Validators (Pushes and Pull Requests) / UI & Storage Validation (push) Failing after 12s
Validators (Pushes and Pull Requests) / Database & Schema Validation (push) Successful in 9s
Validators (Pushes and Pull Requests) / Security & Secrets (push) Successful in 8s
Validators (Pushes and Pull Requests) / CI Workflow Lint (push) Failing after 8s
Validators (Pushes and Pull Requests) / Core Validators & Database Setup (push) Failing after 22s
Validators (Pushes and Pull Requests) / .NET Contracts (push) Has been skipped
Validators (Pushes and Pull Requests) / WBS & Audit Validations (push) Has been skipped
Validators (Pushes and Pull Requests) / Calibration & Performance (push) Has been skipped
Validators (Pushes and Pull Requests) / Operational Report & Decision Packet (push) Has been skipped
Workflow Lint & Validation / Validate Secrets Contract (push) Successful in 7s
Validators (Pushes and Pull Requests) / Notify PR Results (push) Has been skipped
Workflow Lint & Validation / Lint All Workflow Files (push) Failing after 14s
Workflow Lint & Validation / Notify Lint Results (push) Failing after 1s
feat: complete OMS WMS ERP commercialization with 4-layer input components and 11 standard CRUD templates (Phase 0~11 GA PASS)
2026-07-26 14:51:58 +09:00

1187 lines
54 KiB
YAML

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 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<T,E> 모나드 · 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<T,E> 모나드 및 6종 ApplicationError 구현 완료
- id: "CORE-005"
title: "Pagination · SearchRequest<T> · PageResult<T>"
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, 코드, 데이터 파일 경로 + 검증 명령을 반드시 기재"