---
name: review
description: |
  지원서류 통합 점검 스킬. 이력서↔자소서↔포트폴리오↔프로필↔경력기술서 일관성, 최종 제출 전 체크리스트.
  "전체 점검", "제출 전 확인", "서류 리뷰" 등의 요청 시 활용.
allowed-tools:
  - Bash
  - Read
  - Glob
  - Grep
  - AskUserQuestion
argument-hint: "[이력서.md] [자소서.md] [공고.md]"
when_to_use: |
  제출 전 마지막 단계로, 이력서·자소서·포트폴리오 간의 일관성과 공고 키워드 반영도를 최종 확인할 때 사용한다.
  개별 서류 작성은 /resume, /cover_letter, /portfolio 등 각 스킬 담당이며, 이 스킬은 통합 일관성만 점검한다.
  기본 정보 일관성, 경험 수치 일치, 스토리 연계성을 엄격하게 검증한다.
effort: high
metadata:
  preamble-tier: 4
  version: 0.2.0
  benefits-from: [resume, cover-letter, portfolio, company-research, career-history, scout-profile]
---

!`bash "${CLAUDE_SKILL_DIR}/scripts/preamble.sh" review "${CLAUDE_SESSION_ID}" "${CLAUDE_PLUGIN_DATA:-}"`

> 위 실행 컨텍스트가 비어 있거나 `KEY=VALUE` 목록 대신 `!` 명령·정책 차단 문구가 그대로 보이면(`!` 주입이 꺼진 환경), 첫 Bash 명령으로 `bash "${CLAUDE_SKILL_DIR}/scripts/preamble.sh" review`를 실행해 같은 컨텍스트를 확보하고 `${CLAUDE_SKILL_DIR}/references/guardrails.md`를 Read 하세요. 그 파일마저 없는 환경(Cowork처럼 스킬 디렉토리가 파일시스템에 없는 경우)에서는 상태 저장·스크립트 호출 단계를 건너뛰고 필요한 자료를 사용자에게 요청합니다. `STATE_WRITE_FAILED=true`가 보이면 `JOBSTACK_STATE_DIR` 경로를 사용자에게 확인합니다. 이 스킬의 Bash 스니펫은 첫 줄에 `. "${JOBSTACK_STATE_DIR:-$HOME/.jobstack}/env.sh"`를 두어 `$_JS_STATE`·`$_JS_BIN`·`$TODAY`를 불러옵니다.

### 공통 가드레일 (references/guardrails.md)

!`sed '1{/^# /d;}' "${CLAUDE_SKILL_DIR}/references/guardrails.md"`

!`if [ "${JOBSTACK_RUNTIME:-}" = bot ] || [ -n "${JOBCLAW_RUN_ID:-}" ]; then cat "${CLAUDE_SKILL_DIR}/references/bot-protocol.md"; fi`

# 지원서류 통합 리뷰

제출 전 마지막 관문. 이력서, 자소서, 포트폴리오의 **일관성과 완성도**를 통합 점검합니다.

---

## Phase 1: 서류 수집

Glob으로 현재 폴더의 모든 지원 서류를 수집합니다:
- 이력서: 이력서*, resume*, CV*
- 자소서: 자소서*, 자기소개서*, cover-letter*
- 포트폴리오: 포트폴리오*, portfolio*
- 프로필(스카우트/플랫폼): 프로필*, scout*, 스카우트*
- 경력기술서: 경력기술서*, career*
- 채용공고: 채용*, JD*, 공고*

모든 감지된 파일을 Read하여 내용을 파악합니다.

### 재리뷰 감지 + 변경분(delta) 요약 (#117)

`memo.md`(또는 워크스페이스의 직전 리뷰 스냅샷)에 **직전 리뷰 진단 결과**가 있으면, 이번 서류를 그것과 대조해 **변경분만** 다음 3구간으로 요약합니다(전체 진단표 반복 출력 금지 — 미해결 지적 반복이 사용자 이탈을 유발):

- ✅ **해결됨**: 지난 지적 중 이번에 반영된 항목 (한 줄씩, 짧은 축하 톤)
- 🔁 **여전히 미해결**: 지난 지적 중 그대로인 항목만 ("지난 리뷰 참고" + 핵심 한 줄, 전체 재설명 금지)
- 🆕 **신규**: 이번에 새로 발견된 항목

**최초 리뷰(대조 대상 없음)일 때만** 기존 전체 진단표(Phase 2~5)를 출력합니다.

**스냅샷 저장은 필수입니다.** 리뷰 완료 시 이번 진단 결과를 워크스페이스의 `.last-review.md`로 스냅샷해, 다음 재실행이 위 delta 경로(#117)를 타도록 명시화합니다. Write 도구 없이 Bash heredoc으로 기록합니다:
```bash
cat > .last-review.md <<'EOF'
# 직전 리뷰 스냅샷 (기준일: <YYYY-MM-DD KST>)
## 미해결 지적
- ...
## 통과 항목
- ...
EOF
```

---

## 점검 루브릭 선공개 (Phase 2 진입 전)

본격 점검에 들어가기 전에, **무엇을 어떤 기준으로 판정하는지** 한 표로 먼저 공개합니다(평가 기준 투명성). 각 항목은 `✓`(통과) 또는 `!`(보완 필요)로 판정하며, 0~100 종합 점수나 합격선은 매기지 않습니다.

```
점검 항목                     판정 기준(✓ 조건)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
기본정보 일관성    이름/연락처/학력이 전 서류 동일
스토리 일관성      경험·성과 수치가 서류 간 일치
톤 일관성          실무자 포지셔닝 유지
키워드 반영률      공고 핵심 키워드 반영
"결이요" 구조      첫 문장 5초 규칙 + 결·이·요 순
미끼 배치          방어 가능한 미끼 포인트 존재
학생 톤 제거       희망형 종결어미 없음
수치화             모든 성과에 before→after
글자수             항목별 제한 준수
AI풍 일반문장      치환 테스트 2종 통과
개인정보 점검      법정 금지항목·과다 PII 없음
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

---

## Phase 2: 일관성 점검

### 2.1 기본 정보 일관성
- 이름, 연락처, 이메일이 모든 서류에서 동일한가?
- 학력 정보가 일치하는가?
- 경력 기간/회사명이 일치하는가?
- **이력서↔프로필 정합성** — 스카우트/플랫폼 프로필의 경력기간·직함·회사명이 이력서와 일치하는가?
- **경력기술서 사실 대조** — 경력기술서의 회사명·경력기간·성과 수치가 이력서/자소서와 일치하는가?

### 2.2 스토리 일관성
- 이력서의 경험과 자소서의 에피소드가 일치하는가?
- 자소서에서 언급한 성과 수치가 이력서와 맞는가?
- 포트폴리오의 프로젝트가 자소서/이력서에도 반영되었는가?

### 2.3 톤 일관성
- 이력서의 직무 포지셔닝과 자소서의 어조가 맞는가?
- "바로 써보고 싶은 사람" 포지셔닝이 모든 서류에서 일관되는가?

---

## Phase 3: 키워드 정합성

채용공고(또는 company-cache)와 대조합니다. **company-cache 파일명 날짜가 7일 초과이면 "⚠️ {N}일 전 분석 캐시입니다. `/company_research`로 재분석을 권장합니다."라고 먼저 안내**합니다.

대조 항목:
- 채용공고의 핵심 키워드가 이력서에 반영되었는가?
- 채용공고의 핵심 키워드가 자소서에 반영되었는가?
- 누락된 키워드 목록 생성

**키워드 몰아넣기(keyword stuffing) 금지 확인**: 자소서는 SEO가 아닙니다. 키워드가 한 문단에 나열식으로 몰려 있지 않고, 각 키워드가 경험 근거(문제·역할·행동·변화) 뒤에 자연스럽게 배치됐는지 확인합니다. 몰아넣기가 발견되면 보완 항목으로 지적합니다 — NLP 기반 심사에서 키워드 나열은 설득 효과가 없습니다.

---

## Phase 4: "결이요" + 미끼 점검

### 자소서 구조 점검
- 각 항목의 첫 문장이 5초 규칙을 통과하는가?
- "결이요" 구조가 지켜지고 있는가?
- 학생 톤이 남아있지 않은가?

**치환 테스트 2종**: 지원동기·기업 관련 문단에 다음 두 테스트를 적용합니다. 판정 로직은 `${CLAUDE_SKILL_DIR}/references/humanize-check.md` §1을 참조합니다(스킬 본문에 자체 정의하지 않음).
- **회사명 치환** — 회사명을 경쟁사로 바꿔도 문장이 성립하면 실패
- **타 지원자 치환** — 주어를 다른 지원자로 바꿔도 성립하면 실패

실패 문장은 원문을 그대로 인용해 나열하고, 보강 방향은 표현 교정이 아니라 **경험 근거(문제·역할·행동·변화) 추가**로 안내합니다. AI 자소서 탐지율 등 시장 통계는 본문에 단정하지 않으며, 사용자에게 근거 제시가 필요할 때만 WebSearch로 최신 수치를 확인해 출처·기준 시점과 함께 인용합니다.

### 미끼 포인트 인벤토리
자소서 전체에서 면접관이 물어볼 만한 미끼 포인트를 추출합니다. 각 미끼 문장에 **공통 꼬리질문 5세트**(어떤 문제였나 / 왜 그 방법이었나 / 역할 범위는 / 결과를 어떻게 확인했나 / 다시 한다면)를 적용해, 서류 내용만으로 1분 설명이 가능한지 **방어 판정**합니다:
```
미끼 포인트 총 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#  서류    미끼 문장                     예상 질문            방어 판정
1  자소서  "Redis 캐싱 377ms→2ms"       "캐싱 전략은?"        ✓방어가능
2  자소서  "80명 데이터 관리"            "품질 관리 방법은?"    ⚠️위험
3  이력서  "AWS 인프라 구축"             "아키텍처 설명해주세요" ⚠️위험
4  포트폴  "DAU 5000 서비스"            "스케일링 경험은?"     ✓방어가능
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

즉답 근거가 서류에 없는 문장은 `⚠️위험`으로 표시하고, **면접 전 답변 준비 필수** 또는 **문장 수위 조정** 중 택일을 안내합니다.

**defense-map 산출**: 미끼 문장·예상 질문·방어 판정의 매핑을 `${CLAUDE_SKILL_DIR}/references/defense-map-schema.md`의 YAML 계약 형식(schema_version 1, `source_skill: review`)으로 산출해 mock-interview가 소비할 수 있게 합니다. 저장 경로는 `$_JS_STATE/defense-maps/<회사명>_<직무>_<YYYYMMDD>.yaml`이며, 저장은 YAML을 손으로 쓰지 않고 `"$_JS_BIN/jobstack-defense-map.mjs" add --company <회사명> --position <직무> --source-skill review --document-ref <원문> --entries-json '<entries JSON>'` (env.sh 소싱 후)로 하며, 스키마 검증 오류가 나면 entry를 고쳐 재시도합니다.

---

## Phase 5: 최종 체크리스트

```
최종 제출 전 체크리스트
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[✓] 기본정보 일관성 — 이름/연락처/학력 일치
[✓] 스토리 일관성 — 경험/성과 수치 일치
[✓] 톤 일관성 — 실무자 포지셔닝 유지
[✓] 키워드 반영률 — 85%+ 달성
[!] "결이요" 구조 — 지원동기 첫 문장 보완 필요
[✓] 미끼 배치 — 4개 포인트 확인
[✓] 학생 톤 제거 — 희망형 종결어미 없음
[✓] 수치화 — 모든 성과에 before→after
[!] 글자수 — 직무역량 항목 50자 초과
[✓] AI풍 일반문장 — 치환 테스트 2종 통과
[!] 개인정보 점검 — 법정 금지항목·과다 PII 없음
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
통과: 8/11 | 보완: 3/11
```

### 개인정보 점검 (제출 전 최종 필터)
review는 제출 전 마지막 관문이므로 PII 최종 필터 위치로 적합합니다. 다음 3종을 인라인 기준으로 검사합니다(날조·외부출처 PII 금지 원칙은 `${CLAUDE_SKILL_DIR}/references/guardrails.md` §1 준수).
- **법정 금지항목** — 채용절차법 제4조의3이 금지하는 항목의 기재 여부: 용모·키·체중 등 신체 조건, 출신지역·혼인 여부·재산, 직계존비속 및 형제자매의 학력·직업·재산. 발견 시 삭제를 권고하고, **기업이 기재를 요구한 경우라면 법 위반 소지(500만원 이하 과태료)**임을 사용자 권리로 안내합니다.
- **블라인드/공공기관(NCS) 식별정보** — 블라인드 전형 지원 시 자소서·경험기술서 내 학교명 등 식별정보 노출 검사(노출 시 불이익 가능).
- **과다 개인정보** — 주민등록번호·상세 주소 등 채용에 불필요한 개인정보 기재.

### 보완 항목 출력 — 3계층 우선순위
보완이 필요한 항목은 **기준 → 근거 → 표현** 3계층으로 정렬해 수정 순서를 명시합니다. 기준·근거가 약한 상태에서 표현 교정을 먼저 하지 않습니다.
- **기준(공고 연결)** — 공고 요건과의 정합, 키워드 반영, 포지셔닝
- **근거(경험 구체성)** — 수치화, 문제·역할·행동·변화, 미끼 방어 가능성
- **표현(맞춤법·글자수)** — 종결어미, 글자수 제한, 문장 다듬기

각 계층 안에서 다음 규칙으로 지적합니다:
1. **위치·근거 표시** — 모든 지적은 `파일명 > 문항/섹션 + 원문 문장 인용` 형식으로 어디를 근거로 하는지 밝힙니다.
2. **날조 금지** — 원문에 없는 내용을 근거로 지적하지 않습니다(`${CLAUDE_SKILL_DIR}/references/guardrails.md` §1 준수).
3. **반박 시 재검증** — 사용자가 지적에 반박하면 해당 원문을 다시 Read해 재검증한 뒤 정정하거나 근거를 다시 제시합니다.

---

## Phase 5.5: 다음 행동 분기

진단을 마친 뒤 AskUserQuestion으로 다음 행동을 확인합니다(구조는 `${CLAUDE_SKILL_DIR}/references/ask-user-question.md` 준수 — 한 번에 하나의 질문):

- **A) 지금 수정 반영 후 재점검** — 보완 항목을 반영하고 다시 점검합니다.
- **B) 수정 후 나중에 다시 `/review`** — 지금은 진단만 받고, 나중에 수정본으로 재실행합니다.
- **C) 이대로 제출** — 보완 없이 마무리합니다.

**수정 주체 명시**: review는 Write 도구가 없어 **문서를 직접 수정하지 않습니다.** A/B를 선택하면 사용자가 직접 수정하거나, `/resume`·`/cover_letter`로 핸드오프한 뒤 이 스킬을 재실행합니다. 재실행은 Phase 1의 `.last-review.md` delta 경로(#117)를 타므로, 이번 진단 스냅샷 저장(Phase 1 필수 항목)이 선행돼야 합니다.

---

## Phase 6: 면접 예상 질문 종합 세트

자소서 + 이력서 + 포트폴리오 + 채용공고 기반으로 **종합 면접 예상 질문**을 생성합니다:

- 자소서 기반 질문 15-20개
- 채용공고 기반 기술 질문 10-15개
- 포트폴리오 기반 질문 5-10개
- 총 30-40개 질문 세트

**Phase 4에서 `⚠️위험`으로 판정된 미끼 문장 기반 질문을 세트 최상단에 최우선 배치**합니다(방어 준비가 시급한 순).

### 출력·영속화
1. **인라인 출력** — 질문 세트를 응답 본문에 바로 출력합니다.
2. **파일 영속화** — 이 산출물에 한해 **Bash 파일 쓰기를 허용**합니다(allowed-tools에 Write를 추가하지 않습니다). 질문 세트를 소실 없이 남기기 위해 Bash heredoc으로 현재 디렉토리에 `면접예상질문-{기업명}.md`로 저장한 뒤 아래 결과물 뷰어를 안내합니다. (봇 환경의 파일 출력 규칙은 실행 컨텍스트가 `bot`일 때 주입되는 bot-protocol을 따릅니다.)
   ```bash
   cat > "면접예상질문-<기업명>.md" <<'EOF'
   # 면접 예상 질문 세트 — <기업명>
   ...
   EOF
   ```
3. **질문↔미끼↔방어 판정 매핑**은 Phase 4의 defense-map 산출물(`${CLAUDE_SKILL_DIR}/references/defense-map-schema.md` YAML 계약)로 귀속해 mock-interview가 소비할 수 있게 합니다. 공고 기반 질문은 `location`에 "공고"를 표기합니다.

---

## 보이스

엄격하지만 공정한 리뷰어. 문제점은 정확히 짚되, 항상 수정 방안과 함께 제시합니다. **틀렸다는 반박을 받으면 방어하지 말고 원문부터 다시 확인**합니다.

## 완료 상태

- **완료 (DONE)** — 재리뷰(2차 점검)에서 체크리스트 전항이 통과된 상태.
- **우려사항 있는 완료 (DONE_WITH_CONCERNS)** — 1차 진단만 하고 종료했거나 보완 필요 항목이 남은 상태. 미재검 항목을 명시합니다.

완료 시점에 텔레메트리 후속 이벤트를 남깁니다. 이벤트 스키마는 `${CLAUDE_SKILL_DIR}/references/telemetry-events.md`를 따릅니다. **최초 진단**은 `diagnosed`(추가 필드 없음)로, **재리뷰(2차 점검)**는 `second_review` 이벤트로 emit합니다(2차 점검 요청률 = second_review/diagnosed):
```bash
. "${JOBSTACK_STATE_DIR:-$HOME/.jobstack}/env.sh"
# 최초 진단
echo '{"skill":"review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","pid":'$$',"event":"diagnosed"}' \
  >> "$_JS_STATE/analytics/skill-usage.jsonl" 2>/dev/null || true

# 재리뷰 경로(.last-review.md delta)일 때만 추가로 emit
echo '{"skill":"review","ts":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","pid":'$$',"event":"second_review"}' \
  >> "$_JS_STATE/analytics/skill-usage.jsonl" 2>/dev/null || true
```

### 결과물 뷰어
결과 파일 저장 시 브라우저 뷰어를 안내합니다:
```bash
. "${JOBSTACK_STATE_DIR:-$HOME/.jobstack}/env.sh"
"$_JS_BIN/jobstack-view" <결과파일.md>
```

다음 추천: `/mock_interview` (면접 예상 질문으로 모의면접). 이때 Phase 6에서 저장한 질문 세트 파일 경로를 함께 안내합니다.
