# InsuRo 금소법 수정 반영 + 재생성 + 버전 히스토리

## 작업 레벨: Lv.3

## 프로젝트 시스템 3문서
- DevSystem: `/home/jay/workspace/memory/plans/anu-guide-system/plan.md`

## 프로젝트
- InsuRo: `/home/jay/projects/InsuRo`
- 서버: `/home/jay/projects/InsuRo/server`

## 기능 개요
금소법 검증에서 "위반 소지" 판정 시, 수정 제안을 반영하여 콘텐츠를 자동 재생성하고 재검증하는 흐름.

## 수정 사항

### 1. 프론트엔드: 수정 제안 체크박스 + 수정 반영 버튼
`src/pages/Generate.tsx` — 금소법 "warn" 결과 영역:

```tsx
{complianceCheck.status === "warn" && (
  <>
    {/* 위반 소지 항목 */}
    {complianceCheck.warnings.map((w, i) => (
      <label key={i} className="flex items-start gap-2">
        <input type="checkbox" defaultChecked onChange={...} />
        <span>• {w}</span>
      </label>
    ))}
    
    {/* 수정 제안 — 체크박스로 선택 */}
    {complianceCheck.suggestions.map((s, i) => (
      <label key={i} className="flex items-start gap-2">
        <input type="checkbox" defaultChecked onChange={...} />
        <span>💡 {s}</span>
      </label>
    ))}
    
    {/* 수정 반영 버튼 */}
    <Button onClick={handleComplianceRevision}>
      선택 항목 수정 반영
    </Button>
  </>
)}
```

### 2. 서버: 수정 반영 재생성 엔드포인트
`POST /api/insuro/revise-content`

```python
class ReviseContentRequest(BaseModel):
    original_content: str      # 원본 텍스트
    selected_suggestions: list[str]  # 선택된 수정 제안들
    content_id: str | None = None   # 원본 content ID (버전 체인용)

@app.post("/api/insuro/revise-content")
async def revise_content(req: ReviseContentRequest, payload: dict = Depends(verify_jwt)):
    prompt = f"""아래 원본 콘텐츠에서 수정 제안 항목만 반영하고, 나머지는 그대로 유지하세요.
    
[원본 콘텐츠]
{req.original_content}

[수정 제안 (이것만 반영)]
{chr(10).join(f'- {s}' for s in req.selected_suggestions)}

★ 중요: 수정 제안에 해당하지 않는 부분은 절대 변경하지 마세요.
"""
    # claude CLI로 수정 재생성
    revised = await _run_content_cli_async(prompt, "haiku")
    
    # 수정본 저장 (parent_id로 원본 연결)
    title = (req.original_content[:50] + "..." if len(req.original_content) > 50 else req.original_content)
    sb.table("contents").insert({
        "user_id": user_id,
        "title": f"[수정] {title}",
        "content": revised,
        "content_type": "revision",
        "topic": title,
        "parent_id": req.content_id,  # 버전 체인
    }).execute()
    
    # 수정본도 금소법 재검증
    compliance_result = await _run_compliance_check_async(revised)
    
    return {
        "revised_content": revised,
        "compliance": compliance_result,
        "content_id": new_content_id,
    }
```

### 3. DB: contents 테이블에 parent_id 추가
```sql
ALTER TABLE contents ADD COLUMN parent_id uuid REFERENCES contents(id);
CREATE INDEX idx_contents_parent ON contents(parent_id);
```

### 4. 프론트: 원본/수정본 탭 전환
결과 영역에 탭 추가:
- "원본" 탭: 원래 생성된 콘텐츠
- "수정본" 탭: 금소법 수정 반영 버전
- 각 탭에 금소법 검증 결과 표시

### 5. 히스토리: 버전 체인 표시
`src/components/ContentHistoryTab.tsx`:
- parent_id가 있는 콘텐츠는 원본 아래 들여쓰기로 표시
- "v1 (원본) → v2 (금소법 수정)" 형태

## affected_files
- `src/pages/Generate.tsx` (수정 — 체크박스 + 수정 반영 + 탭 전환)
- `server/main.py` (수정 — revise-content 엔드포인트)
- DB 마이그레이션 (contents.parent_id)
- `src/components/ContentHistoryTab.tsx` (수정 — 버전 체인 표시)

## 검증 시나리오
1. 금소법 warn → 수정 제안 체크박스 표시 → 선택 후 "수정 반영" 클릭
2. 수정본 생성 → 원본/수정본 탭 전환 가능
3. 수정본에 대해 금소법 재검증 자동 실행
4. pass 시 "✅ 금소법 적합" 표시
5. 히스토리에서 원본 → 수정본 버전 체인 확인
6. npm run build 성공
7. 서버 재시작 정상
