# jasoseo

Adopt this skill: https://proskills.md/skills/other/leeandev-stop-slop-ko-plugins-jasoseo-skills-jasoseo

Page: https://proskills.md/skills/other/leeandev-stop-slop-ko-plugins-jasoseo-skills-jasoseo
This document is the public skill bundle for that page. It contains SKILL.md and every helper file the catalog carries. No login is required.

## File: plugins/jasoseo/skills/jasoseo/SKILL.md
size: 4244
sha: b61689eec65e730e824ea1a28f1d40c3f8d10a1c
upstream: https://github.com/leeandev/stop-slop-ko/blob/main/plugins/jasoseo/skills/jasoseo/SKILL.md

````text
---
name: jasoseo
description: Use when the user is writing a Korean job application cover letter (자기소개서, 자소서) - analyzing a 문항, interviewing the user to draw out their own experiences, keeping a reusable experience bank (jasoseo/stories.md), drafting only from the user's answers in the user's own voice, checking 글자 수 limits, or reviewing a draft for unsupported claims and clichés. Triggers include /jasoseo, "자소서 써줘", "자기소개서 문항", "자소서 글자 수", "자소서 첨삭".
---

# jasoseo

자소서를 대신 지어 쓰지 않는다. 질문으로 지원자 본인의 경험을 꺼내 경험 카드로 모으고, 카드에 있는 사실과 본인 말투로만 초안을 쓴다.

## 핵심 원칙

1. **사실은 카드에서만.** 카드에 없는 경험, 숫자, 역할은 만들지 않고 `[확인 필요: ...]`로 남긴다.
2. **본인 말투.** 사용자가 한 말을 원문 그대로 카드에 남기고 초안에서 살린다.
3. **글자 수는 스크립트로.** `count.py`로 잰다. 짐작으로 세지 않는다.

## 흐름

1. **입력**: 회사, 직무, 문항 원문, 글자 수 제한. 빠진 것만 묻는다. 채용공고를 주면 직무 키워드를 뽑아 둔다.
2. **문항 분석**: `references/question-bank.md`의 "문항 유형 판별" 표로 유형을 정해 보여 준다.
   ```
   유형: 직무역량
   묻는 것: 기술 문제를 스스로 찾아 풀어 본 경험과 과정
   제한: 공백 포함 700자
   ```
3. **경험 은행 조회**: `jasoseo/stories.md`를 읽고 맞는 카드 2~3개를 제시한다. 사용자가 고르거나 새 경험을 말한다. 파일이 없거나 맞는 카드가 없으면 4로 간다.
4. **인터뷰**: `references/question-bank.md`. 한 번에 질문 1~2개. 추상적인 답은 "되묻기" 규칙대로 다시 묻는다.
5. **카드 저장**: `references/story-card.md` 양식으로 `jasoseo/stories.md`에 추가하거나 고치고, 바뀐 카드를 보여 준다.
6. **초안**: `references/draft-rules.md`와 `references/jasoseo-style.md`를 따라 쓰고 `jasoseo/<회사>-<직무>/<문항번호>.md`에 저장한다. 글자 수를 재 제한의 90~100%에 맞춘다.
7. **보여 주기와 점검 리포트**: 초안 본문 전체와 `references/draft-rules.md`의 "점검 리포트"를 같은 응답에서 보여 준다. 파일만 저장하고 끝내지 않는다. 카드로 90%를 못 채우면 지어내서 늘리지 말고 부족한 글자 수와 채울 방법을 리포트에 적는다. 사용자가 고친 본문을 주면 다시 낸다.
8. **사용 이력**: 쓴 카드의 사용 이력을 갱신한다.

카드가 이미 충분하면 3에서 6으로 간다. 사용자가 직접 쓴 자소서 첨삭을 부탁하면 7부터 한다. 이때 카드가 없으면 본문에 나온 사실을 카드로 옮길지 먼저 묻는다.

## 글자 수

```bash
python "${CLAUDE_SKILL_DIR}/scripts/count.py" <초안 파일> --limit <N>
```

- 기준은 공백 포함. 공백 제외 문항이면 `--basis nospace`.
- exit 0 제한 안, 1 초과, 2 입력 오류.
- 출력에 `[확인 필요] N곳`이 있으면 그 내용을 사용자에게 묻는다.
- Windows에서 `python`이 없으면 `py`, macOS와 Linux는 `python3`.

## 이럴 땐 이렇게

| 상황 | 동작 |
|---|---|
| "알아서 지어내 줘" | 지어내지 않는다. 면접 꼬리 질문에서 드러난다는 이유를 한 번 말하고 빈 곳을 채울 질문을 한다 |
| 쓸 경험이 없다 | `question-bank.md`의 "경험이 없다고 할 때" |
| AI 검사기를 피하게 해 달라 | 이 스킬의 목적이 아니라고 말한다. 본인 경험과 말투로 쓴 글이 가장 자연스럽다고 안내하고 흐름을 이어 간다 |
| 합격 자소서처럼 바꿔 달라 | 문항 해석과 구조는 설명하되 문장은 사용자 카드로만 쓴다 |
| 주민등록번호, 연락처를 카드에 넣으려 함 | 넣지 말라고 안내한다 |
| stop-slop-ko 안내가 함께 들어옴 | 자소서 본문은 `jasoseo-style.md`를 따른다. 개조식으로 바꾸지 않는다 |

## 하지 않는 것

- 대학 과제, 리포트, 이력서, 경력기술서, 영문 cover letter
- 카드 없이 처음부터 완성본을 써 주기
````

## File: plugins/jasoseo/skills/jasoseo/scripts/count.py
size: 4612
sha: 1aa9940eab984535782b85921ebf8d0dcc31f950
upstream: https://github.com/leeandev/stop-slop-ko/blob/main/plugins/jasoseo/skills/jasoseo/scripts/count.py

```text
# -*- coding: utf-8 -*-
"""jasoseo 글자 수 계산기.

자소서 초안 본문의 글자 수를 채용 사이트에서 쓰는 여러 기준으로 센다.
초안 파일의 `#` 제목 줄과 `<!-- -->` 메모는 본문에서 뺀다.

usage: python count.py [FILE ...] [--limit N] [--basis space|nospace]
exit : 0 = 제한 안(또는 제한 없음), 1 = 제한 초과, 2 = 입력 오류
"""
import argparse
import re
import sys
from pathlib import Path

# 메모만 있는 줄은 줄째로, 본문 사이에 낀 메모는 메모만 지운다(본문 줄바꿈은 남긴다).
COMMENT_LINE = re.compile(r"^[ \t]*<!--.*?-->[ \t]*(?:\n|$)", re.S | re.M)
COMMENT = re.compile(r"<!--.*?-->", re.S)
# `#`만 있는 빈 제목도 제목이다. `\s`를 쓰면 줄바꿈을 넘어 다음 본문 줄까지 지운다.
HEADING = re.compile(r"^#{1,6}(?:[ \t].*)?(?:\n|$)", re.M)
GAP = re.compile(r"\[확인 필요[^\]]*\]")
WS = re.compile(r"\s")
LOW_PCT = 90
BASIS_LABEL = {"space": "공백 포함", "nospace": "공백 제외"}

def body(text):
    text = text.replace("\r\n", "\n").replace("\r", "\n")
    text = COMMENT_LINE.sub("", text)
    text = COMMENT.sub("", text)
    text = HEADING.sub("", text)
    return text.strip()

def euckr_bytes(text):
    total, bad = 0, []
    for ch in text:
        try:
            total += len(ch.encode("cp949"))
        except UnicodeEncodeError:
            total += 2
            bad.append(ch)
    return total, bad

def count(text):
    b = body(text)
    euckr, bad = euckr_bytes(b)
    return {
        "space": len(b),
        "space_no_newline": len(b.replace("\n", "")),
        "nospace": len(WS.sub("", b)),
        "utf8": len(b.encode("utf-8")),
        "euckr": euckr,
        "non_euckr": sorted(set(bad)),
        "gaps": len(GAP.findall(b)),
    }

def judge(n, limit):
    if n > limit:
        return "over"
    if n * 100 < limit * LOW_PCT:
        return "under"
    return "ok"

def report(name, c, limit=None, basis="space"):
    lines = [
        f"== {name}",
        f"공백 포함 {c['space']}자 (줄바꿈 제외 {c['space_no_newline']}자) | 공백 제외 {c['nospace']}자"
        f" | UTF-8 {c['utf8']}B | EUC-KR {c['euckr']}B",
    ]
    if c["non_euckr"]:
        lines.append(f"! EUC-KR에 없는 문자 {''.join(c['non_euckr'])}: 2바이트로 셈, 옛 채용 사이트에서는 깨질 수 있음")
    if c["gaps"]:
        lines.append(f"! [확인 필요] {c['gaps']}곳 남음")
    status = None
    if limit:
        n = c[basis]
        status = judge(n, limit)
        rest = limit - n
        left = f"남음 {rest}자" if rest >= 0 else f"초과 {-rest}자"
        verdict = {"ok": "범위 안", "under": f"짧음(목표 {LOW_PCT}% 이상)", "over": "초과"}[status]
        lines.append(f"{BASIS_LABEL[basis]} 제한 {limit}자 중 {n}자 ({n * 100 // limit}%), {left}: {verdict}")
    lines.append("※ 사이트마다 세는 방식이 다릅니다(줄바꿈을 2자로 세는 곳도 있음). 제출 화면의 글자 수를 마지막으로 확인하세요.")
    return "\n".join(lines), status

def decode(data):
    """UTF-8(BOM 포함)로 읽고, 안 되면 Windows 메모장 ANSI(CP949)로 읽는다."""
    try:
        return data.decode("utf-8-sig")
    except UnicodeDecodeError:
        return data.decode("cp949")

def main(argv=None):
    if hasattr(sys.stdout, "reconfigure"):
        sys.stdout.reconfigure(encoding="utf-8", errors="replace")
    ap = argparse.ArgumentParser(description="자소서 글자 수 계산")
    ap.add_argument("files", nargs="*")
    ap.add_argument("--limit", type=int)
    ap.add_argument("--basis", choices=["space", "nospace"], default="space")
    a = ap.parse_args(argv)
    if a.limit is not None and a.limit <= 0:
        print("--limit은 1 이상이어야 합니다", file=sys.stderr)
        return 2
    sources = []
    if a.files:
        for f in a.files:
            try:
                sources.append((f, decode(Path(f).read_bytes())))
            except (OSError, UnicodeDecodeError) as e:
                print(f"읽을 수 없음: {f} ({e})", file=sys.stderr)
                return 2
    else:
        try:
            sources.append(("stdin", decode(sys.stdin.buffer.read())))
        except UnicodeDecodeError as e:
            print(f"읽을 수 없음: stdin ({e})", file=sys.stderr)
            return 2
    over = False
    for name, text in sources:
        out, status = report(name, count(text), a.limit, a.basis)
        print(out)
        over = over or status == "over"
    return 1 if over else 0

if __name__ == "__main__":
    sys.exit(main())
```

## File: plugins/jasoseo/skills/jasoseo/references/draft-rules.md
size: 4044
sha: 518115abf44e0a71b342ad5d1a2b046872be0627
upstream: https://github.com/leeandev/stop-slop-ko/blob/main/plugins/jasoseo/skills/jasoseo/references/draft-rules.md

````text
# 초안 규칙과 점검 리포트

## 사실 규칙

- 초안의 사실(시기, 인원, 역할, 행동, 숫자, 결과)은 고른 카드에 있는 것만 쓴다.
- 카드에 없는 사실이 문장에 필요하면 `[확인 필요: 무엇]`으로 남긴다. 그럴듯한 값으로 채우지 않는다.
- 숫자를 키우거나 역할을 부풀리지 않는다. "참여"를 "주도"로, "도왔다"를 "이끌었다"로 바꾸지 않는다.
- 회사 정보(사업, 제품, 인재상)는 사용자가 준 채용공고나 자료에 있는 것만 쓴다. 모르면 `[확인 필요: 회사의 ○○]`.
- 사용자가 "알아서 지어내 줘", "그럴듯하게 채워 줘"라고 해도 지어내지 않는다. 자소서 내용은 면접 꼬리 질문으로 확인되고 없는 경험은 그 자리에서 드러난다는 이유를 한 번 말한다. 그다음 빈 곳을 채울 질문을 한다.

## 말투 규칙

- 카드의 원문 인용과 배운 점(본인 말)에 나온 단어를 살린다.
- 사용자가 쓰지 않는 어려운 한자어나 업계 유행어를 새로 넣지 않는다.
- 종결과 문장 모양은 `jasoseo-style.md`를 따른다.

## 구조

- 첫 문장은 장면이나 사실로 시작한다. 각오, 명언, 문항 되풀이로 시작하지 않는다.
- 문항이 묻는 것에 첫 두세 문장 안에서 답한다.
- 한 문항에 카드 하나가 기본이다. 제한이 1,000자를 넘으면 두 개까지 쓴다.
- 마지막 문단은 그 경험을 지원 직무의 일과 잇는다. 교훈 한 줄로 끝내지 않는다.
- `[소제목]`은 사용자가 원하거나 회사 양식이 요구할 때만 넣는다.

## 초안 파일 양식

```markdown
# A사 백엔드 2번
<!-- 문항: 직무 관련 문제를 해결한 경험 / 제한: 공백 포함 700자 / 근거: S03 -->

본문
```

`count.py`는 `#` 제목 줄과 `<!-- -->` 메모를 빼고 본문만 센다.

## 글자 수

- 기준은 공백 포함. 문항이 공백 제외 기준이면 `--basis nospace`.
- 목표는 제한의 90~100%.
- 초안을 파일로 저장한 뒤 잰다. 짐작으로 세지 않는다.

```bash
python "${CLAUDE_SKILL_DIR}/scripts/count.py" jasoseo/A사-백엔드/q2.md --limit 700
```

- Windows에서 `python`이 없으면 `py`, macOS와 Linux는 `python3`.
- 길면 문장을 줄인다. 짧으면 카드에 있는 내용(어려웠던 점, 한 일의 단계)에서 더한다. 짧다고 새 사실을 만들지 않는다. 카드에 더할 내용이 없으면 사용자에게 묻는다.
- 카드로 90%를 못 채우고 사용자도 더 줄 내용이 없으면 짧은 초안 그대로 둔다. 같은 말을 되풀이하거나 꾸밈말로 늘리지 않는다. 점검 리포트의 글자 수 줄에 부족한 글자 수를 적고, 그 아래에 채울 방법을 적는다: 기억을 끌어낼 구체 질문 2~3개, 함께 쓸 수 있는 다른 카드, 채용 사이트가 최소 글자 수를 두는지 확인할 것.

## 점검 리포트

초안을 저장하면 같은 응답 안에서 초안 본문 전체와 이 리포트를 사용자에게 보여 준다. 파일만 만들고 끝내지 않는다. 사용자가 고친 본문을 줄 때마다 다시 낸다.

```
[점검] A사 백엔드 2번
- 글자 수: 공백 포함 662/700자 (94%), 범위 안
- 근거 없는 문장: 3문단 "팀을 이끌며" (S03에 리더 역할 없음)
- 확인 필요: 1곳 (기능 추가를 원한 팀원 수)
- 뻔한 문장: "소통의 중요성을 깨달았습니다" (S03의 본인 말로 바꾸기 제안)
- 문체: 위반 없음
```

- 글자 수는 `count.py` 출력을 옮긴다.
- 근거 없는 문장: 초안 문장마다 사실을 카드와 대조한다. 사용자가 고친 본문에 카드에 없는 사실이 생겼으면 지우라고 하지 않고 카드에 더할지 묻는다. 본인 경험일 수 있다.
- 뻔한 문장: 이름과 회사만 바꾸면 다른 지원자 글에 그대로 들어갈 문장.
- 문체: `jasoseo-style.md`의 패턴 위반.
- 항목이 없으면 `없음`이라고 적는다. 항목을 빼지 않는다.
````

## File: plugins/jasoseo/skills/jasoseo/references/jasoseo-style.md
size: 2058
sha: dc5523a0ee6aac7f8661b4a7cfb853466a8c1ea6
upstream: https://github.com/leeandev/stop-slop-ko/blob/main/plugins/jasoseo/skills/jasoseo/references/jasoseo-style.md

```text
# 자소서 문체 규칙

stop-slop-ko 플러그인이 없어도 이 파일만으로 적용한다. stop-slop-ko의 개조식(`~함/~됨`) 기본값은 자소서에 쓰지 않는다.

## 종결

- 기본은 `~습니다/~했습니다`. 사용자가 다른 종결(`~다`)로 쓴 본문을 주면 그것을 따른다.
- 한 글 안에서 종결을 섞지 않는다.
- 개조식과 명사 종결은 쓰지 않는다.

## 자소서 AI 티 패턴

| 패턴 | 예 | 고치는 방향 |
|---|---|---|
| 교훈형 마무리 | 이러한 경험을 통해 소통의 중요성을 배웠습니다 | 그 뒤 실제로 바뀐 행동 하나 |
| "~라고 생각합니다" 남발 | 한 글에 두 번 이상 | 사실이나 행동으로 말한다 |
| 회사 비전을 그대로 옮긴 포부 | 귀사의 글로벌 비전 실현에 기여하는 인재가 되겠습니다 | 첫해 맡을 일과 거기 쓸 경험 |
| 형용사 세 개 나열 | 성실하고 꼼꼼하며 책임감 있는 | 하나를 골라 장면으로 보인다 |
| 대구와 과장 | 단순한 과제가 아닌 도전이었습니다, 잊지 못할, 소중한 | 사실만 남긴다 |
| 문항 되풀이로 시작 | 제가 귀사에 지원한 동기는 ~입니다 | 장면이나 사실로 시작한다 |
| 명언, 사자성어로 시작 | "실패는 성공의 어머니"라는 말처럼 | 지운다 |
| 연결어 연달아 쓰기 | 또한, 더불어, 나아가, 이를 바탕으로 | 꼭 필요한 곳 하나만 |
| 번역투 | ~을 통하여, ~에 있어서, ~되어지다, ~로 인하여 | ~로, ~에서, ~되다, ~ 때문에 |
| 빈 강조어 | 정말, 매우, 굉장히, 진정한 | 지운다 |

## 부호

- em-dash(`—`), 장식 이모지, `★`를 쓰지 않는다.
- 따옴표는 사용자 말이나 실제 대사를 옮길 때만 쓴다.
- 조사 앞에 공백을 두지 않는다(`React와`).

## 판단 기준

고친 문장이 카드의 원문 인용과 같은 사람이 쓴 것처럼 읽히는지 본다. 더 매끄러워졌어도 사용자 말투가 사라졌으면 원래 표현으로 되돌린다.
```

## File: plugins/jasoseo/skills/jasoseo/references/question-bank.md
size: 3887
sha: 92e085b91726bf8fe10b25ee7debf6a2e0fbcbdd
upstream: https://github.com/leeandev/stop-slop-ko/blob/main/plugins/jasoseo/skills/jasoseo/references/question-bank.md

```text
# 문항 유형별 질문 세트

인터뷰는 한 번에 질문 1~2개. 아래 질문을 다 묻지 않는다. 카드(`story-card.md`)의 빈 칸을 채우는 데 필요한 것만 고른다.

## 문항 유형 판별

| 유형 | 문항에 자주 나오는 말 | 실제로 묻는 것 |
|---|---|---|
| 지원동기 | 지원한 이유, 왜 당사, 관심을 갖게 된 계기 | 이 회사와 직무를 고른 개인적 계기와 근거 |
| 성장과정 | 성장 과정, 가치관, 영향을 준 경험 | 지금 일하는 태도를 만든 구체적 장면 |
| 직무역량 | 직무 관련 경험, 역량, 전문성, 문제 해결 | 직무에 필요한 능력을 실제로 써 본 경험과 과정 |
| 갈등·실패 | 갈등, 어려움, 실패, 극복 | 그 상황에서 내가 한 판단과 행동, 결과를 받아들인 방식 |
| 입사 후 포부 | 입사 후, 목표, 포부, 기여 | 직무 이해를 바탕으로 한 첫 1~3년 계획 |
| 기타 | 사회 이슈, 협업, 창의, 자유 주제 | 문항 문장이 묻는 것을 한 줄로 다시 쓴다 |

한 문항이 두 유형에 걸치면(지원동기와 입사 후 포부) 둘 다 적고, 글자 수를 어떤 비율로 나눌지 사용자에게 묻는다.

## 공통 질문

1. 언제, 어디서였나요? 몇 명이 함께했나요?
2. 그때 맡은 역할은 무엇이었나요?
3. 직접 한 일을 순서대로 말해 주세요.
4. 결과를 숫자나 눈에 보이는 변화로 말하면요?
5. 가장 어려웠던 순간과 그때 고른 선택은요?
6. 다시 한다면 무엇을 바꾸겠어요?

## 유형별 추가 질문

### 지원동기
- 이 회사나 직무를 처음 알게 된 때는 언제인가요?
- 이 회사 제품이나 서비스를 직접 써 본 적이 있나요? 그때 무엇이 눈에 들어왔나요?
- 다른 회사가 아니라 여기여야 하는 이유를 하나만 고르면요?
- 채용공고에서 가장 끌린 문장은 무엇인가요?

### 성장과정
- 지금 일하는 방식에 영향을 준 사람이나 장면 하나를 떠올려 보세요.
- 그 일 전후로 달라진 점을 행동으로 말하면요?
- 그 습관이 최근 경험에서 드러난 예가 있나요?

### 직무역량
- 문제를 처음 알아챈 계기는요?
- 원인을 찾으려고 무엇을 열어 보거나 시도했나요?
- 쓴 도구, 기술, 방법은요?
- 처음 시도가 안 됐다면 다음에 무엇을 했나요?
- 이 경험이 지원 직무의 어떤 업무와 닮았나요?

### 갈등·실패
- 의견이 갈린 지점은 정확히 무엇이었나요? 상대는 왜 그렇게 생각했나요?
- 내가 먼저 한 행동은요?
- 결과가 좋지 않았다면 그 뒤에 무엇을 바꿨나요?
- 지금 같은 상황이 오면 첫 행동은요?

### 입사 후 포부
- 입사 첫해에 맡을 거라 생각하는 일은요?
- 그 일에 바로 쓸 수 있는 내 경험이나 기술은요?
- 3년 뒤 어떤 일을 맡고 싶나요? 그러려면 무엇을 더 익혀야 하나요?

## 되묻기

답에 아래 말이 나오는데 뒤에 구체적 행동이나 숫자가 없으면 "예를 들면요?"로 한 번 더 묻는다.

- 열심히, 최선을, 노력, 성실히
- 소통, 협업, 리더십, 책임감, 주도적
- 많이, 크게, 성공적으로, 개선
- 배웠다, 성장했다, 깨달았다

같은 내용은 두 번까지만 되묻는다. 그래도 구체적인 답이 없으면 카드에 `(구체 사례 없음)`으로 적고 넘어간다.

## 경험이 없다고 할 때

1. 범위를 넓혀 묻는다: 수업 과제, 팀 프로젝트, 아르바이트, 동아리, 봉사, 개인 공부, 취미 프로젝트.
2. 작은 일도 된다고 알려 준다: 손님 응대 방식을 바꾼 일, 과제 일정을 다시 짠 일.
3. 그래도 없으면 이 문항은 쓸 거리가 부족하다고 솔직히 말한다. 지어내지 않는다. 다른 문항부터 하자고 제안한다.
```

## File: plugins/jasoseo/skills/jasoseo/references/story-card.md
size: 2753
sha: bb436efda2e0ee3aa3ddb438303a3a2b128b1b67
upstream: https://github.com/leeandev/stop-slop-ko/blob/main/plugins/jasoseo/skills/jasoseo/references/story-card.md

````text
# 경험 카드와 경험 은행

## 파일 위치

- 경험 은행: 현재 작업 폴더의 `jasoseo/stories.md`. 없으면 만든다.
- 초안: `jasoseo/<회사>-<직무>/<문항번호>.md` (예: `jasoseo/A사-백엔드/q2.md`)
- 시작할 때 `jasoseo/stories.md`가 있으면 먼저 읽는다.

처음 만들 때 맨 위에 넣는 내용:

```markdown
# 경험 은행

<!-- jasoseo 플러그인이 관리하는 파일. 직접 고쳐도 된다. 주민등록번호, 연락처, 주소는 적지 않는다. -->
```

## 카드 양식

```markdown
## [S03] 졸업작품 서버 장애 대응
- 시기·상황: 2025.03~06, 4인 팀 졸업작품, 시연 2주 전 서버 다운
- 내 역할: 백엔드 담당
- 한 일: 로그 분석 → DB 커넥션 누수 발견 → 풀 설정 수정
- 결과(숫자): 응답 3초 → 0.4초, 시연 정상 진행
- 어려웠던 점·선택: 기능 추가 vs 안정화 중 안정화를 주장
- 배운 점(본인 말): "고치는 것보다 원인 찾는 게 오래 걸린다는 걸 알았다"
- 쓸 만한 문항: 직무역량, 갈등·실패
- 원문 인용: "새벽 3시에 로그 보다가 커넥션이 안 닫히는 걸 봤어요"
- 사용 이력: A사 백엔드 2번 문항 (2026-10)
```

## 칸 규칙

| 칸 | 규칙 |
|---|---|
| ID | `S01`부터 순번. 지운 번호는 다시 쓰지 않는다 |
| 제목 | 경험을 한 줄로. 꾸밈말 없이 |
| 시기·상황 | 연월, 규모(인원, 기간), 배경 |
| 내 역할 | 내가 맡은 것. 팀 전체가 한 일과 구분한다 |
| 한 일 | 내가 직접 한 행동을 순서대로 |
| 결과(숫자) | 숫자나 눈에 보이는 변화. 없으면 `(숫자 없음)` |
| 어려웠던 점·선택 | 갈림길과 내가 고른 쪽 |
| 배운 점(본인 말) | 사용자가 한 말을 큰따옴표로 그대로 |
| 쓸 만한 문항 | 문항 유형 이름 |
| 원문 인용 | 사용자 발화를 고치지 않고 1~3개. 초안 말투의 재료 |
| 사용 이력 | 이 카드를 쓴 회사, 문항, 연월 |

모르는 칸은 지우지 않고 `(미확인)`으로 둔다. 초안에 그 내용이 필요하면 `[확인 필요: ...]`로 남긴다.

## 관리 규칙

- 같은 경험이면 새 카드를 만들지 않고 기존 카드를 고친다. 제목과 시기가 비슷한 카드가 있으면 같은 경험인지 사용자에게 묻는다.
- 사용자가 말한 내용과 다르게 요약하지 않는다. 카드를 저장하거나 고치면 바뀐 칸을 사용자에게 보여 준다.
- 동료 실명이나 회사 내부 정보가 들어가면 일반 명칭(팀원 A, 고객사)으로 바꾸자고 제안한다.
- 초안을 쓴 뒤 사용 이력을 갱신한다. 같은 회사의 다른 문항에 같은 카드를 또 쓰려 하면 겹친다고 알려 준다.
````

## File: README.md
upstream: https://github.com/leeandev/stop-slop-ko/blob/main/README.md

````text
# stop-slop-ko

한국어 실무문서에서 "AI가 쓴 티"를 걷어내는 Claude Code 스킬.

회의록, 보고서, 제안서, 메일, pptx/docx/xlsx를 Claude에게 맡기면 em-dash(`—`), 공백 가운뎃점 나열(` · `), `★`와 이모지, `~을 통하여` 같은 번역투가 섞여 나옵니다. 이 스킬은 그런 문장을 처음부터 쓰지 않게 하고, 이미 쓴 문서는 내용을 건드리지 않고 문장부호와 번역투만 고칩니다.

[hardikpandya/stop-slop](https://github.com/hardikpandya/stop-slop)(영어)의 한국어판입니다. 규칙을 그대로 옮기지 않고 한국어 개조식 문서에 맞게 다시 만들었습니다.

> English summary: Korean version of [stop-slop](https://github.com/hardikpandya/stop-slop). A Claude Code plugin that keeps AI tells (em-dashes, spaced middot lists, decorative emoji, translationese) out of Korean business documents, with a scanner for docx/pptx/xlsx/md. See [English](#english) below.

## Before / After

```diff
- 본 과제는 사내 도서 대여 앱의 검색 구조를 개선하여 사용 편의성을 제고하고 — 대여 절차를 간소화하는 것을 목표로 함.
+ 사내 도서 대여 앱의 검색 구조를 바꿔 쓰기 편하게 하고 대여 절차를 줄이는 것을 목표로 함.

- - ★ 검색 속도 개선 · 예약 기능 추가 · 반납 알림 강화
+ - 검색 속도 개선, 예약 기능 추가, 반납 알림 강화

- - 기존 화면 대비 메뉴 구성이 상이하여 사용자 안내가 필요함
+ - 메뉴 구성이 기존 화면과 달라 사용자 안내가 필요함

- - 새 검색 엔진을 통하여 3,000 권 목록을 1초 안에 조회 가능해짐 ✅
+ - 새 검색 엔진으로 3,000권 목록을 1초 안에 조회 가능

- - 대여 기록 관리에 있어서 확인 절차가 추가되어짐
+ - 대여 기록 확인 절차 추가됨

- - React 와 SQLite 를 사용함
+ - React와 SQLite를 사용함

- 이번 개선은 사내 독서 문화 활성화의 핵심이라 할 수 있다.
+ 이번 개선으로 사내 도서를 찾고 빌리기가 쉬워짐.
```

포함된 스캐너 `slop_scan.py`로 두 문서를 검사한 결과입니다. 문서 원본은 [`examples/`](examples/)에 있고, 출력에서 항목별 조치 안내 줄은 생략했습니다.

```
== before.md: WARN 9, INFO 1
  [WARN] EMDASH @ L5: …검색 구조를 개선하여 사용 편의성을 제고하고 — 대여 절차를 간소화하는 것을 목표로 함.
  [WARN] STAR @ L9: - ★ 검색 속도 개선 · 예약 기능 추가 · 반납…
  [WARN] MIDDOT_SPACED2 @ L9: - ★ 검색 속도 개선 · 예약 기능 추가 · 반납 알림 강화
  [INFO] TL_DAEBI_SANGI @ L10: - 기존 화면 대비 메뉴 구성이 상이하여 사용자 안내가 필요함
  [WARN] EMOJI @ L11: …,000 권 목록을 1초 안에 조회 가능해짐 ✅
  [WARN] TL_TONGHAYEO @ L11: - 새 검색 엔진을 통하여 3,000 권 목록을 1초 안에 조회 가능해…
  [WARN] TL_ISSEO @ L12: - 대여 기록 관리에 있어서 확인 절차가 추가되어짐
  [WARN] TL_DOEEOJI @ L12: - 대여 기록 관리에 있어서 확인 절차가 추가되어짐
  [WARN] PARTICLE_SPACE @ L13: - React 와 SQLite 를 사용함
  [WARN] TL_HALSUITDA @ L17: 이번 개선은 사내 독서 문화 활성화의 핵심이라 할 수 있다.
RESULT: FAIL (WARN 9)

== after.md: WARN 0, INFO 0
RESULT: PASS (WARN 0)
```

## 영어판 규칙을 그대로 쓰면 안 되는 이유

영어 stop-slop은 "능동태로, 짧게, 직설적으로"를 권합니다. 이걸 한국어 보고서에 그대로 적용하면 `정의함`이 `정의한다`로 바뀌고, 오히려 더 어색해집니다.

- **`~함/~됨` 개조식은 슬롭이 아닙니다.** 한국 공식문서의 정상 문체입니다. 정제 모드는 종결어미를 절대 바꾸지 않습니다.
- **한국어 슬롭의 신호는 문장부호, 번역투, 상투구입니다.** em-dash, 공백 가운뎃점 나열, `★`, `~에 있어서`, `~되어지다`, 조사 앞 공백(`React 와`) 같은 것들입니다.
- **영어판의 "3항목 나열 금지", "not X but Y 금지"는 한국어 요구사항·스펙 열거에 쓰지 않습니다.** 그건 문체가 아니라 내용입니다.
- **붙임 복합어는 보존합니다.** `성능·품질`, `원천·대상`의 가운뎃점은 나열 구분자가 아닙니다.

## 들어 있는 것

이 저장소는 Claude Code 플러그인 마켓플레이스이고, 플러그인 세 개가 들어 있습니다. 필요한 것만 설치하면 됩니다.

| 플러그인 | 하는 일 |
|---|---|
| **stop-slop-ko** | 한국어 문서를 쓸 때(생성), 다듬을 때(정제), 다른 문서 톤에 맞출 때(톤 맞춤) 문체 규칙을 적용. 리포트, 에세이, 블로그 같은 서술형 글도 다룸. 스캐너와 자동 적용 훅 포함 |
| **stakeholder-brief** | 설계서, 분석 문서, 진행 현황을 경영진, 고객 PM, 타팀 개발자 등 정해진 청중 눈높이로 다시 구성해 HTML/DOCX/MD로 출력. 마지막 문체 정리는 stop-slop-ko에 맡김 |
| **jasoseo** | 자소서를 대신 지어 쓰지 않고, 인터뷰로 본인 경험을 꺼내 경험 은행에 모은 뒤 본인 말투로 초안을 씀. 글자 수 계산기 포함 |

### stop-slop-ko

세 가지 모드가 있습니다.

- **생성 모드**: 회의록, 보고서, 메일을 새로 쓸 때 처음부터 규칙대로 씁니다. 파일을 만든 뒤 스캐너로 검사하고 결과를 `PASS`/`FAIL`로 보고합니다.
- **정제 모드**: 이미 있는 문서에서 부호, 번역투, 상투구만 고칩니다. 숫자, 요구사항 번호, 기술용어, 종결어미는 그대로 둡니다.
- **톤 맞춤 모드**: 동료가 쓴 다른 장이나 기존 승인 문서의 문체(종결어미, 부호, 목록기호 등 6가지 축)를 뽑아 내 글을 거기에 맞춥니다.

**스캐너** `slop_scan.py`: docx(본문, 표, 머리글, 각주), pptx(슬라이드 순서, 표), xlsx(셀, 도형), md, txt, html을 문단 단위로 검사합니다. 파이썬 표준 라이브러리만 씁니다.

```bash
python plugins/stop-slop-ko/skills/stop-slop-ko/scripts/slop_scan.py 보고서.docx --info
```

- exit 0 = PASS, 1 = FAIL(WARN 있음), 2 = 입력 오류
- 상투구, 과한 명사화, 기계적인 3단 병렬은 스캐너가 못 잡습니다. 그 부분은 스킬이 읽고 판단합니다.

**내가 쓴 글 다듬기**: 리포트, 과제, 에세이, 블로그 글, 칼럼처럼 문단으로 이어 쓰는 글도 같은 세 모드로 다룹니다. 개조식으로 바꾸지 않고 문단 서술을 유지하며, 다듬을 때 `~다`와 `~습니다` 같은 종결어미는 그대로 둡니다. 서술형 글에 자주 끼는 상투구를 걷어냅니다.

| 전 | 후 |
|---|---|
| 오늘은 Docker 볼륨에 대해 알아보겠습니다. 정말 많은 분들이 헷갈려 하시는 부분입니다. | (삭제) 본론 "컨테이너를 지우면 안에 쓴 파일도 함께 사라집니다."부터 시작 |
| 기록이 남으면서 결정이 뒤집히는 일이 줄었다고 생각한다. … 이번 경험을 통해 소통의 중요성을 깨달았다. | 기록이 남으면서 결정이 뒤집히는 일이 줄었다. |

스캐너에 `--prose`를 붙이면 서술형 신호도 검사합니다.

```bash
python plugins/stop-slop-ko/skills/stop-slop-ko/scripts/slop_scan.py 리포트.md --prose --info
```

- INFO(위치만 알림): 교훈형 마무리("~의 중요성을 깨달았다"), "단순한 ~이 아닌"·"~에 그치지 않고", 명언으로 시작하는 첫 문단, 빈 강조어("정말", "매우"), 리포트·블로그 상투구
- WARN(글 전체 기준): "~라고 생각한다"(생각된다·생각이 든다·본다 포함)가 3회 이상이면서 1,000자당 1회 이상, 연결어("또한", "나아가")로 시작하는 문단이 3개 이상이면서 전체 문단의 25% 이상. 긴 글일수록 기준이 올라가서 정상적인 빈도는 걸리지 않습니다
- 사실, 수치, 출처를 지어내지 않습니다. 고칠 문장에 근거가 없으면 지우거나 묻습니다

**자동 적용 훅**: "회의록 만들어줘", "보고서 pptx로", "AI 티 빼줘" 같은 요청을 감지하면 스킬을 쓰라고 Claude에게 알려 줍니다. "경영진용", "공유용", "브리프"처럼 청중이 정해진 요청이면 stakeholder-brief를 먼저 쓰라고 안내합니다. "리포트 써줘", "블로그 글 다듬어줘" 같은 서술형 요청이면 서술형 문체로 안내합니다. 자소서 요청은 jasoseo가 설치돼 있으면 jasoseo에 맡기고, 없으면 서술형 글로 다룹니다. 요청에 "stop-slop 빼고"나 "원문 그대로"를 넣으면 끼어들지 않습니다.

### stakeholder-brief

- 청중 4종(경영진/스폰서, 고객 PM, 저년차·타팀 개발자, 고객 개발자)별로 전문용어를 얼마나 풀지, 어디까지 부록으로 내릴지 정합니다.
- 문서 유형은 두 가지입니다. 진행과 합의를 전하는 **합의형**(요약 → 현황 → 합의된 결정 → 미결 → 다음 단계), 도구나 절차를 알려 주는 **가이드형**(한눈에 보기 → 왜 필요한가 → 설치 → 사용 예시 → 한계)입니다.
- **원문에 없는 진척률, 일정, 결정은 지어내지 않습니다.** 없으면 "미정", "확인 필요"로 남깁니다.

### jasoseo

자소서를 Claude에게 통째로 맡기면 누구나 쓸 수 있는 글이 나옵니다. 기업이 거르는 글이 바로 그런 글입니다. jasoseo는 반대로 갑니다.

- **인터뷰**: 문항 유형(지원동기, 성장과정, 직무역량, 갈등·실패, 입사 후 포부)에 맞춰 한 번에 1~2개씩 묻습니다. "열심히 했다", "소통했다" 같은 답에는 "예를 들면요?"로 다시 묻습니다.
- **경험 은행**: 답은 작업 폴더의 `jasoseo/stories.md`에 경험 카드로 쌓입니다. 다음 회사 자소서에서 다시 꺼내 씁니다.
- **초안**: 카드에 있는 사실과 본인이 한 말로만 씁니다. 카드에 없는 숫자나 역할은 만들지 않고 `[확인 필요: ...]`로 비워 둡니다.
- **글자 수**: `count.py`가 공백 포함, 공백 제외, 바이트까지 셉니다. 초안은 제한의 90~100%에 맞춥니다.
- **점검 리포트**: 근거 없는 문장, 뻔한 문장, 문체 문제를 짚습니다.

```
[점검] A사 백엔드 2번
- 글자 수: 공백 포함 662/700자 (94%), 범위 안
- 근거 없는 문장: 3문단 "팀을 이끌며" (S03에 리더 역할 없음)
- 확인 필요: 1곳 (기능 추가를 원한 팀원 수)
- 뻔한 문장: "소통의 중요성을 깨달았습니다" (S03의 본인 말로 바꾸기 제안)
- 문체: 위반 없음
```

AI 검사기를 피하는 도구가 아닙니다. 본인 경험과 말투로 쓴 글이 면접까지 버팁니다. stop-slop-ko 없이 혼자 동작합니다.

## 설치

Claude Code 입력창에 한 줄씩 입력합니다.

**1단계. 마켓플레이스 등록 (필수, 한 번만)**

이 저장소를 플러그인 목록으로 등록합니다. 아직 아무것도 설치되지 않습니다.

```
/plugin marketplace add leeandev/stop-slop-ko
```

**2단계. 필요한 플러그인 설치 (골라서)**

| 이렇게 쓰려면 | 설치할 것 |
|---|---|
| 한국어 문서의 AI 티만 빼고 싶다 (대부분 이것) | stop-slop-ko만 |
| 경영진용, 고객 PM용 같은 공유 문서도 만들고 싶다 | 둘 다 |
| 자소서를 쓰려고 한다 | jasoseo (단독으로 동작) |

stop-slop-ko 설치 (기본):

```
/plugin install stop-slop-ko@stop-slop-ko
```

stakeholder-brief 설치 (공유 문서도 만들 때만 추가):

```
/plugin install stakeholder-brief@stop-slop-ko
```

jasoseo 설치 (자소서를 쓸 때):

```
/plugin install jasoseo@stop-slop-ko
```

stakeholder-brief만 따로 설치해도 동작은 하지만, 마지막 문체 정리를 stop-slop-ko에 맡기도록 만들어져 있어서 둘 다 설치하는 것을 권장합니다.

설치가 끝나면 Claude Code를 재시작합니다. `/plugin`을 열면 설치된 플러그인을 확인할 수 있습니다.

**요구 사항**
- 스캐너와 훅: Python 3.8 이상(macOS/Linux는 `python3`, Windows는 `python`을 찾아 씁니다)
- 자동 적용 훅은 `sh`로 실행됩니다. Windows는 Git Bash가 필요합니다(Git for Windows에 포함). Git Bash가 없으면 훅만 동작하지 않고, 스킬과 스캐너는 그대로 쓸 수 있습니다
- pptx 정제 레시피: `pip install python-pptx`
- DOCX 출력: `pip install python-docx`

## 사용 예

```
주간 회의록 docx로 만들어줘. 녹취는 meeting.txt
이 제안서 3장 AI 티 빼줘
이 블로그 글 다듬어줘. 파일은 post.md
14~17장을 1~13장 톤에 맞춰줘
이 설계 문서 경영진용 1페이지 브리프로 정리해줘
/stop-slop-ko:stop-slop-ko 보고서.md
자소서 써줘. A사 백엔드 2번 문항, 공백 포함 700자
/jasoseo:jasoseo
```

플러그인 스킬은 `플러그인:스킬` 이름으로 직접 부릅니다(`/stop-slop-ko:stop-slop-ko`, `/stakeholder-brief:stakeholder-brief`). 대부분은 위처럼 평소 말투로 요청하면 알아서 쓰입니다.

## English

**stop-slop-ko** is a Claude Code plugin marketplace with three plugins for Korean business writing.

- **stop-slop-ko**: removes AI tells from Korean documents. It has three modes: write (generate clean text from the start), de-slop (fix punctuation and translationese only, without touching facts or sentence endings), and tone-match (copy the style signature of a reference document). It also handles prose (reports, essays, blog posts, columns) without changing the sentence endings the author chose. It ships with `slop_scan.py`, a stdlib-only scanner for docx/pptx/xlsx/md/txt/html (`--prose` adds length-aware checks for prose clichés), and a prompt hook that routes document requests to the skill.
- **stakeholder-brief**: rewrites dev material (design docs, status, analyses) for one audience at a time (executi
````
