--- 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' # 직전 리뷰 스냅샷 (기준일: ) ## 미해결 지적 - ... ## 통과 항목 - ... 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/<회사명>_<직무>_.yaml`이며, 저장은 YAML을 손으로 쓰지 않고 `"$_JS_BIN/jobstack-defense-map.mjs" add --company <회사명> --position <직무> --source-skill review --document-ref <원문> --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에서 저장한 질문 세트 파일 경로를 함께 안내합니다.