# task-1214.1 완료 보고서: output/ 폴더 구조 규칙 수립 + 기존 정리 + 시스템화

**팀**: dev5-team (마르둑 팀장)
**작업자**: 나부(파일 정리), 엔키(검증 스크립트)
**일시**: 2026-03-28

---

## SCQA

**S**: output/ 폴더에 7개 버전 폴더(hybrid, hybrid-v2 ~ hybrid-v5, v6-benchmark, v7-poc)가 불일치 네이밍으로 존재하고, concept-samples가 2곳에 중복, 루트에 PNG 7개 + MD 2개가 산재해 있었다.

**C**: 버전 추적이 불가능하고 파일 탐색 시간이 증가. file-organization.md에 output/ 규칙이 부재하여 향후 추가 파일 생성 시에도 동일 문제 반복 예상.

**Q**: output/ 폴더를 표준 구조로 정리하고, 규칙 위반을 자동 탐지하는 시스템을 구축할 수 있는가?

**A**: 3단계 작업(규칙 수립 → 파일 정리 → 검증 스크립트) 완료. 7개 버전 폴더를 v00~v07로 통일, concept-catalog 단일화, 루트 파일 0건 달성. 검증 스크립트로 5개 항목(루트 파일/네이밍/중복/연속성/빈 폴더) 자동 검증 가능. FAIL 0건, meta-ads 영역 PASS 완료.

---

## 작업 내용

### Phase 1: 규칙 수립
- `memory/specs/file-organization.md`에 `## 1.5 output/ 폴더 구조` 섹션 추가
- 4개 규칙: 2자리 버전 넘버링, 루트 파일 금지, 기존 버전 삭제 금지, concept-catalog 단일 위치

### Phase 2: 기존 파일 정리 (이동 26건, 삭제 0건)

**버전 폴더 리네이밍 (7건)**
- `angle-A/hybrid` → `angle-A/v01`
- `angle-A/hybrid-v2` → `angle-A/v02`
- `angle-A/hybrid-v3` → `angle-A/v03`
- `angle-A/hybrid-v4` → `angle-A/v04`
- `angle-A/hybrid-v5` → `angle-A/v05`
- `angle-A/v6-benchmark` → `angle-A/v06`
- `angle-A/v7-poc` → `angle-A/v07`

**concept-samples 통합 (9건 파일 이동)**
- `angle-A/concept-samples/sample-A-portrait-bg.jpg` → `concept-catalog/sample-A-portrait-bg.jpg`
- `angle-A/concept-samples/sample-A-portrait.png` → `concept-catalog/sample-A-portrait.png`
- `angle-A/concept-samples/sample-B-number-bg.png` → `concept-catalog/sample-B-number-bg.png`
- `angle-A/concept-samples/sample-B-number.png` → `concept-catalog/sample-B-number.png`
- `angle-A/concept-samples/sample-B-number-template.html` → `concept-catalog/sample-B-number-template.html`
- `angle-A/concept-samples/sample-C-split.png` → `concept-catalog/sample-C-split.png`
- `meta-ads/concept-samples/design-brief-batch1.md` → `concept-catalog/design-brief-batch1.md`
- `meta-ads/concept-samples/DESIGN-BRIEF-batch2.md` → `concept-catalog/DESIGN-BRIEF-batch2.md`
- `meta-ads/concept-samples/design-brief-batch3.md` → `concept-catalog/design-brief-batch3.md`

**루트 파일 이동 (9건)**
- `angle-A/design-brief-angleA.md` → `angle-A/briefs/design-brief-angleA.md`
- `angle-A/meta-ad-angleA-final.md` → `angle-A/briefs/meta-ad-angleA-final.md`
- `angle-A/recruiting-angleA-meta-1080x1080-slide1-v1.png` → `angle-A/v00/`
- `angle-A/recruiting-angleA-meta-1080x1080-slide2-v1.png` → `angle-A/v00/`
- `angle-A/recruiting-angleA-meta-1080x1080-slide2-v2.png` → `angle-A/v00/`
- `angle-A/recruiting-angleA-meta-1080x1080-slide3-v1.png` → `angle-A/v00/`
- `angle-A/recruiting-angleA-meta-1080x1080-slide4-v1.png` → `angle-A/v00/`
- `angle-A/recruiting-angleA-meta-1080x1080-slide4-v2.png` → `angle-A/v00/`
- `angle-A/recruiting-angleA-meta-1080x1080-slide5-v1.png` → `angle-A/v00/`

**concept-catalog 20개 하위 폴더 생성**
- `01-constraint`, `02-expressive-typo`, `03-anti-polish`, `04-reality-fantasy`, `05-symbol-as-campaign`
- `06-dark-premium`, `07-impact-number`, `08-emotional-narrative`, `09-minimal-typography`, `10-vitality-gradient`
- `11-jsx-declarative`, `12-block-modular`, `13-css-gradient`, `14-svg-first`, `15-cjk-typography`
- `16-navy-typography`, `17-number-newsflash`, `18-portrait-text`, `19-persona-card`, `20-split-layout`

**빈 폴더 정리 (rmdir 2건)**
- `angle-A/concept-samples/` → rmdir (빈 폴더)
- `meta-ads/concept-samples/` → rmdir (빈 폴더)

### Phase 3: 검증 스크립트
- `scripts/validate-output-structure.py` 생성 (373줄)
- 5개 검증 함수: root_files, version_naming, concept_catalog_duplicates, version_continuity, empty_folders
- JSON 출력, exit code: FAIL 시 1, 그 외 0

---

## 산출물 파일 목록

- `/home/jay/workspace/memory/specs/file-organization.md` (수정: output/ 섹션 추가)
- `/home/jay/workspace/scripts/validate-output-structure.py` (신규 생성)
- `/home/jay/workspace/output/meta-ads/concept-catalog/01-constraint/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/02-expressive-typo/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/03-anti-polish/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/04-reality-fantasy/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/05-symbol-as-campaign/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/06-dark-premium/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/07-impact-number/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/08-emotional-narrative/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/09-minimal-typography/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/10-vitality-gradient/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/11-jsx-declarative/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/12-block-modular/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/13-css-gradient/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/14-svg-first/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/15-cjk-typography/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/16-navy-typography/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/17-number-newsflash/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/18-portrait-text/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/19-persona-card/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/concept-catalog/20-split-layout/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/angle-A/briefs/` (신규 폴더)
- `/home/jay/workspace/output/meta-ads/angle-A/v00/` (신규 폴더)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **루트 PNG 7개 소속 불명** — v00/ 폴더를 신규 생성하여 hybrid 이전 버전으로 분류
2. **루트 MD 2개 소속 불명** — briefs/ 폴더를 신규 생성하여 디자인 브리프로 분류
3. **concept-samples 2곳 중복** — 모든 파일을 concept-catalog/로 통합 후 빈 폴더 rmdir

### 범위 외 미해결 (1건)
1. **campaign-top/ 버전 네이밍 불일치** (v1-satori, v2-hybrid, v3-gemini, phase0-creatives) — 범위 외 사유: 태스크 지시는 meta-ads/angle-A/ 정리만 포함. campaign-top은 별도 작업 필요.

---

## 검증 결과

### validate-output-structure.py 실행 결과
```json
{
  "status": "WARN",
  "total_checks": 11,
  "pass": 7,
  "warn": 4,
  "fail": 0,
  "info": 0
}
```

- PASS 7건: 루트 파일 0건, concept-catalog 단일 위치, 버전 연속성(v00~v07), 빈 폴더 0건
- WARN 4건: campaign-top/ 기존 폴더 네이밍 (본 작업 범위 외)
- FAIL 0건
