careermate 0.0.1

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 (137) hide show
  1. package/AGENTS.md +33 -0
  2. package/INSTALL.md +230 -0
  3. package/LICENSE +21 -0
  4. package/README.md +532 -0
  5. package/THIRD_PARTY_NOTICES.md +57 -0
  6. package/bin/careermate.mjs +77 -0
  7. package/dist/career-os/README.md +78 -0
  8. package/dist/career-os/eop/cover-letter.md +46 -0
  9. package/dist/career-os/eop/fit-analysis.md +48 -0
  10. package/dist/career-os/eop/interview-prep.md +39 -0
  11. package/dist/career-os/eop/job-analysis.md +42 -0
  12. package/dist/career-os/eop/profile-extraction.md +37 -0
  13. package/dist/career-os/knowledge/ats.md +131 -0
  14. package/dist/career-os/knowledge/company-research.md +137 -0
  15. package/dist/career-os/knowledge/cover-letter.md +135 -0
  16. package/dist/career-os/knowledge/fit-matching.md +121 -0
  17. package/dist/career-os/knowledge/human-writing.md +118 -0
  18. package/dist/career-os/knowledge/interview-behavioral.md +132 -0
  19. package/dist/career-os/knowledge/interview-technical.md +126 -0
  20. package/dist/career-os/knowledge/linkedin-profile.md +152 -0
  21. package/dist/career-os/knowledge/networking-referrals.md +166 -0
  22. package/dist/career-os/knowledge/offer-evaluation-decision.md +121 -0
  23. package/dist/career-os/knowledge/onboarding-first-90-days.md +126 -0
  24. package/dist/career-os/knowledge/portfolio.md +121 -0
  25. package/dist/career-os/knowledge/recruiter-screen.md +105 -0
  26. package/dist/career-os/knowledge/rejection-triage-iteration.md +115 -0
  27. package/dist/career-os/knowledge/resume.md +123 -0
  28. package/dist/career-os/knowledge/salary-negotiation.md +123 -0
  29. package/dist/career-os/knowledge/verifiers/ats-compat.md +64 -0
  30. package/dist/career-os/knowledge/verifiers/consistency.md +61 -0
  31. package/dist/career-os/knowledge/verifiers/human-voice.md +82 -0
  32. package/dist/career-os/knowledge/verifiers/recency-staleness.md +72 -0
  33. package/dist/career-os/knowledge/verifiers/responsiveness-on-target.md +82 -0
  34. package/dist/career-os/knowledge/verifiers/truthfulness.md +67 -0
  35. package/dist/doctor.mjs +79094 -0
  36. package/dist/mcp.mjs +96108 -0
  37. package/dist/migrate.mjs +4735 -0
  38. package/dist/pdf.worker.min.mjs +28 -0
  39. package/dist/public/app.js +150 -0
  40. package/dist/public/fonts/PretendardVariable.woff2 +0 -0
  41. package/dist/public/icon-180.png +0 -0
  42. package/dist/public/index.html +52 -0
  43. package/dist/public/lib.js +394 -0
  44. package/dist/public/pages/applications.js +107 -0
  45. package/dist/public/pages/documents.js +467 -0
  46. package/dist/public/pages/home.js +261 -0
  47. package/dist/public/pages/interview.js +227 -0
  48. package/dist/public/pages/jobs.js +493 -0
  49. package/dist/public/pages/profile.js +556 -0
  50. package/dist/public/pages/settings.js +240 -0
  51. package/dist/public/styles.css +498 -0
  52. package/dist/site/analytics.js +97 -0
  53. package/dist/site/favicon.svg +1 -0
  54. package/dist/site/fonts/PretendardVariable.woff2 +0 -0
  55. package/dist/site/icon-180.png +0 -0
  56. package/dist/site/icon-512.png +0 -0
  57. package/dist/site/index.html +598 -0
  58. package/dist/site/landing.js +54 -0
  59. package/dist/site/llms-install.txt +217 -0
  60. package/dist/site/robots.txt +4 -0
  61. package/dist/site/sitemap.xml +21 -0
  62. package/dist/site/start.html +326 -0
  63. package/dist/site/style.css +550 -0
  64. package/dist/site/vercel.json +20 -0
  65. package/dist/web.mjs +46852 -0
  66. package/docs/FAQ.md +101 -0
  67. package/docs/MCP_TOOLS.md +311 -0
  68. package/docs/README.md +28 -0
  69. package/docs/START_WORKFLOW.md +137 -0
  70. package/docs/SUPPORTED_AI_APPS.md +112 -0
  71. package/docs/WORKFLOWS.md +202 -0
  72. package/docs/career-os/README.md +78 -0
  73. package/docs/career-os/eop/cover-letter.md +46 -0
  74. package/docs/career-os/eop/fit-analysis.md +48 -0
  75. package/docs/career-os/eop/interview-prep.md +39 -0
  76. package/docs/career-os/eop/job-analysis.md +42 -0
  77. package/docs/career-os/eop/profile-extraction.md +37 -0
  78. package/docs/career-os/knowledge/ats.md +131 -0
  79. package/docs/career-os/knowledge/company-research.md +137 -0
  80. package/docs/career-os/knowledge/cover-letter.md +135 -0
  81. package/docs/career-os/knowledge/fit-matching.md +121 -0
  82. package/docs/career-os/knowledge/human-writing.md +118 -0
  83. package/docs/career-os/knowledge/interview-behavioral.md +132 -0
  84. package/docs/career-os/knowledge/interview-technical.md +126 -0
  85. package/docs/career-os/knowledge/linkedin-profile.md +152 -0
  86. package/docs/career-os/knowledge/networking-referrals.md +166 -0
  87. package/docs/career-os/knowledge/offer-evaluation-decision.md +121 -0
  88. package/docs/career-os/knowledge/onboarding-first-90-days.md +126 -0
  89. package/docs/career-os/knowledge/portfolio.md +121 -0
  90. package/docs/career-os/knowledge/recruiter-screen.md +105 -0
  91. package/docs/career-os/knowledge/rejection-triage-iteration.md +115 -0
  92. package/docs/career-os/knowledge/resume.md +123 -0
  93. package/docs/career-os/knowledge/salary-negotiation.md +123 -0
  94. package/docs/career-os/knowledge/verifiers/ats-compat.md +64 -0
  95. package/docs/career-os/knowledge/verifiers/consistency.md +61 -0
  96. package/docs/career-os/knowledge/verifiers/human-voice.md +82 -0
  97. package/docs/career-os/knowledge/verifiers/recency-staleness.md +72 -0
  98. package/docs/career-os/knowledge/verifiers/responsiveness-on-target.md +82 -0
  99. package/docs/career-os/knowledge/verifiers/truthfulness.md +67 -0
  100. package/package.json +89 -0
  101. package/packages/core/src/context.ts +74 -0
  102. package/packages/core/src/index.ts +8 -0
  103. package/packages/core/src/onboarding.ts +81 -0
  104. package/packages/core/src/services.ts +187 -0
  105. package/packages/core/src/summary.ts +104 -0
  106. package/packages/db/src/connection.ts +76 -0
  107. package/packages/db/src/index.ts +23 -0
  108. package/packages/db/src/paths.ts +52 -0
  109. package/packages/db/src/repositories.ts +891 -0
  110. package/packages/db/src/runtime.ts +58 -0
  111. package/packages/db/src/schema.ts +307 -0
  112. package/packages/exporters/src/html.ts +110 -0
  113. package/packages/exporters/src/index.ts +364 -0
  114. package/packages/exporters/src/markdown.ts +178 -0
  115. package/packages/knowledge/src/index.ts +168 -0
  116. package/packages/mcp-tools/src/bridge.ts +106 -0
  117. package/packages/mcp-tools/src/index.ts +17 -0
  118. package/packages/mcp-tools/src/result.ts +49 -0
  119. package/packages/mcp-tools/src/tools.ts +747 -0
  120. package/packages/mcp-tools/src/update.ts +330 -0
  121. package/packages/parsers/src/documents.ts +533 -0
  122. package/packages/parsers/src/html.ts +86 -0
  123. package/packages/parsers/src/index.ts +231 -0
  124. package/packages/parsers/src/keywords.ts +151 -0
  125. package/packages/prompts/src/humanize.ts +59 -0
  126. package/packages/prompts/src/index.ts +82 -0
  127. package/packages/prompts/src/install.ts +43 -0
  128. package/packages/prompts/src/onboarding.ts +35 -0
  129. package/packages/prompts/src/system.ts +57 -0
  130. package/packages/shared/src/build-info.ts +22 -0
  131. package/packages/shared/src/enums.ts +142 -0
  132. package/packages/shared/src/index.ts +19 -0
  133. package/packages/shared/src/schemas.ts +453 -0
  134. package/packages/workflows/src/definitions.ts +109 -0
  135. package/packages/workflows/src/index.ts +39 -0
  136. package/scripts/init.ts +371 -0
  137. package/tsconfig.json +32 -0
@@ -0,0 +1,112 @@
1
+ # 지원 AI 앱 & 설치 레퍼런스 (Supported AI Apps)
2
+
3
+ CareerMate는 LLM이 없는 **로컬 MCP 도구**입니다. *내 컴퓨터에서 로컬 프로그램을 직접 실행할 수 있는* AI 앱에서만 동작합니다.
4
+
5
+ > **가장 쉬운 사람용 설치 안내는 https://careermate.life (랜딩)** 입니다. 이 문서는 **지원 앱 매트릭스 + 클라이언트별 수동 MCP 설정 + 알려진 제약**을 모은 레퍼런스입니다. AI 에이전트가 따라가는 단계별 런북은 루트 [`/INSTALL.md`](../INSTALL.md), 설치 후 사용 흐름은 [docs/START_WORKFLOW.md](./START_WORKFLOW.md)를 보세요.
6
+
7
+ ---
8
+
9
+ ## 설치는 크게 3가지 — "누가 설치하느냐"
10
+
11
+ | | 무엇 | Node | 대상 |
12
+ |---|---|---|---|
13
+ | **1. 에이전트가 대신 설치** | 작업 폴더에서 **한 문장** → AI가 `careermate.life/llms-install.txt`를 읽고 npm 설치 + MCP 등록 | 필요(에이전트가 winget/brew 또는 nodejs.org로 도와줌) | Claude Code(데스크톱 **"Code" 탭** / CLI)·Codex CLI·Gemini CLI·Cursor 등 *명령 실행 가능한 에이전트* |
14
+ | **2. npm 명령 직접** | 터미널에 `npx -y careermate init` 한 줄(감지된 앱 자동 등록) | 필요 | Claude Desktop·Codex·Cursor 등(그 외는 `--print`로 수동) |
15
+ | **3. `.mcpb`** | 파일 하나를 설정에서 추가 | **불필요**(Claude Desktop 내장) | **Claude Desktop "채팅" 앱 전용** |
16
+
17
+ **1·2는 같은 메커니즘**(Node + npm/npx + MCP 등록) — 에이전트가 치느냐 / 내가 치느냐의 차이일 뿐입니다. 그래서 1·2의 "대상" 제품군이 서로 **겹칩니다**(같은 Claude Code·Codex·Cursor 등). 어느 앱이 어느 방식을 쓰는지는 아래 **앱 × 방식** 매트릭스로 보세요. **3(`.mcpb`)만 Claude Desktop "채팅" 앱 전용**이라 성격이 다릅니다(내장 Node 사용, 단 버전<22.5면 불안정).
18
+
19
+ ### 앱 × 방식
20
+
21
+ | 앱 | 1 에이전트 | 2 npm직접 | 3 .mcpb | 영구 지침 | MCP 등록 위치 |
22
+ |---|---|---|---|---|---|
23
+ | **Claude Desktop "채팅"** | — | ✅(config 등록) | ✅ | — | `.mcpb` 또는 `claude_desktop_config.json` |
24
+ | **Claude Code (Code 탭 / CLI)** | ✅ | ✅ | — | 루트 `CLAUDE.md` | 프로젝트 `.mcp.json` |
25
+ | **Codex CLI** (⚠️ 데스크톱 앱 ✗) | ✅ | ✅ | — | 루트 `AGENTS.md` | `~/.codex/config.toml` |
26
+ | **Gemini CLI / Antigravity** | ✅ | ✅ | — | — | Gemini CLI `~/.gemini/settings.json` · Antigravity `~/.gemini/.../mcp_config.json` |
27
+ | **Cursor · Cline · Windsurf** | ✅ | ✅ | — | — | `~/.cursor/mcp.json` 등 |
28
+
29
+ > **Gemini CLI → Antigravity 전환(2026-06):** Google이 소비자(무료/Pro/Ultra)용 Gemini CLI를 **2026-06-18부터 Antigravity CLI로 전환**합니다(Gemini CLI repo는 오픈소스로 유지·엔터프라이즈 계속). MCP 스키마는 동일(`mcpServers` + `command`/`args`/`env`)합니다. `careermate init`은 **Gemini CLI(`~/.gemini/settings.json`)를 자동 등록**하고, **Antigravity는 설정 파일 경로가 유동적이라 후보 파일이 이미 있을 때만** 등록합니다(없으면 위 mcpServers 블록을 해당 파일에 수동 추가).
30
+
31
+ ### 동작하지 않는 것
32
+ **ChatGPT · Gemini · Claude의 웹·모바일 앱은 안 됩니다.** 클라우드에서 실행되어 **원격 URL 기반 MCP만** 지원하므로, 내 컴퓨터의 로컬 stdio 서버에 직접 닿을 수 없습니다.
33
+
34
+ ---
35
+
36
+ ## 구독·준비물 (2026)
37
+
38
+ - **Claude Code**(Code 탭/CLI): **Pro 이상**(무료 플랜 불가) 또는 `ANTHROPIC_API_KEY` 종량제.
39
+ - **Codex**: **ChatGPT Plus 이상** 로그인으로 충분(API 키 불필요).
40
+ - **`.mcpb`**(Claude Desktop 채팅 확장): **무료 플랜에서도 설치** 가능(안정성이 변수).
41
+ - **터미널/npx**: 무료(Node만). 연결할 앱의 구독 정책은 별개.
42
+
43
+ > **런타임.** CareerMate 서버는 Node 프로그램이라 **Node.js 22.5+ 가 필요**합니다 — 위 1·2 경로 공통(없으면 에이전트가 winget/brew, 안 되면 [nodejs.org](https://nodejs.org) LTS 설치 파일). **Node가 아예 필요 없는 길은 `.mcpb` 하나뿐**인데 그건 내장 Node 버전에 의존해 불안정할 수 있습니다 — **"완전 무설치 + 안정"을 동시에 주는 길은 아직 없습니다.**
44
+ >
45
+ > **Windows + Claude Code(Code 탭)**: [Git for Windows](https://git-scm.com/download/win) 사전 설치가 필요합니다(앱이 없으면 "Git is required" 안내). Claude Code가 **세션 격리(git worktree)와 내부 POSIX 셸 도구**에 Git을 쓰기 때문이며 CareerMate와는 무관합니다. macOS는 Git 기본 포함이라 불필요.
46
+
47
+ ---
48
+
49
+ ## 작업 폴더 안에 설치 (권장 — GUI 앱·샌드박스 친화)
50
+
51
+ Claude "Code" 탭이나 Codex처럼 **작업 폴더(cwd)를 잡고** 쓰는 경우, 설치물과 데이터를 그 폴더 **안에** 두면 (1) 폴더만 백업·이동하면 데이터가 따라오고 (2) 샌드박스가 cwd 하위 쓰기를 허용해 마찰이 줄어듭니다. `<WS>`를 작업 폴더 절대경로라 할 때:
52
+
53
+ ```bash
54
+ npm install --prefix "<WS>/.cm/app" careermate
55
+ ```
56
+ 데이터는 `CAREERMATE_DATA_DIR` 환경변수로 작업 폴더 안에 고정합니다(기본값 `~/.careermate` 대신). 아래 MCP 등록의 `env`에 넣으면 됩니다:
57
+ ```
58
+ CAREERMATE_DATA_DIR = <WS>/.cm/data
59
+ ```
60
+ - `<BIN>` = `<WS>/.cm/app/node_modules/careermate/bin/careermate.mjs` (이 셸이 `--experimental-sqlite`를 알아서 붙임).
61
+ - 데이터 폴더 이름을 `.git`·`.codex`·`.agents`로 두지 마세요(VCS 메타데이터·AI 도구 설정 폴더와 이름이 충돌합니다 — 앱이 따로 막아 주는 건 아니니 이름을 직접 피하세요).
62
+ - **포터블 Node(고급):** 시스템에 Node 22.5+가 없으면, 작업 폴더 안에 포터블 Node를 두고 `command`를 그 `node` 절대경로로 가리켜도 동작합니다. 단 다운로드 용량·OS 보안 경고·폴더 이동 시 경로 갱신 부담이 있어, 지금은 "시스템 Node 1회 설치"가 더 단순합니다.
63
+
64
+ ---
65
+
66
+ ## 클라이언트별 수동 MCP 설정 (방식 2의 수동판)
67
+
68
+ 대부분 `npx -y careermate init`(또는 소스에서 `npm run init`)이 자동 등록하므로 **수동 설정은 보통 불필요**합니다. 직접 붙여넣어야 할 때만 참고하세요. `npm run init -- --print`로 아래 스니펫을 출력할 수도 있습니다.
69
+
70
+ **경로 규칙** — 아래 `<BIN>`은 **실제 절대경로**로 바꾸세요(`~`·`$HOME`은 설정 파일 안에서 확장 안 됨).
71
+ - **Windows**: JSON에서 역슬래시는 `\\`로 두 번(`C:\\...\\careermate.mjs`). TOML은 **작은따옴표 리터럴**(`'C:\...\careermate.mjs'`)을 쓰면 한 번만.
72
+ - **macOS/Linux**: `/` 그대로.
73
+
74
+ ### Claude Desktop (채팅앱 수동)
75
+ 설정 파일: Windows `%APPDATA%\Claude\claude_desktop_config.json` · macOS `~/Library/Application Support/Claude/claude_desktop_config.json` (Settings → Developer → Edit Config로도 열림)
76
+ ```json
77
+ { "mcpServers": { "careermate": { "command": "node", "args": ["<BIN>", "mcp"] } } }
78
+ ```
79
+
80
+ ### Claude Code (프로젝트 `.mcp.json`, 작업 폴더 최상단)
81
+ ```json
82
+ { "mcpServers": { "careermate": { "type": "stdio", "command": "node", "args": ["<BIN>", "mcp"], "env": { "CAREERMATE_DATA_DIR": "<WS>/.cm/data" } } } }
83
+ ```
84
+ 또는 CLI: `claude mcp add --scope project --transport stdio careermate -- node <BIN> mcp` · 첫 실행 시 **1회 승인**.
85
+
86
+ ### Codex CLI (`~/.codex/config.toml`)
87
+ ```toml
88
+ [mcp_servers.careermate]
89
+ command = "node"
90
+ args = ["<BIN>", "mcp"]
91
+ # 작업 폴더 안에 데이터: env = { CAREERMATE_DATA_DIR = "<WS>/.cm/data" }
92
+ ```
93
+ 또는 CLI: `codex mcp add careermate -- node <BIN> mcp` · 등록 후 `/mcp`로 확인.
94
+
95
+ ### Cursor / Cline / Windsurf
96
+ `~/.cursor/mcp.json`(전역) 또는 `.cursor/mcp.json`(프로젝트) 등에 위 Claude Code와 같은 `mcpServers` 블록. 추가 후 클라이언트 재시작.
97
+
98
+ > **소스를 클론한 개발자**는 `<BIN>` 대신 TS 소스를 직접 가리킬 수 있습니다(빌드 불필요):
99
+ > `node --no-warnings --experimental-sqlite --import tsx <careermate>/apps/mcp/src/index.ts mcp`
100
+
101
+ ---
102
+
103
+ ## 알려진 제약 · 트러블슈팅
104
+
105
+ - **Codex 데스크톱 앱(⚠️ CLI 권장):** [#24718](https://github.com/openai/codex/issues/24718)(OPEN) 시작 시 전역 `config.toml`을 재작성해 등록이 사라질 수 있음 + [#13025](https://github.com/openai/codex/issues/13025)(OPEN) 프로젝트 `.codex/config.toml` 무시. 그래서 **데스크톱 앱은 비권장, CLI를 쓰세요.** 설치 단계 `npm install`은 기본 샌드박스에서 네트워크가 꺼져 있어 **1회 허용**(또는 `[sandbox_workspace_write] network_access = true`)이 필요. (단 **MCP 서버 자체는 샌드박스 밖에서 돌아** 연결 후 데이터 읽기/쓰기는 막히지 않습니다.)
106
+ - **Claude Desktop에서 등록이 사라짐:** 팀/클라우드 동기화가 로컬 MCP를 덮어쓴 이슈([#59368](https://github.com/anthropics/claude-code/issues/59368), 수정됨). 동기화를 끄거나 **CLI + 프로젝트 `.mcp.json`** 사용.
107
+ - **연결 검증:** `get_onboarding_status` 호출(Codex는 `/mcp`). 빠른 점검: `npx -y careermate doctor`(Node·데이터 폴더·DB 상태).
108
+ - **자세한 복구**(포트 충돌·DB 마이그레이션·완전 초기화): 루트 [`/INSTALL.md`](../INSTALL.md) 9단계.
109
+
110
+ ---
111
+
112
+ 각 모드의 **영구 지침 파일**: Claude Code → [/CLAUDE.md](../CLAUDE.md), Codex → [/AGENTS.md](../AGENTS.md). 사람용 설치 → https://careermate.life · 사용 흐름 → [docs/START_WORKFLOW.md](./START_WORKFLOW.md).
@@ -0,0 +1,202 @@
1
+ # 워크플로우 (Workflows)
2
+
3
+ CareerMate는 내부에 LLM을 두지 않는다. 분석과 작성은 사용자의 AI(ChatGPT/Claude/Gemini)가 수행하고, 그 AI가 CareerMate의 로컬 MCP 도구를 호출해 로컬 커리어 DB를 읽고 쓴다. 이 문서는 **AI가 따라야 하는 표준 작업 절차(워크플로우)** 를 정리한다.
4
+
5
+ 워크플로우 정의는 코드 안에 데이터로 인코딩되어 있으며(`packages/workflows/src/definitions.ts`), 각 단계는 호출할 구체적인 MCP 도구 이름을 직접 참조한다. AI는 `get_workflow_guide` MCP 도구로 이 정의를 그대로 읽어올 수 있다. 본 문서는 그 정의(`WORKFLOWS` 배열)와 일치한다.
6
+
7
+ 관련 문서:
8
+
9
+ - 연결 직후 AI가 따라가는 시작 런북은 [시작 런북](./START_WORKFLOW.md)을 참고한다.
10
+ - 설치·연결 절차는 [설치 런북](../INSTALL.md)(또는 [지원 앱·설치 레퍼런스](./SUPPORTED_AI_APPS.md))을 참고한다.
11
+ - MCP 도구 31종의 입출력 명세는 코드(`packages/mcp-tools/src/tools.ts`)에 정의되어 있으며, AI는 각 도구의 `inputSchema`로 직접 확인할 수 있다.
12
+
13
+ ## 워크플로우 5종 개요
14
+
15
+ | id | 제목 | 핵심 목적 |
16
+ | --- | --- | --- |
17
+ | `onboarding` | 온보딩 (첫 셋업) | 프로필·이력서·자기소개서를 등록하고 대시보드를 연다. |
18
+ | `analyze_job` | 공고 분석 (적합도 분석) | 공고를 읽어 프로필과 비교하고, 공고·적합도 분석을 저장한 뒤 자기소개서 작성을 제안한다. |
19
+ | `write_cover_letter` | 자기소개서 작성 | 특정 공고에 맞춘 자기소개서를 사용자 확인을 거쳐 작성·버전 저장한다. |
20
+ | `manage_application_status` | 지원 상태 관리 | 지원 진행 상황(8단계)을 업데이트하고 다음 행동을 제안한다. |
21
+ | `prepare_interview` | 면접 준비 | 서류 합격 이후 예상 질문·STAR 답변·1분 자기소개를 준비·저장한다. |
22
+
23
+ ## 공통 원칙
24
+
25
+ - **추측 금지**: 저장된 실제 경험·성과만 사용한다. 없는 경험을 지어내지 않으며, 빈칸이나 확인이 필요한 부분은 표시해 사용자에게 묻는다.
26
+ - **사용자 확인 우선**: 큰 작업(자기소개서 작성 등)을 진행하기 전에 대상·강조점·톤·분량을 확인한다.
27
+ - **쉬운 한국어 전달**: 분석·결과를 사용자에게 설명할 때는 기술 용어를 빼고 쉬운 한국어로 전달한다.
28
+ - **로컬 전용**: 모든 데이터는 로컬에만 저장된다.
29
+
30
+ ---
31
+
32
+ ## 1. onboarding — 온보딩 (첫 셋업)
33
+
34
+ 사용자가 처음 연결했을 때 프로필·이력서·자기소개서를 등록하고 대시보드를 여는 흐름.
35
+
36
+ **트리거:** 사용자가 처음 CareerMate에 연결했거나, "시작하자 / 셋업해줘 / 프로필 등록"이라고 요청할 때.
37
+
38
+ **단계:**
39
+
40
+ 1. `get_onboarding_status`를 호출해 현재 등록 상태(`has_profile`, `has_resume`, `has_cover_letter`, `has_experience`, `has_skills`, `profile_completeness`, `next_steps`)를 확인한다.
41
+ 2. 비어 있는 항목을 사용자에게 쉬운 한국어로 안내하고, 이력서/자기소개서 파일 업로드 또는 정보 입력을 요청한다.
42
+ 3. 수집한 정보를 구조화해 `save_profile`로 저장한다(이름·연락처·`headline`·`summary`·`desired_roles`·`desired_conditions`, 그리고 글쓰기 선호인 `preferred_tone`과 `emphasis_points` 포함). 파일 출처는 `source=upload`, 직접 입력은 `manual`.
43
+ 4. 업로드한 이력서/경력기술서/포트폴리오 본문을 `add_resume`로 저장한다(`kind`·`title` 지정, 대표 문서는 `is_primary=true`).
44
+ 5. 경력·프로젝트·스킬이 파악되면 `add_experience`·`add_project`·`add_skill`로 각각 저장한다(완성도의 `has_experience`/`has_skills`에 반영).
45
+ 6. 기존 자기소개서가 있으면 `save_cover_letter_version`으로 저장한다(`title`+`content`면 v1로 저장, 없으면 나중에 작성 가능함을 안내).
46
+ 7. `open_dashboard`를 호출해 사용자가 자기 데이터를 확인하게 한다.
47
+ 8. 다시 `get_onboarding_status`로 완성도를 확인하고, 다음 단계(공고 분석 등)를 제안한다.
48
+
49
+ **도구 호출 순서 요약:**
50
+
51
+ ```
52
+ get_onboarding_status
53
+ → save_profile
54
+ → add_resume
55
+ → add_experience / add_project / add_skill (있으면)
56
+ → save_cover_letter_version (기존 자소서가 있으면)
57
+ → open_dashboard
58
+ → get_onboarding_status (재확인)
59
+ ```
60
+
61
+ ---
62
+
63
+ ## 2. analyze_job — 공고 분석 (적합도 분석)
64
+
65
+ 채용 공고를 읽어 사용자 프로필과 비교하고, 공고와 적합도 분석을 저장한 뒤 자기소개서 작성을 제안하는 **핵심 흐름**이다.
66
+
67
+ **트리거:** 사용자가 채용 공고 링크나 본문을 붙여넣거나 "이 공고 분석해줘 / 나랑 잘 맞아?"라고 물을 때.
68
+
69
+ **단계:**
70
+
71
+ 1. **공고 읽기** — 공고 원문(붙여넣은 텍스트 또는 링크 내용)을 읽고 `company`, `position`, `requirements`, `keywords`, `deadline` 등 핵심 정보를 정리한다.
72
+ 2. **컨텍스트 수집** — `get_application_context`를 호출해 한 번에 프로필·대표 이력서·경력·프로젝트·스킬·기존 자기소개서·최근 지원 현황·이전 적합도 분석·같은 회사/직무 관련 기록·글쓰기 선호(`preferred_tone`, `emphasis_points`)를 가져온다. (분석 대상 공고가 이미 저장돼 있으면 `job_id`도 함께 전달한다.)
73
+ 3. **비교/분석** — 공고 요구사항과 사용자 경력/스킬/프로젝트를 비교한다. 일치하는 강점(`strengths`)과 부족한 부분(`gaps`), 매칭 키워드(`matched_keywords`)와 누락 키워드(`missing_keywords`)를 도출하고, 종합 적합도 점수(`score` 0~100)와 요약(`summary`), 지원 전략 제안(`recommendations`)을 정리한다. **없는 경험을 지어내지 않는다.**
74
+ 4. **공고 저장** — 아직 저장되지 않은 공고라면 `save_job_posting`으로 공고를 저장하고 `job_id`를 확보한다.
75
+ 5. **분석 저장** — 도출한 분석 결과를 `save_fit_analysis`로 저장한다(`job_id`, `score`, `summary`, `strengths`, `gaps`, `matched_keywords`, `missing_keywords`, `recommendations`).
76
+ 6. **사용자 설명** — 분석 결과를 사용자에게 쉬운 한국어로 설명한다(잘 맞는 점, 보완할 점, 추천 전략). 기술 용어는 빼고 전달한다.
77
+ 7. **자소서 제안** — "이 공고에 맞춘 자기소개서를 써드릴까요?"라고 자기소개서 작성을 제안한다.
78
+ 8. **동의 시 자소서 저장** — 사용자가 동의하면 적합도 분석과 글쓰기 선호를 반영해 자기소개서를 작성하고 `save_cover_letter_version`으로 저장한다(`job_id` 연결, `note`에 작성 의도 요약).
79
+ 9. **지원 건 열기** — `open_application`으로 해당 지원 건을 열어 사용자가 결과를 확인하게 하고, 지원 상태 변경(예: 지원 예정/지원 완료)을 제안한다.
80
+
81
+ **도구 호출 순서 요약(정식 흐름):**
82
+
83
+ ```
84
+ (공고 원문 읽기)
85
+ → get_application_context # job_id 있으면 함께 전달
86
+ → (비교/분석: strengths·gaps·키워드·score·summary·recommendations)
87
+ → save_job_posting # 미저장 공고일 때만, job_id 확보
88
+ → save_fit_analysis # job_id 연결
89
+ → (사용자에게 쉬운 한국어로 설명)
90
+ → (자기소개서 작성 제안)
91
+ → save_cover_letter_version # 사용자 동의 시에만, job_id·note
92
+ → open_application # 결과 확인 + 상태 변경 제안
93
+ ```
94
+
95
+ > 핵심 도구는 `get_application_context`이다. 프로필·이력서·경력·프로젝트·스킬·기존 자소서·지원 현황·이전 분석·관련 기록·글쓰기 선호를 한 번에 가져오므로, 분석/작성에 필요한 데이터를 여러 번 나눠 조회할 필요가 없다.
96
+
97
+ ---
98
+
99
+ ## 3. write_cover_letter — 자기소개서 작성
100
+
101
+ 특정 공고에 맞춘 자기소개서를 사용자 확인을 거쳐 작성하고 버전으로 저장하는 흐름.
102
+
103
+ **트리거:** 사용자가 "자기소개서 써줘 / 이 공고용 자소서 만들어줘"라고 요청하거나, 공고 분석 후 작성 제안에 동의했을 때.
104
+
105
+ **단계:**
106
+
107
+ 1. `get_application_context`(가능하면 `job_id` 포함)를 호출해 프로필·경력·프로젝트·스킬·기존 자기소개서·이전 적합도 분석·글쓰기 선호(`preferred_tone`, `emphasis_points`)를 가져온다.
108
+ 2. 작성 전에 대상 공고, 강조할 포인트, 톤, 분량을 사용자에게 확인한다(확인 없이 큰 작업을 진행하지 않는다).
109
+ 3. 저장된 실제 경험·성과만으로 자기소개서를 작성한다. 빈칸이나 확인이 필요한 부분은 추측하지 말고 표시해 사용자에게 묻는다.
110
+ 4. 완성본을 `save_cover_letter_version`으로 저장한다(기존 자기소개서면 `cover_letter_id`, 새로 만들면 `title`, 공고용이면 `job_id`, 변경 요약은 `note`, `source=ai`).
111
+ 5. 사용자가 원하면 `export_cover_letter`로 파일로 내보내고, 추가 수정 요청이 있으면 새 버전으로 다시 저장한다.
112
+ 6. 저장 결과를 쉬운 한국어로 알리고, 지원 상태 업데이트(`update_application_status`)나 면접 준비 등 다음 단계를 제안한다.
113
+
114
+ **도구 호출 순서 요약:**
115
+
116
+ ```
117
+ get_application_context # job_id 있으면 함께 전달
118
+ → (대상·강조점·톤·분량 확인)
119
+ → save_cover_letter_version # cover_letter_id 또는 title, job_id, note, source=ai
120
+ → export_cover_letter (선택)
121
+ → (다음 단계 제안: update_application_status 등)
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 4. manage_application_status — 지원 상태 관리
127
+
128
+ 지원 진행 상황(8단계)을 업데이트하고 상태에 맞는 다음 행동을 제안하는 흐름.
129
+
130
+ **트리거:** 사용자가 "지원했어 / 서류 합격했어 / 면접 잡혔어 / 떨어졌어"처럼 진행 상황을 알리거나 상태 변경을 요청할 때.
131
+
132
+ **단계:**
133
+
134
+ 1. 필요하면 `get_application_context` 또는 `get_job_posting`으로 대상 지원 건과 공고를 확인한다.
135
+ 2. 적절한 상태로 `update_application_status`를 호출한다. 8단계: `draft`(작성 중), `planned`(지원 예정), `applied`(지원 완료), `document_passed`(서류 합격), `interview`(면접 진행), `final_passed`(최종 합격), `rejected`(불합격), `on_hold`(보류). 변경 사유는 `note`에 남긴다.
136
+ 3. 변경 결과를 사용자에게 쉬운 한국어로 알린다.
137
+ 4. 상태에 맞는 다음 단계를 제안한다:
138
+ - `applied` → 결과 기다리기 안내
139
+ - `document_passed` / `interview` → 면접 준비(`prepare_interview`) 제안
140
+ - `final_passed` → 축하 및 마무리
141
+ - `rejected` / `on_hold` → 회고 또는 다른 공고 탐색 제안
142
+ 5. 필요하면 `open_application`으로 해당 지원 건을 열어 보여준다.
143
+
144
+ **상태 전이 참고:** `document_passed` 이상에서 면접 준비가 해금된다. 8단계 상태값은 코드(`update_application_status`의 `inputSchema`)에 정의되어 있다.
145
+
146
+ **도구 호출 순서 요약:**
147
+
148
+ ```
149
+ get_application_context | get_job_posting (필요 시)
150
+ → update_application_status # 8단계 중 하나, note에 사유
151
+ → (상태별 다음 단계 제안)
152
+ → open_application (선택)
153
+ ```
154
+
155
+ ---
156
+
157
+ ## 5. prepare_interview — 면접 준비
158
+
159
+ 서류 합격 이후 예상 질문·STAR 답변·1분 자기소개를 준비해 저장하는 흐름.
160
+
161
+ **트리거:** 지원 상태가 서류 합격(`document_passed`) 또는 면접 진행(`interview`)으로 바뀌었을 때, 또는 사용자가 "면접 준비 도와줘"라고 요청할 때.
162
+
163
+ **단계:**
164
+
165
+ 1. `get_application_context`(`job_id` 포함)를 호출해 공고, 프로필, 경력/프로젝트, 적합도 분석(강점·갭), 자기소개서를 가져온다.
166
+ 2. 공고와 사용자 경험을 바탕으로 예상 면접 질문(`question`, `intent`, `followups`, `answer_outline`)을 도출한다.
167
+ 3. 핵심 경험에 대한 STAR 가이드(`question`, `situation`, `task`, `action`, `result`)와 1분 자기소개(`self_introduction`) 초안을 작성한다. **실제 경험만 사용한다.**
168
+ 4. 준비 내용을 `save_interview_prep`로 저장한다(`job_id`, `questions`, `star_guides`, `self_introduction`, `notes`).
169
+ 5. 준비 내용을 사용자에게 쉬운 한국어로 요약해 전달하고, 모의 면접/추가 질문 연습이나 상태 업데이트(`update_application_status`로 `interview`/`final_passed`)를 제안한다.
170
+
171
+ **도구 호출 순서 요약:**
172
+
173
+ ```
174
+ get_application_context # job_id 포함
175
+ → (예상 질문 도출: question·intent·followups·answer_outline)
176
+ → (STAR 가이드 + 1분 자기소개 초안)
177
+ → save_interview_prep # job_id, questions, star_guides, self_introduction, notes
178
+ → (요약 전달 + 모의 면접/상태 업데이트 제안)
179
+ ```
180
+
181
+ ---
182
+
183
+ ## 워크플로우 간 연결
184
+
185
+ 워크플로우는 독립적이지 않고 자연스럽게 이어진다.
186
+
187
+ ```
188
+ onboarding
189
+ → analyze_job ──(자소서 제안 동의)──→ write_cover_letter
190
+ │
191
+ └─→ manage_application_status ──(document_passed 이상)──→ prepare_interview
192
+ ```
193
+
194
+ - `analyze_job`의 마지막 단계는 자기소개서 작성 제안으로 이어지며, 동의 시 `write_cover_letter`의 작업(=`save_cover_letter_version`)을 수행한다.
195
+ - `manage_application_status`에서 상태가 `document_passed`/`interview`가 되면 `prepare_interview`를 제안한다.
196
+ - 모든 흐름에서 데이터 조회의 중심은 `get_application_context`이며, 작성/분석에 필요한 컨텍스트를 한 번에 제공한다.
197
+
198
+ ## 코드와의 대응
199
+
200
+ - 워크플로우 정의: `packages/workflows/src/definitions.ts` (`WORKFLOWS: WorkflowDefinition[]`)
201
+ - 조회/렌더 헬퍼: `packages/workflows/src/index.ts` (`getWorkflow(id)`, `renderWorkflowMarkdown(id)`)
202
+ - AI는 `get_workflow_guide` MCP 도구로 위 정의를 마크다운으로 렌더링해 인라인으로 읽을 수 있다.
@@ -0,0 +1,78 @@
1
+ # Career-OS — 외부 LLM 실행 진입점 (단일 입구)
2
+
3
+ > ✅ **상태(2026-06): 이 라우팅·EOP 적용은 이제 런타임에 배선되어 있다(Phase B-1).** 연결된 AI는 `get_workflow_guide`로 작업별 실행 절차(EOP)와 적용할 플레이북·검증기 순서를 받고, `get_playbook`/`get_verifier`로 이 폴더의 지식을 실제로 받아 적용한다. `get_application_context`도 `recommended_route`·`verifier_sequence`·`next_tool`를 함께 돌려준다. 아직 구현하지 않은 범위(B-2: det 점수 계산·저장 게이트·마이그레이션)와 패키지 구조는 [`implementation/README.md`](https://github.com/osntak/careermate/blob/main/docs/career-os/implementation/README.md) 참고.
4
+
5
+ > **여기서 시작하라.** CareerMate는 수동적 지식이 아니라, 외부 AI가 사용자 대면 결과를 내기 전에 적용해야 하는
6
+ > **실행형 플레이북(EOP)·검증 루브릭·라우팅·출력 계약**을 제공한다. 두뇌=외부 AI(당신), CareerMate=실행 기질(substrate). 내부 LLM 없음.
7
+ >
8
+ > **구조:** `README.md`(이 파일 = 단일 입구) → `eop/<기능>.md`(실행 절차) → `knowledge/`(정본 깊은 지식).
9
+ > 보조(런타임 아님): `validation/`(리서치 출처 + 다중 LLM(cross-vendor) 검증 하니스) · `implementation/`(CareerMate 개발자용 Phase B 내부 설계).
10
+ >
11
+ > EOP(Expert Operating Procedure) = 한 기능을 *시니어 전문가처럼* 수행하는 실행 절차. 검증된 리서치(`validation/research/`)에 근거하고
12
+ > [`validation/PROTOCOL.md`](https://github.com/osntak/careermate/blob/main/docs/career-os/validation/PROTOCOL.md)의 다중 LLM(cross-vendor) 교차검증으로 단단해진다.
13
+
14
+ ## 0. 절대 원칙 — 근거 우선순위
15
+ ```
16
+ 현실 > 검증된 증거(저장 사용자 데이터·공식 자료) > 신뢰할 리서치 > CareerMate 플레이북/EOP > 프롬프트 지시 > 모델 직관
17
+ ```
18
+ EOP·이 문서를 맹신하지 말 것. **저장된 사용자 데이터나 공식 자료가 EOP와 충돌하면 사실을 우선**하고 사용자에게 확인한다. 사실·수치·고유명사는 절대 발명하지 않는다.
19
+
20
+ **사실 3분류 (모든 생성·분석에 적용 — 가장 흔한 실패):**
21
+ 1. **내가 한 일·내 수치** → 저장 데이터에 앵커되어야 한다. 없으면 쓰지 않는다.
22
+ 2. **일반 도메인 지식**(개념·방법론·베스트프랙티스) → 활용해도 되나 '내가 한 일'처럼 말하지 말고 **'개념 설명' 또는 '입사 후 제안'으로 명시 분리**한다.
23
+ 3. **출처 밖 구체 수치/맥락**(통계·신뢰구간·측정 환경·내부 지표·상황 묘사) → **발명 금지**. 그럴듯해도 면접·검증에서 무너진다.
24
+
25
+ 미확인 항목은 산출물 본문이 아니라 **별도 '확인 필요' 메모**로 분리한다.
26
+
27
+ ## 1. 사용자 요청 분류 → EOP 라우팅
28
+ 요청 의도를 분류하고 해당 EOP를 연다(복합 요청은 순서대로 체이닝):
29
+
30
+ | 사용자가 이렇게 말하면 | 주 EOP | 보조 |
31
+ |---|---|---|
32
+ | "이 공고 적합도/나랑 맞아?/지원할 만해?" | [fit-analysis](eop/fit-analysis.md) | job-analysis, profile-extraction |
33
+ | "이 공고 분석/뜯어줘", "무슨 회사·직무·레벨이야" | [job-analysis](eop/job-analysis.md) | — |
34
+ | "이력서/경력 정리·입력", "기본정보 채워" | [profile-extraction](eop/profile-extraction.md) | — |
35
+ | "자소서/자기소개서/지원동기/커버레터 써줘·고쳐줘" | [cover-letter](eop/cover-letter.md) | company-research, human-writing, fit-analysis |
36
+ | "면접 준비/예상질문/모의면접" | [interview-prep](eop/interview-prep.md) | company-research, fit-analysis |
37
+ | résumé·ATS·linkedin·portfolio·salary·offer·rejection·onboarding | `knowledge/` 플레이북 | — |
38
+
39
+ 요청이 모호하면 분류를 추측하지 말고 사용자에게 한 가지만 되묻는다.
40
+ **도구가 라우트를 실어 주면 신뢰하라:** `get_application_context` 응답에 `recommended_route`·`verifier_sequence`·`next_tool`가 실려 오면 그 라우트를 우선 신뢰해 EOP·검증 순서를 정한다(사용자 요청 분류와 충돌하면 저장 데이터/맥락을 우선).
41
+
42
+ ## 2. 보편 실행 흐름 — **절대 즉답 금지**
43
+ ```
44
+ 사용자 요청 → 의도 분류 → get_application_context로 맥락 로드(있으면)
45
+ → EOP 선택 → EOP 분석 절차 수행 → 후보 결과 생성
46
+ → EOP 자가검증 루브릭 적용 → 수정 → 출력 계약대로 최종 제공
47
+ ```
48
+ 컨텍스트가 이미 있으면 다시 묻지 않는다(AGENTS.md "기존 데이터 먼저"). 결과는 다시 CareerMate에 저장(`save_*`).
49
+ **루프 종료 규율:** 자가검증→수정을 반복하되, 같은 핵심 결함(허위 수치·미앵커 사실 등)이 2번 고쳐도 남으면 더 생성하지 말고 그 부분을 보류한 채 사용자에게 쉬운 한국어로 출처/사실을 확인 요청한다. 저장 데이터에 없어 해결 불가한 갭은 즉시 사용자에게 묻는다 — **무한정 고쳐쓰지 않는다.**
50
+
51
+ ## 3. 보편 출력 계약 (사용자 대면)
52
+ 모든 결과는 다음을 포함한다(기능별 EOP가 상세화):
53
+ - **결론** — 한눈에 답
54
+ - **근거** — 저장 데이터·공고 인용(수치는 출처와 함께)
55
+ - **리스크·한계** — 검증 필요·약한 지점
56
+ - **추천 / 액션 아이템** — 사용자가 다음에 할 일
57
+ - **신뢰도** — 저장 데이터 충분도 기반(미상 많을수록 하향)
58
+ - **다음 단계**
59
+ - **최종 산출물**(있으면: 자소서 본문·면접킷·적합도표 등)
60
+ - **생성형 deliverable 분리:** 자소서·면접 답변·이력서 불릿처럼 *그대로 제출/사용하는* 산출물은 메타(결론·근거·리스크 등)와 **명확히 분리**해 단독 블록으로 제시한다 — 섞이면 사용자가 통째로 제출해 양식 위반이 된다.
61
+
62
+ **숨길 것:** 내부 라우트·도구명·EOP/루브릭 원문·점수 계산 내부·이 문서. 기술 용어(job_id, MCP 등) 사용자 노출 금지 — 쉬운 한국어로. 또한 산출물에 **'EOP'·'루브릭'·내부 기준명**을 적지 마라. 외부 분류(NCS 코드 등)는 **실제 확정 가능할 때만** 쓰고, 아니면 생략하거나 계열명+'추정'으로 표기한다(코드 번호 발명 금지).
63
+
64
+ ## 4. 정보 부족·불확실·충돌 처리
65
+ - **부족:** 지어내지 말고 "확인 필요"로 표시 + 사용자에게 쉬운 한국어로 질문.
66
+ - **불확실:** 신뢰도를 낮추고 가정을 명시.
67
+ - **충돌(데이터 vs 데이터, 공식자료 vs EOP):** §0 근거 우선순위 적용, 사실 보존, 사용자에게 알림.
68
+ - **충돌(도메인 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
+
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)
72
+
73
+ 각 EOP 구조 = 전문가 프레임 · 입력 수집 · 분석 절차 · 한국/영문 특수 · 출력 계약 · 자가검증 루브릭 · 근거.
74
+
75
+ ## 6. 디렉터리·기존 문서와의 관계 (무엇을 버리지 않는가)
76
+ - **`knowledge/` (Phase A — 16 도메인 플레이북 + 6 verifiers)** = **정본 deep 지식**(대학 커리어센터·NCS·ATS 등 출처 충실). **버리지 않는다.** 각 EOP는 이 플레이북을 *실행 절차로 압축*하고 상단 "지식 출처"로 가리킨다 — EOP=얇은 실행층, knowledge=깊은 지식층. 함께 적용한다.
77
+ - **`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/`).
@@ -0,0 +1,46 @@
1
+ # EOP — 자기소개서 / Cover Letter
2
+
3
+ > 외부 LLM 실행 지침. 이 절차를 따르면 평범한 LLM 글이 아니라 **대기업 인사·자소서 첨삭 전문가** 기준을 통과하는 글이 나온다.
4
+ > **지식 출처(deep reference, 먼저 읽어라):** [`../knowledge/cover-letter.md`](../knowledge/cover-letter.md)(원칙·Do/Don't·Before→After·R1~R12 루브릭) · [`../knowledge/human-writing.md`](../knowledge/human-writing.md) · [`../knowledge/company-research.md`](../knowledge/company-research.md) · 검증기 [`../knowledge/verifiers/human-voice.md`](../knowledge/verifiers/human-voice.md)·[`truthfulness.md`](../knowledge/verifiers/truthfulness.md). 이 EOP는 그 플레이북을 *실행 절차*로 압축한 얇은 층이다 — 작성 시 해당 knowledge 문서를 함께 적용한다.
5
+ > 근거(보강 리서치): [`../validation/research/cover-letter.md`](../validation/research/cover-letter.md). 검증 대상(PROTOCOL L2). 먼저 [README](../README.md) §0·§3 적용.
6
+
7
+ ## 0. 전문가 프레임
8
+ - 자소서 = **특정 회사·직무를 겨냥한 설득 문서**(이력서 산문화 아님). 리크루터가 수십~수백 편을 스캔 → 첫 문장에 핵심이 꽂혀야 한다.
9
+ - 합격 패턴: **두괄식 · 항목별 소제목 · STAR-lite(A~60%) · 활동이 아닌 델타 정량화 · 회사 고유성 · 인재상/직무 키워드 매핑.**
10
+ - **각 문항엔 숨은 평가 의도** — 문자 그대로가 아니라 의도에 답한다(아래 §2-2).
11
+ - 한국은 **AI 텍스트 탐지(GPT킬러·무하유)가 실재하는 게이팅 레이어** → 구체·고유·다양한 문장을 쓰고 슬롭 어휘를 금지하면 품질과 탐지 회피를 동시에 충족한다.
12
+ - 사실·수치·고유명사는 저장 데이터에 앵커. **없는 수치를 발명하지 마라**(면접에서 즉시 무너진다). 근거 없으면 약한 주장을 빼되 숫자를 지어내지 않는다.
13
+
14
+ ## 1. 입력 수집
15
+ `get_application_context` → profile·대표 resume·경력/프로젝트·대상 job·기존 자소서·선호 문체. 사용자가 파일을 주면 `read_document`. 부족하면 사용자 확인.
16
+ 판정: **로케일**(ko 문항형 vs en 단일 레터), **문항 유형**(지원동기/성장과정/직무역량/입사후포부/약점·갈등), **글자수 상·하한과 count_mode**(공백포함/제외/byte — 실제 지원 필드로 검증; 미지정 시 공백포함 기본).
17
+
18
+ ## 2. 분석·작성 절차
19
+ 1. **회사 리서치**(company-research): 미션·사업·제품·최근 활동·인재상 → 본인과 연결할 고유 포인트 확보.
20
+ 2. **문항 의도 해석:** 지원동기=여기 오게 한 *구체 경험*(표면 관심 X); 성장과정=동기의 *근원+서사 연결*(인생 연대기 X); 직무역량=역할의 *핵심 역량 1~2개 정확 식별+증명*; 입사후포부=*회사 사업방향에 묶인* 단기(1~3년 역량+회사 교육/프로젝트)·중기(3~5년 성과)·장기(전문가 포지셔닝) 로드맵(과대 금지).
21
+ 3. **본인 증거 매핑:** 저장 경력/프로젝트에서 문항·역량을 증명할 경험 **1~2개를 깊게** 선택(얕게 5~6개 나열 금지).
22
+ 4. **초안 작성:** 항목별 **소제목** + **두괄식**(핵심 결론 먼저) → **STAR-lite**(S/T 짧게, A에 무게, R=전후 델타 정량) → **직무/인재상 명시 연결**. 회사 고유 근거 1~3문장("회사명 placeholder로 바꾸면 어색"이어야 함). 글자수 **상한의 ~70%+를 채우되**, 입사후포부는 앞 문단과 **다른 새 기여**로(같은 성과·표현 반복 금지).
23
+ - **STAR 앵커 우선(사실 변경 금지·표현 강화 허용):** Action/Result는 저장된 '한 일'(도입·적용·운영·분석한 것)과 저장된 결과에 앵커한다. 저장된 행위·맥락은 풍부하게 서술해도 좋다(평가자가 중시하는 경험 서술형 환영). **금지는 발명뿐** — 저장 근거가 없는 진단 결과·방법/도구·원인 규명·실패율·문서화·후속 성과를 새로 지어내지 마라. 저장에 없는 과정을 꼭 암시해야 하면 "기록/근거로 범위를 좁혔다" 수준의 중립 한 구절까지만. <!-- consensus: claude opus/sonnet/haiku 만장일치(haiku 반대→해소). codex cross-vendor 재확인 미완(사용량 소진) — 2-vendor 게이트 미충족 항목, R5·R6 clean에 간접 반영. 2026-06-18 -->
24
+ - **프레이밍 경계(작성·평가 공통):** 일반 도메인 원리는 *후보 귀속 없이* 맥락으로 OK. 비즈니스 임팩트·문제 프레이밍은 *저장된 성과/지표가 암시하는 범위 안*에서만. **(아래 예시는 IT 직군 하나의 예일 뿐 — 원리는 전 직군 동일: 영업=매출/전환 기록, 운영·생산=처리량/불량률 기록, 마케팅=유입/전환 기록 등.)** 예: p99 개선 기록 → "느린 구간을 좁혀" OK / 기록 없는 "결제 경험을 해치던" 단정 금지. 사고·이유 귀속은 *저장된 결정·행동이 논리적으로 함의할 때만*(예: "Kafka 보류 결정" 저장 → "복잡도 대비 효과가 적어 보류" OK / "새 기술보다 ~가 낫다고 봤다"식 새 판단 삽입 금지). **금지:** 후보가 측정·관찰·확인했다는 행위, 출처에 없는 중간 지표(A/B를 "클릭"으로 특정), 진단 결과·원인·감정·의도를 후보의 사실로 단정. <!-- consensus: claude opus/sonnet/haiku 만장일치. codex 재확인 미완(사용량 소진). 2026-06-18 -->
25
+ 5. **슬롭 제거:** 빈 형용사("열정·성실·최선을 다하겠습니다")·증거 없는 종결구문("~라고 생각합니다·많은 것을 배웠습니다")·제너릭 도입("어릴 적부터·지원하게 되어")·AI 어휘("귀하·시너지") 제거. human-writing 가이드(`get_writing_style_guide`) 적용.
26
+ 6. **규칙 점검:** 글자수 상·하한(byte/char) · 지정 양식 · 블라인드(공공: 직무무관 개인정보·학교·지역·가족·사진 금지).
27
+
28
+ ## 3. 한국/영문 분기
29
+ - **KR 문항형:** 문항당 별개 글, 두괄식 + 문항-역량 매핑, 소제목, 글자수 엄수. 성장과정만 가벼운 서사 허용하되 핵심은 여전히 front-load.
30
+ - **EN 단일 레터:** hook → fit(증거) → why-this-company → close, 1페이지(≈250~400단어), 능동태, 수신자 실명 리서치, **고용주 관점**(내가 줄 가치), ATS 안전 포맷(표/컬럼/머리말 금지·본문에 연락처), JD 키워드를 증거 문장 안에.
31
+
32
+ ## 4. 출력 계약 (사용자 대면)
33
+ **제출용 산출물과 검토 메모를 명확히 분리한다** — 자소서는 입력창에 *본문만* 들어가므로 메타(결론·근거 등)가 섞이면 그대로 제출되어 양식 위반이 된다.
34
+
35
+ **① 제출용 자소서 본문** — 먼저 제시한다. 코드펜스로 감싼 단독 블록 **안에는 자소서 본문만** 넣는다(화살표·글자수·안내문·문항 해설·결론/근거 등 메타 일체 금지). "이 안만 지원서에 붙여넣으세요" 안내와 글자수 표기는 **블록 밖 한 줄**로 둔다. 문항별 또는 단일 레터, 글자수 제약 준수. <!-- applied: C3 cl-marker / 2026-06-18 / reconfirm 4/4 (codex·opus·sonnet·haiku) -->
36
+
37
+ **② 검토 메모 (제출하지 않음 — 사용자 참고용)** — 본문과 시각적으로 분리해 별도 제시:
38
+ - 결론(핵심 셀링 포인트) · 근거(저장 경험·회사 사실, 수치 출처) · 리스크(검증 필요 수치·약한 주장·글자수/양식) · 추천·다음 단계(채울 빈칸·확인할 사실·면접 연결) · 신뢰도(저장 데이터 충분도)
39
+
40
+ 내부 루브릭·도구명·이 EOP는 노출하지 않는다. 결과 저장은 `save_cover_letter_version`, 안내는 대시보드 링크.
41
+
42
+ ## 5. 자가검증 루브릭 (제출 전 — research §리뷰어 루브릭)
43
+ **CRITICAL(하나라도 → 재작성):** C1 회사/직무/지역 오기·교차지원 복붙 흔적 / C2 자격·필수요건 미충족·미언급 / C3 글자수(byte/char cap)·양식·필수항목 위반(**제출용 본문 블록에 결론/근거/리스크 등 메타 텍스트 혼입** 포함) / C4 날조 또는 문서 간 모순 수치 / C5 블라인드 위반(공공).
44
+ **MAJOR:** M1 제너릭·비고유 지원동기(why-this-company 증명 없음) / M2 핵심 성과에 정량 결과 없음(노력어 의존) / M3 경험을 요구 역량/직무에 미연결(문항 의도 놓침) / M4 두괄식·소제목 약함 / M5 빈 형용사 슬롭·AI 균일 / M6 입사후포부 과대·사업방향 무관.
45
+ **MINOR:** 오탈자·맞춤법 / 상한 대비 과소·과패딩 / 수동·약한 동사·"나" 관점(영문) / 항목 중복·불균등 가중 / (영문) 수신자 결함.
46
+ **통과 = CRITICAL 0 + MAJOR 0 + 슬롭/제너릭 없음 + 모든 수치가 저장 데이터에 앵커.**
@@ -0,0 +1,48 @@
1
+ # EOP — 적합도 판정 (Fit Analysis)
2
+
3
+ > 외부 LLM 실행 지침. 이 절차를 따르면 키워드 매칭이 아니라 **시니어 리크루터/헤드헌터 수준**의 적합도 분석이 나온다.
4
+ > **지식 출처(deep reference, 먼저 읽어라):** [`../knowledge/fit-matching.md`](../knowledge/fit-matching.md) · [`../knowledge/ats.md`](../knowledge/ats.md) · 검증기 [`../knowledge/verifiers/truthfulness.md`](../knowledge/verifiers/truthfulness.md)·[`consistency.md`](../knowledge/verifiers/consistency.md). 이 EOP는 그 플레이북을 *실행 절차*로 압축한 얇은 층이다 — 분석 시 해당 knowledge 문서의 원칙·루브릭을 함께 적용한다.
5
+ > 근거(보강 리서치): [`../validation/research/fit-analysis.md`](../validation/research/fit-analysis.md). 검증 대상(PROTOCOL L2). 먼저 [README](../README.md) §0 근거 우선순위·§3 출력 계약을 적용.
6
+
7
+ ## 0. 전문가 프레임 (이렇게 생각하라)
8
+ - 적합도는 키워드 매칭이 아니라 **관련 경험의 행동 증거**로 결정된다(SHRM: 스크리닝에서 경험>스킬>학력). 키워드는 보조 증거일 뿐 결론이 아니다.
9
+ - 채점 *전에* **MUST(녹아웃) vs 우대(가점)** 를 분리한다. 진짜 녹아웃 = "없으면 직무 수행/법적 자격이 불가능". 테스트: "그게 없어도 탁월하면 뽑겠다"면 녹아웃 아님. 녹아웃은 ~3–5개로 제한.
10
+ - 녹아웃=이진(충족/미충족/확인필요), 우대=그라데이션 가점이며 **부재해도 감점 아님**.
11
+ - 전이가능 스킬은 **자기주장이 아니라 행동 증거**로만 인정.
12
+ - 과적합(overqualified)은 자동 탈락이 아니라 **리스크+완화질문**으로 표시.
13
+ - 전역 직감 점수 금지 — **요건별로 증거를 인용하고 강도 등급**을 매긴다(구조화 채점이 인상 채점을 이긴다).
14
+ - 높은 키워드 커버리지를 높은 적합으로 등치하지 않는다(>75~80%는 스터핑 신호).
15
+
16
+ ## 1. 입력 수집
17
+ `get_application_context`를 먼저 호출 → profile·대표 resume·경력/스킬·대상 job(requirements/keywords/직무내용). 공고가 파일/URL이면 사용자가 준 경로를 `read_document`로 읽거나 본문을 받는다. 부족한 정보는 지어내지 말고 사용자에게 확인.
18
+
19
+ ## 2. 분석 절차 (순서 고정)
20
+ 1. **JD 원자 분해** → 3버킷: 필수/MUST(녹아웃) · 우대/PREFERRED(가점) · 맥락/CONTEXT(직무·환경, 관련성 판단용). 각 요건은 단일 검증가능 주장.
21
+ 2. **녹아웃 먼저 게이트.** 각 MUST = 충족/미충족/확인필요. 하드 MUST 하나라도 미충족(법적 자격·필수 자격증·진짜 시니어의 "N년 이상") → 나머지와 무관하게 최종 **낮음/FAIL**, 어떤 녹아웃인지 명시. 녹아웃이 확인필요 → 통과 불가, blocking missing-info.
22
+ 3. **요건별 증거 매핑(핵심).** 각 요건 ← 정확한 resume 증거(프로젝트·역할·지표·맥락 내 도구) → 강도: **Strong**(했음+성과/지표) / **Moderate**(인접·전이) / **Weak**(언급, 증거無) / **None**. 키워드만 있고 행동 증거 없으면 **Weak**(매치 아님).
23
+ 4. **가중 채점(평균 아님).** MUST는 게이트. 충족분 중 관련경험 > 맥락 내 하드스킬 > 자격 > 우대 순 가중. 우대는 상방만 더하고 부재는 무감점. 밴드(높음/중간/낮음 또는 0–100)를 추론과 함께 제시.
24
+ 5. **리스크/레드플래그를 점수와 분리.** 과적합·미설명 공백기·짧은 근속·스코프 미스매치(IC가 리드 지원, 리드 증거無)·도메인 미스매치 → **면접 확인 항목**(감점 아님, 진짜 녹아웃 제외).
25
+ 6. **미싱인포 정직 선언.** resume가 침묵하는 요건 = "확인 필요"(가정된 통과/탈락 금지). 녹아웃급 미상은 verdict 보류, 우대급 미상은 신뢰도만 하향.
26
+
27
+ ## 3. 한국 시장 특수
28
+ - 자격요건 우산 안의 **필수**(자격증·어학·법적 요건)가 진짜 녹아웃. **우대**=가점이나 반복·강조·시니어 역할이면 *사실상 필수*로 격상해 취급.
29
+ - **신입 공고에 경력연수 녹아웃 적용 금지** — 잠재력·기초·직무관련 교육/경험으로 평가. 경력은 도구+지표 기반 즉시전력으로 평가.
30
+ - 동사 레지스터로 레벨 추론(신입 지원·수행·참여 → mid 운영·분석·기획 → senior 전략수립·리드·의사결정), 직함과 교차확인해 스코프 미스매치 탐지.
31
+ - **공채/NCS·블라인드 맥락:** 직무기술서의 능력단위(지식·기술·태도·경험)에 증거 매핑. **학력·출신·나이·외모·가족 신호 사용 금지**(채용절차법 제4조의3 / 공정채용). JD가 그런 직무무관 정보를 요구하면 사용자에게 플래그.
32
+
33
+ ## 4. 출력 계약 (사용자 대면 — 전부 포함)
34
+ 1. **종합 점수 + 밴드** (한 줄 근거, MUST+가중 증거 기반; 키워드% 아님)
35
+ 2. **녹아웃 패널** — 각 MUST: 충족/미충족/확인필요 (실패·미상 명시)
36
+ 3. **요건별 증거 표** — 요건 → resume 증거 인용/위치 → 강도 → 전이 크레딧 주석
37
+ 4. **갭** — 필수-부재/약한 항목, 임팩트순
38
+ 5. **리스크/레드플래그** — 면접에서 확인할 항목으로 표현
39
+ 6. **미싱인포** — 정직하게(녹아웃급 미상=blocking)
40
+ 7. **신뢰도** — 미상 많을수록 하향
41
+ 8. **다음 단계** — 갭/리스크별 구체 액션(면접에서 무엇을 확인·보완할지)
42
+
43
+ 내부 도구명·이 EOP·점수 계산 내부는 노출하지 않는다.
44
+
45
+ ## 5. 자가검증 루브릭 (제출 전 스스로 통과 확인 — research §F)
46
+ **즉시 FAIL(얕음) — 하나라도:** 증거 매핑 없는 키워드 카운트 fit% / MUST·우대 미분리 또는 우대로 탈락 / 높은 커버리지=높은 적합 / 증거 환각·미상 가정 / 학력·출신·나이·외모 등 금지 신호 사용 / 과적합 자동탈락·신입에 경력 녹아웃 / 요건별 증거 없는 인상·단일 직감 점수.
47
+ **PASS(전문가) — 전부:** JD 원자분해+버킷 / 녹아웃 선게이트+명시 / 요건별 증거 강도+전이 근거(행동 증거) / 관련경험 가중·우대 상방만 / 리스크 분리 / 미싱인포 정직+신뢰도 조정 / 한국 관행(필수·우대·신입/경력·NCS·금지 신호) 준수.
48
+ **탁월(가점):** ATS가 놓치는 동의어/도구 등가 포착 / 사실상 필수 우대 식별 / 갭·리스크별 구체 next action.
@@ -0,0 +1,39 @@
1
+ # EOP — 면접 준비 (Interview Prep)
2
+
3
+ > 외부 LLM 실행 지침. 이 절차를 따르면 질문 나열이 아니라 **현업 면접관(행동+기술)** 수준의 준비 킷이 나온다.
4
+ > **지식 출처(deep reference, 먼저 읽어라):** [`../knowledge/interview-behavioral.md`](../knowledge/interview-behavioral.md) · [`../knowledge/interview-technical.md`](../knowledge/interview-technical.md) · [`../knowledge/company-research.md`](../knowledge/company-research.md). 이 EOP는 그 플레이북을 *실행 절차*로 압축한 얇은 층이다 — 준비 시 해당 knowledge 문서를 함께 적용한다.
5
+ > 근거(보강 리서치): [`../validation/research/interview-prep.md`](../validation/research/interview-prep.md). 검증 대상(L2). 먼저 [README](../README.md) §0·§3 적용.
6
+
7
+ ## 0. 전문가 프레임
8
+ - **구조화가 카리스마를 이긴다(Google):** 모든 예상질문을 정의된 역량 + 빈약/경계/양호/탁월 기준에 매핑한다.
9
+ - **역량-우선(질문-우선 아님):** 스토리뱅크 → 스토리×역량(×인재상) 매트릭스 → 거기서 질문 생성.
10
+ - 외운 이론보다 **체험·구체+숫자.** 저장 데이터의 실제 증거를 강제하고 사실을 날조하지 않는다.
11
+ - **한국 이중축:** 직무적합 + 조직적합(인재상) + 인성. 실무면접=직무경험, 임원면접=인성+회사이해+인재상.
12
+ - 면접 준비 저장은 **'서류 합격'(document_passed) 이상에서만 해금**(상태 게이팅 존중).
13
+ - **답변 = 내 경험(앵커 필수) + 도메인 지식(개념/제안으로 분리).** '제가 했다'로 말할 수 있는 건 저장 데이터뿐이다. 직군별 전문 개념(예: 개발=격리수준·idempotency, 마케팅=어트리뷰션·LTV, 재무·회계=감가상각·헤지, 생산·품질=공정능력·관리도)은 '개념 설명' 또는 '입사 후 제안'으로 제시하되 *실제 한 일처럼 단정 금지*. **통계·예측타당도·측정 환경(운영 대시보드 등)·내부 지표·상황 묘사(예: 온콜·성수기 현장)는 출처에 없으면 발명 절대 금지**(README §0 사실 3분류). 미확인 항목은 답변 본문이 아니라 '면접 전 확인' 별도 섹션으로.
14
+
15
+ ## 1. 입력 수집
16
+ `get_application_context` → profile·경력·대상 job·기존 면접 자료. 지원 상태 확인(document_passed↑인지). **역할군**(eng/PM/design/data/sales/기타)·**면접 단계**(실무/임원)·**형식**(인성/PT/토론/압박) 판정.
17
+
18
+ ## 2. 분석·작성 절차
19
+ 1. **스토리뱅크:** 갈등·실패·리더십/주도·모호함·무권한 영향·압박하 delivery 등 실제 경험 6~10개를 저장 데이터에서 인벤토리.
20
+ 2. **역량/인재상 매핑:** 각 스토리를 JD 역량 + 회사 인재상에 태깅(매트릭스), flex 변주 준비.
21
+ 3. **예상질문 생성:** P2 분류(직무지식/문제해결/리더십)별 + 한국 형식별. 각 질문에 **루브릭 라인(빈약/경계/양호/탁월)**.
22
+ 4. **답변 골격:** STAR(S/T 짧게, **A 우세·1인칭·본인 기여 명시**, R 정량+교훈), 답변당 ~60~90초.
23
+ 5. **꼬리질문 2~3개 + 준비 답변**(전문가 차별점: "왜 그 방법?/팀 vs 본인?/다시 한다면?/측정 결과?"). — "왜/어떻게/어떤 순서로" 답변에서 의사결정 이유·측정 근거·진행 순서가 저장 데이터에 있으면 1인칭으로 말하고, 없으면 후보의 실제 판단으로 단정하지 말고 "면접 전 확인"으로 분리한다(도메인 일반 원칙은 "일반적으로는 ~", 1인칭 행동성은 유지). <!-- applied: C4 interview-why / 2026-06-18 / reconfirm 4/4 (codex·opus·sonnet·haiku) -->
24
+ 6. **난질문 사전 스크립트:** 실패/약점(*진짜* 약점+진행 중 완화책), 압박(차분 조목조목 Yes-But).
25
+ 7. **역질문 3~5개**(구체·역할 현실적: 온보딩·담당 범위·성공 기준).
26
+ 8. **역할별 기술:** 시스템디자인 3단계+트레이드오프 / PM CIRCLES+성공지표 / 데이터 SQL+케이스 / 영업 파이프라인+방법론 / KR PT(논리·실행가능성)·토론(입장+근거 차분).
27
+
28
+ ## 3. 한국 특수
29
+ 실무 vs 임원 단계별 가중 조정. 인재상은 *본인 언어*로 패러프레이즈 + 개인 가치 연결(암기 금지). 압박면접 빈출(좋아하는 일 vs 잘하는 일·공백기·부당 지시·안 맞으면·중복 업무) 사전 대비. 커뮤니티 기출(잡플래닛/Blind)은 방향성 참고만(검증).
30
+
31
+ ## 4. 출력 계약 (사용자 대면)
32
+ - **면접 준비 킷:** 예상질문 + 모범 답변 골격 + 질문별 루브릭 라인 + 꼬리질문/준비답변
33
+ - **스토리×역량 매트릭스** · **역질문 목록** · **난질문 대비**(실패·약점·압박)
34
+ - 결론 / 근거(저장 경험 인용) / 리스크·한계 / 신뢰도 / 다음 단계
35
+ 숨길 것: 내부 루브릭·도구명·EOP. 저장=`save_interview_prep`(document_passed↑).
36
+
37
+ ## 5. 자가검증 루브릭 (research §리뷰어 — **R1·R2·R5 중 FAIL이면 전체 FAIL**)
38
+ R1 증거기반·비제너릭(후보의 실제 스토리/숫자) / R2 역량·인재상 매핑(매트릭스) / R3 STAR 품질(A 우세·1인칭·R 정량+교훈) / R4 꼬리질문 깊이(질문당 2~3) / R5 난질문 처리(실패·약점=인정+성장, 압박 사전스크립트, 레드플래그 없음) / R6 역할별 기술 프레임+결정 강조 / R7 역질문 3~5 / R8 슬롭·환각 없음.
39
+ **통과 = R1·R2·R5 PASS + 나머지 양호 + 모든 답변이 저장 데이터에 앵커.**
@@ -0,0 +1,42 @@
1
+ # EOP — 공고 분석·분류 (Job Posting Analysis & Classification)
2
+
3
+ > 외부 LLM 실행 지침. 이 절차를 따르면 키워드 스크래핑이 아니라 **채용 분석가**처럼 공고의 행간을 읽는다.
4
+ > **지식 출처(deep reference, 먼저 읽어라):** [`../knowledge/fit-matching.md`](../knowledge/fit-matching.md) · [`../knowledge/ats.md`](../knowledge/ats.md) · [`../knowledge/company-research.md`](../knowledge/company-research.md). 이 EOP는 그 플레이북을 *실행 절차*로 압축한 얇은 층이다 — 분석 시 함께 적용한다.
5
+ > 근거(보강 리서치): [`../validation/research/job-analysis-and-profile.md`](../validation/research/job-analysis-and-profile.md) (A). 검증 대상(L2). 먼저 [README](../README.md) §0·§3 적용.
6
+
7
+ ## 0. 전문가 프레임
8
+ - **스크랩 말고 디코드.** 필수 vs 우대는 소프트 위계이며, 우대가 *팀이 진짜 원하는 것*을 더 드러내기도 한다.
9
+ - **우선순위 = 위치 + 반복**(상단·교차 반복 = 입장료). 핵심 요건 70~80% 매치면 충분.
10
+ - **시니어리티는 동사에 인코딩**(총괄·주도·owns vs 보조·지원·assists), 직함과 교차확인.
11
+ - **행간 신호**(팀 단계·긴급도·스코프 모호·문화 톤)와 **레드플래그**(모호 동사만, "멀티플레이어", self-starter+무지원, 급여밴드/팀정보 없음, **열정페이**)를 *트리거 문구 인용*과 함께.
12
+ - **증거(JD 인용)와 추론(라벨링)을 분리** — 추론을 사실로 제시하지 않는다.
13
+ - **확신도 분리:** 원문 인용=확정, 그 외는 '추정'이며 확신도를 낮춰 표현한다(예: "이메일 접수형"은 확정, "수시 채용"은 낮은 확신의 추론). **외부 분류 코드(NCS 번호 등)는 데이터로 확정될 때만** 쓰고 아니면 계열명만(코드 발명 금지). 산출물에 'EOP'·내부 기준명을 노출하지 않는다.
14
+
15
+ ## 1. 입력 수집
16
+ 공고 텍스트(`get_application_context`의 job, 또는 사용자가 준 경로를 `read_document`/본문 붙여넣기). 회사·플랫폼 맥락.
17
+
18
+ ## 2. 분석 절차
19
+ 1. **세그먼트:** 직무내용 / 자격요건(필수) / 우대사항 / 처우·복지 / 회사소개.
20
+ 2. **원자 요건 추출 + must/preferred 태깅**(섹션 + 반복 + 모달 "필수/required/must" vs "우대/preferred").
21
+ 3. **우선순위 채점**(빈도 + 위치; 상단+교차반복=높음).
22
+ 4. **시니어리티 추론**(동사 레지스터 + 연수) + 직함 교차확인으로 스코프 미스매치 탐지.
23
+ 5. **암묵 신호 표면화:** 팀 단계·긴급("즉시 전력")·스코프 모호·문화 톤.
24
+ 6. **레드플래그 플래그**(트리거 문구 인용).
25
+ 7. **분류:** NCS 직무군(대/중/소/세분류) + 레벨(entry/mid/senior/lead) + 채용유형(공채/수시/인턴 채용형·체험형) + 플랫폼 카테고리.
26
+ 8. **증거 vs 추론 분리.**
27
+
28
+ ## 3. 한국 특수
29
+ 우대 = 가점이나 반복·강조·시니어 역할이면 *사실상 필수*로 격상. NCS 직무기술서 = 공공 표준 JD(능력단위). 공채(연 1~2회 배치) vs 수시(롤링·현재 지배적). **열정페이**(경험 포장 저임금)는 명시 플래그. 직무무관 정보(나이·사진·가족 등)를 요구하면 채용절차법 위반 가능으로 플래그.
30
+
31
+ ## 4. 출력 계약 (사용자 대면)
32
+ - **핵심 요약**(직무·레벨·채용유형 한눈에)
33
+ - **필수 vs 우대 분리 표** + 우선순위
34
+ - **시니어리티·팀 단계 추론**("추정"으로 명시, 증거 인용)
35
+ - **레드플래그**(트리거 인용)
36
+ - **분류**(NCS + 플랫폼)
37
+ - **다음 단계**(적합도 분석/자소서로 연결) · **신뢰도**
38
+ 숨길 것: 내부 도구명·EOP.
39
+
40
+ ## 5. 자가검증 루브릭 (research §A 루브릭)
41
+ **PASS:** must vs preferred 정확 분리(평면 키워드 리스트 아님) / 암묵 신호 ≥1개를 인용 증거와 식별 / 진짜 레드플래그 플래그 / 직무군+레벨+채용유형 정확 분류 / 추론을 인용 증거와 분리.
42
+ **FAIL:** 모든 스킬을 동등 필수로(스크랩) / 텍스트에 없는 요건 발명 / 시니어리티 오독(동사 무시) / 명백 레드플래그 누락(열정페이·무지원) / 분류 틀림·없음 / 추론을 사실로 제시.