@tienne/gestalt 0.72.6 → 0.72.7

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.
package/CLAUDE.md CHANGED
@@ -145,3 +145,18 @@ plugin/.mcp.json Grok(배포) — plugin/mcp.json과 동일
145
145
  - 해상도 점수 ≥ 0.8 = 요구사항 충분히 명확
146
146
  - 테스트 DB: `.gestalt-test/xxx-${randomUUID()}.db` 고유 경로 (병렬 안전)
147
147
  - 한글 산문에서 가운뎃점(·) 나열 절제 → 쉼표나 "A랑 B하고 C"로 (표·용어 목록은 예외). 룰은 `ai-tell-quick-rules.md` C-12, `style-guide.md`에 정의
148
+
149
+ ## 커밋 메시지, PR 제목
150
+
151
+ 제목은 명사로 끝낸다. 목록에서 한 줄씩 훑는 자리라 서술형으로 끝내면 길어지고 덜 읽힌다. 본문은 반대로 서술체다.
152
+
153
+ | 자리 | 꼴 | 예 |
154
+ |---|---|---|
155
+ | 커밋 제목 | `type(scope): 명사구` | `refactor(chat): 이전 대화 목록의 세션 스토리지 이전` |
156
+ | PR 제목 (티켓 있음) | `[티켓ID] 명사구` | `[PROJ-123] 이전 대화 목록의 세션 스토리지 이전` |
157
+ | PR 제목 (티켓 없음) | `type(scope): 명사구` | `refactor(chat): 이전 대화 목록의 세션 스토리지 이전` |
158
+ | 본문 | 서술체 | 이전 대화 목록을 메모리 캐싱에서 세션 스토리지로 옮겼다. |
159
+
160
+ - 명사로 끝낸다고 조사까지 걷지는 않는다. "대화 목록 세션 스토리지 이전"처럼 조사를 다 빼면 무엇을 무엇으로 바꿨는지가 안 읽힌다 (ai-tell F-6).
161
+ - 명사구 종결을 막는 E-8은 본문에만 적용한다. 제목은 예외이고 근거는 `author-voice.md`의 "제목은 개조식, 본문은 서술체" 절에 있다.
162
+ - 기존 커밋과 PR 제목은 서술형이 섞여 있다. 소급해 안 고친다.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.72.6",
3
+ "version": "0.72.7",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -33,7 +33,7 @@
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 && pnpm run build:output-style",
37
37
  "verify:rules": "tsx scripts/verify-rule-refs.ts",
38
38
  "gate": "pnpm typecheck && pnpm verify:rules && pnpm lint && pnpm format:check && pnpm build && pnpm test",
39
39
  "humanize:baseline": "tsx scripts/humanize-baseline.ts",
@@ -113,7 +113,7 @@
113
113
  | E-1 | 문장 길이 균일(stdev 8 미만) | S2 | 단문 1~2개 / 장문 1개를 각 문단에 의도적 삽입 |
114
114
  | E-2 | 동일 종결어미 "~다" 4문장 연속 + 진행형 "~고 있다" 자동 매핑 | S2 | "~었다·~ㄴ다·~는다·~기 마련이다·~ㄹ 것이다" 등 다양화. "~고 있다" 단순 시제 환원 가능 시 환원("읽고 있다" → "읽는다") |
115
115
  | E-7 | 청자 경어법 4단계(해라/하게/하오/해요/합쇼) 일관성 손실 (대화·구어 한정) | S2 | 한 단락 내 혼용 금지, 격식 일관 (김혜영 2019, 추정) |
116
- | E-8 | 관형형 + 의존명사 종결 — 서술어 없이 "짚을 것", "고려할 점", "주의 사항"으로 문장을 끊음 | S2 / **대화·리뷰 S1** | 서술어를 붙여 문장을 끝낸다("두 가지 짚을 것" → "짚어볼 게 있습니다"). 목차 항목처럼 끊으면 사람이 한 말로 안 읽힌다. **헤딩, 표 셀, 체크리스트 항목, 문단을 여는 볼드 도입구는 대상이 아니다** — 거기서는 명사구 종결이 정상 문법이다. **볼드 예외는 규범, 참조 문서에서 문단 안 소제목 역할을 하는 자리에만 준다** — 리뷰 코멘트와 대화에서는 볼드를 씌워도 본문 산문으로 본다. 서식으로만 예외를 주면 "두 가지 짚을 것"을 볼드 처리해 그대로 통과시키게 된다. 본문 산문과 대화만 본다. 예외가 전부 문맥이라 줄 단위 정규식으로는 못 가르고, 그래서 탐지기가 없다. G-4와 겹치면 서술어를 붙이되 판단이면 화자도 함께 남긴다 |
116
+ | E-8 | 관형형 + 의존명사 종결 — 서술어 없이 "짚을 것", "고려할 점", "주의 사항"으로 문장을 끊음 | S2 / **대화·리뷰 S1** | 서술어를 붙여 문장을 끝낸다("두 가지 짚을 것" → "짚어볼 게 있습니다"). 목차 항목처럼 끊으면 사람이 한 말로 안 읽힌다. **헤딩, 표 셀, 체크리스트 항목, 문단을 여는 볼드 도입구는 대상이 아니다** — 거기서는 명사구 종결이 정상 문법이다. **PR 제목과 커밋 제목도 대상이 아니다** — 목록에서 한 줄로 훑는 자리라 개조식이 기본이고, 이 레포는 오히려 서술형 종결을 안 쓴다 (`author-voice.md`의 "제목은 개조식, 본문은 서술체" 절). 본문은 그대로 이 룰을 받는다. **볼드 예외는 규범, 참조 문서에서 문단 안 소제목 역할을 하는 자리에만 준다** — 리뷰 코멘트와 대화에서는 볼드를 씌워도 본문 산문으로 본다. 서식으로만 예외를 주면 "두 가지 짚을 것"을 볼드 처리해 그대로 통과시키게 된다. 본문 산문과 대화만 본다. 예외가 전부 문맥이라 줄 단위 정규식으로는 못 가르고, 그래서 탐지기가 없다. G-4와 겹치면 서술어를 붙이되 판단이면 화자도 함께 남긴다 |
117
117
 
118
118
  ## F. 과도한 수식, 중복
119
119
 
@@ -153,10 +153,31 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
153
153
  - **PR 설명, 변경 컨텍스트(change-context-writer)**: 본문은 "무엇을 왜 바꿨는지"를 서술하는
154
154
  성격이라 제안형보다 **담백한 서술체**가 맞다. 단 "~한 것 같습니다"의 부드러움과 온기는 유지하고
155
155
  딱딱한 단언, 결산 피벗으로 평탄화하지 않는다. 협업 한마디(요청·배려)는 말투 B를 빌린다.
156
+ **제목은 본문과 갈린다** — 아래 "제목은 개조식, 본문은 서술체"를 본다.
156
157
  - **공통**: `c:`/`r:`·`a:` 접두어를 어투 시그니처로 흉내 내지 않는다. 단, 팀이 리뷰 강제성 라벨로 채택한 경우에는 라벨만 보존한다. `[출처]`·"권장." 은 어디서도 쓰지 않는다 (Claude artifact).
157
158
 
158
159
  ---
159
160
 
161
+ ## 제목은 개조식, 본문은 서술체
162
+
163
+ PR 제목과 커밋 제목은 명사로 끝낸다. 목록에서 한 줄씩 훑는 자리라 문장으로 끝내면 길어지고
164
+ 같은 정보를 담아도 덜 읽힌다. 본문은 반대로 서술체다 — 왜 바꿨는지를 읽는 자리라 조사를 살리고
165
+ 서술어로 끝낸다.
166
+
167
+ | 자리 | 꼴 | 예 |
168
+ |---|---|---|
169
+ | 커밋 제목 | `type(scope): 명사구` | `refactor(chat): 이전 대화 목록을 세션 스토리지로 이전` |
170
+ | PR 제목 (티켓 있음) | `[티켓ID] 명사구` | `[PROJ-123] 이전 대화 목록의 세션 스토리지 이전` |
171
+ | PR 제목 (티켓 없음) | `type(scope): 명사구` | `refactor(chat): 이전 대화 목록의 세션 스토리지 이전` |
172
+ | PR 본문, 커밋 본문 | 서술체 | 이전 대화 목록을 메모리 캐싱에서 세션 스토리지로 옮겼다. |
173
+
174
+ 명사로 끝낸다고 명사만 이어붙이라는 뜻은 아니다. 조사는 살린다 — "대화 목록 세션 스토리지 이전"
175
+ 처럼 조사를 다 빼면 무엇을 무엇으로 바꿨는지가 안 읽힌다. F-6(복합명사 압축)이 여기서도 산다.
176
+
177
+ 윤문할 때 제목의 명사구 종결을 서술형으로 되돌리지 않는다. 이 절이 그 자리의 근거다.
178
+
179
+ ---
180
+
160
181
  ## 명사로 뭉치지 말고 풀어 말하기 (자주 놓치는 사각지대)
161
182
 
162
183
  가장 티 나는 AI 흔적은 번역투나 헤징이 아니라 **개념을 명사 덩어리로 압축하는 습관**이다.
@@ -179,7 +200,7 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
179
200
  "짚어볼 게 있습니다"처럼 서술어를 붙인다. 판단을 말하는 자리면 화자까지 남겨
180
201
  "제가 봤을 때는 확인이 필요합니다"로 간다 — G-4와 겹치는 자리다. 헤딩이나 체크리스트 항목,
181
202
  규범 문서에서 소제목 역할을 하는 볼드 도입구는 명사구 종결이 정상 문법이라 대상이 아니다
182
- (ai-tell E-8).
203
+ (ai-tell E-8). **PR 제목과 커밋 제목도 대상이 아니다** — 아래 "제목은 개조식, 본문은 서술체"를 본다.
183
204
 
184
205
  **개수를 앞세워 예고하지 말 것.** "두 가지 짚을 것", "세 가지 이유가 있습니다"처럼 할 말의 개수를
185
206
  먼저 세어 선언하고 시작하면 발표문이 된다. 사람은 말하다 보니 몇 개가 되는 것이지 미리 세지 않는다.
@@ -305,3 +326,4 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
305
326
  7. `c:`/`r:`·`a:`를 어투처럼 흉내 내지 않는다. 팀이 채택한 리뷰 강제성 라벨은 예외다. `[출처]`·"권장." 은 쓰지 않는다 (Claude artifact).
306
327
  8. 개념을 명사로 뭉치지 말고 동사로 푼다("시안 정합 버그픽스" → "시안이랑 다르게 나오던 거"). "건" 같은 사무투 분류사와 생략된 목적어를 되살린다.
307
328
  9. 리뷰 코멘트를 "지적"이라 부르지 않는다 (I-7). 내 것은 "남겼던 의견 / 드렸던 의견", 상대 것은 "짚어주신 부분 / 남겨주신 의견".
329
+ 10. PR 제목과 커밋 제목은 명사로 끝낸다. 본문만 서술체다 (E-8 예외).
@@ -102,7 +102,7 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
102
102
  | 가운뎃점 나열(C-12) | "버그·성능·품질을 봅니다" | 쉼표나 구어로 풀기("버그, 성능, 품질") — 표·용어목록·합성어(입출력)는 예외 |
103
103
  | 측량·사무투 명사(I-6) | "레포 실측으로 1444개 중", "이건 오탐이에요" | 동사로 풀기("레포 뒤져보니 1444개 중", "이건 잘못 감지한 거예요") |
104
104
  | 수량 예고(C-14) | "두 가지 짚을 것", "세 가지만 남길게요" | 개수를 뒤로 보내기("제가 봤을 때는 확인이 필요한 게 2건 있어요") — 개수가 대상의 고정 속성이면 그대로 |
105
- | 명사구 종결(E-8) | "두 가지 짚을 것", "확인할 점" | 서술어를 붙여 끝내기("짚어볼 게 있어요") — 헤딩과 체크리스트는 예외 — 코멘트에서는 볼드를 씌워도 본문으로 본다 |
105
+ | 명사구 종결(E-8) | "두 가지 짚을 것", "확인할 점" | 서술어를 붙여 끝내기("짚어볼 게 있어요") — 헤딩, 체크리스트, PR 제목, 커밋 제목은 예외 — 코멘트에서는 볼드를 씌워도 본문으로 본다 |
106
106
  | 화자 소거(G-4) | "확인이 필요합니다" | 누구 판단인지 밝히기("제가 봤을 때는 확인이 필요해요") — 코드를 읽고 확인한 결함은 그대로 단정한다 |
107
107
 
108
108
  **근거를 제시하는 자리의 어휘.** 수치를 들이밀 때 "실측", "계측", "산출", "오탐" 같은 측량투
@@ -211,7 +211,18 @@ Agent {
211
211
 
212
212
  0단계의 `repoRules` 구조 + 3단계의 `changeContext` + 1단계의 `prIntent`를 합성해 PR description을 작성합니다.
213
213
 
214
- - **PR 제목**: `CLAUDE.md`가 있으면 커밋 컨벤션을 따릅니다 (예: `type(scope): subject`).
214
+ - **PR 제목**: 레포에 규칙이 있으면 그걸 먼저 따릅니다 (`CLAUDE.md`, `CONTRIBUTING.md`). 없으면 아래를 씁니다.
215
+
216
+ | 조건 | 꼴 | 예 |
217
+ |---|---|---|
218
+ | `prIntent.issueRef`가 있음 | `[티켓ID] 명사구` | `[PROJ-123] 이전 대화 목록의 세션 스토리지 이전` |
219
+ | 없음 | `type(scope): 명사구` | `refactor(chat): 이전 대화 목록의 세션 스토리지 이전` |
220
+
221
+ **제목은 명사로 끝냅니다.** 목록에서 한 줄씩 훑는 자리라 서술형으로 끝내면 길어지고 덜 읽힙니다. 본문은 반대로 서술체입니다 — 근거는 [`author-voice.md`](../../role-agents/_shared/references/author-voice.md)의 "제목은 개조식, 본문은 서술체" 절에 있습니다.
222
+
223
+ 명사로 끝낸다고 조사까지 빼지는 않습니다. "대화 목록 세션 스토리지 이전"처럼 조사를 다 걷으면 무엇을 무엇으로 바꿨는지가 안 읽힙니다 (ai-tell F-6).
224
+
225
+ `issueRef`에 `PROJ-123`, `#42`, URL 등 어느 꼴이 들어와도 대괄호로 감싼 식별자만 남깁니다. URL이면 끝의 식별자를 뽑고 `#42`면 `[#42]`로 씁니다. 1단계를 건너뛰어 `issueRef`가 비어 있으면 브랜치 이름에서 티켓 꼴(`[A-Z]+-\d+`)을 찾아봅니다. 그것도 없으면 `type(scope):` 쪽으로 갑니다.
215
226
  - **흐름 변화 (AS-IS → TO-BE)**: `changeContext`에 담긴 `## 흐름 변화 (AS-IS → TO-BE)` 섹션을 PR description에 반드시 포함합니다. PR은 사람이 리뷰하므로, 이번 변경으로 흐름이 어떻게 달라지는지를 리뷰어가 스캔하듯 파악할 수 있어야 합니다. 화살표 대비/대비 표 포맷은 3단계 에이전트가 diff 성격에 맞게 이미 골라 둔 것을 그대로 씁니다.
216
227
  - **PR 템플릿이 있는 경우**: 템플릿 구조를 깨지 않는 선에서, 변경 요약 성격의 섹션(예: Changes, 변경 사항) 안이나 바로 아래에 흐름 변화를 배치합니다. 템플릿에 이미 유사 섹션이 있으면 그 안에 녹입니다.
217
228
  - **템플릿이 없는 경우**: `## Changes` 아래에 흐름 변화 섹션을 둡니다.
@@ -242,6 +253,10 @@ Agent {
242
253
  Mermaid 구조도 그대로 둔다
243
254
  - author-voice.md의 \"PR 설명·변경 컨텍스트\" 장르 기준을 따른다. 담백한 서술체를
244
255
  유지하되 \"~한 것 같습니다\"의 부드러움은 깎지 않는다
256
+ - **제목은 명사로 끝나 있다. 그대로 둔다** — E-8(명사구 종결)을 제목에 적용해
257
+ 서술형으로 되돌리지 않는다. author-voice.md의 \"제목은 개조식, 본문은 서술체\"
258
+ 절이 그 자리의 근거다. 앞머리의 `[티켓ID]`나 `type(scope):`도 건드리지 않는다.
259
+ E-8은 본문에만 적용한다
245
260
  - 레포 템플릿 구조는 재구성하지 않는다. 섹션 순서, 체크박스, 헤딩은 그대로 두고
246
261
  문장 표현만 다듬는다
247
262
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tienne/gestalt",
3
- "version": "0.72.6",
3
+ "version": "0.72.7",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -33,7 +33,7 @@
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 && pnpm run build:output-style",
37
37
  "verify:rules": "tsx scripts/verify-rule-refs.ts",
38
38
  "gate": "pnpm typecheck && pnpm verify:rules && pnpm lint && pnpm format:check && pnpm build && pnpm test",
39
39
  "humanize:baseline": "tsx scripts/humanize-baseline.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gestalt",
3
- "version": "0.72.6",
3
+ "version": "0.72.7",
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"
package/plugin/.mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "gestalt": {
4
4
  "command": "npx",
5
- "args": ["-y", "@tienne/gestalt@0.72.6", "serve"],
5
+ "args": ["-y", "@tienne/gestalt@0.72.7", "serve"],
6
6
  "startup_timeout_sec": 180,
7
7
  "tool_timeout_sec": 900
8
8
  }
package/plugin/mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "gestalt": {
4
4
  "command": "npx",
5
- "args": ["-y", "@tienne/gestalt@0.72.6", "serve"],
5
+ "args": ["-y", "@tienne/gestalt@0.72.7", "serve"],
6
6
  "startup_timeout_sec": 180,
7
7
  "tool_timeout_sec": 900
8
8
  }
@@ -113,7 +113,7 @@
113
113
  | E-1 | 문장 길이 균일(stdev 8 미만) | S2 | 단문 1~2개 / 장문 1개를 각 문단에 의도적 삽입 |
114
114
  | E-2 | 동일 종결어미 "~다" 4문장 연속 + 진행형 "~고 있다" 자동 매핑 | S2 | "~었다·~ㄴ다·~는다·~기 마련이다·~ㄹ 것이다" 등 다양화. "~고 있다" 단순 시제 환원 가능 시 환원("읽고 있다" → "읽는다") |
115
115
  | E-7 | 청자 경어법 4단계(해라/하게/하오/해요/합쇼) 일관성 손실 (대화·구어 한정) | S2 | 한 단락 내 혼용 금지, 격식 일관 (김혜영 2019, 추정) |
116
- | E-8 | 관형형 + 의존명사 종결 — 서술어 없이 "짚을 것", "고려할 점", "주의 사항"으로 문장을 끊음 | S2 / **대화·리뷰 S1** | 서술어를 붙여 문장을 끝낸다("두 가지 짚을 것" → "짚어볼 게 있습니다"). 목차 항목처럼 끊으면 사람이 한 말로 안 읽힌다. **헤딩, 표 셀, 체크리스트 항목, 문단을 여는 볼드 도입구는 대상이 아니다** — 거기서는 명사구 종결이 정상 문법이다. **볼드 예외는 규범, 참조 문서에서 문단 안 소제목 역할을 하는 자리에만 준다** — 리뷰 코멘트와 대화에서는 볼드를 씌워도 본문 산문으로 본다. 서식으로만 예외를 주면 "두 가지 짚을 것"을 볼드 처리해 그대로 통과시키게 된다. 본문 산문과 대화만 본다. 예외가 전부 문맥이라 줄 단위 정규식으로는 못 가르고, 그래서 탐지기가 없다. G-4와 겹치면 서술어를 붙이되 판단이면 화자도 함께 남긴다 |
116
+ | E-8 | 관형형 + 의존명사 종결 — 서술어 없이 "짚을 것", "고려할 점", "주의 사항"으로 문장을 끊음 | S2 / **대화·리뷰 S1** | 서술어를 붙여 문장을 끝낸다("두 가지 짚을 것" → "짚어볼 게 있습니다"). 목차 항목처럼 끊으면 사람이 한 말로 안 읽힌다. **헤딩, 표 셀, 체크리스트 항목, 문단을 여는 볼드 도입구는 대상이 아니다** — 거기서는 명사구 종결이 정상 문법이다. **PR 제목과 커밋 제목도 대상이 아니다** — 목록에서 한 줄로 훑는 자리라 개조식이 기본이고, 이 레포는 오히려 서술형 종결을 안 쓴다 (`author-voice.md`의 "제목은 개조식, 본문은 서술체" 절). 본문은 그대로 이 룰을 받는다. **볼드 예외는 규범, 참조 문서에서 문단 안 소제목 역할을 하는 자리에만 준다** — 리뷰 코멘트와 대화에서는 볼드를 씌워도 본문 산문으로 본다. 서식으로만 예외를 주면 "두 가지 짚을 것"을 볼드 처리해 그대로 통과시키게 된다. 본문 산문과 대화만 본다. 예외가 전부 문맥이라 줄 단위 정규식으로는 못 가르고, 그래서 탐지기가 없다. G-4와 겹치면 서술어를 붙이되 판단이면 화자도 함께 남긴다 |
117
117
 
118
118
  ## F. 과도한 수식, 중복
119
119
 
@@ -153,10 +153,31 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
153
153
  - **PR 설명, 변경 컨텍스트(change-context-writer)**: 본문은 "무엇을 왜 바꿨는지"를 서술하는
154
154
  성격이라 제안형보다 **담백한 서술체**가 맞다. 단 "~한 것 같습니다"의 부드러움과 온기는 유지하고
155
155
  딱딱한 단언, 결산 피벗으로 평탄화하지 않는다. 협업 한마디(요청·배려)는 말투 B를 빌린다.
156
+ **제목은 본문과 갈린다** — 아래 "제목은 개조식, 본문은 서술체"를 본다.
156
157
  - **공통**: `c:`/`r:`·`a:` 접두어를 어투 시그니처로 흉내 내지 않는다. 단, 팀이 리뷰 강제성 라벨로 채택한 경우에는 라벨만 보존한다. `[출처]`·"권장." 은 어디서도 쓰지 않는다 (Claude artifact).
157
158
 
158
159
  ---
159
160
 
161
+ ## 제목은 개조식, 본문은 서술체
162
+
163
+ PR 제목과 커밋 제목은 명사로 끝낸다. 목록에서 한 줄씩 훑는 자리라 문장으로 끝내면 길어지고
164
+ 같은 정보를 담아도 덜 읽힌다. 본문은 반대로 서술체다 — 왜 바꿨는지를 읽는 자리라 조사를 살리고
165
+ 서술어로 끝낸다.
166
+
167
+ | 자리 | 꼴 | 예 |
168
+ |---|---|---|
169
+ | 커밋 제목 | `type(scope): 명사구` | `refactor(chat): 이전 대화 목록을 세션 스토리지로 이전` |
170
+ | PR 제목 (티켓 있음) | `[티켓ID] 명사구` | `[PROJ-123] 이전 대화 목록의 세션 스토리지 이전` |
171
+ | PR 제목 (티켓 없음) | `type(scope): 명사구` | `refactor(chat): 이전 대화 목록의 세션 스토리지 이전` |
172
+ | PR 본문, 커밋 본문 | 서술체 | 이전 대화 목록을 메모리 캐싱에서 세션 스토리지로 옮겼다. |
173
+
174
+ 명사로 끝낸다고 명사만 이어붙이라는 뜻은 아니다. 조사는 살린다 — "대화 목록 세션 스토리지 이전"
175
+ 처럼 조사를 다 빼면 무엇을 무엇으로 바꿨는지가 안 읽힌다. F-6(복합명사 압축)이 여기서도 산다.
176
+
177
+ 윤문할 때 제목의 명사구 종결을 서술형으로 되돌리지 않는다. 이 절이 그 자리의 근거다.
178
+
179
+ ---
180
+
160
181
  ## 명사로 뭉치지 말고 풀어 말하기 (자주 놓치는 사각지대)
161
182
 
162
183
  가장 티 나는 AI 흔적은 번역투나 헤징이 아니라 **개념을 명사 덩어리로 압축하는 습관**이다.
@@ -179,7 +200,7 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
179
200
  "짚어볼 게 있습니다"처럼 서술어를 붙인다. 판단을 말하는 자리면 화자까지 남겨
180
201
  "제가 봤을 때는 확인이 필요합니다"로 간다 — G-4와 겹치는 자리다. 헤딩이나 체크리스트 항목,
181
202
  규범 문서에서 소제목 역할을 하는 볼드 도입구는 명사구 종결이 정상 문법이라 대상이 아니다
182
- (ai-tell E-8).
203
+ (ai-tell E-8). **PR 제목과 커밋 제목도 대상이 아니다** — 아래 "제목은 개조식, 본문은 서술체"를 본다.
183
204
 
184
205
  **개수를 앞세워 예고하지 말 것.** "두 가지 짚을 것", "세 가지 이유가 있습니다"처럼 할 말의 개수를
185
206
  먼저 세어 선언하고 시작하면 발표문이 된다. 사람은 말하다 보니 몇 개가 되는 것이지 미리 세지 않는다.
@@ -305,3 +326,4 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
305
326
  7. `c:`/`r:`·`a:`를 어투처럼 흉내 내지 않는다. 팀이 채택한 리뷰 강제성 라벨은 예외다. `[출처]`·"권장." 은 쓰지 않는다 (Claude artifact).
306
327
  8. 개념을 명사로 뭉치지 말고 동사로 푼다("시안 정합 버그픽스" → "시안이랑 다르게 나오던 거"). "건" 같은 사무투 분류사와 생략된 목적어를 되살린다.
307
328
  9. 리뷰 코멘트를 "지적"이라 부르지 않는다 (I-7). 내 것은 "남겼던 의견 / 드렸던 의견", 상대 것은 "짚어주신 부분 / 남겨주신 의견".
329
+ 10. PR 제목과 커밋 제목은 명사로 끝낸다. 본문만 서술체다 (E-8 예외).
@@ -102,7 +102,7 @@ voice 모델을 따른다. 초안 작성 후 반드시 [`../_shared/references/a
102
102
  | 가운뎃점 나열(C-12) | "버그·성능·품질을 봅니다" | 쉼표나 구어로 풀기("버그, 성능, 품질") — 표·용어목록·합성어(입출력)는 예외 |
103
103
  | 측량·사무투 명사(I-6) | "레포 실측으로 1444개 중", "이건 오탐이에요" | 동사로 풀기("레포 뒤져보니 1444개 중", "이건 잘못 감지한 거예요") |
104
104
  | 수량 예고(C-14) | "두 가지 짚을 것", "세 가지만 남길게요" | 개수를 뒤로 보내기("제가 봤을 때는 확인이 필요한 게 2건 있어요") — 개수가 대상의 고정 속성이면 그대로 |
105
- | 명사구 종결(E-8) | "두 가지 짚을 것", "확인할 점" | 서술어를 붙여 끝내기("짚어볼 게 있어요") — 헤딩과 체크리스트는 예외 — 코멘트에서는 볼드를 씌워도 본문으로 본다 |
105
+ | 명사구 종결(E-8) | "두 가지 짚을 것", "확인할 점" | 서술어를 붙여 끝내기("짚어볼 게 있어요") — 헤딩, 체크리스트, PR 제목, 커밋 제목은 예외 — 코멘트에서는 볼드를 씌워도 본문으로 본다 |
106
106
  | 화자 소거(G-4) | "확인이 필요합니다" | 누구 판단인지 밝히기("제가 봤을 때는 확인이 필요해요") — 코드를 읽고 확인한 결함은 그대로 단정한다 |
107
107
 
108
108
  **근거를 제시하는 자리의 어휘.** 수치를 들이밀 때 "실측", "계측", "산출", "오탐" 같은 측량투
@@ -211,7 +211,18 @@ Agent {
211
211
 
212
212
  0단계의 `repoRules` 구조 + 3단계의 `changeContext` + 1단계의 `prIntent`를 합성해 PR description을 작성합니다.
213
213
 
214
- - **PR 제목**: `CLAUDE.md`가 있으면 커밋 컨벤션을 따릅니다 (예: `type(scope): subject`).
214
+ - **PR 제목**: 레포에 규칙이 있으면 그걸 먼저 따릅니다 (`CLAUDE.md`, `CONTRIBUTING.md`). 없으면 아래를 씁니다.
215
+
216
+ | 조건 | 꼴 | 예 |
217
+ |---|---|---|
218
+ | `prIntent.issueRef`가 있음 | `[티켓ID] 명사구` | `[PROJ-123] 이전 대화 목록의 세션 스토리지 이전` |
219
+ | 없음 | `type(scope): 명사구` | `refactor(chat): 이전 대화 목록의 세션 스토리지 이전` |
220
+
221
+ **제목은 명사로 끝냅니다.** 목록에서 한 줄씩 훑는 자리라 서술형으로 끝내면 길어지고 덜 읽힙니다. 본문은 반대로 서술체입니다 — 근거는 [`author-voice.md`](../../role-agents/_shared/references/author-voice.md)의 "제목은 개조식, 본문은 서술체" 절에 있습니다.
222
+
223
+ 명사로 끝낸다고 조사까지 빼지는 않습니다. "대화 목록 세션 스토리지 이전"처럼 조사를 다 걷으면 무엇을 무엇으로 바꿨는지가 안 읽힙니다 (ai-tell F-6).
224
+
225
+ `issueRef`에 `PROJ-123`, `#42`, URL 등 어느 꼴이 들어와도 대괄호로 감싼 식별자만 남깁니다. URL이면 끝의 식별자를 뽑고 `#42`면 `[#42]`로 씁니다. 1단계를 건너뛰어 `issueRef`가 비어 있으면 브랜치 이름에서 티켓 꼴(`[A-Z]+-\d+`)을 찾아봅니다. 그것도 없으면 `type(scope):` 쪽으로 갑니다.
215
226
  - **흐름 변화 (AS-IS → TO-BE)**: `changeContext`에 담긴 `## 흐름 변화 (AS-IS → TO-BE)` 섹션을 PR description에 반드시 포함합니다. PR은 사람이 리뷰하므로, 이번 변경으로 흐름이 어떻게 달라지는지를 리뷰어가 스캔하듯 파악할 수 있어야 합니다. 화살표 대비/대비 표 포맷은 3단계 에이전트가 diff 성격에 맞게 이미 골라 둔 것을 그대로 씁니다.
216
227
  - **PR 템플릿이 있는 경우**: 템플릿 구조를 깨지 않는 선에서, 변경 요약 성격의 섹션(예: Changes, 변경 사항) 안이나 바로 아래에 흐름 변화를 배치합니다. 템플릿에 이미 유사 섹션이 있으면 그 안에 녹입니다.
217
228
  - **템플릿이 없는 경우**: `## Changes` 아래에 흐름 변화 섹션을 둡니다.
@@ -242,6 +253,10 @@ Agent {
242
253
  Mermaid 구조도 그대로 둔다
243
254
  - author-voice.md의 \"PR 설명·변경 컨텍스트\" 장르 기준을 따른다. 담백한 서술체를
244
255
  유지하되 \"~한 것 같습니다\"의 부드러움은 깎지 않는다
256
+ - **제목은 명사로 끝나 있다. 그대로 둔다** — E-8(명사구 종결)을 제목에 적용해
257
+ 서술형으로 되돌리지 않는다. author-voice.md의 \"제목은 개조식, 본문은 서술체\"
258
+ 절이 그 자리의 근거다. 앞머리의 `[티켓ID]`나 `type(scope):`도 건드리지 않는다.
259
+ E-8은 본문에만 적용한다
245
260
  - 레포 템플릿 구조는 재구성하지 않는다. 섹션 순서, 체크박스, 헤딩은 그대로 두고
246
261
  문장 표현만 다듬는다
247
262