팀장 2-Step 분리 + 실장 detail_target 기준 수정

팀장 (DA-13 → DA-13a + DA-13b):
  - Step A: 레이아웃 프리셋 선택 (규칙 기반, LLM 불필요)
    sidebar-right / two-column / hero-detail / single-column
  - Step B: 프리셋 안에서 블록 매핑 (Sonnet, 프리셋 CSS 포함)
  - 기존 DA-13b(편집자) → DA-13c로 변경

실장 (kei_client.py):
  - detail_target 기준 수정: 근거/사례/용어는 popup이 아님
  - reference는 sidebar에, 근거는 본문에
  - popup은 진짜 상세 데이터(비교표 등)만
  - 1페이지로 담을 수 있으면 억지로 2페이지 안 함

pipeline.py: import re 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-25 11:52:33 +09:00
parent 7b034b04b6
commit 6d53d95fa6
4 changed files with 95 additions and 51 deletions

View File

@@ -16,10 +16,14 @@
```
[1단계] Kei 실장 (Sonnet) — AI 사고
꼭지 추출 → 레이어 수준 → 강조 판단 → 배치 방향
꼭지 추출 → 정보 구조 파악 → 레이어/강조/배치/role 판단
[2단계] 디자인 팀장 (Sonnet) — AI 사고
블록 매핑 + 공간 배분 + 글자 수 가이드 → 편집자에게 전달
[2단계] 디자인 팀장 — 2-Step
Step A: 레이아웃 프리셋 선택 (규칙 기반, LLM 불필요)
- 실장의 role 분석을 보고 프리셋 자동 결정
Step B: 프리셋 안에서 블록 매핑 + 글자 수 가이드 (Sonnet)
- 선택된 프리셋의 CSS가 프롬프트에 포함됨
- flow → body/main, reference → sidebar
[3단계] Kei 텍스트 편집자 (Sonnet) — AI 사고
글자 수 가이드 참고하되 내용 의미 우선. 도메인 용어 보존하며 편집
@@ -31,14 +35,34 @@
전체 균형 재검토 → 공간 재배분 → 2차 조정 지시
```
### 레이아웃 프리셋 (2단계 Step A)
실장의 role 분석을 보고 **규칙 기반**으로 프리셋을 자동 선택한다. LLM 호출 불필요.
| 프리셋 | 조건 | CSS grid |
|--------|------|----------|
| `sidebar-right` | reference 꼭지가 1개 이상 있음 | `"title title" "body sidebar" "footer footer"` / 65fr 35fr |
| `two-column` | 모든 flow 꼭지가 대등한 비교 | `"title title" "left right" "footer footer"` / 1fr 1fr |
| `hero-detail` | 고강조 꼭지 1개 + 나머지 보조 | `"title title" "hero hero" "detail detail" "footer footer"` |
| `single-column` | 모든 꼭지가 flow, 순차적 | `"title" "body" "footer"` / 1fr |
**선택 규칙:**
```
reference 꼭지 있음 → sidebar-right
모든 flow가 대등 비교 → two-column
고강조 1개 + 나머지 보조 → hero-detail
나머지 → single-column
```
### 역할 분리
| 역할 | 담당 | 방식 | 하는 일 | 하지 않는 일 |
|------|------|------|---------|------------|
| Kei 실장 | Sonnet | AI | 꼭지 추출, 레이어 판단, 강조 판단, 배치 방향, 이미지/표/상세 판단 | 디자인, 텍스트 편집 |
| 디자인 팀장 | Sonnet | AI | catalog에서 블록 선택, 공간 배분, 겹침 방지, 글자 수 가이드, 전체 재검토 | 텍스트 정리, 콘텐츠 의미 판단 |
| 텍스트 편집자 | Sonnet | AI | 도메인 용어 보존하며 편집, 출처 보존, 표 내용 편집 | 레이아웃 결정, 디자인 판단 |
| 디자인 실무자 | Sonnet + 코드 | AI + 코드 | 텍스트에 맞게 디자인 조정, HTML/CSS 조립, 이미지 크기 조정, 표 스케일링 | 콘텐츠 의미 판단 |
| Kei 실장 | Sonnet | AI | 꼭지 추출, 정보 구조 파악, 레이어/강조/배치/role 판단 | 디자인, 텍스트 편집 |
| 디자인 팀장 Step A | 코드 | 규칙 | 실장의 role에 따라 레이아웃 프리셋 자동 선택 | AI 판단 불필요 |
| 디자인 팀장 Step B | Sonnet | AI | 프리셋 안에서 블록 매핑, 글자 수 가이드, zone 배정 | 레이아웃 구조 결정 (이미 정해짐) |
| 텍스트 편집자 | Sonnet | AI | 도메인 용어 보존하며 편집, 출처 보존, 표 편집 | 레이아웃 결정 |
| 디자인 실무자 | Sonnet + 코드 | AI + 코드 | 텍스트에 맞게 디자인 조정, HTML/CSS 조립 | 콘텐츠 의미 판단 |
---
@@ -75,33 +99,35 @@
상세 콘텐츠 판단:
- 너무 구체적/세부적인 내용은 "자세히보기" 대상
[2단계] 디자인 팀장 — 레이아웃 설계
[2단계] 디자인 팀장 — Step A + Step B
블록 매핑:
- catalog 메뉴판에서 각 꼭지에 적합한 블록 선택
- 꼭지의 성격을 보고 판단 (출처 있으면 example-card, 정의면 card-grid 등)
Step A: 레이아웃 프리셋 선택 (규칙 기반, LLM 불필요)
- 실장의 role 분석을 보고 자동 선택:
reference 있음 → sidebar-right
대등 비교 → two-column
고강조 1개 → hero-detail
나머지 → single-column
- 선택된 프리셋의 CSS grid가 Step B 프롬프트에 포함됨
Step B: 프리셋 안에서 블록 매핑 (Sonnet)
- 선택된 프리셋의 zone(body/sidebar/footer)에 꼭지를 배정
- flow 꼭지 → body/main zone
- reference 꼭지 → sidebar zone
- detail_target 꼭지 → popup 연결
- catalog에서 각 꼭지에 적합한 블록 타입 선택
- 각 블록의 대략적 글자 수 가이드
이미지 배치:
- 원본 이미지 크기 확인 (Pillow Image.open().size)
- 가로/세로 비율에 따라 영역 결정
(가로형이면 전체 너비, 세로형이면 텍스트 옆)
- 텍스트 포함 도표는 너무 작게 하면 안 됨
- 이미지는 원본 그대로 사용, 크기만 조절
표 배치:
- 행×열 규모 보고 공간 안에 들어가는지 판단
- 안 들어가면 실장에게 요약 요청 또는 2페이지 분리
- 안 들어가면 요약 요청 또는 popup
자세히보기 설계:
- 상세 콘텐츠는 <details>/<summary> 영역으로 설계
공간 배분:
- 전체 공간에서 영역별 비율 결정
- 꼭지끼리 겹치지 않도록 grid-template 설계
- 각 블록의 대략적 글자 수 가이드
페이지 판단:
- 안 들어가면 2페이지로 분리
자세히보기:
- detail_target 꼭지는 <details>/<summary>로 popup 연결
[3단계] Kei 텍스트 편집자 — 텍스트 정리

45
PLAN.md
View File

@@ -93,21 +93,32 @@
- **의존성:** DA-2
- **완료 기준:** 꼭지 목록 + 레이어 + 강조 + 배치 + 이미지/표/상세 판단 JSON
### DA-13: 2단계 — 디자인 팀장 (레이아웃 설계)
- **파일:** src/design_director.py
- **내용:** 블록 매핑 + 공간 배분 + 글자 수 가이드
- 블록 매핑: catalog 메뉴판에서 각 꼭지 성격에 맞는 블록 선택
- 이미지 배치: Pillow로 원본 크기 확인 → 가로/세로에 따라 영역 결정 (크기만 조절, crop 안 함)
- 표 배치: 행×열 규모 보고 공간 판단 (안 되면 요약 요청 또는 페이지 분리)
- 자세히보기: 상세 콘텐츠는 `<details>` 영역으로 설계
- 공간 배분: 영역별 비율, 겹침 방지
- 글자 수 가이드: 각 블록 공간에 맞는 대략적 글자 수 (하드코딩 아닌 판단)
- 페이지 판단: 안 들어가면 2페이지 분리
- **기술:** Anthropic API (Sonnet) + Pillow (이미지 크기)
### DA-13a: 2단계 Step A — 레이아웃 프리셋 선택 (규칙 기반)
- **파일:** src/design_director.py (`select_preset()` 함수)
- **내용:** 실장의 role 분석을 보고 레이아웃 프리셋을 자동 선택
- reference 꼭지 있음 → `sidebar-right` (65:35)
- 모든 flow가 대등 비교 → `two-column` (50:50)
- 고강조 1개 + 나머지 보조 → `hero-detail`
- 나머지 → `single-column`
- **기술:** Python 규칙 코드 (LLM 불필요)
- **의존성:** DA-12
- **완료 기준:** 블록 배치 + 이미지/표 배치 + 글자 수 가이드 JSON
- **완료 기준:** 프리셋 이름 + CSS grid 반환
### DA-13b: 2단계 Step B — 프리셋 내 블록 매핑 (Sonnet)
- **파일:** src/design_director.py
- **내용:** 선택된 프리셋의 zone에 꼭지를 배정 + 블록 타입 선택 + 글자 수 가이드
- 프롬프트에 선택된 프리셋의 CSS grid가 포함됨
- flow 꼭지 → body/main zone
- reference 꼭지 → sidebar zone
- detail_target → popup 연결
- catalog에서 블록 타입 선택
- 이미지/표 배치 판단
- **기술:** Anthropic API (Sonnet) + Pillow
- **의존성:** DA-13a
- **완료 기준:** zone별 블록 배정 + 글자 수 가이드 JSON
### DA-13c: 3단계 — Kei 텍스트 편집자 (텍스트 정리)
### DA-13b: 3단계 — Kei 텍스트 편집자 (텍스트 정리)
- **파일:** src/content_editor.py
- **내용:** 팀장의 글자 수 가이드 참고하되 내용 의미 우선
- 전체 컨텍스트와 핵심 용어 유지
@@ -116,7 +127,7 @@
- 표 내용 편집 (핵심 행/열 선택, 요약)
- 자세히보기 대상: 요약 버전 + 상세 버전 둘 다 작성
- **기술:** Anthropic API (Sonnet)
- **의존성:** DA-13
- **의존성:** DA-13b
- **완료 기준:** 슬롯별 텍스트 JSON. 핵심 용어 보존. 자세히보기 포함.
### DA-14: 4단계 — 디자인 실무자 (디자인 조정 + HTML 조립) + 5단계 재검토
@@ -126,7 +137,7 @@
+ Jinja2 HTML 조립, 이미지 object-fit:contain, 표 container query, `<details>` 접기, 인쇄 펼침 JS
- 5단계 (AI): 팀장이 전체 균형 재검토 → 채움 비율, 블록 균형, 이미지/표 크기 점검 → 2차 조정
- **기술:** Anthropic API Sonnet (디자인 조정 + 재검토) + Jinja2/CSS (조립)
- **의존성:** DA-11, DA-12, DA-13, DA-13b
- **의존성:** DA-11, DA-12, DA-13a, DA-13b, DA-13c
- **완료 기준:** 텍스트 입력 → 균형 잡힌 슬라이드 HTML (이미지/표/자세히보기 포함, 재검토 완료)
---
@@ -170,9 +181,9 @@
## 의존 관계
```
DA-1 → DA-2 → DA-12(실장) → DA-13(팀장) → DA-13b(편집자) ─┐
DA-1 → DA-2 → DA-12(실장) → DA-13a(프리셋) → DA-13b(블록배치) → DA-13c(편집자) ─┐
├→ DA-14(조립+재검토) → DA-15 → DA-16
DA-3 → DA-4~DA-10 → DA-11(렌더러) ─────────────────────────┘
DA-3 → DA-4~DA-10 → DA-11(렌더러) ──────────────────────────────────────────────
```
- Phase 1~2: AI 없이 진행 가능

View File

@@ -4,11 +4,11 @@
| 상태 | 개수 |
|------|------|
| done | 13 |
| done | 14 |
| in-progress | 0 |
| todo | 3 |
| todo | 4 |
| blocked | 0 |
| **전체** | **16** |
| **전체** | **18** |
---
@@ -37,10 +37,11 @@
| 태스크 | 상태 | 담당 | 시작 | 완료 | 메모 |
|--------|------|------|------|------|------|
| DA-12: 1단계 Kei 실장 (꼭지 추출+분석) | todo | - | - | - | 2~5개 꼭지 + 레이어 + 강조 + 이미지/표/상세 판단. 페이지 분리 |
| DA-13: 2단계 디자인 팀장 (레이아웃 설계) | todo | - | - | - | 블록 매핑 + 이미지/표 배치 + 공간 배분 + 글자 수 가이드 |
| DA-13b: 3단계 텍스트 편집자 (Kei 역할) | todo | - | - | - | 의미 우선 편집 + 표 편집 + 자세히보기(요약+상세) |
| DA-14: 4단계 실무자(AI+코드) + 5단계 재검토 | todo | - | - | - | 디자인 조정 + HTML 조립 + 팀장 균형 재검토 |
| DA-12: 1단계 Kei 실장 (꼭지+정보구조+role) | done | - | - | - | Kei API 연동. info_structure + role(flow/reference) |
| DA-13a: 2단계A 프리셋 선택 (규칙 기반) | todo | - | - | - | reference→sidebar-right, 비교→two-column 등 자동 |
| DA-13b: 2단계B 블록 매핑 (Sonnet) | todo | - | - | - | 프리셋 CSS 포함 프롬프트. zone별 블록 배정 |
| DA-13c: 3단계 텍스트 편집자 (Kei 역할) | todo | - | - | - | 의미 우선 편집 + 표 편집 + 자세히보기(요약+상세) |
| DA-14: 4단계 실무자 + 5단계 재검토 | todo | - | - | - | 디자인 조정 + HTML 조립 + 팀장 균형 재검토 |
## Phase 4: UI + 출력

View File

@@ -31,9 +31,15 @@ KEI_PROMPT = (
"- 슬라이드에 맞게 정리하되, 원본이 말하려는 흐름은 유지\n"
"- 각 꼭지의 레이어(도입/핵심/보조/결론), 강조 여부, 배치 방향을 판단해줘\n"
"- 참조 정보는 role: 'reference'로, 본문 흐름은 role: 'flow'로 표시\n"
"- 본문 흐름을 끊는 상세 내용은 detail_target: true로 표시\n"
"- reference 꼭지는 페이지 안에 사이드바로 배치한다. popup으로 빼지 않는다.\n"
"- 본문 흐름을 뒷받침하는 근거/사례도 페이지 안에 배치한다. popup으로 빼지 않는다.\n"
"- detail_target: true는 정말로 별도로 봐야 하는 상세 데이터(비교표, 상세 스펙)에만 사용한다.\n"
"- 근거, 사례, 용어 정의는 detail_target이 아니다.\n"
"- 이미지/표가 있으면 그것도 판단해줘\n"
"- 1페이지 적정 꼭지: 5개. 초과 시 2페이지 분리.\n\n"
"- 1페이지 적정 꼭지: 5개. 초과 시 2페이지 분리.\n"
"- 2페이지로 분리하는 기준: 꼭지 수가 아니라 콘텐츠 분량이 진짜 많을 때만.\n"
"- 꼭지가 5~6개라도 각 꼭지의 내용이 적으면 1페이지에 충분히 담을 수 있다.\n"
"- 억지로 2페이지로 나누지 마라. 1페이지로 담을 수 있으면 1페이지로.\n\n"
"## 출력 형식 (JSON만)\n"
"```json\n"
'{"title": "제목", "total_pages": 1, '