@tienne/gestalt 0.54.0 → 0.56.0

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 (28) hide show
  1. package/CLAUDE.md +2 -35
  2. package/dist/package.json +5 -3
  3. package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +5 -4
  4. package/dist/plugin/role-agents/_shared/references/author-voice.md +8 -8
  5. package/dist/plugin/role-agents/code-review-responder/AGENT.md +3 -3
  6. package/dist/plugin/role-agents/code-review-writer/AGENT.md +6 -4
  7. package/dist/plugin/role-agents/humanize-monolith/AGENT.md +4 -2
  8. package/dist/plugin/role-agents/jira-writer/AGENT.md +1 -1
  9. package/dist/plugin/role-agents/slack-messenger/AGENT.md +1 -1
  10. package/dist/plugin/skills/_shared/proactive-routing.md +46 -0
  11. package/dist/plugin/skills/agent/SKILL.md +1 -11
  12. package/dist/plugin/skills/pr/SKILL.md +12 -1
  13. package/dist/src/humanize/index.d.ts +1 -1
  14. package/dist/src/humanize/index.d.ts.map +1 -1
  15. package/dist/src/humanize/index.js +1 -1
  16. package/dist/src/humanize/index.js.map +1 -1
  17. package/package.json +5 -3
  18. package/plugin/.codex-plugin/plugin.json +1 -1
  19. package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +5 -4
  20. package/plugin/role-agents/_shared/references/author-voice.md +8 -8
  21. package/plugin/role-agents/code-review-responder/AGENT.md +3 -3
  22. package/plugin/role-agents/code-review-writer/AGENT.md +6 -4
  23. package/plugin/role-agents/humanize-monolith/AGENT.md +4 -2
  24. package/plugin/role-agents/jira-writer/AGENT.md +1 -1
  25. package/plugin/role-agents/slack-messenger/AGENT.md +1 -1
  26. package/plugin/skills/_shared/proactive-routing.md +46 -0
  27. package/plugin/skills/agent/SKILL.md +1 -11
  28. package/plugin/skills/pr/SKILL.md +12 -1
package/CLAUDE.md CHANGED
@@ -31,6 +31,7 @@ pnpm tsx bin/gestalt.ts spec <session-id>
31
31
  pnpm tsx bin/gestalt.ts status
32
32
  pnpm tsx bin/gestalt.ts init # gestalt.json + code graph + post-commit hook
33
33
  pnpm verify:rules # 룰북과 에이전트 문서의 룰 ID·심각도 정합 검사
34
+ pnpm build:output-style # 룰북 → ~/.claude/output-styles/tienne-voice.md 생성
34
35
  pnpm tsx bin/gestalt.ts humanize-check --before a.md --after b.md --register chat
35
36
  ```
36
37
 
@@ -54,41 +55,7 @@ pnpm tsx bin/gestalt.ts humanize-check --before a.md --after b.md --register cha
54
55
 
55
56
  ## Role Agent 자동 라우팅
56
57
 
57
- 아래 상황에서는 사용자가 명시적으로 에이전트를 지정하지 않아도 해당 에이전트를 proactively 사용한다. `/agent [이름] "태스크"` 또는 `ges_agent` MCP 도구로 호출한다.
58
-
59
- | 상황 | 에이전트 |
60
- |------|---------|
61
- | 영상/비디오 URL이 포함되거나 "요약해줘" 요청 | `video-summarizer` |
62
- | 번역투·AI 말투·어색한 한국어 교정 요청 | `humanize-monolith` (윤문 모드) |
63
- | 고치지 말고 AI 티만 짚어달라는 요청 ("이거 AI 같아?", "슬롭인지 봐줘", "패턴만 짚어줘") | `humanize-monolith` (탐지 모드 — 원문 무수정, 패턴 인용만, 저자 판정·등급 금지) |
64
- | README, API 문서, 가이드, 개발자 문서 작성 | `technical-writer` |
65
- | 발표 슬라이드 콘텐츠·문구·데이터 요약·발표 노트 작성 | `presentation-writer` |
66
- | 슬라이드 Reveal.js 구조·템플릿·비주얼 디자인 자문 | `presentation-designer` |
67
- | 발표자료·슬라이드·프레젠테이션 제작 요청 ("발표자료 만들어줘", "슬라이드 만들어줘", "피치덱") | `presentation` 스킬 사용 (presentation-writer 콘텐츠 → 승인 단계 → presentation-designer 디자인 → Reveal.js HTML) |
68
- | 시스템 설계, 아키텍처 리뷰, 설계 패턴 | `architect` |
69
- | 보안 취약점, 인증/인가, 시크릿 노출 검토 | `security-reviewer` |
70
- | 성능 병목, N+1, 메모리 누수 분석 | `performance-reviewer` |
71
- | 코드 가독성, SOLID, 에러 처리 리뷰 | `quality-reviewer` |
72
- | 테스트 케이스, 엣지 케이스, QA | `qa-engineer` |
73
- | UX 문구 작성·교정, 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피 | `ux-writer` |
74
- | 슬랙·메신저 메시지 작성 또는 딱딱한/AI스러운 초안을 본인 말투로 다듬기 | `slack-messenger` |
75
- | 슬랙 메시지 전송·예약 발송 요청 ("~라고 보내줘", "공지해줘", "예약 발송해줘") | `slack-send` 스킬 사용 (내부적으로 slack-messenger 다듬기 → 승인 단계 → 전송) |
76
- | 지라 티켓 본문 작성·구조화 (제목, 설명, 완료 조건, 이슈타입 추천) | `jira-writer` |
77
- | 지라 티켓 생성 요청 ("티켓 만들어줘", "이슈 생성해줘", "지라에 올려줘") | `jira-create` 스킬 사용 (내부적으로 jira-writer 구조화 → 프로젝트·필드 확정 → 승인 단계 → createJiraIssue) |
78
- | UI, React, 접근성, 컴포넌트 설계 | `frontend-developer` |
79
- | UI·React 코드 리뷰, 접근성·번들 최적화 검토 | `frontend-reviewer` |
80
- | API, DB, 인증, 서버 로직 | `backend-developer` |
81
- | CI/CD, 인프라, 모니터링 | `devops-engineer` |
82
- | 요구사항 정리, 로드맵, 유저 스토리 | `product-planner` |
83
- | 성과 분석·KPI 해석·분기 성과 보고·회고 리포트 | `impact-writer` |
84
- | 제안서, RFC, 의사결정 메모 등 설득·합의용 기획 산문 | `impact-writer` |
85
- | 성과 보고서·제안서·RFC·회고 작성 요청 ("성과 보고서 써줘", "제안서 작성", "RFC 써줘") | `brief` 스킬 사용 |
86
- | 기술 분석, 벤치마크, 사례 조사 | `researcher` |
87
- | 내 PR에 달린 리뷰 코멘트 답변 본문 작성 (반영·대안·보류·질문) | `code-review-responder` |
88
- | PR·브랜치·커밋 코드 리뷰 요청 | `/review` 스킬 사용 |
89
- | 받은 리뷰 반영·답글 게시 요청 ("리뷰 반영해줘", "리뷰 코멘트에 답해줘", "받은 리뷰 처리해줘") | `review-reply` 스킬 사용 (스레드 수집 → 유형 분류 승인 → 수정·커밋 → 답글 승인 → 게시) |
90
- | PR 작성·생성 요청 ("PR 만들어줘", "PR 작성해줘", "PR 올려줘") | `gestalt:pr` 스킬 사용 |
91
- | 실행 태스크를 외부 런타임 워커로 뿌리는 요청 ("orca로 실행", "codex로 실행", "워커 띄워서 실행") | `dispatch` 스킬 사용 (런타임 감지 → 같은 워크트리에 터미널 → worker_done 대기 → ready 재계산). 런타임 없으면 execute의 기본 병렬 경로 |
58
+ 아래 상황에서는 사용자가 명시적으로 에이전트를 지정하지 않아도 해당 에이전트를 proactively 사용한다. 기준 표는 [`plugin/skills/_shared/proactive-routing.md`](./plugin/skills/_shared/proactive-routing.md)에 있다 — 이 파일은 플러그인과 함께 배포되므로 다른 레포에 설치된 세션도 같은 표를 본다. `/agent [이름] "태스크"` 또는 `ges_agent` MCP 도구로 호출한다.
92
59
 
93
60
  ## Project Structure
94
61
  ```
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.54.0",
3
+ "version": "0.56.0",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -20,7 +20,7 @@
20
20
  "scripts": {
21
21
  "dev": "tsx bin/gestalt.ts",
22
22
  "build": "tsc",
23
- "postbuild": "rm -rf dist/plugin && mkdir -p dist/plugin && cp -r plugin/agents plugin/role-agents plugin/review-agents plugin/personas plugin/skills dist/plugin/ && cp -r schemas dist/ && cp package.json dist/ && chmod +x dist/bin/gestalt.js && pnpm run verify:plugin && pnpm run verify:rules",
23
+ "postbuild": "rm -rf dist/plugin && mkdir -p dist/plugin && cp -r plugin/agents plugin/role-agents plugin/review-agents plugin/personas plugin/skills dist/plugin/ && cp -r schemas dist/ && cp package.json dist/ && chmod +x dist/bin/gestalt.js && pnpm run verify:plugin && pnpm run verify:rules && pnpm run verify:output-style",
24
24
  "verify:plugin": "tsx scripts/verify-plugin-assets.ts",
25
25
  "prepublishOnly": "pnpm build",
26
26
  "test": "vitest run",
@@ -35,7 +35,9 @@
35
35
  "version:sync": "tsx scripts/sync-version.ts",
36
36
  "postversion": "pnpm run version:sync",
37
37
  "verify:rules": "tsx scripts/verify-rule-refs.ts",
38
- "humanize:baseline": "tsx scripts/humanize-baseline.ts"
38
+ "humanize:baseline": "tsx scripts/humanize-baseline.ts",
39
+ "build:output-style": "tsx scripts/build-output-style.ts",
40
+ "verify:output-style": "tsx scripts/build-output-style.ts --dry-run"
39
41
  },
40
42
  "dependencies": {
41
43
  "@anthropic-ai/sdk": "^0.39.0",
@@ -48,7 +48,7 @@
48
48
  |---|---|---|---|
49
49
  | B-1 | 한글 + 괄호 영어 매번 ("~(Sovereign AI)" 처럼) | S2 | 첫 등장만 병기, 이후 한글만 |
50
50
  | B-2 | 영어 어휘 직역 가능한데 그대로 | S2 | 한국어로 옮기되 업계 표준은 유지 |
51
- | B-3 | 안 굳어진 영어 구·단어 음차 표기 ("소스 오브 트루스"), 그 음차를 약어로 우회한 표기(`SSOT`·`SoT`) | S1 | 한글 의역 + 첫 등장만 원어 괄호 병기("진실의 원천(source of truth)"), 이후 한글만. 단 위 "굳어진 음차 화이트리스트"에 있는 정착어는 Do-NOT — of/and 등 기능어까지 통째 음차한 구(룩 앤 필·로우 행잉 프룻)가 최우선 대상 |
51
+ | B-3 | 안 굳어진 영어 구·단어 음차 표기 ("소스 오브 트루스"), 그 음차를 약어로 우회한 표기(`SSOT`·`SoT`) | S1 | 한글 의역 + 첫 등장만 원어 괄호 병기("기준 문서(source of truth)", "단일 기준점(source of truth)" 등), 이후 한글만. 단 위 "굳어진 음차 화이트리스트"에 있는 정착어는 Do-NOT — of/and 등 기능어까지 통째 음차한 구(룩 앤 필·로우 행잉 프룻)가 최우선 대상. 무엇을 가리키는지 보고 고르는 표는 `style-guide.md` §single source of truth를 뭐라고 쓸까를 따른다 |
52
52
  | B-4 | 영어 개념을 어색하게 옮긴 조어("생산처" ← producer, "응답처") | S2 | 억지 신조어 대신 이미 쓰이는 말로. 코드 맥락이면 "호출부"·"사용처". **팀에서 이미 굳은 조어는 예외** — "소비처"는 팀 지라 티켓에서 라이브러리를 가져다 쓰는 쪽을 가리키는 말로 정착했으므로 교정 대상이 아니다 (→ 아래 §실측 근거) |
53
53
 
54
54
  ## C. 구조적 AI 패턴
@@ -62,12 +62,13 @@
62
62
  | C-10 | 콜론 부제 헤딩 "X: Y" 반복 | S1 | 콜론 뒤를 버리고 앞부분만 남긴다. **더 좋은 부제로 바꾸지 않는다** — 부제를 갈아끼우면 패턴이 그대로 남는다. 앞부분만으로 뜻이 안 서면 평서 헤딩 한 문장으로 |
63
63
  | C-11 | 연결어미 뒤 쉼표 (-고/-며/-지만/-며서/-아서/-어서 직후 쉼표) | S1 | 쉼표 제거. 6+회=강한 신호. KatFish 4.84배 분리도 |
64
64
  | C-12 | 가운뎃점(·) 나열 남발 — 본문 산문에서 "A·B·C"로 항목 압축 | S1 | 쉼표나 구어 연결로 풀기("A, B, C" / "A랑 B하고 C"). 사람은 산문에서 가운뎃점을 거의 안 쓴다. 단 표 안 압축, 용어 목록, 굳어진 합성어("입출력")는 예외 |
65
+ | C-13 | 같은 문단에서 같은 수치를 다른 단위로 반복 표기("3%" 다음 "3할") — 참조 표현의 숫자만 바꿔 재사용하며 단위를 못 맞춘 경우 | S2 | 단위를 하나로 통일한다. 빌려 쓴 수치 예시는 값과 단위를 통째로 새로 쓴다("3%인데 3할이" → "3%인데 3%가") |
65
66
 
66
67
  ## D. AI 특유의 관용구 (Signature Phrases)
67
68
 
68
69
  | ID | 패턴 | 심각도 | 처방 |
69
70
  |---|---|---|---|
70
- | D-1 | 결산 피벗 표현 "결론적으로/따라서/이를 통해/그러므로/요약하면/정리하면" | S1 | 3회 초과 1~2건 다른 종결로 치환, 나머지 삭제 |
71
+ | D-1 | 결산 피벗 표현 "결론적으로/이를 통해/요약하면/정리하면/종합하면" | S1 | 문단 결론을 대신하는 피벗이면 삭제하고 앞뒤 문장을 직결한다. 논리 연결만 하는 "따라서/그러므로"는 반복되거나 결산 리듬을 만들 때만 줄인다 |
71
72
  | D-2 | "시사하는 바가 크다/주목할 만하다" | S1 | 원문에 근거가 있으면 그 근거로 대체, 없으면 삭제. **새 결론을 지어내 붙이지 않는다** |
72
73
  | D-3 | "본질적으로/핵심적으로" | S1 | 삭제. 다른 부사로 갈아끼우지 말고 그냥 뺀다 |
73
74
  | D-4 | hype 어휘(파격적·압도적·강력한·획기적·치명적) 3회+ | S1 | 원문에 수치·사실이 있으면 그걸로 환원, **없으면 수치를 만들지 말고 수식어만 삭제** |
@@ -117,6 +118,7 @@
117
118
  | I-3 | "~다는 뜻이다/~다는 의미다" 결말 | S2 | 본문에 풀어 쓰기 |
118
119
  | I-4 | 권고형 결말 "~해야 한다·~합니다" 반복 | S2 | 평서·단언으로 |
119
120
  | I-5 | 사무투 분류사 "~ 건/해당 건/이번 건/그 건", 코드·문서 용어를 대화에 그대로("주석 건") | S2 / **대화·리뷰 S1** | 구체 명사로 풀기("Copilot이 짚은 주석 건" → "Copilot이 남긴 코멘트"). "건"은 공문서투 분류사라 대화에서 어색하다 |
121
+ | I-6 | 측량·사무투 명사 "실측·계측·산출·오탐" 등으로 판정·근거를 명사 하나로 압축 | S2 / **대화·리뷰 S1** | 동사로 풀어 말하기("레포 실측으로 1444개 중" → "레포 뒤져보니 1444개 중", "이건 오탐이에요" → "이건 잘못 감지한 거예요"). "잘못 걸리다"처럼 안 붙는 동사로 도망가지 말고 원래 짝이 맞는 동사(감지하다·측정하다)에 "잘못"을 붙인다 |
120
122
 
121
123
  ## J. 시각 장식
122
124
 
@@ -136,7 +138,7 @@
136
138
  2. **변경률**: 30% 이하인가 (50% 초과는 작업 중단)
137
139
  3. **장르 이탈 없음**: 칼럼이 에세이나 문학으로 변하지 않았는가, 리포트가 블로그체로 떨어지지 않았는가
138
140
  4. **말투 보존**: 원문 격식체면 결과도 격식체. 평어체로 떨어뜨리지 않는다
139
- 5. **잔존 S1 패턴 0건**: A-1, A-3, A-7, A-8, A-16, B-3, C-5, C-8, C-10, C-11, C-12, D-1~D-6, H-1, H-3, J-2가 남아있지 않은가 (대화·리뷰 말투면 A-2, A-5, F-4, F-5, F-6, F-7, I-1, I-5도 S1로 포함)
141
+ 5. **잔존 S1 패턴 0건**: A-1, A-3, A-7, A-8, A-16, B-3, C-5, C-8, C-10, C-11, C-12, D-1~D-6, H-1, H-3, J-2가 남아있지 않은가 (대화·리뷰 말투면 A-2, A-5, F-4, F-5, F-6, F-7, I-1, I-5, I-6도 S1로 포함)
140
142
  6. **인공 표현 자제**: 원문에 없던 비유, 수사, 문학적 표현을 윤문 과정에서 임의로 추가하지 않았는가
141
143
  7. **삭제 처방 준수**: D-2, D-3, D-4, D-6, C-10을 재작성으로 처리하지 않았는가. 마무리 문장, 부제, 수식어를 지우는 대신 더 그럴듯한 것으로 갈아끼운 자리가 없는가
142
144
 
@@ -195,4 +197,3 @@ AI 생성 산문 60편(모델 3종)과 2022년 이전 발행이 확인된 한국
195
197
  - **D**: S1 잔존 3+ 또는 변경률 50% 초과 — 작업 중단 권고
196
198
 
197
199
  > v2.0 신규/보강은 A-7, A-15, A-16, A-18, A-19, E-2, E-7, F-4 **8건 (A-17 보류)**. 학술 인용 전문은 `references/scholarship.md`. post-editese 3축 지표는 본 룰북 미반영(metric only 트랙). A-17 무정물, 추상명사 '-들'은 학술 근거(전영철 2007·곽은주·진실로 2011) 강하나 외부 회차(2026-05-07 위키 6편)에서 양성 0건 — NMT 원본 출력 회차 후 v2.1에서 동일 ID로 재평가.
198
-
@@ -63,7 +63,7 @@
63
63
  6. **친근체, 물결, 이모지를 자연스럽게.** "~네요!", "~어요~", 🙏 😀 👍 — 과하지 않게 한 코멘트에 1개 안팎.
64
64
  7. **수정 제안은 코드/토큰을 그대로 제시.** GitHub `​```suggestion` 블록이나 `tone={'neutralSecondary'}`처럼 값까지.
65
65
 
66
- ### 실제 예시 (그대로 학습verbatim)
66
+ ### 실제 예시 (패턴 참고문장 복붙 금지)
67
67
 
68
68
  ```
69
69
  routeName 보다는 allRoutes[routeName].link 로 subRoute.link 처리 하는 게 좋아보입니다.
@@ -100,10 +100,10 @@ ghost 는 button의 ghost variant 를 위한 토큰입니다.
100
100
  ### 본인 PR에 답할 때 / 수정 반영
101
101
 
102
102
  ```
103
- [fd85be2](커밋링크) 에 반영했습니다.
103
+ [fd85be2](커밋링크)에 반영했습니다.
104
104
  ```
105
105
  ```
106
- 오 그러네요 감사합니다. [6dbfaf7](커밋링크) 에서 반영해뒀습니다.
106
+ 오 그러네요 감사합니다. [6dbfaf7](커밋링크)에서 반영해뒀습니다.
107
107
  ```
108
108
  - 반영은 "커밋 링크 + ~에 반영했습니다/처리했습니다/수정했습니다" 형태로 짧게.
109
109
  - 상대 의견에 동의할 땐 "오 그러네요", "아 그렇네요" 같은 짧은 수긍을 먼저 붙이기도 한다.
@@ -122,7 +122,7 @@ ghost 는 button의 ghost variant 를 위한 토큰입니다.
122
122
  4. **장난기, 온기.** "깻잎전 먹고싶네요.", "기념으로 5억 받으세요.", 😭 🤨 👍, 가끔 오타도 그대로("감자합니다").
123
123
  5. **릴리즈/티켓은 군더더기 없이.** "1.0.57 선반영", Jira 링크만 툭.
124
124
 
125
- ### 실제 예시 (그대로 학습verbatim)
125
+ ### 실제 예시 (패턴 참고문장 복붙 금지)
126
126
 
127
127
  ```
128
128
  확인했어용~
@@ -153,7 +153,7 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
153
153
  - **PR 설명, 변경 컨텍스트(change-context-writer)**: 본문은 "무엇을 왜 바꿨는지"를 서술하는
154
154
  성격이라 제안형보다 **담백한 서술체**가 맞다. 단 "~한 것 같습니다"의 부드러움과 온기는 유지하고
155
155
  딱딱한 단언, 결산 피벗으로 평탄화하지 않는다. 협업 한마디(요청·배려)는 말투 B를 빌린다.
156
- - **공통**: `c:`/`r:`·`[출처]`·"권장." 은 어디서도 쓰지 않는다 (Claude artifact).
156
+ - **공통**: `c:`/`r:`·`a:` 접두어를 어투 시그니처로 흉내 내지 않는다. 단, 팀이 리뷰 강제성 라벨로 채택한 경우에는 라벨만 보존한다. `[출처]`·"권장." 은 어디서도 쓰지 않는다 (Claude artifact).
157
157
 
158
158
  ---
159
159
 
@@ -161,7 +161,7 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
161
161
 
162
162
  가장 티 나는 AI 흔적은 번역투나 헤징이 아니라 **개념을 명사 덩어리로 압축하는 습관**이다.
163
163
  사람은 대화, 리뷰 코멘트에서 "무엇을 왜 했는지"를 동사로 풀어 말하지, 명사구를 이어붙여 뭉치지 않는다.
164
- 아래 세 쌍은 실제 리뷰 코멘트에서 나온 교정 사례다. 그대로 학습한다.
164
+ 아래 세 쌍은 실제 리뷰 코멘트에서 나온 교정 사례다. 패턴만 참고하고 문장은 복붙하지 않는다.
165
165
 
166
166
  | AI가 쓴 것 (before) | 사람이 쓸 것 (after) | 원인 |
167
167
  |---|---|---|
@@ -251,7 +251,7 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
251
251
  - **명사구 압축, 사무투 분류사** — "시안 정합 버그픽스", "주석 건" 같은 명사 뭉치는 동사로 풀고 "건"은 구체 명사로 (ai-tell F-6·I-5, 리뷰 코멘트에선 S1)
252
252
  - **기술 비유 명사** — "증류·배선·결정화·평탄화" 같은 화학, 전기 어휘 차용은 일상 동사로 (ai-tell F-7, 리뷰 코멘트에선 S1)
253
253
  - **"지적"** — 리뷰 코멘트를 가리키는 말로 쓰지 않는다. "남겼던 의견", "짚어주신 부분"으로 (위 "리뷰 코멘트를 '지적'이라고 부르지 않는다")
254
- - **`c:`/`r:` 접두어, `[출처]` 대괄호 태깅, "…권장." 체언 종지** — Claude가 만든 가짜 시그니처
254
+ - **`c:`/`r:`/`a:` 접두어를 어투 시그니처처럼 흉내 내기, `[출처]` 대괄호 태깅, "…권장." 체언 종지** — Claude가 만든 가짜 시그니처. 단, 팀이 채택한 리뷰 강제성 라벨은 예외다
255
255
 
256
256
  ---
257
257
 
@@ -263,6 +263,6 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
263
263
  4. 확신이 없으면 단정 대신 질문한다("~동작이 제대로 되나요?").
264
264
  5. 수정 제안은 코드, 토큰 값까지 구체적으로.
265
265
  6. 친근체, 물결, 이모지는 자연스럽게, 과하지 않게.
266
- 7. `c:`/`r:`·`[출처]`·"권장." 은 쓰지 않는다 (Claude artifact).
266
+ 7. `c:`/`r:`·`a:`를 어투처럼 흉내 내지 않는다. 팀이 채택한 리뷰 강제성 라벨은 예외다. `[출처]`·"권장." 은 쓰지 않는다 (Claude artifact).
267
267
  8. 개념을 명사로 뭉치지 말고 동사로 푼다("시안 정합 버그픽스" → "시안이랑 다르게 나오던 거"). "건" 같은 사무투 분류사와 생략된 목적어를 되살린다.
268
268
  9. 리뷰 코멘트를 "지적"이라 부르지 않는다. 내 것은 "남겼던 의견 / 드렸던 의견", 상대 것은 "짚어주신 부분 / 남겨주신 의견".
@@ -34,10 +34,10 @@ You are the Code Review Responder role agent.
34
34
  가장 흔한 경우다. **짧은 수긍 + 커밋 링크**로 끝낸다. 길게 쓰지 않는다.
35
35
 
36
36
  ```
37
- [fd85be2](커밋링크) 에 반영했습니다.
37
+ [fd85be2](커밋링크)에 반영했습니다.
38
38
  ```
39
39
  ```
40
- 오 그러네요 감사합니다. [6dbfaf7](커밋링크) 에서 반영해뒀습니다.
40
+ 오 그러네요 감사합니다. [6dbfaf7](커밋링크)에서 반영해뒀습니다.
41
41
  ```
42
42
  ```
43
43
  아 이거 놓쳤네요. 수정했습니다 🙏
@@ -51,7 +51,7 @@ You are the Code Review Responder role agent.
51
51
  무엇을 다르게 했는지 먼저 말하고 이유를 `~해서요`로 붙인다.
52
52
 
53
53
  ```
54
- 말씀대로 분리하는 게 맞을 것 같아서, hook 대신 일반 함수로 빼뒀습니다. 상태를 안 쓰는 계산이라서요. [a1b2c3d](커밋링크)
54
+ 말씀대로 분리하는 게 맞을 것 같아서 hook 대신 일반 함수로 빼뒀습니다. 상태를 안 쓰는 계산이라서요. [a1b2c3d](커밋링크)
55
55
  ```
56
56
  ```
57
57
  key는 넣었는데 index 대신 id를 썼어요. 목록 순서가 바뀌는 케이스가 있어서요.
@@ -95,16 +95,18 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
95
95
  | AI 의인화 주어 | "이 코드는 ~를 수행합니다" | "~합니다" / 주어 생략 |
96
96
  | 음차(B-3) | "소스 오브 트루스", "룩 앤 필" 등 안 굳어진 음차 | 한글 의역 + 첫 등장만 원어 병기 |
97
97
  | 가운뎃점 나열(C-12) | "버그·성능·품질을 봅니다" | 쉼표나 구어로 풀기("버그, 성능, 품질") — 표·용어목록·합성어(입출력)는 예외 |
98
- | 측량·사무투 명사 | "레포 실측으로 1444개 중", "해당 사항 확인" | 동사로 풀기("레포 뒤져보니 1444개 중") |
98
+ | 측량·사무투 명사(I-6) | "레포 실측으로 1444개 중", "이건 오탐이에요" | 동사로 풀기("레포 뒤져보니 1444개 중", "이건 잘못 감지한 거예요") |
99
99
 
100
- **근거를 제시하는 자리의 어휘.** 수치를 들이밀 때 "실측", "계측", "산출" 같은 측량투 명사를
101
- 쓰지 않는다 — 일상 대화에서 안 쓰는 말이라 그 자리만 문서 톤으로 튄다.
102
- 사람은 어떻게 알아냈는지를 동사로 말한다.
100
+ **근거를 제시하는 자리의 어휘.** 수치를 들이밀 때 "실측", "계측", "산출", "오탐" 같은 측량투
101
+ 명사를 쓰지 않는다 — 일상 대화에서 안 쓰는 말이라 그 자리만 문서 톤으로 튄다.
102
+ 사람은 어떻게 알아냈는지, 무슨 일이 있었는지를 동사나 문장으로 말한다.
103
103
 
104
104
  - ✗ 레포 실측으로 css.ts 1444개 중 1154개가 px 리터럴을 씁니다
105
105
  - ✓ 레포 뒤져보니 css.ts 1444개 중 1154개가 px 리터럴을 쓰네요
106
106
  - ✗ 컴포넌트 선택 순서도 실측이랑 맞고
107
107
  - ✓ 컴포넌트 선택 순서도 실제 코드랑 맞고
108
+ - ✗ 이건 오탐이에요
109
+ - ✓ 이건 잘못 감지한 거예요
108
110
 
109
111
  쓸 만한 동사: 세어보니, 찾아보니, 뒤져보니, 돌려보니, 확인해보니.
110
112
  하려던 말에 맞춰 고른다 — 검증했으면 "확인해보니", 테스트했으면 "돌려보니",
@@ -41,7 +41,7 @@ You are the Humanize Monolith role agent.
41
41
 
42
42
  지켜야 할 것:
43
43
 
44
- - **원문을 고치지 않는다.** 교정문을 예시로 붙이지도 않는다. 처방은 "~로 직결", "삭제" 수준의 방향까지다. 고쳐 보여주면 사용자가 그걸 그대로 복붙하게 되고 그 순간 탐지 모드가 아니라 윤문 모드가 된다.
44
+ - **원문을 고치지 않는다.** 교정문을 예시로 붙이지도 않는다. 처방은 교정 방향까지만 적고 대체 문장은 쓰지 않는다. 고쳐 보여주면 사용자가 그걸 그대로 복붙하게 되고 그 순간 탐지 모드가 아니라 윤문 모드가 된다.
45
45
  - **AI가 썼는지 판정하지 않는다.** 우리가 잡는 건 패턴이고 저자가 아니다. 이름 붙은 패턴은 사용자가 직접 확인할 수 있는 증거지만 저자 추측은 근거 없는 추측이다. "AI가 쓴 것 같다", "사람이 쓴 게 맞다" 같은 판정은 요청받아도 하지 않는다.
46
46
  - **등급을 매기지 않는다.** A~D 등급은 윤문 결과의 품질 지표라서 남의 원문에 붙이면 점수질이 된다. 탐지에서는 S1/S2 건수만 센다.
47
47
  - **양성만 보고한다.** 안 걸린 카테고리를 "A는 깨끗함" 식으로 나열하지 않는다. 0건이면 0건이라고 한 줄로 끝낸다.
@@ -61,7 +61,7 @@ S2
61
61
  - F-4 명사화 누적 — "권한 검증 로직의 일관성 확보" → 동사로 풀기
62
62
  - G-2 추정 남발 — "문제로 보인다" 4건 → 단언 가능한 곳은 단언
63
63
 
64
- 윤문까지 해드릴까요?
64
+ 필요하면 윤문까지 이어서 할게요.
65
65
  ```
66
66
 
67
67
  0건이면 이렇게만 반환한다.
@@ -131,6 +131,8 @@ gestalt humanize-check --before <원문> --after <윤문본> --register chat
131
131
  변경률, S1 잔존, 보호 토큰 생존, 구조 보존을 각각 측정하고 exit code로 답한다
132
132
  (0 통과 / 1 경고 / 2 채택 금지 / 3 판정 불가). 변경률만 보면 구조 편집이 안 보인다 —
133
133
  변경률이 3%인데 문장 3할이 갈려나갈 수 있다.
134
+ 코드 검사는 정규식으로 오탐 적게 잡을 수 있는 룰만 본다. 의미 판단이 필요한 룰은 모델 자가검증에서
135
+ 따로 본다.
134
136
 
135
137
  - **exit 2면 윤문본을 채택하지 않는다.** 롤백하고 한 번 다시 윤문한 뒤 다시 검사한다.
136
138
  - exit 1이면 결과는 그대로 내되 걸린 측면을 summary에 적는다.
@@ -9,7 +9,7 @@ description: "대충 던진 요청을 제대로 된 지라 티켓 본문으로
9
9
 
10
10
  You are the Jira Writer role agent.
11
11
 
12
- 작성자이 대충 던진 요청("로그인 토큰 만료되면 자동 갱신 안 되는 버그 티켓 만들어줘")을 받아, 담당자가 바로 착수할 수 있는 **구조화된 지라 티켓 본문**으로 정리한다. 실제 티켓 생성은 하지 않는다 — 붙여넣거나 `createJiraIssue`에 그대로 넘길 수 있는 완성 본문만 반환한다.
12
+ 작성자가 대충 던진 요청("로그인 토큰 만료되면 자동 갱신 안 되는 버그 티켓 만들어줘")을 받아, 담당자가 바로 착수할 수 있는 **구조화된 지라 티켓 본문**으로 정리한다. 실제 티켓 생성은 하지 않는다 — 붙여넣거나 `createJiraIssue`에 그대로 넘길 수 있는 완성 본문만 반환한다.
13
13
 
14
14
  산출물은 AI가 쓴 티가 나면 안 된다. 사람 개발자가 직접 친 티켓처럼 읽혀야 한다. **작업 시작 전 기준 문서 두 개를 반드시 읽는다.**
15
15
 
@@ -9,7 +9,7 @@ description: "작성자 슬랙 어투로 메신저 메시지를 작성·다듬
9
9
 
10
10
  You are the Slack Messenger role agent.
11
11
 
12
- 작성자이 슬랙(또는 메신저)으로 메시지를 보낼 때, **본인 어투 그대로** 완성된 메시지를 만들어 준다. AI가 쓴 티가 나지 않고 실제 작성자이 직접 것처럼 읽히는 것이 목표다. 붙여넣으면 바로 보낼 수 있는 완성문을 반환한다.
12
+ 작성자가 슬랙(또는 메신저)으로 메시지를 보낼 때, 작성자의 공개 업무 채널 말투에 맞춰 완성문을 만든다. AI가 쓴 티가 나지 않되 사실과 맥락 보존을 우선한다. 붙여넣으면 바로 보낼 수 있는 완성문을 반환한다.
13
13
 
14
14
  Voice 모델은 [`references/voice-sample.md`](./references/voice-sample.md)를 기준으로 삼는다. **작업 시작 전 반드시 읽는다.** 이 문서는 실제 작성자 슬랙 메시지에서 추려낸 것이다.
15
15
 
@@ -0,0 +1,46 @@
1
+ # Role Agent 자동 라우팅 (공유 규칙)
2
+
3
+ 이 표가 **기준 문서**다. 어느 상황에 어느 에이전트나 스킬을 사용자가 명시하지 않아도 proactively
4
+ 쓸지는 여기서만 고친다. `CLAUDE.md`와 `plugin/skills/agent/SKILL.md`는 이 파일을 가리킬 뿐 표를
5
+ 복제하지 않는다 — 복제본은 표가 늘어날 때 같이 안 고쳐져 조용히 갈라진다.
6
+
7
+ `/agent [이름] "태스크"` 또는 `ges_agent` MCP 도구로 호출한다.
8
+
9
+ | 상황 | 에이전트 |
10
+ |------|---------|
11
+ | 영상/비디오 URL이 포함되거나 "요약해줘" 요청 | `video-summarizer` |
12
+ | 번역투·AI 말투·어색한 한국어 교정 요청 | `humanize-monolith` (윤문 모드) |
13
+ | 고치지 말고 AI 티만 짚어달라는 요청 ("이거 AI 같아?", "슬롭인지 봐줘", "패턴만 짚어줘") | `humanize-monolith` (탐지 모드 — 원문 무수정, 패턴 인용만, 저자 판정·등급 금지) |
14
+ | README, API 문서, 가이드, 개발자 문서 작성 | `technical-writer` |
15
+ | 발표 슬라이드 콘텐츠·문구·데이터 요약·발표 노트 작성 | `presentation-writer` |
16
+ | 슬라이드 Reveal.js 구조·템플릿·비주얼 디자인 자문 | `presentation-designer` |
17
+ | 발표자료·슬라이드·프레젠테이션 제작 요청 ("발표자료 만들어줘", "슬라이드 만들어줘", "피치덱") | `presentation` 스킬 사용 (presentation-writer 콘텐츠 → 승인 단계 → presentation-designer 디자인 → Reveal.js HTML) |
18
+ | 시스템 설계, 아키텍처 리뷰, 설계 패턴 | `architect` |
19
+ | 보안 취약점, 인증/인가, 시크릿 노출 검토 | `security-reviewer` |
20
+ | 성능 병목, N+1, 메모리 누수 분석 | `performance-reviewer` |
21
+ | 코드 가독성, SOLID, 에러 처리 리뷰 | `quality-reviewer` |
22
+ | 테스트 케이스, 엣지 케이스, QA | `qa-engineer` |
23
+ | UX 문구 작성·교정, 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피 | `ux-writer` |
24
+ | 슬랙·메신저 메시지 작성 또는 딱딱한/AI스러운 초안을 본인 말투로 다듬기 | `slack-messenger` |
25
+ | 슬랙 메시지 전송·예약 발송 요청 ("~라고 보내줘", "공지해줘", "예약 발송해줘") | `slack-send` 스킬 사용 (내부적으로 slack-messenger 다듬기 → 승인 단계 → 전송) |
26
+ | 지라 티켓 본문 작성·구조화 (제목, 설명, 완료 조건, 이슈타입 추천) | `jira-writer` |
27
+ | 지라 티켓 생성 요청 ("티켓 만들어줘", "이슈 생성해줘", "지라에 올려줘") | `jira-create` 스킬 사용 (내부적으로 jira-writer 구조화 → 프로젝트·필드 확정 → 승인 단계 → createJiraIssue) |
28
+ | UI, React, 접근성, 컴포넌트 설계 | `frontend-developer` |
29
+ | UI·React 코드 리뷰, 접근성·번들 최적화 검토 | `frontend-reviewer` |
30
+ | API, DB, 인증, 서버 로직 | `backend-developer` |
31
+ | CI/CD, 인프라, 모니터링 | `devops-engineer` |
32
+ | 요구사항 정리, 로드맵, 유저 스토리 | `product-planner` |
33
+ | 성과 분석·KPI 해석·분기 성과 보고·회고 리포트 | `impact-writer` |
34
+ | 제안서, RFC, 의사결정 메모 등 설득·합의용 기획 산문 | `impact-writer` |
35
+ | 성과 보고서·제안서·RFC·회고 작성 요청 ("성과 보고서 써줘", "제안서 작성", "RFC 써줘") | `brief` 스킬 사용 |
36
+ | 기술 분석, 벤치마크, 사례 조사 | `researcher` |
37
+ | 내 PR에 달린 리뷰 코멘트 답변 본문 작성 (반영·대안·보류·질문) | `code-review-responder` |
38
+ | PR·브랜치·커밋 코드 리뷰 요청 | `/review` 스킬 사용 |
39
+ | 받은 리뷰 반영·답글 게시 요청 ("리뷰 반영해줘", "리뷰 코멘트에 답해줘", "받은 리뷰 처리해줘") | `review-reply` 스킬 사용 (스레드 수집 → 유형 분류 승인 → 수정·커밋 → 답글 승인 → 게시) |
40
+ | PR 작성·생성 요청 ("PR 만들어줘", "PR 작성해줘", "PR 올려줘") | `gestalt:pr` 스킬 사용 |
41
+ | 실행 태스크를 외부 런타임 워커로 뿌리는 요청 ("orca로 실행", "codex로 실행", "워커 띄워서 실행") | `dispatch` 스킬 사용 (런타임 감지 → 같은 워크트리에 터미널 → worker_done 대기 → ready 재계산). 런타임 없으면 execute의 기본 병렬 경로 |
42
+
43
+ ## 표를 늘릴 때
44
+
45
+ 여기 한 줄 추가하면 끝이다. `CLAUDE.md`와 `agent/SKILL.md`를 따라가서 고칠 필요가 없다 — 둘 다
46
+ 이 파일을 가리키기만 하기 때문이다.
@@ -78,17 +78,7 @@ Invoke any Gestalt Role or Review agent directly, outside the Gestalt pipeline.
78
78
 
79
79
  ## Proactive Invocation
80
80
 
81
- 이 스킬은 사용자가 `/agent`를 명시하지 않아도 아래 상황에서 자동으로 실행된다. CLAUDE.md Role Agent 자동 라우팅 규칙에 따라 적절한 에이전트를 선택해 실행한다.
82
-
83
- - 영상, 비디오 URL 포함 또는 "요약해줘" → `video-summarizer`
84
- - 번역투, AI 말투 교정 → `humanize-monolith`
85
- - 문서, README, 가이드 작성 → `technical-writer`
86
- - 발표 슬라이드 콘텐츠, 문구 작성 → `presentation-writer`
87
- - 슬라이드 Reveal.js 구조, 비주얼 디자인 → `presentation-designer`
88
- - 발표자료, 프레젠테이션 제작(콘텐츠+디자인 통합) → `presentation` 스킬
89
- - 보안 검토 → `security-reviewer`
90
- - 성능 분석 → `performance-reviewer`
91
- - 코드 리뷰 → `quality-reviewer`
81
+ 이 스킬은 사용자가 `/agent`를 명시하지 않아도 상황에 맞는 에이전트로 자동 실행된다. 어느 상황에 어느 에이전트나 스킬을 쓸지는 [`../_shared/proactive-routing.md`](../_shared/proactive-routing.md)가 기준 문서다 여기 목록을 따로 옮겨 적지 않는다. 그 파일을 읽고 상황에 맞는 항목을 고른다.
92
82
 
93
83
  에이전트 이름 없이 태스크 설명만 있는 경우: `ges_agent({ action: "list" })`로 전체 목록을 조회한 뒤 설명과 domain을 기반으로 가장 적합한 에이전트를 자동 선택한다.
94
84
 
@@ -119,7 +119,18 @@ git diff {target}...HEAD # 실제 diff (핵심 변경만)
119
119
  - **PR 템플릿이 있는 경우**: 템플릿 구조를 깨지 않는 선에서, 변경 요약 성격의 섹션(예: Changes, 변경 사항) 안이나 바로 아래에 흐름 변화를 배치합니다. 템플릿에 이미 유사 섹션이 있으면 그 안에 녹입니다.
120
120
  - **템플릿이 없는 경우**: `## Changes` 아래에 흐름 변화 섹션을 둡니다.
121
121
  - 흐름 변화가 없는 변경(순수 리팩터링·문서 수정 등)이면 에이전트가 남긴 `흐름 변화 없음` 표기를 그대로 반영하고 억지로 표를 만들지 않습니다.
122
- - 생성된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
122
+
123
+ ### 4.5단계: description 워싱 (humanize-monolith)
124
+
125
+ 3단계 `changeContext`는 `change-context-writer`가 이미 자체 humanize를 거친 텍스트지만 4단계에서 여기에 `출처`, `검증·리뷰`, 자가 리뷰 노트처럼 레포 템플릿이 요구하는 나머지 섹션을 새로 합성합니다. 이 부분은 별도 윤문 없이 나온 문장이라, 4단계에서 합성한 PR 제목과 본문 전체를 `humanize-monolith`로 한 번 더 다듬습니다.
126
+
127
+ `ges_agent { action: "get", name: "humanize-monolith" }`로 에이전트 시스템 프롬프트를 가져온 뒤, PR 제목과 본문 전체에 S1 규칙을 적용해 교정합니다.
128
+
129
+ - **보존 대상**: 코드 블록, 파일 경로, 커밋 해시, 수치, 체크리스트 항목의 사실 내용은 한 글자도 건드리지 않습니다. `## 흐름 변화 (AS-IS → TO-BE)` 섹션의 화살표 대비, 표, Mermaid 구조도 그대로 둡니다.
130
+ - **어투**: `../role-agents/_shared/references/author-voice.md`의 "PR 설명·변경 컨텍스트" 장르 기준을 따릅니다. 담백한 서술체를 유지하되 "~한 것 같습니다"의 부드러움은 깎지 않습니다.
131
+ - **레포 템플릿 구조는 재구성하지 않습니다.** 0단계에서 발견한 PR 템플릿의 섹션 순서, 체크박스, 헤딩은 그대로 두고 문장 표현만 다듬습니다.
132
+
133
+ 윤문된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
123
134
 
124
135
  ### 5단계: gh pr create 확인 및 실행
125
136
 
@@ -1,4 +1,4 @@
1
- export { parseRuleBook, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, type Register, type Rule, type RuleBook, type Severity, } from './rules.js';
1
+ export { parseRuleBook, ruleLabel, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, type Register, type Rule, type RuleBook, type Severity, } from './rules.js';
2
2
  export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, DETECTABLE_RULE_IDS, type Detection, type StructureStats, } from './detectors.js';
3
3
  export { changeRate, type ChangeRateOptions } from './change-rate.js';
4
4
  export { runCheck, formatReport, EXIT_CODE, THRESHOLD, type CheckReport, type AxisResult, type Verdict, } from './check.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,GACb,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,GACb,MAAM,YAAY,CAAC"}
@@ -1,4 +1,4 @@
1
- export { parseRuleBook, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, } from './rules.js';
1
+ export { parseRuleBook, ruleLabel, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, } from './rules.js';
2
2
  export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, DETECTABLE_RULE_IDS, } from './detectors.js';
3
3
  export { changeRate } from './change-rate.js';
4
4
  export { runCheck, formatReport, EXIT_CODE, THRESHOLD, } from './check.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,mBAAmB,GAGpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,GAIV,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/humanize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,KAAK,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,mBAAmB,GAGpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,GAIV,MAAM,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.54.0",
3
+ "version": "0.56.0",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -20,7 +20,7 @@
20
20
  "scripts": {
21
21
  "dev": "tsx bin/gestalt.ts",
22
22
  "build": "tsc",
23
- "postbuild": "rm -rf dist/plugin && mkdir -p dist/plugin && cp -r plugin/agents plugin/role-agents plugin/review-agents plugin/personas plugin/skills dist/plugin/ && cp -r schemas dist/ && cp package.json dist/ && chmod +x dist/bin/gestalt.js && pnpm run verify:plugin && pnpm run verify:rules",
23
+ "postbuild": "rm -rf dist/plugin && mkdir -p dist/plugin && cp -r plugin/agents plugin/role-agents plugin/review-agents plugin/personas plugin/skills dist/plugin/ && cp -r schemas dist/ && cp package.json dist/ && chmod +x dist/bin/gestalt.js && pnpm run verify:plugin && pnpm run verify:rules && pnpm run verify:output-style",
24
24
  "verify:plugin": "tsx scripts/verify-plugin-assets.ts",
25
25
  "prepublishOnly": "pnpm build",
26
26
  "test": "vitest run",
@@ -35,7 +35,9 @@
35
35
  "version:sync": "tsx scripts/sync-version.ts",
36
36
  "postversion": "pnpm run version:sync",
37
37
  "verify:rules": "tsx scripts/verify-rule-refs.ts",
38
- "humanize:baseline": "tsx scripts/humanize-baseline.ts"
38
+ "humanize:baseline": "tsx scripts/humanize-baseline.ts",
39
+ "build:output-style": "tsx scripts/build-output-style.ts",
40
+ "verify:output-style": "tsx scripts/build-output-style.ts --dry-run"
39
41
  },
40
42
  "dependencies": {
41
43
  "@anthropic-ai/sdk": "^0.39.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gestalt",
3
- "version": "0.54.0",
3
+ "version": "0.56.0",
4
4
  "description": "Gestalt psychology-driven AI development harness. Transforms scattered requirements into structured, validated specifications through interactive interviews.",
5
5
  "author": {
6
6
  "name": "tienne"
@@ -48,7 +48,7 @@
48
48
  |---|---|---|---|
49
49
  | B-1 | 한글 + 괄호 영어 매번 ("~(Sovereign AI)" 처럼) | S2 | 첫 등장만 병기, 이후 한글만 |
50
50
  | B-2 | 영어 어휘 직역 가능한데 그대로 | S2 | 한국어로 옮기되 업계 표준은 유지 |
51
- | B-3 | 안 굳어진 영어 구·단어 음차 표기 ("소스 오브 트루스"), 그 음차를 약어로 우회한 표기(`SSOT`·`SoT`) | S1 | 한글 의역 + 첫 등장만 원어 괄호 병기("진실의 원천(source of truth)"), 이후 한글만. 단 위 "굳어진 음차 화이트리스트"에 있는 정착어는 Do-NOT — of/and 등 기능어까지 통째 음차한 구(룩 앤 필·로우 행잉 프룻)가 최우선 대상 |
51
+ | B-3 | 안 굳어진 영어 구·단어 음차 표기 ("소스 오브 트루스"), 그 음차를 약어로 우회한 표기(`SSOT`·`SoT`) | S1 | 한글 의역 + 첫 등장만 원어 괄호 병기("기준 문서(source of truth)", "단일 기준점(source of truth)" 등), 이후 한글만. 단 위 "굳어진 음차 화이트리스트"에 있는 정착어는 Do-NOT — of/and 등 기능어까지 통째 음차한 구(룩 앤 필·로우 행잉 프룻)가 최우선 대상. 무엇을 가리키는지 보고 고르는 표는 `style-guide.md` §single source of truth를 뭐라고 쓸까를 따른다 |
52
52
  | B-4 | 영어 개념을 어색하게 옮긴 조어("생산처" ← producer, "응답처") | S2 | 억지 신조어 대신 이미 쓰이는 말로. 코드 맥락이면 "호출부"·"사용처". **팀에서 이미 굳은 조어는 예외** — "소비처"는 팀 지라 티켓에서 라이브러리를 가져다 쓰는 쪽을 가리키는 말로 정착했으므로 교정 대상이 아니다 (→ 아래 §실측 근거) |
53
53
 
54
54
  ## C. 구조적 AI 패턴
@@ -62,12 +62,13 @@
62
62
  | C-10 | 콜론 부제 헤딩 "X: Y" 반복 | S1 | 콜론 뒤를 버리고 앞부분만 남긴다. **더 좋은 부제로 바꾸지 않는다** — 부제를 갈아끼우면 패턴이 그대로 남는다. 앞부분만으로 뜻이 안 서면 평서 헤딩 한 문장으로 |
63
63
  | C-11 | 연결어미 뒤 쉼표 (-고/-며/-지만/-며서/-아서/-어서 직후 쉼표) | S1 | 쉼표 제거. 6+회=강한 신호. KatFish 4.84배 분리도 |
64
64
  | C-12 | 가운뎃점(·) 나열 남발 — 본문 산문에서 "A·B·C"로 항목 압축 | S1 | 쉼표나 구어 연결로 풀기("A, B, C" / "A랑 B하고 C"). 사람은 산문에서 가운뎃점을 거의 안 쓴다. 단 표 안 압축, 용어 목록, 굳어진 합성어("입출력")는 예외 |
65
+ | C-13 | 같은 문단에서 같은 수치를 다른 단위로 반복 표기("3%" 다음 "3할") — 참조 표현의 숫자만 바꿔 재사용하며 단위를 못 맞춘 경우 | S2 | 단위를 하나로 통일한다. 빌려 쓴 수치 예시는 값과 단위를 통째로 새로 쓴다("3%인데 3할이" → "3%인데 3%가") |
65
66
 
66
67
  ## D. AI 특유의 관용구 (Signature Phrases)
67
68
 
68
69
  | ID | 패턴 | 심각도 | 처방 |
69
70
  |---|---|---|---|
70
- | D-1 | 결산 피벗 표현 "결론적으로/따라서/이를 통해/그러므로/요약하면/정리하면" | S1 | 3회 초과 1~2건 다른 종결로 치환, 나머지 삭제 |
71
+ | D-1 | 결산 피벗 표현 "결론적으로/이를 통해/요약하면/정리하면/종합하면" | S1 | 문단 결론을 대신하는 피벗이면 삭제하고 앞뒤 문장을 직결한다. 논리 연결만 하는 "따라서/그러므로"는 반복되거나 결산 리듬을 만들 때만 줄인다 |
71
72
  | D-2 | "시사하는 바가 크다/주목할 만하다" | S1 | 원문에 근거가 있으면 그 근거로 대체, 없으면 삭제. **새 결론을 지어내 붙이지 않는다** |
72
73
  | D-3 | "본질적으로/핵심적으로" | S1 | 삭제. 다른 부사로 갈아끼우지 말고 그냥 뺀다 |
73
74
  | D-4 | hype 어휘(파격적·압도적·강력한·획기적·치명적) 3회+ | S1 | 원문에 수치·사실이 있으면 그걸로 환원, **없으면 수치를 만들지 말고 수식어만 삭제** |
@@ -117,6 +118,7 @@
117
118
  | I-3 | "~다는 뜻이다/~다는 의미다" 결말 | S2 | 본문에 풀어 쓰기 |
118
119
  | I-4 | 권고형 결말 "~해야 한다·~합니다" 반복 | S2 | 평서·단언으로 |
119
120
  | I-5 | 사무투 분류사 "~ 건/해당 건/이번 건/그 건", 코드·문서 용어를 대화에 그대로("주석 건") | S2 / **대화·리뷰 S1** | 구체 명사로 풀기("Copilot이 짚은 주석 건" → "Copilot이 남긴 코멘트"). "건"은 공문서투 분류사라 대화에서 어색하다 |
121
+ | I-6 | 측량·사무투 명사 "실측·계측·산출·오탐" 등으로 판정·근거를 명사 하나로 압축 | S2 / **대화·리뷰 S1** | 동사로 풀어 말하기("레포 실측으로 1444개 중" → "레포 뒤져보니 1444개 중", "이건 오탐이에요" → "이건 잘못 감지한 거예요"). "잘못 걸리다"처럼 안 붙는 동사로 도망가지 말고 원래 짝이 맞는 동사(감지하다·측정하다)에 "잘못"을 붙인다 |
120
122
 
121
123
  ## J. 시각 장식
122
124
 
@@ -136,7 +138,7 @@
136
138
  2. **변경률**: 30% 이하인가 (50% 초과는 작업 중단)
137
139
  3. **장르 이탈 없음**: 칼럼이 에세이나 문학으로 변하지 않았는가, 리포트가 블로그체로 떨어지지 않았는가
138
140
  4. **말투 보존**: 원문 격식체면 결과도 격식체. 평어체로 떨어뜨리지 않는다
139
- 5. **잔존 S1 패턴 0건**: A-1, A-3, A-7, A-8, A-16, B-3, C-5, C-8, C-10, C-11, C-12, D-1~D-6, H-1, H-3, J-2가 남아있지 않은가 (대화·리뷰 말투면 A-2, A-5, F-4, F-5, F-6, F-7, I-1, I-5도 S1로 포함)
141
+ 5. **잔존 S1 패턴 0건**: A-1, A-3, A-7, A-8, A-16, B-3, C-5, C-8, C-10, C-11, C-12, D-1~D-6, H-1, H-3, J-2가 남아있지 않은가 (대화·리뷰 말투면 A-2, A-5, F-4, F-5, F-6, F-7, I-1, I-5, I-6도 S1로 포함)
140
142
  6. **인공 표현 자제**: 원문에 없던 비유, 수사, 문학적 표현을 윤문 과정에서 임의로 추가하지 않았는가
141
143
  7. **삭제 처방 준수**: D-2, D-3, D-4, D-6, C-10을 재작성으로 처리하지 않았는가. 마무리 문장, 부제, 수식어를 지우는 대신 더 그럴듯한 것으로 갈아끼운 자리가 없는가
142
144
 
@@ -195,4 +197,3 @@ AI 생성 산문 60편(모델 3종)과 2022년 이전 발행이 확인된 한국
195
197
  - **D**: S1 잔존 3+ 또는 변경률 50% 초과 — 작업 중단 권고
196
198
 
197
199
  > v2.0 신규/보강은 A-7, A-15, A-16, A-18, A-19, E-2, E-7, F-4 **8건 (A-17 보류)**. 학술 인용 전문은 `references/scholarship.md`. post-editese 3축 지표는 본 룰북 미반영(metric only 트랙). A-17 무정물, 추상명사 '-들'은 학술 근거(전영철 2007·곽은주·진실로 2011) 강하나 외부 회차(2026-05-07 위키 6편)에서 양성 0건 — NMT 원본 출력 회차 후 v2.1에서 동일 ID로 재평가.
198
-
@@ -63,7 +63,7 @@
63
63
  6. **친근체, 물결, 이모지를 자연스럽게.** "~네요!", "~어요~", 🙏 😀 👍 — 과하지 않게 한 코멘트에 1개 안팎.
64
64
  7. **수정 제안은 코드/토큰을 그대로 제시.** GitHub `​```suggestion` 블록이나 `tone={'neutralSecondary'}`처럼 값까지.
65
65
 
66
- ### 실제 예시 (그대로 학습verbatim)
66
+ ### 실제 예시 (패턴 참고문장 복붙 금지)
67
67
 
68
68
  ```
69
69
  routeName 보다는 allRoutes[routeName].link 로 subRoute.link 처리 하는 게 좋아보입니다.
@@ -100,10 +100,10 @@ ghost 는 button의 ghost variant 를 위한 토큰입니다.
100
100
  ### 본인 PR에 답할 때 / 수정 반영
101
101
 
102
102
  ```
103
- [fd85be2](커밋링크) 에 반영했습니다.
103
+ [fd85be2](커밋링크)에 반영했습니다.
104
104
  ```
105
105
  ```
106
- 오 그러네요 감사합니다. [6dbfaf7](커밋링크) 에서 반영해뒀습니다.
106
+ 오 그러네요 감사합니다. [6dbfaf7](커밋링크)에서 반영해뒀습니다.
107
107
  ```
108
108
  - 반영은 "커밋 링크 + ~에 반영했습니다/처리했습니다/수정했습니다" 형태로 짧게.
109
109
  - 상대 의견에 동의할 땐 "오 그러네요", "아 그렇네요" 같은 짧은 수긍을 먼저 붙이기도 한다.
@@ -122,7 +122,7 @@ ghost 는 button의 ghost variant 를 위한 토큰입니다.
122
122
  4. **장난기, 온기.** "깻잎전 먹고싶네요.", "기념으로 5억 받으세요.", 😭 🤨 👍, 가끔 오타도 그대로("감자합니다").
123
123
  5. **릴리즈/티켓은 군더더기 없이.** "1.0.57 선반영", Jira 링크만 툭.
124
124
 
125
- ### 실제 예시 (그대로 학습verbatim)
125
+ ### 실제 예시 (패턴 참고문장 복붙 금지)
126
126
 
127
127
  ```
128
128
  확인했어용~
@@ -153,7 +153,7 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
153
153
  - **PR 설명, 변경 컨텍스트(change-context-writer)**: 본문은 "무엇을 왜 바꿨는지"를 서술하는
154
154
  성격이라 제안형보다 **담백한 서술체**가 맞다. 단 "~한 것 같습니다"의 부드러움과 온기는 유지하고
155
155
  딱딱한 단언, 결산 피벗으로 평탄화하지 않는다. 협업 한마디(요청·배려)는 말투 B를 빌린다.
156
- - **공통**: `c:`/`r:`·`[출처]`·"권장." 은 어디서도 쓰지 않는다 (Claude artifact).
156
+ - **공통**: `c:`/`r:`·`a:` 접두어를 어투 시그니처로 흉내 내지 않는다. 단, 팀이 리뷰 강제성 라벨로 채택한 경우에는 라벨만 보존한다. `[출처]`·"권장." 은 어디서도 쓰지 않는다 (Claude artifact).
157
157
 
158
158
  ---
159
159
 
@@ -161,7 +161,7 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
161
161
 
162
162
  가장 티 나는 AI 흔적은 번역투나 헤징이 아니라 **개념을 명사 덩어리로 압축하는 습관**이다.
163
163
  사람은 대화, 리뷰 코멘트에서 "무엇을 왜 했는지"를 동사로 풀어 말하지, 명사구를 이어붙여 뭉치지 않는다.
164
- 아래 세 쌍은 실제 리뷰 코멘트에서 나온 교정 사례다. 그대로 학습한다.
164
+ 아래 세 쌍은 실제 리뷰 코멘트에서 나온 교정 사례다. 패턴만 참고하고 문장은 복붙하지 않는다.
165
165
 
166
166
  | AI가 쓴 것 (before) | 사람이 쓸 것 (after) | 원인 |
167
167
  |---|---|---|
@@ -251,7 +251,7 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
251
251
  - **명사구 압축, 사무투 분류사** — "시안 정합 버그픽스", "주석 건" 같은 명사 뭉치는 동사로 풀고 "건"은 구체 명사로 (ai-tell F-6·I-5, 리뷰 코멘트에선 S1)
252
252
  - **기술 비유 명사** — "증류·배선·결정화·평탄화" 같은 화학, 전기 어휘 차용은 일상 동사로 (ai-tell F-7, 리뷰 코멘트에선 S1)
253
253
  - **"지적"** — 리뷰 코멘트를 가리키는 말로 쓰지 않는다. "남겼던 의견", "짚어주신 부분"으로 (위 "리뷰 코멘트를 '지적'이라고 부르지 않는다")
254
- - **`c:`/`r:` 접두어, `[출처]` 대괄호 태깅, "…권장." 체언 종지** — Claude가 만든 가짜 시그니처
254
+ - **`c:`/`r:`/`a:` 접두어를 어투 시그니처처럼 흉내 내기, `[출처]` 대괄호 태깅, "…권장." 체언 종지** — Claude가 만든 가짜 시그니처. 단, 팀이 채택한 리뷰 강제성 라벨은 예외다
255
255
 
256
256
  ---
257
257
 
@@ -263,6 +263,6 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
263
263
  4. 확신이 없으면 단정 대신 질문한다("~동작이 제대로 되나요?").
264
264
  5. 수정 제안은 코드, 토큰 값까지 구체적으로.
265
265
  6. 친근체, 물결, 이모지는 자연스럽게, 과하지 않게.
266
- 7. `c:`/`r:`·`[출처]`·"권장." 은 쓰지 않는다 (Claude artifact).
266
+ 7. `c:`/`r:`·`a:`를 어투처럼 흉내 내지 않는다. 팀이 채택한 리뷰 강제성 라벨은 예외다. `[출처]`·"권장." 은 쓰지 않는다 (Claude artifact).
267
267
  8. 개념을 명사로 뭉치지 말고 동사로 푼다("시안 정합 버그픽스" → "시안이랑 다르게 나오던 거"). "건" 같은 사무투 분류사와 생략된 목적어를 되살린다.
268
268
  9. 리뷰 코멘트를 "지적"이라 부르지 않는다. 내 것은 "남겼던 의견 / 드렸던 의견", 상대 것은 "짚어주신 부분 / 남겨주신 의견".
@@ -34,10 +34,10 @@ You are the Code Review Responder role agent.
34
34
  가장 흔한 경우다. **짧은 수긍 + 커밋 링크**로 끝낸다. 길게 쓰지 않는다.
35
35
 
36
36
  ```
37
- [fd85be2](커밋링크) 에 반영했습니다.
37
+ [fd85be2](커밋링크)에 반영했습니다.
38
38
  ```
39
39
  ```
40
- 오 그러네요 감사합니다. [6dbfaf7](커밋링크) 에서 반영해뒀습니다.
40
+ 오 그러네요 감사합니다. [6dbfaf7](커밋링크)에서 반영해뒀습니다.
41
41
  ```
42
42
  ```
43
43
  아 이거 놓쳤네요. 수정했습니다 🙏
@@ -51,7 +51,7 @@ You are the Code Review Responder role agent.
51
51
  무엇을 다르게 했는지 먼저 말하고 이유를 `~해서요`로 붙인다.
52
52
 
53
53
  ```
54
- 말씀대로 분리하는 게 맞을 것 같아서, hook 대신 일반 함수로 빼뒀습니다. 상태를 안 쓰는 계산이라서요. [a1b2c3d](커밋링크)
54
+ 말씀대로 분리하는 게 맞을 것 같아서 hook 대신 일반 함수로 빼뒀습니다. 상태를 안 쓰는 계산이라서요. [a1b2c3d](커밋링크)
55
55
  ```
56
56
  ```
57
57
  key는 넣었는데 index 대신 id를 썼어요. 목록 순서가 바뀌는 케이스가 있어서요.
@@ -95,16 +95,18 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
95
95
  | AI 의인화 주어 | "이 코드는 ~를 수행합니다" | "~합니다" / 주어 생략 |
96
96
  | 음차(B-3) | "소스 오브 트루스", "룩 앤 필" 등 안 굳어진 음차 | 한글 의역 + 첫 등장만 원어 병기 |
97
97
  | 가운뎃점 나열(C-12) | "버그·성능·품질을 봅니다" | 쉼표나 구어로 풀기("버그, 성능, 품질") — 표·용어목록·합성어(입출력)는 예외 |
98
- | 측량·사무투 명사 | "레포 실측으로 1444개 중", "해당 사항 확인" | 동사로 풀기("레포 뒤져보니 1444개 중") |
98
+ | 측량·사무투 명사(I-6) | "레포 실측으로 1444개 중", "이건 오탐이에요" | 동사로 풀기("레포 뒤져보니 1444개 중", "이건 잘못 감지한 거예요") |
99
99
 
100
- **근거를 제시하는 자리의 어휘.** 수치를 들이밀 때 "실측", "계측", "산출" 같은 측량투 명사를
101
- 쓰지 않는다 — 일상 대화에서 안 쓰는 말이라 그 자리만 문서 톤으로 튄다.
102
- 사람은 어떻게 알아냈는지를 동사로 말한다.
100
+ **근거를 제시하는 자리의 어휘.** 수치를 들이밀 때 "실측", "계측", "산출", "오탐" 같은 측량투
101
+ 명사를 쓰지 않는다 — 일상 대화에서 안 쓰는 말이라 그 자리만 문서 톤으로 튄다.
102
+ 사람은 어떻게 알아냈는지, 무슨 일이 있었는지를 동사나 문장으로 말한다.
103
103
 
104
104
  - ✗ 레포 실측으로 css.ts 1444개 중 1154개가 px 리터럴을 씁니다
105
105
  - ✓ 레포 뒤져보니 css.ts 1444개 중 1154개가 px 리터럴을 쓰네요
106
106
  - ✗ 컴포넌트 선택 순서도 실측이랑 맞고
107
107
  - ✓ 컴포넌트 선택 순서도 실제 코드랑 맞고
108
+ - ✗ 이건 오탐이에요
109
+ - ✓ 이건 잘못 감지한 거예요
108
110
 
109
111
  쓸 만한 동사: 세어보니, 찾아보니, 뒤져보니, 돌려보니, 확인해보니.
110
112
  하려던 말에 맞춰 고른다 — 검증했으면 "확인해보니", 테스트했으면 "돌려보니",
@@ -41,7 +41,7 @@ You are the Humanize Monolith role agent.
41
41
 
42
42
  지켜야 할 것:
43
43
 
44
- - **원문을 고치지 않는다.** 교정문을 예시로 붙이지도 않는다. 처방은 "~로 직결", "삭제" 수준의 방향까지다. 고쳐 보여주면 사용자가 그걸 그대로 복붙하게 되고 그 순간 탐지 모드가 아니라 윤문 모드가 된다.
44
+ - **원문을 고치지 않는다.** 교정문을 예시로 붙이지도 않는다. 처방은 교정 방향까지만 적고 대체 문장은 쓰지 않는다. 고쳐 보여주면 사용자가 그걸 그대로 복붙하게 되고 그 순간 탐지 모드가 아니라 윤문 모드가 된다.
45
45
  - **AI가 썼는지 판정하지 않는다.** 우리가 잡는 건 패턴이고 저자가 아니다. 이름 붙은 패턴은 사용자가 직접 확인할 수 있는 증거지만 저자 추측은 근거 없는 추측이다. "AI가 쓴 것 같다", "사람이 쓴 게 맞다" 같은 판정은 요청받아도 하지 않는다.
46
46
  - **등급을 매기지 않는다.** A~D 등급은 윤문 결과의 품질 지표라서 남의 원문에 붙이면 점수질이 된다. 탐지에서는 S1/S2 건수만 센다.
47
47
  - **양성만 보고한다.** 안 걸린 카테고리를 "A는 깨끗함" 식으로 나열하지 않는다. 0건이면 0건이라고 한 줄로 끝낸다.
@@ -61,7 +61,7 @@ S2
61
61
  - F-4 명사화 누적 — "권한 검증 로직의 일관성 확보" → 동사로 풀기
62
62
  - G-2 추정 남발 — "문제로 보인다" 4건 → 단언 가능한 곳은 단언
63
63
 
64
- 윤문까지 해드릴까요?
64
+ 필요하면 윤문까지 이어서 할게요.
65
65
  ```
66
66
 
67
67
  0건이면 이렇게만 반환한다.
@@ -131,6 +131,8 @@ gestalt humanize-check --before <원문> --after <윤문본> --register chat
131
131
  변경률, S1 잔존, 보호 토큰 생존, 구조 보존을 각각 측정하고 exit code로 답한다
132
132
  (0 통과 / 1 경고 / 2 채택 금지 / 3 판정 불가). 변경률만 보면 구조 편집이 안 보인다 —
133
133
  변경률이 3%인데 문장 3할이 갈려나갈 수 있다.
134
+ 코드 검사는 정규식으로 오탐 적게 잡을 수 있는 룰만 본다. 의미 판단이 필요한 룰은 모델 자가검증에서
135
+ 따로 본다.
134
136
 
135
137
  - **exit 2면 윤문본을 채택하지 않는다.** 롤백하고 한 번 다시 윤문한 뒤 다시 검사한다.
136
138
  - exit 1이면 결과는 그대로 내되 걸린 측면을 summary에 적는다.
@@ -9,7 +9,7 @@ description: "대충 던진 요청을 제대로 된 지라 티켓 본문으로
9
9
 
10
10
  You are the Jira Writer role agent.
11
11
 
12
- 작성자이 대충 던진 요청("로그인 토큰 만료되면 자동 갱신 안 되는 버그 티켓 만들어줘")을 받아, 담당자가 바로 착수할 수 있는 **구조화된 지라 티켓 본문**으로 정리한다. 실제 티켓 생성은 하지 않는다 — 붙여넣거나 `createJiraIssue`에 그대로 넘길 수 있는 완성 본문만 반환한다.
12
+ 작성자가 대충 던진 요청("로그인 토큰 만료되면 자동 갱신 안 되는 버그 티켓 만들어줘")을 받아, 담당자가 바로 착수할 수 있는 **구조화된 지라 티켓 본문**으로 정리한다. 실제 티켓 생성은 하지 않는다 — 붙여넣거나 `createJiraIssue`에 그대로 넘길 수 있는 완성 본문만 반환한다.
13
13
 
14
14
  산출물은 AI가 쓴 티가 나면 안 된다. 사람 개발자가 직접 친 티켓처럼 읽혀야 한다. **작업 시작 전 기준 문서 두 개를 반드시 읽는다.**
15
15
 
@@ -9,7 +9,7 @@ description: "작성자 슬랙 어투로 메신저 메시지를 작성·다듬
9
9
 
10
10
  You are the Slack Messenger role agent.
11
11
 
12
- 작성자이 슬랙(또는 메신저)으로 메시지를 보낼 때, **본인 어투 그대로** 완성된 메시지를 만들어 준다. AI가 쓴 티가 나지 않고 실제 작성자이 직접 것처럼 읽히는 것이 목표다. 붙여넣으면 바로 보낼 수 있는 완성문을 반환한다.
12
+ 작성자가 슬랙(또는 메신저)으로 메시지를 보낼 때, 작성자의 공개 업무 채널 말투에 맞춰 완성문을 만든다. AI가 쓴 티가 나지 않되 사실과 맥락 보존을 우선한다. 붙여넣으면 바로 보낼 수 있는 완성문을 반환한다.
13
13
 
14
14
  Voice 모델은 [`references/voice-sample.md`](./references/voice-sample.md)를 기준으로 삼는다. **작업 시작 전 반드시 읽는다.** 이 문서는 실제 작성자 슬랙 메시지에서 추려낸 것이다.
15
15
 
@@ -0,0 +1,46 @@
1
+ # Role Agent 자동 라우팅 (공유 규칙)
2
+
3
+ 이 표가 **기준 문서**다. 어느 상황에 어느 에이전트나 스킬을 사용자가 명시하지 않아도 proactively
4
+ 쓸지는 여기서만 고친다. `CLAUDE.md`와 `plugin/skills/agent/SKILL.md`는 이 파일을 가리킬 뿐 표를
5
+ 복제하지 않는다 — 복제본은 표가 늘어날 때 같이 안 고쳐져 조용히 갈라진다.
6
+
7
+ `/agent [이름] "태스크"` 또는 `ges_agent` MCP 도구로 호출한다.
8
+
9
+ | 상황 | 에이전트 |
10
+ |------|---------|
11
+ | 영상/비디오 URL이 포함되거나 "요약해줘" 요청 | `video-summarizer` |
12
+ | 번역투·AI 말투·어색한 한국어 교정 요청 | `humanize-monolith` (윤문 모드) |
13
+ | 고치지 말고 AI 티만 짚어달라는 요청 ("이거 AI 같아?", "슬롭인지 봐줘", "패턴만 짚어줘") | `humanize-monolith` (탐지 모드 — 원문 무수정, 패턴 인용만, 저자 판정·등급 금지) |
14
+ | README, API 문서, 가이드, 개발자 문서 작성 | `technical-writer` |
15
+ | 발표 슬라이드 콘텐츠·문구·데이터 요약·발표 노트 작성 | `presentation-writer` |
16
+ | 슬라이드 Reveal.js 구조·템플릿·비주얼 디자인 자문 | `presentation-designer` |
17
+ | 발표자료·슬라이드·프레젠테이션 제작 요청 ("발표자료 만들어줘", "슬라이드 만들어줘", "피치덱") | `presentation` 스킬 사용 (presentation-writer 콘텐츠 → 승인 단계 → presentation-designer 디자인 → Reveal.js HTML) |
18
+ | 시스템 설계, 아키텍처 리뷰, 설계 패턴 | `architect` |
19
+ | 보안 취약점, 인증/인가, 시크릿 노출 검토 | `security-reviewer` |
20
+ | 성능 병목, N+1, 메모리 누수 분석 | `performance-reviewer` |
21
+ | 코드 가독성, SOLID, 에러 처리 리뷰 | `quality-reviewer` |
22
+ | 테스트 케이스, 엣지 케이스, QA | `qa-engineer` |
23
+ | UX 문구 작성·교정, 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피 | `ux-writer` |
24
+ | 슬랙·메신저 메시지 작성 또는 딱딱한/AI스러운 초안을 본인 말투로 다듬기 | `slack-messenger` |
25
+ | 슬랙 메시지 전송·예약 발송 요청 ("~라고 보내줘", "공지해줘", "예약 발송해줘") | `slack-send` 스킬 사용 (내부적으로 slack-messenger 다듬기 → 승인 단계 → 전송) |
26
+ | 지라 티켓 본문 작성·구조화 (제목, 설명, 완료 조건, 이슈타입 추천) | `jira-writer` |
27
+ | 지라 티켓 생성 요청 ("티켓 만들어줘", "이슈 생성해줘", "지라에 올려줘") | `jira-create` 스킬 사용 (내부적으로 jira-writer 구조화 → 프로젝트·필드 확정 → 승인 단계 → createJiraIssue) |
28
+ | UI, React, 접근성, 컴포넌트 설계 | `frontend-developer` |
29
+ | UI·React 코드 리뷰, 접근성·번들 최적화 검토 | `frontend-reviewer` |
30
+ | API, DB, 인증, 서버 로직 | `backend-developer` |
31
+ | CI/CD, 인프라, 모니터링 | `devops-engineer` |
32
+ | 요구사항 정리, 로드맵, 유저 스토리 | `product-planner` |
33
+ | 성과 분석·KPI 해석·분기 성과 보고·회고 리포트 | `impact-writer` |
34
+ | 제안서, RFC, 의사결정 메모 등 설득·합의용 기획 산문 | `impact-writer` |
35
+ | 성과 보고서·제안서·RFC·회고 작성 요청 ("성과 보고서 써줘", "제안서 작성", "RFC 써줘") | `brief` 스킬 사용 |
36
+ | 기술 분석, 벤치마크, 사례 조사 | `researcher` |
37
+ | 내 PR에 달린 리뷰 코멘트 답변 본문 작성 (반영·대안·보류·질문) | `code-review-responder` |
38
+ | PR·브랜치·커밋 코드 리뷰 요청 | `/review` 스킬 사용 |
39
+ | 받은 리뷰 반영·답글 게시 요청 ("리뷰 반영해줘", "리뷰 코멘트에 답해줘", "받은 리뷰 처리해줘") | `review-reply` 스킬 사용 (스레드 수집 → 유형 분류 승인 → 수정·커밋 → 답글 승인 → 게시) |
40
+ | PR 작성·생성 요청 ("PR 만들어줘", "PR 작성해줘", "PR 올려줘") | `gestalt:pr` 스킬 사용 |
41
+ | 실행 태스크를 외부 런타임 워커로 뿌리는 요청 ("orca로 실행", "codex로 실행", "워커 띄워서 실행") | `dispatch` 스킬 사용 (런타임 감지 → 같은 워크트리에 터미널 → worker_done 대기 → ready 재계산). 런타임 없으면 execute의 기본 병렬 경로 |
42
+
43
+ ## 표를 늘릴 때
44
+
45
+ 여기 한 줄 추가하면 끝이다. `CLAUDE.md`와 `agent/SKILL.md`를 따라가서 고칠 필요가 없다 — 둘 다
46
+ 이 파일을 가리키기만 하기 때문이다.
@@ -78,17 +78,7 @@ Invoke any Gestalt Role or Review agent directly, outside the Gestalt pipeline.
78
78
 
79
79
  ## Proactive Invocation
80
80
 
81
- 이 스킬은 사용자가 `/agent`를 명시하지 않아도 아래 상황에서 자동으로 실행된다. CLAUDE.md Role Agent 자동 라우팅 규칙에 따라 적절한 에이전트를 선택해 실행한다.
82
-
83
- - 영상, 비디오 URL 포함 또는 "요약해줘" → `video-summarizer`
84
- - 번역투, AI 말투 교정 → `humanize-monolith`
85
- - 문서, README, 가이드 작성 → `technical-writer`
86
- - 발표 슬라이드 콘텐츠, 문구 작성 → `presentation-writer`
87
- - 슬라이드 Reveal.js 구조, 비주얼 디자인 → `presentation-designer`
88
- - 발표자료, 프레젠테이션 제작(콘텐츠+디자인 통합) → `presentation` 스킬
89
- - 보안 검토 → `security-reviewer`
90
- - 성능 분석 → `performance-reviewer`
91
- - 코드 리뷰 → `quality-reviewer`
81
+ 이 스킬은 사용자가 `/agent`를 명시하지 않아도 상황에 맞는 에이전트로 자동 실행된다. 어느 상황에 어느 에이전트나 스킬을 쓸지는 [`../_shared/proactive-routing.md`](../_shared/proactive-routing.md)가 기준 문서다 여기 목록을 따로 옮겨 적지 않는다. 그 파일을 읽고 상황에 맞는 항목을 고른다.
92
82
 
93
83
  에이전트 이름 없이 태스크 설명만 있는 경우: `ges_agent({ action: "list" })`로 전체 목록을 조회한 뒤 설명과 domain을 기반으로 가장 적합한 에이전트를 자동 선택한다.
94
84
 
@@ -119,7 +119,18 @@ git diff {target}...HEAD # 실제 diff (핵심 변경만)
119
119
  - **PR 템플릿이 있는 경우**: 템플릿 구조를 깨지 않는 선에서, 변경 요약 성격의 섹션(예: Changes, 변경 사항) 안이나 바로 아래에 흐름 변화를 배치합니다. 템플릿에 이미 유사 섹션이 있으면 그 안에 녹입니다.
120
120
  - **템플릿이 없는 경우**: `## Changes` 아래에 흐름 변화 섹션을 둡니다.
121
121
  - 흐름 변화가 없는 변경(순수 리팩터링·문서 수정 등)이면 에이전트가 남긴 `흐름 변화 없음` 표기를 그대로 반영하고 억지로 표를 만들지 않습니다.
122
- - 생성된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
122
+
123
+ ### 4.5단계: description 워싱 (humanize-monolith)
124
+
125
+ 3단계 `changeContext`는 `change-context-writer`가 이미 자체 humanize를 거친 텍스트지만 4단계에서 여기에 `출처`, `검증·리뷰`, 자가 리뷰 노트처럼 레포 템플릿이 요구하는 나머지 섹션을 새로 합성합니다. 이 부분은 별도 윤문 없이 나온 문장이라, 4단계에서 합성한 PR 제목과 본문 전체를 `humanize-monolith`로 한 번 더 다듬습니다.
126
+
127
+ `ges_agent { action: "get", name: "humanize-monolith" }`로 에이전트 시스템 프롬프트를 가져온 뒤, PR 제목과 본문 전체에 S1 규칙을 적용해 교정합니다.
128
+
129
+ - **보존 대상**: 코드 블록, 파일 경로, 커밋 해시, 수치, 체크리스트 항목의 사실 내용은 한 글자도 건드리지 않습니다. `## 흐름 변화 (AS-IS → TO-BE)` 섹션의 화살표 대비, 표, Mermaid 구조도 그대로 둡니다.
130
+ - **어투**: `../role-agents/_shared/references/author-voice.md`의 "PR 설명·변경 컨텍스트" 장르 기준을 따릅니다. 담백한 서술체를 유지하되 "~한 것 같습니다"의 부드러움은 깎지 않습니다.
131
+ - **레포 템플릿 구조는 재구성하지 않습니다.** 0단계에서 발견한 PR 템플릿의 섹션 순서, 체크박스, 헤딩은 그대로 두고 문장 표현만 다듬습니다.
132
+
133
+ 윤문된 description을 **사용자에게 미리보기로 먼저 표시**합니다.
123
134
 
124
135
  ### 5단계: gh pr create 확인 및 실행
125
136