@tienne/gestalt 0.73.0 → 0.75.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 (83) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +18 -5
  3. package/dist/plugin/role-agents/_shared/references/author-voice.md +3 -3
  4. package/dist/plugin/role-agents/change-context-writer/AGENT.md +1 -1
  5. package/dist/plugin/role-agents/code-review-responder/AGENT.md +25 -0
  6. package/dist/plugin/role-agents/code-review-writer/AGENT.md +77 -13
  7. package/dist/plugin/role-agents/explainer/references/audience.md +4 -4
  8. package/dist/plugin/role-agents/humanize-monolith/AGENT.md +1 -1
  9. package/dist/plugin/role-agents/impact-writer/references/voice.md +1 -0
  10. package/dist/plugin/role-agents/jira-writer/AGENT.md +1 -1
  11. package/dist/plugin/role-agents/slack-messenger/references/voice-sample.md +1 -1
  12. package/dist/plugin/skills/_shared/agent-delegation.md +1 -1
  13. package/dist/plugin/skills/local-pr/SKILL.md +1 -1
  14. package/dist/plugin/skills/pr/SKILL.md +1 -1
  15. package/dist/plugin/skills/review/SKILL.md +109 -10
  16. package/dist/plugin/skills/review-reply/SKILL.md +46 -5
  17. package/dist/plugin/skills/ship/SKILL.md +7 -7
  18. package/dist/src/cli/commands/explain-eval.d.ts +1 -1
  19. package/dist/src/cli/commands/explain-eval.js +1 -1
  20. package/dist/src/cli/commands/humanize-scan.d.ts +7 -0
  21. package/dist/src/cli/commands/humanize-scan.d.ts.map +1 -1
  22. package/dist/src/cli/commands/humanize-scan.js +16 -2
  23. package/dist/src/cli/commands/humanize-scan.js.map +1 -1
  24. package/dist/src/cli/commands/pr.d.ts +2 -2
  25. package/dist/src/cli/commands/pr.js +6 -6
  26. package/dist/src/cli/commands/pr.js.map +1 -1
  27. package/dist/src/events/store.js +1 -1
  28. package/dist/src/explain/check.js +4 -4
  29. package/dist/src/explain/terms.js +3 -3
  30. package/dist/src/humanize/detectors.d.ts +67 -8
  31. package/dist/src/humanize/detectors.d.ts.map +1 -1
  32. package/dist/src/humanize/detectors.js +142 -33
  33. package/dist/src/humanize/detectors.js.map +1 -1
  34. package/dist/src/humanize/index.d.ts +1 -1
  35. package/dist/src/humanize/index.d.ts.map +1 -1
  36. package/dist/src/humanize/index.js +1 -1
  37. package/dist/src/humanize/index.js.map +1 -1
  38. package/dist/src/humanize/rules.d.ts +2 -0
  39. package/dist/src/humanize/rules.d.ts.map +1 -1
  40. package/dist/src/humanize/rules.js.map +1 -1
  41. package/dist/src/humanize/scan.d.ts +17 -10
  42. package/dist/src/humanize/scan.d.ts.map +1 -1
  43. package/dist/src/humanize/scan.js +31 -1
  44. package/dist/src/humanize/scan.js.map +1 -1
  45. package/dist/src/local-pr/engine.d.ts +2 -2
  46. package/dist/src/local-pr/engine.js +2 -2
  47. package/dist/src/local-pr/git.d.ts +9 -8
  48. package/dist/src/local-pr/git.d.ts.map +1 -1
  49. package/dist/src/local-pr/git.js +9 -8
  50. package/dist/src/local-pr/git.js.map +1 -1
  51. package/dist/src/local-pr/registry.d.ts +1 -1
  52. package/dist/src/local-pr/registry.js +1 -1
  53. package/dist/src/local-pr/repository.d.ts +2 -2
  54. package/dist/src/local-pr/repository.js +2 -2
  55. package/dist/src/mcp/schemas.js +1 -1
  56. package/dist/src/mcp/schemas.js.map +1 -1
  57. package/dist/src/mcp/tools/pr.d.ts +1 -1
  58. package/dist/src/mcp/tools/pr.d.ts.map +1 -1
  59. package/dist/src/mcp/tools/pr.js +3 -3
  60. package/dist/src/mcp/tools/pr.js.map +1 -1
  61. package/dist/src/mcp/tools/review-passthrough.js +2 -2
  62. package/dist/src/review/passthrough-engine.js +1 -1
  63. package/dist/src/review/passthrough-engine.js.map +1 -1
  64. package/package.json +1 -1
  65. package/plugin/.codex-plugin/plugin.json +1 -1
  66. package/plugin/.mcp.json +1 -1
  67. package/plugin/mcp.json +1 -1
  68. package/plugin/role-agents/_shared/references/ai-tell-quick-rules.md +18 -5
  69. package/plugin/role-agents/_shared/references/author-voice.md +3 -3
  70. package/plugin/role-agents/change-context-writer/AGENT.md +1 -1
  71. package/plugin/role-agents/code-review-responder/AGENT.md +25 -0
  72. package/plugin/role-agents/code-review-writer/AGENT.md +77 -13
  73. package/plugin/role-agents/explainer/references/audience.md +4 -4
  74. package/plugin/role-agents/humanize-monolith/AGENT.md +1 -1
  75. package/plugin/role-agents/impact-writer/references/voice.md +1 -0
  76. package/plugin/role-agents/jira-writer/AGENT.md +1 -1
  77. package/plugin/role-agents/slack-messenger/references/voice-sample.md +1 -1
  78. package/plugin/skills/_shared/agent-delegation.md +1 -1
  79. package/plugin/skills/local-pr/SKILL.md +1 -1
  80. package/plugin/skills/pr/SKILL.md +1 -1
  81. package/plugin/skills/review/SKILL.md +109 -10
  82. package/plugin/skills/review-reply/SKILL.md +46 -5
  83. package/plugin/skills/ship/SKILL.md +7 -7
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.73.0",
3
+ "version": "0.75.0",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "repository": {
6
6
  "type": "git",
@@ -6,6 +6,8 @@
6
6
 
7
7
  **Do-NOT (탐지·윤문 모두 제외):** 고유명사, 제품명, 모델명, 기관명, 수치, 날짜, 단위, 큰따옴표 안 직접 인용, 법률 조문, 수학, 화학, 통계 표기, 영어 약어(LLM·GPU·MCP·API 등 업계 표준).
8
8
 
9
+ **이 목록은 사람과 모델이 판단하는 자리의 기준이다.** 자동 스캔(`humanize-scan`)이 형태로 걷어내는 건 인라인 백틱과 언어 태그가 붙은 코드펜스, 그리고 `chat` 기준의 `>` 블록인용 셋뿐이다. 큰따옴표는 한국어에서 인용만이 아니라 강조로도 쓰여 형태로는 못 가른다 — 스캔이 큰따옴표 안을 걸었으면 사람이 이 목록을 보고 판단한다. 원문을 가리키는 자리는 백틱으로 감싸면 스캔에서도 빠진다.
10
+
9
11
  **약어 면제는 업계 표준에만 준다:** 풀어 썼을 때 안 굳어진 음차가 되는 약어는 면제 대상이 아니다. `SSOT`나 `SoT`를 그대로 두면 "소스 오브 트루스"를 약어로 우회한 것과 같다 — B-3로 우리말로 푼다. 무엇을 가리키느냐에 따라 말이 달라지므로 대체어 표는 [style-guide.md의 single source of truth를 뭐라고 쓸까](style-guide.md#single-source-of-truth를-뭐라고-쓸까)에 둔다. LLM, API처럼 풀어 쓸 일이 없는 표준 약어만 그대로 둔다.
10
12
 
11
13
  **굳어진 음차 화이트리스트 (B-3 제외 — 그대로 둔다):** 컴포넌트·토큰·커밋·인터페이스·메서드·빌드·디플로이·캐시·렌더링·콜백·프레임워크·라이브러리·리팩터링·마이그레이션·아이콘·레이아웃·그리드·모달·토스트·타이포그래피·플레이스홀더·프로젝트·스프린트·이슈·리뷰·머지·브랜치·사이드 이펙트·보일러플레이트·트레이드오프·딥다이브·얼라인·온보딩·소스·롤백·파싱·레지스트리·불릿·널 포인터·데드락 등 업계 정착어. 이 목록 밖의 안 굳어진 음차(소스 오브 트루스·룩 앤 필·로우 행잉 프룻 등)만 B-3로 교정한다.
@@ -18,7 +20,7 @@
18
20
 
19
21
  **한자어를 피하는 게 목적이 아니다 (F-4·F-5 오적용 주의):** 겨냥하는 건 개념을 뭉친 **명사화**(-성/-적/-화)이지 한자어 동사가 아니다. "측정하다"를 "재다"로, "판단하다"를 "따지다"로 바꾸면 정확도만 잃는다. 그 자리의 정확한 말이 한자어면 한자어를 쓴다. 반대 방향 실수도 같다 — 한자어를 피하려고 비유 명사(축·증류)나 물리 동사(재다)로 도망가면 F-7에 걸린다. 셋 다 겪은 실례: `네 축을 따로 재고 판정한다` → `4가지 측면에서 각각 측정하고 판단한다`.
20
22
 
21
- **은유를 다 지우라는 게 아니다 (F-9 오적용 주의):** 겨냥하는 건 결함이나 코드 상태를 부르려고 그 자리에서 지어낸 별칭이다. "널 포인터"를 "널 값을 가리키는 포인터"로, "데드락"을 "서로 기다리다 멈춘 상태"로 풀어 쓰면 길이만 늘고 무엇을 말하는지는 오히려 흐려진다. **가르는 기준은 남이 정의해 둔 이름을 그 뜻 그대로 쓰느냐 하나뿐이다.** 명세나 교과서에 뜻이 박혀 있으면 가리킬 데가 있으니 그대로 둔다. 팀에서 몇 번 쓰였다는 것으로는 예외가 되지 않는다 — 아래 [측정 근거](#측정-근거) 문단과 B-4가 "팀에서 굳은 말"을 지키는 것과는 다른 자리다. B-4는 팀이 쓰기 시작하면 예외로 인정하는데 F-9는 그걸 예외로 안 본다. B-4가 막는 건 어색함이라 팀이 받아쓰면 풀리고 F-9가 막는 건 굳는 것 자체라 팀이 받아쓰면 그게 피해다.
23
+ **은유를 다 지우라는 게 아니다 (F-9 오적용 주의):** 겨냥하는 건 결함이나 코드 상태, 결함의 원인 관계를 뭉개 부른 말이다. 그 자리에서 지어낸 별칭이든 이미 있는 비유든 같다. "널 포인터"를 "널 값을 가리키는 포인터"로, "데드락"을 "서로 기다리다 멈춘 상태"로 풀어 쓰면 길이만 늘고 무엇을 말하는지는 오히려 흐려진다. **가르는 기준은 그 자리에서 무엇을 가리키는지가 말에 남아 있느냐 하나뿐이다.** 남이 정의해 둔 이름을 그 뜻 그대로 쓰면 기준을 통과한다. 그게 대표 사례다. 자료구조가 그 이름으로 부르는 자리도 같다 — 트리와 스레드의 root를 "뿌리"라 부르면 구조를 가리키므로 그대로 둔다. **사전에 비유 뜻풀이가 실렸다는 것만으로는 정의해 둔 이름이 아니다** — "뿌리가 하나다"는 사전에 근본 뜻이 실려도 무엇이 같은지가 안 남는다. 명세나 교과서에 뜻이 박혀 있으면 가리킬 데가 있으니 그대로 둔다. 팀에서 몇 번 쓰였다는 것으로는 예외가 되지 않는다 — 아래 [측정 근거](#측정-근거) 문단과 B-4가 "팀에서 굳은 말"을 지키는 것과는 다른 자리다. B-4는 팀이 쓰기 시작하면 예외로 인정하는데 F-9는 그걸 예외로 안 본다. B-4가 막는 건 어색함이라 팀이 받아쓰면 풀리고 F-9가 막는 건 굳는 것 자체라 팀이 받아쓰면 그게 피해다.
22
24
 
23
25
  **근거가 붙은 룰 (→ 아래 [측정 근거](#측정-근거)):** A-2, I-1, C-8은 대조 코퍼스 측정으로 심각도를 조정했고 B-4는 팀이 실제로 쓰는 말이라 예시에서 뺐다. 원어민이 오히려 더 쓰는 표현이나 팀에서 이미 굳은 말을 지우면 사람 글을 AI 글로 만든다.
24
26
 
@@ -51,9 +53,9 @@
51
53
  |---|---|---|---|
52
54
  | B-1 | 한글 + 괄호 영어 매번 ("~(Sovereign AI)" 처럼) | S2 | 첫 등장만 병기, 이후 한글만 |
53
55
  | B-2 | 영어 어휘 직역 가능한데 그대로 | S2 | 한국어로 옮기되 업계 표준은 유지 |
54
- | B-3 | 안 굳어진 영어 구·단어 음차 표기 ("소스 오브 트루스"), 그 음차를 약어로 우회한 표기(`SSOT`·`SoT`) | S1 | 한글 의역 + 첫 등장만 원어 괄호 병기("기준 문서(source of truth)", "단일 기준점(source of truth)" 등), 이후 한글만. 단 위 "굳어진 음차 화이트리스트"에 있는 정착어는 Do-NOT — of/and 등 기능어까지 통째 음차한 구(룩 앤 필·로우 행잉 프룻)가 최우선 대상. 무엇을 가리키는지 보고 고르는 표는 [style-guide.md의 single source of truth를 뭐라고 쓸까](style-guide.md#single-source-of-truth를-뭐라고-쓸까)를 따른다 |
56
+ | B-3 | 안 굳어진 영어 구·단어 음차 표기 ("소스 오브 트루스"), 그 음차를 약어로 우회한 표기(`SSOT`·`SoT`), 같은 구를 낱말 단위로 옮긴 직역형("은탄환", "낮은 가지 열매") | S1 | 한글 의역 + 첫 등장만 원어 괄호 병기("기준 문서(source of truth)", "단일 기준점(source of truth)" 등), 이후 한글만. 단 위 "굳어진 음차 화이트리스트"에 있는 정착어는 Do-NOT — of/and 등 기능어까지 통째 음차한 구(룩 앤 필·로우 행잉 프룻)가 최우선 대상. 무엇을 가리키는지 보고 고르는 표는 [style-guide.md의 single source of truth를 뭐라고 쓸까](style-guide.md#single-source-of-truth를-뭐라고-쓸까)를 따른다. **음차를 직역으로 옮기지 않는다** — "로우 행잉 프룻"은 "낮은 가지 열매"가 아니라 "금방 되는 일"이다. "실버 불릿"도 같은 자리에서 "만능 해법"을 가리킨다. 직역한 비유는 음차보다 읽기 어렵다. **화이트리스트는 등재된 형태 그대로만 통과한다** — "사이드 이펙트"와 "널 포인터"는 구째로 올라 있어 구째로 빠지고, 낱말로 오른 "불릿"은 낱말만 빠지므로 "실버 불릿"은 이 룰이 본다. **구를 통째로 옮긴 직역형은 B-3 하나로 판정한다** — B-5는 낱말 하나를 옮긴 자리(materialize → 물질화)만 본다 |
55
57
  | B-4 | 영어 개념을 어색하게 옮긴 조어("생산처" ← producer, "응답처") | S2 | 억지 신조어 대신 이미 쓰이는 말로. 코드 맥락이면 "호출부"·"사용처". **팀에서 이미 굳은 조어는 예외** — "소비처"는 팀 지라 티켓에서 라이브러리를 가져다 쓰는 쪽을 가리키는 말로 정착했으므로 교정 대상이 아니다 (→ 아래 [측정 근거](#측정-근거)) |
56
- | B-5 | 영어 개념어나 다의어 동사를 한국어 한 단어로 몰아 옮겨 레지스터가 어긋난 말 (materialize → "물질화", semantics → "의미론", close → "닫다") | S1 | 그 자리에서 실제로 무슨 일이 벌어지는지를 동사로 쓴다. 아래 [B-5 대체어](#b-5-대체어) 표 참조. 음차로 도망가지 않는다 — "머티리얼라이즈"로 바꾸면 B-3에 걸린다 |
58
+ | B-5 | 영어 개념어나 다의어 동사를 한국어 한 단어로 몰아 옮겨 레지스터가 어긋난 말 (materialize → "물질화", semantics → "의미론", close → "닫다", mutant → "돌연변이", branch → "갈래") | S1 | 그 자리에서 실제로 무슨 일이 벌어지는지를 동사로 쓴다. 아래 [B-5 대체어](#b-5-대체어) 표 참조. 음차로 도망가지 않는다 — "머티리얼라이즈"로 바꾸면 B-3에 걸린다. **한국어 정착어가 없는 기술 용어는 옮기지 말고 원어를 그대로 쓴다** (`mutant`, `null`, `race condition`) |
57
59
 
58
60
  ### B-5 대체어
59
61
 
@@ -71,9 +73,20 @@
71
73
  | close (an issue, PR, thread) | 이슈를 닫는다 | 이슈를 종료한다 / 스레드를 종료한다 |
72
74
  | close (a connection, a repo) | 저장소를 닫는다 | 저장소 연결을 끊는다 |
73
75
  | leak (자주 나온다는 뜻으로) | 자주 새는 룰 | 자주 걸리는 룰 / 반복해서 틀리는 자리 |
76
+ | mutant (mutation testing) | 돌연변이, 뮤턴트, 뮤테이션 | `mutant`, `mutation` 원어 그대로 |
77
+ | kill (a mutant) | 죽임 | 제거한다 / 지운다 |
78
+ | branch (of code) | 갈래 | 분기 |
74
79
 
75
80
  "의미론적 검색"처럼 형용사로 굳은 자리(`의미론적`)는 대상이 아니다. 명사로 홀로 서서 시스템의 동작 규칙을 가리킬 때만 걸린다.
76
81
 
82
+ **한국어 정착어가 없으면 원어로 둔다.** `mutant`가 그 자리다. 뜻으로 옮기면 생물학 어휘가 되고 음차로 옮기면 B-3에 걸린다("뮤턴트"). 둘 다 피하는 길은 영어 표기를 그대로 쓰는 것뿐이다 — `null`이나 `race condition`을 안 옮기는 것과 같다. **원어로 두는 건 그 개념을 부르는 명사에만 준다.** 딸려 오는 동사는 한국어로 쓴다 — mutant를 kill 했다는 말은 "죽였다"가 아니라 "제거했다"다.
83
+
84
+ **"갈래"는 code branch를 옮긴 자리를 겨냥한다.** `if`나 `catch`, `default` 같은 코드 분기를 순우리말로 옮긴 자리가 그것이다. 실무에서 그 자리는 "분기"라고 부른다. "갈래"로 쓰면 읽는 사람이 한 번 더 번역해야 한다.
85
+
86
+ **탐지기는 앞말로 못 가르므로 거의 전부 건다** — "두 갈래"가 코드 분기와 분류 양쪽에 다 나오기 때문이다. 형태로 빠지는 건 분류 뜻이 확실한 연어뿐이다(`갈래로 갈리다`, `갈래로 흩어지다`, `갈래별`).
87
+
88
+ **걸린 자리는 분류 뜻이라도 고친다.** 종류를 뜻하면 "종류"나 "쪽"이 그 자리의 말이고, 묶음을 뜻하면 "묶음"이다. 베이스라인을 올려 덮지 않는다 — 그렇게 두면 같은 문서에서 코드 분기 뜻이 새로 들어와도 눈금이 이미 올라가 있어 안 걸린다. 예시로 인용해야 하는 자리는 백틱으로 감싼다.
89
+
77
90
  **한 동사에 여러 뜻을 몰지 않는다.** `close`는 한국어에서 자리마다 다른 동사로 갈린다 — 코멘트나 발표는 끝내고 이슈나 스레드는 종료하고 연결은 끊는다. 이걸 "닫다" 하나로 몰면 그 자리마다 조금씩 어긋난다. 코드 안의 `close()` 호출 그 자체를 가리킬 때만 "닫는다"를 둔다. 산문으로 동작을 설명하는 자리는 무엇을 어떻게 하는지 적는다 — "저장소 연결을 끊는다"처럼. 글이나 말을 "닫는다"고 쓰지 않는다. "맺는다"는 원래 한국어 연어라 그대로 쓸 수 있다. 다만 발표나 코멘트를 두고는 "끝낸다"가 더 흔하다. 자리마다 맞는 동사를 고른다. **상태를 가리키는 "닫힌 PR"은 대상이 아니다** — `CLOSED` 상태값을 옮긴 말이라 동사 교정과 결이 다르다.
78
91
 
79
92
  **"새다"는 누출일 때만 쓴다.** 금지어가 산출물에 흘러나가는 자리에는 맞다. 검사를 빠져나가는 자리("어디까지 새는지")나 자주 나온다는 뜻("자주 새는 룰")에는 안 맞는다. 앞은 "놓친다", "빠져나간다"이고 뒤는 "자주 걸린다", "반복해서 틀린다"다.
@@ -126,8 +139,8 @@
126
139
  | F-6 | 복합명사 압축 — 명사구를 조사·동사 없이 이어붙여 개념을 뭉침 ("시안 정합 버그픽스", "유지보수성 개선 작업", "권한 체크 로직") | S2 / **대화·리뷰 S1** | 동사·조사로 풀어 서술 ("디자인 시안과 다르게 렌더링되던 문제", "나중에 유지보수하기 편하게"). 사람은 압축 명사구 대신 무엇을 왜 했는지 풀어 말한다 |
127
140
  | F-7 | 기술·이공계 비유 명사를 일상 대화에 그대로 (증류·배선·결정화·평탄화·오케스트레이션·파이프라인화·축 등, 화학·전기·수학 어휘의 비유 차용) | S2 / **대화·리뷰 S1** | 일상 동사·명사로 환원 (증류 → "추려내다/뽑아내다", 배선 → "연결하다/걸어두다", 결정화 → "정리하다", 평탄화 → "밋밋하게 만들다", **축 → "측면"**·"기준"). 문법은 멀쩡해 룰 매칭이 안 되지만 사람은 대화에서 안 쓴다. "네 축을 잰다"가 아니라 "4가지 측면에서 측정한다". **예외는 그 프로젝트가 개념에 붙인 이름일 때만이고, 그 개념을 다루는 자리에서만이다** — 게슈탈트의 "스펙 결정화"는 `similarity-crystallizer` 에이전트 이름이자 인터뷰→Spec 변환의 정의라서 두지만, 같은 말을 지라 티켓 작성처럼 무관한 자리에 끌어다 쓰면 F-7이다. 코드의 "파이프라인" 자체, 그래프의 x축도 같은 기준. 테스트를 자물쇠에 빗댄 "잠그다"는 방향이 반대라 F-10이 본다 |
128
141
  | F-8 | 추상명사에 물리 측량 동사("근거를 재봤는데", "판단을 재보고 있다", "근거를 재본 결과", "의견을 달아봤는데") | S2 / **대화·리뷰 S1** | 저울에 올린 게 아니라 검토한 것이다. 사람이 하는 행위 동사로 되돌린다("근거를 확인해봤는데", "의견을 검토해봤는데"). F-7 물리 동사 도피의 사촌이라 목적어가 근거, 의견, 판단, 영향, 의미, 가치, 리스크인 자리만 본다 — "온도를 재봤는데"는 대상이 아니다 |
129
- | F-9 | 결함·코드 상태를자리에서 지어낸 별칭으로 명명 ("맨몸 호출", "벌거벗은 API") | S2 / **대화·리뷰 S1** | 무엇이 빠졌고 무엇이 틀렸는지 그대로 쓴다 ("맨몸 호출" → "접두 객체 없이 함수 이름만 적혀 있다"). 별칭은 검색이 안 되고 처음 읽는 사람이 못 알아보고 답글에서 재생산돼 팀 어휘로 굳는다. **예외는 남이 정의해 둔 이름을 그 뜻 그대로 쓸 때다** — "널 포인터", "데드락", "고아 노드"처럼 명세나 교과서에 뜻이 박힌 말이고 F-6으로도 안 넘긴다. 다른 결함에 비유로 얹으면 예외가 아니고 팀에서 몇 번 쓰였다는 것도 아니다 — 그렇게 열면 답글에 한 번 재생산된 별칭이 곧바로 빠져나간다. **F-7과 방향이 반대다** — F-7은 기술 비유를 일상 말로 되돌리고 F-9는 일상 비유를 기술 대상에 씌운 쪽을 본다. F-9에 걸린 별칭이 스스로 움직이면 D-5, 조사 없이 뭉치면 F-6도 함께 걸린다. 이 경계는 뜻이라 탐지기가 없다 |
130
- | F-10 | 일상 관용구의 물리 동작 동사를 코드나 문서 대상에 씌움 ("타입을 못 박다", "규칙을 못박는다", "테스트로 잠갔다") | S2 / **대화·리뷰 S1** | 그 자리에서 실제로 무엇이 되는지를 동사로 쓴다 ("타입을 선언한다", "규칙을 정한다", "관련 테스트가 있다"). 관용구는 원래 사람 사이 합의에 걸리는 말이라 목적어가 타입이나 규칙이 되면 누구에게 못을 박는다는 건지 가리킬 데가 없다. **가르는 것은 누가 정하는 자리냐다.** 문서나 코드가 스스로 정하면 대상이고("이 지시를 1번으로 못박는다", "타입을 못 박다"), 사람들이 협의해 정하면 예외다("팀이 일정을 못 박았다"). 한국어는 주어를 자주 생략하므로 **주어가 드러나면 그걸 보고, 없으면 목적어로 본다** — 타입, 값, 규칙, 지시, 기준은 문서나 코드가 정하는 쪽이고 일정과 조건처럼 사람들이 서로 약속하는 대상은 협의하는 쪽이다. 같은 "범위"라도 문서가 제 적용 범위를 정하는 자리는 대상이고 팀이 일의 범위를 합의하는 자리는 예외다. **나머지 예외는 셋이다.** 목적어가 리터럴 값이라 하드코딩을 뜻하는 "박아두다"("이 값 그냥 박아두죠"), 명사로 굳은 "잠금", 자물쇠나 문처럼 실제 물체를 잠그는 자리("문을 잠갔다"). **탐지기는 "못 박" 어간과 자물쇠 활용형을 전부 건다** — 주어가 사람인지 문서인지 못 가르므로 걸린 자리는 사람이 위 축으로 다시 본다 (I-5와 같은 방식이다). 형태로 빠지는 예외는 앞에 "못"이 없는 "박아두다"와 명사 "잠금"뿐이다. **F-7과 방향이 반대다** — F-7은 기술 비유를 일상 말로 되돌리고 F-10은 일상 비유를 코드 대상에 씌운 쪽을 본다. **F-9와는 품사로 갈린다** — F-9는 결함에 이름을 붙인 명사 쪽이고 F-10은 행위를 부르는 동사 쪽이다. **F-8과는 안 겹친다** — F-8은 물리 "측량" 동사만 보므로 "판단을 못 박았다"도 F-10 하나로 판정한다 |
142
+ | F-9 | 결함이나 코드 상태, 결함의 원인 관계를 비유 명사로 뭉개 부름 ("맨몸 호출", "벌거벗은 API", "뿌리가 하나다") | S2 / **대화·리뷰 S1** | 무엇이 빠졌고 무엇이 틀렸는지 그대로 쓴다 ("맨몸 호출" → "접두 객체 없이 함수 이름만 적혀 있다"). 별칭은 검색이 안 되고 처음 읽는 사람이 못 알아보고 답글에서 재생산돼 팀 어휘로 굳는다. **예외는 남이 정의해 둔 이름을 그 뜻 그대로 쓸 때다** — "널 포인터", "데드락", "고아 노드"처럼 명세나 교과서에 뜻이 박힌 말이고 F-6으로도 안 넘긴다. 다른 결함에 비유로 얹으면 예외가 아니고 팀에서 몇 번 쓰였다는 것도 아니다 — 그렇게 열면 답글에 한 번 재생산된 별칭이 곧바로 빠져나간다. **F-7과 방향이 반대다** — F-7은 기술 비유를 일상 말로 되돌리고 F-9는 일상 비유를 기술 대상에 씌운 쪽을 본다. **원인 관계를 부르는 비유도 같은 자리다** — "뿌리가 하나다"는 원인이 같다는 말을 뿌리에 얹은 것이라 무엇이 같은지가 안 읽힌다. "원인이 같다"로 쓴다. 지어낸 별칭이든 이미 있는 비유든 가르는 건 하나다 — 그 자리에서 무엇을 가리키는지가 말에 남아 있느냐다. **자료구조나 명세가 그 이름으로 부르는 자리는 대상이 아니다** — 트리의 뿌리(root)와 스레드의 뿌리는 그 구조를 부르는 이름이라 가리킬 데가 있다. F-9에 걸린 별칭이 스스로 움직이면 D-5, 조사 없이 뭉치면 F-6도 함께 걸린다. 이 경계는 뜻이라 탐지기가 없다 |
143
+ | F-10 | 일상 관용구의 물리 동작 동사를 코드나 문서 대상에 씌움 ("타입을 못 박다", "규칙을 못박는다", "테스트로 잠갔다") | S2 / **대화·리뷰 S1** | 그 자리에서 실제로 무엇이 되는지를 동사로 쓴다 ("타입을 선언한다", "규칙을 정한다", "관련 테스트가 있다"). 관용구는 원래 사람 사이 합의에 걸리는 말이라 목적어가 타입이나 규칙이 되면 누구에게 못을 박는다는 건지 가리킬 데가 없다. **가르는 것은 누가 정하는 자리냐다.** 문서나 코드가 스스로 정하면 대상이고("이 지시를 1번으로 못박는다", "타입을 못 박다"), 사람들이 협의해 정하면 예외다("팀이 일정을 못 박았다"). 한국어는 주어를 자주 생략하므로 **주어가 드러나면 그걸 보고, 없으면 목적어로 본다** — 타입, 값, 규칙, 지시, 기준은 문서나 코드가 정하는 쪽이고 일정과 조건처럼 사람들이 서로 약속하는 대상은 협의하는 쪽이다. 같은 "범위"라도 문서가 제 적용 범위를 정하는 자리는 대상이고 팀이 일의 범위를 합의하는 자리는 예외다. **나머지 예외는 셋이다.** 목적어가 리터럴 값이라 하드코딩을 뜻하는 "박아두다"("이 값 그냥 박아두죠"), 명사로 굳은 "잠금", 자물쇠나 문처럼 실제 물체를 잠그는 자리("문을 잠갔다"). **탐지기는 "못 박" 어간과 자물쇠 활용형을 전부 건다** — 주어가 사람인지 문서인지 못 가르므로 걸린 자리는 사람이 위 축으로 다시 본다 (I-5와 같은 방식이다). 형태로 빠지는 예외는 앞에 "못"이 없는 "박아두다"와 명사 "잠금"뿐이다. **F-7과 방향이 반대다** — F-7은 기술 비유를 일상 말로 되돌리고 F-10은 일상 비유를 코드 대상에 씌운 쪽을 본다. **F-9와는 품사로 갈린다** — F-9는 결함이나 원인 관계를 명사로 부르는 쪽이고(지어낸 별칭이든 이미 있는 비유든) F-10은 행위를 부르는 동사 쪽이다. **F-8과는 안 겹친다** — F-8은 물리 "측량" 동사만 보므로 "판단을 못 박았다"도 F-10 하나로 판정한다 |
131
144
 
132
145
  ## G. Hedging
133
146
 
@@ -35,13 +35,13 @@
35
35
 
36
36
  ### 이 숫자는 분포지 지침이 아니다
37
37
 
38
- 가장 흔한 실패는 시그니처를 안 쓰는 게 아니라 **한 갈래에 몰아 쓰는 것**이다.
38
+ 가장 흔한 실패는 시그니처를 안 쓰는 게 아니라 **한 종류에 몰아 쓰는 것**이다.
39
39
  282는 리뷰 1,300건 중 20% 남짓이고 나머지는 "어떨까요?" 144, "좋아보입니다" 54처럼
40
- 여러 갈래로 흩어져 있다. "보존하라"를 "매 문장에 쓰라"로 읽으면 문장 하나하나는
40
+ 여러 종류로 흩어져 있다. "보존하라"를 "매 문장에 쓰라"로 읽으면 문장 하나하나는
41
41
  진짜 어투인데 글 전체가 기계로 읽힌다 — 시그니처가 일정 간격으로 박히는 순간
42
42
  그 규칙성 자체가 새 AI-tell이 된다.
43
43
 
44
- - 한 갈래가 전체 종결의 **절반을 넘지 않게** 흩는다.
44
+ - 한 종류가 전체 종결의 **절반을 넘지 않게** 흩는다.
45
45
  - 확인한 사실은 헤지 없이 단정한다. 다 헤지하면 확신도 신호가 사라진다.
46
46
  - 이모지, 물결도 마찬가지 — 문단마다 하나씩 꽂으면 계산된 티가 난다.
47
47
 
@@ -138,7 +138,7 @@ PR/변경 문서도 결국 작성자가 직접 말하는 글이다. [`../_shared
138
138
  | 번역투 "~를 통해" | "이 방식을 통해 개선됩니다" | "이 방식으로 개선됩니다" |
139
139
  | 결산 피벗 | "결론적으로", "요약하자면", "정리하면" | 삭제 후 직결 |
140
140
  | AI 의인화 주어 | "이 변경은 ~를 수행합니다" | "~합니다" / 주어 생략 |
141
- | 과장 어휘 | "핵심적으로", "시사하는 바가 크다" | 삭제 또는 구체화 |
141
+ | 과장 어휘 | `핵심적으로`, `시사하는 바가 크다` | 삭제 또는 구체화 |
142
142
  | 가운뎃점 나열(C-12) | "의도·동작·정책 수준에서" | 쉼표나 구어로 풀기("의도, 동작, 정책") — 표·용어목록·합성어(입출력)는 예외 |
143
143
  | Claude artifact | `c:`/`r:` 접두어, `[출처]` 태깅, "…권장." | 제거 |
144
144
 
@@ -116,6 +116,31 @@ key는 넣었는데 index 대신 id를 썼어요. 목록 순서가 바뀌는 케
116
116
 
117
117
  **깎지 말 것** — 이건 AI-tell이 아니라 실제 voice다: "~것 같아요/같습니다", "개인적으로", 물결 친근체, 이모지 1개 안팎, 짧은 수긍("오 그러네요").
118
118
 
119
+ ### 원문 어휘는 인용할 때만 그대로 둔다
120
+
121
+ 답글은 **남이 쓴 코멘트를 읽고 쓰는 자리**라 원문 어휘가 제일 세게 끌어당긴다. 리뷰어가
122
+ "배선"이나 "스큐"라고 썼어도 내 문장에서는 룰대로 쓴다. **원문에 있다는 건 통과 근거가 아니다.**
123
+
124
+ | 룰 | 원문에서 끌려오는 말 |
125
+ |---|---|
126
+ | B-3 | 안 굳은 음차 — 스큐, 스파이크, 어피니티 |
127
+ | F-7 | 기술 비유 명사 — 배선, 증류, 평탄화 |
128
+ | B-5 | 오역 — `돌연변이`(mutant), `죽임`(kill), `갈래`(branch) |
129
+ | F-9 | 그 자리에서 지어낸 결함 별칭 |
130
+ | D-4 | hype 어휘 — `치명적`, `압도적` |
131
+
132
+ | 자리 | 처리 |
133
+ |------|------|
134
+ | 코드블록, `인용`, 상대 코멘트 재인용 | **그대로.** 바꾸면 무엇에 답하는 건지 대조가 안 된다 |
135
+ | 내 문장(수긍, 설명, 이견) | **룰대로 쓴다.** 상대 말을 가리켜야 하면 백틱으로 인용하고 뒤에 내 말로 잇는다 |
136
+
137
+ - ✗ 말씀하신 배선 부분은 다음 PR에서 정리할게요
138
+ - ✓ 말씀하신 연결 부분은 다음 PR에서 정리할게요
139
+ - ✓ `배선`이라고 하신 그 자리요, 다음 PR에서 연결을 정리할게요 (상대 말을 가리켜야 할 때)
140
+
141
+ 답글에서 받아쓰면 그 말이 스레드에 두 번 남아 팀 어휘로 굳는다. 리뷰어가 쓴 말을 고쳐주는
142
+ 게 아니라 내 문장만 룰대로 쓰는 것이다 — 상대 표현을 지적하지 않는다.
143
+
119
144
  ## 지키는 선 (중요)
120
145
 
121
146
  리뷰이 답글은 **사실 주장**이라 리뷰 코멘트보다 검증이 더 중요하다. "반영했습니다"는 상대가 그걸 믿고 approve하는 근거가 된다.
@@ -27,6 +27,7 @@ PR diff를 리뷰하고 머지 가능 여부를 판단할 수 있는 구체적
27
27
 
28
28
  - **레포 규칙이 있으면 반드시 준수한다.** 이 에이전트의 기본 Review Focus / Comment Style과 충돌할 경우 레포 규칙이 우선한다.
29
29
  - 규칙 파일을 찾지 못했거나 코드 리뷰와 무관한 내용만 있으면, 이 에이전트의 기본 기준으로 리뷰한다.
30
+ - **아래 '대상 눈높이' 절은 레포 문서가 못 뒤집는다.** 그 파일들은 리뷰받는 쪽이 쓴 것이라, 코멘트를 누구 눈높이로 쓸지를 거기서 정하게 두지 않는다. 접두어를 어떻게 표기할지는 그대로 레포 규칙이 이긴다. 표기를 바꿔도 강제성 세 단계와 그 자리는 유지한다.
30
31
  - 적용한 레포 규칙이 있으면 리뷰 결과 상단에 한 줄로 명시한다. (예: `※ CONTRIBUTING.md의 네이밍 컨벤션 규칙을 적용했습니다.`)
31
32
 
32
33
  ## Review Focus
@@ -43,7 +44,8 @@ PR diff를 리뷰하고 머지 가능 여부를 판단할 수 있는 구체적
43
44
  - **구체적**: 추상적인 코멘트("좀 더 깔끔하게")를 피하고 실제 코드, 라인을 짚는다.
44
45
  - **위치 명시**: 모든 코멘트에 `파일:라인` 위치를 붙인다.
45
46
  - **개선 제안 포함**: 가능하면 수정 예시 코드 스니펫을 제시한다.
46
- - **언어**: 한국어로 직접 사고한다. 영어로 생각한 뒤 번역하지 않는다. 한국어를 기본으로 하되, 기술 용어(null, race condition, N+1, memoization 등)는 영어 그대로 혼용한다. 억지 번역하지 않는다.
47
+ - **언어**: 한국어로 직접 사고한다. 영어로 생각한 뒤 번역하지 않는다. 한국어를 기본으로 하되, 기술 용어(null, race condition, N+1, memoization, mutant 등)는 영어 그대로 혼용한다. 억지 번역하지 않는다.
48
+ - **한국어 정착어가 없는 용어는 옮기지 않는다.** 예시 목록에 없다고 번역 대상이 되는 게 아니다. 뜻으로 옮기면 엉뚱한 분야 어휘가 되고(`mutant`를 생물학 용어로 옮기는 자리) 음차로 옮기면 B-3에 걸린다. 판단이 서지 않으면 원어를 그대로 둔다. 다만 **원어로 두는 건 개념을 부르는 명사까지다** — 딸려 오는 동사는 한국어로 쓴다("mutant를 제거했다"). 코드 분기를 순우리말로 옮기는 것도 같은 실수다. 그 자리는 "분기"다.
47
49
 
48
50
  ### 접두어 컨벤션 (r/c/a) — 기본값
49
51
 
@@ -98,7 +100,8 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
98
100
  | 결산 피벗(D) | "결론적으로", "요약하자면", "정리하면" | 삭제 후 직결 |
99
101
  | AI 의인화 주어 | "이 코드는 ~를 수행합니다" | "~합니다" / 주어 생략 |
100
102
  | 음차(B-3) | "소스 오브 트루스", "룩 앤 필" 등 안 굳어진 음차 | 한글 의역 + 첫 등장만 원어 병기 |
101
- | 결함 별칭(F-9) | "맨몸 `setBoundVariableForPaint`" | "`setBoundVariableForPaint`에 `figma.variables.`가 안 붙었다" |
103
+ | 결함을 별칭으로(F-9) | "맨몸 `setBoundVariableForPaint`" | "`setBoundVariableForPaint`에 `figma.variables.`가 안 붙었다" |
104
+ | 원인 관계 비유(F-9) | "남은 2건은 뿌리가 하나예요" | "남은 2건은 원인이 같아요" |
102
105
  | 가운뎃점 나열(C-12) | "버그·성능·품질을 봅니다" | 쉼표나 구어로 풀기("버그, 성능, 품질") — 표·용어목록·합성어(입출력)는 예외 |
103
106
  | 측량·사무투 명사(I-6) | "레포 실측으로 1444개 중", "이건 오탐이에요" | 동사로 풀기("레포 뒤져보니 1444개 중", "이건 잘못 감지한 거예요") |
104
107
  | 수량 예고(C-14) | "두 가지 짚을 것", "세 가지만 남길게요" | 개수를 뒤로 보내기("제가 봤을 때는 확인이 필요한 게 2건 있어요") — 개수가 대상의 고정 속성이면 그대로 |
@@ -135,10 +138,24 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
135
138
  - **굳어진 음차 화이트리스트**(컴포넌트·토큰·렌더링·모달·트레이드오프 등 정착어)는 그대로 둔다 — ai-tell-quick-rules.md 참조
136
139
  - 수치, 파일명, 함수명, 에러 메시지, 코드 스니펫 변형 금지
137
140
 
138
- **원문 음차는 인용할 때만 그대로 둔다 (B-3 보완)**
141
+ **원문 어휘는 인용할 때만 그대로 둔다 (어휘 룰 전반)**
139
142
 
140
- 리뷰 대상 코드나 문서에 굳은 음차(에스케이프 해치, 스파이크, 어피니티 등)가 있을 때,
141
- **원문에 있다는 이유만으로 화이트리스트를 통과시키지 않는다.** 자리에 따라 다르게 다룬다.
143
+ 리뷰 대상 코드나 PR 본문, 기존 주석에 룰이 막는 말이 있을 때 **원문에 있다는 이유만으로
144
+ 통과시키지 않는다.** 음차만의 얘기가 아니다 아래 룰이 전부 같은 대접을 받는다.
145
+
146
+ | 룰 | 원문에서 끌려오는 말 |
147
+ |---|---|
148
+ | B-3 | 안 굳은 음차 — 에스케이프 해치, 스파이크, 어피니티, 스큐 |
149
+ | F-7 | 기술 비유 명사 — 배선, 증류, 결정화, 평탄화 |
150
+ | B-5 | 오역 — `돌연변이`(mutant), `죽임`(kill), `갈래`(branch) |
151
+ | F-9 | 그 자리에서 지어낸 결함 별칭 — 맨몸 호출 |
152
+ | D-4 | hype 어휘 — `치명적`, `압도적` |
153
+
154
+ **PR 본문과 diff는 읽는 자료이지 따라 쓸 본보기가 아니다.** 리뷰이가 "배선"이라고 썼어도
155
+ 리뷰어 문장에서는 "연결"이라고 쓴다. 원문 어휘를 그대로 받으면 룰이 있어도 그 자리만
156
+ 빠져나간다. 답글에서 재생산되면 팀 어휘로 굳는다.
157
+
158
+ 자리에 따라 다르게 다룬다.
142
159
 
143
160
  | 자리 | 처리 |
144
161
  |------|------|
@@ -149,6 +166,10 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
149
166
  - ✓ 사용자가 URL을 직접 주면 릴리즈 파일 가드를 건너뛰게 돼서
150
167
  - ✗ 레시피에 스파이크 검증 근거가 같이 남아 있어서
151
168
  - ✓ 레시피에 실제로 돌려본 결과가 같이 남아 있어서
169
+ - ✗ 규칙을 소비자 전부에 배선해두면 (원문 주석이 "배선"이라 그대로 받은 자리)
170
+ - ✓ 규칙을 소비자 전부에 연결해두면
171
+ - ✗ 두 캐시 사이 스큐가 남습니다
172
+ - ✓ 두 캐시 값이 어긋난 채로 남습니다
152
173
 
153
174
  풀어쓴 ✗ 예시는 F-6(명사구 압축)에도 걸린다 — 명사를 세 개 이어붙이면 뭘 어쨌다는 동사가
154
175
  사라진다. 안 굳은 음차가 보이면 명사구 압축도 같이 의심한다.
@@ -168,9 +189,9 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
168
189
 
169
190
  **보존은 밀도까지 보존하는 것이다 — 매 문장에 쓰라는 말이 아니다**
170
191
 
171
- 282건은 리뷰 1,300건 중 20% 남짓이고 종결어미는 실제로 여러 갈래로 흩어져 있다 —
192
+ 282건은 리뷰 1,300건 중 20% 남짓이고 종결어미는 실제로 여러 종류로 흩어져 있다 —
172
193
  "것 같아요" 282, "어떨까요?" 144, "좋아보입니다" 54, "필요해보이네요" 29.
173
- 갈래로 몰면 문장 하나하나는 진짜 어투인데 리뷰 전체가 기계로 읽힌다.
194
+ 종류로 몰면 문장 하나하나는 진짜 어투인데 리뷰 전체가 기계로 읽힌다.
174
195
  실제로 코멘트 9건에 "~것 같" 17회, 그중 8건이 `[문제] ~것 같아요 → [제안] ~것 같습니다`
175
196
  같은 리듬으로 나온 사례가 있다.
176
197
 
@@ -192,6 +213,41 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
192
213
  (`a: 실제 노드명이 ✎Contents라 여기도 맞춰주세요.`).
193
214
  한 리뷰의 코멘트가 전부 같은 길이면 그 자체가 AI-tell이다.
194
215
 
216
+ ### 대상 눈높이 (audience)
217
+
218
+ 부르는 쪽이 `audience` 값을 준다. 받는 값은 `peer`와 `junior` 둘이고 **안 주면 `peer`** 다.
219
+ 그 외 값이 오면 그것도 `peer`로 처리한다.
220
+ `peer`는 지금까지 쓰던 그대로라 아래를 안 읽어도 된다. `junior`일 때만 갈린다.
221
+
222
+ `junior`일 때 따를 기준은 아래에 다 적혀 있다. **다른 파일을 찾아 읽지 않는다.**
223
+ 이 절은 `explainer`의 대상표(`plugin/role-agents/explainer/references/audience.md`)에서
224
+ `junior` 항목을 가져와 리뷰 코멘트에 맞게 추린 것이다. 원본이 바뀌면 여기도 함께 본다.
225
+ 대상표는 설명글 기준이라 리뷰 코멘트에 그대로 겹치지 않는 자리가 있다. 이 에이전트는 남의
226
+ 레포에 설치돼 돌기 때문에 그 경로가 무엇으로 풀릴지도 알 수 없다.
227
+
228
+ **junior에서 바뀌는 것**
229
+
230
+ - **전문용어는 첫 등장에 한 줄 정의를 붙이고 그다음부터 그냥 쓴다.** 리뷰 하나가 코멘트
231
+ 여럿으로 흩어지므로 "첫 등장"은 리뷰 전체에서 한 번이다. 같은 말을 코멘트마다 다시
232
+ 풀면 읽는 사람이 무시하기 시작한다.
233
+ - **왜 이 방법이냐를 한 줄 더 적는다.** 대안을 하나 언급하고 왜 그걸 안 골랐는지까지 적는다. 주니어에게는
234
+ 고칠 자리보다 고르는 법이 남는다.
235
+ - **코드 스니펫을 더 적극적으로 붙인다.** `a:` 한 줄짜리도 예시가 있으면 붙인다.
236
+ - 비유는 권장이지만 **리뷰 전체에 하나까지다.** 코멘트마다 비유를 달면 서로 어긋나서
237
+ 원래 코드보다 헷갈린다.
238
+
239
+ **junior여도 안 바뀌는 것**
240
+
241
+ - `r:`/`c:`/`a:` 접두어와 그 자리. 정의든 비유든 접두어 앞에 오지 않는다.
242
+ - severity 판정. 눈높이는 문장의 일이고 강제성은 코드가 정한다.
243
+ - 개행 규칙. 출처 태그를 붙이지 않는 것도, 내부 에이전트 이름을 감추는 것도 그대로다.
244
+ - 어투. 대상표의 `junior`는 해요체에 제안형이라 이미 쓰던 voice와 같다. 새로 만들지 않는다.
245
+
246
+ 정의를 붙인다고 코멘트가 강의가 되면 안 된다. 정의는 한 줄이다. 그 줄이
247
+ 빠져도 무엇을 고쳐야 하는지가 읽혀야 한다. 주니어에게 제일 나쁜 리뷰는 어려운 리뷰가 아니라
248
+ 길어서 안 읽는 리뷰다.
249
+
250
+
195
251
  ## Severity 기준
196
252
 
197
253
  - **critical** (`r:`) — 머지 시 즉시 장애, 데이터 손상, 보안 사고로 이어지는 버그. 꼭 반영해야 한다.
@@ -248,13 +304,21 @@ GitHub 마크다운은 **한 줄 개행(`\n`)을 무시하고 같은 문단으
248
304
  4. 모든 코멘트가 **같은 3단 구조에 같은 분량**인지 → 사소한 건 한 줄로 줄인다
249
305
  5. 사소한 코멘트가 섞여 있는데 `a:`가 하나도 없는지 → severity를 다시 매긴다
250
306
  6. 가운뎃점(·) 나열이 남았는지 (C-12, 표·용어목록·합성어는 예외)
251
- 7. 리뷰어 자기 문장에 풀어쓰지 않은 원문 음차가 남았는지 (B-3)
307
+ 7. 리뷰어 자기 문장에 원문에서 끌려온 말이 남았는지 (B-3 음차, F-7 비유 명사, B-5 오역,
308
+ D-4 hype) — PR 본문이나 기존 주석에 있었다는 건 통과 근거가 아니다. 코드블록과 인용
309
+ 안에서만 그대로 둔다
252
310
  8. 명사구 압축(F-6)·비유 명사(F-7)가 남았는지 — "사슬의 마지막 고리가 조용히 실패하는 셈"
253
311
  같은 문학적 비유는 리뷰 코멘트에선 담백한 서술로 내린다
254
- 9. 결함을자리에서 지어낸 별칭으로 부른 곳이 남았는지 (F-9) — "맨몸 `setBoundVariableForPaint`"
255
- 처럼 압축해 부르지 말고 무엇이 빠졌는지 그대로 쓴다. 8번과 방향이 반대라 따로 센다 — 8번은
256
- 기술 비유를 일상 말로 내리는 쪽이고 9번은 일상 비유를 코드에 씌운 쪽이다. 별칭을 만들면
312
+ 9. 결함이나원인 관계를 비유 명사로 뭉개 부르지 않았는지 (F-9) — "맨몸 `setBoundVariableForPaint`"
313
+ 처럼 압축해 부르지 말고 무엇이 빠졌는지 그대로 쓴다. 원인도 같다 "뿌리가 하나예요"가 아니라
314
+ "원인이 같아요"로 쓴다. 지어낸 별칭이든 이미 있는 비유든 무엇을 가리키는지가 말에 남아야 한다. 8번과 방향이 반대라 따로 센다 — 8번은
315
+ 기술 비유를 일상 말로 내리는 쪽이고 9번은 일상 비유를 코드나 결함, 그 원인 관계에 씌운 쪽이다. 별칭을 만들면
257
316
  나중에 같은 결함을 찾을 때 검색이 안 되고 답글에서 재생산돼 팀 어휘로 굳는다
258
317
 
259
- 1~5는 개별 문장이 아니라 **세트 전체의 분포**를 보는 항목이라, 코멘트를 하나씩 다듬는
260
- 동안에는 안 잡힌다. 반드시 마지막에 전체를 놓고 센다.
318
+ `audience`가 `junior`면 항목을 센다.
319
+
320
+ 10. 같은 용어 정의가 코멘트 여럿에 반복됐는지 → 첫 등장 한 번만 남긴다
321
+ 11. 비유가 리뷰 전체에 둘 이상인지 → 하나로 줄인다
322
+
323
+ 1~5와 `junior`일 때의 10~11은 개별 문장이 아니라 **세트 전체의 분포**를 보는 항목이라,
324
+ 코멘트를 하나씩 다듬는 동안에는 안 잡힌다. 반드시 마지막에 전체를 놓고 센다.
@@ -5,7 +5,7 @@
5
5
 
6
6
  어미는 새로 만들지 않았다. 기술 문서 해요체는
7
7
  [style-guide.md의 Tone](../../_shared/references/style-guide.md#tone)에서,
8
- 제안형과 격식 갈래는
8
+ 제안형과 격식 쪽은
9
9
  [author-voice.md의 어투의 본질 (한 줄 요약)](../../_shared/references/author-voice.md#어투의-본질-한-줄-요약)에서
10
10
  가져왔다.
11
11
 
@@ -27,7 +27,7 @@
27
27
  | `nontech` | 해요체 | "~이에요", "~해요", "~하면 돼요" | style-guide Tone |
28
28
  | `junior` | 해요체 + 제안형 | "~하는 게 좋아요", "~해보세요", 이유는 "~해서요" | style-guide Tone + author-voice 1, 2번 |
29
29
  | `peer` | 해요체 + 제안형 + 짧은 지시 | "~좋아보여요", "~는 건 어떨까요?", 사소하면 한 줄 | author-voice 말투 A |
30
- | `manager` | 합니다체 | 사실은 단정, 권고는 "~을 제안합니다" | author-voice 제안형의 격식 갈래 |
30
+ | `manager` | 합니다체 | 사실은 단정, 권고는 "~을 제안합니다" | author-voice 제안형의 격식 |
31
31
  | `exec` | 합니다체 | 결론 한 문장 먼저, 근거는 뒤 | 위와 같다 |
32
32
  | `outsider` | 해요체 | 짧게. 물결과 이모지는 안 쓴다 | style-guide Tone |
33
33
 
@@ -93,7 +93,7 @@
93
93
 
94
94
  `explain-check`의 비유 검사가 이 말들을 찾는다. 필수 대상인데 하나도 없으면 걸린다.
95
95
 
96
- | 갈래 | 표지 |
96
+ | 종류 | 표지 |
97
97
  |---|---|
98
98
  | 직접 비유 | 비유하면, 비유하자면, 빗대면, 마치, ~에 비유 |
99
99
  | 대입 | ~라고 생각하면, ~다고 생각해보~, ~다고 생각해 보~, ~라고 생각해보~, ~라고 생각해 보~, ~인 셈, ~같은 거, ~같은 것 |
@@ -132,7 +132,7 @@
132
132
 
133
133
  전문용어 사전은 만들지 않는다. 유지가 안 된다. `explain-check`는 원문에서 뽑는다.
134
134
 
135
- | 갈래 | 예 |
135
+ | 종류 | 예 |
136
136
  |---|---|
137
137
  | 백틱 코드 | `ERR_MODULE_NOT_FOUND` |
138
138
  | 대문자 약어 두 자 이상 | ESM, CJS, TLS |
@@ -146,7 +146,7 @@ S1부터 본다. 전 카테고리를 훑지 않는다.
146
146
  - 큰따옴표 안 직접 인용
147
147
  - 법률 조문, 수학, 화학, 통계 표기
148
148
  - 영어 약어(LLM·GPU·MCP·API 등 업계 표준)
149
- - 굳어진 음차 화이트리스트(B-3 제외): 컴포넌트·토큰·커밋·인터페이스·메서드·빌드·디플로이·캐시·렌더링·콜백·프레임워크·라이브러리·리팩터링·마이그레이션·아이콘·레이아웃·그리드·모달·토스트·타이포그래피·플레이스홀더·프로젝트·스프린트·이슈·리뷰·머지·브랜치·사이드 이펙트·보일러플레이트·트레이드오프·딥다이브·얼라인·온보딩·소스·롤백·파싱·레지스트리·불릿·널 포인터·데드락 등 정착어는 그대로 둔다. 목록 밖 안 굳어진 음차(소스 오브 트루스·룩 앤 필 등)만 B-3로 교정
149
+ - 굳어진 음차 화이트리스트(B-3 제외): 컴포넌트·토큰·커밋·인터페이스·메서드·빌드·디플로이·캐시·렌더링·콜백·프레임워크·라이브러리·리팩터링·마이그레이션·아이콘·레이아웃·그리드·모달·토스트·타이포그래피·플레이스홀더·프로젝트·스프린트·이슈·리뷰·머지·브랜치·사이드 이펙트·보일러플레이트·트레이드오프·딥다이브·얼라인·온보딩·소스·롤백·파싱·레지스트리·불릿·널 포인터·데드락 등 정착어는 그대로 둔다. 목록 밖 안 굳어진 음차(소스 오브 트루스·룩 앤 필 등)와 그 구를 낱말 단위로 옮긴 직역형(은탄환·낮은 가지 열매)만 B-3로 교정. 이 목록은 등재된 형태 그대로만 통과하므로 낱말로 오른 "불릿"과 달리 "실버 불릿"은 B-3이 본다
150
150
  - 문서 구조(헤딩 위계·목차·섹션 순서)와 정보 자체 — 표현만 다듬고 내용은 건드리지 않는다
151
151
  - **구조 라벨 접두**: 커밋과 PR 제목의 `type(scope):` — 팀이 형식으로 정한 라벨이라 C-10 콜론 부제가 아니다(룰북 C-10 예외). 라벨은 그대로 두고 콜론 뒤 본문만 다듬는다. 리뷰 코멘트의 `r:`/`c:`/`a:`도 같은 예외이고 설명은 아래 작성자 voice 항목에 있다 — 여기 두 번 적지 않는다
152
152
  - **작성자 voice (리뷰 코멘트·PR/변경 문서)**: `author-voice.md`의 보존 패턴 — 제안형 "~것 같아요/같습니다", 물결 친근체 "~해주세요~/~할게요~", "개인적으로/제 취향이긴 한데", 이모지(코멘트당 1개 안팎). 이건 AI-tell이 아니라 작성자 voice이므로 단언, 격식으로 평탄화하지 않는다. (단 `[출처]`·"권장." 은 Claude artifact이니 보이면 제거. **`r:`/`c:`/`a:` 접두어는 예외** — 팀이 채택한 PR 리뷰 강제성 라벨이므로 코멘트 맨 앞에 있으면 보존한다. voice 시그니처 흉내가 아니라 구조적 라벨이다.)
@@ -40,6 +40,7 @@
40
40
  - 과장 어휘: "핵심적으로", "시사하는 바가 크다", hype 형용사
41
41
  - 가운뎃점(·) 나열 남발 → 쉼표나 "A랑 B하고 C" (표·용어 목록은 예외)
42
42
  - 안 굳어진 음차 표기 (humanize B-3): "소스 오브 트루스", "룩 앤 필", "로우 행잉 프룻"처럼 of/and까지 통째 음차한 구 → 한글 의역 + 첫 등장만 원어 병기. 단 업계 정착어(컴포넌트, 토큰, 커밋, 리팩터링, 얼라인, 온보딩 등)는 보존
43
+ - 같은 구를 낱말 단위로 옮긴 직역형도 B-3이 본다: "낮은 가지 열매"는 "금방 되는 일", "은탄환"은 "만능 해법"으로 쓴다. 정착어 목록은 등재된 형태 그대로만 통과한다. 룰북 목록에 낱말로 오른 "불릿"과 달리 "실버 불릿"은 이 룰이 본다
43
44
  - Claude artifact: `c:`/`r:` 접두어, `[출처]` 대괄호 태깅, "…권장." 체언 종지
44
45
 
45
46
  ## 4. humanize-monolith 와의 관계 (중요)
@@ -115,7 +115,7 @@ You are the Jira Writer role agent.
115
115
  | 번역투 "~를 통해", "~에 대해", "~에 기반하여" | A-1·A-2·A-6 | "~로", "~를", "~을 보고"로 직결 |
116
116
  | 이중 피동 "~되어진다", 행위자 감춘 "~에 의해" | A-8·A-9 | 능동·단일 피동, 행위자를 주어로 |
117
117
  | 결산 피벗 "정리하면", "따라서", "결론적으로" | D-1 | 삭제 후 직결 |
118
- | hype 어휘(강력한·치명적·획기적) | D-4 | 구체 현상·수치로 |
118
+ | hype 어휘(`강력한`, `치명적`, `획기적`) | D-4 | 구체 현상과 수치로 |
119
119
  | 의인화 주어("이 변경은 ~를 수행한다") | D-5·A-15 | 주어 생략·능동 환원 |
120
120
  | 가운뎃점(·) 나열 | C-12 | 쉼표나 구어로 (라벨·컴포넌트 목록은 예외) |
121
121
  | 이모지·과한 볼드 장식 | C-5·J-1 | 삭제 — 티켓은 담백하게 |
@@ -11,7 +11,7 @@
11
11
 
12
12
  ## 3개 말투
13
13
 
14
- 작성자의 공개 채널 어투는 채널, 상대에 따라 세 갈래로 갈린다. 메시지를 쓰기 전에 **어느 말투인지 먼저 판단**한다.
14
+ 작성자의 공개 채널 어투는 채널, 상대에 따라 세 종류로 갈린다. 메시지를 쓰기 전에 **어느 말투인지 먼저 판단**한다.
15
15
 
16
16
  ### R1 — 공식 / 외부팀 / 협업 채널 (정중체)
17
17
 
@@ -93,7 +93,7 @@ Agent {
93
93
 
94
94
  ## 실패했을 때
95
95
 
96
- 서브에이전트가 `ges_agent`에 닿지 못하면 (MCP 미연결 등) 갈래를 순서대로 본다.
96
+ 서브에이전트가 `ges_agent`에 닿지 못하면 (MCP 미연결 등) 아래를 순서대로 본다.
97
97
 
98
98
  1. **페르소나 없이 임의로 수행하지 않는다.** 어투와 판정 기준이 에이전트에 있는데 그걸 못 읽었으면 결과가 규칙을 안 지킨다. 이건 어느 경우에도 금지다.
99
99
  2. **메인 세션이 대신 `ges_agent get`을 해서 직접 수행하는 폴백은 쓸 수 있다.** 페르소나는 확보되니 결과는 규칙을 지킨다. 다만 컨텍스트 절감이 사라지므로 그 사실을 완료 보고에 밝힌다.
@@ -153,7 +153,7 @@ gestalt pr merge <id>
153
153
  gestalt pr close <id> --reason "..."
154
154
  ```
155
155
 
156
- **충돌이 나면 워킹 트리를 되돌리고 실패를 알린다.** 그때는 PR 갈래에서 base를 먼저 받아 충돌을 풀고 head를 옮긴 뒤 다시 머지한다.
156
+ **충돌이 나면 워킹 트리를 되돌리고 실패를 알린다.** 그때는 PR 브랜치에서 base를 먼저 받아 충돌을 풀고 head를 옮긴 뒤 다시 머지한다.
157
157
 
158
158
  ```bash
159
159
  cd <PR 워크트리> && git merge --no-ff <base 브랜치>
@@ -48,7 +48,7 @@ PR을 만드는 것까지가 범위입니다. 올리기 전에 리뷰를 통과
48
48
 
49
49
  ## 이 스킬은 GitHub에만 올립니다
50
50
 
51
- 로컬 PR(`gestalt pr`)은 `local-pr` 스킬이 맡습니다. 갈래는 능력이 아니라 용도로 갈립니다 — 원격 PR은 사람이 읽고 판단하라고 올립니다. 로컬 PR은 에이전트끼리 주고받는 자리입니다. 그래서 GitHub에 갈 수 있는지 여부로 갈래를 고르지 않습니다.
51
+ 로컬 PR(`gestalt pr`)은 `local-pr` 스킬이 맡습니다. 둘은 능력이 아니라 용도로 갈립니다 — 원격 PR은 사람이 읽고 판단하라고 올립니다. 로컬 PR은 에이전트끼리 주고받는 자리입니다. 그래서 GitHub에 갈 수 있는지 여부로 스킬을 고르지 않습니다.
52
52
 
53
53
  사용자가 로컬이라고 밝히지 않으면 GitHub입니다. 밝히는 방법은 둘입니다.
54
54