diff --git a/.forge/role-aa-live-v2-001-attempt-1-run-de657bad1198.md b/.forge/role-aa-live-v2-001-attempt-1-run-de657bad1198.md
new file mode 100644
index 0000000..a852708
--- /dev/null
+++ b/.forge/role-aa-live-v2-001-attempt-1-run-de657bad1198.md
@@ -0,0 +1,3 @@
+# role-aa-live-v2-001-attempt-1-run-de657bad1198
+
+Forge 이슈 작업 브랜치 `forge/role-aa-live-v2-001-attempt-1-run-de657bad1198`.
diff --git a/.forge/role-developer-live-v2-001-attempt-1-run-9e6f13ecd795.md b/.forge/role-developer-live-v2-001-attempt-1-run-9e6f13ecd795.md
new file mode 100644
index 0000000..42ef3bc
--- /dev/null
+++ b/.forge/role-developer-live-v2-001-attempt-1-run-9e6f13ecd795.md
@@ -0,0 +1,3 @@
+# role-developer-live-v2-001-attempt-1-run-9e6f13ecd795
+
+Forge 이슈 작업 브랜치 `forge/role-developer-live-v2-001-attempt-1-run-9e6f13ecd795`.
diff --git a/.forge/role-reviewer-live-v2-001-attempt-2-run-9ce46a8b5e18.md b/.forge/role-reviewer-live-v2-001-attempt-2-run-9ce46a8b5e18.md
new file mode 100644
index 0000000..f93ee94
--- /dev/null
+++ b/.forge/role-reviewer-live-v2-001-attempt-2-run-9ce46a8b5e18.md
@@ -0,0 +1,3 @@
+# role-reviewer-live-v2-001-attempt-2-run-9ce46a8b5e18
+
+Forge 이슈 작업 브랜치 `forge/role-reviewer-live-v2-001-attempt-2-run-9ce46a8b5e18`.
diff --git a/audit/AA-legacy-analysis-evidence.json b/audit/AA-legacy-analysis-evidence.json
new file mode 100644
index 0000000..fb3ab33
--- /dev/null
+++ b/audit/AA-legacy-analysis-evidence.json
@@ -0,0 +1,162 @@
+{
+ "auditId": "AUDIT-AA-LEGACY-001",
+ "project": "runtime-role-matrix-live-202607141522-v2",
+ "role": "AA",
+ "analysisDate": "2025-07-14",
+ "version": "1.0",
+ "inputSources": [
+ {
+ "id": "IS-001",
+ "name": "역할 매트릭스 원본 데이터",
+ "type": "data",
+ "location": "data/role-matrix-source.csv",
+ "collectedDate": "2025-07-14",
+ "status": "verified"
+ },
+ {
+ "id": "IS-002",
+ "name": "런타임 역할 매트릭스 설정",
+ "type": "config",
+ "location": "config/runtime-role-matrix.json",
+ "collectedDate": "2025-07-14",
+ "status": "verified"
+ },
+ {
+ "id": "IS-003",
+ "name": "AA 역할 정의 스키마",
+ "type": "schema",
+ "location": "schema/role-aa-schema.yaml",
+ "collectedDate": "2025-07-14",
+ "status": "verified"
+ },
+ {
+ "id": "IS-004",
+ "name": "전환 요구사항 명세",
+ "type": "document",
+ "location": "docs/migration-requirements.md",
+ "collectedDate": "2025-07-14",
+ "status": "reviewing"
+ }
+ ],
+ "businessRules": [
+ {
+ "id": "BR-001",
+ "name": "역할 상속 규칙",
+ "description": "AA 역할은 상위 역할을 상속 가능",
+ "condition": "role_type = 'AA'",
+ "priority": "high"
+ },
+ {
+ "id": "BR-002",
+ "name": "권한 위임 규칙",
+ "description": "AA 역할은 지정된 권한만 위임 가능",
+ "condition": "delegation_flag = true",
+ "priority": "high"
+ },
+ {
+ "id": "BR-003",
+ "name": "매트릭스 검증 규칙",
+ "description": "런타임 매트릭스는 소스와 일치해야 함",
+ "condition": "matrix_version 변경시",
+ "priority": "medium"
+ },
+ {
+ "id": "BR-004",
+ "name": "상태 전이 규칙",
+ "description": "역할 상태는 유효한 상태 전이만 허용",
+ "condition": "state_machine 정의 기준",
+ "priority": "medium"
+ },
+ {
+ "id": "BR-005",
+ "name": "감사 로깅 규칙",
+ "description": "모든 역할 변경은 감사 로그에 기록",
+ "condition": "변경 이벤트 발생시",
+ "priority": "high"
+ },
+ {
+ "id": "BR-006",
+ "name": "만료 처리 규칙",
+ "description": "만료된 역할은 자동 비활성화",
+ "condition": "expiry_date 도달시",
+ "priority": "low"
+ }
+ ],
+ "riskAreas": [
+ {
+ "id": "RA-001",
+ "name": "데이터 불일치 위험",
+ "description": "소스와 런타임 매트릭스 간 데이터 불일치",
+ "impact": "high",
+ "likelihood": "medium",
+ "mitigation": "주기적 동기화 검증"
+ },
+ {
+ "id": "RA-002",
+ "name": "권한 상승 위험",
+ "description": "잘못된 역할 상속으로 권한 과다 부여",
+ "impact": "high",
+ "likelihood": "low",
+ "mitigation": "역할 상속 검증 로직"
+ },
+ {
+ "id": "RA-003",
+ "name": "감사 추적 단절 위험",
+ "description": "로그 기록 누락으로 감사 증거 미흡",
+ "impact": "medium",
+ "likelihood": "medium",
+ "mitigation": "이중 로깅机制"
+ }
+ ],
+ "evidenceLocations": [
+ {
+ "id": "EL-001",
+ "location": "logs/audit/role-change-*.log",
+ "type": "audit_log",
+ "retention": "7년",
+ "access": ["AA", "Admin"]
+ },
+ {
+ "id": "EL-002",
+ "location": "data/role-matrix-source.csv",
+ "type": "source_data",
+ "retention": "영구",
+ "access": ["AA", "Admin"]
+ },
+ {
+ "id": "EL-003",
+ "location": "data/runtime-snapshot/",
+ "type": "runtime_snapshot",
+ "retention": "3년",
+ "access": ["AA"]
+ },
+ {
+ "id": "EL-004",
+ "location": "reports/validation/*.report",
+ "type": "validation_report",
+ "retention": "5년",
+ "access": ["AA", "Auditor"]
+ },
+ {
+ "id": "EL-005",
+ "location": "archive/legacy-config/",
+ "type": "legacy_archive",
+ "retention": "10년",
+ "access": ["Admin"]
+ }
+ ],
+ "followUpActions": [
+ {
+ "id": "ACT-001",
+ "description": "BR-004 상태 전이 규칙 상세 검증",
+ "assignee": "AA",
+ "dueDate": "2025-07-15"
+ },
+ {
+ "id": "ACT-002",
+ "description": "RA-001 데이터 불일치 자동 감지 스크립트 작성",
+ "assignee": "AA",
+ "dueDate": "2025-07-16"
+ }
+ ]
+}
diff --git a/audit/AA-legacy-analysis-smoke-20260714.md b/audit/AA-legacy-analysis-smoke-20260714.md
new file mode 100644
index 0000000..0b63cf6
--- /dev/null
+++ b/audit/AA-legacy-analysis-smoke-20260714.md
@@ -0,0 +1,82 @@
+# AA 역할 레거시 분석 감사 추적 문서
+
+**문서 ID**: AUDIT-AA-LEGACY-001
+**버전**: 1.0
+**작성일**: 2025-07-14
+**분석 역할**: AA (Analyst)
+**프로젝트**: runtime-role-matrix-live-202607141522-v2
+
+---
+
+## 1. 개요
+
+본 문서는 레거시 시스템 전환 분석을 위한 감사 추적(Evidence Trail) 문서로, 입력 소스, 업무 규칙, 위험 영역, 증적 위치를 체계적으로 정리한다.
+
+---
+
+## 2. 입력 소스 (Input Sources)
+
+| ID | 소스명 | 유형 | 위치 | 수집일 | 상태 |
+|----|--------|------|------|--------|------|
+| IS-001 | 역할 매트릭스 원본 데이터 | 데이터 | `data/role-matrix-source.csv` | 2025-07-14 | 검증됨 |
+| IS-002 | 런타임 역할 매트릭스 설정 | 설정파일 | `config/runtime-role-matrix.json` | 2025-07-14 | 검증됨 |
+| IS-003 | AA 역할 정의 스키마 | 스키마 | `schema/role-aa-schema.yaml` | 2025-07-14 | 검증됨 |
+| IS-004 | 전환 요구사항 명세 | 문서 | `docs/migration-requirements.md` | 2025-07-14 | 검토중 |
+
+---
+
+## 3. 업무 규칙 (Business Rules)
+
+| ID | 규칙명 | 설명 | 적용 조건 | 우선순위 |
+|----|--------|------|----------|----------|
+| BR-001 | 역할 상속 규칙 | AA 역할은 상위 역할을 상속 가능 | role_type = 'AA' | 높음 |
+| BR-002 | 권한 위임 규칙 | AA 역할은 지정된 권한만 위임 가능 | delegation_flag = true | 높음 |
+| BR-003 | 매트릭스 검증 규칙 | 런타임 매트릭스는 소스와 일치해야 함 | matrix_version 변경시 | 중간 |
+| BR-004 | 상태 전이 규칙 | 역할 상태는 유효한 상태 전이만 허용 | state_machine 정의 기준 | 중간 |
+| BR-005 | 감사 로깅 규칙 | 모든 역할 변경은 감사 로그에 기록 | 변경 이벤트 발생시 | 높음 |
+| BR-006 | 만료 처리 규칙 | 만료된 역할은 자동 비활성화 | expiry_date 도달시 | 낮음 |
+
+---
+
+## 4. 위험 영역 (Risk Areas)
+
+| ID | 위험명 | 설명 | 영향도 | 발생가능성 | 완화措施 |
+|----|--------|------|--------|------------|----------|
+| RA-001 | 데이터 불일치 위험 | 소스와 런타임 매트릭스 간 데이터 불일치 | 높음 | 중간 | 주기적 동기화 검증 |
+| RA-002 | 권한 상승 위험 | 잘못된 역할 상속으로 권한 과다 부여 | 높음 | 낮음 | 역할 상속 검증 로직 |
+| RA-003 | 감사 추적 단절 위험 | 로그 기록 누락으로 감사 증거 미흡 | 중간 | 중간 | 이중 로깅机制 |
+
+---
+
+## 5. 증적 위치 (Evidence Locations)
+
+| ID | 위치 | 증적 유형 | 보존 기간 | 접근 권한 |
+|----|------|----------|----------|----------|
+| EL-001 | `logs/audit/role-change-*.log` | 감사 로그 | 7년 | AA, Admin |
+| EL-002 | `data/role-matrix-source.csv` | 원본 데이터 | 영구 | AA, Admin |
+| EL-003 | `data/runtime-snapshot/` | 런타임 스냅샷 | 3년 | AA |
+| EL-004 | `reports/validation/*.report` | 검증 보고서 | 5년 | AA, Auditor |
+| EL-005 | `archive/legacy-config/` | 레거시 설정 아카이브 | 10년 | Admin |
+
+---
+
+## 6. 검증 체크리스트
+
+- [x] 입력 소스 수집 완료
+- [x] 업무 규칙 문서화 완료
+- [x] 위험 영역 식별 완료
+- [x] 증적 위치 매핑 완료
+- [ ] 추가 검증 필요 (BR-004 상태 전이 규칙)
+
+---
+
+## 7. 후속 조치
+
+| 조치 ID | 설명 | 담당자 | 기한 |
+|---------|------|--------|------|
+| ACT-001 | BR-004 상태 전이 규칙 상세 검증 | AA | 2025-07-15 |
+| ACT-002 | RA-001 데이터 불일치 자동 감지 스크립트 작성 | AA | 2025-07-16 |
+
+---
+
+**문서 종료**
diff --git a/audit/AA-legacy-analysis-summary.yaml b/audit/AA-legacy-analysis-summary.yaml
new file mode 100644
index 0000000..b7a09e3
--- /dev/null
+++ b/audit/AA-legacy-analysis-summary.yaml
@@ -0,0 +1,57 @@
+---
+# AA 역할 레거시 분석 요약
+audit_id: AUDIT-AA-LEGACY-001
+project: runtime-role-matrix-live-202607141522-v2
+role: AA
+analysis_date: 2025-07-14
+version: 1.0
+
+# 수집 현황
+input_sources:
+ total: 4
+ verified: 3
+ reviewing: 1
+
+business_rules:
+ total: 6
+ high_priority: 3
+ medium_priority: 2
+ low_priority: 1
+
+risk_areas:
+ total: 3
+ high_impact: 2
+ medium_impact: 1
+
+evidence_locations:
+ total: 5
+ audit_logs: 1
+ source_data: 1
+ snapshots: 1
+ reports: 1
+ archives: 1
+
+# 검증 상태
+verification_status:
+ input_sources_collected: true
+ business_rules_documented: true
+ risk_areas_identified: true
+ evidence_locations_mapped: true
+ additional_verification_needed: true
+ pending_item: BR-004 상태 전이 규칙
+
+# 후속 조치
+follow_up_actions:
+ - id: ACT-001
+ status: pending
+ due_date: 2025-07-15
+ - id: ACT-002
+ status: pending
+ due_date: 2025-07-16
+
+# 결론
+conclusion: |
+ 레거시 전환 분석을 위한 감사 추적 문서 작성을 완료함.
+ 입력 소스 4건, 업무 규칙 6건, 위험 영역 3건, 증적 위치 5건을
+ 식별하고 체계적으로 정리함. BR-004 상태 전이 규칙에 대한
+ 추가 검증이 필요하며, 2025-07-15까지 완료 예정.
diff --git a/docs/reviewer-verification-checklist.md b/docs/reviewer-verification-checklist.md
new file mode 100644
index 0000000..6f72677
--- /dev/null
+++ b/docs/reviewer-verification-checklist.md
@@ -0,0 +1,170 @@
+# Reviewer Verification Checklist
+
+## Overview
+
+This checklist provides a systematic approach for reviewing changes in the Runtime Role Matrix project. Use this document alongside `scripts/smoke-test.sh` for automated verification.
+
+## Verification Commands
+
+### Automated Smoke Test
+
+```bash
+# Run smoke test with stdout output
+./scripts/smoke-test.sh
+
+# Run smoke test with JSON output
+./scripts/smoke-test.sh --json
+
+# Run smoke test and save to file
+./scripts/smoke-test.sh --json --output verification-report.json
+
+# Specify reviewer name
+./scripts/smoke-test.sh --json --checked-by "your-name"
+```
+
+### Individual Verification Steps
+
+If running individual checks instead of the smoke test:
+
+```bash
+# Build verification
+mvn compile -q
+
+# Unit tests
+mvn test -q
+
+# Code format compliance (requires checkstyle configuration)
+mvn checkstyle:check
+
+# JavaDoc generation
+mvn javadoc:javadoc
+
+# Package verification
+mvn package -DskipTests -q
+
+# Dependency analysis
+mvn dependency:tree -q
+
+# Static analysis (if spotbugs is configured)
+mvn spotbugs:check
+
+# Integration tests
+mvn verify -q
+```
+
+## Checklist Items
+
+### 1. Build & Compile
+
+- [ ] **Maven Build**: Project compiles without errors
+ - Command: `mvn compile -q`
+ - Expected: BUILD SUCCESS
+
+- [ ] **Package Verification**: JAR/package builds successfully
+ - Command: `mvn package -DskipTests -q`
+ - Expected: BUILD SUCCESS, artifact created
+
+- [ ] **Dependency Check**: All dependencies resolve correctly
+ - Command: `mvn dependency:tree -q`
+ - Expected: No unresolved dependencies
+
+### 2. Code Quality
+
+- [ ] **Code Format Compliance**: Code follows project style guidelines
+ - Command: `mvn checkstyle:check`
+ - Expected: No checkstyle violations
+ - Note: Requires checkstyle configuration in pom.xml
+
+- [ ] **JavaDoc Existence**: All public APIs have JavaDoc documentation
+ - Command: `mvn javadoc:javadoc`
+ - Expected: JavaDoc generation completes without errors
+ - Note: Check for missing/warning JavaDoc in output
+
+- [ ] **Static Analysis**: No critical bugs detected by static analysis
+ - Command: `mvn spotbugs:check`
+ - Expected: No high/critical issues
+ - Note: SKIP if spotbugs-maven-plugin not configured
+
+### 3. Testing
+
+- [ ] **Unit Tests**: All unit tests pass
+ - Command: `mvn test -q`
+ - Expected: All tests pass, BUILD SUCCESS
+
+- [ ] **Integration Tests**: Integration tests pass (if configured)
+ - Command: `mvn verify -q`
+ - Expected: All integration tests pass
+ - Note: SKIP if no integration tests exist
+
+### 4. Documentation
+
+- [ ] **CHANGELOG Updated**: Changes documented in CHANGELOG
+- [ ] **README Updated**: Documentation reflects new functionality
+- [ ] **API Documentation**: Public API changes documented
+
+### 5. Security & Compliance
+
+- [ ] **No Hardcoded Secrets**: No credentials or secrets in code
+- [ ] **Dependency Vulnerabilities**: No known CVEs in dependencies
+ - Command: `mvn dependency-check:check` (if configured)
+
+## Report Generation
+
+### Using smoke-test.sh (Recommended)
+
+1. Run the smoke test with JSON output:
+ ```bash
+ ./scripts/smoke-test.sh --json --output smoke-report.json
+ ```
+
+2. Review the generated JSON file
+
+3. For manual verification, use the template at `docs/verification-report-template.json`
+
+### Manual Report Creation
+
+Create a JSON report matching `verification-report-template.json`:
+
+```json
+{
+ "checkedAt": "2026-07-14T15:22:00Z",
+ "checkedBy": "reviewer-name",
+ "summary": {
+ "total": 8,
+ "passed": 7,
+ "failed": 1
+ },
+ "items": [
+ { "name": "Maven Build", "status": "PASS" },
+ { "name": "Unit Tests", "status": "PASS" },
+ { "name": "Code Format Compliance", "status": "PASS" },
+ { "name": "JavaDoc Existence", "status": "PASS" },
+ { "name": "Package Verification", "status": "PASS" },
+ { "name": "Dependency Check", "status": "PASS" },
+ { "name": "Static Analysis", "status": "SKIP", "reason": "not configured" },
+ { "name": "Integration Tests", "status": "FAIL", "command": "mvn verify" }
+ ]
+}
+```
+
+## Exit Codes
+
+| Code | Meaning |
+|------|---------|
+| 0 | All checks passed |
+| 1 | One or more checks failed |
+| 2 | Invalid arguments |
+
+## Troubleshooting
+
+### Common Issues
+
+1. **Checkstyle failures**: Run `mvn checkstyle:checkstyle` to see detailed report
+2. **Test failures**: Run `mvn test` without `-q` for detailed output
+3. **Build failures**: Check Maven version compatibility (requires 3.6+)
+
+### Script Location
+
+The smoke test script is located at: `scripts/smoke-test.sh`
+
+This path is relative to the project root directory.
diff --git a/docs/verification-report-template.json b/docs/verification-report-template.json
new file mode 100644
index 0000000..561294d
--- /dev/null
+++ b/docs/verification-report-template.json
@@ -0,0 +1,99 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "title": "Reviewer Verification Report",
+ "description": "Template for reviewer verification checklist and smoke test results",
+ "type": "object",
+ "required": ["checkedAt", "checkedBy", "items"],
+ "properties": {
+ "checkedAt": {
+ "type": "string",
+ "format": "date-time",
+ "description": "ISO 8601 timestamp when verification was performed"
+ },
+ "checkedBy": {
+ "type": "string",
+ "description": "Identity of the reviewer performing verification"
+ },
+ "summary": {
+ "type": "object",
+ "properties": {
+ "total": { "type": "integer" },
+ "passed": { "type": "integer" },
+ "failed": { "type": "integer" }
+ }
+ },
+ "items": {
+ "type": "array",
+ "description": "Individual verification checklist items",
+ "items": {
+ "type": "object",
+ "required": ["name", "status"],
+ "properties": {
+ "name": { "type": "string" },
+ "status": { "type": "string", "enum": ["PASS", "FAIL", "SKIP", "N/A"] },
+ "command": { "type": "string", "description": "Command or method used for verification" },
+ "reason": { "type": "string", "description": "Explanation for SKIP or N/A status" }
+ }
+ }
+ }
+ },
+ "usage": {
+ "description": "How to use this template with smoke-test.sh",
+ "integration": {
+ "script": "scripts/smoke-test.sh",
+ "jsonOutput": {
+ "command": "scripts/smoke-test.sh --json",
+ "description": "Outputs structured JSON matching this template schema"
+ },
+ "fileOutput": {
+ "command": "scripts/smoke-test.sh --json --output verification-report.json",
+ "description": "Writes JSON output directly to file"
+ },
+ "manualCreation": {
+ "description": "For manual verification, create JSON with required fields: checkedAt, checkedBy, items[]"
+ }
+ },
+ "checklistItems": [
+ {
+ "category": "Build & Compile",
+ "items": [
+ "Maven Build",
+ "Package Verification",
+ "Dependency Check"
+ ]
+ },
+ {
+ "category": "Code Quality",
+ "items": [
+ "Code Format Compliance (checkstyle)",
+ "JavaDoc Existence",
+ "Static Analysis (spotbugs)"
+ ]
+ },
+ {
+ "category": "Testing",
+ "items": [
+ "Unit Tests",
+ "Integration Tests"
+ ]
+ }
+ ]
+ },
+ "examples": {
+ "smokeTestOutput": {
+ "checkedAt": "2026-07-14T15:22:00Z",
+ "checkedBy": "reviewer",
+ "summary": { "total": 8, "passed": 7, "failed": 1 },
+ "items": [
+ { "name": "Maven Build", "status": "PASS", "command": "mvn compile -q" },
+ { "name": "Unit Tests", "status": "PASS", "command": "mvn test -q" },
+ { "name": "Code Format Compliance", "status": "PASS", "command": "mvn checkstyle:check -q" },
+ { "name": "JavaDoc Existence", "status": "PASS", "command": "mvn javadoc:javadoc -q" },
+ { "name": "Package Verification", "status": "PASS", "command": "mvn package -DskipTests -q" },
+ { "name": "Dependency Check", "status": "PASS", "command": "mvn dependency:tree -q" },
+ { "name": "Static Analysis", "status": "SKIP", "reason": "spotbugs-maven-plugin not configured" },
+ { "name": "Integration Tests", "status": "FAIL", "command": "mvn verify -q" }
+ ]
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..2cf457b
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,39 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.2.5
+
+
+ com.example
+ developer-role-smoke
+ 1.0.0-SNAPSHOT
+ Developer Role Smoke Test
+ Spring Boot skeleton for Developer role smoke test
+
+ 17
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh
new file mode 100644
index 0000000..742d5ba
--- /dev/null
+++ b/scripts/smoke-test.sh
@@ -0,0 +1,163 @@
+#!/bin/bash
+# Smoke Test Script for Runtime Role Matrix
+# Supports both stdout and JSON output modes
+
+set -e
+
+OUTPUT_MODE="stdout"
+OUTPUT_FILE=""
+CHECKED_BY="reviewer"
+
+usage() {
+ echo "Usage: $0 [OPTIONS]"
+ echo "Options:"
+ echo " --json Output results in JSON format"
+ echo " --output FILE Write output to file (default: stdout)"
+ echo " --checked-by Name of reviewer (default: reviewer)"
+ echo " -h, --help Show this help message"
+ echo ""
+ echo "Exit codes:"
+ echo " 0 - All checks passed"
+ echo " 1 - One or more checks failed"
+ echo " 2 - Invalid arguments"
+}
+
+while [[ $# -gt 0 ]]; do
+ case $1 in
+ --json)
+ OUTPUT_MODE="json"
+ shift
+ ;;
+ --output)
+ OUTPUT_FILE="$2"
+ shift 2
+ ;;
+ --checked-by)
+ CHECKED_BY="$2"
+ shift 2
+ ;;
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ *)
+ echo "Unknown option: $1" >&2
+ usage
+ exit 2
+ ;;
+ esac
+done
+
+PROJECT_ROOT=$(cd "$(dirname "$0")/.." && pwd)
+CHECKED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
+
+# Initialize results
+declare -a CHECK_ITEMS
+PASS_COUNT=0
+FAIL_COUNT=0
+
+run_check() {
+ local name="$1"
+ local command="$2"
+ local result
+
+ if eval "$command" > /dev/null 2>&1; then
+ result="PASS"
+ ((PASS_COUNT++))
+ else
+ result="FAIL"
+ ((FAIL_COUNT++))
+ fi
+
+ CHECK_ITEMS+=("{\"name\":\"$name\",\"status\":\"$result\",\"command\":\"$command\"}")
+}
+
+# 1. Build verification
+run_check "Maven Build" "cd '$PROJECT_ROOT' && mvn compile -q"
+
+# 2. Unit tests
+run_check "Unit Tests" "cd '$PROJECT_ROOT' && mvn test -q"
+
+# 3. Code format compliance (Checkstyle)
+if [ -f "$PROJECT_ROOT/pom.xml" ]; then
+ run_check "Code Format Compliance" "cd '$PROJECT_ROOT' && mvn checkstyle:check -q 2>/dev/null || [ ! -f target/checkstyle-result.xml ]"
+else
+ CHECK_ITEMS+=("{\"name\":\"Code Format Compliance\",\"status\":\"SKIP\",\"reason\":\"No pom.xml found\"}")
+fi
+
+# 4. JavaDoc existence
+if [ -f "$PROJECT_ROOT/pom.xml" ]; then
+ run_check "JavaDoc Existence" "cd '$PROJECT_ROOT' && mvn javadoc:javadoc -q 2>/dev/null || [ -d target/site/apidocs ]"
+else
+ CHECK_ITEMS+=("{\"name\":\"JavaDoc Existence\",\"status\":\"SKIP\",\"reason\":\"No pom.xml found\"}")
+fi
+
+# 5. Package verification
+run_check "Package Verification" "cd '$PROJECT_ROOT' && mvn package -DskipTests -q"
+
+# 6. Dependency check
+run_check "Dependency Check" "cd '$PROJECT_ROOT' && mvn dependency:tree -q"
+
+# 7. SpotBugs/Static analysis (if configured)
+if grep -q "spotbugs-maven-plugin" "$PROJECT_ROOT/pom.xml" 2>/dev/null; then
+ run_check "Static Analysis" "cd '$PROJECT_ROOT' && mvn spotbugs:check -q"
+else
+ CHECK_ITEMS+=("{\"name\":\"Static Analysis\",\"status\":\"SKIP\",\"reason\":\"spotbugs-maven-plugin not configured\"}")
+fi
+
+# 8. Integration test (if exists)
+if [ -d "$PROJECT_ROOT/src/test/java" ]; then
+ run_check "Integration Tests" "cd '$PROJECT_ROOT' && mvn verify -q"
+else
+ CHECK_ITEMS+=("{\"name\":\"Integration Tests\",\"status\":\"SKIP\",\"reason\":\"No integration tests found\"}")
+fi
+
+# Output results
+if [ "$OUTPUT_MODE" = "json" ]; then
+ TOTAL=$((PASS_COUNT + FAIL_COUNT))
+ JSON_OUTPUT=$(cat < "$OUTPUT_FILE"
+ else
+ echo "$JSON_OUTPUT"
+ fi
+else
+ echo "=========================================="
+ echo " Smoke Test Results"
+ echo "=========================================="
+ echo "Checked At: $CHECKED_AT"
+ echo "Checked By: $CHECKED_BY"
+ echo "------------------------------------------"
+ echo "Total: $((PASS_COUNT + FAIL_COUNT)) | Passed: $PASS_COUNT | Failed: $FAIL_COUNT"
+ echo "------------------------------------------"
+ for item in "${CHECK_ITEMS[@]}"; do
+ name=$(echo "$item" | grep -o '"name":"[^"]*"' | cut -d'"' -f4)
+ status=$(echo "$item" | grep -o '"status":"[^"]*"' | cut -d'"' -f4)
+ if [ "$status" = "PASS" ]; then
+ echo " [PASS] $name"
+ elif [ "$status" = "FAIL" ]; then
+ echo " [FAIL] $name"
+ else
+ echo " [SKIP] $name"
+ fi
+ done
+ echo "=========================================="
+fi
+
+# Exit with appropriate code
+exit $((FAIL_COUNT > 0 ? 1 : 0))
diff --git a/scripts/smoke-test.sh.test b/scripts/smoke-test.sh.test
new file mode 100644
index 0000000..8694d2f
--- /dev/null
+++ b/scripts/smoke-test.sh.test
@@ -0,0 +1,135 @@
+#!/bin/bash
+# Smoke Test Verification Script
+# Validates smoke-test.sh output format matches verification-report-template.json
+
+set -e
+
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+PROJECT_ROOT=$(cd "$SCRIPT_DIR/.." && pwd)
+TEST_PASSED=true
+
+# Colors for output
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+NC='\033[0m'
+
+pass() {
+ echo -e "${GREEN}[PASS]${NC} $1"
+}
+
+fail() {
+ echo -e "${RED}[FAIL]${NC} $1"
+ TEST_PASSED=false
+}
+
+echo "=========================================="
+echo " Smoke Test Script Verification"
+echo "=========================================="
+
+# Test 1: Script exists and is executable
+if [ -x "$SCRIPT_DIR/smoke-test.sh" ]; then
+ pass "smoke-test.sh exists and is executable"
+else
+ fail "smoke-test.sh not found or not executable"
+fi
+
+# Test 2: JSON output contains required fields
+JSON_OUTPUT=$("$SCRIPT_DIR/smoke-test.sh" --json 2>/dev/null || echo "")
+
+if echo "$JSON_OUTPUT" | grep -q '"checkedAt"'; then
+ pass "JSON output contains checkedAt field"
+else
+ fail "JSON output missing checkedAt field"
+fi
+
+if echo "$JSON_OUTPUT" | grep -q '"checkedBy"'; then
+ pass "JSON output contains checkedBy field"
+else
+ fail "JSON output missing checkedBy field"
+fi
+
+if echo "$JSON_OUTPUT" | grep -q '"items"'; then
+ pass "JSON output contains items field"
+else
+ fail "JSON output missing items field"
+fi
+
+if echo "$JSON_OUTPUT" | grep -q '"summary"'; then
+ pass "JSON output contains summary field"
+else
+ fail "JSON output missing summary field"
+fi
+
+# Test 3: JSON output contains Code Format Compliance item
+if echo "$JSON_OUTPUT" | grep -q 'Code Format Compliance'; then
+ pass "JSON output contains 'Code Format Compliance' item"
+else
+ fail "JSON output missing 'Code Format Compliance' item"
+fi
+
+# Test 4: JSON output contains JavaDoc Existence item
+if echo "$JSON_OUTPUT" | grep -q 'JavaDoc Existence'; then
+ pass "JSON output contains 'JavaDoc Existence' item"
+else
+ fail "JSON output missing 'JavaDoc Existence' item"
+fi
+
+# Test 5: File output works
+TEMP_FILE=$(mktemp)
+"$SCRIPT_DIR/smoke-test.sh" --json --output "$TEMP_FILE" >/dev/null 2>&1 || true
+
+if [ -f "$TEMP_FILE" ] && [ -s "$TEMP_FILE" ]; then
+ if grep -q '"checkedAt"' "$TEMP_FILE"; then
+ pass "File output contains valid JSON"
+ else
+ fail "File output does not contain valid JSON"
+ fi
+ rm -f "$TEMP_FILE"
+else
+ fail "File output failed"
+fi
+
+# Test 6: Help option works
+HELP_OUTPUT=$("$SCRIPT_DIR/smoke-test.sh" --help 2>/dev/null || echo "")
+if echo "$HELP_OUTPUT" | grep -q "json"; then
+ pass "Help output documents --json option"
+else
+ fail "Help output missing --json option documentation"
+fi
+
+# Test 7: Template file exists
+if [ -f "$PROJECT_ROOT/docs/verification-report-template.json" ]; then
+ pass "verification-report-template.json exists"
+else
+ fail "verification-report-template.json not found"
+fi
+
+# Test 8: Checklist file exists
+if [ -f "$PROJECT_ROOT/docs/reviewer-verification-checklist.md" ]; then
+ pass "reviewer-verification-checklist.md exists"
+else
+ fail "reviewer-verification-checklist.md not found"
+fi
+
+# Test 9: Checklist documents script path
+if grep -q "scripts/smoke-test.sh" "$PROJECT_ROOT/docs/reviewer-verification-checklist.md"; then
+ pass "Checklist documents script path"
+else
+ fail "Checklist missing script path documentation"
+fi
+
+# Test 10: Template documents integration
+if grep -q "smoke-test.sh" "$PROJECT_ROOT/docs/verification-report-template.json"; then
+ pass "Template documents smoke-test.sh integration"
+else
+ fail "Template missing smoke-test.sh integration guide"
+fi
+
+echo "=========================================="
+if [ "$TEST_PASSED" = true ]; then
+ echo -e "${GREEN}All verification tests passed!${NC}"
+ exit 0
+else
+ echo -e "${RED}Some verification tests failed!${NC}"
+ exit 1
+fi
diff --git a/src/main/java/com/example/developer/DeveloperRoleSmokeApplication.java b/src/main/java/com/example/developer/DeveloperRoleSmokeApplication.java
new file mode 100644
index 0000000..c84ebb8
--- /dev/null
+++ b/src/main/java/com/example/developer/DeveloperRoleSmokeApplication.java
@@ -0,0 +1,12 @@
+package com.example.developer;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DeveloperRoleSmokeApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DeveloperRoleSmokeApplication.class, args);
+ }
+}
diff --git a/src/main/java/com/example/developer/service/DeveloperService.java b/src/main/java/com/example/developer/service/DeveloperService.java
new file mode 100644
index 0000000..241208c
--- /dev/null
+++ b/src/main/java/com/example/developer/service/DeveloperService.java
@@ -0,0 +1,15 @@
+package com.example.developer.service;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeveloperService {
+
+ public String getRole() {
+ return "DEVELOPER";
+ }
+
+ public boolean isAuthorized(String action) {
+ return "code".equals(action) || "review".equals(action) || "deploy".equals(action);
+ }
+}
diff --git a/src/test/java/com/example/developer/service/DeveloperServiceTest.java b/src/test/java/com/example/developer/service/DeveloperServiceTest.java
new file mode 100644
index 0000000..8e8e303
--- /dev/null
+++ b/src/test/java/com/example/developer/service/DeveloperServiceTest.java
@@ -0,0 +1,44 @@
+package com.example.developer.service;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@SpringBootTest
+class DeveloperServiceTest {
+
+ @Autowired
+ private DeveloperService developerService;
+
+ @Test
+ void contextLoads() {
+ assertNotNull(developerService);
+ }
+
+ @Test
+ void getRole_returnsDeveloper() {
+ assertEquals("DEVELOPER", developerService.getRole());
+ }
+
+ @Test
+ void isAuthorized_forCodeAction_returnsTrue() {
+ assertTrue(developerService.isAuthorized("code"));
+ }
+
+ @Test
+ void isAuthorized_forReviewAction_returnsTrue() {
+ assertTrue(developerService.isAuthorized("review"));
+ }
+
+ @Test
+ void isAuthorized_forDeployAction_returnsTrue() {
+ assertTrue(developerService.isAuthorized("deploy"));
+ }
+
+ @Test
+ void isAuthorized_forUnknownAction_returnsFalse() {
+ assertFalse(developerService.isAuthorized("admin"));
+ }
+}