@tienne/gestalt 0.51.0 → 0.53.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 (69) hide show
  1. package/CLAUDE.md +7 -4
  2. package/dist/package.json +4 -3
  3. package/dist/plugin/review-agents/quality-reviewer/AGENT.md +30 -3
  4. package/dist/plugin/role-agents/_shared/references/README.md +13 -0
  5. package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +66 -15
  6. package/dist/plugin/role-agents/_shared/references/style-guide.md +40 -0
  7. package/dist/plugin/role-agents/code-review-responder/AGENT.md +1 -1
  8. package/dist/plugin/role-agents/code-review-writer/AGENT.md +1 -1
  9. package/dist/plugin/role-agents/harness-architect/AGENT.md +1 -1
  10. package/dist/plugin/role-agents/humanize-monolith/AGENT.md +20 -2
  11. package/dist/plugin/role-agents/jira-writer/AGENT.md +11 -11
  12. package/dist/plugin/role-agents/slack-messenger/AGENT.md +1 -1
  13. package/dist/plugin/skills/dispatch/SKILL.md +3 -3
  14. package/dist/plugin/skills/execute/SKILL.md +1 -1
  15. package/dist/plugin/skills/jira-create/SKILL.md +5 -5
  16. package/dist/plugin/skills/presentation/SKILL.md +6 -6
  17. package/dist/plugin/skills/review-reply/SKILL.md +3 -3
  18. package/dist/plugin/skills/slack-send/SKILL.md +2 -2
  19. package/dist/src/cli/commands/humanize-check.d.ts +8 -0
  20. package/dist/src/cli/commands/humanize-check.d.ts.map +1 -0
  21. package/dist/src/cli/commands/humanize-check.js +29 -0
  22. package/dist/src/cli/commands/humanize-check.js.map +1 -0
  23. package/dist/src/cli/index.d.ts.map +1 -1
  24. package/dist/src/cli/index.js +11 -0
  25. package/dist/src/cli/index.js.map +1 -1
  26. package/dist/src/code-graph/rrf.d.ts +4 -4
  27. package/dist/src/code-graph/rrf.js +4 -4
  28. package/dist/src/execute/parallel-groups.d.ts +1 -1
  29. package/dist/src/execute/parallel-groups.js +1 -1
  30. package/dist/src/gestalt/surface-labels.d.ts +3 -3
  31. package/dist/src/gestalt/surface-labels.js +1 -1
  32. package/dist/src/humanize/change-rate.d.ts +13 -0
  33. package/dist/src/humanize/change-rate.d.ts.map +1 -0
  34. package/dist/src/humanize/change-rate.js +86 -0
  35. package/dist/src/humanize/change-rate.js.map +1 -0
  36. package/dist/src/humanize/check.d.ts +39 -0
  37. package/dist/src/humanize/check.d.ts.map +1 -0
  38. package/dist/src/humanize/check.js +150 -0
  39. package/dist/src/humanize/check.js.map +1 -0
  40. package/dist/src/humanize/detectors.d.ts +28 -0
  41. package/dist/src/humanize/detectors.d.ts.map +1 -0
  42. package/dist/src/humanize/detectors.js +134 -0
  43. package/dist/src/humanize/detectors.js.map +1 -0
  44. package/dist/src/humanize/index.d.ts +5 -0
  45. package/dist/src/humanize/index.d.ts.map +1 -0
  46. package/dist/src/humanize/index.js +5 -0
  47. package/dist/src/humanize/index.js.map +1 -0
  48. package/dist/src/humanize/rules.d.ts +34 -0
  49. package/dist/src/humanize/rules.d.ts.map +1 -0
  50. package/dist/src/humanize/rules.js +95 -0
  51. package/dist/src/humanize/rules.js.map +1 -0
  52. package/package.json +4 -3
  53. package/plugin/.codex-plugin/plugin.json +1 -1
  54. package/plugin/review-agents/quality-reviewer/AGENT.md +30 -3
  55. package/plugin/role-agents/_shared/references/README.md +13 -0
  56. package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +66 -15
  57. package/plugin/role-agents/_shared/references/style-guide.md +40 -0
  58. package/plugin/role-agents/code-review-responder/AGENT.md +1 -1
  59. package/plugin/role-agents/code-review-writer/AGENT.md +1 -1
  60. package/plugin/role-agents/harness-architect/AGENT.md +1 -1
  61. package/plugin/role-agents/humanize-monolith/AGENT.md +20 -2
  62. package/plugin/role-agents/jira-writer/AGENT.md +11 -11
  63. package/plugin/role-agents/slack-messenger/AGENT.md +1 -1
  64. package/plugin/skills/dispatch/SKILL.md +3 -3
  65. package/plugin/skills/execute/SKILL.md +1 -1
  66. package/plugin/skills/jira-create/SKILL.md +5 -5
  67. package/plugin/skills/presentation/SKILL.md +6 -6
  68. package/plugin/skills/review-reply/SKILL.md +3 -3
  69. package/plugin/skills/slack-send/SKILL.md +2 -2
package/CLAUDE.md CHANGED
@@ -30,6 +30,8 @@ pnpm tsx bin/gestalt.ts interview "topic"
30
30
  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
+ pnpm verify:rules # 룰북과 에이전트 문서의 룰 ID·심각도 정합 검사
34
+ pnpm tsx bin/gestalt.ts humanize-check --before a.md --after b.md --register chat
33
35
  ```
34
36
 
35
37
  ## MCP Tools
@@ -62,7 +64,7 @@ pnpm tsx bin/gestalt.ts init # gestalt.json + code graph + post-commit hook
62
64
  | README, API 문서, 가이드, 개발자 문서 작성 | `technical-writer` |
63
65
  | 발표 슬라이드 콘텐츠·문구·데이터 요약·발표 노트 작성 | `presentation-writer` |
64
66
  | 슬라이드 Reveal.js 구조·템플릿·비주얼 디자인 자문 | `presentation-designer` |
65
- | 발표자료·슬라이드·프레젠테이션 제작 요청 ("발표자료 만들어줘", "슬라이드 만들어줘", "피치덱") | `presentation` 스킬 사용 (presentation-writer 콘텐츠 → 승인 게이트 → presentation-designer 디자인 → Reveal.js HTML) |
67
+ | 발표자료·슬라이드·프레젠테이션 제작 요청 ("발표자료 만들어줘", "슬라이드 만들어줘", "피치덱") | `presentation` 스킬 사용 (presentation-writer 콘텐츠 → 승인 단계 → presentation-designer 디자인 → Reveal.js HTML) |
66
68
  | 시스템 설계, 아키텍처 리뷰, 설계 패턴 | `architect` |
67
69
  | 보안 취약점, 인증/인가, 시크릿 노출 검토 | `security-reviewer` |
68
70
  | 성능 병목, N+1, 메모리 누수 분석 | `performance-reviewer` |
@@ -70,9 +72,9 @@ pnpm tsx bin/gestalt.ts init # gestalt.json + code graph + post-commit hook
70
72
  | 테스트 케이스, 엣지 케이스, QA | `qa-engineer` |
71
73
  | UX 문구 작성·교정, 버튼 텍스트, 에러 메시지, 토스트, 온보딩 카피 | `ux-writer` |
72
74
  | 슬랙·메신저 메시지 작성 또는 딱딱한/AI스러운 초안을 본인 말투로 다듬기 | `slack-messenger` |
73
- | 슬랙 메시지 전송·예약 발송 요청 ("~라고 보내줘", "공지해줘", "예약 발송해줘") | `slack-send` 스킬 사용 (내부적으로 slack-messenger 다듬기 → 승인 게이트 → 전송) |
74
- | 지라 티켓 본문 작성·구조화 (제목, 설명, 인수조건, 이슈타입 추천) | `jira-writer` |
75
- | 지라 티켓 생성 요청 ("티켓 만들어줘", "이슈 생성해줘", "지라에 올려줘") | `jira-create` 스킬 사용 (내부적으로 jira-writer 구조화 → 프로젝트·필드 확정 → 승인 게이트 → createJiraIssue) |
75
+ | 슬랙 메시지 전송·예약 발송 요청 ("~라고 보내줘", "공지해줘", "예약 발송해줘") | `slack-send` 스킬 사용 (내부적으로 slack-messenger 다듬기 → 승인 단계 → 전송) |
76
+ | 지라 티켓 본문 작성·구조화 (제목, 설명, 완료 조건, 이슈타입 추천) | `jira-writer` |
77
+ | 지라 티켓 생성 요청 ("티켓 만들어줘", "이슈 생성해줘", "지라에 올려줘") | `jira-create` 스킬 사용 (내부적으로 jira-writer 구조화 → 프로젝트·필드 확정 → 승인 단계 → createJiraIssue) |
76
78
  | UI, React, 접근성, 컴포넌트 설계 | `frontend-developer` |
77
79
  | UI·React 코드 리뷰, 접근성·번들 최적화 검토 | `frontend-reviewer` |
78
80
  | API, DB, 인증, 서버 로직 | `backend-developer` |
@@ -107,6 +109,7 @@ src/mcp/ — MCP 서버 + 툴 핸들러
107
109
  src/events/ — EventStore (SQLite)
108
110
  src/skills/ — Skill System 엔진 (SKILL.md 파서·실행기, 최상위 skills/와는 별개)
109
111
  src/registry/ — 레지스트리 공통 베이스 클래스
112
+ src/humanize/ — 룰북 읽기 + AI-tell 탐지기 + 윤문 코드 검사 (`gestalt humanize-check` 백엔드)
110
113
  src/utils/ — 알림 등 공용 유틸
111
114
  src/cli/ — commander 기반 CLI
112
115
  plugin/ — 배포 자산 전부. Claude Code와 Codex 플러그인이 이 디렉토리 하나를 공유한다
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.51.0",
3
+ "version": "0.53.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",
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",
24
24
  "verify:plugin": "tsx scripts/verify-plugin-assets.ts",
25
25
  "prepublishOnly": "pnpm build",
26
26
  "test": "vitest run",
@@ -33,7 +33,8 @@
33
33
  "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
34
34
  "format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"",
35
35
  "version:sync": "tsx scripts/sync-version.ts",
36
- "postversion": "pnpm run version:sync"
36
+ "postversion": "pnpm run version:sync",
37
+ "verify:rules": "tsx scripts/verify-rule-refs.ts"
37
38
  },
38
39
  "dependencies": {
39
40
  "@anthropic-ai/sdk": "^0.39.0",
@@ -3,8 +3,8 @@ name: quality-reviewer
3
3
  tier: standard
4
4
  pipeline: review
5
5
  role: true
6
- domain: ["code-quality", "readability", "maintainability", "solid", "dry", "naming", "complexity", "error-handling", "testing", "documentation", "refactoring", "design-pattern"]
7
- description: "코드 품질 리뷰 전문가. 가독성, 유지보수성, SOLID 원칙, 에러 핸들링, 중복 코드, 네이밍 컨벤션 등 코드 품질 관점의 리뷰를 수행한다."
6
+ domain: ["code-quality", "readability", "maintainability", "solid", "dry", "naming", "complexity", "error-handling", "testing", "documentation", "comments", "refactoring", "design-pattern"]
7
+ description: "코드 품질 리뷰 전문가. 가독성, 유지보수성, SOLID 원칙, 에러 핸들링, 중복 코드, 네이밍 컨벤션, 불필요한 주석 등 코드 품질 관점의 리뷰를 수행한다."
8
8
  ---
9
9
 
10
10
  You are the Quality Reviewer agent.
@@ -20,12 +20,39 @@ When reviewing code, check for:
20
20
  3. **Error Handling**: Swallowed errors, missing error boundaries, unclear error messages
21
21
  4. **DRY Violations**: Duplicated logic that should be extracted
22
22
  5. **Complexity**: Functions doing too many things, deep nesting, high cyclomatic complexity
23
+ 6. **Comment Hygiene**: Comments that restate the code, record change history, or comment out dead code — see below
24
+
25
+ ## Comment Hygiene
26
+
27
+ 주석은 기본적으로 없는 게 낫습니다. 코드를 읽거나 `git log`/`git blame`으로 확인되는 내용이면 주석으로 남길 이유가 없고, 코드가 바뀔 때 같이 안 고쳐져서 거짓말이 됩니다. 변경된 코드에 아래 주석이 보이면 **반드시 이슈로 남깁니다.**
28
+
29
+ **지적할 주석**
30
+
31
+ - 코드를 그대로 옮겨 적은 것 — `// 카운트를 1 증가` 위의 `count += 1`, 시그니처만 반복하는 내부 함수 JSDoc
32
+ - 변경 이력·작업 메모 — `// 2026-03-12 수정`, `// 기존 로직 제거함`, `// 리뷰 반영`. 커밋 메시지가 이미 담고 있습니다
33
+ - 주석 처리된 죽은 코드 — 되살릴 일 있으면 히스토리에서 꺼냅니다
34
+ - 코드와 이미 어긋난 주석 — 설명하는 동작이 지금 코드에 없는 것
35
+ - 섹션 배너 — `// ===== helpers =====` 같은 것. 파일이나 함수를 나누라는 신호입니다
36
+ - 티켓 번호 없는 TODO/FIXME — 언제 사라질지 아무도 모릅니다
37
+
38
+ **남겨야 할 주석 (WHY만)**
39
+
40
+ - 왜 이 방식을 골랐는지, 왜 뻔한 쪽으로 안 갔는지 — 외부 API 버그 우회, 성능 제약, 스펙 요구사항
41
+ - 겉보기에 틀린 것처럼 보이는 코드가 의도된 것이라는 근거
42
+ - 공개 API·공용 유틸의 JSDoc (내부 전용 함수는 제외)
43
+
44
+ **주석 대신 코드나 문서로.** 주석을 지우자고만 하지 말고 대체 표현까지 제안합니다 — 이름을 풀어쓰거나, 블록을 함수로 빼거나, 매직 넘버를 이름 붙은 상수로 올리거나, 배경 설명이 길면 README·ADR로 옮기고 링크만 남기는 식입니다.
45
+
46
+ **severity 기준**
47
+
48
+ - `high`: 코드와 어긋난 주석, 주석 처리된 죽은 코드 (읽는 사람을 잘못된 방향으로 끕니다)
49
+ - `warning`: 코드 반복, 변경 이력 메모, 섹션 배너, 티켓 없는 TODO
23
50
 
24
51
  ## Output Format
25
52
 
26
53
  For each issue found, provide:
27
54
  - severity: critical | high | warning
28
- - category: "quality"
55
+ - category: "quality" (주석 이슈는 "quality:comments")
29
56
  - file and line number
30
57
  - Clear description of the quality concern
31
58
  - Specific refactoring suggestion
@@ -12,9 +12,22 @@
12
12
 
13
13
  ## 고칠 때
14
14
 
15
+ 룰 ID와 심각도는 `ai-tell-quick-rules.md`가 기준이다. 고친 뒤에는 반드시 돌린다.
16
+
17
+ ```bash
18
+ pnpm verify:rules
19
+ ```
20
+
21
+ 에이전트 문서 14곳이 룰 ID와 금지 어휘를 손으로 옮겨 적고 있어서, 룰북에서 ID를 지우거나
22
+ 심각도를 바꾸면 그 사본들이 조용히 어긋난다. 이 검사가 네 가지를 본다 — 없는 ID를 인용하는
23
+ 문서, 자체검증 목록에서 빠진 S1, 표와 목록의 심각도 불일치, 룰 문서 본문의 금지어 사용.
24
+ `pnpm test`와 `pnpm build`에도 걸려 있다.
25
+
15
26
  - **룰을 추가하면 그 문서가 스스로 그 룰을 지키는지 먼저 확인한다.** 룰 문서가 금지 어휘를
16
27
  본문에 쓰면 산출물로 샌다. 금지어를 넣었으면 같은 문서를 grep한다.
17
28
  - 어투 규칙은 **S1으로 올려야 실제로 강제된다.** S2는 모델이 우선순위를 알아서 정하면서 새어나간다.
29
+ - 심각도를 바꿀 때는 근거를 남긴다. A-2, I-1, C-8은 대조 코퍼스 측정으로 조정했고 그 근거가
30
+ 룰북 §실측 근거에 있다. 감으로 올리고 내리면 다음 사람이 되돌린다.
18
31
  - 경로를 참조하는 자리가 여러 곳이다. 파일을 옮기거나 이름을 바꾸면 `plugin/` 전체에서
19
32
  상대경로 참조를 다시 확인한다 (에이전트는 `../_shared/references/`, 에이전트의 `references/`
20
33
  하위 문서는 `../../_shared/references/`, 스킬은 `../../role-agents/_shared/references/`).
@@ -1,18 +1,24 @@
1
1
  # Quick Rules — Monolith Fast Path 전용 (v2.0)
2
2
 
3
- `humanize-monolith` 에이전트가 한 콜에서 탐지·윤문·자체검증을 끝내기 위해 사용하는 슬림 룰북. 본진 `ai-tell-taxonomy.md`(590줄)에서 S1·S2 핵심 패턴만 추려 처방과 함께 한 줄로 압축했다.
3
+ `humanize-monolith` 에이전트가 한 콜에서 탐지·윤문·자체검증을 끝내기 위해 사용하는 슬림 룰북. 기준 문서 `ai-tell-taxonomy.md`(590줄)에서 S1·S2 핵심 패턴만 추려 처방과 함께 한 줄로 압축했다.
4
4
 
5
- **원칙:** 정의 1줄 + 처방 1줄. 예문 생략. 본진 ID와 1:1 매칭.
5
+ **원칙:** 정의 1줄 + 처방 1줄. 예문 생략. 기준 문서 ID와 1:1 매칭.
6
6
 
7
7
  **Do-NOT (탐지·윤문 모두 제외):** 고유명사·제품명·모델명·기관명, 수치·날짜·단위, 큰따옴표 안 직접 인용, 법률 조문, 수학·화학·통계 표기, 영어 약어(LLM·GPU·MCP·API 등 업계 표준).
8
8
 
9
- **굳어진 음차 화이트리스트 (B-3 제외 그대로 둔다):** 컴포넌트·토큰·커밋·인터페이스·메서드·빌드·디플로이·캐시·렌더링·콜백·프레임워크·라이브러리·리팩터링·마이그레이션·아이콘·레이아웃·그리드·모달·토스트·타이포그래피·플레이스홀더·프로젝트·스프린트·이슈·리뷰·머지·브랜치·사이드 이펙트·보일러플레이트·트레이드오프·딥다이브·얼라인·온보딩 업계 정착어. 목록 밖의 굳어진 음차(소스 오브 트루스·룩 필·로우 행잉 프룻 등)만 B-3로 교정한다.
9
+ **약어 면제는 업계 표준에만 준다:** 풀어 썼을 굳어진 음차가 되는 약어는 면제 대상이 아니다. `SSOT`나 `SoT`를 그대로 두면 "소스 오브 트루스"를 약어로 우회한 것과 같다 B-3로 우리말로 푼다. 무엇을 가리키느냐에 따라 말이 달라지므로 대체어 표는 `style-guide.md` §single source of truth를 뭐라고 쓸까에 둔다. LLM·API처럼 풀어 쓸 일이 없는 표준 약어만 그대로 둔다.
10
+
11
+ **굳어진 음차 화이트리스트 (B-3 제외 — 그대로 둔다):** 컴포넌트·토큰·커밋·인터페이스·메서드·빌드·디플로이·캐시·렌더링·콜백·프레임워크·라이브러리·리팩터링·마이그레이션·아이콘·레이아웃·그리드·모달·토스트·타이포그래피·플레이스홀더·프로젝트·스프린트·이슈·리뷰·머지·브랜치·사이드 이펙트·보일러플레이트·트레이드오프·딥다이브·얼라인·온보딩·소스·롤백·파싱·레지스트리·불릿 등 업계 정착어. 이 목록 밖의 안 굳어진 음차(소스 오브 트루스·룩 앤 필·로우 행잉 프룻 등)만 B-3로 교정한다.
10
12
 
11
13
  **과윤문 가드:** 변경률 30% 초과 = 경고, 50% 초과 = 강제 중단·롤백.
12
14
 
13
15
  **삭제 처방은 삭제다 (중요):** 처방에 "삭제"가 있는 항목은 **더 나은 표현으로 바꾸지 않는다.** 지우고, 그 자리를 원문에 이미 있는 가장 구체적인 문장으로 대신한다. 모델은 D-2·D-3·D-4·D-6·C-10처럼 "삭제"라고 적힌 항목에서 리듬을 살리려고 새 마무리 문장이나 새 부제를 만들어 넣는 경향이 강한데, 그건 원문에 없던 수사를 추가하는 것이라 자체검증 6번에 걸린다. 지울 자리에 쓸 문장이 원문에 없으면 그냥 앞 문장에서 끝낸다.
14
16
 
15
- **말투 감도 (중요):** 같은 명사화·번역투라도 **대화나 리뷰 코멘트에서는 문서보다 훨씬 튄다.** 문서(칼럼·리포트) 기준 S2인 F-4·F-5·F-6·F-7·I-5·A-5 계열은 대화·리뷰 코멘트에서 **S1로 격상**해 교정한다. 사람은 대화에서 개념을 명사 덩어리로 뭉치지 않고 동사로 풀어 말하기 때문이다.
17
+ **말투 감도 (중요):** 같은 명사화·번역투라도 **대화나 리뷰 코멘트에서는 문서보다 훨씬 튄다.** 문서(칼럼·리포트) 기준 S2인 A-2, A-5, F-4, F-5, F-6, F-7, I-1, I-5 계열은 대화·리뷰 코멘트에서 **S1로 격상**해 교정한다. 사람은 대화에서 개념을 명사 덩어리로 뭉치지 않고 동사로 풀어 말하기 때문이다. 심각도 칸에 `S2 / **대화·리뷰 S1**`이라고 적힌 룰이 여기 해당한다.
18
+
19
+ **한자어를 피하는 게 목적이 아니다 (F-4·F-5 오적용 주의):** 겨냥하는 건 개념을 뭉친 **명사화**(-성/-적/-화)이지 한자어 동사가 아니다. "측정하다"를 "재다"로, "판단하다"를 "따지다"로 바꾸면 정확도만 잃는다. 그 자리의 정확한 말이 한자어면 한자어를 쓴다. 반대 방향 실수도 같다 — 한자어를 피하려고 비유 명사(축·증류)나 물리 동사(재다)로 도망가면 F-7에 걸린다. 셋 다 겪은 실례: `네 축을 따로 재고 판정한다` → `4가지 측면에서 각각 측정하고 판단한다`.
20
+
21
+ **근거가 붙은 룰 (→ 아래 §실측 근거):** A-2, I-1, C-8은 대조 코퍼스 측정으로 심각도를 조정했고, B-4는 팀이 실제로 쓰는 말이라 예시에서 뺐다. 원어민이 오히려 더 쓰는 표현이나 팀에서 이미 굳은 말을 지우면 사람 글을 AI 글로 만든다.
16
22
 
17
23
  ---
18
24
 
@@ -21,10 +27,10 @@
21
27
  | ID | 패턴 | 심각도 | 처방 |
22
28
  |---|---|---|---|
23
29
  | A-1 | "~에 대해(서)" | S1 | 목적격 조사로 직결("X에 대해 논의" → "X를 논의") |
24
- | A-2 | "~를 통해/통하여" 남발 | S1 | "~로", "~해서", "~함으로써"로 분산 |
30
+ | A-2 | "~를 통해/통하여" **한 글에 3회+ 반복** | S2 / **대화·리뷰 S1** | 반복분만 "~로", "~해서", "~함으로써"로 분산하고 1~2회는 남긴다. 문서 산문에서 원어민이 번역문보다 2배 더 쓰는 표현이라 전부 지우면 오히려 어색해진다 (최희경 2016). 대화·리뷰 코멘트에서는 1회부터 교정 |
25
31
  | A-3 | "~에 있어(서)" | S1 | "~에서", "~을 볼 때" |
26
32
  | A-4 | "~라는 점에서" 3회+ | S2 | "~서", "~라는 이유로" |
27
- | A-5 | "~와 관련하여/관련된" | S2 | "~에", "~의" |
33
+ | A-5 | "~와 관련하여/관련된" | S2 / **대화·리뷰 S1** | "~에", "~의" |
28
34
  | A-6 | "~에 기반하여/바탕으로" 남발 | S2 | "~로", "~을 보고" |
29
35
  | A-7 | "가지고 있다" / have·make·take·give + N 직역 | S1 | 형용사·동사 환원 또는 이중주어("회의를 가지다" → "회의를 했다", "강한 경쟁력을 가지고 있다" → "경쟁력이 강하다") |
30
36
  | A-8 | 이중 피동 "~되어진다" | S1 | 능동 또는 단일 피동 ("판단되어진다" → "판단된다") |
@@ -42,8 +48,8 @@
42
48
  |---|---|---|---|
43
49
  | B-1 | 한글 + 괄호 영어 매번 ("~(Sovereign AI)" 처럼) | S2 | 첫 등장만 병기, 이후 한글만 |
44
50
  | B-2 | 영어 어휘 직역 가능한데 그대로 | S2 | 한국어로 옮기되 업계 표준은 유지 |
45
- | B-3 | 안 굳어진 영어 구·단어 음차 표기 ("소스 오브 트루스") | S1 | 한글 의역 + 첫 등장만 원어 괄호 병기("진실의 원천(source of truth)"), 이후 한글만. 단 위 "굳어진 음차 화이트리스트"에 있는 정착어는 Do-NOT — of/and 등 기능어까지 통째 음차한 구(룩 앤 필·로우 행잉 프룻)가 최우선 대상 |
46
- | B-4 | 영어 개념을 어색하게 옮긴 조어("소비처" ← consumer, "생산처") | S2 | 정착한 우리말로("소비처" "사용처", 코드 맥락이면 "호출부"). 억지 신조어 대신 이미 쓰이는 |
51
+ | B-3 | 안 굳어진 영어 구·단어 음차 표기 ("소스 오브 트루스"), 그 음차를 약어로 우회한 표기(`SSOT`·`SoT`) | S1 | 한글 의역 + 첫 등장만 원어 괄호 병기("진실의 원천(source of truth)"), 이후 한글만. 단 위 "굳어진 음차 화이트리스트"에 있는 정착어는 Do-NOT — of/and 등 기능어까지 통째 음차한 구(룩 앤 필·로우 행잉 프룻)가 최우선 대상 |
52
+ | B-4 | 영어 개념을 어색하게 옮긴 조어("생산처" ← producer, "응답처") | S2 | 억지 신조어 대신 이미 쓰이는 말로. 코드 맥락이면 "호출부"·"사용처". **팀에서 이미 굳은 조어는 예외** "소비처"는 WDS 티켓에서 라이브러리를 가져다 쓰는 쪽을 가리키는 말로 정착했으므로 교정 대상이 아니다 (→ 아래 §실측 근거) |
47
53
 
48
54
  ## C. 구조적 AI 패턴
49
55
 
@@ -51,7 +57,7 @@
51
57
  |---|---|---|---|
52
58
  | C-5 | 이모지 남발 | S1 | 장르 칼럼·리포트면 전부 삭제 |
53
59
  | C-7 | "먼저·반면·결국" 3단 공식 | S2 | 접속사 1~2개로 줄이거나 본문에 녹여 제거 |
54
- | C-8 | "A인가·B인가" 대구 반복 | S2 | 한 번만 살리고 나머지는 평서문으로 |
60
+ | C-8 | "A인가, B인가" / "A가 아니라 B" 대구 반복 | S1 | 한 번만 살리고 나머지는 비대칭 평서문·직접 단언으로. 대조 코퍼스에서 인간 대비 9.2배(개인 글 기준 18배)로 나온 최강 신호이고 모델 계열을 안 가린다 |
55
61
  | C-9 | 숫자 괄호 인덱싱 "(1)·(2)·(3)" | S2 | 본문에 녹이거나 단순 줄바꿈 |
56
62
  | C-10 | 콜론 부제 헤딩 "X: Y" 반복 | S1 | 콜론 뒤를 버리고 앞부분만 남긴다. **더 좋은 부제로 바꾸지 않는다** — 부제를 갈아끼우면 패턴이 그대로 남는다. 앞부분만으로 뜻이 안 서면 평서 헤딩 한 문장으로 |
57
63
  | C-11 | 연결어미 뒤 쉼표 (-고/-며/-지만/-며서/-아서/-어서 직후 쉼표) | S1 | 쉼표 제거. 6+회=강한 신호. KatFish 4.84배 분리도 |
@@ -81,10 +87,10 @@
81
87
 
82
88
  | ID | 패턴 | 심각도 | 처방 |
83
89
  |---|---|---|---|
84
- | F-4 | 한자어 명사화 -성/-적/-화 + 영어 명사화 -tion/-ment/-ness/-ity 누적 (한 글 12회+) | S2 | 동사·형용사 어근으로 환원("the implementation of the policy" → "정책 시행" 또는 "정책을 시행하기") |
85
- | F-5 | "~적 N" 추상 체인 ("전략적 함의·실천적 기반") | S2 | 명사+명사 또는 풀어쓰기("전략 함의·실천의 기반") |
90
+ | F-4 | 한자어 명사화 -성/-적/-화 + 영어 명사화 -tion/-ment/-ness/-ity 누적 (한 글 12회+) | S2 / **대화·리뷰 S1** | 동사·형용사 어근으로 환원("the implementation of the policy" → "정책 시행" 또는 "정책을 시행하기") |
91
+ | F-5 | "~적 N" 추상 체인 ("전략적 함의", "실천적 기반") | S2 / **대화·리뷰 S1** | 명사+명사 또는 풀어쓰기("전략 함의", "실천의 기반") |
86
92
  | F-6 | 복합명사 압축 — 명사구를 조사·동사 없이 이어붙여 개념을 뭉침 ("시안 정합 버그픽스", "유지보수성 개선 작업", "권한 체크 로직") | S2 / **대화·리뷰 S1** | 동사·조사로 풀어 서술 ("디자인 시안과 다르게 렌더링되던 문제", "나중에 유지보수하기 편하게"). 사람은 압축 명사구 대신 무엇을 왜 했는지 풀어 말한다 |
87
- | F-7 | 기술·이공계 비유 명사를 일상 대화에 그대로 (증류·배선·결정화·평탄화·오케스트레이션·파이프라인화 등, 화학·전기·수학 어휘의 비유 차용) | S2 / **대화·리뷰 S1** | 일상 동사로 환원 (증류 → "추려내다/뽑아내다", 배선 → "연결하다/걸어두다", 결정화 → "정리하다", 평탄화 → "밋밋하게 만들다"). 문법은 멀쩡해 룰 매칭이 안 되지만 사람은 대화에서 안 쓴다. 도메인 정식 용어(코드의 "파이프라인" 자체 등)는 예외 |
93
+ | F-7 | 기술·이공계 비유 명사를 일상 대화에 그대로 (증류·배선·결정화·평탄화·오케스트레이션·파이프라인화·축 등, 화학·전기·수학 어휘의 비유 차용) | S2 / **대화·리뷰 S1** | 일상 동사·명사로 환원 (증류 → "추려내다/뽑아내다", 배선 → "연결하다/걸어두다", 결정화 → "정리하다", 평탄화 → "밋밋하게 만들다", **축 → "측면"**·"기준"). 문법은 멀쩡해 룰 매칭이 안 되지만 사람은 대화에서 안 쓴다. "네 축을 잰다"가 아니라 "4가지 측면에서 측정한다". **예외는 그 프로젝트가 개념에 붙인 이름일 때만이고, 그 개념을 다루는 자리에서만이다** — 게슈탈트의 "스펙 결정화"는 `similarity-crystallizer` 에이전트 이름이자 인터뷰→Spec 변환의 정의라서 두지만, 같은 말을 지라 티켓 작성처럼 무관한 자리에 끌어다 쓰면 F-7이다. 코드의 "파이프라인" 자체, 그래프의 x축도 같은 기준 |
88
94
 
89
95
  ## G. Hedging
90
96
 
@@ -106,7 +112,7 @@
106
112
 
107
113
  | ID | 패턴 | 심각도 | 처방 |
108
114
  |---|---|---|---|
109
- | I-1 | "~인 것이다/~한 것이다" 결말 | S1 | 평서형으로 |
115
+ | I-1 | "~인 것이다/~한 것이다" 결말 **연속 3회+** | S2 / **대화·리뷰 S1** | 반복분만 평서형으로. 문서 산문에서는 인간이 AI보다 2배 더 쓰는 표현이라 한두 번은 그대로 둔다. 대화·리뷰 코멘트에서는 1회부터 교정 |
110
116
  | I-2 | "X은 ~라는 점에 있다" | S2 | "X는 ~다" 직설로 |
111
117
  | I-3 | "~다는 뜻이다/~다는 의미다" 결말 | S2 | 본문에 풀어 쓰기 |
112
118
  | I-4 | 권고형 결말 "~해야 한다·~합니다" 반복 | S2 | 평서·단언으로 |
@@ -118,7 +124,7 @@
118
124
  |---|---|---|---|
119
125
  | J-1 | 헤딩 마크다운 ** 강조 남발 | S2 | 칼럼·리포트면 거의 다 제거 |
120
126
  | J-2 | 따옴표 강조 5회+ | S1 | 핵심 한두 개만 살리고 평어로 |
121
- | J-3 | 불릿 리스트 (장르가 칼럼·리포트일 때) | S2 | 문단 산문으로 통합 |
127
+ | J-3 | 불릿 목록 (장르가 칼럼·리포트일 때) | S2 | 문단 산문으로 통합 |
122
128
 
123
129
  ---
124
130
 
@@ -130,12 +136,57 @@
130
136
  2. **변경률**: 30% 이하인가 (50% 초과는 작업 중단)
131
137
  3. **장르 이탈 없음**: 칼럼이 에세이·문학으로 변하지 않았는가, 리포트가 블로그체로 떨어지지 않았는가
132
138
  4. **말투 보존**: 원문 격식체면 결과도 격식체. 평어체로 떨어뜨리지 않는다
133
- 5. **잔존 S1 패턴 0건**: D-1~D-7, A-7, A-8, A-16, B-3, C-5, C-10, C-11, C-12, H-1, I-1, J-2 핵심 S1이 남아있지 않은가 (대화·리뷰 말투면 F-6·F-7·I-5·F-4·F-5·A-5도 S1로 포함)
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로 포함)
134
140
  6. **인공 표현 자제**: 원문에 없던 비유·수사·문학적 표현을 윤문 과정에서 임의로 추가하지 않았는가
135
141
  7. **삭제 처방 준수**: D-2·D-3·D-4·D-6·C-10을 재작성으로 처리하지 않았는가. 마무리 문장·부제·수식어를 지우는 대신 더 그럴듯한 것으로 갈아끼운 자리가 없는가
136
142
 
137
143
  위반 시: edit 롤백 → 다시 윤문 → 재점검. 자체 루프 최대 1회. 이상 미해결이면 결과를 그대로 출력하되 `summary.md`에 "자가검증 미통과 항목 N건" 표기.
138
144
 
145
+ ## 코드 검사 (자가 채점보다 위)
146
+
147
+ 아래 등급은 모델이 스스로 매기는 참고값이다. 실제 판단은 코드가 한다.
148
+
149
+ ```bash
150
+ gestalt humanize-check --before before.md --after after.md --register chat
151
+ ```
152
+
153
+ 변경률, S1 잔존, 보호 토큰 생존, 구조 보존 4가지 측면에서 각각 측정하고 exit code로 답한다
154
+ (0 통과 / 1 경고 / 2 채택 금지 / 3 판정 불가). 변경률 하나만 보면 구조 편집이 안 보인다 —
155
+ 변경률 2.8%인데 문장 3할이 갈려나간 사례가 있었다. **이 출력대로 판정하고, 자기가 낸 값으로
156
+ 덮어쓰지 않는다.** 측면별 임계와 탐지 대상 룰은 `src/humanize/`에 있다.
157
+
158
+ ## 실측 근거
159
+
160
+ 감으로 올리고 내린 심각도는 다음 사람이 되돌린다. 바꿀 때는 근거를 남긴다.
161
+
162
+ ### 대조 코퍼스 (A-2, I-1, C-8)
163
+
164
+ AI 생성 산문 60편(모델 3종)과 2022년 이전 발행이 확인된 한국어 산문 60편을 로그우도비 G²로
165
+ 비교한 결과다.
166
+
167
+ | 룰 | 측정 | 조정 |
168
+ |---|---|---|
169
+ | A-2 "~를 통해" | 비번역 한국어 84.4 vs 번역문 42.1 — 원어민이 2배 더 쓴다 (최희경 2016). AI 코퍼스에는 거의 안 나옴 | S1 → S2, 대화·리뷰만 S1 |
170
+ | I-1 "~한 것이다" | AI 20.4 vs 인간 43.0 (G²=6.2) — 인간이 2배 더 씀. 단락 말 위치·연속 반복도 AI가 더 적음 | S1 → S2(연속 3회+), 대화·리뷰만 S1 |
171
+ | C-8 부정 대구 | AI 5.8 vs 인간 0.6 (9.2배, G²=41.7) — 개인 글 대비로는 18배. 모델 3종 공통 | S2 → S1 |
172
+
173
+ 읽을 때 두 가지를 같이 봐야 한다. 인간 코퍼스가 **편집된 출판 산문**이라 "인간 일반"이 아니라
174
+ "잘 쓴 글"과의 대조다. 그리고 이 측정은 **문서 산문**을 잰 것이라 대화·리뷰 코멘트에는 그대로
175
+ 적용되지 않는다 — A-2와 I-1이 대화에서 S1로 남는 이유가 이것이다.
176
+ 출처: [`epoko77-ai/im-not-ai`](https://github.com/epoko77-ai/im-not-ai)의 `empirical-validation.md`.
177
+
178
+ ### 팀 실제 사용 (B-4)
179
+
180
+ 룰이 팀에서 이미 굳은 말을 금지하고 있으면 룰이 틀린 것이다. 산출물을 어색하게 만든다.
181
+
182
+ | 룰 | 확인한 것 | 조정 |
183
+ |---|---|---|
184
+ | B-4 "소비처" | WDS 티켓 894, 919, 921에서 섹션 헤딩과 본문으로 일관되게 쓴다. 작성자 본인 어휘다 | 교정 예시에서 제외 |
185
+
186
+ **교정어를 정하기 전에 팀이 실제로 뭐라고 쓰는지 먼저 본다.** 지라·PR·슬랙을 검색하면 답이 있다.
187
+ "인수조건"도 같은 방법으로 걷어냈다 — WDS 전체에 5건뿐이고 그중 넷이 2025년 9월 한 묶음,
188
+ 나머지 하나는 이 에이전트가 직접 넣은 것이었다. 팀이 쓰는 말이 아니라 템플릿이 심은 말이었다.
189
+
139
190
  ## 등급 기준 (자가 채점)
140
191
 
141
192
  - **A**: S1 잔존 0, S2 잔존 2 이하, 변경률 10~25%, 자체검증 7항 모두 통과
@@ -50,6 +50,46 @@
50
50
  | 한국어 + 영어 병기 | 첫 등장 전문 용어 | 이벤트 소싱(Event Sourcing) |
51
51
  | 한국어만 | 자연스러운 표현 존재 | 버전 관리 (버저닝 ❌), 배포 (디플로이먼트 ❌) |
52
52
 
53
+ ### single source of truth를 뭐라고 쓸까
54
+
55
+ `SSOT`, `SoT`는 쓰지 않는다. "소스 오브 트루스"를 약어로 우회한 것이라 `ai-tell-quick-rules.md` B-3에 걸린다.
56
+ 한 단어로 정해두면 안 맞는 자리에 억지로 들어가니, **무엇을 가리키는지 보고 고른다.**
57
+
58
+ | 가리키는 것 | 쓰는 말 |
59
+ |---|---|
60
+ | 규칙·정의가 적힌 문서 | 기준 문서 |
61
+ | 비교 대상이 되는 수치 | 기준값 (목표 대비, 전기 대비 등 — impact-writer 용법) |
62
+ | 여러 사본 중 원본 하나 | 정본 |
63
+ | 조회·대조용 참조 자료 | 참조 기준 |
64
+ | 데이터가 처음 만들어지는 곳 | 원천 데이터 |
65
+ | 값을 담고 있는 데이터 자체 | 기준 데이터 |
66
+ | 회계·정산·과금 기록 | 기록 원장 |
67
+ | 조직이 인정한 발표처 | 공식 출처 |
68
+ | 기록을 관장하는 시스템 | 공식 기록 시스템 |
69
+ | 개념 자체를 풀어 말할 때 | 단일 기준점 |
70
+
71
+ **첫 번째 선택지는 단어를 안 붙이는 것이다.** 문맥이 이미 분명하면 파일 이름이나 대상만 쓴다.
72
+ "룰북과 에이전트 문서가 갈라졌는지 본다"가 "룰북 기준 문서와…"보다 낫다.
73
+ 명사를 고르기 전에 동사로 풀 수 있는지 먼저 본다 — "A가 기준이다", "A를 기준으로 삼는다".
74
+
75
+ ### 음차를 옮길 때 — 한 단어로 정하지 않는다
76
+
77
+ 같은 영어 단어라도 가리키는 게 다르면 다른 말이 된다. 대체어 하나를 정해놓고 전부 치환하면
78
+ 안 맞는 자리가 반드시 생긴다.
79
+
80
+ | 음차 | 가리키는 것 | 쓰는 말 |
81
+ |---|---|---|
82
+ | gate | 사람이 확인하고 넘어가는 지점 | 승인 단계 |
83
+ | gate | 코드가 통과·차단을 정하는 검사 | 검사 |
84
+ | layer | 쌓여 올라가는 구조, 중첩 깊이 | 계층 |
85
+ | layer | 동시에 처리되는 한 덩어리 | 묶음 |
86
+ | layer | 순서대로 밟는 구간 | 단계 |
87
+ | layer | 책임이 갈리는 구분 | 역할 |
88
+
89
+ **일괄 치환은 조사를 깨뜨린다.** 받침 유무가 바뀌면 뒤따르는 조사도 바뀐다.
90
+ `레이어라면` → `계층이라면`, `레이어(…)는` → `계층(…)은`. 실제로 이 자리에서 두 번 깨졌다.
91
+ 찾아 바꾸기로 밀지 말고 문장을 하나씩 읽는다.
92
+
53
93
  ---
54
94
 
55
95
  ## English Documentation Style
@@ -99,7 +99,7 @@ key는 넣었는데 index 대신 id를 썼어요. 목록 순서가 바뀌는 케
99
99
 
100
100
  ### Humanize 처리
101
101
 
102
- 초안을 쓴 뒤 AI-tell을 점검한다. SoT는 [`../_shared/references/ai-tell-quick-rules.md`](../_shared/references/ai-tell-quick-rules.md)이고, 답글엔 특히 아래가 자주 샌다.
102
+ 초안을 쓴 뒤 AI-tell을 점검한다. 기준은 [`../_shared/references/ai-tell-quick-rules.md`](../_shared/references/ai-tell-quick-rules.md)이고, 답글엔 특히 아래가 자주 샌다.
103
103
 
104
104
  | 패턴 | 예시 | 교정 |
105
105
  |------|------|------|
@@ -82,7 +82,7 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
82
82
 
83
83
  ### Humanize 처리 — AI-tell 제거 + 음차 교정
84
84
 
85
- 코멘트 초안을 작성한 뒤 AI-tell을 점검·교정한다. 교정 규칙의 SoT는
85
+ 코멘트 초안을 작성한 뒤 AI-tell을 점검·교정한다. 교정 규칙의 기준은
86
86
  [`../_shared/references/ai-tell-quick-rules.md`](../_shared/references/ai-tell-quick-rules.md)이며,
87
87
  인라인 코멘트엔 특히 다음을 적용한다.
88
88
 
@@ -187,7 +187,7 @@ $ARGUMENTS
187
187
 
188
188
  1. **목적 명확화**: 이 하네스가 어떤 문제를 해결하는가? 입력과 출력은 무엇인가?
189
189
  2. **철칙 도출**: 절대 위반하면 안 되는 조건이 무엇인가? (의미 보존, 품질 기준 등)
190
- 3. **에이전트 분해**: 전체 작업을 단일 책임 단위로 분해. 탐지/실행/검증 레이어 구분.
190
+ 3. **에이전트 분해**: 전체 작업을 단일 책임 단위로 분해. 탐지/실행/검증 역할 구분.
191
191
  4. **Fast/Full 선택**: 입력 크기, 검증 독립성, 반응 속도 요구에 따라 결정.
192
192
  5. **파이프라인 조립**: 단계 순서, 병렬 처리 가능 구간, 재시도 루프, 에스컬레이션 조건.
193
193
  6. **파일 작성**: CLAUDE.md → AGENT.md들 → SKILL.md → Command 파일 순서로 작성.
@@ -76,7 +76,7 @@ S2
76
76
 
77
77
  원문을 훑어 AI-tell 패턴을 ID 단위로 식별한다. 룰북의 A~J 카테고리를 기준으로 삼는다.
78
78
 
79
- - S1(심각): D-1~D-7, A-7, A-8, A-16, B-3, C-5, C-10, C-11, H-1, I-1, J-2 반드시 제거
79
+ - S1(심각): 룰북 자체검증 5번이 열거한 패턴 반드시 제거. 대화·리뷰 말투면 거기 적힌 격상분까지 포함
80
80
  - S2(경미): 빈도·맥락을 보고 선별 교정. 무리하게 다 고치지 않는다
81
81
 
82
82
  ### 2단계 — 처방
@@ -110,7 +110,7 @@ S2
110
110
  - 큰따옴표 안 직접 인용
111
111
  - 법률 조문, 수학·화학·통계 표기
112
112
  - 영어 약어(LLM·GPU·MCP·API 등 업계 표준)
113
- - 굳어진 음차 화이트리스트(B-3 제외): 컴포넌트·토큰·커밋·인터페이스·메서드·빌드·디플로이·캐시·렌더링·콜백·프레임워크·라이브러리·리팩터링·마이그레이션·아이콘·레이아웃·그리드·모달·토스트·타이포그래피·플레이스홀더·프로젝트·스프린트·이슈·리뷰·머지·브랜치·사이드 이펙트·보일러플레이트·트레이드오프·딥다이브·얼라인·온보딩 등 정착어는 그대로 둔다. 목록 밖 안 굳어진 음차(소스 오브 트루스·룩 앤 필 등)만 B-3로 교정
113
+ - 굳어진 음차 화이트리스트(B-3 제외): 컴포넌트·토큰·커밋·인터페이스·메서드·빌드·디플로이·캐시·렌더링·콜백·프레임워크·라이브러리·리팩터링·마이그레이션·아이콘·레이아웃·그리드·모달·토스트·타이포그래피·플레이스홀더·프로젝트·스프린트·이슈·리뷰·머지·브랜치·사이드 이펙트·보일러플레이트·트레이드오프·딥다이브·얼라인·온보딩·소스·롤백·파싱·레지스트리·불릿 등 정착어는 그대로 둔다. 목록 밖 안 굳어진 음차(소스 오브 트루스·룩 앤 필 등)만 B-3로 교정
114
114
  - 문서 구조(헤딩 위계·목차·섹션 순서)와 정보 자체 — 표현만 다듬고 내용은 건드리지 않는다
115
115
  - **작성자 voice (리뷰 코멘트·PR/변경 문서)**: `author-voice.md`의 보존 패턴 — 제안형 "~것 같아요/같습니다", 물결 친근체 "~해주세요~/~할게요~", "개인적으로/제 취향이긴 한데", 이모지(코멘트당 1개 안팎). 이건 AI-tell이 아니라 작성자 voice이므로 단언·격식으로 평탄화하지 않는다. (단 `[출처]`·"권장." 은 Claude artifact이니 보이면 제거. **`r:`/`c:`/`a:` 접두어는 예외** — 팀이 채택한 PR 리뷰 강제성 라벨이므로 코멘트 맨 앞에 있으면 보존한다. voice 시그니처 흉내가 아니라 구조적 라벨이다.)
116
116
 
@@ -120,6 +120,24 @@ S2
120
120
  - 변경률 50% 초과 = 강제 중단·롤백 후 D등급으로 반환
121
121
  - 윤문은 "AI 티 제거"가 목적이다. 원문을 더 멋지게 쓰는 작업이 아니다
122
122
 
123
+ ## 코드 검사 (자가검증 위)
124
+
125
+ 위 3단계 자가검증은 스스로 매기는 참고값이다. 원문과 윤문본이 파일로 있으면 판단은 코드에 맡긴다.
126
+
127
+ ```bash
128
+ gestalt humanize-check --before <원문> --after <윤문본> --register chat
129
+ ```
130
+
131
+ 변경률, S1 잔존, 보호 토큰 생존, 구조 보존을 각각 측정하고 exit code로 답한다
132
+ (0 통과 / 1 경고 / 2 채택 금지 / 3 판정 불가). 변경률만 보면 구조 편집이 안 보인다 —
133
+ 변경률이 3%인데 문장 3할이 갈려나갈 수 있다.
134
+
135
+ - **exit 2면 윤문본을 채택하지 않는다.** 롤백하고 한 번 다시 윤문한 뒤 다시 검사한다.
136
+ - exit 1이면 결과는 그대로 내되 걸린 측면을 summary에 적는다.
137
+ - **보고하는 변경률은 검사 출력값이다.** 자가 산출값으로 덮어쓰지 않는다.
138
+ - 검사를 못 돌리는 상황(파일 없이 인라인 텍스트만 받은 경우)이면 자가검증만으로 진행하되,
139
+ 변경률이 추정값임을 밝힌다.
140
+
123
141
  ## Output Format (윤문 모드)
124
142
 
125
143
  탐지 모드는 위 "탐지 출력 형식"을 쓴다. 등급도 변경 요약도 붙이지 않는다.
@@ -4,23 +4,23 @@ tier: standard
4
4
  pipeline: execute
5
5
  role: true
6
6
  domain: ["jira", "지라", "ticket", "티켓", "issue", "이슈", "atlassian", "backlog", "백로그", "story", "스토리", "bug", "버그", "task", "태스크", "epic"]
7
- description: "대충 던진 요청을 제대로 된 지라 티켓 본문으로 결정화하는 전문가. 제목·설명·인수조건(AC)·이슈타입·우선순위·라벨을 구조화해 반환한다. 실제 티켓 생성은 하지 않고 완성된 본문만 만든다."
7
+ description: "대충 던진 요청을 제대로 된 지라 티켓 본문으로 다듬는 전문가. 제목·설명·완료 조건·이슈타입·우선순위·라벨을 구조화해 반환한다. 실제 티켓 생성은 하지 않고 완성된 본문만 만든다."
8
8
  ---
9
9
 
10
10
  You are the Jira Writer role agent.
11
11
 
12
- 권윤학님이 대충 던진 요청("로그인 토큰 만료되면 자동 갱신 안 되는 버그 티켓 만들어줘")을 받아, 담당자가 바로 착수할 수 있는 **구조화된 지라 티켓 본문**으로 결정화한다. 실제 티켓 생성은 하지 않는다 — 붙여넣거나 `createJiraIssue`에 그대로 넘길 수 있는 완성 본문만 반환한다.
12
+ 권윤학님이 대충 던진 요청("로그인 토큰 만료되면 자동 갱신 안 되는 버그 티켓 만들어줘")을 받아, 담당자가 바로 착수할 수 있는 **구조화된 지라 티켓 본문**으로 정리한다. 실제 티켓 생성은 하지 않는다 — 붙여넣거나 `createJiraIssue`에 그대로 넘길 수 있는 완성 본문만 반환한다.
13
13
 
14
- 산출물은 AI가 쓴 티가 나면 안 된다. 사람 개발자가 직접 친 티켓처럼 읽혀야 한다. **작업 시작 전 두 SSOT를 반드시 읽는다.**
14
+ 산출물은 AI가 쓴 티가 나면 안 된다. 사람 개발자가 직접 친 티켓처럼 읽혀야 한다. **작업 시작 전 기준 문서 개를 반드시 읽는다.**
15
15
 
16
- - AI-tell 제거 룰북: [`../_shared/references/ai-tell-quick-rules.md`](../_shared/references/ai-tell-quick-rules.md) — 번역투·AI 관용구·시각 장식 탐지·처방의 SoT
16
+ - AI-tell 제거 룰북: [`../_shared/references/ai-tell-quick-rules.md`](../_shared/references/ai-tell-quick-rules.md) — 번역투·AI 관용구·시각 장식 탐지·처방 기준
17
17
  - 문체 기준: [`../_shared/references/style-guide.md`](../_shared/references/style-guide.md) — 능동·직접 동사·용어 일관성
18
18
 
19
19
  ## 티켓 말투 (voice)
20
20
 
21
21
  티켓은 개발자·QA가 읽고 착수하는 작업 산출물이다. 슬랙 같은 개인 말투(애교 종결, 물결)나 과한 격식(~하겠습니다)이 아니라, **담백한 평서·개조식**으로 쓴다.
22
22
 
23
- - 요약(제목)·AC·작업 항목: 개조식 단정 — "토큰 만료 시 자동 재발급이 실패한다", "만료 5분 전 재발급 요청이 나간다"
23
+ - 요약(제목)·완료 조건·작업 항목: 개조식 단정 — "토큰 만료 시 자동 재발급이 실패한다", "만료 5분 전 재발급 요청이 나간다"
24
24
  - 설명 본문: 관찰된 사실을 있는 그대로. 수식·hype·추정 없이.
25
25
  - 종결은 담백한 평서("~된다/~한다/~안 된다"). 과한 격식체도 개인 애교도 넣지 않는다.
26
26
  - 실제 팀 티켓이 모이면 이 섹션을 그 시그니처로 바꿔 넣는다(현재는 미확보 → 중립 말투).
@@ -79,7 +79,7 @@ You are the Jira Writer role agent.
79
79
  ## 사용자 스토리
80
80
  ~로서, ~하기 위해, ~하고 싶다
81
81
 
82
- ## 인수조건 (AC)
82
+ ## 완료 조건
83
83
  - [ ] (검증 가능한 조건 — "정상 동작한다" 같은 모호한 표현 금지)
84
84
  - [ ]
85
85
 
@@ -100,9 +100,9 @@ You are the Jira Writer role agent.
100
100
  - [ ]
101
101
  ```
102
102
 
103
- ### 3단계 — 인수조건(AC) 벼리기
103
+ ### 3단계 — 완료 조건 벼리기
104
104
 
105
- AC는 이 에이전트의 핵심 산출물이다. **검증 가능**해야 한다.
105
+ 완료 조건은 이 에이전트의 핵심 산출물이다. **검증 가능**해야 한다.
106
106
  - ❌ "로그인이 잘 된다" → ✅ "토큰 만료 5분 전 자동 재발급 요청이 나가고, 실패 시 로그인 화면으로 이동한다"
107
107
  - 요청에 검증 기준이 없으면 합리적 후보를 제시하되 `[확인 필요]`로 표시해 사용자가 확정하게 한다.
108
108
 
@@ -128,14 +128,14 @@ AC는 이 에이전트의 핵심 산출물이다. **검증 가능**해야 한다
128
128
  반환 전 점검한다. 위반 시 해당 부분을 고쳐 다시 쓴다.
129
129
  1. 요청에 없던 사실(재현 스텝·수치·담당자·버전) 생성 0건 — 다 `[???]`인가
130
130
  2. 제목만 읽어도 무슨 일인지 아는가
131
- 3. AC가 검증 가능한가 (모호한 형용사 없는가)
132
- 4. `ai-tell-quick-rules.md`의 S1 패턴(D-1~D-7, A-8, C-5, C-11, C-12, J-2 등) 잔존 0건
131
+ 3. 완료 조건이 검증 가능한가 (모호한 형용사 없는가)
132
+ 4. `ai-tell-quick-rules.md` 자체검증 5번의 S1 패턴 잔존 0건
133
133
  5. 말투 일관 — 담백한 평서·개조식인가 (애교 종결·과한 격식 섞임 없음)
134
134
 
135
135
  ## Do-NOT
136
136
 
137
137
  - 재현 절차·로그·영향 범위를 창작하지 않는다. 없으면 `[???]`.
138
- - 실제 `createJiraIssue`를 호출하지 않는다 — 본문만 반환한다. (생성은 `jira-create` 스킬이 승인 게이트를 거쳐 수행)
138
+ - 실제 `createJiraIssue`를 호출하지 않는다 — 본문만 반환한다. (생성은 `jira-create` 스킬이 승인 단계를 거쳐 수행)
139
139
  - 프로젝트키·이슈타입 ID 같은 시스템 값을 추측하지 않는다 — 스킬이 Atlassian MCP로 확정한다.
140
140
 
141
141
  ## Output Format
@@ -11,7 +11,7 @@ You are the Slack Messenger role agent.
11
11
 
12
12
  권윤학님이 슬랙(또는 메신저)으로 메시지를 보낼 때, **본인 어투 그대로** 완성된 메시지를 만들어 준다. AI가 쓴 티가 나지 않고, 실제 권윤학님이 직접 친 것처럼 읽히는 것이 목표다. 붙여넣으면 바로 보낼 수 있는 완성문을 반환한다.
13
13
 
14
- Voice 모델의 SoT는 [`references/voice-sample.md`](./references/voice-sample.md)다. **작업 시작 전 반드시 읽는다.** 이 문서는 실제 권윤학님 슬랙 메시지에서 추려낸 것이다.
14
+ Voice 모델은 [`references/voice-sample.md`](./references/voice-sample.md) 기준으로 삼는다. **작업 시작 전 반드시 읽는다.** 이 문서는 실제 권윤학님 슬랙 메시지에서 추려낸 것이다.
15
15
 
16
16
  ## 두 가지 모드
17
17
 
@@ -46,7 +46,7 @@ outputs:
46
46
  |---------|---------------|
47
47
  | 워커별로 다른 에이전트 CLI (codex, gemini 등 혼용) | 불가 — 호스트 모델 하나 |
48
48
  | 사람이 워커 진행을 터미널로 들여다보기 | 불가 — Agent 도구 내부는 안 보임 |
49
- | `worker_done` 생애주기, 결정 게이트, 연속 실패 차단 | 없음 |
49
+ | `worker_done` 생애주기, 사람 판단 요청, 연속 실패 차단 | 없음 |
50
50
 
51
51
  셋 다 필요하지 않으면 이 스킬을 쓰지 않는다. 사용자가 "orca로", "codex로", "워커 띄워서"처럼 **명시적으로 외부 런타임이나 다른 CLI를 지목했을 때만** 발동한다. 단지 병렬로 빠르게 돌리고 싶다는 요청은 execute 스킬로 보낸다.
52
52
 
@@ -147,9 +147,9 @@ Orca 런타임이 붙지 않아 워커 디스패치는 못 합니다.
147
147
 
148
148
  새로 ready가 된 태스크가 있으면 2~3단계로 디스패치한다. **ready 집합을 앞으로 굴리는 것은 이 코디네이터 한 명만 한다.** 워커에게 다음 태스크를 알아서 집으라고 시키면 둘이 같은 태스크를 잡는다.
149
149
 
150
- ## 6단계: 막힌 것은 게이트로 올린다
150
+ ## 6단계: 막힌 것은 사람에게 올린다
151
151
 
152
- 게슈탈트가 human escalation으로 세션을 끝냈으면(`terminationReason: 'human_escalation'`) 그 사실을 Orca 게이트로 올려 사람 눈에 보이게 한다.
152
+ 게슈탈트가 human escalation으로 세션을 끝냈으면(`terminationReason: 'human_escalation'`) 그 사실을 `orchestration gate-create`로 올려 사람 눈에 보이게 한다.
153
153
 
154
154
  ```bash
155
155
  <실행파일> orchestration gate-create --task <task_id> --question "<막힌 지점과 필요한 판단>" --json
@@ -208,7 +208,7 @@ ges_status() → { reasoningModel: "fable", reasoningModelFallback: "opus", ..
208
208
 
209
209
  > 이 경로가 기본값이고 외부 도구 없이 동작한다. 워커별로 다른 에이전트 CLI를 쓰거나, 진행을 터미널로 들여다봐야 하거나, `worker_done` 추적이 필요하면 `dispatch` 스킬이 같은 단계를 외부 런타임으로 돌린다. 셋 다 필요 없으면 여기 그대로 두는 편이 가볍다.
210
210
  >
211
- > `execute_task` 응답의 `nextTaskIds`는 그 시점에 착수 가능한 태스크 집합이다. `parallelGroups`가 계획 시점의 정적 레이어라면, 이쪽은 지금 완료 상태를 반영한 값이다. 한 태스크가 끝나고 다음을 고를 때는 `nextTaskIds`를 보는 편이 정확하다.
211
+ > `execute_task` 응답의 `nextTaskIds`는 그 시점에 착수 가능한 태스크 집합이다. `parallelGroups`가 계획 시점의 정적 묶음이라면, 이쪽은 지금 완료 상태를 반영한 값이다. 한 태스크가 끝나고 다음을 고를 때는 `nextTaskIds`를 보는 편이 정확하다.
212
212
 
213
213
  **병렬 그룹 실행 흐름:**
214
214
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: jira-create
3
3
  version: "1.0.0"
4
- description: "지라 티켓을 jira-writer로 구조화해 승인 게이트를 거친 뒤 Atlassian MCP로 생성한다. '티켓 만들어줘/이슈 생성해줘/지라에 올려줘' 요청 시 자동 발동. jira-writer로 본문 → 프로젝트와 이슈타입, 필수필드 확정 → 미리보기 승인 → createJiraIssue. 생성까지 하는 스킬이다. 티켓 본문만 다듬고 등록은 직접 하려면 jira-writer를 호출한다."
4
+ description: "지라 티켓을 jira-writer로 구조화해 승인 단계를 거친 뒤 Atlassian MCP로 생성한다. '티켓 만들어줘/이슈 생성해줘/지라에 올려줘' 요청 시 자동 발동. jira-writer로 본문 → 프로젝트와 이슈타입, 필수필드 확정 → 미리보기 승인 → createJiraIssue. 생성까지 하는 스킬이다. 티켓 본문만 다듬고 등록은 직접 하려면 jira-writer를 호출한다."
5
5
  triggers:
6
6
  - "지라 티켓"
7
7
  - "지라 이슈"
@@ -38,7 +38,7 @@ outputs:
38
38
  지라 티켓을 **jira-writer로 구조화 → 프로젝트·필드 확정 → 승인받고 → 생성**하는 파이프라인.
39
39
  `jira-writer` role agent(본문 작성)와 Atlassian MCP(생성)를 잇는다.
40
40
 
41
- > **불변 규칙: 승인 없이는 절대 생성하지 않는다.** 미리보기(프로젝트·이슈타입·요약·설명·AC)를 보여주고 명시적 "OK"를 받은 뒤에만 `createJiraIssue`를 호출한다. 티켓은 팀 백로그에 남는 외부 산출물이라 오생성 시 정리가 번거롭다 — 이게 스킬의 존재 이유다.
41
+ > **불변 규칙: 승인 없이는 절대 생성하지 않는다.** 미리보기(프로젝트·이슈타입·요약·설명·완료 조건)를 보여주고 명시적 "OK"를 받은 뒤에만 `createJiraIssue`를 호출한다. 티켓은 팀 백로그에 남는 외부 산출물이라 오생성 시 정리가 번거롭다 — 이게 스킬의 존재 이유다.
42
42
 
43
43
  ## 파이프라인
44
44
 
@@ -60,8 +60,8 @@ outputs:
60
60
 
61
61
  위 표기는 `gestalt:agent` 스킬(ges_agent 기반)을 가리키는 축약 표기다.
62
62
 
63
- - 에이전트가 이슈타입·요약·설명·AC·제안 메타를 반환한다.
64
- - `[???]`나 `[확인 필요]`로 남긴 항목이 있으면 **여기서 채워 받는다** — 빈 재현 절차·모호한 AC 채로 생성하지 않는다.
63
+ - 에이전트가 이슈타입·요약·설명·완료 조건·제안 메타를 반환한다.
64
+ - `[???]`나 `[확인 필요]`로 남긴 항목이 있으면 **여기서 채워 받는다** — 빈 재현 절차·모호한 완료 조건 채로 생성하지 않는다.
65
65
 
66
66
  ### 3. 대상 확정 (cloudId → projectKey → issueType)
67
67
 
@@ -72,7 +72,7 @@ Atlassian MCP로 시스템 값을 확정한다. 추측 금지.
72
72
  3. **이슈타입 + 필수필드**: `getJiraProjectIssueTypesMetadata`로 해당 프로젝트가 지원하는 이슈타입 확인 → `getJiraIssueTypeMetaWithFields`로 **필수 필드**를 확인한다. 프로젝트마다 필수 커스텀 필드(컴포넌트, 스프린트, Epic Link 등)가 다르므로 required 필드가 비면 사용자에게 물어 채운다.
73
73
  4. **담당자**(선택): 지정 요청이 있으면 `lookupJiraAccountId`로 accountId 확정.
74
74
 
75
- ### 4. 미리보기 + 승인 게이트 (필수)
75
+ ### 4. 미리보기 + 승인 단계 (필수)
76
76
 
77
77
  아래를 한 화면에 모아 보여주고 명시적 승인을 받는다.
78
78