careermate 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/AGENTS.md +13 -10
  2. package/INSTALL.md +16 -15
  3. package/README.md +24 -24
  4. package/THIRD_PARTY_NOTICES.md +2 -3
  5. package/bin/careermate.mjs +8 -1
  6. package/dist/career-os/README.md +12 -6
  7. package/dist/career-os/eop/career-description.md +139 -0
  8. package/dist/career-os/eop/cover-letter.md +10 -5
  9. package/dist/career-os/eop/fit-analysis.md +16 -6
  10. package/dist/career-os/eop/interview-prep.md +209 -21
  11. package/dist/career-os/eop/job-analysis.md +6 -4
  12. package/dist/career-os/eop/profile-extraction.md +5 -4
  13. package/dist/career-os/knowledge/cover-letter.md +5 -4
  14. package/dist/career-os/knowledge/fit-matching.md +8 -8
  15. package/dist/career-os/knowledge/human-writing.md +2 -0
  16. package/dist/career-os/knowledge/interview-behavioral.md +76 -8
  17. package/dist/career-os/knowledge/interview-technical.md +106 -4
  18. package/dist/career-os/knowledge/linkedin-profile.md +1 -1
  19. package/dist/career-os/knowledge/networking-referrals.md +1 -1
  20. package/dist/career-os/knowledge/offer-evaluation-decision.md +10 -10
  21. package/dist/career-os/knowledge/portfolio.md +3 -3
  22. package/dist/career-os/knowledge/verifiers/ats-compat.md +8 -4
  23. package/dist/career-os/knowledge/verifiers/human-voice.md +4 -2
  24. package/dist/career-os/knowledge/verifiers/recency-staleness.md +1 -1
  25. package/dist/career-os/knowledge/verifiers/responsiveness-on-target.md +2 -2
  26. package/dist/career-os/knowledge/verifiers/truthfulness.md +1 -1
  27. package/dist/doctor.mjs +692 -71
  28. package/dist/mcp.mjs +710 -71
  29. package/dist/migrate.mjs +52 -1
  30. package/dist/public/app.js +42 -16
  31. package/dist/public/i18n/en/applications.js +23 -0
  32. package/dist/public/i18n/en/common.js +22 -0
  33. package/dist/public/i18n/en/documents.js +133 -0
  34. package/dist/public/i18n/en/home.js +75 -0
  35. package/dist/public/i18n/en/interview.js +69 -0
  36. package/dist/public/i18n/en/jobs.js +152 -0
  37. package/dist/public/i18n/en/nav.js +18 -0
  38. package/dist/public/i18n/en/profile.js +201 -0
  39. package/dist/public/i18n/en/settings.js +127 -0
  40. package/dist/public/i18n/en/status.js +22 -0
  41. package/dist/public/i18n/en.js +17 -0
  42. package/dist/public/i18n/ko/applications.js +23 -0
  43. package/dist/public/i18n/ko/common.js +22 -0
  44. package/dist/public/i18n/ko/documents.js +133 -0
  45. package/dist/public/i18n/ko/home.js +63 -0
  46. package/dist/public/i18n/ko/interview.js +69 -0
  47. package/dist/public/i18n/ko/jobs.js +152 -0
  48. package/dist/public/i18n/ko/nav.js +18 -0
  49. package/dist/public/i18n/ko/profile.js +201 -0
  50. package/dist/public/i18n/ko/settings.js +127 -0
  51. package/dist/public/i18n/ko/status.js +23 -0
  52. package/dist/public/i18n/ko.js +18 -0
  53. package/dist/public/i18n.js +55 -0
  54. package/dist/public/index.html +1 -0
  55. package/dist/public/lib.js +24 -17
  56. package/dist/public/pages/applications.js +17 -21
  57. package/dist/public/pages/documents.js +153 -107
  58. package/dist/public/pages/home.js +88 -53
  59. package/dist/public/pages/interview.js +105 -51
  60. package/dist/public/pages/jobs.js +330 -106
  61. package/dist/public/pages/profile.js +157 -152
  62. package/dist/public/pages/settings.js +154 -102
  63. package/dist/public/styles.css +28 -1
  64. package/dist/web.mjs +495 -75
  65. package/docs/FAQ.md +23 -3
  66. package/docs/MCP_TOOLS.md +22 -13
  67. package/docs/START_WORKFLOW.md +3 -3
  68. package/docs/SUPPORTED_AI_APPS.md +13 -0
  69. package/docs/WORKFLOWS.md +77 -20
  70. package/docs/career-os/README.md +12 -6
  71. package/docs/career-os/eop/career-description.md +139 -0
  72. package/docs/career-os/eop/cover-letter.md +10 -5
  73. package/docs/career-os/eop/fit-analysis.md +16 -6
  74. package/docs/career-os/eop/interview-prep.md +209 -21
  75. package/docs/career-os/eop/job-analysis.md +6 -4
  76. package/docs/career-os/eop/profile-extraction.md +5 -4
  77. package/docs/career-os/knowledge/cover-letter.md +5 -4
  78. package/docs/career-os/knowledge/fit-matching.md +8 -8
  79. package/docs/career-os/knowledge/human-writing.md +2 -0
  80. package/docs/career-os/knowledge/interview-behavioral.md +76 -8
  81. package/docs/career-os/knowledge/interview-technical.md +106 -4
  82. package/docs/career-os/knowledge/linkedin-profile.md +1 -1
  83. package/docs/career-os/knowledge/networking-referrals.md +1 -1
  84. package/docs/career-os/knowledge/offer-evaluation-decision.md +10 -10
  85. package/docs/career-os/knowledge/portfolio.md +3 -3
  86. package/docs/career-os/knowledge/verifiers/ats-compat.md +8 -4
  87. package/docs/career-os/knowledge/verifiers/human-voice.md +4 -2
  88. package/docs/career-os/knowledge/verifiers/recency-staleness.md +1 -1
  89. package/docs/career-os/knowledge/verifiers/responsiveness-on-target.md +2 -2
  90. package/docs/career-os/knowledge/verifiers/truthfulness.md +1 -1
  91. package/package.json +2 -2
  92. package/packages/core/src/onboarding.ts +2 -1
  93. package/packages/core/src/services.ts +134 -17
  94. package/packages/core/src/summary.ts +59 -1
  95. package/packages/core/src/verify/lint.ts +4 -0
  96. package/packages/db/src/index.ts +1 -0
  97. package/packages/db/src/repositories.ts +0 -0
  98. package/packages/db/src/schema.ts +17 -0
  99. package/packages/exporters/src/index.ts +28 -17
  100. package/packages/knowledge/src/index.ts +55 -9
  101. package/packages/mcp-tools/src/tools.ts +250 -24
  102. package/packages/mcp-tools/src/update.ts +30 -15
  103. package/packages/parsers/src/documents.ts +12 -1
  104. package/packages/prompts/src/humanize.ts +46 -0
  105. package/packages/prompts/src/index.ts +5 -1
  106. package/packages/prompts/src/install.ts +4 -4
  107. package/packages/prompts/src/onboarding.ts +4 -4
  108. package/packages/prompts/src/system.ts +9 -7
  109. package/packages/shared/src/enums.ts +14 -4
  110. package/packages/shared/src/schemas.ts +41 -0
  111. package/packages/workflows/src/definitions.ts +45 -8
  112. package/scripts/init.ts +284 -13
  113. package/dist/site/analytics.js +0 -97
  114. package/dist/site/favicon.svg +0 -1
  115. package/dist/site/fonts/PretendardVariable.woff2 +0 -0
  116. package/dist/site/icon-180.png +0 -0
  117. package/dist/site/icon-512.png +0 -0
  118. package/dist/site/index.html +0 -465
  119. package/dist/site/landing.js +0 -163
  120. package/dist/site/llms-install.txt +0 -218
  121. package/dist/site/robots.txt +0 -4
  122. package/dist/site/sitemap.xml +0 -21
  123. package/dist/site/start.html +0 -356
  124. package/dist/site/style.css +0 -665
  125. package/dist/site/vercel.json +0 -20
package/AGENTS.md CHANGED
@@ -10,19 +10,22 @@ CareerMate는 사용자 PC에만 데이터를 두는 **로컬 커리어 작업
10
10
 
11
11
  ## 규칙
12
12
 
13
- - **기존 데이터를 항상 먼저 활용하라.** 사용자에게 묻거나 무언가를 새로 만들기 전에, CareerMate를 MCP로 조회한다: `get_onboarding_status`(연결 직후 최우선), `get_application_context`, `list_jobs`, `get_profile`, `get_resumes`, `get_cover_letters`, `list_recent_activity`. 이미 채워진 항목은 다시 묻지 마라.
14
- - **사용자가 파일을 주면 `read_document`로 읽어라.** 이력서·경력기술서·자소서·채용공고가 PDF·Word(`.docx`)·한컴(`.hwp`/`.hwpx`)·텍스트(`.txt`/`.md`) 파일로 컴퓨터에 있고 사용자가 경로로 가리키면, `read_document({ path })`로 본문 텍스트를 추출한 뒤 그 내용으로 작업하고 결과는 아래 저장 도구로 보관한다(파일 내용을 새 파일로 다시 쓰지 마라). 경로는 가능하면 절대 경로로 준다. 이미지·스캔 PDF는 텍스트 레이어가 없어 추출되지 않을 수 있는데, 그때는 이미지를 직접 볼 수 있는 클라이언트로 읽거나 사용자에게 내용을 텍스트로 붙여넣어 달라고 안내한다.
13
+ - **사용자의 언어로 응답하라(출력 언어).** 기본값은 사용자가 쓴 언어다 — 한국어로 말하면 한국어로, 영어 등 다른 언어로 말하면 그 언어로 답한다. 이 지침·도구 응답(`user_message` 등)·플레이북이 한국어로 쓰여 있어도 그대로 복사하지 말고 **사용자 언어로 옮겨** 전달하고, 선택지·예시·안내 문구도 같은 언어로 맞춘다. 단 **사실·수치·고유명사·저장된 원문은 언어와 무관하게 보존**한다. (대화 언어와 *제출용 산출물의 언어·시장 관행*은 분리한다 — 자소서·이력서 본문의 언어와 관행은 **대상 공고·시장**을 따르며, 한국 공고면 한국 관행(문항형·NCS·블라인드), 비한국 공고면 그 시장 관행(ATS·단일 레터)을 적용한다. 대화 언어와 다를 수 있다.)
14
+ - **기존 데이터를 항상 먼저 활용하라(조회는 최소로).** 연결 직후에는 `get_onboarding_status` **하나만** 부른다 — 무엇이 비었는지·완성도·다음 단계를 한 번에 돌려준다. 완전 신규(프로필 없음)면 더 조회하지 말고 곧장 사용자에게 이력서·정보를 청해 저장 단계로 간다. 이미 채워진 게 있을 때만 `get_application_context`를 **한 번** 더 불러 본문(프로필·대표 이력서·경력·프로젝트·스킬·자소서·최근 지원)을 가져온다 — `list_jobs`·`get_profile`·`get_resumes`·`get_cover_letters`·`list_recent_activity`는 거기에 이미 포함되니 온보딩에서 따로 부르지 마라(불필요한 호출은 사용자 승인 프롬프트만 늘린다). 이미 채워진 항목은 다시 묻지 마라.
15
+ - **사용자가 파일을 주면 `read_document`로 읽어라.** 이력서·경력기술서·자소서·채용공고가 PDF·Word(`.docx`)·한컴(`.hwp`/`.hwpx`)·텍스트(`.txt`/`.md`) 파일로 컴퓨터에 있고 사용자가 경로로 가리키면, `read_document({ path })`로 본문 텍스트를 추출한 뒤 그 내용으로 작업하고 결과는 아래 저장 도구로 보관한다(파일 내용을 새 파일로 다시 쓰지 마라). 경로는 가능하면 절대 경로로 준다. 이미지·스캔 PDF는 텍스트 레이어가 없어 추출되지 않을 수 있는데, 그때는 이미지를 직접 볼 수 있는 클라이언트로 읽거나 사용자에게 내용을 텍스트로 붙여넣어 달라고 안내한다. **여러 문서를 한꺼번에 넘기려 하거나 파일 첨부가 안 되는 클라이언트(CLI 등)면**, `open_inbox`로 인입 폴더(`~/.careermate/inbox`)를 안내한 뒤 사용자가 다 넣었다고 하면 `read_inbox`로 한 번에 본문을 추출한다(낱개 경로를 직접 알려주는 경우엔 `read_document`). `read_inbox`도 `read_document`와 동일하게 PDF·Word·HWP를 자동 추출하고, 텍스트로 추출되지 않는 파일(텍스트 레이어 없는 이미지·스캔본 등)만 직접 읽기로 넘긴다. **공고를 파일이 아니라 URL(링크)로 주면 CareerMate는 그 페이지를 가져오지 않는다 — 네(AI)의 브라우징·웹 도구로 본문을 직접 읽어 분석하고 `save_job_posting`에 텍스트로 저장하라(데이터 사고·수집은 두뇌인 당신 몫이다). 웹 도구가 없는 환경이면 사용자에게 공고 본문을 붙여넣어 달라고 요청한다.**
15
16
  - **공고 분석·자소서 작성 전에는 반드시 `get_application_context`를 먼저 호출하라.** 한 번의 호출로 프로필·대표 이력서·경력·스킬·기존 자소서·대상 공고·선호 문체·강조 포인트를 모두 돌려준다. 맥락 없이 작성하지 마라.
16
- - **결과는 다시 CareerMate에 저장하라.** 분석 → `save_fit_analysis`, 자소서 → `save_cover_letter_version`, 공고 → `save_job_posting`, 면접 자료 → `save_interview_prep`. 커리어 데이터는 흩어진 파일이 아니라 CareerMate 안에 둔다. 임의의 로컬 파일 생성은 최소화하라(사용자가 파일을 원하면 `export_cover_letter`로 `~/.careermate/exports`에 내보낸다).
17
- - **도구 응답은 사람 말로 바꿔라.** 응답에 `user_message`가 있으면 그 문장을 우선 활용하고, `suggested_next_action`은 선택지로 제안한다. `id`, `job_id`, `cover_letter_id`, `workflow_id`, JSON 원문, 도구 이름은 내부 작업용으로만 쓰고 사용자에게 그대로 복사하지 않는다.
18
- - **공고 분석 뒤에는 자기소개서를 곧장 쓰지 말고 선택지를 보여줘라.** 적합도 분석을 저장하고 쉬운 말로 설명한 뒤 "이 공고에 맞춘 자기소개서를 써드릴까요?"라고 묻고, `1. 네, 이 공고에 맞춘 자기소개서를 써줘` / `2. 아니요, 분석만 저장해줘`처럼 고르게 한다. 사용자가 1번을 고른 경우에만 자소서 작성·저장 흐름으로 이어간다.
19
- - **5개 표준 워크플로우를 따르라**: onboarding, analyze_job, write_cover_letter, manage_application_status, prepare_interview. 순서가 헷갈리면 `get_workflow_guide`를 호출한다.
20
- - **사용자 대면 결과는 전문가 절차로 만들고, 저장 전 자가검증하라.** 공고 분석·자소서·면접 자료 등을 만들기 전에는 `get_workflow_guide`로 그 작업의 실행 절차(EOP)와 적용할 전문가 플레이북·검증기 순서를 먼저 받고, `get_playbook`(도메인 깊은 지식)으로 작성한 뒤 저장 직전 `get_verifier`(검증 루브릭)로 **당신이** 자가검증한다(사람이 쓴 듯한 글은 작성 직전 `get_writing_style_guide`도 함께 적용). CareerMate는 셀 수 있는 항목만 돕고 의미 판단은 당신 몫이다. 사실·수치·고유명사는 그대로 보존한다.
21
- - **8단계 지원 상태 게이팅을 존중하라**: `draft`(작성 중) → `planned`(지원 예정) → `applied`(지원 완료) → `document_passed`(서류 합격) → `interview`(면접 진행) → `final_passed`(최종 합격) / `rejected`(불합격) / `on_hold`(보류). 면접 준비는 **`document_passed` 이상**에서만 해금된다. 상태 변경은 `update_application_status`.
17
+ - **결과는 다시 CareerMate에 저장하라.** 분석 → `save_fit_analysis`, 자소서 → `save_cover_letter_version`, 경력기술서 → `add_resume`(`kind=career_description`), 공고 → `save_job_posting`, 면접 자료 → `save_interview_prep`. 커리어 데이터는 흩어진 파일이 아니라 CareerMate 안에 둔다. 임의의 로컬 파일 생성은 최소화하라(사용자가 파일을 원하면 자소서는 `export_cover_letter`, 이력서·경력기술서는 `export_resume`, 프로필은 `export_profile`로 `~/.careermate/exports`에 내보낸다).
18
+ - **여러 문서를 한 번에 요청받아도 각 문서는 각자의 저장 도구로 따로 저장하라.** "경력기술서랑 자기소개서 둘 다 써줘"처럼 한 턴에 여러 문서를 만들었더라도, 한 저장 호출의 본문(content)에 다른 문서를 이어붙이지 마라 — 경력기술서는 `add_resume`(`kind=career_description`), 자기소개서는 `save_cover_letter_version`으로 **각각 따로** 저장한다(작성은 한 답변에 둘 다 보여줘도 무방하나, 저장은 문서별 도구로 분리). 한 문서 본문에 다른 문서가 섞이면 대시보드에 통째로 붙어 등록된다.
19
+ - **도구 응답은 사람 말로 바꿔라.** 응답에 `user_message`가 있으면 그 내용을 우선 활용하되 **사용자의 언어로 옮겨** 전달하고(한국어 원문을 그대로 복사하지 않는다), `suggested_next_action`은 선택지로 제안한다. `id`, `job_id`, `cover_letter_id`, `workflow_id`, JSON 원문, 도구 이름은 내부 작업용으로만 쓰고 사용자에게 그대로 복사하지 않는다.
20
+ - **공고 분석 뒤에는 자기소개서를 곧장 쓰지 말고 선택지를 보여줘라.** 적합도 분석을 저장하고 쉬운 말로 설명한 뒤 "이 공고에 맞춘 자기소개서를 써드릴까요?"라고 묻고, `1. 네, 이 공고에 맞춘 자기소개서를 써줘` / `2. 아니요, 분석만 저장해줘`처럼 고르게 한다. 사용자가 1번을 고른 경우에만 자소서 작성·저장 흐름으로 이어간다. **1번(쓰기)을 고르면 작성 전에, 회사가 지정한 문항·양식·글자수 제한이 있으면 먼저 달라고 요청하라** — 한국 자소서는 문항형(회사별 항목·글자수)이 많아 문항·양식이 결과 질을 좌우한다. 공고·맥락에 없으면 사용자에게 문항 텍스트·제출 양식·글자수(상·하한, 공백포함 여부)를 묻고, 끝내 없으면 일반 양식으로 진행한다고 알린다. 받은 문항·양식·글자수는 작성에 반영하고 가능하면 공고에 함께 저장한다.
21
+ - **표준 워크플로우를 따르라(핵심 6 + 선택 1)**: onboarding, analyze_job, write_cover_letter, write_career_description, manage_application_status, prepare_interview — 그리고 사용자가 LinkedIn·포트폴리오 같은 자기표현 자산을 요청하면 `build_personal_brand`. 순서가 헷갈리면 `get_workflow_guide`를 호출한다.
22
+ - **사용자 대면 결과는 전문가 절차로 만들고, 저장 전 자가검증하라.** 공고 분석·자소서·경력기술서·면접 자료 등을 만들기 전에는 `get_workflow_guide`로 그 작업의 실행 절차(EOP)와 적용할 전문가 플레이북·검증기 순서를 먼저 받고, `get_playbook`(도메인 깊은 지식)으로 작성한 뒤 저장 직전 `get_verifier`(검증 루브릭)로 **당신이** 자가검증한다(사람이 쓴 듯한 글은 작성 직전 `get_writing_style_guide`도 함께 적용). CareerMate는 셀 수 있는 항목만 돕고 의미 판단은 당신 몫이다. 사실·수치·고유명사는 그대로 보존한다.
23
+ - **8단계 지원 상태를 존중하라**: `draft`(작성 중) → `planned`(지원 예정) → `applied`(지원 완료) → `document_passed`(서류 합격) → `interview`(면접 진행) → `final_passed`(최종 합격) / `rejected`(불합격) / `on_hold`(보류). 면접 준비는 사용자가 요청하면 공고 기준으로 저장할 수 있고, `document_passed` 이상에서는 다음 행동으로 우선 제안한다. 상태 변경은 `update_application_status`.
22
24
  - **업데이트 요청은 구분해서 처리하라.** 사용자가 "최신이야?", "업데이트 있어?"처럼 확인만 요청하면 `check_for_update`로 확인한다. "업데이트해줘", "CareerMate 업데이트해줘", "최신으로 올려줘"처럼 적용을 명시하면 `update_careermate`를 바로 호출한다(이 도구가 최신 버전 확인도 함께 한다). 성공 후에는 AI 앱 또는 MCP 연결 재시작이 필요하다고 안내한다.
23
25
  - **결과를 낼 때마다 대시보드로 안내하라.** 공고 저장·적합도 분석·자소서 버전·상태 변경·면접 준비 등 무언가를 저장·완료할 때마다 대시보드(`http://127.0.0.1:4319`) 주소를 알려준다. 브라우저를 직접 여는 건 **첫 온보딩 때 한 번만**(`open_dashboard`) — 이후에는 자동으로 열지 말고 링크만 보여주고, 사용자가 "열어줘"라고 하면 그때 `open_application`(단건)·`open_dashboard`(전체)로 연다.
26
+ - **지원·문의·버그 신고는 정해진 경로로 안내하라(연락처를 지어내지 마라).** 사용자가 문제 신고·기능 요청·일반 문의를 하면: **버그·기능 요청**은 GitHub Issues(`https://github.com/osntak/careermate/issues`), **일반 문의**는 공개 이메일(`osntak@gmail.com`)로 안내한다 — 같은 링크가 **대시보드 설정 화면의 '도움말·문제 신고' 카드**(영어 UI는 'Help & report a problem')와 **사이트 푸터(careermate.life)** 에도 모여 있으니 그쪽을 알려줘도 된다. **보안 취약점은 공개 이슈로 올리지 말고** 비공개 절차(`SECURITY.md`의 GitHub Security Advisories)로 안내한다. 어느 경로든 신고·문의에 **이름·이메일·연락처·자소서 본문 같은 개인정보를 붙여넣지 말라고 먼저 경고**한다(데이터는 로컬에만 있으니 신고에 개인정보가 필요 없다).
24
27
  - **절대 사용자 데이터를 외부로 업로드하지 마라.** 모든 데이터는 `~/.careermate`(Windows: `%USERPROFILE%\.careermate`)에만 있고, 대시보드는 `127.0.0.1`에만 바인딩된다. CareerMate는 (선택적 버전 확인 외) 네트워크로 사용자 데이터를 보내지 않는다.
25
- - 기술 용어(MCP, `job_id` 등)는 사용자에게 노출하지 말고, 매 단계 무엇을 하는지 쉬운 한국어로 설명하라. 확실하지 않으면 지어내지 말고 사용자에게 확인하라.
28
+ - 기술 용어(MCP, `job_id` 등)는 사용자에게 노출하지 말고, 매 단계 무엇을 하는지 **사용자의 언어로** 쉽게 설명하라. 확실하지 않으면 지어내지 말고 사용자에게 확인하라.
26
29
 
27
30
  ## 아직 연결되지 않았다면
28
31
 
@@ -33,4 +36,4 @@ CareerMate MCP 도구가 보이지 않으면(예: `get_onboarding_status` 호출
33
36
  - [`./INSTALL.md`](INSTALL.md) — 설치·등록 런북(클라이언트별 등록 방법)
34
37
  - [`docs/START_WORKFLOW.md`](docs/START_WORKFLOW.md) — 연결 직후 사용자를 빠르게 생산적으로 만드는 단계별 런북
35
38
  - [`docs/MCP_TOOLS.md`](docs/MCP_TOOLS.md) — MCP 도구 레퍼런스(입력·반환·호출 시점)
36
- - [`docs/WORKFLOWS.md`](docs/WORKFLOWS.md) — 5개 표준 워크플로우 상세
39
+ - [`docs/WORKFLOWS.md`](docs/WORKFLOWS.md) — 표준 워크플로우 상세(핵심 6 + `build_personal_brand`)
package/INSTALL.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # CareerMate 설치 런북 (AI 에이전트용)
2
2
 
3
- 이 문서는 **AI 에이전트(Claude Code 또는 Codex)가** 사용자의 컴퓨터에 CareerMate를 설치·초기화할 때 한 단계씩 따라가는 런북입니다. 사람용 튜토리얼이 아니라, **당신(AI)이 실행하고 사용자에게 한국어로 설명하는** 절차서입니다.
3
+ 이 문서는 **AI 에이전트(Claude Code 또는 Codex)가** 사용자의 컴퓨터에 CareerMate를 설치·초기화할 때 한 단계씩 따라가는 런북입니다. 사람용 튜토리얼이 아니라, **당신(AI)이 실행하고 사용자에게 사용자의 언어로 설명하는** 절차서입니다.
4
4
 
5
- 각 단계는 순서대로 수행하되, 무엇을 할지 **먼저 쉬운 한국어로 설명하고 사용자의 동의를 받은 뒤** 실행하세요. 확실하지 않으면 추측하지 말고 사용자에게 확인합니다.
5
+ 각 단계는 순서대로 수행하되, 무엇을 할지 **먼저 사용자의 언어로 쉽게 설명하고 사용자의 동의를 받은 뒤** 실행하세요. 확실하지 않으면 추측하지 말고 사용자에게 확인합니다.
6
6
 
7
7
  > Claude Desktop만 쓰는 사용자는 터미널이 필요 없습니다. 이 경우 `careermate.zip`을 압축 해제해 폴더로 추가하는 경로(아래 5단계)를 안내하세요. `.mcpb` 직접 추가는 일부 Claude Desktop 버전에서 실패하는 알려진 이슈가 있습니다.
8
8
 
@@ -12,8 +12,8 @@
12
12
 
13
13
  ## 에이전트가 반드시 지켜야 할 규칙
14
14
 
15
- 1. **동의 먼저.** 파일을 만들거나 서버를 켜기 **전에** 무엇을 할지 설명하고 사용자 동의를 받습니다. (4단계 체크리스트 참고)
16
- 2. **설명 먼저, 실행 나중.** 각 명령을 실행하기 전에 "지금 무엇을, 왜 하는지" 한 줄로 알립니다.
15
+ 1. **동의는 한 번에.** 설치가 하는 일(4단계 체크리스트)을 한 묶음으로 보여주고 **딱 한 번** 동의를 받습니다. 그 뒤 폴더 생성·MCP 등록·연결 검증 같은 로컬 동작은 **다시 묻지 않고** 이어서 진행합니다. 새로 멈춰 동의받아야 하는 건 **시스템 전역 변경(예: Node 설치)** 과 **사용자 개인 파일 읽기**뿐입니다.
16
+ 2. **설명 먼저, 실행 나중.** 각 명령은 "지금 무엇을, 왜 하는지" 한 줄로 **알리되**(고지), 위 두 경우가 아니면 동의를 다시 묻지 않습니다.
17
17
  3. **불필요한 파일을 읽지 않습니다.** 특히 사용자의 이력서·자기소개서 같은 개인 파일은 사용자가 그 단계를 요청했을 때만 읽습니다. 설치 단계에서는 읽을 필요가 없습니다.
18
18
  4. **로컬 데이터를 외부로 올리지 않습니다.** CareerMate 데이터는 사용자 컴퓨터에만 저장됩니다. 어떤 단계에서도 외부 업로드를 하지 않습니다.
19
19
  5. **실패하면 복구 절차를 제시합니다.** 명령이 실패하면 멈추지 말고 9단계 "문제 발생 시 복구 절차"의 해당 항목을 안내합니다.
@@ -66,16 +66,16 @@ node --version
66
66
 
67
67
  ---
68
68
 
69
- ## 4단계 — 사용자 동의 항목 (여기서 멈추고 동의를 받으세요)
69
+ ## 4단계 — 사용자 동의 (여기서 멈추고 한 번 받으세요)
70
70
 
71
- 아래 항목을 사용자에게 그대로 보여주고 **동의를 받은 뒤에만** 다음 단계로 진행합니다.
71
+ 아래 네 가지를 **한 묶음으로 한 번에** 보여주고 "진행할까요?"라고 **딱 한 번** 동의를 받습니다(항목마다 따로 묻지 않습니다). 동의하면 폴더 생성·MCP 등록·연결 검증 등 나머지 로컬 동작은 다시 묻지 않고 이어서 진행합니다.
72
72
 
73
- 설치를 진행하면 CareerMate는 다음을 수행합니다. 동의하시나요?
73
+ 설치를 진행하면 CareerMate는 다음을 수행합니다. 진행할까요?
74
74
 
75
- - [ ] 데이터 폴더 **`~/.careermate`** 생성
76
- - [ ] 로컬 **SQLite 데이터베이스**(`careermate.sqlite`) 생성
77
- - [ ] 로컬 **대시보드 서버**(`http://127.0.0.1:4319`) 실행 — 외부 접근 불가
78
- - [ ] 모든 데이터를 **이 컴퓨터에만** 로컬 저장 (외부 업로드 없음)
75
+ - 데이터 폴더 **`~/.careermate`** 생성 (그 안의 로컬 SQLite DB는 최초 사용 시 자동 생성)
76
+ - 사용 중인 AI 앱의 MCP 설정에 careermate 등록 (기존 설정은 자동 백업)
77
+ - 로컬 **대시보드 서버**(`http://127.0.0.1:4319`) 실행(요청 시) — 외부 접근 불가
78
+ - 모든 데이터를 **이 컴퓨터에만** 로컬 저장 (외부 업로드 없음)
79
79
 
80
80
  사용자가 동의하지 않으면 진행하지 말고, 어떤 항목이 걸리는지 확인하세요.
81
81
 
@@ -106,6 +106,7 @@ npm run init
106
106
  - `~/.careermate` 폴더를 보장합니다.
107
107
  - **감지된** AI 클라이언트를 자동 등록합니다(설정 파일 또는 그 상위 폴더가 있으면 감지된 것으로 간주).
108
108
  - **Claude Code 프로젝트 `.mcp.json`은 항상** 이 명령을 실행한 작업 폴더에 기록합니다.
109
+ - **Claude Code면** 같은 폴더 `.claude/settings.local.json`에 careermate **데이터 도구를 사전 허용**해, 재시작 후 도구마다 뜨던 승인 프롬프트를 없앱니다(파일 읽기·업데이트·삭제 등 민감 도구는 제외해 그대로 확인을 받음; 끄려면 `--no-allow-tools`).
109
110
  - 기존 설정은 변경 전에 타임스탬프 백업을 만들고, 사용자 env와 무관한 TOML 테이블은 보존합니다.
110
111
 
111
112
  ### 클라이언트별 결과
@@ -113,7 +114,7 @@ npm run init
113
114
  | 클라이언트 | 등록 결과 |
114
115
  |---|---|
115
116
  | **Claude Desktop** | `careermate.zip` 압축 해제 후 폴더 추가(아래) — `init`과 별개. `.mcpb` 직접 추가는 known issue |
116
- | **Claude Code** | 현재 작업 폴더에 프로젝트 `.mcp.json` 기록 → 첫 실행 시 **1회 승인** 필요 |
117
+ | **Claude Code** | 현재 작업 폴더에 `.mcp.json` + `.claude/settings.local.json`(데이터 도구 사전 허용) 기록 → 첫 실행 시 폴더 **"신뢰" 1회**만 |
117
118
  | **Codex** | `~/.codex/config.toml`의 `[mcp_servers.careermate]` 기록 → Codex 안에서 `/mcp`로 확인 |
118
119
 
119
120
  `.mcp.json`은 최상위 `"mcpServers"` 아래에 서버별 `{"type":"stdio","command":...,"args":[...]}` 형태로 들어갑니다.
@@ -153,12 +154,12 @@ npm run init -- --print
153
154
 
154
155
  `.mcpb` 직접 추가는 일부 Claude Desktop 버전에서 설치 창이 뜨지 않거나 실패하는 알려진 이슈가 있습니다. `careermate.zip`은 같은 번들을 폴더 설치용으로 제공하는 파일이며, 폴더 안에는 같은 `manifest.json`과 서버 코드가 들어 있습니다.
155
156
 
156
- > 참고: `careermate.mcpb`와 `careermate.zip`은 **https://careermate.life 또는 GitHub Release에서 누구나 바로 내려받을 수 있습니다.** 소스를 받은 경우 `npm run build:mcpb`로 둘 다 직접 빌드할 수 있습니다. 둘 다 잘 안 되면 **터미널에서 `npx -y careermate init`** 가 가장 간단한 대안입니다.
157
+ > 참고: `careermate.mcpb`와 `careermate.zip`은 GitHub Release에서 내려받을 수 있습니다. 소스를 받은 경우 `npm run build:mcpb`로 둘 다 직접 빌드할 수 있습니다. 둘 다 잘 안 되면 **터미널에서 `npx -y careermate init`** 가 가장 간단한 대안입니다.
157
158
 
158
159
  ### init 직후 마무리
159
160
 
160
161
  - AI 클라이언트를 **완전히 재시작**합니다.
161
- - Claude Code라면 **1회 승인** 프롬프트를 수락합니다.
162
+ - Claude Code라면 이 폴더를 처음 열 때 뜨는 **"신뢰(trust)" 1회**를 수락합니다(데이터 도구는 사전 허용돼 도구별 승인은 거의 없음).
162
163
  - 연결 검증: AI에게 **`get_onboarding_status`** 도구를 호출하게 합니다. (Codex는 `/mcp`로도 확인)
163
164
  - 폴더를 옮긴 경우 `init`을 다시 실행합니다.
164
165
 
@@ -193,7 +194,7 @@ npm start
193
194
 
194
195
  ## 8단계 — 설치 완료 카드 (사용자에게 보여주기)
195
196
 
196
- 연결 검증까지 끝났으면, 사용자에게 아래 "완료 카드"를 쉬운 한국어로 보여주고 마무리하세요(도구 이름은 노출하지 말 것). **지금 실행 중인 앱에 맞는 항목만 골라** 안내합니다(공통 '붙여넣기'는 항상 포함).
197
+ 연결 검증까지 끝났으면, 사용자에게 아래 "완료 카드"를 사용자의 언어로 보여주고 마무리하세요(도구 이름은 노출하지 말 것). **지금 실행 중인 앱에 맞는 항목만 골라** 안내합니다(공통 '붙여넣기'는 항상 포함).
197
198
 
198
199
  > ✅ **설치 끝! 이제 이렇게 시작하세요**
199
200
  >
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CareerMate
2
2
 
3
- [![npm](https://img.shields.io/npm/v/careermate?logo=npm&color=cb3837)](https://www.npmjs.com/package/careermate) [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![node](https://img.shields.io/node/v/careermate)](https://nodejs.org)
3
+ [![npm](https://img.shields.io/npm/v/careermate?logo=npm&color=cb3839)](https://www.npmjs.com/package/careermate) [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![node](https://img.shields.io/node/v/careermate)](https://nodejs.org)
4
4
 
5
5
  **한국어** · [English](#careermate-english)
6
6
 
@@ -30,8 +30,8 @@
30
30
 
31
31
  ## 주요 기능
32
32
 
33
- - **AI와 대화로 모든 작업** — MCP 도구 37개로 온보딩·프로필·이력서·자소서·공고·핏 분석·지원 상태·면접 준비·전문가 플레이북·AI 티 안 나는 글쓰기까지 처리.
34
- - **지원 상태 8단계 관리** — `draft`(작성 중) · `planned`(지원 예정) · `applied`(지원 완료) · `document_passed`(서류 합격) · `interview`(면접 진행) · `final_passed`(최종 합격) · `rejected`(불합격) · `on_hold`(보류). `document_passed` 이상에서 면접 준비가 해금됩니다.
33
+ - **AI와 대화로 모든 작업** — MCP 도구로 온보딩·프로필·이력서·자소서·공고·핏 분석·지원 상태·면접 준비·전문가 플레이북·AI 티 안 나는 글쓰기까지 처리.
34
+ - **지원 상태 8단계 관리** — `draft`(작성 중) · `planned`(지원 예정) · `applied`(지원 완료) · `document_passed`(서류 합격) · `interview`(면접 진행) · `final_passed`(최종 합격) · `rejected`(불합격) · `on_hold`(보류). `document_passed` 이상에서는 면접 준비를 다음 행동으로 제안합니다.
35
35
  - **자기소개서 버전 관리** — 공고별로 자소서 버전을 쌓고 타임라인으로 비교, 파일로 내보내기.
36
36
  - **채용공고 파싱** — 붙여넣은 공고 텍스트를 구조화해 저장.
37
37
  - **로컬 대시보드** — 프레임워크·CDN 없는 바닐라 JS로 만든 7페이지 웹 화면(다크모드 지원).
@@ -46,7 +46,7 @@
46
46
  | 프로세스 | 실행 | 역할 |
47
47
  | --- | --- | --- |
48
48
  | **대시보드 웹 서버** | `npm start` | `http://127.0.0.1:4319` — 내 데이터를 눈으로 확인·관리. `127.0.0.1`에만 바인딩. |
49
- | **MCP 서버** | `npm run mcp` | stdio 기반. 보통 AI 클라이언트가 자동 실행. 도구 37개 제공. |
49
+ | **MCP 서버** | `npm run mcp` | stdio 기반. 보통 AI 클라이언트가 자동 실행. 커리어 작업 도구 제공. |
50
50
 
51
51
  ---
52
52
 
@@ -141,14 +141,14 @@ npx -y careermate init
141
141
 
142
142
  ---
143
143
 
144
- ## MCP 도구 한눈에 (37개)
144
+ ## MCP 도구 한눈에
145
145
 
146
146
  | 분류 | 도구 |
147
147
  | --- | --- |
148
148
  | 온보딩 | `get_onboarding_status` |
149
- | 프로필 | `save_profile` · `get_profile` |
150
- | 이력서 | `read_document` · `add_resume` · `get_resumes` · `open_inbox` · `read_inbox` |
151
- | 경력·프로젝트·스킬 | `add_experience` · `get_experiences` · `add_project` · `get_projects` · `add_skill` · `get_skills` |
149
+ | 프로필 | `save_profile` · `get_profile` · `export_profile` |
150
+ | 이력서 | `read_document` · `add_resume` · `get_resumes` · `export_resume` · `delete_resume` · `open_inbox` · `read_inbox` |
151
+ | 경력·프로젝트·스킬 | `add_experience` · `get_experiences` · `delete_experience` · `add_project` · `get_projects` · `delete_project` · `add_skill` · `get_skills` · `delete_skill` |
152
152
  | 자기소개서 | `get_cover_letters` · `save_cover_letter_version` · `delete_cover_letter` · `export_cover_letter` |
153
153
  | 채용공고 | `save_job_posting` · `get_job_posting` · `list_jobs` · `delete_job_posting` |
154
154
  | 핵심 컨텍스트 | **`get_application_context`** (지원에 필요한 맥락을 한 번에 모아줌) |
@@ -161,7 +161,7 @@ npx -y careermate init
161
161
  | 대시보드/활동 | `open_dashboard` · `open_application` · `list_recent_activity` · `get_workflow_guide` |
162
162
  | 업데이트 | `check_for_update` · `update_careermate` |
163
163
 
164
- 이 도구들 위에 5종의 워크플로우(`onboarding`, `analyze_job`, `write_cover_letter`, `manage_application_status`, `prepare_interview`)가 정의되어 있어, AI가 단계별로 자연스럽게 안내합니다.
164
+ 이 도구들 위에 7종의 워크플로우가 정의되어 있어 AI가 단계별로 자연스럽게 안내합니다: 핵심 6종(`onboarding`, `analyze_job`, `write_cover_letter`, `write_career_description`, `manage_application_status`, `prepare_interview`)과 LinkedIn·포트폴리오용 `build_personal_brand`.
165
165
 
166
166
  ---
167
167
 
@@ -176,12 +176,12 @@ CareerMate/
176
176
  │ ├─ shared/ # 공용 타입·zod 스키마·유틸
177
177
  │ ├─ db/ # node:sqlite DB 접근·스키마·마이그레이션
178
178
  │ ├─ core/ # 도메인 유스케이스
179
- │ ├─ mcp-tools/ # MCP 도구 37개 정의
179
+ │ ├─ mcp-tools/ # MCP 도구 정의
180
180
  │ ├─ knowledge/ # Career-OS 전문가 플레이북·검증 루브릭 serve
181
181
  │ ├─ exporters/ # 내보내기(자소서 등)
182
182
  │ ├─ parsers/ # 채용공고 파싱
183
183
  │ ├─ prompts/ # 프롬프트·안내 문구
184
- │ └─ workflows/ # 워크플로우 5종
184
+ │ └─ workflows/ # 워크플로우 6종
185
185
  ├─ site/ # 설치 안내 페이지
186
186
  ├─ docs/ # 문서
187
187
  ├─ scripts/ # migrate / seed / doctor / test 등
@@ -302,8 +302,8 @@ You can open the dashboard at any time to see your stored data. For a step-by-st
302
302
 
303
303
  ## Key features
304
304
 
305
- - **Everything through conversation with AI** — 35 MCP tools cover onboarding, profile, resumes, cover letters, job postings, fit analysis, application status, interview prep, expert playbooks, and human-sounding writing.
306
- - **8-stage application status** — `draft` · `planned` · `applied` · `document_passed` · `interview` · `final_passed` · `rejected` · `on_hold`. Interview prep unlocks at `document_passed` or later.
305
+ - **Everything through conversation with AI** — MCP tools cover onboarding, profile, resumes, cover letters, job postings, fit analysis, application status, interview prep, expert playbooks, and human-sounding writing.
306
+ - **8-stage application status** — `draft` · `planned` · `applied` · `document_passed` · `interview` · `final_passed` · `rejected` · `on_hold`. Interview prep is suggested at `document_passed` or later.
307
307
  - **Cover-letter versioning** — Stack versions per posting, compare on a timeline, export to a file.
308
308
  - **Job-posting parsing** — Turn pasted posting text into structured records.
309
309
  - **Local dashboard** — A 7-page web UI built with framework-free, CDN-free vanilla JS (dark mode supported).
@@ -318,7 +318,7 @@ Two local processes share the same database.
318
318
  | Process | Run | Role |
319
319
  | --- | --- | --- |
320
320
  | **Dashboard web server** | `npm start` | `http://127.0.0.1:4319` — view and manage your data. Binds to `127.0.0.1` only. |
321
- | **MCP server** | `npm run mcp` | stdio-based. Usually launched automatically by the AI client. Provides 35 tools. |
321
+ | **MCP server** | `npm run mcp` | stdio-based. Usually launched automatically by the AI client. Provides the career tools. |
322
322
 
323
323
  ---
324
324
 
@@ -407,23 +407,23 @@ After connecting, **fully restart** the AI client and verify the connection by a
407
407
  | **Jobs** | List and detail of saved postings (posting content + fit analysis). |
408
408
  | **Applications** | A kanban board showing your pipeline across the 8 statuses. |
409
409
  | **Documents** | Cover-letter version timeline and resumes. |
410
- | **Interview** | Interview prep materials (unlocked at `document_passed` or later). |
410
+ | **Interview** | Interview prep materials and interview-stage next steps. |
411
411
  | **Settings** | Export/delete data, environment info. |
412
412
 
413
413
  Dark mode is supported.
414
414
 
415
415
  ---
416
416
 
417
- ## MCP tools at a glance (35)
417
+ ## MCP tools at a glance
418
418
 
419
419
  | Category | Tools |
420
420
  | --- | --- |
421
421
  | Onboarding | `get_onboarding_status` |
422
- | Profile | `save_profile` · `get_profile` |
423
- | Resume | `read_document` · `add_resume` · `get_resumes` · `open_inbox` · `read_inbox` |
424
- | Experience / projects / skills | `add_experience` · `get_experiences` · `add_project` · `get_projects` · `add_skill` · `get_skills` |
425
- | Cover letter | `get_cover_letters` · `save_cover_letter_version` · `export_cover_letter` |
426
- | Job posting | `save_job_posting` · `get_job_posting` · `list_jobs` |
422
+ | Profile | `save_profile` · `get_profile` · `export_profile` |
423
+ | Resume | `read_document` · `add_resume` · `get_resumes` · `export_resume` · `delete_resume` · `open_inbox` · `read_inbox` |
424
+ | Experience / projects / skills | `add_experience` · `get_experiences` · `delete_experience` · `add_project` · `get_projects` · `delete_project` · `add_skill` · `get_skills` · `delete_skill` |
425
+ | Cover letter | `get_cover_letters` · `save_cover_letter_version` · `delete_cover_letter` · `export_cover_letter` |
426
+ | Job posting | `save_job_posting` · `get_job_posting` · `list_jobs` · `delete_job_posting` |
427
427
  | Core context | **`get_application_context`** (gathers all context needed for an application in one call) |
428
428
  | Fit analysis | `save_fit_analysis` |
429
429
  | Application status | `update_application_status` |
@@ -434,7 +434,7 @@ Dark mode is supported.
434
434
  | Dashboard / activity | `open_dashboard` · `open_application` · `list_recent_activity` · `get_workflow_guide` |
435
435
  | Update | `check_for_update` · `update_careermate` |
436
436
 
437
- On top of these tools, five workflows (`onboarding`, `analyze_job`, `write_cover_letter`, `manage_application_status`, `prepare_interview`) are defined so the AI can guide you naturally, step by step.
437
+ On top of these tools, seven workflows are defined so the AI can guide you naturally, step by step: the six core flows (`onboarding`, `analyze_job`, `write_cover_letter`, `write_career_description`, `manage_application_status`, `prepare_interview`) plus `build_personal_brand` for LinkedIn/portfolio assets.
438
438
 
439
439
  ---
440
440
 
@@ -449,12 +449,12 @@ CareerMate/
449
449
  │ ├─ shared/ # Shared types, zod schemas, utils
450
450
  │ ├─ db/ # node:sqlite DB access, schema, migrations
451
451
  │ ├─ core/ # Domain use cases
452
- │ ├─ mcp-tools/ # The 35 MCP tool definitions
452
+ │ ├─ mcp-tools/ # The MCP tool definitions
453
453
  │ ├─ knowledge/ # Career-OS expert playbooks & verifier rubrics (serve)
454
454
  │ ├─ exporters/ # Exporters (cover letters, etc.)
455
455
  │ ├─ parsers/ # Job-posting parsing
456
456
  │ ├─ prompts/ # Prompts and guidance copy
457
- │ └─ workflows/ # The 5 workflows
457
+ │ └─ workflows/ # The 6 workflows
458
458
  ├─ site/ # Install guide page
459
459
  ├─ docs/ # Documentation
460
460
  ├─ scripts/ # migrate / seed / doctor / test, etc.
@@ -17,6 +17,8 @@ CareerMate에 포함된 일부 콘텐츠는 제3자 오픈소스에서 파생되
17
17
  ```
18
18
  MIT License
19
19
 
20
+ Copyright (c) 2026 epoko77-ai
21
+
20
22
  Permission is hereby granted, free of charge, to any person obtaining a copy
21
23
  of this software and associated documentation files (the "Software"), to deal
22
24
  in the Software without restriction, including without limitation the rights
@@ -36,9 +38,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
36
38
  SOFTWARE.
37
39
  ```
38
40
 
39
- > 참고: 원 저장소의 정확한 저작권자 표기(`Copyright (c) <year> <holder>`)를 확인해
40
- > 위 전문 상단에 그대로 채워 넣는 것을 권장합니다.
41
-
42
41
  ---
43
42
 
44
43
  ## 번들에 포함되는 npm 의존성 (런타임)
@@ -65,7 +65,14 @@ const runArgs =
65
65
  ? ['--no-warnings', '--experimental-sqlite', bundle, ...rest]
66
66
  : ['--no-warnings', '--experimental-sqlite', '--import', 'tsx', path.join(ROOT, ENTRIES[cmd]), ...rest];
67
67
 
68
- const child = spawn(process.execPath, runArgs, { cwd: ROOT, stdio: 'inherit' });
68
+ // 자식 cwd는 tsx/tsconfig(paths 별칭) 해석을 위해 ROOT로 고정한다. 하지만 init은 사용자가
69
+ // 명령을 친 '작업 폴더'에 .mcp.json·권한 설정을 써야 하므로, 원래 cwd를 env로 함께 넘긴다
70
+ // (init.ts의 userCwd()가 이 값을 우선한다). 다른 명령에는 무해하다.
71
+ const child = spawn(process.execPath, runArgs, {
72
+ cwd: ROOT,
73
+ stdio: 'inherit',
74
+ env: { ...process.env, CAREERMATE_INIT_CWD: process.cwd() },
75
+ });
69
76
 
70
77
  child.on('exit', (code, signal) => {
71
78
  if (signal) process.kill(process.pid, signal);
@@ -32,6 +32,7 @@ EOP·이 문서를 맹신하지 말 것. **저장된 사용자 데이터나 공
32
32
  | "이 공고 적합도/나랑 맞아?/지원할 만해?" | [fit-analysis](eop/fit-analysis.md) | job-analysis, profile-extraction |
33
33
  | "이 공고 분석/뜯어줘", "무슨 회사·직무·레벨이야" | [job-analysis](eop/job-analysis.md) | — |
34
34
  | "이력서/경력 정리·입력", "기본정보 채워" | [profile-extraction](eop/profile-extraction.md) | — |
35
+ | "경력기술서/경력서술서/career description 써줘·정리해줘" | [career-description](eop/career-description.md) | profile-extraction, ats |
35
36
  | "자소서/자기소개서/지원동기/커버레터 써줘·고쳐줘" | [cover-letter](eop/cover-letter.md) | company-research, human-writing, fit-analysis |
36
37
  | "면접 준비/예상질문/모의면접" | [interview-prep](eop/interview-prep.md) | company-research, fit-analysis |
37
38
  | résumé·ATS·linkedin·portfolio·salary·offer·rejection·onboarding | `knowledge/` 플레이북 | — |
@@ -46,9 +47,14 @@ EOP·이 문서를 맹신하지 말 것. **저장된 사용자 데이터나 공
46
47
  → EOP 자가검증 루브릭 적용 → 수정 → 출력 계약대로 최종 제공
47
48
  ```
48
49
  컨텍스트가 이미 있으면 다시 묻지 않는다(AGENTS.md "기존 데이터 먼저"). 결과는 다시 CareerMate에 저장(`save_*`).
49
- **루프 종료 규율:** 자가검증→수정을 반복하되, 같은 핵심 결함(허위 수치·미앵커 사실 등)이 2번 고쳐도 남으면 더 생성하지 말고 그 부분을 보류한 채 사용자에게 쉬운 한국어로 출처/사실을 확인 요청한다. 저장 데이터에 없어 해결 불가한 갭은 즉시 사용자에게 묻는다 — **무한정 고쳐쓰지 않는다.**
50
+ **루프 종료 규율:** 자가검증→수정을 반복하되, 같은 핵심 결함(허위 수치·미앵커 사실 등)이 2번 고쳐도 남으면 더 생성하지 말고 그 부분을 보류한 채 사용자의 언어로 출처/사실을 확인 요청한다. 저장 데이터에 없어 해결 불가한 갭은 즉시 사용자에게 묻는다 — **무한정 고쳐쓰지 않는다.**
50
51
 
51
52
  ## 3. 보편 출력 계약 (사용자 대면)
53
+
54
+ **출력 언어 = 사용자의 대화 언어.** 사용자가 한국어면 한국어로, 다른 언어면 그 언어로 답한다. 이 문서·EOP·플레이북·도구 응답이 한국어로 쓰여 있어도 그대로 복사하지 말고 사용자 언어로 옮긴다(사실·수치·고유명사·인용 원문은 보존).
55
+
56
+ **로케일(시장) 판정 — 대화 언어와 분리한다.** 제출용 산출물(자소서·이력서 본문 등)의 *언어와 시장 관행*은 **대상 공고·시장**을 따른다(대화 언어와 다를 수 있다 — 예: 한국인이 영문 공고에 영문 레터). 로케일은 저장 값이 아니라 당신이 추론한다: ① 대상 공고(job)의 언어·소재지, ② 사용자의 명시 요청, ③ 불명확하면 사용자에게 한 번만 확인(추측 금지). `ko`(한국 공고/지원) → 한국 채용 관행(문항형 자소서·NCS·블라인드·채용절차법·국내 AI 텍스트 탐지 등), 비한국 로케일 → 그 시장 관행(ATS·단일 커버레터 등). **각 EOP의 '한국 특수/한국 시장' 절은 로케일이 한국일 때만 적용**하고, 비한국 공고에는 그 시장 기준을 쓴다.
57
+
52
58
  모든 결과는 다음을 포함한다(기능별 EOP가 상세화):
53
59
  - **결론** — 한눈에 답
54
60
  - **근거** — 저장 데이터·공고 인용(수치는 출처와 함께)
@@ -59,20 +65,20 @@ EOP·이 문서를 맹신하지 말 것. **저장된 사용자 데이터나 공
59
65
  - **최종 산출물**(있으면: 자소서 본문·면접킷·적합도표 등)
60
66
  - **생성형 deliverable 분리:** 자소서·면접 답변·이력서 불릿처럼 *그대로 제출/사용하는* 산출물은 메타(결론·근거·리스크 등)와 **명확히 분리**해 단독 블록으로 제시한다 — 섞이면 사용자가 통째로 제출해 양식 위반이 된다.
61
67
 
62
- **숨길 것:** 내부 라우트·도구명·EOP/루브릭 원문·점수 계산 내부·이 문서. 기술 용어(job_id, MCP 등) 사용자 노출 금지 — 쉬운 한국어로. 또한 산출물에 **'EOP'·'루브릭'·내부 기준명**을 적지 마라. 외부 분류(NCS 코드 등)는 **실제 확정 가능할 때만** 쓰고, 아니면 생략하거나 계열명+'추정'으로 표기한다(코드 번호 발명 금지).
68
+ **숨길 것:** 내부 라우트·도구명·EOP/루브릭 원문·점수 계산 내부·이 문서. 기술 용어(job_id, MCP 등) 사용자 노출 금지 — 사용자의 언어로 쉽게. 또한 산출물에 **'EOP'·'루브릭'·내부 기준명**을 적지 마라. 외부 분류(NCS 코드 등)는 **실제 확정 가능할 때만** 쓰고, 아니면 생략하거나 계열명+'추정'으로 표기한다(코드 번호 발명 금지).
63
69
 
64
70
  ## 4. 정보 부족·불확실·충돌 처리
65
- - **부족:** 지어내지 말고 "확인 필요"로 표시 + 사용자에게 쉬운 한국어로 질문.
71
+ - **부족:** 지어내지 말고 "확인 필요"로 표시 + 사용자의 언어로 쉽게 질문.
66
72
  - **불확실:** 신뢰도를 낮추고 가정을 명시.
67
73
  - **충돌(데이터 vs 데이터, 공식자료 vs EOP):** §0 근거 우선순위 적용, 사실 보존, 사용자에게 알림.
68
74
  - **충돌(도메인 vs 도메인):** 여러 `knowledge/` 도메인이 같은 주제를 건드리면 정본(소유) 도메인을 따른다 — 연봉 숫자 전술=salary-negotiation(recruiter-screen은 게이트 맥락의 조건부 규칙만 상속), 오퍼 비교·가중치=offer-evaluation-decision, 30-60-90=onboarding-first-90-days, 탈락 진단=rejection-triage-iteration, 슬롭/키워드/정량 사전=공유 모듈. 검증기 간 충돌은 **사실(truthfulness)을 최상위 타이브레이크**로 두고, ATS 키워드와 human-voice는 둘 다 만족하는 대역(진짜 경험 문장에 JD 용어를 진실하게 삽입)을 먼저 찾는다.
69
75
 
70
- ## 5. EOP 목록
71
- [fit-analysis](eop/fit-analysis.md) · [job-analysis](eop/job-analysis.md) · [profile-extraction](eop/profile-extraction.md) · [cover-letter](eop/cover-letter.md) · [interview-prep](eop/interview-prep.md)
76
+ ## 5. EOP 목록 (6종)
77
+ [fit-analysis](eop/fit-analysis.md) · [job-analysis](eop/job-analysis.md) · [profile-extraction](eop/profile-extraction.md) · [cover-letter](eop/cover-letter.md) · [career-description](eop/career-description.md) · [interview-prep](eop/interview-prep.md)
72
78
 
73
79
  각 EOP 구조 = 전문가 프레임 · 입력 수집 · 분석 절차 · 한국/영문 특수 · 출력 계약 · 자가검증 루브릭 · 근거.
74
80
 
75
81
  ## 6. 디렉터리·기존 문서와의 관계 (무엇을 버리지 않는가)
76
82
  - **`knowledge/` (Phase A — 16 도메인 플레이북 + 6 verifiers)** = **정본 deep 지식**(대학 커리어센터·NCS·ATS 등 출처 충실). **버리지 않는다.** 각 EOP는 이 플레이북을 *실행 절차로 압축*하고 상단 "지식 출처"로 가리킨다 — EOP=얇은 실행층, knowledge=깊은 지식층. 함께 적용한다.
77
83
  - **`validation/`** = 새 리서치 4편(`research/`, knowledge **보강**: 검증 출처+한국 시장+리뷰어 루브릭) + 다중 LLM(cross-vendor) 교차검증 하니스(`runs/`, `PROTOCOL.md`, `MANDATE.md`). 런타임 소비 경로는 아님.
78
- - **`implementation/`** = CareerMate **개발자용** Phase B 내부 설계(`ARCHITECTURE.md`·`CONTRACT.md`·`EXPERTS.md`·`VERIFIERS.md`·`LOOP_ENGINE.md`·`EVALUATION.md`·`CONSENSUS_ENGINE.md`·`TODO.md`·`KNOWLEDGE.md`·`CONSUMPTION.md` + `phase-b2/`). MCP 도구·DB·det 엔진 등 빌드 스펙 — **외부 LLM 소비에는 불필요**(소비 진입점은 이 README + `eop/` + `knowledge/`).
84
+ - **`implementation/`** = CareerMate **개발자용** Phase B 내부 설계(`ARCHITECTURE.md`·`CONTRACT.md`·`EXPERTS.md`·`VERIFIERS.md`·`LOOP_ENGINE.md`·`EVALUATION.md`·`CONSENSUS_ENGINE.md`·`TODO.md`·`KNOWLEDGE.md`·`CONSUMPTION.md` + `phase-b2/`). MCP 도구·DB·det 엔진 등 빌드 스펙 — **외부 LLM 소비에는 불필요**(소비 진입점은 이 README + `eop/`(6 EOP) + `knowledge/`).
@@ -0,0 +1,139 @@
1
+ # EOP — 경력기술서 / Career Description
2
+
3
+ > 외부 LLM 실행 지침. 이 절차를 따르면 단순 이력서 요약이 아니라 **채용 담당자가 빠르게 검증할 수 있는 제출용 경력기술서**가 나온다.
4
+ > **지식 출처(deep reference, 먼저 읽어라):** [`../knowledge/resume.md`](../knowledge/resume.md)(국문 경력기술서 원칙·Do/Don't·Before→After·R1~R9 루브릭) · [`../knowledge/ats.md`](../knowledge/ats.md)(ATS/문항형 지원서 분기·키워드·파싱 안전성) · 검증기 [`../knowledge/verifiers/truthfulness.md`](../knowledge/verifiers/truthfulness.md)·[`consistency.md`](../knowledge/verifiers/consistency.md)·[`ats-compat.md`](../knowledge/verifiers/ats-compat.md). 이 EOP는 그 플레이북을 *실행 절차*로 압축한 얇은 층이다 — 작성 시 해당 knowledge 문서를 함께 적용한다.
5
+ > 근거(보강 리서치): [`../validation/research/job-analysis-and-profile.md`](../validation/research/job-analysis-and-profile.md) §B. 먼저 [README](../README.md) §0·§3 적용.
6
+
7
+ ## 0. 전문가 프레임
8
+
9
+ - 경력기술서 = **실행·성과·검증 가능한 증거**를 구조화한 문서다. 자기소개서처럼 동기·감정·배움을 길게 쓰지 않는다.
10
+ - 이력서는 목록과 요약, 경력기술서는 **역할별 문제-행동-결과의 밀도**, 포트폴리오는 **사례·산출물·맥락 증명**이 중심이다. 세 문서를 병합하지 않는다. 경력기술서 작성 규범은 이 EOP·`resume` 정본이 소유하고, 포트폴리오 항목 규범(`case_study` 3막·증거 링크)은 `knowledge/portfolio.md`가 소유한다 — 서로 재정의하지 않는다.
11
+ - 좋은 경력기술서는 평가자가 30초 안에 "무슨 일을 했고, 어느 정도 규모였고, 무엇이 달라졌는지"를 찾을 수 있어야 한다.
12
+ - 국문 `~을 담당`은 금지어가 아니다. 다만 `담당`만 있고 범위·행동·성과가 없으면 직무 나열에 그친다.
13
+ - 수치·회사명·기간·직책·기술명은 저장 데이터 또는 사용자 제공 자료에 앵커한다. **없는 성과 수치를 발명하지 마라.**
14
+
15
+ ## 1. 입력 수집
16
+
17
+ 먼저 저장된 프로필, 대표 이력서, 기존 경력기술서, 경력, 프로젝트, 스킬을 모두 읽는다. 사용자가 파일 경로를 주면 `read_document`, 인입 폴더를 쓴 경우에는 `read_inbox`로 본문을 읽는다.
18
+
19
+ 입력 문서가 이미 경력기술서면 새로 꾸며 쓰기 전에 원문을 보존해 저장·개선한다. 입력 문서가 이력서/포트폴리오/자기소개서라면 문서 성격을 구분해 필요한 사실만 추출한다. 자기소개서의 동기·감정 문장은 경력기술서 본문으로 그대로 옮기지 않는다.
20
+
21
+ 저장된 자료와 새 자료가 충돌하면 임의로 합치지 말고 충돌 사실을 표시한다. 회사명, 직책, 기간, 수치, 기술명, 자격증, 학교명은 원문을 보존한다.
22
+
23
+ ## 2. 작성 목적 분류
24
+
25
+ 작성 전에 아래 중 무엇인지 확인한다.
26
+
27
+ 1. **범용 마스터본:** 여러 지원에 재사용할 기본 경력기술서.
28
+ 2. **특정 직무/공고용:** 공고의 필수 요건과 반복 키워드를 반영하되, 실제 경험 밖으로 확장하지 않는다.
29
+ 3. **신입/무경력 역량기술서:** 경력을 날조하지 않고 프로젝트·교육·활동·운영 경험을 직무 역량 증거로 정리한다.
30
+ 4. **포트폴리오 보조 문서:** 링크/산출물의 배경, 역할, 의사결정, 결과를 요약해 포트폴리오를 설명한다.
31
+
32
+ 대상 공고가 있으면 must-have와 preferred를 분리하고, must-have는 실제 근거가 있는 경험에만 연결한다. 키워드는 "나열"이 아니라 역할·성과 문장 안에 자연스럽게 넣는다.
33
+
34
+ ## 3. 구조
35
+
36
+ 권장 구조:
37
+
38
+ 1. 제목: 용도와 직무가 보이는 제목. 예: `B2B SaaS 운영/CS 경력기술서`, `백엔드 개발 경력기술서`.
39
+ 2. 핵심 요약: 3~5줄. 연차/직무축/산업/강점/대표 성과를 압축한다.
40
+ 3. 핵심 역량: 직무 키워드 5~10개. `성실함`, `소통`, `다양한 업무` 같은 넓은 일반어로 채우지 않는다.
41
+ 4. 경력 또는 프로젝트: 회사/조직, 기간, 역할, 환경/도구, 문제, 행동, 결과.
42
+ 5. 주요 성과: 수치가 있으면 원문 기준으로 쓰고, 없으면 범위·규모·빈도·산출물처럼 검증 가능한 정보만 쓴다.
43
+ 6. 기술/도구/자격: 실제 사용 또는 보유한 것만 분리한다. 전사 보유 스킬(예: Next.js)을 저장이 묶지 않은 특정 프로젝트의 사용기술로 단정 귀속하지 않는다 — 도구·기술은 저장 데이터가 묶은 범위(프로젝트·경력) 안에서만 표기한다. <!-- applied: r7-career-description / R7 cross-vendor PASS cd-s1=82·cd-s2=92 / 2026-06-20 -->
44
+ 7. 확인 필요 항목: 근거가 부족한 수치·기간·성과는 제출 본문에 섞지 말고 별도 메모로 남긴다.
45
+
46
+ 각 경력/프로젝트 블록은 가능하면 아래 순서를 따른다.
47
+
48
+ ```text
49
+ 회사/조직 | 기간 | 역할
50
+ - 문제/목표:
51
+ - 담당 범위:
52
+ - 주요 실행:
53
+ - 결과/성과:
54
+ - 사용 도구/기술:
55
+ ```
56
+
57
+ 지원서 입력칸이 자유 서술형이면 위 구조를 Markdown/불릿 중심으로 쓰고, 회사 양식이 표를 요구하면 항목명은 유지하되 내용은 짧은 불릿으로 압축한다. ATS 제출용 자유양식은 단일 컬럼, 표준 섹션명, 선택 가능한 텍스트를 우선한다.
58
+
59
+ ## 4. 불릿 작성 원칙
60
+
61
+ 각 불릿을 `책임(responsibility)`과 `성과(achievement)`로 구분한다. 책임 불릿은 역할 범위 설명이고, 성과 불릿은 후보자의 행동 때문에 달라진 결과다. 책임을 가짜 숫자로 성과처럼 격상하지 않는다.
62
+
63
+ 문장 언어를 사람답게 다듬을 때는 `get_writing_style_guide`에 `doc_type='career_description'`을 주어 받은 보정 지침을 적용한다 — 번역투·클리셰·수동태·공허한 일반론은 자기소개서와 똑같이 제거하되, 불릿·번호 성과·섹션 같은 스캔 가능한 구조는 산문으로 풀지 말고 보존한다(경력기술서는 읽는 게 아니라 스캔되는 문서다).
64
+
65
+ 좋은 성과 불릿은 다음 3요소 중 가능한 만큼 담는다.
66
+
67
+ - 무엇을 바꿨는가: 개선·단축·증가·감소·구축·표준화·운영.
68
+ - 얼마나/어떤 규모였는가: 건수, 기간, 사용자 수, 예산, 전후 비교, 처리량, 산출물 수.
69
+ - 어떻게 했는가: 도구, 프로세스, 협업 방식, 분석/개선 방법.
70
+
71
+ 수치가 없으면 `약 30% 향상` 같은 숫자를 만들지 않는다. 대신 `월 단위 정기 리포트`, `3개 부서 협업`, `고객 문의 유형별 FAQ 정리`, `운영 체크리스트 표준화`처럼 실제로 말할 수 있는 범위와 산출물을 쓴다.
72
+
73
+ 저장된 전후값은 **저장된 형태 그대로** 쓰고, 거기서 비율·배수를 계산해 단정하지 않는다. 예: 저장이 `14,000→9,800`이면 그대로 쓰거나 `감소`로만 표현하고 `약 30% 감소`로 바꾸지 않으며, `1,200→2,000`을 `약 1.7배`로 환산하지 않는다(출처 없는 파생 수치). 비율·배수가 원문에 명시돼 있을 때만 그 수치를 쓴다. <!-- applied: r7-career-description / R7 cross-vendor PASS (FIXES.md P2 파생수치) / 2026-06-20 -->
74
+
75
+ ### Before → After 예시
76
+
77
+ 1. **Before:** SNS 채널 운영 및 콘텐츠 제작을 담당함.
78
+ **After:** 주간 콘텐츠 캘린더를 운영하고 카드뉴스·숏폼 콘텐츠를 제작해 캠페인별 게시 일정과 성과 리포트를 표준화함. 실제 지표가 확인되면 도달률·전환율·팔로워 증감 수치를 반영한다.
79
+ **왜 더 나은가:** Before는 업무명만 있다. After는 행동, 산출물, 확인 가능한 보강 지점을 분리해 가짜 수치 없이 평가자가 역할을 이해하게 한다.
80
+
81
+ 2. **Before:** 팀 프로젝트에 참여하여 서비스 기획을 경험함.
82
+ **After:** 사용자 인터뷰 결과를 기능 요구사항으로 정리하고 화면 흐름도를 작성해 팀의 MVP 범위를 확정하는 데 기여함. 인터뷰 건수·팀 규모·제출 산출물이 원문에 있으면 함께 표기한다.
83
+ **왜 더 나은가:** 신입/무경력 상황에서도 경력을 만든 척하지 않고, 실제 행동과 산출물 중심의 역량 증거로 바꾼다.
84
+
85
+ 3. **Before:** 고객 응대 업무를 담당했고 책임감 있게 일함.
86
+ **After:** 고객 문의 유형을 분류해 응대 템플릿과 FAQ를 정리하고, 반복 문의 처리 기준을 문서화함. 처리 건수·CSAT·처리 시간 단축이 확인된 경우에만 성과 수치로 반영한다.
87
+ **왜 더 나은가:** `책임감` 같은 평가어를 빼고, 면접에서 설명 가능한 행동·산출물·검증 필요 수치를 구분한다.
88
+
89
+ ## 5. 무경력/비개발자 분기
90
+
91
+ 정규 경력이 없으면 경력을 만든 것처럼 쓰지 않는다. 문서명도 필요하면 `역량기술서` 또는 `프로젝트 기반 경력기술서`로 둔다.
92
+
93
+ - 아르바이트, 운영, 학회, 동아리, 과제, 교육 과정, 봉사, 개인 프로젝트에서 직무와 관련된 행동을 추출한다.
94
+ - 성과 수치가 없으면 처리 규모, 사용 도구, 산출물, 협업 방식, 개선한 점으로 증거를 구성한다.
95
+ - 비개발자는 기술 스택 중심으로 몰아가지 말고 직무 도구, 업무 프로세스, 고객/데이터/문서/운영 경험을 중심으로 쓴다.
96
+ - 포트폴리오가 있으면 산출물 링크와 본인 역할을 분리해 적는다. 공동 작업은 본인 기여 범위를 과장하지 않는다.
97
+
98
+ ## 6. 출력 계약
99
+
100
+ 사용자에게는 제출용 경력기술서 본문과 검토 메모를 분리해 보여준다.
101
+
102
+ **① 제출용 경력기술서 본문** — 먼저 제시한다. Markdown/불릿 중심으로, 그대로 저장하거나 지원서에 붙여넣을 수 있게 작성한다. 내부 판단, 루브릭명, 도구명, 검증 과정은 본문에 넣지 않는다.
103
+
104
+ **② 검토 메모 (제출하지 않음)** — 별도로 제시한다.
105
+
106
+ - 근거: 사용한 이력서/프로필/프로젝트/공고 요건.
107
+ - 확인 필요: 수치, 기간, 직책, 기술 숙련도, 본인 기여 범위.
108
+ - 리스크: 근거 부족 성과, 공고 키워드 미충족, 이력서와 충돌하는 표현.
109
+ - 다음 단계: 특정 공고용 수정, 자기소개서 작성, 포트폴리오 연결.
110
+ - 자가검증: §7 루브릭 점검 결과. 이 메모와 리스크·다음 단계는 모두 ②에만 두고 ① 제출 본문에 섞지 않는다.
111
+
112
+ 저장은 `add_resume`으로 한다. 경력기술서 작성 산출물은 `kind=career_description`, `source=ai`를 사용하고, 제목은 사용 목적이 드러나게 쓴다. 대표 문서 지정은 사용자가 동의했을 때만 한다.
113
+
114
+ **자소서·이력서 등을 한 턴에 함께 요청받았더라도, 경력기술서 저장 content엔 경력기술서 본문만 넣는다.** 자기소개서는 별도로 `save_cover_letter_version`에 저장하고, 한 번의 `add_resume` 호출 본문에 자소서·이력서 같은 다른 문서를 이어붙이지 않는다(작성은 한 답변에 둘 다 보여줘도, *저장은 문서별 도구로 분리*한다).
115
+
116
+ ## 7. 자가검증 루브릭
117
+
118
+ 저장 직전 아래 기준으로 스스로 점검하고 수정한다.
119
+
120
+ **CRITICAL(하나라도 → 저장 전 수정/질문):**
121
+ - C1 회사명·기간·직책·학력·자격·수치가 저장 자료 또는 사용자 제공 자료와 다름.
122
+ - C2 원문에 없는 성과 수치, 도구, 문제 원인, 기여 범위를 발명함. 저장된 전후값에서 비율·배수(예: `약 30%`, `약 1.7배`)를 임의로 환산하거나, 도구·기술을 저장이 묶지 않은 프로젝트에 귀속한 경우 포함. <!-- applied: r7-career-description / R7 cross-vendor PASS cd-s1=82·cd-s2=92 / 2026-06-20 -->
123
+ - C3 자기소개서 문장을 그대로 옮겨 동기·감정 중심 산문이 됨.
124
+ - C4 이력서/프로필/프로젝트와 기간·역할·성과가 충돌함.
125
+ - C5 공동 작업을 개인 단독 성과로 과장함.
126
+ - C6 한 저장 본문에 경력기술서와 다른 문서(자기소개서 등)가 함께 들어 있음 — `add_resume` content엔 경력기술서만, 자소서는 `save_cover_letter_version`으로 분리 저장.
127
+
128
+ **MAJOR:**
129
+ - M1 직무 나열만 있고 행동·산출물·성과가 없음.
130
+ - M2 `담당`, `참여`, `지원`, `노력` 같은 약한 표현만 반복됨.
131
+ - M3 공고용인데 must-have 키워드가 실제 경험 문장 안에 반영되지 않음.
132
+ - M4 수치가 모두 연도·버전·기간 같은 맥락 숫자이고 결과 임팩트가 없음.
133
+ - M5 핵심 요약, 역량, 대표 성과를 30초 안에 찾기 어려움.
134
+ - M6 ATS 제출용인데 다단, 이미지 텍스트, 비표준 섹션명, 키워드 스터핑 위험이 있음.
135
+
136
+ **MINOR:**
137
+ - 불릿 길이 불균형, 시제/날짜 표기 불일치, 중복 표현, 지나친 전문용어, 개인정보 과다.
138
+
139
+ **통과 = CRITICAL 0 + MAJOR 0 + 확인 불가 수치 별도 메모 + 경력기술서/자기소개서/포트폴리오 목적 분리.**