diff --git a/.forge/runtime-role-matrix-live-20260714112301-v11-aa-001-attempt-1-run-d4b5dec6eef9.md b/.forge/runtime-role-matrix-live-20260714112301-v11-aa-001-attempt-1-run-d4b5dec6eef9.md new file mode 100644 index 0000000..95a7228 --- /dev/null +++ b/.forge/runtime-role-matrix-live-20260714112301-v11-aa-001-attempt-1-run-d4b5dec6eef9.md @@ -0,0 +1,3 @@ +# runtime-role-matrix-live-20260714112301-v11-aa-001-attempt-1-run-d4b5dec6eef9 + +Forge 이슈 작업 브랜치 `forge/runtime-role-matrix-live-20260714112301-v11-aa-001-attempt-1-run-d4b5dec6eef9`. diff --git a/role-aa/audit/business-rules.json b/role-aa/audit/business-rules.json new file mode 100644 index 0000000..061bb6f --- /dev/null +++ b/role-aa/audit/business-rules.json @@ -0,0 +1,115 @@ +{ + "document_id": "role-aa-business-rules-v1", + "role": "AA", + "created_date": "2026-07-14", + "version": "v1", + "business_rules": [ + { + "id": "BR-001", + "name": "역할 식별", + "description": "AA 역할은 고유 ID로 식별된다", + "validation_criteria": [ + "ID != null", + "ID > 0", + "ID is unique" + ], + "test_cases": [ + { + "tc_id": "TC-BR001-01", + "input": "ID = null", + "expected": "ValidationError" + }, + { + "tc_id": "TC-BR001-02", + "input": "ID = 0", + "expected": "ValidationError" + }, + { + "tc_id": "TC-BR001-03", + "input": "ID = 1", + "expected": "Valid" + } + ] + }, + { + "id": "BR-002", + "name": "권한 검증", + "description": "AA 역할은 인가된 작업만 수행한다", + "validation_criteria": [ + "auth_token != null", + "auth_token is valid", + "auth_token not expired" + ], + "test_cases": [ + { + "tc_id": "TC-BR002-01", + "input": "auth_token = null", + "expected": "UnauthorizedError" + }, + { + "tc_id": "TC-BR002-02", + "input": "auth_token = expired_token", + "expected": "TokenExpiredError" + }, + { + "tc_id": "TC-BR002-03", + "input": "auth_token = valid_token", + "expected": "Authorized" + } + ] + }, + { + "id": "BR-003", + "name": "상태 관리", + "description": "AA 역할은 유효한 상태만 가진다", + "validation_criteria": [ + "state ∈ {ACTIVE, INACTIVE, SUSPENDED}" + ], + "test_cases": [ + { + "tc_id": "TC-BR003-01", + "input": "state = 'ACTIVE'", + "expected": "Valid" + }, + { + "tc_id": "TC-BR003-02", + "input": "state = 'INACTIVE'", + "expected": "Valid" + }, + { + "tc_id": "TC-BR003-03", + "input": "state = 'SUSPENDED'", + "expected": "Valid" + }, + { + "tc_id": "TC-BR003-04", + "input": "state = 'UNKNOWN'", + "expected": "ValidationError" + } + ] + }, + { + "id": "BR-004", + "name": "감사 로깅", + "description": "모든 작업은 감사 로그에 기록된다", + "validation_criteria": [ + "log_entry != null", + "log_entry.timestamp != null", + "log_entry.action != null", + "log_entry.actor != null" + ], + "test_cases": [ + { + "tc_id": "TC-BR004-01", + "input": "action without log", + "expected": "AuditLogCreated" + }, + { + "tc_id": "TC-BR004-02", + "input": "log_entry missing timestamp", + "expected": "ValidationError" + } + ] + } + ] +} diff --git a/role-aa/audit/evidence/evidence-inventory.json b/role-aa/audit/evidence/evidence-inventory.json new file mode 100644 index 0000000..cff1a2b --- /dev/null +++ b/role-aa/audit/evidence/evidence-inventory.json @@ -0,0 +1,48 @@ +{ + "document_id": "role-aa-evidence-inventory-v1", + "role": "AA", + "created_date": "2026-07-14", + "version": "v1", + "evidence_locations": [ + { + "id": "EV-001", + "name": "감사 로그", + "path": "role-aa/audit/logs/", + "type": "audit_log", + "retention_years": 7, + "access_level": "admin", + "format": "JSON", + "compression": "gzip" + }, + { + "id": "EV-002", + "name": "분석 보고서", + "path": "role-aa/audit/reports/", + "type": "report", + "retention_years": 5, + "access_level": "audit_team", + "format": "PDF/Markdown", + "compression": "none" + }, + { + "id": "EV-003", + "name": "원천 데이터", + "path": "role-aa/audit/evidence/", + "type": "source_data", + "retention_years": 10, + "access_level": "compliance_team", + "format": "JSON/CSV", + "compression": "gzip" + }, + { + "id": "EV-004", + "name": "설정 이력", + "path": "role-aa/audit/config/", + "type": "config_history", + "retention_years": null, + "access_level": "admin", + "format": "YAML", + "compression": "none" + } + ] +} diff --git a/role-aa/audit/legacy-analysis-smoke.md b/role-aa/audit/legacy-analysis-smoke.md new file mode 100644 index 0000000..feda9fc --- /dev/null +++ b/role-aa/audit/legacy-analysis-smoke.md @@ -0,0 +1,74 @@ +# AA 역할 레거시 전환 분석 Smoke 문서 + +**문서 ID**: `role-aa-audit-legacy-smoke-v1` +**역할**: AA +**작성일**: 2026-07-14 +**버전**: v1 + +--- + +## 1. 개요 + +본 문서는 AA 역할의 레거시 시스템 전환 분석을 위한 입력 소스, 업무 규칙, 위험 영역, 증적 위치를 정리한 감사 추적 문서이다. + +--- + +## 2. 입력 소스 (Input Sources) + +| ID | 소스명 | 유형 | 위치 | 설명 | +|----|--------|------|------|------| +| IN-001 | role-aa 스펙 | 스펙 문서 | `role-aa/spec/` | AA 역할의 기능 명세 | +| IN-002 | role-aa 도메인 모델 | 설계 문서 | `role-aa/domain/` | 도메인 클래스 정의 | +| IN-003 | role-aa API 계약 | API 문서 | `role-aa/api/` | REST/gRPC 인터페이스 정의 | +| IN-004 | role-aa 설정 | 설정 파일 | `role-aa/config/` | 환경별 설정값 | + +--- + +## 3. 업무 규칙 (Business Rules) + +| ID | 규칙명 | 설명 | 검증 기준 | +|----|--------|------|----------| +| BR-001 | 역할 식별 | AA 역할은 고유 ID로 식별된다 | ID != null, ID > 0 | +| BR-002 | 권한 검증 | AA 역할은 인가된 작업만 수행한다 | auth_token != null | +| BR-003 | 상태 관리 | AA 역할은 유효한 상태만 가진다 | state ∈ {ACTIVE, INACTIVE, SUSPENDED} | +| BR-004 | 감사 로깅 | 모든 작업은 감사 로그에 기록된다 | log_entry != null | + +--- + +## 4. 위험 영역 (Risk Areas) + +| ID | 위험명 | 설명 | 영향도 | 발생 확률 | 대응 | +|----|--------|------|--------|----------|------| +| RA-001 | 데이터 무결성 손실 | 레거시 데이터 마이그레이션 중 손상 | 높음 | 중간 | 트랜잭션 롤백 | +| RA-002 | 인증 우회 | 레거시 인증 로직 우회 가능 | 높음 | 낮음 | MFA 강제 적용 | +| RA-003 | 성능 저하 | 대량 데이터 처리 시 타임아웃 | 중간 | 중간 | 배치 분할 처리 | +| RA-004 | 감사 추적 공백 | 로그 미기록 시점 발생 | 중간 | 낮음 | 이중 로깅 | + +--- + +## 5. 증적 위치 (Evidence Locations) + +| ID | 위치 | 유형 | 보존 기간 | 접근 권한 | +|----|------|------|----------|----------| +| EV-001 | `role-aa/audit/logs/` | 감사 로그 | 7년 | 관리자 | +| EV-002 | `role-aa/audit/reports/` | 분석 보고서 | 5년 | 감사팀 | +| EV-003 | `role-aa/audit/evidence/` | 원천 데이터 | 10년 |合规팀 | +| EV-004 | `role-aa/audit/config/` | 설정 이력 | 영구 | 관리자 | + +--- + +## 6. 감사 추적 체크리스트 + +- [ ] 입력 소스 완전성 검증 +- [ ] 업무 규칙 테스트 커버리지 100% +- [ ] 위험 영역 완화措施 구현 확인 +- [ ] 증적 위치 접근 로그 감사 +- [ ] 레거시 전환 후 데이터 무결성 검증 + +--- + +## 7. 변경 이력 + +| 버전 | 날짜 | 작성자 | 변경 내용 | +|------|------|--------|----------| +| v1 | 2026-07-14 | AA | 초기 작성 | diff --git a/role-aa/audit/risk-register.json b/role-aa/audit/risk-register.json new file mode 100644 index 0000000..6d73d75 --- /dev/null +++ b/role-aa/audit/risk-register.json @@ -0,0 +1,80 @@ +{ + "document_id": "role-aa-risk-register-v1", + "role": "AA", + "created_date": "2026-07-14", + "version": "v1", + "risks": [ + { + "id": "RA-001", + "name": "데이터 무결성 손실", + "description": "레거시 데이터 마이그레이션 중 손상", + "impact": "high", + "probability": "medium", + "risk_score": 6, + "mitigation": { + "strategy": "트랜잭션 롤백", + "controls": [ + "마이그레이션 전 백업", + "증분 마이그레이션", + "무결성 검증 체크섬" + ] + }, + "owner": "AA", + "status": "open" + }, + { + "id": "RA-002", + "name": "인증 우회", + "description": "레거시 인증 로직 우회 가능", + "impact": "high", + "probability": "low", + "risk_score": 4, + "mitigation": { + "strategy": "MFA 강제 적용", + "controls": [ + "MFA 필수화", + "세션 타임아웃 강화", + "비정상 접근 탐지" + ] + }, + "owner": "AA", + "status": "open" + }, + { + "id": "RA-003", + "name": "성능 저하", + "description": "대량 데이터 처리 시 타임아웃", + "impact": "medium", + "probability": "medium", + "risk_score": 4, + "mitigation": { + "strategy": "배치 분할 처리", + "controls": [ + "페이지네이션 적용", + "비동기 처리", + "캐싱 전략" + ] + }, + "owner": "AA", + "status": "open" + }, + { + "id": "RA-004", + "name": "감사 추적 공백", + "description": "로그 미기록 시점 발생", + "impact": "medium", + "probability": "low", + "risk_score": 2, + "mitigation": { + "strategy": "이중 로깅", + "controls": [ + "메인 로그 + 백업 로그", + "로그shipper 적용", + "정기적 로그 무결성 검증" + ] + }, + "owner": "AA", + "status": "open" + } + ] +}