@tienne/gestalt 0.56.0 → 0.58.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.
- package/CLAUDE.md +1 -1
- package/dist/package.json +1 -1
- package/dist/plugin/role-agents/_shared/references/author-voice.md +13 -0
- package/dist/plugin/role-agents/impact-writer/AGENT.md +4 -1
- package/dist/plugin/role-agents/impact-writer/references/doc-playbooks.md +2 -2
- package/dist/plugin/role-agents/impact-writer/references/report-register.md +96 -0
- package/dist/plugin/role-agents/technical-writer/AGENT.md +1 -0
- package/dist/plugin/skills/brief/SKILL.md +9 -1
- package/dist/src/cli/commands/humanize-check.d.ts.map +1 -1
- package/dist/src/cli/commands/humanize-check.js +1 -1
- package/dist/src/cli/commands/humanize-check.js.map +1 -1
- package/dist/src/cli/index.js +1 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/humanize/check.d.ts +1 -1
- package/dist/src/humanize/check.d.ts.map +1 -1
- package/dist/src/humanize/check.js +19 -2
- package/dist/src/humanize/check.js.map +1 -1
- package/dist/src/humanize/detectors.d.ts +9 -0
- package/dist/src/humanize/detectors.d.ts.map +1 -1
- package/dist/src/humanize/detectors.js +22 -1
- package/dist/src/humanize/detectors.js.map +1 -1
- package/dist/src/humanize/index.d.ts +1 -1
- package/dist/src/humanize/index.d.ts.map +1 -1
- package/dist/src/humanize/index.js +1 -1
- package/dist/src/humanize/index.js.map +1 -1
- package/dist/src/humanize/rules.d.ts +2 -2
- package/dist/src/humanize/rules.d.ts.map +1 -1
- package/package.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/role-agents/_shared/references/author-voice.md +13 -0
- package/plugin/role-agents/impact-writer/AGENT.md +4 -1
- package/plugin/role-agents/impact-writer/references/doc-playbooks.md +2 -2
- package/plugin/role-agents/impact-writer/references/report-register.md +96 -0
- package/plugin/role-agents/technical-writer/AGENT.md +1 -0
- package/plugin/skills/brief/SKILL.md +9 -1
package/CLAUDE.md
CHANGED
|
@@ -32,7 +32,7 @@ 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
34
|
pnpm build:output-style # 룰북 → ~/.claude/output-styles/tienne-voice.md 생성
|
|
35
|
-
pnpm tsx bin/gestalt.ts humanize-check --before a.md --after b.md --register
|
|
35
|
+
pnpm tsx bin/gestalt.ts humanize-check --before a.md --after b.md --register report
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
## MCP Tools
|
package/dist/package.json
CHANGED
|
@@ -186,6 +186,19 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
|
|
|
186
186
|
무언가가 그 방향으로 가는 것이다. "맞는 방향 같아요", "그렇게 결론 냈어요"처럼 사람이나
|
|
187
187
|
대상을 주어로 되돌린다 (ai-tell D-5 의인화 추상 주어의 사촌).
|
|
188
188
|
|
|
189
|
+
**추상명사에 측량 동사를 붙이지 말 것.** "근거를 재봤는데", "의견을 달아봤는데"처럼 재다나
|
|
190
|
+
달다처럼 물리적으로 계측하는 동사를 근거, 의견, 판단 같은 추상명사에 붙이면 붕 뜬다. 실제로
|
|
191
|
+
저울에 올린 게 아니라 검토하거나 확인한 것이다. "근거를 확인해봤는데", "의견을 검토해봤는데"처럼
|
|
192
|
+
사람이 하는 행위 동사로 되돌린다 (ai-tell F-7 물리 동사 도피의 사촌). 정규식 탐지기는 "재다"의
|
|
193
|
+
멀쩡한 물리적 용법("온도를 재봤는데")까지 걸릴까 봐 이 패턴을 일부러 빼뒀다 — 목적어가
|
|
194
|
+
추상명사인지 보고 사람이 판단한다.
|
|
195
|
+
|
|
196
|
+
**얽힌 것에는 풀다, 막힌 것에는 해소하다.** "오해를 풀다", "갈등을 풀다"처럼 얽혀 있는
|
|
197
|
+
대상에는 풀다가 맞는다. 그런데 "진입을 막고 있던 두 가지를 풉니다"처럼 막혀 있는 대상(문제,
|
|
198
|
+
이슈, 장벽)에는 풀다가 안 맞는다 — 얽힌 게 아니라 막힌 거라서다. "두 가지 문제를 해소합니다",
|
|
199
|
+
"막고 있던 이슈를 해결합니다"처럼 막힘에는 해소하다나 해결하다를 쓴다. 판정법 — 대상이 실
|
|
200
|
+
뭉치처럼 얽혀 있는지, 벽처럼 막고 있는지 먼저 본다.
|
|
201
|
+
|
|
189
202
|
---
|
|
190
203
|
|
|
191
204
|
## 리뷰 코멘트를 "지적"이라고 부르지 않는다
|
|
@@ -14,6 +14,7 @@ You are the Impact Writer role agent.
|
|
|
14
14
|
어투, 문체 기준: `references/voice.md` — 독자별 말투(격식체/해요체)와 작성자 voice 적용 기준. **작성 전 반드시 확인한다.**
|
|
15
15
|
세부 문서 유형별 구조: `references/doc-playbooks.md`
|
|
16
16
|
한국어 문장, 용어 규칙: `../_shared/references/style-guide.md` (공유)
|
|
17
|
+
보고서 전용 문체와 프레이밍: `references/report-register.md` — 진행현황, 성과 분석, 제안서, 의사결정 메모처럼 기록성과 정밀도가 필요한 문서에만 적용한다.
|
|
17
18
|
전면 윤문은 `humanize-monolith`가 담당한다 (아래 humanize 처리 참조).
|
|
18
19
|
|
|
19
20
|
## 다른 라이터와의 경계
|
|
@@ -37,10 +38,12 @@ You are the Impact Writer role agent.
|
|
|
37
38
|
2. **숫자는 맥락과 함께.** "전환율 98%"가 아니라 "목표 90% 대비 98%, 8%p 초과 달성". 단독 수치는 정보가 아니라 노이즈다. 기준값, 전기 대비, 목표 대비 중 하나는 반드시 붙인다.
|
|
38
39
|
3. **주장에는 근거, 근거에는 출처.** 데이터의 기간, 정의, 출처를 명시한다. 추정이면 추정이라고 적고 단정하지 않는다.
|
|
39
40
|
4. **so-what을 끝까지 민다.** "지표가 올랐다"에서 멈추지 않고 "그래서 무엇을 해야 하는가"까지 적는다. 성과 문서는 보고가 아니라 다음 행동을 부르는 글이다.
|
|
40
|
-
5. **반론을 먼저 다룬다.** 제안서, RFC는 읽는 사람이 떠올릴 반대 의견(비용, 리스크, 대안)을 작성자가 먼저 꺼내 답한다.
|
|
41
|
+
5. **반론을 먼저 다룬다.** 제안서, RFC는 읽는 사람이 떠올릴 반대 의견(비용, 리스크, 대안)을 작성자가 먼저 꺼내 답한다. 리스크는 대응과 함께 적는다 — 대응을 적을 수 없는 리스크는 뺀다. 대응 없는 나열은 문제 제기로 읽혀 신뢰를 깎는다.
|
|
41
42
|
6. **사실은 단정, 해석, 추정, 권고는 제안.** 측정된 수치는 또렷하게 단정한다. 원인 추정이나 다음 행동 권고는 "~로 보입니다 / ~하면 어떨까요?"처럼 부드럽게 연다. 추정을 단정으로 포장하지 않는 게 오히려 정직하고 설득력 있다. (voice.md 2절)
|
|
42
43
|
7. **독자에 맞춰 말투 전환.** 경영진과 타팀은 격식체, 팀 내부는 해요체. `audience`에 따라 voice.md 1절의 매트릭스를 따른다.
|
|
43
44
|
8. **한국어로 직접 사고.** 번역체 금지. style-guide.md의 한국어 문장 규칙을 따른다. 가운뎃점(·) 나열은 절제하고 쉼표나 "A랑 B하고 C"로 푼다 (표·용어 목록은 예외).
|
|
45
|
+
9. **절 제목은 명사구로.** 서술형 제목("매출이 급증했다")은 논평처럼 읽히고 문서를 갱신할 때 낡는다. 제목은 주제를 가리키고 주장은 본문이 맡는다 — 표 항목 라벨과 자유 서술 절 제목 모두 해당한다. 발표 슬라이드 제목(주장·결론형이 맞는 자리, style-guide.md 참조)과는 반대 방향이니 섞지 않는다.
|
|
46
|
+
10. **보고서 문체는 별도 패스로 다룬다.** 진행현황, 성과 분석, 제안서, 의사결정 메모는 초안 뒤 `report-register.md`로 의미역, 상태 표기, 절 프레이밍을 검토한다. 이 단계는 구조를 다룰 수 있지만 뒤이은 humanize는 표현만 다듬는다.
|
|
44
47
|
|
|
45
48
|
## 평가 관점 (문서 리뷰 시)
|
|
46
49
|
|
|
@@ -81,13 +81,13 @@
|
|
|
81
81
|
정량(지표 개선 예측) + 정성. 보수적으로 추정하고 가정을 명시.
|
|
82
82
|
|
|
83
83
|
## 비용과 리스크
|
|
84
|
-
드는 것과 위험. 숨기지 않을수록 신뢰가 생긴다.
|
|
84
|
+
드는 것과 위험. 숨기지 않을수록 신뢰가 생긴다. 리스크마다 대응을 함께 적고, 대응을 적을 수 없으면 그 리스크는 뺀다.
|
|
85
85
|
|
|
86
86
|
## 대안 비교
|
|
87
87
|
검토한 다른 선택지와 왜 이 안인가. (안 함 / 부분 적용 포함)
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
-
원칙: 반론을 먼저 다룬다. 의사결정권자가 떠올릴 "근데 비용이…", "그냥 안 하면?"을 작성자가 먼저 꺼내 답한다.
|
|
90
|
+
원칙: 반론을 먼저 다룬다. 의사결정권자가 떠올릴 "근데 비용이…", "그냥 안 하면?"을 작성자가 먼저 꺼내 답한다. 대응 없는 리스크 나열은 문제 제기로 읽히니 적지 않는다.
|
|
91
91
|
|
|
92
92
|
---
|
|
93
93
|
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Report Register — 보고서용 한국어 문체
|
|
2
|
+
|
|
3
|
+
진행현황, 성과 분석, 제안서, 의사결정 메모처럼 읽는 사람이 근거를 대조하고
|
|
4
|
+
결정을 내려야 하는 문서에만 적용한다. PR, 슬랙, 지라, 리뷰 코멘트에는 적용하지
|
|
5
|
+
않는다. 그 자리에서 보고서식 치환을 쓰면 작성자 어투가 불필요하게 딱딱해진다.
|
|
6
|
+
|
|
7
|
+
원칙은 간단하다. **글자 수가 아니라 해석의 폭을 줄인다.** 낯선 한자어나
|
|
8
|
+
외래어를 늘리는 것이 목적이 아니다. 책임, 시점, 대상의 구분이 더 또렷해질 때만
|
|
9
|
+
구체적인 말을 고른다.
|
|
10
|
+
|
|
11
|
+
## 1. 적용 범위와 어미
|
|
12
|
+
|
|
13
|
+
- 보고 본문은 평서체 `~한다/~이다`를 기본으로 한다.
|
|
14
|
+
- 송부 메일, 협의 요청, 대외 안내는 합니다체로 별도 작성한다.
|
|
15
|
+
- 문서 안에서 두 어미를 섞지 않는다. 인용문, 코드, 고유한 고객 문구는 예외다.
|
|
16
|
+
- `됐다/했다`처럼 구어로 줄어든 과거형은 본문에서 `되었다/하였다`로 정리한다.
|
|
17
|
+
인용문과 코드 블록은 바꾸지 않는다.
|
|
18
|
+
|
|
19
|
+
이 기본값은 독자별 voice보다 우선하지 않는다. 경영진이나 타팀에 보내는 본문을
|
|
20
|
+
합니다체로 쓰기로 한 경우에는 그 선택을 문서 전체에 일관되게 적용한다. 이때도
|
|
21
|
+
송부 메시지와 보고 본문은 섞지 않는다.
|
|
22
|
+
|
|
23
|
+
## 2. 의미역을 좁히는 치환
|
|
24
|
+
|
|
25
|
+
아래 표는 기계적 치환표가 아니다. 왼쪽 동사에 서로 다른 목적어를 넣어도 모두
|
|
26
|
+
자연스러우면, 목적어가 가리키는 관계에 맞는 오른쪽 동사를 고른다.
|
|
27
|
+
|
|
28
|
+
| 넓은 표현 | 문맥별 선택 | 구분 기준 |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| 다룬다 | 한정한다, 규정한다, 정의한다 | 범위, 규칙, 개념 |
|
|
31
|
+
| 맞춘다 | 정합한다, 정렬한다, 보정한다 | 논리, 위치, 값 |
|
|
32
|
+
| 바꾼다 | 변환한다, 대체한다, 개정한다 | 형식, 대상, 문서 |
|
|
33
|
+
| 넘긴다 | 전달한다, 이관한다, 위임한다 | 데이터, 업무, 권한 |
|
|
34
|
+
| 적는다 | 명시한다, 기재한다, 기록한다 | 규정, 항목, 이력 |
|
|
35
|
+
| 나온다 | 도출된다, 산출된다, 확정된다 | 결과, 계산, 승인 |
|
|
36
|
+
| 넣는다 | 포함한다, 등재한다, 삽입한다 | 범위, 목록, 위치 |
|
|
37
|
+
| 고친다 | 수정한다, 보완한다, 개정한다 | 오류, 미비, 문서 |
|
|
38
|
+
| 잡는다 | 검출한다, 산정한다, 고정한다 | 이상, 수치, 값 |
|
|
39
|
+
| 늘어난다 | 향상된다, 증가한다, 연장된다 | 품질, 수량, 기간 |
|
|
40
|
+
| 막는다 | 차단한다, 방지한다 | 경로, 사태 |
|
|
41
|
+
| 생긴다 | 발생한다, 형성된다 | 사건, 구조 |
|
|
42
|
+
|
|
43
|
+
정밀도가 늘지 않으면 바꾸지 않는다. 예를 들어 팀이 실제로 쓰는 용어나 코드의
|
|
44
|
+
식별자를 더 격식 있게 보이게 하려고 바꾸지 않는다.
|
|
45
|
+
|
|
46
|
+
## 3. 서술은 용어와 분리한다
|
|
47
|
+
|
|
48
|
+
도메인 용어는 그대로 두고 그 용어를 설명하는 동사와 상태만 고친다. 물리 은유와
|
|
49
|
+
의인화는 사실 상태로 환원한다.
|
|
50
|
+
|
|
51
|
+
| 피할 서술 | 보고서 서술 |
|
|
52
|
+
|---|---|
|
|
53
|
+
| 큐가 밀린다 | 큐에 적체가 발생한다 |
|
|
54
|
+
| 값이 튄다 | 값에 이상치가 발생한다 |
|
|
55
|
+
| 템플릿이 죽었다 | 템플릿이 비활성 상태다 |
|
|
56
|
+
| 로그가 쌓인다 | 로그가 누적된다 |
|
|
57
|
+
| 문서가 다룬다 | 문서는 범위를 한정한다, 용어를 정의한다 |
|
|
58
|
+
|
|
59
|
+
API, enum, 필드명, 제품명, 조직 내부에서 굳어진 개념어는 원문 표기를 보존한다.
|
|
60
|
+
영문 표기를 한글 음차나 반대 방향으로 일괄 변환하지 않는다.
|
|
61
|
+
|
|
62
|
+
## 4. 보고서 프레이밍
|
|
63
|
+
|
|
64
|
+
문장만 윤문하기 전에 절 단위로 아래를 확인한다.
|
|
65
|
+
|
|
66
|
+
1. **제목은 주제를 가리킨다.** 자유 서술 절과 표 항목은 명사구로 적고 주장은 본문에 둔다.
|
|
67
|
+
2. **결과를 먼저 둔다.** 각 항목은 확인된 수치나 현재 상태를 먼저 제시하고 배경과 원인은 뒤에 둔다.
|
|
68
|
+
3. **결함을 숨기지 않고 개선 경로를 드러낸다.** "무엇이 안 됐나"만 나열하지 말고
|
|
69
|
+
어떤 기준이나 경로를 정비할지 함께 적는다.
|
|
70
|
+
4. **리스크에는 대응을 붙인다.** 대응이 없는 리스크는 경고가 아니라 불확실성으로 분류하고
|
|
71
|
+
외부 문서에서는 별도 확인이 필요하다고 표시한다.
|
|
72
|
+
5. **요청 전에 판단을 낸다.** 상대에게 결정을 넘기기 전에 우리 안, 산정 근거, 조정 가능한
|
|
73
|
+
범위를 먼저 제시한다.
|
|
74
|
+
6. **문서 사용법을 본문에서 빼낸다.** 첫 문단은 이 문서를 왜 만들었는지가 아니라,
|
|
75
|
+
독자가 알아야 할 현재 상태와 결정 사항으로 시작한다.
|
|
76
|
+
|
|
77
|
+
## 5. 수치와 상태
|
|
78
|
+
|
|
79
|
+
측정값, 구현 상태, 아직 확인하지 못한 값을 같은 무게로 적지 않는다. 주장 바로 옆에
|
|
80
|
+
상태를 붙인다.
|
|
81
|
+
|
|
82
|
+
| 상태 | 사용할 때 |
|
|
83
|
+
|---|---|
|
|
84
|
+
| 측정됨 | 실제 관측 또는 집계가 끝난 값 |
|
|
85
|
+
| 구현됨 | 수단은 존재하지만 해당 조건에서 검증하지 않은 상태 |
|
|
86
|
+
| 미측정 | 아직 값을 확인하지 않은 상태 |
|
|
87
|
+
|
|
88
|
+
조직의 용어가 있으면 그 용어를 쓴다. 상태 표기는 수치에 근거가 없다는 사실을
|
|
89
|
+
가리는 장식이 아니라, 다음 검증 대상을 드러내는 정보다.
|
|
90
|
+
|
|
91
|
+
## 6. 작업 순서
|
|
92
|
+
|
|
93
|
+
1. 초안에서 사실, 수치, 근거, 요청을 확정한다.
|
|
94
|
+
2. 이 레퍼런스로 의미역, 상태, 절 프레이밍을 검토한다.
|
|
95
|
+
3. `humanize-monolith`으로 번역투와 AI-tell만 제거한다. 이 단계에서 절 순서와 정보는 바꾸지 않는다.
|
|
96
|
+
4. 파일 기반 윤문이면 `gestalt humanize-check --register report`로 어미 혼용과 기존 S1 규칙을 확인한다.
|
|
@@ -19,6 +19,7 @@ AI-tell 패턴 윤문은 `humanize-monolith` 에이전트가 담당한다. 전
|
|
|
19
19
|
3. **Completeness** — 전제조건, 에러 케이스, 엣지 케이스가 있는가?
|
|
20
20
|
4. **Consistency** — 용어, 어미, 톤이 전체적으로 일관되는가?
|
|
21
21
|
5. **Code Examples** — 실행 가능하고 맥락이 설명됐는가?
|
|
22
|
+
6. **Structural Integrity** — 문서를 수정했다면 목차, 앵커 링크, 상호참조가 지우거나 바꾼 섹션을 여전히 가리키는지 확인했는가?
|
|
22
23
|
|
|
23
24
|
## 단독 사용 vs humanize-monolith와 함께
|
|
24
25
|
|
|
@@ -91,12 +91,20 @@ outputs:
|
|
|
91
91
|
|
|
92
92
|
`audience`에 따라 register를 전환합니다 — `exec`(경영진)·`cross-team`(타팀)은 격식체로 결론과 요청을 앞세우고 전문 용어를 풀어 쓰고 `internal`(팀 내부)은 해요체로 솔직하게 씁니다. 어느 쪽이든 사실, 수치는 단정하고 해석, 추정, 권고는 제안형으로 엽니다. `audience`가 불명확하면 cross-team 격식체를 기본으로 잡습니다.
|
|
93
93
|
|
|
94
|
-
### 5단계 —
|
|
94
|
+
### 5단계 — 보고서 문체와 프레이밍
|
|
95
|
+
|
|
96
|
+
`report`, `proposal`, `decision memo`처럼 기록성과 해석 정밀도가 필요한 산출물은 `role-agents/impact-writer/references/report-register.md`를 먼저 적용합니다. 광의 동사는 목적어 기준으로 구체화하고 수치에는 측정 상태를 붙이고 각 절은 결과와 대응 경로를 먼저 보이게 다듬습니다.
|
|
97
|
+
|
|
98
|
+
이 단계에서만 절 제목, 수치 상태, 정보 배치를 고칩니다. PR, 슬랙, 지라, 리뷰 코멘트에는 적용하지 않습니다.
|
|
99
|
+
|
|
100
|
+
### 6단계 — 윤문 (humanize)
|
|
95
101
|
|
|
96
102
|
초안 완성 후 `ges_agent { action: "get", name: "humanize-monolith" }`로 S1 규칙을 적용해 번역투와 AI-tell을 제거합니다. 성과, 설득 문서는 한국어 자연스러움이 설득력에 직결됩니다.
|
|
97
103
|
|
|
98
104
|
윤문 시 voice.md 4절의 구분을 humanize에 함께 전달합니다 — 팀 내부 문서의 해석, 권고 제안형("~하면 어떨까요?")은 보존하고 사실, 수치를 흐리는 헤징만 단정으로 교정합니다. humanize가 voice를 일괄로 평탄화하지 않게 합니다.
|
|
99
105
|
|
|
106
|
+
파일 기반 윤문이면 `gestalt humanize-check --before before.md --after after.md --register report`를 실행합니다. 이 검사는 기존 S1 패턴과 보고 본문의 평서체/합니다체 혼용을 함께 확인합니다.
|
|
107
|
+
|
|
100
108
|
## 테스트 시나리오
|
|
101
109
|
|
|
102
110
|
**정상 흐름**: `/brief report` + 지표 표 입력 → 유형 report 확정 → 전경 메시지 도출 → 핵심 지표 표 + 잘된 것/아쉬운 것 + 다음 포커스 작성 → humanize → publish-ready 리포트 반환.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"humanize-check.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-check.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAWD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"humanize-check.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-check.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAWD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAoBxE"}
|
|
@@ -10,7 +10,7 @@ function read(label, path) {
|
|
|
10
10
|
return readFileSync(full, 'utf-8');
|
|
11
11
|
}
|
|
12
12
|
export function humanizeCheckCommand(options) {
|
|
13
|
-
const register = options.register === 'chat' ? 'chat' : 'doc';
|
|
13
|
+
const register = options.register === 'chat' ? 'chat' : options.register === 'report' ? 'report' : 'doc';
|
|
14
14
|
const before = read('원문', options.before);
|
|
15
15
|
const after = read('윤문본', options.after);
|
|
16
16
|
if (before.trim().length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"humanize-check.js","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAU5E,SAAS,IAAI,CAAC,KAAa,EAAE,IAAY;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA6B;IAChE,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"humanize-check.js","sourceRoot":"","sources":["../../../../src/cli/commands/humanize-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAU5E,SAAS,IAAI,CAAC,KAAa,EAAE,IAAY;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA6B;IAChE,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -79,7 +79,7 @@ export function createCli() {
|
|
|
79
79
|
.description('Judge a humanized draft against the rulebook (exit 0 pass / 1 warn / 2 abort)')
|
|
80
80
|
.requiredOption('--before <path>', 'Original text file')
|
|
81
81
|
.requiredOption('--after <path>', 'Humanized text file')
|
|
82
|
-
.option('--register <doc|chat>', 'Register to judge against (default: doc)', 'doc')
|
|
82
|
+
.option('--register <doc|chat|report>', 'Register to judge against (default: doc)', 'doc')
|
|
83
83
|
.option('--json', 'Emit the full report as JSON')
|
|
84
84
|
.action((options) => {
|
|
85
85
|
humanizeCheckCommand(options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ export declare const THRESHOLD: {
|
|
|
7
7
|
readonly sentenceDrop: 0.25;
|
|
8
8
|
};
|
|
9
9
|
export interface AxisResult {
|
|
10
|
-
axis: 'change-rate' | 'residual-s1' | 'preservation' | 'structure';
|
|
10
|
+
axis: 'change-rate' | 'residual-s1' | 'preservation' | 'structure' | 'report-register';
|
|
11
11
|
verdict: Verdict;
|
|
12
12
|
detail: string;
|
|
13
13
|
evidence?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/humanize/check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/humanize/check.ts"],"names":[],"mappings":"AAcA,OAAO,EAAmC,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3F,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,EAAE,MAAM,CAKzD,CAAC;AAEF,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,WAAW,GAAG,iBAAiB,CAAC;IACvF,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChE,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjE;AA0ID,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAoB,GAC5B,WAAW,CA2Bb;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAaxD"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* 그래서 변경률, 잔존, 보존, 구조 4가지 측면에서 각각 측정하고, 판단한다.
|
|
7
7
|
*/
|
|
8
8
|
import { changeRate } from './change-rate.js';
|
|
9
|
-
import { countByRule, missingProtectedTokens, structureStats } from './detectors.js';
|
|
9
|
+
import { countByRule, missingProtectedTokens, reportRegisterStats, structureStats, } from './detectors.js';
|
|
10
10
|
import { parseRuleBook, ruleLabel, s1Ids } from './rules.js';
|
|
11
11
|
export const EXIT_CODE = {
|
|
12
12
|
pass: 0,
|
|
@@ -112,6 +112,22 @@ function checkStructure(book, before, after, introduced) {
|
|
|
112
112
|
evidence: problems,
|
|
113
113
|
};
|
|
114
114
|
}
|
|
115
|
+
function checkReportRegister(after) {
|
|
116
|
+
const { plainEndings, formalEndings } = reportRegisterStats(after);
|
|
117
|
+
if (plainEndings > 0 && formalEndings > 0) {
|
|
118
|
+
return {
|
|
119
|
+
axis: 'report-register',
|
|
120
|
+
verdict: 'warn',
|
|
121
|
+
detail: '보고 본문에 평서체와 합니다체가 함께 있음',
|
|
122
|
+
evidence: [`평서체 ${plainEndings}문장 / 합니다체 ${formalEndings}문장`],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
axis: 'report-register',
|
|
127
|
+
verdict: 'pass',
|
|
128
|
+
detail: '보고 본문 어미 일관',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
115
131
|
export function runCheck(before, after, options = {}) {
|
|
116
132
|
const register = options.register ?? 'doc';
|
|
117
133
|
const book = options.book ?? parseRuleBook();
|
|
@@ -122,7 +138,8 @@ export function runCheck(before, after, options = {}) {
|
|
|
122
138
|
const preservationAxis = checkPreservation(before, after);
|
|
123
139
|
const introduced = findIntroduced(before, after);
|
|
124
140
|
const structureAxis = checkStructure(book, before, after, introduced);
|
|
125
|
-
const
|
|
141
|
+
const reportAxis = register === 'report' ? [checkReportRegister(after)] : [];
|
|
142
|
+
const axes = [changeAxis, s1Axis, preservationAxis, structureAxis, ...reportAxis];
|
|
126
143
|
const verdict = worst(axes.map((a) => a.verdict));
|
|
127
144
|
return {
|
|
128
145
|
register,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/humanize/check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/humanize/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,15 @@ export declare function splitSentences(text: string): string[];
|
|
|
14
14
|
export declare const DETECTABLE_RULE_IDS: string[];
|
|
15
15
|
export declare function detect(text: string, ruleIds?: readonly string[]): Detection[];
|
|
16
16
|
export declare function countByRule(text: string, ruleIds?: readonly string[]): Map<string, number>;
|
|
17
|
+
export interface ReportRegisterStats {
|
|
18
|
+
plainEndings: number;
|
|
19
|
+
formalEndings: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 보고 본문에서 평서체와 합니다체가 섞였는지만 보수적으로 센다.
|
|
23
|
+
* 인용문, 코드, 표는 작성자 말투가 아니므로 proseOnly에서 제외한다.
|
|
24
|
+
*/
|
|
25
|
+
export declare function reportRegisterStats(text: string): ReportRegisterStats;
|
|
17
26
|
/** 원문에서 한 글자도 바뀌면 안 되는 토큰을 뽑는다 */
|
|
18
27
|
export declare function protectedTokens(text: string): string[];
|
|
19
28
|
export declare function missingProtectedTokens(before: string, after: string): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../../src/humanize/detectors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"detectors.d.ts","sourceRoot":"","sources":["../../../src/humanize/detectors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiDD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrD;AA4CD,eAAO,MAAM,mBAAmB,EAAE,MAAM,EAAmC,CAAC;AAE5E,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE,CAgB7E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE1F;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAcrE;AAcD,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAStD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9E;AAID,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAS3D"}
|
|
@@ -12,7 +12,10 @@ function proseOnly(text) {
|
|
|
12
12
|
.replace(/```[\s\S]*?```/g, '\n')
|
|
13
13
|
.replace(/`[^`\n]+`/g, ' ')
|
|
14
14
|
.split('\n')
|
|
15
|
-
.filter((line) =>
|
|
15
|
+
.filter((line) => {
|
|
16
|
+
const trimmed = line.trimStart();
|
|
17
|
+
return !trimmed.startsWith('|') && !trimmed.startsWith('>');
|
|
18
|
+
})
|
|
16
19
|
.join('\n');
|
|
17
20
|
}
|
|
18
21
|
function matcher(ruleId, re, onProse = true) {
|
|
@@ -96,6 +99,24 @@ export function detect(text, ruleIds) {
|
|
|
96
99
|
export function countByRule(text, ruleIds) {
|
|
97
100
|
return new Map(detect(text, ruleIds).map((d) => [d.ruleId, d.count]));
|
|
98
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* 보고 본문에서 평서체와 합니다체가 섞였는지만 보수적으로 센다.
|
|
104
|
+
* 인용문, 코드, 표는 작성자 말투가 아니므로 proseOnly에서 제외한다.
|
|
105
|
+
*/
|
|
106
|
+
export function reportRegisterStats(text) {
|
|
107
|
+
let plainEndings = 0;
|
|
108
|
+
let formalEndings = 0;
|
|
109
|
+
for (const sentence of splitSentences(proseOnly(text))) {
|
|
110
|
+
const trimmed = sentence.trim();
|
|
111
|
+
if (/[가-힣]니다[.!?…]?$/.test(trimmed)) {
|
|
112
|
+
formalEndings += 1;
|
|
113
|
+
}
|
|
114
|
+
else if (/[가-힣]다[.!?…]?$/.test(trimmed)) {
|
|
115
|
+
plainEndings += 1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { plainEndings, formalEndings };
|
|
119
|
+
}
|
|
99
120
|
// --- 보존해야 하는 토큰 ---------------------------------------------------
|
|
100
121
|
const PROTECTED_PATTERNS = [
|
|
101
122
|
/```[\s\S]*?```/g,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../../src/humanize/detectors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB,0CAA0C;AAC1C,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;SAChC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC;SAC1B,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../../src/humanize/detectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { parseRuleBook, ruleLabel, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, type Register, type Rule, type RuleBook, type Severity, } from './rules.js';
|
|
2
|
-
export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, DETECTABLE_RULE_IDS, type Detection, type StructureStats, } from './detectors.js';
|
|
2
|
+
export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, reportRegisterStats, DETECTABLE_RULE_IDS, type Detection, type ReportRegisterStats, 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';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,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,5 +1,5 @@
|
|
|
1
1
|
export { parseRuleBook, ruleLabel, s1Ids, citedRuleIds, expandIdRanges, QUICK_RULES_PATH, } from './rules.js';
|
|
2
|
-
export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, DETECTABLE_RULE_IDS, } from './detectors.js';
|
|
2
|
+
export { detect, countByRule, protectedTokens, missingProtectedTokens, structureStats, splitSentences, reportRegisterStats, 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';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,EACnB,mBAAmB,GAIpB,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,6 +1,6 @@
|
|
|
1
1
|
export type Severity = 'S1' | 'S2' | 'S3';
|
|
2
|
-
/**
|
|
3
|
-
export type Register = 'doc' | 'chat';
|
|
2
|
+
/** 산문, 대화·리뷰, 보고서 기준을 나눠 본다 */
|
|
3
|
+
export type Register = 'doc' | 'chat' | 'report';
|
|
4
4
|
export interface Rule {
|
|
5
5
|
id: string;
|
|
6
6
|
category: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/humanize/rules.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/humanize/rules.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,+BAA+B;AAC/B,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iCAAiC;IACjC,YAAY,EAAE,QAAQ,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,yBAAyB;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,eAAO,MAAM,gBAAgB,QAG5B,CAAC;AAeF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBrD;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAyB,GAAG,QAAQ,CA6CvE;AAgCD,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,0BAA0B;AAC1B,wBAAgB,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAKlE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gestalt",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.58.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"
|
|
@@ -186,6 +186,19 @@ OO님 이거 타겟 브랜치를 변경해주셔야 할 것 같아요!
|
|
|
186
186
|
무언가가 그 방향으로 가는 것이다. "맞는 방향 같아요", "그렇게 결론 냈어요"처럼 사람이나
|
|
187
187
|
대상을 주어로 되돌린다 (ai-tell D-5 의인화 추상 주어의 사촌).
|
|
188
188
|
|
|
189
|
+
**추상명사에 측량 동사를 붙이지 말 것.** "근거를 재봤는데", "의견을 달아봤는데"처럼 재다나
|
|
190
|
+
달다처럼 물리적으로 계측하는 동사를 근거, 의견, 판단 같은 추상명사에 붙이면 붕 뜬다. 실제로
|
|
191
|
+
저울에 올린 게 아니라 검토하거나 확인한 것이다. "근거를 확인해봤는데", "의견을 검토해봤는데"처럼
|
|
192
|
+
사람이 하는 행위 동사로 되돌린다 (ai-tell F-7 물리 동사 도피의 사촌). 정규식 탐지기는 "재다"의
|
|
193
|
+
멀쩡한 물리적 용법("온도를 재봤는데")까지 걸릴까 봐 이 패턴을 일부러 빼뒀다 — 목적어가
|
|
194
|
+
추상명사인지 보고 사람이 판단한다.
|
|
195
|
+
|
|
196
|
+
**얽힌 것에는 풀다, 막힌 것에는 해소하다.** "오해를 풀다", "갈등을 풀다"처럼 얽혀 있는
|
|
197
|
+
대상에는 풀다가 맞는다. 그런데 "진입을 막고 있던 두 가지를 풉니다"처럼 막혀 있는 대상(문제,
|
|
198
|
+
이슈, 장벽)에는 풀다가 안 맞는다 — 얽힌 게 아니라 막힌 거라서다. "두 가지 문제를 해소합니다",
|
|
199
|
+
"막고 있던 이슈를 해결합니다"처럼 막힘에는 해소하다나 해결하다를 쓴다. 판정법 — 대상이 실
|
|
200
|
+
뭉치처럼 얽혀 있는지, 벽처럼 막고 있는지 먼저 본다.
|
|
201
|
+
|
|
189
202
|
---
|
|
190
203
|
|
|
191
204
|
## 리뷰 코멘트를 "지적"이라고 부르지 않는다
|
|
@@ -14,6 +14,7 @@ You are the Impact Writer role agent.
|
|
|
14
14
|
어투, 문체 기준: `references/voice.md` — 독자별 말투(격식체/해요체)와 작성자 voice 적용 기준. **작성 전 반드시 확인한다.**
|
|
15
15
|
세부 문서 유형별 구조: `references/doc-playbooks.md`
|
|
16
16
|
한국어 문장, 용어 규칙: `../_shared/references/style-guide.md` (공유)
|
|
17
|
+
보고서 전용 문체와 프레이밍: `references/report-register.md` — 진행현황, 성과 분석, 제안서, 의사결정 메모처럼 기록성과 정밀도가 필요한 문서에만 적용한다.
|
|
17
18
|
전면 윤문은 `humanize-monolith`가 담당한다 (아래 humanize 처리 참조).
|
|
18
19
|
|
|
19
20
|
## 다른 라이터와의 경계
|
|
@@ -37,10 +38,12 @@ You are the Impact Writer role agent.
|
|
|
37
38
|
2. **숫자는 맥락과 함께.** "전환율 98%"가 아니라 "목표 90% 대비 98%, 8%p 초과 달성". 단독 수치는 정보가 아니라 노이즈다. 기준값, 전기 대비, 목표 대비 중 하나는 반드시 붙인다.
|
|
38
39
|
3. **주장에는 근거, 근거에는 출처.** 데이터의 기간, 정의, 출처를 명시한다. 추정이면 추정이라고 적고 단정하지 않는다.
|
|
39
40
|
4. **so-what을 끝까지 민다.** "지표가 올랐다"에서 멈추지 않고 "그래서 무엇을 해야 하는가"까지 적는다. 성과 문서는 보고가 아니라 다음 행동을 부르는 글이다.
|
|
40
|
-
5. **반론을 먼저 다룬다.** 제안서, RFC는 읽는 사람이 떠올릴 반대 의견(비용, 리스크, 대안)을 작성자가 먼저 꺼내 답한다.
|
|
41
|
+
5. **반론을 먼저 다룬다.** 제안서, RFC는 읽는 사람이 떠올릴 반대 의견(비용, 리스크, 대안)을 작성자가 먼저 꺼내 답한다. 리스크는 대응과 함께 적는다 — 대응을 적을 수 없는 리스크는 뺀다. 대응 없는 나열은 문제 제기로 읽혀 신뢰를 깎는다.
|
|
41
42
|
6. **사실은 단정, 해석, 추정, 권고는 제안.** 측정된 수치는 또렷하게 단정한다. 원인 추정이나 다음 행동 권고는 "~로 보입니다 / ~하면 어떨까요?"처럼 부드럽게 연다. 추정을 단정으로 포장하지 않는 게 오히려 정직하고 설득력 있다. (voice.md 2절)
|
|
42
43
|
7. **독자에 맞춰 말투 전환.** 경영진과 타팀은 격식체, 팀 내부는 해요체. `audience`에 따라 voice.md 1절의 매트릭스를 따른다.
|
|
43
44
|
8. **한국어로 직접 사고.** 번역체 금지. style-guide.md의 한국어 문장 규칙을 따른다. 가운뎃점(·) 나열은 절제하고 쉼표나 "A랑 B하고 C"로 푼다 (표·용어 목록은 예외).
|
|
45
|
+
9. **절 제목은 명사구로.** 서술형 제목("매출이 급증했다")은 논평처럼 읽히고 문서를 갱신할 때 낡는다. 제목은 주제를 가리키고 주장은 본문이 맡는다 — 표 항목 라벨과 자유 서술 절 제목 모두 해당한다. 발표 슬라이드 제목(주장·결론형이 맞는 자리, style-guide.md 참조)과는 반대 방향이니 섞지 않는다.
|
|
46
|
+
10. **보고서 문체는 별도 패스로 다룬다.** 진행현황, 성과 분석, 제안서, 의사결정 메모는 초안 뒤 `report-register.md`로 의미역, 상태 표기, 절 프레이밍을 검토한다. 이 단계는 구조를 다룰 수 있지만 뒤이은 humanize는 표현만 다듬는다.
|
|
44
47
|
|
|
45
48
|
## 평가 관점 (문서 리뷰 시)
|
|
46
49
|
|
|
@@ -81,13 +81,13 @@
|
|
|
81
81
|
정량(지표 개선 예측) + 정성. 보수적으로 추정하고 가정을 명시.
|
|
82
82
|
|
|
83
83
|
## 비용과 리스크
|
|
84
|
-
드는 것과 위험. 숨기지 않을수록 신뢰가 생긴다.
|
|
84
|
+
드는 것과 위험. 숨기지 않을수록 신뢰가 생긴다. 리스크마다 대응을 함께 적고, 대응을 적을 수 없으면 그 리스크는 뺀다.
|
|
85
85
|
|
|
86
86
|
## 대안 비교
|
|
87
87
|
검토한 다른 선택지와 왜 이 안인가. (안 함 / 부분 적용 포함)
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
-
원칙: 반론을 먼저 다룬다. 의사결정권자가 떠올릴 "근데 비용이…", "그냥 안 하면?"을 작성자가 먼저 꺼내 답한다.
|
|
90
|
+
원칙: 반론을 먼저 다룬다. 의사결정권자가 떠올릴 "근데 비용이…", "그냥 안 하면?"을 작성자가 먼저 꺼내 답한다. 대응 없는 리스크 나열은 문제 제기로 읽히니 적지 않는다.
|
|
91
91
|
|
|
92
92
|
---
|
|
93
93
|
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Report Register — 보고서용 한국어 문체
|
|
2
|
+
|
|
3
|
+
진행현황, 성과 분석, 제안서, 의사결정 메모처럼 읽는 사람이 근거를 대조하고
|
|
4
|
+
결정을 내려야 하는 문서에만 적용한다. PR, 슬랙, 지라, 리뷰 코멘트에는 적용하지
|
|
5
|
+
않는다. 그 자리에서 보고서식 치환을 쓰면 작성자 어투가 불필요하게 딱딱해진다.
|
|
6
|
+
|
|
7
|
+
원칙은 간단하다. **글자 수가 아니라 해석의 폭을 줄인다.** 낯선 한자어나
|
|
8
|
+
외래어를 늘리는 것이 목적이 아니다. 책임, 시점, 대상의 구분이 더 또렷해질 때만
|
|
9
|
+
구체적인 말을 고른다.
|
|
10
|
+
|
|
11
|
+
## 1. 적용 범위와 어미
|
|
12
|
+
|
|
13
|
+
- 보고 본문은 평서체 `~한다/~이다`를 기본으로 한다.
|
|
14
|
+
- 송부 메일, 협의 요청, 대외 안내는 합니다체로 별도 작성한다.
|
|
15
|
+
- 문서 안에서 두 어미를 섞지 않는다. 인용문, 코드, 고유한 고객 문구는 예외다.
|
|
16
|
+
- `됐다/했다`처럼 구어로 줄어든 과거형은 본문에서 `되었다/하였다`로 정리한다.
|
|
17
|
+
인용문과 코드 블록은 바꾸지 않는다.
|
|
18
|
+
|
|
19
|
+
이 기본값은 독자별 voice보다 우선하지 않는다. 경영진이나 타팀에 보내는 본문을
|
|
20
|
+
합니다체로 쓰기로 한 경우에는 그 선택을 문서 전체에 일관되게 적용한다. 이때도
|
|
21
|
+
송부 메시지와 보고 본문은 섞지 않는다.
|
|
22
|
+
|
|
23
|
+
## 2. 의미역을 좁히는 치환
|
|
24
|
+
|
|
25
|
+
아래 표는 기계적 치환표가 아니다. 왼쪽 동사에 서로 다른 목적어를 넣어도 모두
|
|
26
|
+
자연스러우면, 목적어가 가리키는 관계에 맞는 오른쪽 동사를 고른다.
|
|
27
|
+
|
|
28
|
+
| 넓은 표현 | 문맥별 선택 | 구분 기준 |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| 다룬다 | 한정한다, 규정한다, 정의한다 | 범위, 규칙, 개념 |
|
|
31
|
+
| 맞춘다 | 정합한다, 정렬한다, 보정한다 | 논리, 위치, 값 |
|
|
32
|
+
| 바꾼다 | 변환한다, 대체한다, 개정한다 | 형식, 대상, 문서 |
|
|
33
|
+
| 넘긴다 | 전달한다, 이관한다, 위임한다 | 데이터, 업무, 권한 |
|
|
34
|
+
| 적는다 | 명시한다, 기재한다, 기록한다 | 규정, 항목, 이력 |
|
|
35
|
+
| 나온다 | 도출된다, 산출된다, 확정된다 | 결과, 계산, 승인 |
|
|
36
|
+
| 넣는다 | 포함한다, 등재한다, 삽입한다 | 범위, 목록, 위치 |
|
|
37
|
+
| 고친다 | 수정한다, 보완한다, 개정한다 | 오류, 미비, 문서 |
|
|
38
|
+
| 잡는다 | 검출한다, 산정한다, 고정한다 | 이상, 수치, 값 |
|
|
39
|
+
| 늘어난다 | 향상된다, 증가한다, 연장된다 | 품질, 수량, 기간 |
|
|
40
|
+
| 막는다 | 차단한다, 방지한다 | 경로, 사태 |
|
|
41
|
+
| 생긴다 | 발생한다, 형성된다 | 사건, 구조 |
|
|
42
|
+
|
|
43
|
+
정밀도가 늘지 않으면 바꾸지 않는다. 예를 들어 팀이 실제로 쓰는 용어나 코드의
|
|
44
|
+
식별자를 더 격식 있게 보이게 하려고 바꾸지 않는다.
|
|
45
|
+
|
|
46
|
+
## 3. 서술은 용어와 분리한다
|
|
47
|
+
|
|
48
|
+
도메인 용어는 그대로 두고 그 용어를 설명하는 동사와 상태만 고친다. 물리 은유와
|
|
49
|
+
의인화는 사실 상태로 환원한다.
|
|
50
|
+
|
|
51
|
+
| 피할 서술 | 보고서 서술 |
|
|
52
|
+
|---|---|
|
|
53
|
+
| 큐가 밀린다 | 큐에 적체가 발생한다 |
|
|
54
|
+
| 값이 튄다 | 값에 이상치가 발생한다 |
|
|
55
|
+
| 템플릿이 죽었다 | 템플릿이 비활성 상태다 |
|
|
56
|
+
| 로그가 쌓인다 | 로그가 누적된다 |
|
|
57
|
+
| 문서가 다룬다 | 문서는 범위를 한정한다, 용어를 정의한다 |
|
|
58
|
+
|
|
59
|
+
API, enum, 필드명, 제품명, 조직 내부에서 굳어진 개념어는 원문 표기를 보존한다.
|
|
60
|
+
영문 표기를 한글 음차나 반대 방향으로 일괄 변환하지 않는다.
|
|
61
|
+
|
|
62
|
+
## 4. 보고서 프레이밍
|
|
63
|
+
|
|
64
|
+
문장만 윤문하기 전에 절 단위로 아래를 확인한다.
|
|
65
|
+
|
|
66
|
+
1. **제목은 주제를 가리킨다.** 자유 서술 절과 표 항목은 명사구로 적고 주장은 본문에 둔다.
|
|
67
|
+
2. **결과를 먼저 둔다.** 각 항목은 확인된 수치나 현재 상태를 먼저 제시하고 배경과 원인은 뒤에 둔다.
|
|
68
|
+
3. **결함을 숨기지 않고 개선 경로를 드러낸다.** "무엇이 안 됐나"만 나열하지 말고
|
|
69
|
+
어떤 기준이나 경로를 정비할지 함께 적는다.
|
|
70
|
+
4. **리스크에는 대응을 붙인다.** 대응이 없는 리스크는 경고가 아니라 불확실성으로 분류하고
|
|
71
|
+
외부 문서에서는 별도 확인이 필요하다고 표시한다.
|
|
72
|
+
5. **요청 전에 판단을 낸다.** 상대에게 결정을 넘기기 전에 우리 안, 산정 근거, 조정 가능한
|
|
73
|
+
범위를 먼저 제시한다.
|
|
74
|
+
6. **문서 사용법을 본문에서 빼낸다.** 첫 문단은 이 문서를 왜 만들었는지가 아니라,
|
|
75
|
+
독자가 알아야 할 현재 상태와 결정 사항으로 시작한다.
|
|
76
|
+
|
|
77
|
+
## 5. 수치와 상태
|
|
78
|
+
|
|
79
|
+
측정값, 구현 상태, 아직 확인하지 못한 값을 같은 무게로 적지 않는다. 주장 바로 옆에
|
|
80
|
+
상태를 붙인다.
|
|
81
|
+
|
|
82
|
+
| 상태 | 사용할 때 |
|
|
83
|
+
|---|---|
|
|
84
|
+
| 측정됨 | 실제 관측 또는 집계가 끝난 값 |
|
|
85
|
+
| 구현됨 | 수단은 존재하지만 해당 조건에서 검증하지 않은 상태 |
|
|
86
|
+
| 미측정 | 아직 값을 확인하지 않은 상태 |
|
|
87
|
+
|
|
88
|
+
조직의 용어가 있으면 그 용어를 쓴다. 상태 표기는 수치에 근거가 없다는 사실을
|
|
89
|
+
가리는 장식이 아니라, 다음 검증 대상을 드러내는 정보다.
|
|
90
|
+
|
|
91
|
+
## 6. 작업 순서
|
|
92
|
+
|
|
93
|
+
1. 초안에서 사실, 수치, 근거, 요청을 확정한다.
|
|
94
|
+
2. 이 레퍼런스로 의미역, 상태, 절 프레이밍을 검토한다.
|
|
95
|
+
3. `humanize-monolith`으로 번역투와 AI-tell만 제거한다. 이 단계에서 절 순서와 정보는 바꾸지 않는다.
|
|
96
|
+
4. 파일 기반 윤문이면 `gestalt humanize-check --register report`로 어미 혼용과 기존 S1 규칙을 확인한다.
|
|
@@ -19,6 +19,7 @@ AI-tell 패턴 윤문은 `humanize-monolith` 에이전트가 담당한다. 전
|
|
|
19
19
|
3. **Completeness** — 전제조건, 에러 케이스, 엣지 케이스가 있는가?
|
|
20
20
|
4. **Consistency** — 용어, 어미, 톤이 전체적으로 일관되는가?
|
|
21
21
|
5. **Code Examples** — 실행 가능하고 맥락이 설명됐는가?
|
|
22
|
+
6. **Structural Integrity** — 문서를 수정했다면 목차, 앵커 링크, 상호참조가 지우거나 바꾼 섹션을 여전히 가리키는지 확인했는가?
|
|
22
23
|
|
|
23
24
|
## 단독 사용 vs humanize-monolith와 함께
|
|
24
25
|
|
|
@@ -91,12 +91,20 @@ outputs:
|
|
|
91
91
|
|
|
92
92
|
`audience`에 따라 register를 전환합니다 — `exec`(경영진)·`cross-team`(타팀)은 격식체로 결론과 요청을 앞세우고 전문 용어를 풀어 쓰고 `internal`(팀 내부)은 해요체로 솔직하게 씁니다. 어느 쪽이든 사실, 수치는 단정하고 해석, 추정, 권고는 제안형으로 엽니다. `audience`가 불명확하면 cross-team 격식체를 기본으로 잡습니다.
|
|
93
93
|
|
|
94
|
-
### 5단계 —
|
|
94
|
+
### 5단계 — 보고서 문체와 프레이밍
|
|
95
|
+
|
|
96
|
+
`report`, `proposal`, `decision memo`처럼 기록성과 해석 정밀도가 필요한 산출물은 `role-agents/impact-writer/references/report-register.md`를 먼저 적용합니다. 광의 동사는 목적어 기준으로 구체화하고 수치에는 측정 상태를 붙이고 각 절은 결과와 대응 경로를 먼저 보이게 다듬습니다.
|
|
97
|
+
|
|
98
|
+
이 단계에서만 절 제목, 수치 상태, 정보 배치를 고칩니다. PR, 슬랙, 지라, 리뷰 코멘트에는 적용하지 않습니다.
|
|
99
|
+
|
|
100
|
+
### 6단계 — 윤문 (humanize)
|
|
95
101
|
|
|
96
102
|
초안 완성 후 `ges_agent { action: "get", name: "humanize-monolith" }`로 S1 규칙을 적용해 번역투와 AI-tell을 제거합니다. 성과, 설득 문서는 한국어 자연스러움이 설득력에 직결됩니다.
|
|
97
103
|
|
|
98
104
|
윤문 시 voice.md 4절의 구분을 humanize에 함께 전달합니다 — 팀 내부 문서의 해석, 권고 제안형("~하면 어떨까요?")은 보존하고 사실, 수치를 흐리는 헤징만 단정으로 교정합니다. humanize가 voice를 일괄로 평탄화하지 않게 합니다.
|
|
99
105
|
|
|
106
|
+
파일 기반 윤문이면 `gestalt humanize-check --before before.md --after after.md --register report`를 실행합니다. 이 검사는 기존 S1 패턴과 보고 본문의 평서체/합니다체 혼용을 함께 확인합니다.
|
|
107
|
+
|
|
100
108
|
## 테스트 시나리오
|
|
101
109
|
|
|
102
110
|
**정상 흐름**: `/brief report` + 지표 표 입력 → 유형 report 확정 → 전경 메시지 도출 → 핵심 지표 표 + 잘된 것/아쉬운 것 + 다음 포커스 작성 → humanize → publish-ready 리포트 반환.
|