careermate 0.0.1 → 0.0.2

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 (33) hide show
  1. package/INSTALL.md +12 -8
  2. package/README.md +14 -8
  3. package/dist/career-os/knowledge/interview-behavioral.md +9 -1
  4. package/dist/career-os/knowledge/offer-evaluation-decision.md +2 -2
  5. package/dist/career-os/knowledge/onboarding-first-90-days.md +1 -1
  6. package/dist/career-os/knowledge/verifiers/human-voice.md +20 -0
  7. package/dist/doctor.mjs +421 -11
  8. package/dist/mcp.mjs +421 -11
  9. package/dist/migrate.mjs +3 -1
  10. package/dist/public/index.html +1 -0
  11. package/dist/public/pages/settings.js +45 -0
  12. package/dist/public/styles.css +2 -0
  13. package/dist/site/index.html +19 -12
  14. package/dist/site/llms-install.txt +11 -8
  15. package/dist/site/start.html +16 -9
  16. package/dist/site/style.css +9 -0
  17. package/dist/web.mjs +351 -6
  18. package/docs/SUPPORTED_AI_APPS.md +6 -6
  19. package/docs/career-os/knowledge/interview-behavioral.md +9 -1
  20. package/docs/career-os/knowledge/offer-evaluation-decision.md +2 -2
  21. package/docs/career-os/knowledge/onboarding-first-90-days.md +1 -1
  22. package/docs/career-os/knowledge/verifiers/human-voice.md +20 -0
  23. package/package.json +1 -1
  24. package/packages/core/src/index.ts +1 -0
  25. package/packages/core/src/services.ts +61 -2
  26. package/packages/core/src/verify/index.ts +11 -0
  27. package/packages/core/src/verify/lexicons.ts +149 -0
  28. package/packages/core/src/verify/lint.ts +248 -0
  29. package/packages/core/src/verify/normalize.ts +112 -0
  30. package/packages/db/src/index.ts +1 -0
  31. package/packages/db/src/settings.ts +41 -0
  32. package/packages/mcp-tools/src/tools.ts +80 -6
  33. package/packages/shared/src/schemas.ts +8 -0
package/INSTALL.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  각 단계는 순서대로 수행하되, 무엇을 할지 **먼저 쉬운 한국어로 설명하고 사용자의 동의를 받은 뒤** 실행하세요. 확실하지 않으면 추측하지 말고 사용자에게 확인합니다.
6
6
 
7
- > Claude Desktop만 쓰는 사용자는 터미널이 필요 없습니다. 이 경우 `.mcpb` 원클릭 설치(아래 5단계)만 안내하세요.
7
+ > Claude Desktop만 쓰는 사용자는 터미널이 필요 없습니다. 이 경우 `careermate.zip`을 압축 해제해 폴더로 추가하는 경로(아래 5단계)를 안내하세요. `.mcpb` 직접 추가는 일부 Claude Desktop 버전에서 실패하는 알려진 이슈가 있습니다.
8
8
 
9
9
  > **빈 폴더에서 시작**한다면(소스를 미리 받지 않는 경우) 이 런북의 공개본을 에이전트에게 주세요: **https://careermate.life/llms-install.txt** — 에이전트가 그 URL을 직접 읽고 npm으로 자동 설치·연결합니다.
10
10
 
@@ -26,7 +26,7 @@
26
26
 
27
27
  | 내가 누구인가 | MCP 등록 방식 |
28
28
  |---|---|
29
- | 사용자가 **Claude Desktop**을 쓰는 경우 | `.mcpb` 원클릭 설치 — **터미널 불필요** |
29
+ | 사용자가 **Claude Desktop**을 쓰는 경우 | `careermate.zip` 압축 해제 후 폴더 추가 — **터미널 불필요** (`.mcpb` 직접 추가는 known issue) |
30
30
  | **Claude Code** | CareerMate 폴더의 프로젝트 `.mcp.json`, 또는 `claude mcp add` (첫 실행 시 1회 승인) |
31
31
  | **Codex** (OpenAI Codex CLI) | `~/.codex/config.toml`의 `[mcp_servers.careermate]` 테이블, 또는 `codex mcp add` |
32
32
 
@@ -112,7 +112,7 @@ npm run init
112
112
 
113
113
  | 클라이언트 | 등록 결과 |
114
114
  |---|---|
115
- | **Claude Desktop** | `.mcpb` 원클릭 설치(아래) — `init`과 별개 |
115
+ | **Claude Desktop** | `careermate.zip` 압축 해제 후 폴더 추가(아래) — `init`과 별개. `.mcpb` 직접 추가는 known issue |
116
116
  | **Claude Code** | CareerMate 폴더에 프로젝트 `.mcp.json` 기록 → 첫 실행 시 **1회 승인** 필요 |
117
117
  | **Codex** | `~/.codex/config.toml`의 `[mcp_servers.careermate]` 기록 → Codex 안에서 `/mcp`로 확인 |
118
118
 
@@ -145,12 +145,15 @@ npm run init -- --print
145
145
 
146
146
  > ⚠️ TS 소스(`apps/mcp/src/index.ts`)를 직접 가리킬 때는 `--import tsx`가 **반드시** 필요합니다(`node --no-warnings --experimental-sqlite --import tsx <CareerMate>/apps/mcp/src/index.ts mcp`). 위 `bin/careermate.mjs` 형태가 더 간단하고 빌드 유무와 무관하게 동작합니다.
147
147
 
148
- ### Claude Desktop — `.mcpb` 원클릭 (터미널 불필요)
148
+ ### Claude Desktop — ZIP 폴더 설치 (터미널 불필요)
149
149
 
150
- 1. `npm run build:mcpb`로 만들어진 **`dist/careermate.mcpb`** 파일을 Claude Desktop의 **Settings → Extensions → Advanced settings → Install extension…** 에서 선택해 추가합니다. (더블클릭·드래그는 Windows에서 파일 연결이 안 잡혀 반응이 없을 수 있으니, 이 설정 메뉴 경로를 쓰세요.)
151
- 2. Claude Desktop을 **완전히 재시작**합니다.
150
+ 1. `npm run build:mcpb`로 만들어진 **`dist/careermate.zip`** 을 압축 해제합니다.
151
+ 2. Claude Desktop의 **Settings → Extensions → Advanced settings → Install extension…** 에서 압축을 푼 폴더를 추가합니다.
152
+ 3. Claude Desktop을 **완전히 재시작**합니다.
152
153
 
153
- > 참고: `careermate.mcpb`는 **https://careermate.life 또는 GitHub Release에서 누구나 바로 내려받을 수 있습니다.** 소스를 받은 경우 `npm run build:mcpb`로 `dist/careermate.mcpb`를 직접 빌드할 수도 있습니다. `.mcpb`가 잘 안 되면 **터미널에서 `npx -y careermate init`** 가 가장 간단한 대안입니다.
154
+ `.mcpb` 직접 추가는 일부 Claude Desktop 버전에서 설치 창이 뜨지 않거나 실패하는 알려진 이슈가 있습니다. `careermate.zip`은 같은 번들을 폴더 설치용으로 제공하는 파일이며, 폴더 안에는 같은 `manifest.json`과 서버 코드가 들어 있습니다.
155
+
156
+ > 참고: `careermate.mcpb`와 `careermate.zip`은 **https://careermate.life 또는 GitHub Release에서 누구나 바로 내려받을 수 있습니다.** 소스를 받은 경우 `npm run build:mcpb`로 둘 다 직접 빌드할 수 있습니다. 둘 다 잘 안 되면 **터미널에서 `npx -y careermate init`** 가 가장 간단한 대안입니다.
154
157
 
155
158
  ### init 직후 마무리
156
159
 
@@ -196,7 +199,7 @@ npm start
196
199
  > 1. (아직이면) 이 앱을 **완전히 껐다 다시** 켜세요. 처음 한 번 뜨는 승인 창은 **'허용'**.
197
200
  > 2. **이력서를 저에게 주세요** — 편한 방법 아무거나:
198
201
  > - **(공통·제일 쉬움)** 이력서 *내용*을 복사해 **대화창에 그대로 붙여넣기** — 파일이 어디 있든 상관없어요.
199
- > - **(Claude 채팅 `.mcpb`)** 채팅창에 파일을 **직접 첨부**.
202
+ > - **(Claude 채팅)** 채팅창에 파일을 **직접 첨부**.
200
203
  > - **(폴더 기반 — Claude Code 탭 / Codex / Antigravity)** 작업 폴더에 파일을 두고 *"이력서.pdf 읽어서 등록해줘"*처럼 **파일명·경로**로.
201
204
  > - ⚠️ 스캔본(이미지) PDF·보안 걸린 파일은 못 읽을 수 있어요 → 그땐 **내용을 텍스트로 붙여넣기**.
202
205
  > - → 그리고 **"내 이력서로 처음 세팅 해줘"** 한마디면 프로필·이력서로 정리해 저장합니다.
@@ -218,6 +221,7 @@ npm start
218
221
  |---|---|
219
222
  | **포트 충돌** (4319 사용 중) | 자동 폴백되니 터미널의 실제 주소를 확인. 포트를 고정하려면 `CAREERMATE_PORT` 환경변수를 설정 후 재실행. |
220
223
  | **MCP가 연결되지 않음** | ① 등록 경로가 맞는지 ② `node --version`이 22.5.0 이상인지 ③ `npm install`을 마쳤는지 확인 → 그다음 **AI 클라이언트를 완전히 재시작**. 폴더를 옮겼다면 `npm run init`을 다시 실행. |
224
+ | **Claude `.mcpb` 파일 설치가 무반응/실패** | 알려진 이슈입니다. `careermate.zip`을 내려받아 압축 해제 → Claude Desktop 확장 설정에서 압축을 푼 폴더를 추가. 그래도 안 되면 `npx -y careermate init` 경로로 등록. |
221
225
  | **무엇이 잘못됐는지 모를 때** | `npm run doctor`로 Node·데이터 폴더·DB·도구 개수·대시보드 상태를 한 번에 점검. |
222
226
  | **데이터 위치 확인** | `~/.careermate` (Windows: `%USERPROFILE%\.careermate`). 데이터 폴더를 옮기려면 `CAREERMATE_DATA_DIR` 환경변수 사용. |
223
227
  | **DB 스키마 문제** | `npm run migrate` — 여러 번 실행해도 안전합니다(idempotent). |
package/README.md CHANGED
@@ -1,5 +1,7 @@
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)
4
+
3
5
  **한국어** · [English](#careermate-english)
4
6
 
5
7
  **MCP 우선(MCP-first) 로컬 커리어 관리 도구.** 내 컴퓨터에서 동작하는 AI 에이전트(Claude Desktop·Claude Code·Codex 등)를 인터페이스로 쓰고, CareerMate는 당신의 커리어 데이터를 **이 컴퓨터에만** 저장한 뒤 MCP로 노출합니다.
@@ -113,9 +115,11 @@ npx -y careermate init
113
115
 
114
116
  그 외 클라이언트(Cursor·Cline·Windsurf 등)는 `npx -y careermate init -- --print`로 등록용 설정 블록을 출력해 수동으로 붙일 수 있습니다.
115
117
 
116
- #### ③ `.mcpb` (Claude Desktop "채팅" 앱 전용 · Node 불필요 폴백)
118
+ #### ③ `careermate.zip` (Claude Desktop "채팅" 앱 전용 · Node 불필요 폴백)
119
+
120
+ 터미널·Node 없이 붙이는 **유일한 길**입니다. `dist/careermate.zip`(`npm run build:mcpb`로 생성)을 압축 해제한 뒤, Claude Desktop의 **Settings → Extensions → Advanced settings → Install extension…** 에서 압축을 푼 폴더를 추가하고 재시작합니다. 단 Claude Desktop **내장 Node 버전에 의존해 불안정할 수 있습니다**(Node<22.5면 동작 불가).
117
121
 
118
- 터미널·Node 없이 붙이는 **유일한 길**입니다. `dist/careermate.mcpb`(`npm run build:mcpb`로 생성)를 Claude Desktop의 **Settings → Extensions → Advanced settings → Install extension…** 에서 선택해 추가하고 재시작합니다. 단 Claude Desktop **내장 Node 버전에 의존해 불안정할 수 있습니다**(Node<22.5면 동작 불가). (더블클릭·드래그는 Windows에서 파일 연결이 안 잡혀 반응이 없을 수 있습니다.)
122
+ `.mcpb` 직접 추가는 일부 Claude Desktop 버전에서 실패하는 알려진 이슈가 있어, 현재는 ZIP 압축 해제 후 폴더 추가를 권장합니다. `.mcpb`와 `.zip`은 같은 번들입니다.
119
123
 
120
124
  연결 후 AI 클라이언트를 **완전히 재시작**하고, `get_onboarding_status`를 호출해 달라고 시켜 연결을 검증하세요. 자세한 절차는 AI용 런북 **[`INSTALL.md`](INSTALL.md)**, 사람용 설치 안내 **https://careermate.life**, 설치 후 사용법 **[`docs/START_WORKFLOW.md`](docs/START_WORKFLOW.md)**, 지원 앱 매트릭스 **[`docs/SUPPORTED_AI_APPS.md`](docs/SUPPORTED_AI_APPS.md)**를 참고하세요.
121
125
 
@@ -200,7 +204,7 @@ CareerMate/
200
204
  | `npm run doctor` | 설치/환경 점검 |
201
205
  | `npm run seed` | 예시 데이터 삽입 |
202
206
  | `npm run build` | 배포용 플레인 JS 번들(`dist/`) 생성 (esbuild) |
203
- | `npm run build:mcpb` | Claude Desktop용 `.mcpb` 번들 빌드 → `dist/careermate.mcpb`(+ `site/`로 복사). manifest+서버코드를 한 파일로 묶어 배포(careermate.life에 호스팅). |
207
+ | `npm run build:mcpb` | Claude Desktop용 번들 빌드 → `dist/careermate.mcpb`와 폴더 설치용 `dist/careermate.zip` 생성(+ `site/`로 복사). manifest+서버코드를 한 파일로 묶어 배포. |
204
208
  | `npm test` | E2E 테스트 실행 |
205
209
  | `npm run test:ui` | Playwright UI 스모크 테스트 |
206
210
  | `npm run typecheck` | 타입 검사 (`tsc --noEmit`) |
@@ -238,7 +242,7 @@ CareerMate/
238
242
 
239
243
  - [`INSTALL.md`](INSTALL.md) — AI 어시스턴트가 따라가는 설치·연결 런북(소스 직접 실행 기준).
240
244
  - [`AGENTS.md`](AGENTS.md) — Codex용 영속 지침. / [`CLAUDE.md`](CLAUDE.md) — Claude Code용 영속 지침.
241
- - [`docs/SUPPORTED_AI_APPS.md`](docs/SUPPORTED_AI_APPS.md) — **설치 레퍼런스 허브**: 지원 앱 매트릭스 + 설치 3방식(에이전트/npx/.mcpb) + 클라이언트별 수동 MCP 설정 + 알려진 제약. (사람용 안내는 https://careermate.life)
245
+ - [`docs/SUPPORTED_AI_APPS.md`](docs/SUPPORTED_AI_APPS.md) — **설치 레퍼런스 허브**: 지원 앱 매트릭스 + 설치 3방식(에이전트/npx/zip) + 클라이언트별 수동 MCP 설정 + 알려진 제약. (사람용 안내는 https://careermate.life)
242
246
  - [`docs/START_WORKFLOW.md`](docs/START_WORKFLOW.md) — 등록부터 면접 준비까지 단계별 작업 런북.
243
247
  - [`docs/FAQ.md`](docs/FAQ.md) — **자주 묻는 질문 / 문제 해결**: "PDF가 안 읽혀요", "분석이 안 돼요", "공고 URL은 어떻게 넣어요" 등.
244
248
  - [`docs/dev/TODO.md`](docs/dev/TODO.md) — 남은 작업과 v1 범위 밖 항목.
@@ -382,9 +386,11 @@ npx -y careermate init
382
386
 
383
387
  For other clients (Cursor, Cline, Windsurf, …), `npx -y careermate init -- --print` prints the registration config block so you can paste it in manually.
384
388
 
385
- #### ③ `.mcpb` (Claude Desktop "chat" app only · no-Node fallback)
389
+ #### ③ `careermate.zip` (Claude Desktop "chat" app only · no-Node fallback)
390
+
391
+ This is the **only path with no terminal and no Node**. Unzip `dist/careermate.zip` (created via `npm run build:mcpb`), add the extracted folder through Claude Desktop's **Settings → Extensions → Advanced settings → Install extension…**, then restart. Note that it **depends on Claude Desktop's bundled Node version** (won't work if that Node is < 22.5).
386
392
 
387
- This is the **only path with no terminal and no Node**. Add `dist/careermate.mcpb` (created via `npm run build:mcpb`) through Claude Desktop's **Settings → Extensions → Advanced settings → Install extension…**, then restart. Note that it **depends on Claude Desktop's bundled Node version and can be unstable** (won't work if that Node is < 22.5). (Double-click/drag may do nothing on Windows because the file association isn't registered.)
393
+ Direct `.mcpb` install is a known issue in some Claude Desktop builds, so the ZIP folder path is the recommended no-terminal route. The `.mcpb` and `.zip` assets contain the same bundle.
388
394
 
389
395
  After connecting, **fully restart** the AI client and verify the connection by asking it to call `get_onboarding_status`. For details, see the AI runbook **[`INSTALL.md`](INSTALL.md)**, the human-facing install guide **https://careermate.life**, the post-install usage flow **[`docs/START_WORKFLOW.md`](docs/START_WORKFLOW.md)**, and the supported-apps matrix **[`docs/SUPPORTED_AI_APPS.md`](docs/SUPPORTED_AI_APPS.md)**.
390
396
 
@@ -469,7 +475,7 @@ CareerMate/
469
475
  | `npm run doctor` | Check installation/environment |
470
476
  | `npm run seed` | Insert example data |
471
477
  | `npm run build` | Build the plain-JS distribution bundle (`dist/`) via esbuild |
472
- | `npm run build:mcpb` | Build the `.mcpb` bundle for Claude Desktop → `dist/careermate.mcpb` (also copied to `site/`). Packs manifest + server code into one file for distribution (hosted on careermate.life). |
478
+ | `npm run build:mcpb` | Build the Claude Desktop bundle → `dist/careermate.mcpb` plus unpacked-folder fallback `dist/careermate.zip` (also copied to `site/`). Packs manifest + server code for distribution. |
473
479
  | `npm test` | Run E2E tests |
474
480
  | `npm run test:ui` | Playwright UI smoke tests |
475
481
  | `npm run typecheck` | Type check (`tsc --noEmit`) |
@@ -507,7 +513,7 @@ CareerMate/
507
513
 
508
514
  - [`INSTALL.md`](INSTALL.md) — The install/connect runbook the AI assistant follows (based on running from source).
509
515
  - [`AGENTS.md`](AGENTS.md) — Persistent instructions for Codex. / [`CLAUDE.md`](CLAUDE.md) — Persistent instructions for Claude Code.
510
- - [`docs/SUPPORTED_AI_APPS.md`](docs/SUPPORTED_AI_APPS.md) — **Install reference hub**: supported-apps matrix + the 3 install methods (agent / npx / .mcpb) + per-client manual MCP setup + known constraints. (Human-facing guide at https://careermate.life)
516
+ - [`docs/SUPPORTED_AI_APPS.md`](docs/SUPPORTED_AI_APPS.md) — **Install reference hub**: supported-apps matrix + the 3 install methods (agent / npx / zip) + per-client manual MCP setup + known constraints. (Human-facing guide at https://careermate.life)
511
517
  - [`docs/START_WORKFLOW.md`](docs/START_WORKFLOW.md) — Step-by-step runbook from registration to interview prep.
512
518
  - [`docs/FAQ.md`](docs/FAQ.md) — **FAQ / troubleshooting**: "PDF won't read," "analysis isn't working," "how do I add a posting URL," etc.
513
519
  - [`docs/dev/TODO.md`](docs/dev/TODO.md) — Remaining work and out-of-scope-for-v1 items.
@@ -16,7 +16,7 @@
16
16
  - **(답변 전, 질문이 겨냥하는 역량/회사가치를 controlled vocabulary로 먼저 식별하고 매핑한다.)** — 구조화 면접의 변별력은 표준화·동일 질문·앵커드 채점표(BARS)에서 나오며, 역량 매핑은 그 일부다(역량 매핑 단독이 우수성의 원인이라는 단정은 과도 단순화). 채용공고 요구 역량에서 역으로 스토리를 고른다. **태그 인플레이션을 막기 위해 역량은 고정 enum을 쓴다(아래 택소노미).** _(출처: U.S. OPM Structured Interviews; Northwestern)_
17
17
  - **(스토리 뱅크를 미리 8~12개 구축하고, 각 사례에 probing 답 3종을 함께 준비한다.)** — 한 사례를 여러 질문에 변주해 즉석 누락을 막는다. **Amazon 루프 등에서 후보가 떨어지는 1순위는 첫 답변이 아니라 probing 붕괴이므로, 각 사례에 '왜 그 결정을 했나 / 대안은 무엇이었나 / 되돌아보면 무엇을 바꾸겠나' 답을 미리 채운다.** _(출처: Amazon Behavioral Interview 가이드, UVA·Wisconsin 등)_
18
18
  - **(사례는 최신성·직무관련성을 갖춰야 한다.)** — 시니어/경력직에게 8년 전 인턴·학부 프로젝트만 가득한 뱅크는 반려 사유다. 각 사례에 연도·역할단계를 기록하고, 경력직은 최근 N년 내 사례 비율을 확보한다. _(출처: 채용 실무 — recency/relevance, hiring manager review)_
19
- - **(사실·수치·고유명사는 절대 지어내지 않는다. 실패 사례는 조건부로만 쓴다.)** — 면접관은 probing으로 꾸민 이야기를 검증한다. 실패 사례는 회복·재발방지 행동이 Result보다 길고 구체적일 때만 강점이 되며, 일부 문화권 면접관은 부정 신호로 받을 수 있으므로 '학습·후속 개선'이 핵심이 아닐 거면 쓰지 않는다. _(출처: CareerMate AGENTS.md, Amazon probing follow-ups, UVA)_
19
+ - **(사실·수치·고유명사는 절대 지어내지 않는다. 실패 사례는 조건부로만 쓴다.)** — 면접관은 probing으로 꾸민 이야기를 검증한다. 실패 사례는 회복·재발방지 행동이 Result보다 길고 구체적일 때만 강점이 되며, 일부 문화권 면접관은 부정 신호로 받을 수 있으므로 '학습·후속 개선'이 핵심이 아닐 거면 쓰지 않는다. **커리어 공백·전직 경험을 묻는 질문은 '짧게 사실을 밝히고 현재 준비 상태로 전환'하는 간략한 안심 확인으로 처리하라 — 길게 해명하거나 사과조로 이어가면 오히려 레드플래그 신호로 읽힌다(한국 면접 맥락).** _(출처: CareerMate AGENTS.md, Amazon probing follow-ups, UVA)_
20
20
  - **(키워드 스터핑을 경계한다.)** — 회사 가치에 '단어 수준으로 맞추라'는 조언은 과하면 '준비된 앵무새'로 보인다. LP/가치 키워드는 실제 사례의 행동이 그 가치를 **입증**할 때만 쓰고, 키워드를 라벨처럼 나열하지 않는다. 구조화 면접은 adverse impact를 줄이고 법적 방어가능성을 높이는 공정성 도구라는 점도 기억한다. _(출처: U.S. OPM Structured Interviews)_
21
21
 
22
22
  ### Do
@@ -60,6 +60,14 @@
60
60
  **After:** `[역량: growth-learning]` **S:** 첫 사이드프로젝트에서 사용자 검증 없이 4개월간 기능부터 만들었습니다. **T:** 출시 후 사용자를 모으는 것이 목표였습니다. **A:** 저는 가설 검증을 건너뛴 채 개발에 몰입했고, 출시 후에야 핵심 가정이 틀렸음을 알았습니다. 이후 저는 즉시 10명 인터뷰를 돌려 문제를 재정의하고, 2주짜리 프로토타입으로 다시 검증하는 방식으로 프로세스를 바꿨습니다(재발방지 행동이 Result보다 김). **R:** 원래 제품은 가입 9명에 그쳤지만, 재검증 후 만든 버전은 4주 만에 활성 사용자 120명을 모았습니다(label: WAU, source: 가입 로그). '만들기 전에 검증한다'를 이후 모든 프로젝트의 기본 규칙으로 삼았습니다. **Probing 준비:** (왜) 검증을 건너뛴 이유 / (대안) MVP를 먼저 냈다면 / (되돌아보면) 4개월→2주로 단축한 학습.
61
61
  **왜 더 나은가:** Before는 실패를 회피해 자기인식·성장성을 증명하지 못한다. After는 진짜 실패를 정직하게 인정하고, **재발방지 행동을 Result보다 길게** 써 학습을 증명하며(조건부 실패 사례 원칙 충족), 정량 대비(9명→120명)로 회복을 보인다.
62
62
 
63
+ 4. **Before:** 질문: '분석이나 판단이 틀렸던 경험을 말해보세요.' 답변: "저는 항상 데이터를 꼼꼼히 보려고 노력하기 때문에 크게 틀린 경우는 없었던 것 같습니다. 한 번 예상과 다른 결과가 나온 적이 있었는데, 팀원들과 의견을 맞춰 잘 해결했습니다."
64
+ **After:** `[역량: failure-learning, data-driven]` **S:** 작년 분기 프로모션 캠페인 설계 시, 저는 특정 사용자 세그먼트의 구매 전환율을 15% 이상으로 예측하고 예산의 40%를 해당 채널에 배정했습니다. **T:** 캠페인 2주차 중간 데이터를 검토하면서 실제 전환율이 6%에 머물고 있음을 확인했고, 제 초기 가정이 틀렸음을 인정해야 했습니다. **A:** 저는 즉시 원인 분석에 들어가 — 초기 샘플이 실제 세그먼트를 대표하지 못했다는 것(표본 편향)을 파악했습니다. 관련 팀에 중간 결과를 솔직하게 공유하고, 잔여 예산의 70%를 전환율이 검증된 다른 채널로 즉시 재배분하도록 제가 제안해 실행했습니다. 이후 저는 캠페인 예측 프로세스에 '사전 샘플 대표성 검증' 단계를 추가하는 SOP를 작성했습니다. **R:** 재배분 후 2주 전환율이 11%로 회복됐고(label: 후반 2주 구매 전환율, source: 캠페인 대시보드), SOP 도입 이후 다음 분기 두 캠페인에서 초기 예측 오차가 기존 대비 절반 이하로 줄었습니다(label: 예측 오차율, source: 분기 리뷰 보고서). **Probing 준비:** (어떻게 알아챘나) 2주차 중간 점검 지표에서 이탈 감지 — 이 체크포인트가 없었으면 캠페인 전체를 날렸을 것 / (무엇을 바꿨나) SOP에 사전 샘플 대표성 검증 단계 명문화 / (재발 방지) 이후 모든 캠페인에 동일 체크포인트·승인 게이트 적용.
65
+ **왜 더 나은가:** Before는 실수를 회피하고 팀 뒤에 숨어 지적 정직성을 전혀 증명하지 못한다(자기 정당화·남 탓 패턴). After는 ① 틀렸음을 1인칭으로 명시("제 초기 가정이 틀렸음을 인정"), ② 어떻게 발견했는지(중간 점검), ③ 즉각 행동, ④ 재발방지(SOP)를 순서대로 채워 intellectual honesty·error-recovery·calibration 세 축을 모두 커버하며, probing 3종으로 후속 깊이 질문에 견딘다. 실패를 정당화하거나 외부 탓으로 돌리는 순간 지적 성숙도 점수가 0에 수렴한다.
66
+
67
+ 5. **Before:** 질문: '요구사항이 불명확하거나 데이터가 지저분한 상황에서 어떻게 시작하나요?' 답변: "저는 일단 분석을 시작해보고 문제가 생기면 그때 확인하는 편입니다. 데이터가 불완전해도 우선 해볼 수 있는 것부터 코딩해보면서 방향을 잡습니다."
68
+ **After:** `[역량: ambiguity, data-driven, collaboration]` **S:** 신사업 팀으로부터 "이탈 위험 사용자를 예측하는 모델을 2주 안에 만들어달라"는 요청을 받았는데, 이탈의 정의·대상 기간·사용 목적이 모두 명시되지 않은 상태였습니다. **T:** 불명확한 요구사항 아래에서 실제로 쓸 수 있는 결과물을 기한 내에 내는 것이 목표였습니다. **A:** 저는 코드를 열기 전에 먼저 세 가지 가정을 서면으로 정리했습니다 — ① 이탈 = 30일 미접속, ② 대상 = 최근 90일 활성 사용자, ③ 출력 = 상위 500명 리스트(CRM 액션용). 이 가정을 담은 1페이지 PRD 초안을 요청 다음 날 이해관계자와 30분 리뷰했고, ②를 '60일 활성'으로, ③을 '확률 스코어 전체'로 수정했습니다. 가정을 확정한 뒤에야 데이터 파이프라인·피처 엔지니어링에 들어갔고, 데이터 품질 문제(중복 이벤트 로그 약 18%)는 필터 로직과 근거를 문서에 명시해 재현 가능하게 처리했습니다. **R:** 1차 모델 Precision@500 = 0.71(label: Precision@500, source: 오프라인 검증셋), 요청팀은 해당 리스트 기반 리인게이지먼트 캠페인을 다음 분기 정식 운영으로 채택했습니다(label: 캠페인 채택 여부, source: 분기 OKR 보고서). **Probing 준비:** (가정이 틀렸으면) 리뷰 단계에서 수정 — 실제로 ②③이 바뀐 선례가 있음 / (데이터 품질 판단 기준) 18% 중복은 제거·문서화했고, 더 큰 편향이 있으면 모델 전에 데이터 파이프라인부터 고쳤을 것 / (우선순위 방법) 가정 검증 → 데이터 탐색 → 피처 → 모델 순서로 고정, 앞 단계 불확실성이 크면 다음 단계를 시작하지 않는다.
69
+ **왜 더 나은가:** Before는 불명확한 상황에서 바로 코드·분석부터 들어가고(가정 불명시), 이해관계자 확인을 후순위로 미루는 전형적 약한 답변이다(ambiguity handling 0점). After는 ① 코드 전에 가정을 명시·서면화, ② 이해관계자와 조기 검증, ③ 데이터 품질 처리를 재현 가능하게 문서화해 stakeholder clarification·prioritization·ambiguity handling 세 역량을 모두 입증하며, probing 3종으로 '가정이 틀렸으면 어떻게 했을 것인가'라는 전형적 후속 질문까지 대비한다.
70
+
63
71
  ## 3. 검증 루브릭 (연결된 AI가 산출물을 이 기준으로 자가검증)
64
72
 
65
73
  > **전제(중요):** 루브릭은 자유 텍스트가 아니라 **`StoryBankEntry` 구조화 레코드 배열**을 입력으로 받는다. S/T/A/R 경계는 자유 텍스트를 LLM이 의미로 갈라야 하므로, CareerMate는 먼저 `save_interview_prep`으로 STAR를 **필드 분리 저장**하게 한다. 그러면 다수 체크가 필드 non-empty / 패턴 카운트로 결정론적이 된다.
@@ -15,9 +15,9 @@
15
15
  - **(BATNA는 현직/무직/타 프로세스로 분기한다)** 매트릭스에 BATNA 열을 반드시 포함하되, 사용자가 **현직자면** "현 직장 유지"를, **무직이면** "다른 진행 중 프로세스" 또는 "무오퍼로 더 기다림"을 BATNA로 둔다. 무직인데 진행 중 프로세스가 없으면 BATNA는 약하므로 그 사실을 명시하고(빈 열로 통과시키지 말 것), 협상·결정 강도를 그에 맞게 낮춘다. _(출처: Harvard PON — BATNA, 1차)_
16
16
  - **(복수 오퍼는 만료일을 한 시점으로 정렬한다)** BATNA는 동시에 비교 가능한 살아있는 대안이 있을 때만 협상력으로 작동한다. 빠른 오퍼에는 "진행 중인 다른 최종 단계를 마치기 위해 X일 필요"를 구체 날짜로 요청하고, 느린 곳에는 "이미 오퍼를 받아 일정을 앞당겨달라"고 신호한다. 한 오퍼를 잡아두려면(on_hold) 정중한 관심 재확인 + 구체 사유를 묶는다. _(출처: Harvard PON(BATNA) + MIT Sloan CDO, 1차/2차)_
17
17
  - **(total comp은 명목 합이 아니라 세후·다년 현가로 비교한다)** base+stock+bonus 명목 합이 아니라 (1) **세후 실수령**(한국 4대보험·소득세 공제, 비과세 식대·차량유지비 차이), (2) stock의 **연환산·베스팅·cliff**, (3) **다년 임금인상률·승진 속도**(한국 대기업 호봉 자동상승 vs 스타트업 협상제는 4년 누적에서 결과가 뒤집힐 수 있다), (4) **퇴직금·퇴직연금(DC/DB)**이 연봉에 포함인지 별도인지로 비교한다. 명목 단일 숫자는 cliff 후 급감과 세후 격차를 숨긴다. _(출처: levels.fyi(연환산), 벤더 / 한국 세제·퇴직금 분기)_
18
- - **(stock 분해는 한국 오퍼 유형에 맞춰 적용한다)** "연환산·cliff·refresh" RSU 모델은 미국 빅테크 모델이다. 한국은 **상장 대기업=주식 거의 없음(현금·퇴직금 위주), 비상장 스타트업=스톡옵션(주식매수선택권)·4년 베스팅이 표준이 아닐 수 있음, 중견=현금 위주**다. 비상장 스톡옵션은 행사가·희석·청산우선권으로 기대가치를 할인하고, **행사이익이 근로소득으로 과세되나 벤처기업법 과세특례(연 한도 내 비과세·분할납부)**가 있는지 확인한다. stock이 없는 오퍼에는 stock 행을 비우고 현금·퇴직금·성장으로 비교한다(빈 stock을 가짜로 통과시키지 말 것). _(출처: levels.fyi(연환산) / 벤처기업법 스톡옵션 과세특례, 벤더/한국 1차)_
18
+ - **(stock 분해는 한국 오퍼 유형에 맞춰 적용한다)** "연환산·cliff·refresh" RSU 모델은 미국 빅테크 모델이다. 한국은 **상장 대기업=주식 거의 없음(현금·퇴직금 위주), 비상장 스타트업=스톡옵션(주식매수선택권)·4년 베스팅이 표준이 아닐 수 있음, 중견=현금 위주**다. 비상장 스톡옵션은 행사가·희석·청산우선권으로 기대가치를 할인하고, **행사이익이 근로소득으로 과세되나 벤처기업법 과세특례(연 한도 내 비과세·분할납부)**가 있는지 확인한다. *(과세특례 한도·요건은 현행법 기준이며 개정·사안별로 달라질 수 있음 — 실제 적용 전 최신 세법·세무사 확인 권장)* stock이 없는 오퍼에는 stock 행을 비우고 현금·퇴직금·성장으로 비교한다(빈 stock을 가짜로 통과시키지 말 것). _(출처: levels.fyi(연환산) / 벤처기업법 스톡옵션 과세특례, 벤더/한국 1차)_
19
19
  - **(현직 카운터오퍼는 "근본 원인 진단"으로 결정한다 — 기본값 고정 아님)** 카운터오퍼를 받으면 먼저 **"왜 떠나려 했는가"(매니저·성장 정체·번아웃·저평가 연봉)** 를 적고, 그 원인이 돈으로 해결되는지 검증한다. 원인이 **순수 저평가 연봉**이고 카운터가 그것을 시장가로 맞춘다면 수락이 합리적일 수 있다(정답은 "depends"다 — 한쪽으로 못박지 말 것). 원인이 비보상 요인이면 돈은 고치지 못한다. 사용자에게 설명할 때 **"카운터오퍼 수락자 80%가 6개월 내 퇴사" 류 수치는 출처 추적이 거의 불가능한 도시전설(존재 불명 기관 인용)이므로 "통계"가 아니라 "근본 원인 논리"로 설득**한다. _(출처: LHH/Progressive(일화적·출처 검증 불가, 벤더) — 비판적 인용)_
20
- - **(수락 후 번복은 평판 비용으로, 한국은 채용내정 법리도 본다)** 미국 맥락에서 reneging은 소송보다 **리크루터·추천인·해당 회사 네트워크의 신뢰 상실**이 진짜 비용이다(업계 전체 블랙리스트는 실재하지 않으나 개별 리크루터의 기억은 실재). 다만 **한국은 비대칭**이다: 근로계약서 체결 전 오퍼 단계에서는 지원자 번복의 법적 위험이 낮지만, **회사가 "채용내정"을 일방 취소하면 판례상 근로계약 성립으로 보아 손해배상 다툼 여지**가 있다(at-will 전제의 미국 가이드를 한국에 그대로 적용하지 말 것). 불가피한 번복은 최대한 빨리·사과와 함께·짧은 사유·다리를 태우지 않는 톤으로 통보한다. _(출처: MIT Sloan CDO + CU Boulder(평판 비용, 1차/2차) / 한국 채용내정 법리, 한국 판례)_
20
+ - **(수락 후 번복은 평판 비용으로, 한국은 채용내정 법리도 본다)** 미국 맥락에서 reneging은 소송보다 **리크루터·추천인·해당 회사 네트워크의 신뢰 상실**이 진짜 비용이다(업계 전체 블랙리스트는 실재하지 않으나 개별 리크루터의 기억은 실재). 다만 **한국은 비대칭**이다: 근로계약서 체결 전 오퍼 단계에서는 지원자 번복의 법적 위험이 낮지만, **회사가 "채용내정"을 일방 취소하면 판례상 근로계약 성립으로 보아 손해배상 다툼 여지**가 있다(at-will 전제의 미국 가이드를 한국에 그대로 적용하지 말 것). *(채용내정 성립 여부·손해배상 범위는 사안별 판례 기준이며 개정·상황별로 달라질 수 있음 — 실제 분쟁 시 노무사·변호사 확인 권장)* 불가피한 번복은 최대한 빨리·사과와 함께·짧은 사유·다리를 태우지 않는 톤으로 통보한다. _(출처: MIT Sloan CDO + CU Boulder(평판 비용, 1차/2차) / 한국 채용내정 법리, 한국 판례)_
21
21
  - **(입사 전 30-60-90일 정착 계획을 초안한다)** 수락이 정해지면 입사 첫날 전에 0~30일=흡수·학습(기여 아님), 31~60일=초기 성과(early win)·동맹 구축, 61~90일=손익분기 계획을 초안하고, **90일 시점의 "성공 정의"를 매니저와 입사 전/직후 합의**한다. 단 한국에서는 90일 이전에 **전직 통보기간(보통 1개월)·인수인계 의무·경업금지(non-compete) 조항**이 입사일 협상의 제약이므로 함께 점검한다. _(출처: Michael Watkins, The First 90 Days, 1차 / 한국 전직 실무)_
22
22
  - **(한국 오퍼레터는 "최종 확정"이 아니라 "처우 조율 단계"로 다루되 구속력은 사안별)** 오퍼레터는 근로계약서와 달리 구속력이 약한 경우가 많아 직급(호봉)·입사일·부서/직무 배치·사이닝 등 **비-연봉 레버**로 협상할 여지가 있다. 단 "구속력 약함"을 단정하지 말고 **"구속력은 사안별이며 채용내정 성립 시 달라진다"** 로 약화한다. **포괄임금제 여부를 확인**해 명목연봉끼리 단순 비교하지 않는다(같은 명목연봉도 실질 시급이 다르다). _(출처: 리멤버 채용 인사이트/잡코리아(2차) + 채용내정 법리(한국 판례))_
23
23
  - **(직군별 오퍼 구조 차이를 반영한다)** 백엔드/SRE는 **온콜 수당**, ML·리서치 사이언티스트는 **equity 비중·연구 자율성**, 프론트/PM은 base·성장 경로가 더 무겁고, **신입 vs 시니어 sign-on 관행**도 다르다. 모든 직군에 같은 매트릭스 가중치를 기계적으로 들이대지 말고 직군에 맞춰 축·가중치를 조정한다. _(출처: 직군별 보상 구조 실무 — 보조)_
@@ -20,7 +20,7 @@
20
20
  - **(레퍼런스 체크/평판조회를 입사 직전 게이트로 능동 관리한다)** 한국 경력 채용은 입사 직전 평판조회가 빈번하다. (1) reference로 누구를 세울지 사전 선정·동의, (2) 전 직장 연락 타이밍, (3) 부정 평판 리스크(갈등 이력) 사전 맥락화. 이는 salary도 onboarding도 안 다루는 실제 late-stage 게이트다. _(출처: KR 경력 채용 평판조회 관행 — 2차)_
21
21
  - **(거절 후 피드백은 1회·짧게·단일질문·비논쟁으로, 단 무응답이 정상임을 전제한다)** 거절 1-3일 후 감사+한 개의 열린 질문("다음에 더 강한 후보가 되려면 한 가지만 꼽아주실 수 있을까요?")+"짧아도 됩니다" 허용+결정 반박 금지. **그러나 콜드 거절 피드백 응답률은 낮다(법무 리스크로 무응답이 디폴트)** — 응답은 보너스로 기대치를 보정하고, **무응답일 때는 인터뷰 로그·역질문 답변 자기복기**를 진짜 재사용 진단으로 삼는다. _(출처: Arcadia/CareerSidekick/4 Corner — 2차/대학 + 무응답 베이스레이트 보정)_
22
22
  - **([KR] 처우협의·서면 확정은 연봉 협상 도메인을 따르되, 입사일을 협상 레버로 쓴다)** 연봉/직위/연차/입사일을 **서면 확정한 뒤** 퇴사 통보한다(처우협의 문서팩·포괄임금 정규화는 salary-negotiation 소유). 추가로 이 도메인은 **입사일을 역제안 카드**로 다룬다 — 현 직장 인수인계·연차 소진·경쟁사 전직금지/겸업금지 조항과 충돌을 점검하고, 입사일 유연성을 협상 레버로 활용한다. _(출처: 리멤버 HR/잡코리아 — 2차/KR; 입사일 레버는 본 도메인 고유)_
23
- - **([KR] 수습=시용 게이트이되, 근로자의 법적 보호를 반드시 병기한다)** 수습/시용은 사용자가 업무능력·조직적합성을 평가하는 게이트이지만, **대법원 판례상 본채용 거부에는 (a)사전에 구체적 평가기준·방법 마련, (b)근로자에 고지, (c)객관적 능력 부족 입증이 필요하고 입증책임은 사용자에게 있다.** 막연한 "근무태도/적응" 인상 평가만으로 거부하면 부당해고가 된다. 따라서 지원자는 **(1) 정규직 전환 기준이 근로계약서에 서면화됐는지 확인·요구할 권리**, **(2) 부당 거부 시 노동위 구제** 권리를 안다. 동시에 첫 90일에 조직문화 적응·OJT 흡수·성실성 신호를 챙기는 것은 실무적으로 유효하다. **수습 디테일: 통상 임금 90% 지급 가능, 다만 수습 3개월 초과 시 최저임금 100% 적용, 5인 미만 사업장은 해고 보호 차등.** _(출처: 대법원 수습 판례/geolabor 노무 — 2차/KR; 권리 측면 병기)_
23
+ - **([KR] 수습=시용 게이트이되, 근로자의 법적 보호를 반드시 병기한다)** 수습/시용은 사용자가 업무능력·조직적합성을 평가하는 게이트이지만, **대법원 판례상 본채용 거부에는 (a)사전에 구체적 평가기준·방법 마련, (b)근로자에 고지, (c)객관적 능력 부족 입증이 필요하고 입증책임은 사용자에게 있다.** 막연한 "근무태도/적응" 인상 평가만으로 거부하면 부당해고가 된다. 따라서 지원자는 **(1) 정규직 전환 기준이 근로계약서에 서면화됐는지 확인·요구할 권리**, **(2) 부당 거부 시 노동위 구제** 권리를 안다. 동시에 첫 90일에 조직문화 적응·OJT 흡수·성실성 신호를 챙기는 것은 실무적으로 유효하다. **수습 디테일: 통상 임금 90% 지급 가능, 다만 수습 3개월 초과 시 최저임금 100% 적용, 5인 미만 사업장은 해고 보호 차등.** *(현행법 기준이며 법령 개정·사안별로 달라질 수 있음 — 실제 적용 전 최신 법령·노무사 확인 권장)* _(출처: 대법원 수습 판례/geolabor 노무 — 2차/KR; 권리 측면 병기)_
24
24
  - **([KR] 위계·집단주의 조직에서 "기대치 협상 대화"의 적절성을 분기한다)** Watkins의 다섯 대화는 서구 매니저-부하 1:1 문화 전제다. 한국 위계 조직에서 신입이 매니저에게 "기대치를 협상하자"고 먼저 요청하면 건방지게 비칠 수 있다. **KR에서는 "협상"이 아니라 "우선순위를 여쭙고 정리해 확인받는" 겸손한 프레이밍**으로 치환하고, OJT·사수 관계를 통해 간접적으로 기대치를 합의한다. _(출처: KR 조직문화 분기 — 본 도메인 고유)_
25
25
 
26
26
  ### Do
@@ -17,6 +17,8 @@
17
17
 
18
18
  > 적용 단위: 한 산출물(자소서 1편, 이력서 1부, 면접 답변 1세트 등). "문장"은 종결부호(`.`, `!`, `?`, `다.`, `요.`) 기준으로 분할한다. 한국어/영어 혼용 글도 동일 규칙을 적용한다.
19
19
 
20
+ > **수치 임계값 보정 주의 (advisory):** C1(100단어당 1.5개), C3(σ≥5), C6(100단어당 1개) 등의 숫자 기준은 **영어 코퍼스에서 유래한 잠정값**으로, 한국어 산출물에 대해 검증된 적이 없다. 동반 플레이북(`knowledge/human-writing.md`)과 동일한 입장: 이 수치들은 권고 신호(advisory signal)이며 하드 합격/불합격 기준이 아니다. 산출물 유형(이력서 vs 자소서)·길이·업계 문체에 따라 연결 AI가 맥락에 맞게 재해석해야 하고, 향후 한국어 데이터로 재보정되어야 한다.
21
+
20
22
  | ID | 검사 | 합격 기준 | 측정 방법(셀 수 있게) |
21
23
  |----|------|-----------|------------------------|
22
24
  | C1 | 슬롭 단어 밀도 | 슬롭 사전 단어가 **100단어당 1.5개 이하**, 그리고 동일 슬롭 단어가 **3회 초과 반복 없음** | 아래 §슬롭 사전과 대조해 일치 토큰 수를 센다 → (일치 수 ÷ 전체 단어 수) × 100. 단어별 등장 횟수도 집계 |
@@ -30,6 +32,7 @@
30
32
  | C9 | 고유명사 보존 | 원본의 회사명·제품명·기술명·자격증명 등 고유명사가 **100% 보존**, 철자 변형 0 | 원본 고유명사 목록 추출 → 대상에서 정확 일치 확인(누락·오타 0) |
31
33
  | C10 | 빈말 채움(filler) 문장 | 정보 없는 채움 문장("~에 대한 저의 열정은 남다릅니다" 류)이 **전체 문장의 5% 미만** | §filler 패턴과 매칭되거나 숫자·고유명사·동사 목적어가 전혀 없는 문장 수를 센다 |
32
34
  | C11 | 구체 증거(수치·사례) 존재 | 본문에 **정량 근거(숫자/기간/규모/성과 지표)가 최소 2개** 이상 | 숫자+단위/퍼센트/"N배"/"N명"/"N개월" 패턴 매칭 수가 2 이상인지 확인 |
35
+ | C12 | 번역투 문법 밀도 *(advisory)* | 아래 §번역투 패턴이 **100단어당 3개 이하** (권고 신호, 하드 실패 없음) | §번역투 패턴 목록과 부분 매칭 → 밀도 계산. **맥락 확인 필수**: 정상 용법에서도 등장하는 표현이 많으므로 밀도가 높더라도 연결 AI가 문맥을 보고 최종 판단. 단독으로 불합격 처리하지 않는다 |
33
36
 
34
37
  ### 슬롭 사전 (C1 — 부분 일치로 카운트)
35
38
 
@@ -49,6 +52,23 @@
49
52
 
50
53
  문장 안에 (a) 숫자, (b) 고유명사, (c) 구체적 행위 동사+목적어 가운데 **하나도 없으면** 빈말 후보로 카운트. 예: "저는 이 일에 대한 열정이 누구보다 큽니다.", "최선을 다하겠습니다.", "많은 것을 배웠습니다."
51
54
 
55
+ ### 번역투 패턴 사전 (C12 — advisory, 맥락 확인 필수)
56
+
57
+ 다음 표현들은 한국어를 영어 구조에서 직역한 번역투의 대표 신호로, LLM 생성 글에서 밀도가 높아지는 경향이 있다. **그러나 자연스러운 한국어 문장에서도 정상적으로 쓰이므로, 단순 존재나 횟수만으로 판정하지 말고 반드시 문맥을 함께 본다.** 밀도(100단어당 3개 초과)가 권고 신호이고, 연결 AI가 최종 판단한다.
58
+
59
+ | 패턴 | 번역투 예시 | 자연스러운 대안 예시 |
60
+ |------|------------|---------------------|
61
+ | `~에 대한` 과다 | "팀 협업에 대한 경험을 보유하고 있습니다" | "팀 협업 경험이 있습니다" |
62
+ | `~을/를 통해` 반복 | "프로젝트를 통해 역량을 통해 성과를 냈습니다" | "프로젝트에서 …을 해냈습니다" |
63
+ | `~에 있어서` | "업무 수행에 있어서 중요한 점은" | "업무를 할 때 중요한 점은" |
64
+ | `~라는 점에서` | "기여했다는 점에서 의미가 있습니다" | "기여한 것이 의미 있습니다" |
65
+ | `가지고 있습니다` | "저는 강한 실행력을 가지고 있습니다" | "저는 실행력이 강합니다" |
66
+ | `되어졌다 / 되어집니다` | "배포가 완료되어졌습니다" | "배포를 완료했습니다" |
67
+ | `~함으로써` | "소통함으로써 문제를 해결함으로써" | "소통해 문제를 해결했습니다" |
68
+ | `~을 진행하였습니다` | "분석을 진행하였습니다" | "분석했습니다" |
69
+
70
+ > **운용 지침:** 위 패턴이 집중적으로 등장하더라도 C12 단독으로는 불합격 처리하지 않는다. C1·C2·C10과 함께 "전체적으로 번역 냄새가 나는가"를 종합 판단하는 보조 신호로만 쓴다. 정상 용법과의 구분이 애매하면 해당 문장을 지적하되 수정 강제는 금지한다.
71
+
52
72
  ## 3. 불합격 시 처리(루프 연결)
53
73
 
54
74
  연결된 AI는 위 항목을 채점해 **불합격 항목 ID + 근거(센 수치/매칭된 문자열/위치)** 를 모은다. 그다음 항목별로 아래 수정 지시를 적용해 **재작성 → 동일 루브릭 재검증**한다. 재검증 통과까지 반복하되, **C8·C9(사실·고유명사 보존)는 단 1건이라도 위반 시 즉시 하드 실패**로 처리하고 다른 어떤 개선보다 우선해 복구한다.