# 에이전트 미팅 Cycle 2 — task-1251.1

## 미팅 정보
- 일시: 2026-03-29
- 참석자: 아프로디테(마케팅팀장), 아마테라스(디자인팀장), 마아트(QC팀장), 로키(레드팀)
- 안건: Cycle 1 미결 사항 해결 + Phase 0~4 재설계 통합 워크플로우 + QC 체크리스트 통합
- 목적: 구체적 구현 방안 확정 (Cycle 2)

---

## Cycle 1 미결 사항 해결

---

### 안건 A 미결 — 해결

#### A-미결 1: Phase 0.5/1.5 체크리스트 초안 (마아트 보고)

**해결 결과: 확정**

마아트가 Cycle 2 전에 초안을 작성해 왔습니다.

---

**Phase 0.5 — 브리프 QC 체크리스트 (10점 만점, 8점 미만 반려)**

| # | 항목 | 배점 | 판정 기준 |
|---|------|------|-----------|
| 1 | 타겟 1인칭 명시 | 2점 | "30대 여성 직장인처럼 구체적 인구통계 or 심리통계 명시" 여부 |
| 2 | 핵심 메시지 단수 여부 | 2점 | 브리프에 핵심 이익 문장이 1개만 존재하는가 (복수이면 0점) |
| 3 | 생산 가능성 — 텍스트 길이 적합성 | 2점 | 예상 헤드라인 ≤ 20자, 서브카피 ≤ 40자 명시 여부 |
| 4 | 캠페인 목표 KPI 명시 | 2점 | CTR / 상담 신청 / 브랜드 인지 중 단 1개 기재 여부 |
| 5 | 금지 패턴 없음 | 2점 | 과장 표현 ("최고", "무조건"), 법적 위험 표현, 경쟁사 직접 비교 없음 여부 |

**판정 로직:**
- 8~10점: 브리프 승인 → Phase 1 진행
- 6~7점: 조건부 승인 → 해당 항목 수정 후 Phase 1 진행 (재검토 없이 마케팅팀 자체 수정)
- 5점 이하: 브리프 반려 → 아프로디테 재작성 후 Phase 0.5 재진입

---

**Phase 1.5 — 기획 QC 체크리스트 (14점 만점, 10점 미만 재기획 요청)**

| # | 항목 | 배점 | 판정 기준 |
|---|------|------|-----------|
| 1 | 메시지 계층 구조 존재 | 2점 | 헤드라인 → 서브카피 → CTA의 논리적 흐름이 있는가 |
| 2 | 감정적 훅 존재 | 2점 | 첫 문장에서 타겟의 구체적 불안/욕망/호기심을 건드리는가 |
| 3 | CTA 명시 | 2점 | 행동 유도 문구가 구체적으로 존재하는가 ("지금 무료 상담" 수준) |
| 4 | 디자인 실현 가능성 | 2점 | 아마테라스가 "이 카피가 존 명세서에 맞게 들어갈 수 있다"고 승인 여부 |
| 5 | 금지 패턴 해당 없음 | 2점 | 브리프 QC 금지 패턴 + 추가: 수동적 문장 구조 ("~입니다"), 모호한 혜택 |
| 6 | 브랜드 톤앤매너 준수 | 2점 | 사전 정의된 톤 가이드(신뢰감/친근함/전문성) 중 적합한 톤 선택 명시 |
| 7 | 반복 사이클 목적 부합 | 2점 | 사이클 1이면 "방향성만", 사이클 2이면 "톤 정제", 사이클 3이면 "최적화 증거" 제시 |

**판정 로직:**
- 12~14점: 기획 승인 → Phase 2 진행
- 10~11점: 조건부 승인 → 해당 항목 수정 후 Phase 2 진행
- 9점 이하: 기획 반려 → 아프로디테 재기획 + 사이클 카운트 유지 (추가 사이클 없음)

---

#### A-미결 2: 반복 사이클별 점수 임계값 구체화

**해결 결과: 확정**

로키가 이 안건에 공격을 먼저 시작했습니다.

**로키 (공격):** "사이클별 점수를 다르게 설정하면, 팀이 사이클 1에서 낮은 기준에 맞추고 더 이상 올라가려 하지 않습니다. 사이클 3이 되면 기계적으로 점수를 맞추는 행동이 생깁니다."

**마아트 (반론):** 사이클별 목적이 다르므로 체크리스트 항목도 다르게 가중합니다. 동일 체크리스트에 다른 임계값을 적용하는 게 아니라, 각 사이클에서 중점 평가 항목이 달라집니다.

**합의된 사이클별 임계값:**

| 사이클 | Phase 0.5 통과 최소 | Phase 1.5 통과 최소 | 중점 평가 항목 | 핵심 게이트 |
|--------|--------------------|--------------------|---------------|------------|
| Cycle 1 | 6점 이상 (방향성) | 8점 이상 (방향성) | 1번·2번 항목 필수 만점 | Go/No-go 게이트 |
| Cycle 2 | 8점 이상 (정제) | 10점 이상 (정제) | 4번·6번 항목 필수 만점 | 이전 사이클 대비 +2점 이상 향상 |
| Cycle 3 | 10점 만점 (최적화) | 12점 이상 (최적화) | 전 항목 기준 상향 | 프로 수준 3축 동시 충족 |

**3 Whys 적용 — 핵심 의사결정:**

사이클 게이트를 왜 점수 향상으로 정의하는가?

- **Why 1**: 절대 점수만으로는 "형식적 통과"를 방지할 수 없기 때문이다.
  - **Why 2**: 반복 사이클의 가치는 누적 개선이지, 매번 재시작이 아니기 때문이다.
    - **Why 3**: 개선이 없는 반복은 낭비다. 따라서 게이트는 "이전보다 좋아졌는가?"를 증명하는 구조여야 한다.

**근본 원인**: 사이클 시스템은 개선을 강제하는 구조여야 효과가 있다. 절대 임계값 + 상대 향상 조건을 결합한다.

---

#### A-미결 3: 마아트 개입 시간 30분 제한의 실현 가능성

**해결 결과: 조건부 확정**

**마아트 (보고):** 과부하 시나리오를 시뮬레이션했습니다. 현재 기준 주당 브리프 5~8건 처리 가정 시, Phase 0.5 처리(건당 5분) + Phase 1.5 처리(건당 10분) = 주당 최대 120분 추가 소요. 30분 제한은 단일 건에 대한 제한이고, 주당 총량 제한이 아닙니다.

**문제 시나리오**: 동시 5건 브리프가 들어오면 마아트가 150분을 QC에 써야 합니다.

**아프로디테 (해결안 제시):** "브리프 QC 예약 시스템"을 도입합니다. 하루 최대 처리 건수를 3건으로 제한하고, 초과분은 다음 날로 이월합니다. 마케팅팀이 브리프를 "긴급/일반" 등급으로 분류해 제출합니다.

**로키 (공격):** "긴급 등급 인플레이션이 발생합니다. 마케팅팀이 모든 브리프를 긴급으로 분류할 것입니다."

**아마테라스 (반론):** 긴급 등급은 마케팅팀장 단독 결정이 아니라, 사전 합의된 긴급 기준(캠페인 런칭 D-3일 이내, 또는 임원 요청 건)에만 적용됩니다. 기준 외 긴급 신청은 자동 일반 등급으로 전환됩니다.

**합의:**
- 30분 제한은 단일 건 제한으로 유지
- 일 3건, 주 10건 처리 상한 설정
- 긴급 등급 기준: 캠페인 런칭 D-3일 이내 + 임원 승인 필요 조건 둘 다 충족 시에만 적용
- 처리 대기열 대시보드를 마케팅팀이 실시간 확인 가능하도록 공개

---

### 안건 B 미결 — 해결

#### B-미결 1: Canva 텍스트 존(Zone) 좌표 명세서 포맷 정의 (아마테라스 보고)

**해결 결과: JSON 스키마 초안 확정**

아마테라스가 포맷 초안을 가져왔습니다.

**텍스트 존 명세서 JSON 스키마 (v1.0):**

```json
{
  "$schema": "text-zone-spec-v1",
  "template_id": "tmpl_20260329_001",
  "template_name": "보험_상담유도_1080x1080",
  "canvas_size": {
    "width": 1080,
    "height": 1080,
    "unit": "px",
    "export_dpi": 72
  },
  "background": {
    "type": "canva_png_export",
    "file": "bg_tmpl_001.png",
    "source_canva_id": "CANVA_DESIGN_ID_HERE"
  },
  "font_config": {
    "primary_font": "Noto Sans KR",
    "fallback_font": "Pretendard",
    "source": "google_fonts",
    "canva_font_override": "동일 폰트 사용 필수"
  },
  "zones": [
    {
      "zone_id": "headline",
      "label": "메인 헤드라인",
      "anchor": {
        "x": 80,
        "y": 200,
        "width": 920,
        "height": 180
      },
      "text_constraints": {
        "max_chars": 20,
        "min_chars": 5,
        "max_lines": 2,
        "overflow_policy": "reject"
      },
      "typography": {
        "font_size_range": { "min": 42, "max": 60 },
        "font_weight": "700",
        "line_height": 1.3,
        "letter_spacing": "-0.02em",
        "text_align": "left",
        "color": "#1A1A1A",
        "bg_contrast_min": 4.5
      },
      "auto_fit": {
        "enabled": true,
        "strategy": "shrink_font",
        "min_font_before_reject": 38
      }
    },
    {
      "zone_id": "sub_copy",
      "label": "서브카피",
      "anchor": {
        "x": 80,
        "y": 400,
        "width": 780,
        "height": 120
      },
      "text_constraints": {
        "max_chars": 40,
        "min_chars": 10,
        "max_lines": 2,
        "overflow_policy": "reject"
      },
      "typography": {
        "font_size_range": { "min": 22, "max": 30 },
        "font_weight": "400",
        "line_height": 1.5,
        "letter_spacing": "0",
        "text_align": "left",
        "color": "#444444",
        "bg_contrast_min": 4.5
      },
      "auto_fit": {
        "enabled": true,
        "strategy": "shrink_font",
        "min_font_before_reject": 18
      }
    },
    {
      "zone_id": "cta_button",
      "label": "CTA 버튼 텍스트",
      "anchor": {
        "x": 80,
        "y": 920,
        "width": 360,
        "height": 80
      },
      "text_constraints": {
        "max_chars": 12,
        "min_chars": 4,
        "max_lines": 1,
        "overflow_policy": "reject"
      },
      "typography": {
        "font_size_range": { "min": 20, "max": 26 },
        "font_weight": "600",
        "line_height": 1.0,
        "letter_spacing": "0.02em",
        "text_align": "center",
        "color": "#FFFFFF",
        "bg_contrast_min": 4.5
      },
      "auto_fit": {
        "enabled": false
      }
    }
  ],
  "qc_hooks": {
    "pre_render": ["text_length_validation", "font_availability_check"],
    "post_render": ["overflow_detection", "contrast_ratio_check", "resolution_check"],
    "pilot_required": true,
    "pilot_selection_strategy": "extreme_case_auto"
  },
  "version": "1.0.0",
  "created_by": "아마테라스",
  "created_at": "2026-03-29"
}
```

**아마테라스 (설명):** 핵심은 `overflow_policy: "reject"`입니다. 텍스트가 Zone을 벗어나면 에이전트가 렌더링 자체를 중단하고 오류를 반환합니다. `auto_fit`은 폰트를 최소값까지 줄이는 것을 허용하되, 최소값 미만이면 역시 reject입니다.

**로키 (공격):** "JSON 명세서는 아마테라스가 작성하는데, 아마테라스가 실수로 `max_chars`를 너무 크게 설정하면 오버플로우가 발생해도 시스템이 허용합니다. 명세서 자체의 오류를 검증하는 계층이 없습니다."

**마아트 (반론):** 명세서 유효성 검증 레이어를 파이프라인에 추가합니다. 명세서 최초 등록 시 "더미 텍스트 극단값(max_chars 길이)으로 자동 테스트 렌더링"을 실행하고, 결과가 시각적으로 이상 없을 때만 명세서를 승인 상태로 전환합니다. 명세서도 QC 대상입니다.

---

#### B-미결 2: 폰트 통일 후보 목록

**해결 결과: 확정**

| 폰트명 | 용도 | 출처 | Canva 사용 가능 | HTML 사용 가능 |
|--------|------|------|----------------|----------------|
| Noto Sans KR | 본문·서브카피 1순위 | Google Fonts | 가능 (Canva 기본 제공) | 가능 |
| Pretendard | 헤드라인·CTA 1순위 | 오픈소스 (SIL OFL) | 가능 (Canva 업로드) | 가능 |
| Noto Serif KR | 신뢰감 강조 본문 | Google Fonts | 가능 | 가능 |
| Black Han Sans | 임팩트 헤드라인 | Google Fonts | 가능 | 가능 |

**제외 결정:** Canva 유료 독점 폰트(예: Canva Sans) 일체 제외. HTML에서 동일 렌더링 불가 리스크 때문입니다.

**원칙:** Canva 템플릿 제작 시 위 4종 외 폰트 사용 금지. 위반 시 마아트가 템플릿 등록 거부.

---

#### B-미결 3: 파일럿 극단 케이스 자동 선정

**해결 결과: 알고리즘 확정**

극단 케이스 자동 선정 알고리즘:

```
입력: 배치 생산 대상 이미지 목록 (N개)
출력: 파일럿 후보 3개

선정 기준 (각 Zone별 계산):
1. [텍스트 밀도 극단값] = 각 이미지의 (헤드라인 글자 수 / max_chars) 가장 높은 것
2. [Zone 겹침 극단값] = 각 이미지에서 이미지 요소(로고, 일러스트 등) bbox와
   텍스트 Zone bbox의 IoU(교차면적/합집합면적) 가장 높은 것
3. [폰트 크기 최소값] = 예상 font_size_range.min이 가장 작은 것

→ 3가지 기준에서 각 1개씩 선정 (중복 시 다음 순위로 대체)
→ 3개 파일럿 모두 통과 시 배치 생산 승인
→ 1개라도 실패 시 전체 배치 중단 + 원인 수정 후 재파일럿
```

**로키 (공격):** "IoU 계산은 에이전트가 어떻게 합니까? 이미지 요소의 bbox를 자동으로 추출하는 코드가 없으면 수동으로 해야 하고, 수동이면 스킵됩니다."

**아마테라스 (반론):** Zone 명세서에 `image_elements` 필드를 추가하여 디자이너가 템플릿 등록 시 이미지 요소의 bbox를 명세서에 기입합니다. 에이전트는 명세서에서 bbox를 읽어 IoU를 계산합니다. 한 번만 입력하면 이후 모든 배치에서 자동 적용됩니다.

---

#### B-미결 4: Canva API 기술적 가능성

**해결 결과: 조사 완료, 단기 보류 결정**

조사 결과 요약:
- Canva Connect API는 2024년부터 공개됨. 텍스트 레이어 교체(autofill) 기능 지원 확인.
- 단, API 월 비용 및 요청 한도 제한이 있으며, 한국어 폰트 렌더링 안정성이 미검증.
- Figma API는 텍스트 노드 직접 수정 + PNG export 가능. 한국어 폰트 안정성 높음.

**결정**: 현재는 옵션 1(Canva PNG + HTML 오버레이)로 진행. 전환 트리거는 Cycle 1 합의 유지 (렌더링 오류 월 5건 이상 시 Figma 전환 착수). Canva API는 트리거 발동 전까지 재조사 불필요.

---

### 안건 C 미결 — 해결

#### C-미결 1: v1~v6 실패 전수 분석 (마아트 보고)

**해결 결과: 분석 완료, 체크리스트 역방향 재설계 확정**

**v1~v6 + task-1240/1241 실패 전수 분석 결과:**

| 버전/태스크 | 실패 유형 분류 | 근본 원인 | 해당 체크리스트 커버 여부 | 신규 항목 필요 여부 |
|------------|--------------|----------|------------------------|------------------|
| v1 | 메시지 불명확 — 핵심 이익 문장 없음 | 브리프 단계에서 이익 문장 강제 없음 | 미커버 | Phase 0.5 체크리스트 #2 신규 추가됨 |
| v2 | 후킹 실패 — 첫 문장이 기업 소개로 시작 | 기획 단계에서 훅 구조 검토 없음 | 미커버 | Phase 1.5 체크리스트 #2 신규 추가됨 |
| v3 | 텍스트 오버플로우 (헤드라인 26자) | max_chars 제한 없음 | 미커버 | A1 자동 QC 신규 |
| v4 | 폰트 깨짐 — Canva 유료 폰트 HTML 미지원 | 폰트 통일 정책 없음 | 미커버 | 폰트 통일 정책으로 예방 |
| v5 | CTA 부재 | Phase 1에서 CTA 강제 없음 | 미커버 | Phase 1.5 체크리스트 #3 신규 추가됨 |
| v6 | 브랜드 컬러 위반 | 자동 검증 없음 | 수동만 커버 | A2 자동 QC (대비율) + 브랜드컬러 항목 보강 |
| task-1240 | 텍스트 오버플로우 + 폰트 크기 미달 | QC 항목 없음 + 납기 압박 스킵 가능성 | 미커버 | A1·A3 자동 QC + 파이프라인 잠금 장치 |
| task-1241 | 시각 밸런스 붕괴 (텍스트 Zone 겹침) | 디자인 검토 없이 배치 생산 | 미커버 | Zone 명세서 IoU 검증으로 예방 |

**결론:** 총 8건 실패 중 7건이 Phase 0~1 단계 또는 자동 QC 부재로 발생했습니다. Phase 2 수동 QC 강화만으로는 재발 방지 불가능합니다. Phase 0.5, Phase 1.5, 자동 QC A1~A3이 모두 필요합니다.

**로키 (공격):** "v4 폰트 깨짐은 Canva 유료 폰트를 쓴 디자이너의 실수입니다. 체크리스트 문제가 아니라 폰트 정책 위반 문제입니다. 체크리스트는 이미 위반된 것을 사후에 잡는 역할인데, 사전 정책 위반 방지는 전혀 다른 문제입니다."

**아마테라스 (반론):** 맞습니다. 따라서 폰트 통일 정책을 체크리스트가 아니라 "템플릿 등록 게이트"에 포함시킵니다. 마아트가 템플릿 등록을 승인할 때 폰트 스펙을 확인하는 절차를 추가합니다. 위반 폰트가 포함된 템플릿은 등록 자체가 불가합니다. 이것은 체크리스트가 아니라 입구 통제입니다.

---

#### C-미결 2: QC 스킵 방지 파이프라인 잠금 장치

**해결 결과: 기술 설계 확정**

**로키 (선공격):** "파이프라인 잠금 장치라고 해도 에이전트가 수동으로 상태를 변경할 수 있으면 무의미합니다. 진짜 잠금이 되려면 사람이 바이패스할 수 없는 구조여야 합니다."

**마아트 (방어):** 맞습니다. 소프트 잠금(알림만)이 아니라 하드 잠금(진행 물리적 차단)이어야 합니다. 설계는 다음과 같습니다.

**파이프라인 잠금 장치 기술 설계 (v1.0):**

```
[아키텍처 원칙]
- 각 Phase는 "완료 토큰(completion token)"이 있어야 다음 Phase 실행 가능
- 완료 토큰은 해당 Phase의 QC 담당자만 발급 가능
- 토큰 없이 다음 Phase 실행 시 파이프라인이 예외를 던지고 중단

[Phase별 완료 토큰 발급 주체]
Phase 0   → 토큰 없음 (자유 진입)
Phase 0.5 → 마아트가 브리프 QC 점수 기록 + "BRIEF_QC_OK" 토큰 발급
Phase 1   → 아프로디테 자체 완료 + "COPY_DRAFT_OK" 토큰 자동 발급 (Phase 0.5 토큰 필수)
Phase 1.5 → 마아트가 기획 QC 점수 기록 + "PLAN_QC_OK" 토큰 발급
Phase 2   → 마아트 + 아프로디테 + 아마테라스 3자 서명 + "PRODUCTION_OK" 토큰 발급
Phase 3   → 자동 QC A1~A8 전 항목 통과 + "AUTO_QC_OK" 토큰 자동 발급
Phase 4   → 수동 QC B1~B5 전 항목 통과 + "MANUAL_QC_OK" 토큰 발급
배포       → "AUTO_QC_OK" + "MANUAL_QC_OK" 두 토큰 모두 보유 시에만 실행

[토큰 저장 위치]
- 태스크별 상태 파일: /tasks/{task_id}/pipeline_state.json
- 구조:
  {
    "task_id": "task-1251",
    "tokens": {
      "BRIEF_QC_OK": { "issued_by": "마아트", "score": 9, "issued_at": "2026-03-29T10:00:00" },
      "COPY_DRAFT_OK": { "issued_by": "system", "issued_at": "2026-03-29T11:30:00" },
      "PLAN_QC_OK": null,
      "PRODUCTION_OK": null,
      "AUTO_QC_OK": null,
      "MANUAL_QC_OK": null
    },
    "current_phase": "Phase 1.5",
    "blocked": false
  }

[바이패스 방지 원칙]
- 토큰 파일은 에이전트 런타임이 읽기 전용으로 마운트
- 토큰 발급은 별도 QC 서비스(마아트 계정 인증)를 통해서만 가능
- 긴급 바이패스: 사장 계정 승인 + 사유 기록 필수 (로그 삭제 불가)
- 바이패스 이력은 월간 품질 회고에서 전수 리뷰

[자동 QC 실패 처리]
- A1~A8 중 1개라도 실패: AUTO_QC_OK 토큰 미발급 + 실패 항목 오류 보고서 자동 생성
- 오류 보고서 없이 재실행 불가 (오류 보고서 생성 = 문제 인정 로그)
```

**아프로디테:** 긴급 바이패스 조건에 "사장 계정 승인"이 들어간 것은 현실적입니다. 하지만 바이패스가 월 2회 이상 발생하면 "긴급 상황이 구조적 문제"라는 신호이므로, 바이패스 횟수에 따른 프로세스 재검토 트리거를 추가해야 합니다.

**마아트:** 추가합니다. 월 바이패스 2회 이상 → 다음 월 QC 회의에서 의무적으로 원인 분석 안건으로 상정.

---

#### C-미결 3: 마케팅 효과성 복수 평가 구조

**해결 결과: 평가 구조 확정**

**합의된 마케팅 효과성 복수 평가 구조:**

```
평가 주체 구성 (3인 이상):
1. 마케팅팀 내부 검토자 (아프로디테 제외) — 1명 이상
2. 마아트 (QC 관점에서 메시지 명확성 판단) — 1명
3. 내부 타겟 페르소나 대리인 (실제 타겟 고객과 유사한 내부 직원) — 1명 이상

평가 척도 (5점 리커트):
B1 — 메시지 명확성:
  5점: 첫 1초 안에 이 이미지가 무엇을 말하는지 즉시 이해됨
  3점: 1~3초 내 이해됨
  1점: 3초 이후에도 불명확
  (기준 앵커 명시로 평가자 간 편차 최소화)

B2 — CTA 강도:
  5점: 지금 당장 누르고 싶다
  3점: 클릭할 수도 있다
  1점: CTA가 보이지 않거나 동기가 없다

집계 방법:
- 3인 평균 ≥ 4.0점: 통과
- 3인 평균 3.0~3.9점: 조건부 통과 (카피 수정 후 재제출)
- 3인 평균 < 3.0점: 반려 (기획 재검토)
- 단, 평가자 중 1인이라도 1점을 주면 자동 반려 (극단 반응 존중 원칙)

평가 시간 제한: 평가자당 5분 이내 (실제 광고 노출과 유사한 빠른 판단 환경)
```

**로키 (공격):** "내부 직원을 타겟 페르소나 대리인으로 쓰는 것은 맹점이 있습니다. 내부 직원은 제품과 서비스에 너무 익숙해서 초심자 시각을 잃습니다. 이 구조로 4.0점이 나와도 실제 타겟 반응과 다를 수 있습니다."

**아프로디테 (반론):** 100% 동의합니다. 하지만 완벽한 외부 패널을 구성하는 것은 비용과 시간 문제가 있습니다. 타협안은 내부 타겟 대리인 평가를 "필터"로, 실제 A/B 테스트 또는 소규모 외부 패널 리뷰를 "검증"으로 이원화합니다. 내부 평가에서 4.0점 통과 → 배포 후 2주 내 실제 CTR 데이터로 사후 검증 → CTR 기준 미달 시 자동 기획 재검토 플래그 생성.

---

#### C-미결 4: 자동 QC 신규 3종 구현 가능성

**해결 결과: 구현 방안 확정**

**A1 — 텍스트 오버플로우 탐지:**
```
구현 방법: Playwright + 픽셀 분석
1. 렌더링된 이미지에서 각 Zone bbox 외부 픽셀 중
   "텍스트 컬러와 유사한 픽셀(색상 거리 < 30)"이 존재하면 오버플로우 판정
2. 또는 HTML 렌더링 시 각 텍스트 요소의 scrollWidth > clientWidth 이면 오버플로우
→ 두 가지 방법 중 HTML 방법(2번)이 더 정확하므로 1순위 적용
구현 난이도: 낮음 (기존 Playwright 파이프라인에 1개 체크 추가)
```

**A2 — 텍스트-배경 대비율 (WCAG AA 4.5:1):**
```
구현 방법: 이미지 분석 라이브러리 (Pillow 또는 sharp)
1. 각 Zone의 텍스트 컬러 (HTML CSS에서 추출)
2. Zone 영역 배경 이미지의 평균 컬러 (PNG 배경에서 Zone bbox 내 픽셀 평균)
3. 두 컬러의 상대 휘도(relative luminance) 계산 → 대비율 산출
4. 4.5:1 미만이면 실패
주의: 배경이 그라디언트 또는 이미지인 경우 최소값(darkest region)으로 계산
구현 난이도: 중간 (컬러 수학 필요, 라이브러리 존재)
```

**A3 — 폰트 크기 최소 기준 (모바일 14px):**
```
구현 방법: HTML 메타데이터 추출
1. 렌더링 전 CSS 파싱: 각 Zone의 computed font-size 추출
2. 14px 미만이면 실패
3. auto_fit이 활성화된 경우 축소 후 최종 font-size 기준
구현 난이도: 낮음
```

**로키 (공격):** "A2 대비율 계산에서 배경이 복잡한 사진이면 Zone bbox 내 픽셀 평균이 의미없을 수 있습니다. 사진의 일부는 밝고 일부는 어두우면 평균은 중간값인데, 실제로 텍스트 바로 뒤 픽셀이 밝으면 대비가 낮습니다."

**아마테라스 (반론):** 평균이 아니라 최악값으로 계산합니다. Zone bbox 내 배경 픽셀 중 텍스트 컬러와 대비율이 가장 낮은 픽셀(worst case pixel)을 기준으로 합니다. 이것이 더 보수적이고 안전합니다. 최악값 기준 4.5:1 통과이면 어떤 배경 패턴에서도 가독성이 보장됩니다.

**마아트:** 채택합니다. A2는 worst-case pixel 기준으로 구현합니다.

---

## Cycle 2 추가 안건

---

### 추가 안건 D: Phase 0~4 재설계 통합 워크플로우

**통합 워크플로우 다이어그램:**

```
┌─────────────────────────────────────────────────────────────────────┐
│                     통합 이미지 생산 파이프라인                        │
│                          (v2.0 재설계)                               │
└─────────────────────────────────────────────────────────────────────┘

[Phase 0] 브리프 작성 (아프로디테)
   │  산출물: 브리프 문서 (타겟, 핵심 메시지, KPI, 예상 카피 분량)
   │  소요시간: 20~30분
   ▼
[Phase 0.5] 브리프 QC (마아트) ──── 8점 미만 ──→ Phase 0 반려 (재작성)
   │  산출물: 브리프 QC 점수 + "BRIEF_QC_OK" 토큰
   │  소요시간: 5~10분 / 건
   │  8점 이상 → 승인
   ▼
[Phase 1] 카피 기획 (아프로디테)
   │  산출물: 헤드라인 초안, 서브카피 초안, CTA 문구, 사이클 목적 명시
   │  소요시간: 30~60분
   │  전제조건: "BRIEF_QC_OK" 토큰 필수
   ▼
[Phase 1.5] 기획 QC (마아트 + 아마테라스 공동) ── 10점 미만 ──→ Phase 1 재기획
   │  산출물: 기획 QC 점수 + "PLAN_QC_OK" 토큰
   │  소요시간: 10~15분 / 건
   │  - 마아트: 항목 1~3, 5~7 검토
   │  - 아마테라스: 항목 4 (디자인 실현 가능성) 검토
   │  10점 이상 → 승인
   ▼
[Phase 2] 이미지 생산 (에이전트 자동)
   │  산출물: Zone 명세서 기반 PNG 배경 + HTML 텍스트 오버레이 이미지
   │  전제조건: "PLAN_QC_OK" 토큰 필수
   │  생산 순서: 극단 케이스 파일럿 3개 → 수동 검토 → 배치 생산
   ▼
[Phase 2.5] 파일럿 QC 게이트 (아마테라스 + 마아트)
   │  산출물: "PILOT_OK" 또는 "PILOT_FAIL" 판정
   │  파일럿 3개 중 1개라도 실패 → Phase 2 중단 + 원인 수정
   │  3개 모두 통과 → 배치 생산 계속
   ▼
[Phase 3] 자동 QC (에이전트)
   │  산출물: A1~A8 전 항목 통과 보고서 + "AUTO_QC_OK" 토큰
   │  실패 항목 존재 → 오류 보고서 생성 + Phase 2 재생산 지시
   │  전 항목 통과 → 자동 토큰 발급
   ▼
[Phase 4] 수동 QC (역할 분산)
   │  산출물: B1~B5 전 항목 통과 서명 + "MANUAL_QC_OK" 토큰
   │  - B1~B2: 아프로디테 검토 (마케팅 효과성)
   │  - B3: 아마테라스 검토 (시각 밸런스)
   │  - B4~B5: 마아트 검토 (기획 의도 반영 + 프로 수준 종합)
   │  3인 모두 서명 → "MANUAL_QC_OK" 토큰 발급
   ▼
[배포] 승인 및 배포
   │  전제조건: "AUTO_QC_OK" + "MANUAL_QC_OK" 두 토큰 모두 필수
   └──────────────────────────────────────────────────────────────────

[반복 사이클 분기]
   Phase 4 통과 후 사이클 카운터 확인:
   - 사이클 1 완료 → 사이클 2 진입 (Phase 0.5 재진입, 임계값 상향 적용)
   - 사이클 2 완료 → 사이클 3 진입 (Phase 0.5 재진입, 최종 최적화 기준 적용)
   - 사이클 3 완료 → 최종 배포 승인

[긴급 바이패스 경로]
   사장 계정 승인 → 토큰 강제 발급 → 이유 로그 기록 (삭제 불가)
   월 2회 이상 → 다음 월 QC 회의 의무 안건 상정
```

**아프로디테:** 워크플로우가 Phase 0~4에 Phase 0.5, 1.5, 2.5가 추가됐습니다. 총 8단계입니다. 처음보다 복잡해 보이지만, 각 단계의 소요시간을 합산하면 기존 방식(Phase 0→1→2→3→4 + 반려→재작업 루프)보다 총 리드타임이 짧을 것입니다.

**로키 (공격):** "Phase 2.5 파일럿 QC 게이트는 Phase 4 수동 QC와 중복됩니다. 아마테라스가 두 단계에서 모두 검토합니다. 이것은 중복 업무입니다."

**아마테라스 (반론):** 목적이 다릅니다. Phase 2.5는 배치 생산 전 "생산 방법의 기술적 문제"를 잡는 것이고, Phase 4는 "최종 결과물의 품질"을 검증하는 것입니다. 파일럿에서 폰트 깨짐을 잡으면 배치 전체를 다시 만들지 않아도 됩니다. 중복처럼 보이지만 위치가 다릅니다.

---

### 추가 안건 E: QC 체크리스트 통합 문서

**해결 결과: 단일 통합 문서 구조 확정**

**QC 체크리스트 통합 문서 구조 (v1.0):**

```
파일명: qc-master-checklist-v1.json

{
  "version": "1.0.0",
  "last_updated": "2026-03-29",
  "phases": {
    "phase_0_5": {
      "name": "브리프 QC",
      "owner": "마아트",
      "scoring": { "max": 10, "pass_threshold": 8, "conditional_pass": 6 },
      "checklist": [/* 5개 항목 (A-미결 1에서 확정) */]
    },
    "phase_1_5": {
      "name": "기획 QC",
      "owner": "마아트 + 아마테라스(항목4)",
      "scoring": {
        "cycle1": { "max": 14, "pass_threshold": 8, "required_perfect": [1, 2] },
        "cycle2": { "max": 14, "pass_threshold": 10, "required_perfect": [4, 6] },
        "cycle3": { "max": 14, "pass_threshold": 12, "required_perfect": "all" }
      },
      "checklist": [/* 7개 항목 (A-미결 1에서 확정) */]
    },
    "phase_3_auto": {
      "name": "자동 QC",
      "owner": "system",
      "pass_rule": "all_pass",
      "checklist": [
        { "id": "A1", "name": "텍스트 오버플로우 탐지", "type": "신규", "method": "html_scroll_check" },
        { "id": "A2", "name": "텍스트-배경 대비율", "type": "신규", "threshold": 4.5, "method": "worst_case_pixel" },
        { "id": "A3", "name": "폰트 크기 최소 기준", "type": "신규", "threshold_px": 14, "method": "computed_css" },
        { "id": "A4~A8", "name": "기존 5종 유지", "type": "기존" }
      ]
    },
    "phase_4_manual": {
      "name": "수동 QC",
      "pass_rule": "all_signed",
      "checklist": [
        { "id": "B1", "name": "메시지 명확성", "owner": "아프로디테", "scale": 5, "pass_threshold": 4.0, "evaluators": "복수 3인 평균" },
        { "id": "B2", "name": "CTA 강도", "owner": "아프로디테", "scale": 5, "pass_threshold": 4.0 },
        { "id": "B3", "name": "시각 밸런스·브랜드 일관성", "owner": "아마테라스", "scale": 5, "pass_threshold": 4.0 },
        { "id": "B4", "name": "기획 의도 반영 여부", "owner": "마아트", "scale": 5, "pass_threshold": 4.0 },
        { "id": "B5", "name": "프로 수준 종합 평가", "owner": "마아트", "scale": 5, "pass_threshold": 4.0 }
      ]
    }
  },
  "pro_standard_definition": {
    "axis_1_technical": "렌더링 오류 0건, 해상도 기준 충족, 폰트 규격 준수",
    "axis_2_marketing": "메시지 명확성 4.0 이상, CTA 강도 4.0 이상, 타겟 공감도 복수 평가 통과",
    "axis_3_brand": "브랜드 컬러 팔레트 준수, 폰트 통일 정책 준수, 톤앤매너 가이드 준수",
    "pass_rule": "3축 동시 충족"
  }
}
```

---

## Cycle 2 로키의 최종 공격: 전체 시스템 스트레스 테스트

**로키 (종합 공격):** 오늘 설계된 시스템 전체를 공격합니다. 세 가지 실패 시나리오를 제시합니다.

**시나리오 1 — "마아트가 2주 동안 자리를 비운다"**

마아트가 없으면 Phase 0.5, Phase 1.5, Phase 4 B4~B5가 모두 멈춥니다. 마아트 단일 장애점(Single Point of Failure) 문제입니다.

**반론(아프로디테):** 마아트 백업 체제를 사전에 설계합니다. Phase 0.5 임시 대행은 아마테라스 (체크리스트 기계적 적용이므로 위임 가능), Phase 1.5 항목 4 제외는 아프로디테 대행 가능, B4~B5는 마아트 복귀 후 처리 또는 외부 QC 컨설턴트 활용. 단, 긴급 시에만 적용하고 바이패스 로그에 기록.

**시나리오 2 — "캠페인 런칭이 내일인데 오늘 생산 완료해야 한다"**

8단계 프로세스 전체를 하루 안에 돌릴 수 없습니다. 긴급 바이패스를 남용하게 됩니다.

**반론(마아트):** 이 시나리오 자체가 발생하면 안 되는 것입니다. "캠페인 런칭 D-5일 전" 이후에는 신규 이미지 요청이 수리 불가라는 정책을 선언합니다. D-5일 규칙을 위반하는 요청은 바이패스가 아니라 "다음 캠페인에서 반영"으로 처리합니다. 긴급 바이패스는 외부 돌발 이슈(메시지 오류 긴급 수정 등)에만 사용합니다.

**시나리오 3 — "JSON 명세서가 잘못 작성되면 자동 QC가 잘못된 기준으로 통과/반려한다"**

명세서 오류가 QC 오류를 낳는 구조입니다.

**반론(아마테라스):** B-미결 1에서 이미 다뤘습니다. 명세서 등록 시 더미 텍스트로 자동 테스트 렌더링 → 마아트 명세서 승인 → 이후 생산에 사용. 명세서도 QC 대상입니다. 이중 검증 구조입니다.

**로키 (인정):** 세 시나리오 모두 대응책이 있습니다. 단, 시나리오 2의 "D-5일 규칙"은 현실에서 지켜질 가능성이 낮습니다. 이 규칙이 위반되었을 때의 제재 조치가 없으면 형식화됩니다.

**아프로디테 (수용):** D-5일 규칙 위반 시 해당 캠페인의 이미지 생산 자체를 거부하는 것이 제재입니다. 시스템이 D-5일 이후 신규 태스크 생성을 차단합니다. 우회 방법이 없으므로 형식화 가능성이 없습니다.

---

## Cycle 2 전체 합의 요약

### 안건 A 합의
1. Phase 0.5 체크리스트 5항목 확정 (10점 만점, 8점 이상 통과)
2. Phase 1.5 체크리스트 7항목 확정 (14점 만점, 사이클별 임계값 적용)
3. 사이클별 임계값: Cycle 1 (8점), Cycle 2 (10점, 이전+2점), Cycle 3 (12점, 전항목 상향)
4. 마아트 처리 상한: 일 3건, 주 10건. 긴급 등급 조건 명시.

### 안건 B 합의
1. 텍스트 존 명세서 JSON 스키마 v1.0 확정
2. 사용 폰트: Noto Sans KR, Pretendard, Noto Serif KR, Black Han Sans 4종으로 제한
3. 파일럿 극단 케이스 3종 자동 선정 알고리즘 확정
4. Canva API 단기 보류, 옵션 1(PNG+HTML) 계속 적용, 전환 트리거 유지

### 안건 C 합의
1. v1~v6 전수 분석 완료 — 8건 중 7건이 Phase 0~1 또는 자동 QC 부재로 발생
2. 파이프라인 잠금 장치 완료 토큰 시스템 확정
3. 마케팅 효과성 복수 평가 구조 확정 (3인 평균 4.0 이상, 극단 반응 1점 자동 반려)
4. 자동 QC A1~A3 구현 방안 확정 (A2는 worst-case pixel 기준)

### 추가 안건 D·E 합의
1. Phase 0→0.5→1→1.5→2→2.5→3→4 8단계 워크플로우 확정
2. QC 체크리스트 통합 문서 구조 확정 (qc-master-checklist-v1.json)
3. 캠페인 D-5일 규칙 추가: D-5일 이후 신규 이미지 요청 시스템 차단

---

## 미결 사항 (Cycle 3 논의 필요)

### 구현 단계 미결
- [ ] qc-master-checklist-v1.json 실제 파일 작성 및 저장 (마아트 + 아마테라스)
- [ ] Zone 명세서 템플릿별 실제 작성 — 현재 보유 Canva 템플릿 전수 등록 (아마테라스)
- [ ] 자동 QC A1~A3 코드 구현 및 기존 파이프라인 통합 테스트 (에이전트/개발팀)
- [ ] 파이프라인 잠금 장치 (pipeline_state.json + 토큰 발급 서비스) 실제 구현 (에이전트/개발팀)
- [ ] 마케팅 효과성 복수 평가 플로우 운영 방법론 문서화 (아프로디테)

### 파일럿 실행 미결
- [ ] 기존 Canva 템플릿 1개 선택 → Zone 명세서 작성 → 더미 텍스트 자동 테스트 렌더링 실행 (파일럿)
- [ ] 파일럿 결과 기반 Zone 명세서 포맷 보완 여부 확인
- [ ] 반복 사이클 1회 전체 실행 (Phase 0~4 전 단계 실제 통과) 후 소요시간 측정

### 정책 미결
- [ ] D-5일 규칙 예외 조건 (외부 매체 게재 일정 변경 등) 사전 정의
- [ ] 마아트 백업 체제 공식 문서화 (임시 대행 조건 및 한계 명시)
- [ ] 월간 품질 회고 회의 구조 설계 (바이패스 이력 리뷰 포함)

---

*Cycle 2 기록 완료 — 2026-03-29*
*다음 Cycle 3: 구현 단계 착수 확인 및 파일럿 실행 결과 리뷰*
