patina-cli 3.11.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/.patina.default.yaml +211 -0
- package/CHANGELOG.md +265 -0
- package/LICENSE +21 -0
- package/README.md +319 -0
- package/README_JA.md +254 -0
- package/README_KR.md +253 -0
- package/README_ZH.md +254 -0
- package/SKILL-MAX.md +455 -0
- package/SKILL.md +730 -0
- package/assets/brand/patina-icon.svg +9 -0
- package/assets/brand/patina-logo.svg +17 -0
- package/assets/social/patina-before-after.svg +46 -0
- package/assets/social/patina-og.svg +31 -0
- package/bin/patina.js +9 -0
- package/core/scoring.md +657 -0
- package/core/standalone-prompt.md +364 -0
- package/core/stylometry.md +754 -0
- package/core/voice.md +163 -0
- package/docs/AUTHENTICATION.md +105 -0
- package/docs/AUTHENTICATION_KR.md +105 -0
- package/docs/BRANDING.md +37 -0
- package/docs/CLI.md +80 -0
- package/docs/COMPARISON.md +38 -0
- package/docs/COOKBOOK.md +173 -0
- package/docs/DEMO.md +40 -0
- package/docs/ETHICS.md +27 -0
- package/docs/EXAMPLES.md +130 -0
- package/docs/EXAMPLES_KR.md +130 -0
- package/docs/EXIT-CODES.md +25 -0
- package/docs/FAQ.md +67 -0
- package/docs/FAQ_KR.md +65 -0
- package/docs/FLAG-PARITY.md +53 -0
- package/docs/GLOSSARY.md +123 -0
- package/docs/PATTERNS-EN.md +718 -0
- package/docs/PATTERNS-JA.md +706 -0
- package/docs/PATTERNS-KO.md +707 -0
- package/docs/PATTERNS-ZH.md +706 -0
- package/docs/PATTERNS.md +22 -0
- package/docs/ROADMAP.md +315 -0
- package/docs/audits/2026-05-deep-research.md +290 -0
- package/docs/benchmarks/detector-comparison.json +442 -0
- package/docs/benchmarks/detector-comparison.md +65 -0
- package/docs/benchmarks/latest.json +988 -0
- package/docs/benchmarks/latest.md +112 -0
- package/docs/integrations/docker.md +19 -0
- package/docs/integrations/github-action.md +59 -0
- package/docs/integrations/pre-commit.md +77 -0
- package/docs/integrations/release.md +43 -0
- package/docs/internal/HARNESS.md +14 -0
- package/docs/internal/README.md +14 -0
- package/docs/internal/WARP.md +23 -0
- package/docs/research/2025-rebaseline-plan.md +89 -0
- package/docs/research/ai-human-metrics.md +380 -0
- package/docs/social/gstack-cardnews.html +236 -0
- package/docs/social/gstack-cardnews.md +88 -0
- package/docs/social/gstack-thread.md +106 -0
- package/docs/social/patina-launch-copy.md +227 -0
- package/docs/superpowers/specs/2026-04-03-meaning-preservation-design.md +299 -0
- package/lexicon/ai-en.md +162 -0
- package/lexicon/ai-ko.md +159 -0
- package/package.json +100 -0
- package/patina-max/SKILL.md +523 -0
- package/patina-max/composite.py +457 -0
- package/patterns/en-communication.md +89 -0
- package/patterns/en-content.md +133 -0
- package/patterns/en-filler.md +113 -0
- package/patterns/en-language.md +163 -0
- package/patterns/en-structure.md +173 -0
- package/patterns/en-style.md +139 -0
- package/patterns/en-viral-hook.md +211 -0
- package/patterns/ja-communication.md +101 -0
- package/patterns/ja-content.md +153 -0
- package/patterns/ja-filler.md +123 -0
- package/patterns/ja-language.md +190 -0
- package/patterns/ja-structure.md +142 -0
- package/patterns/ja-style.md +147 -0
- package/patterns/ja-viral-hook.md +216 -0
- package/patterns/ko-communication.md +98 -0
- package/patterns/ko-content.md +154 -0
- package/patterns/ko-filler.md +105 -0
- package/patterns/ko-language.md +182 -0
- package/patterns/ko-structure.md +147 -0
- package/patterns/ko-style.md +146 -0
- package/patterns/ko-viral-hook.md +211 -0
- package/patterns/zh-communication.md +101 -0
- package/patterns/zh-content.md +153 -0
- package/patterns/zh-filler.md +118 -0
- package/patterns/zh-language.md +173 -0
- package/patterns/zh-structure.md +145 -0
- package/patterns/zh-style.md +159 -0
- package/patterns/zh-viral-hook.md +216 -0
- package/profiles/academic.md +53 -0
- package/profiles/blog.md +81 -0
- package/profiles/casual-conversation.md +105 -0
- package/profiles/code-comment.md +104 -0
- package/profiles/commit-message.md +99 -0
- package/profiles/default.md +62 -0
- package/profiles/email.md +52 -0
- package/profiles/formal.md +98 -0
- package/profiles/instructional.md +80 -0
- package/profiles/legal.md +57 -0
- package/profiles/marketing.md +56 -0
- package/profiles/medical.md +53 -0
- package/profiles/narrative.md +79 -0
- package/profiles/release-notes.md +98 -0
- package/profiles/social.md +56 -0
- package/profiles/technical.md +53 -0
- package/scripts/benchmark-report.mjs +252 -0
- package/scripts/check-release-metadata.mjs +48 -0
- package/scripts/detector-comparison.mjs +267 -0
- package/scripts/lint.mjs +40 -0
- package/scripts/precommit-score.mjs +31 -0
- package/scripts/prose-score.mjs +186 -0
- package/scripts/update-benchmark-ranges.mjs +108 -0
- package/src/api.js +330 -0
- package/src/auth.js +105 -0
- package/src/backends/claude-cli.js +112 -0
- package/src/backends/codex-cli.js +121 -0
- package/src/backends/contract.js +21 -0
- package/src/backends/gemini-cli.js +135 -0
- package/src/backends/index.js +159 -0
- package/src/cache.js +106 -0
- package/src/cli.js +1280 -0
- package/src/commands/doctor.js +229 -0
- package/src/commands/init.js +208 -0
- package/src/config.js +126 -0
- package/src/errors.js +53 -0
- package/src/features/index.js +96 -0
- package/src/features/lexicon.js +90 -0
- package/src/features/segment.js +49 -0
- package/src/features/stylometry.js +50 -0
- package/src/loader.js +103 -0
- package/src/logger.js +70 -0
- package/src/manifest.js +162 -0
- package/src/max-mode.js +207 -0
- package/src/ouroboros.js +233 -0
- package/src/output.js +480 -0
- package/src/prompt-builder.js +409 -0
- package/src/providers.js +100 -0
- package/src/scoring.js +531 -0
- package/src/security.js +133 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-01.md +16 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-02.md +16 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-03.md +17 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-04.md +15 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-05.md +16 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-06-chat-register.md +16 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-01.md +15 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-02.md +15 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-03.md +15 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-04.md +15 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-05.md +15 -0
- package/tests/fixtures/suspect-zones/expected-ranges.json +939 -0
- package/tests/fixtures/suspect-zones/ja/ai/ja-ai-01.md +11 -0
- package/tests/fixtures/suspect-zones/ja/ai/ja-ai-02.md +11 -0
- package/tests/fixtures/suspect-zones/ja/ai/ja-ai-03.md +11 -0
- package/tests/fixtures/suspect-zones/ja/natural/ja-nat-01.md +11 -0
- package/tests/fixtures/suspect-zones/ja/natural/ja-nat-02.md +11 -0
- package/tests/fixtures/suspect-zones/ja/natural/ja-nat-03.md +11 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-01.md +14 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-02.md +16 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-03.md +15 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-04.md +15 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-05.md +16 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-06-chat-register.md +16 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-01.md +15 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-02.md +15 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-03.md +15 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-04.md +14 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-05.md +15 -0
- package/tests/fixtures/suspect-zones/zh/ai/zh-ai-01.md +11 -0
- package/tests/fixtures/suspect-zones/zh/ai/zh-ai-02.md +11 -0
- package/tests/fixtures/suspect-zones/zh/ai/zh-ai-03.md +11 -0
- package/tests/fixtures/suspect-zones/zh/natural/zh-nat-01.md +11 -0
- package/tests/fixtures/suspect-zones/zh/natural/zh-nat-02.md +11 -0
- package/tests/fixtures/suspect-zones/zh/natural/zh-nat-03.md +11 -0
- package/tests/quality/README.md +121 -0
- package/tests/quality/benchmark.mjs +306 -0
- package/tests/quality/detectors.manual.example.json +31 -0
- package/tests/quality/dogfood.mjs +44 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
---
|
|
2
|
+
pack: zh-viral-hook
|
|
3
|
+
language: zh
|
|
4
|
+
name: 病毒钩子模式
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
patterns: 8
|
|
7
|
+
score_only: true
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# 病毒钩子模式(仅评分)
|
|
11
|
+
|
|
12
|
+
本模式包**仅用于评分(`--score`)和审计(`--audit`)**,不会在重写时主动修改。它捕捉社交媒体(微信、小红书、抖音、微博等)营销文案中常见的"AI 网红风"信号——数字震撼钩子、标题党悬念结尾、回避验证的权威断言、呼吸优化短句堆叠、夸张互动词汇、伪统计引用、头衔堆叠和未来自我承诺。
|
|
13
|
+
|
|
14
|
+
命中本包不代表内容一定是 AI 生成的——人类作者也常用这些模式。但当几种模式同时出现时,评分就会与读者直觉一致:"这看起来像 AI 润色过的营销文案"。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
### 1. 数字震撼钩子
|
|
19
|
+
|
|
20
|
+
**关注词汇:** 仅 N 天就 / 短短 N 个月 / N 小时内、N 万人 / N 亿曝光 / 涨粉 N 万、0 预算 / 零成本 / 单价 N 元、暴涨 N 倍、N% 增长
|
|
21
|
+
|
|
22
|
+
**问题:** 用一个具体的震撼数字作为主要冲击杠杆。如果同一篇没有可验证的来源(链接、截图、官方公告),更像营销机器人或 AI 网红的写法,而不是真人在分享自己的经历。
|
|
23
|
+
|
|
24
|
+
**触发条件:** 强主张依赖一个抢眼数字(时间、规模、百分比),同一篇没有给出来源或核验路径。
|
|
25
|
+
|
|
26
|
+
**排除条件:**
|
|
27
|
+
- 第一人称的个人数字("我月薪 8000")
|
|
28
|
+
- 习惯性夸张("看了一百遍")
|
|
29
|
+
- 可独立核实的常识统计
|
|
30
|
+
|
|
31
|
+
**Semantic Risk:** LOW —— 仅评分,重写时不动。
|
|
32
|
+
**Preservation Note:** 该模式默认仅评分不重写;若用户明确要求弱化钩子,保留数字本身、出处和量级,不要把可验证数据删成泛泛描述。
|
|
33
|
+
**检测示例:**
|
|
34
|
+
> 60 天破 25 万 star。
|
|
35
|
+
|
|
36
|
+
> 0 预算做出 1 亿曝光。
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
### 2. 标题党悬念结尾
|
|
41
|
+
|
|
42
|
+
**关注词汇:** 你猜怎么着 / 你以为〜其实、为什么 / 凭什么 / 凭啥、不看后悔、想知道答案吗、原因竟然是
|
|
43
|
+
|
|
44
|
+
**问题:** 文章末尾用一个未解的反问或悬念吸引点击、关注、评论,而不是给出信息本身。AI 生成的爆款文案几乎不会跳过这个结尾模式。
|
|
45
|
+
|
|
46
|
+
**触发条件:** 文章**最后一句**是一个未被正文回答的反问,或显式引导读者做出参与行为(关注、收藏)。
|
|
47
|
+
|
|
48
|
+
**排除条件:**
|
|
49
|
+
- 真正引出后续段落或下一篇文章答案的提问
|
|
50
|
+
- 指明特定话题和回应渠道的真实讨论邀请
|
|
51
|
+
|
|
52
|
+
**Semantic Risk:** LOW —— 仅评分。
|
|
53
|
+
**Preservation Note:** 该模式默认仅评分不重写;若要改写,保留真正的提问、行动号召或悬念功能,只去掉未兑现的标题党包装。
|
|
54
|
+
**检测示例:**
|
|
55
|
+
> 0 预算做到这个,你猜他怎么操作的?
|
|
56
|
+
|
|
57
|
+
> 你品,你细品。
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
### 3. 回避验证的权威断言
|
|
62
|
+
|
|
63
|
+
**关注词汇:** 史上首次 / 全球第一、空前 / 前所未有、唯一一个 / 唯一能、据说 / 据悉(不指名来源)、业内人士透露(无来源)
|
|
64
|
+
|
|
65
|
+
**问题:** 不附可验证证据就给出绝对范围或排名声明。真人通常会加缓冲("我看过的范围内")或注明出处;AI 网红文案靠果断断言制造冲击。
|
|
66
|
+
|
|
67
|
+
**触发条件:** 出现"史上首次 X"、"全球唯一 Y"等绝对范围或排名断言,同时全文没有来源、链接、截图、具名专家。
|
|
68
|
+
|
|
69
|
+
**排除条件:**
|
|
70
|
+
- 自明的常识陈述
|
|
71
|
+
- 明显的修辞夸张(习语)
|
|
72
|
+
- 第一人称的个人评价("我看过最棒的电影")
|
|
73
|
+
|
|
74
|
+
**Semantic Risk:** LOW —— 仅评分。
|
|
75
|
+
**Preservation Note:** 该模式默认仅评分不重写;若要改写,保留核心主张,同时补足或点明来源,不能凭空编造权威出处。
|
|
76
|
+
**检测示例:**
|
|
77
|
+
> GitHub 史上从未见过这种增长速度。
|
|
78
|
+
|
|
79
|
+
> 全球开发者都在疯狂使用。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### 4. 呼吸优化短句堆叠
|
|
84
|
+
|
|
85
|
+
**关注词汇:**(结构性模式——按形式判断,不看具体词汇)
|
|
86
|
+
|
|
87
|
+
**问题:** 整篇刻意把每个句子切成一行,用换行分隔以适配竖向滚动阅读。这是社交媒体和小红书风格的典型排版。真人写长文通常有自然的"句长起伏"——长短句混合。
|
|
88
|
+
|
|
89
|
+
**触发条件:** 整篇几乎都是 1 句 = 1 段的形式,连续 4 个以上单句段落,平均句长在 15 字以下。零星出现一两个短句不触发。
|
|
90
|
+
|
|
91
|
+
**排除条件:**
|
|
92
|
+
- 诗、歌词、韵文
|
|
93
|
+
- 本就简短的备忘、通知、提示
|
|
94
|
+
- 对问题的一两句回答
|
|
95
|
+
- 主体由代码块、列表、引用对话构成的内容
|
|
96
|
+
|
|
97
|
+
**Semantic Risk:** LOW —— 仅评分;这种排版可能是有意选择。
|
|
98
|
+
**Preservation Note:** 该模式默认仅评分不重写;若要调整节奏,保留平台语境、停顿效果和原有重点,不要把短句强行合成长句。
|
|
99
|
+
**检测示例:**
|
|
100
|
+
> 史上从未有过这种增速。
|
|
101
|
+
>
|
|
102
|
+
> 仅 60 天,25 万 star。
|
|
103
|
+
>
|
|
104
|
+
> 一个叫 OpenClaw 的工具做到了。
|
|
105
|
+
>
|
|
106
|
+
> 0 广告,全球开发者却疯狂涌入,凭什么?
|
|
107
|
+
|
|
108
|
+
(4 段单句,平均约 12 字,换行分隔 → 触发。)
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
### 5. 夸张互动词汇
|
|
113
|
+
|
|
114
|
+
**关注词汇:** 绝了 / 真的绝了、封神 / 神级、太炸了 / 炸裂、卷王 / 内卷、不看后悔 / 错过亏大了、王炸 / yyds、爆赞 / 直接拿下、必须冲
|
|
115
|
+
|
|
116
|
+
**问题:** 为了拉互动而堆砌的夸张词汇。人类作者会用,但一篇里堆几个就成了强信号——AI 模仿爆款文案时几乎一定会带上。
|
|
117
|
+
|
|
118
|
+
**触发条件:**
|
|
119
|
+
- 一篇出现 1 次:Low
|
|
120
|
+
- 出现 2 次:Medium
|
|
121
|
+
- 出现 3 次或以上:High
|
|
122
|
+
|
|
123
|
+
**排除条件:**
|
|
124
|
+
- 自嘲或玩笑语境且明确说明
|
|
125
|
+
- 引用、对话内容
|
|
126
|
+
- 游戏、体育等领域且有客观成绩支撑("绝杀"等)
|
|
127
|
+
|
|
128
|
+
**Semantic Risk:** LOW —— 仅评分。
|
|
129
|
+
**Preservation Note:** 该模式默认仅评分不重写;若要降调,保留营销目的和品牌语气,同时避免把事实性优势削弱成无信息的中性话。
|
|
130
|
+
**检测示例:**
|
|
131
|
+
> 这工具真的绝了,开发者都疯了。
|
|
132
|
+
|
|
133
|
+
> 不试试就亏大了的神级工具。
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
### 6. 伪统计引用
|
|
138
|
+
|
|
139
|
+
**关注词汇:** 研究显示 N% / 数据表明 N% / 有调查说 / 科学证明 / N% 的人 / 专家指出(无来源)/ 统计上
|
|
140
|
+
|
|
141
|
+
**问题:** 用精确数字借用“研究感”,却不给读者核验路径。AI 润色过的营销文案常用这种假精确,把普通建议包装成已被证明的事实。
|
|
142
|
+
|
|
143
|
+
**触发条件:** 数字或比例被归因给笼统的研究、数据、调查、科学或专家,但同一篇没有机构名、链接、样本、时间或方法说明。
|
|
144
|
+
|
|
145
|
+
**严重度标尺:**
|
|
146
|
+
- Low:无来源统计只支持一个次要点。
|
|
147
|
+
- Medium:统计数字作为开头钩子或主要行动号召的依据。
|
|
148
|
+
- High:精确百分比支撑健康、金融、职业或安全建议,或多条无来源统计同时出现。
|
|
149
|
+
|
|
150
|
+
**排除条件:**
|
|
151
|
+
- 给出了具名报告、出版物、数据集或链接
|
|
152
|
+
- 明确标注为示例或假设数字
|
|
153
|
+
- 第一方数据同时说明范围和测量语境
|
|
154
|
+
- 可由读者独立核验的公共常识数据
|
|
155
|
+
|
|
156
|
+
**Semantic Risk:** LOW —— 仅评分。
|
|
157
|
+
**Preservation Note:** 该模式默认仅评分不重写;若用户要求降调,保留真实数字,并改为补来源、加限定或移除伪研究框架。不要凭空编造来源。
|
|
158
|
+
**改写前 / 改写后示例(手动降信号):**
|
|
159
|
+
> 改写前:研究显示,73% 的创业者因为忽略这个习惯而亏钱。
|
|
160
|
+
>
|
|
161
|
+
> 改写后:这个 73% 没有给出来源。更稳妥的说法是:每周检查现金流可以更早发现亏损。
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### 7. 头衔堆叠式权威
|
|
166
|
+
|
|
167
|
+
**关注词汇:** 斯坦福背景 / Y Combinator 支持 / 前 Google / 哈佛博士 / Forbes 报道 / 获奖 / 连续创业者 / 顶级 CEO 信任 / 行业领先专家
|
|
168
|
+
|
|
169
|
+
**问题:** 把多个声望标签堆在主张前面,让“头衔”替代证据。如果这些标签模糊、无关或无法说明结论,就会像增长帖模板或 AI 网红文案。
|
|
170
|
+
|
|
171
|
+
**触发条件:** 学校、投资机构、前雇主、奖项、媒体、职称等权威标签连续出现 2 个以上,并被用来出售一个建议、产品或趋势,而不是补充已有证据。
|
|
172
|
+
|
|
173
|
+
**严重度标尺:**
|
|
174
|
+
- Low:出现 2 个标签,但人物/产品具名,主张范围较窄。
|
|
175
|
+
- Medium:3 个以上标签作为建议、产品或趋势的主要开场钩子。
|
|
176
|
+
- High:在高风险建议或购买/注册 CTA 中,头衔堆叠完全取代证据。
|
|
177
|
+
|
|
178
|
+
**排除条件:**
|
|
179
|
+
- 简历、人物简介、演讲嘉宾介绍等以资历为主题的文本
|
|
180
|
+
- 具名且可核验的资历,并且与主张直接相关
|
|
181
|
+
- 正文已有证据,头衔只作为背景信息
|
|
182
|
+
|
|
183
|
+
**Semantic Risk:** LOW —— 仅评分。
|
|
184
|
+
**Preservation Note:** 该模式默认仅评分不重写;若要降调,保留可核验的从属关系,只减少堆叠和从头衔直接跳到结论的部分。
|
|
185
|
+
**改写前 / 改写后示例(手动降信号):**
|
|
186
|
+
> 改写前:斯坦福背景、Y Combinator 支持的连续创业者,分享让增长翻 10 倍的工作流。
|
|
187
|
+
>
|
|
188
|
+
> 改写后:一位创业者分享了他们每周复盘增长指标的工作流;采用前先用自己的数据测试。
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### 8. 未来自我 / 拟亲密二人称承诺
|
|
193
|
+
|
|
194
|
+
**关注词汇:** 朋友 / 听我说 / 先收藏 / 未来的你会感谢现在的自己 / 一年后的你会感谢 / 相信我 / 以后你会懂
|
|
195
|
+
|
|
196
|
+
**问题:** 文案把读者当成朋友或未来的自己来称呼,用未来感谢、后悔或亲密感推动收藏、分享、关注。它制造情绪压力,却没有增加证据。
|
|
197
|
+
|
|
198
|
+
**触发条件:** 开头或结尾直接把读者称作朋友、未来的自己或亲密对象,并承诺未来会感谢/后悔,通常伴随收藏、分享、关注等动作要求,但同一篇缺少具体支撑。
|
|
199
|
+
|
|
200
|
+
**严重度标尺:**
|
|
201
|
+
- Low:休闲社交帖里出现一次“收藏/未来感谢”式短语。
|
|
202
|
+
- Medium:未来自我承诺构成标题、开头或结尾 CTA。
|
|
203
|
+
- High:与紧迫感、稀缺性或高风险人生/职业建议组合。
|
|
204
|
+
|
|
205
|
+
**排除条件:**
|
|
206
|
+
- 真正写给已知朋友或社群成员的信息
|
|
207
|
+
- 教练、咨询、问责场景中关系明确
|
|
208
|
+
- 回忆录或自我反思中写给过去/未来自己的文本
|
|
209
|
+
- 没有情绪压力的普通日历、提醒或收藏说明
|
|
210
|
+
|
|
211
|
+
**Semantic Risk:** LOW —— 仅评分。
|
|
212
|
+
**Preservation Note:** 该模式默认仅评分不重写;若要重写,保留有用的提醒、清单或行动,同时移除伪亲密和无法验证的未来回报。
|
|
213
|
+
**改写前 / 改写后示例(手动降信号):**
|
|
214
|
+
> 改写前:朋友,先收藏这篇。一年后的你一定会感谢现在的自己。
|
|
215
|
+
>
|
|
216
|
+
> 改写后:如果你下个月要做计划,可以保存这份清单。
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
profile: academic
|
|
3
|
+
name: 학술 논문/연구 보고서 프로필
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
scope: 학술 논문, 연구 보고서, 학회 발표 자료, 석/박사 논문
|
|
6
|
+
voice-overrides:
|
|
7
|
+
first-person: reduce # 1인칭 사용 억제 (학술 관행)
|
|
8
|
+
opinions: reduce # 주관적 의견 억제, 근거 기반 서술
|
|
9
|
+
rhythm-variation: normal # 리듬 변화는 유지하되 과하지 않게
|
|
10
|
+
humor: suppress # 유머 억제
|
|
11
|
+
messiness: suppress # 불완전 구조 억제, 정돈된 서술 유지
|
|
12
|
+
concrete-emotions: reduce # 감정 표현 억제
|
|
13
|
+
pattern-overrides:
|
|
14
|
+
ko:
|
|
15
|
+
18: reduce # 한자어/공식어 — 학술에서는 자연스러운 수준 허용
|
|
16
|
+
23: reduce # 헤징 — 학술적 불확실성 표현 ("~일 수 있다") 허용
|
|
17
|
+
27: reduce # 수동태 — 방법론 기술에서 수동태 허용
|
|
18
|
+
en:
|
|
19
|
+
23: reduce # Hedging — academic convention allows "may suggest", "could indicate"
|
|
20
|
+
26: reduce # Passive nominalization — standard in methods sections
|
|
21
|
+
18: suppress # Curly quotes — irrelevant in academic context
|
|
22
|
+
zh:
|
|
23
|
+
18: reduce # 公文体 — 학술 중국어에서 일정 수준 허용
|
|
24
|
+
23: reduce # 过度弱化 — 학술적 헤징 허용
|
|
25
|
+
27: reduce # 被字句 — 학술 문체에서 수동태 허용
|
|
26
|
+
ja:
|
|
27
|
+
18: reduce # である調 — 학술 일본어의 표준 문체
|
|
28
|
+
23: reduce # ヘッジング — 학술적 완화 표현 허용
|
|
29
|
+
16: reduce # 敬語 — 학술 문체에서는 비해당
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# 학술 논문/연구 보고서 프로필
|
|
33
|
+
|
|
34
|
+
학술 문서의 관행을 존중하면서 AI 패턴을 제거한다. 헤징, 수동태, 격식체 등 학술 글쓰기에서 정당한 요소는 보존한다.
|
|
35
|
+
|
|
36
|
+
## 범위
|
|
37
|
+
|
|
38
|
+
학술 논문, 연구 보고서, 학회 발표 자료, 석/박사 논문. 과학 커뮤니케이션이나 대중 과학 글은 `default` 프로필 사용.
|
|
39
|
+
|
|
40
|
+
## 어조 지침
|
|
41
|
+
|
|
42
|
+
- **격식체를 유지한다.** 학술 문서의 격식 수준은 낮추지 않는다.
|
|
43
|
+
- **1인칭은 신중하게.** "We found that ~" 정도는 허용하되, 과도한 개인적 표현은 억제.
|
|
44
|
+
- **헤징은 허용한다.** "이 결과는 ~를 시사한다"는 학술에서 정당한 표현. 단, 헤지 3개 이상 중첩은 여전히 교정.
|
|
45
|
+
- **수동태는 맥락에 따라.** 방법론 섹션의 수동태는 허용. 결과/논의에서 불필요한 수동태는 교정.
|
|
46
|
+
- **유머, 감정, 여담은 억제.** 학술 문서에서는 부적절.
|
|
47
|
+
|
|
48
|
+
## 적극 교정 대상
|
|
49
|
+
|
|
50
|
+
- **AI 고빈도 어휘 (#7):** "혁신적인", "다양한" 등은 학술에서도 AI 신호. 구체적 서술로 교체.
|
|
51
|
+
- **과도한 중요성 부여 (#1):** "획기적인 성과"는 학술 문서에서도 남발됨. 데이터로 대체.
|
|
52
|
+
- **모호한 출처 (#5):** 학술 문서에서 "전문가에 따르면"은 더더욱 부적절. 구체적 인용 필수.
|
|
53
|
+
- **과제와 전망 공식 (#6):** 학술 논문 결론도 이 공식에 빠지기 쉬움. 구체적 후속 연구 방향으로 교체.
|
package/profiles/blog.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
profile: blog
|
|
3
|
+
name: 블로그/에세이 프로필
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
scope: 개인 블로그, 에세이, 개인 뉴스레터
|
|
6
|
+
voice-overrides:
|
|
7
|
+
first-person: amplify # 1인칭 적극 사용
|
|
8
|
+
opinions: amplify # 의견 표현 강화
|
|
9
|
+
rhythm-variation: amplify # 리듬 변화 강화
|
|
10
|
+
humor: allow # 유머 허용
|
|
11
|
+
messiness: amplify # 불완전한 구조 허용
|
|
12
|
+
concrete-emotions: amplify # 감정 구체화 강화
|
|
13
|
+
pattern-overrides:
|
|
14
|
+
ko:
|
|
15
|
+
14: suppress # 볼드체 — 블로그에서는 흔하게 사용, 교정 불필요
|
|
16
|
+
15: reduce # 인라인 헤더 — 블로그에서 일부 허용
|
|
17
|
+
17: reduce # 이모지 — 블로그에서 가끔 허용 (과도한 경우만 교정)
|
|
18
|
+
18: amplify # 한자어/공식어 — 블로그에서는 특히 부자연스러우므로 적극 교정
|
|
19
|
+
8: amplify # ~적 접미사 — 블로그에서는 특히 딱딱하게 느껴지므로 적극 교정
|
|
20
|
+
en:
|
|
21
|
+
14: suppress # Boldface — blogs use bold for readability, no correction needed
|
|
22
|
+
15: reduce # Inline-header lists — partially allowed in blog posts
|
|
23
|
+
17: reduce # Emojis — occasional use tolerated in personal blogs
|
|
24
|
+
7: amplify # AI vocabulary words — especially jarring in casual blog prose
|
|
25
|
+
8: amplify # Copula avoidance — blog prose should use simple "is", not "serves as"
|
|
26
|
+
zh:
|
|
27
|
+
14: suppress # 加粗 — 博客常用于提高可读性,不默认纠正
|
|
28
|
+
15: reduce # 内联标题 — 博客小节可部分保留
|
|
29
|
+
17: reduce # 表情符号 — 个人博客中少量使用可接受
|
|
30
|
+
18: amplify # 书面/公文体 — 博客里特别生硬,积极纠正
|
|
31
|
+
7: amplify # AI高频词 — 个人语气中“赋能/生态”更刺眼
|
|
32
|
+
ja:
|
|
33
|
+
14: suppress # 太字 — ブログでは読みやすさのために使われるため既定では直さない
|
|
34
|
+
15: reduce # インラインヘッダー — ブログの小見出しとして一部許容
|
|
35
|
+
17: reduce # 絵文字 — 個人ブログでの少量使用は許容
|
|
36
|
+
18: amplify # 硬質文体 — ブログでは不自然なので積極的に直す
|
|
37
|
+
7: amplify # AI語彙 — 個人文では特に浮くため強めに検出
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
# 블로그/에세이 프로필
|
|
41
|
+
|
|
42
|
+
개인 블로그와 에세이에 맞는 교정을 수행한다. 독자와 대화하는 느낌을 살리면서 AI 패턴을 제거한다.
|
|
43
|
+
|
|
44
|
+
## 범위
|
|
45
|
+
|
|
46
|
+
이 프로필은 **개인 블로그와 에세이**에 한정된다. 기업 블로그, 공식 뉴스레터, 보도자료는 이 프로필의 범위가 아니다.
|
|
47
|
+
|
|
48
|
+
## 어조 지침
|
|
49
|
+
|
|
50
|
+
- **1인칭을 적극적으로 쓴다.** "내가", "나는", "내 생각에는" — 블로그의 핵심은 개인의 목소리다.
|
|
51
|
+
- **의견을 숨기지 않는다.** "솔직히 이건 좀 별로다", "이게 왜 좋냐면" — 중립적 나열보다 입장 표명.
|
|
52
|
+
- **구어체를 허용한다.** "~거든요", "~잖아", "근데" — 완벽한 문어체보다 말하듯이 쓴다.
|
|
53
|
+
- **불완전한 문장을 두려워하지 않는다.** "그래서?" "글쎄." — 짧은 파편 문장이 리듬을 만든다.
|
|
54
|
+
- **유머와 자기비하를 허용한다.** "삽질을 이틀 했다", "이걸 왜 이제야 알았을까" — 사람다움의 핵심.
|
|
55
|
+
|
|
56
|
+
## 패턴 처리 (한국어)
|
|
57
|
+
|
|
58
|
+
- **볼드체(ko #14), 인라인 헤더(ko #15):** 블로그에서는 가독성을 위해 흔히 사용하므로 관대하게 처리한다. 기계적으로 모든 키워드를 볼드 처리한 경우만 교정.
|
|
59
|
+
- **이모지(ko #17):** 1-2개 자연스러운 사용은 허용. 모든 항목에 이모지를 붙인 경우만 교정.
|
|
60
|
+
- **한자어/공식어(ko #18), ~적 접미사(ko #8):** 블로그에서 "도모하다", "혁신적인" 같은 표현은 특히 부자연스럽다. 적극 교정.
|
|
61
|
+
- **구조적 반복(ko #25):** 블로그에서도 모든 단락이 동일 구조면 AI 티가 난다. 적극 교정.
|
|
62
|
+
- **번역체(ko #26):** 블로그는 구어체에 가까워야 하므로 번역체가 더 눈에 띈다. 적극 교정.
|
|
63
|
+
|
|
64
|
+
## Pattern Handling (English)
|
|
65
|
+
|
|
66
|
+
- **Boldface (en #14), Inline-header lists (en #15):** Blogs legitimately use bold and headers for readability. Only correct mechanical over-use across every bullet.
|
|
67
|
+
- **Emojis (en #17):** 1–2 natural uses are tolerated. Correct only when every item gets an emoji.
|
|
68
|
+
- **AI vocabulary (en #7):** Words like "delve", "tapestry", "leverage", "multifaceted" are especially jarring in casual blog prose. Aggressively correct.
|
|
69
|
+
- **Copula avoidance (en #8):** "Serves as", "functions as" read stiffly in blog writing. Replace with simple "is/are" constructions.
|
|
70
|
+
|
|
71
|
+
## voice.md 오버라이드
|
|
72
|
+
|
|
73
|
+
이 프로필은 `core/voice.md`의 지침을 다음과 같이 조절한다:
|
|
74
|
+
|
|
75
|
+
| voice.md 지침 | 블로그 프로필에서 |
|
|
76
|
+
|--------------|----------------|
|
|
77
|
+
| "의견을 가져라" | **강화** — 모든 단락에 최소 하나의 주관적 반응 |
|
|
78
|
+
| "리듬을 바꿔라" | **강화** — 의도적으로 1-2단어 문장 삽입 |
|
|
79
|
+
| "나를 써라" | **강화** — 1인칭 시점 기본값 |
|
|
80
|
+
| "좀 지저분해도 괜찮다" | **강화** — 곁가지, 여담 적극 허용 |
|
|
81
|
+
| "감정을 구체적으로" | **강화** — 추상적 감정 대신 구체적 상황 묘사 |
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
profile: casual-conversation
|
|
3
|
+
name: 친한 대화체 프로필
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
scope: 친구·지인 SNS, 댓글, 카카오톡 톤의 짧은 글
|
|
6
|
+
voice-overrides:
|
|
7
|
+
first-person: amplify # 1인칭 적극 ("내가", "제가")
|
|
8
|
+
opinions: amplify # 주관 진술 강화
|
|
9
|
+
rhythm-variation: amplify # 짧은 문장 + 긴 문장 섞기
|
|
10
|
+
humor: allow # 가벼운 농담 허용
|
|
11
|
+
messiness: amplify # 완벽하지 않은 구조 허용
|
|
12
|
+
concrete-emotions: amplify # "짜증나죠?", "허탈해요" 같은 감정 표현 강화
|
|
13
|
+
reader-address: amplify # "~해보셨어요?", "그쵸?" 같은 청자 호명 허용
|
|
14
|
+
hedge-tone: amplify # "솔직히", "에이~", "사실" 같은 완충 어휘 허용
|
|
15
|
+
pattern-overrides:
|
|
16
|
+
ko:
|
|
17
|
+
8: amplify # ~적 접미사 — 친한 대화체에서는 더더욱 부자연스러움
|
|
18
|
+
18: amplify # 한자어/공식어 — 한자어 대신 순한 단어 우선
|
|
19
|
+
14: suppress # 볼드체 — SNS/댓글에서는 사용 안 함
|
|
20
|
+
19: reduce # 챗봇 표현 — 친한 톤이면 일부 허용 ("~해드릴게요" 등)
|
|
21
|
+
en:
|
|
22
|
+
8: amplify # Copula avoidance
|
|
23
|
+
7: amplify # AI vocabulary
|
|
24
|
+
14: suppress # Boldface
|
|
25
|
+
zh:
|
|
26
|
+
7: amplify # AI高频词 — 亲密对话里“赋能/生态”特别不像人话
|
|
27
|
+
18: amplify # 书面/公文体 — 朋友语气中应换成口语
|
|
28
|
+
14: suppress # 加粗 — 聊天/SNS语气中不作为AI痕迹处理
|
|
29
|
+
19: reduce # 聊天机器人痕迹 — 亲切服务语可少量保留
|
|
30
|
+
ja:
|
|
31
|
+
7: amplify # AI語彙 — 親しい会話では特に不自然
|
|
32
|
+
18: amplify # 硬質文体 — 友人向けなら口語へ寄せる
|
|
33
|
+
16: amplify # 過剰敬語 — 親密な会話では距離が出るため強めに直す
|
|
34
|
+
14: suppress # 太字 — 会話調ではAI判定の主因にしない
|
|
35
|
+
19: reduce # チャットボット痕跡 — 親切な一言は一部許容
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
# 친한 대화체 프로필 (`casual-conversation`)
|
|
39
|
+
|
|
40
|
+
친구·지인에게 카페에서 말하듯, 또는 친한 사이의 SNS·메신저 대화처럼 다듬는다.
|
|
41
|
+
"뉴스 톤"이나 "블로그 에세이 톤"이 아니라 **실제 입말에 가까운 친밀한 대화체**가 목표.
|
|
42
|
+
|
|
43
|
+
## Voice 가이드라인
|
|
44
|
+
|
|
45
|
+
다음 신호들을 적극 활용한다 — 다른 프로필에서는 억제될 수 있지만 이 프로필에서는 사람다움의 핵심이다.
|
|
46
|
+
|
|
47
|
+
### 1. 청자 호명 / 친밀한 종결어미
|
|
48
|
+
|
|
49
|
+
- `~죠?` / `~겠어요?` / `~네요` — 청자에게 묻고 함께 생각하는 톤
|
|
50
|
+
- `~잖아요` / `~죠` — 공감대를 가정한 끝맺음
|
|
51
|
+
- `에이~`, `솔직히`, `진짜로` — 대화 말머리 충완어
|
|
52
|
+
- 평어 `~다` 일관 X — 대신 `~요`/`~죠` 위주, 종결어미 다양화
|
|
53
|
+
|
|
54
|
+
### 2. 1인칭 / 화자-청자 거리감
|
|
55
|
+
|
|
56
|
+
- "내가", "제가", "저는" 같은 1인칭 적극 활용
|
|
57
|
+
- "이거 한 번 써봤는데", "내가 보기엔" 같은 경험·관점 명시
|
|
58
|
+
- 화자가 청자보다 위에 있지 않고 옆에 앉아있는 톤
|
|
59
|
+
|
|
60
|
+
### 3. 비격식 어휘
|
|
61
|
+
|
|
62
|
+
- 한자어 → 순한 어휘: "구축" → "만들기", "활용" → "써먹기"
|
|
63
|
+
- 격식 표현 → 구어: "~하기 위해서" → "~하려고", "~함에 있어" → "~할 때"
|
|
64
|
+
- "엄근진" 단언 → 완충: "역사상 처음" → "이런 거 본 적 없는데"
|
|
65
|
+
|
|
66
|
+
### 4. 호흡과 리듬
|
|
67
|
+
|
|
68
|
+
- 짧은 문장 사이에 의도적으로 긴 문장 섞기
|
|
69
|
+
- 쉼표·줄바꿈으로 호흡 흐름 만들기
|
|
70
|
+
- "근데", "그러니까", "결국에는" 같은 입말 연결어 허용
|
|
71
|
+
|
|
72
|
+
## 적용 예시
|
|
73
|
+
|
|
74
|
+
### Before (격식·뉴스 톤, 점수 0이지만 voice 차가움)
|
|
75
|
+
> 마케팅으로 뜬 게 아니다. 개발자들이 새벽 3시에 버그 잡다가 머리 쥐어뜯을 때 느끼던 그 가려운 지점을 정확히 긁어줬기 때문이다. NVIDIA가 이 무명 오픈소스와 손잡은 것도 우연이 아니다.
|
|
76
|
+
|
|
77
|
+
### After (`--profile casual-conversation` 적용)
|
|
78
|
+
> 에이, 마케팅 빨로 뜬 거 아니에요. 개발자들이 새벽 3시에 버그 잡다가 진짜 머리 쥐어뜯잖아요? 그 가려운 부분을 딱 긁어줬으니까 떴죠. NVIDIA가 이 듣보잡 오픈소스랑 손잡은 것도 다 이유가 있는 거예요.
|
|
79
|
+
|
|
80
|
+
## 다른 프로필과의 차이
|
|
81
|
+
|
|
82
|
+
| | blog | casual-conversation |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| 종결어미 | `~다` 평어 위주 | `~요`/`~죠` 친근체 위주 |
|
|
85
|
+
| 1인칭 | 적극 ("내가") | **더 적극** ("저는 이렇게 보거든요") |
|
|
86
|
+
| 청자 호명 | 가끔 | **상시** ("~잖아요?") |
|
|
87
|
+
| 한자어 | 일반적으로 허용 | **적극 순화** |
|
|
88
|
+
| 톤 비유 | 카페 에세이 | 카페 친구 대화 |
|
|
89
|
+
|
|
90
|
+
## 사용
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
patina --profile casual-conversation --lang ko input.txt
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
또는 `.patina.yaml`에:
|
|
97
|
+
```yaml
|
|
98
|
+
profile: casual-conversation
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 한계
|
|
102
|
+
|
|
103
|
+
- **단방향 변환**: 학술·기술 문서를 친밀체로 바꾸면 register mismatch 발생 가능. 의미 보존 우선.
|
|
104
|
+
- **MPS 영향**: 격식체로 진술된 사실을 풀어쓰는 과정에서 미묘한 hedge가 추가될 수 있음. fidelity floor 70 유지 필수.
|
|
105
|
+
- **번역체 고려 X**: 영어→한국어 번역 결과물에는 별도 대응 필요.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
profile: code-comment
|
|
3
|
+
name: 코드 주석/docstring 프로필
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
scope: 코드 주석, docstring, JSDoc/TSDoc, inline comment, TODO/FIXME 주석
|
|
6
|
+
voice-overrides:
|
|
7
|
+
first-person: suppress # 주석은 작성자가 아니라 코드 동작을 설명한다
|
|
8
|
+
opinions: suppress # 평가·감상 대신 invariant/edge case를 적는다
|
|
9
|
+
rhythm-variation: reduce # 짧고 일정한 호흡 허용
|
|
10
|
+
humor: suppress # 코드 옆 농담은 유지보수 소음이 되기 쉽다
|
|
11
|
+
messiness: suppress # 불완전 문장보다 정확한 조건·이유 우선
|
|
12
|
+
concrete-emotions: suppress # 감정 표현 비해당
|
|
13
|
+
specificity: amplify # 입력, 출력, 예외, 불변조건을 구체화
|
|
14
|
+
pattern-overrides:
|
|
15
|
+
ko:
|
|
16
|
+
7: amplify # AI 고빈도 어휘 — 주석에서는 특히 소음
|
|
17
|
+
8: amplify # ~적 접미사 — 동작/조건으로 풀기
|
|
18
|
+
19: suppress # 챗봇 표현 — 주석에서는 비해당
|
|
19
|
+
22: amplify # 필러 — 삭제 우선
|
|
20
|
+
en:
|
|
21
|
+
7: amplify # AI vocabulary — comments should avoid decorative adjectives
|
|
22
|
+
8: amplify # Copula avoidance — prefer direct code-action verbs
|
|
23
|
+
19: suppress # Chatbot phrasing — not relevant in code comments
|
|
24
|
+
22: amplify # Filler — remove rather than polish
|
|
25
|
+
zh:
|
|
26
|
+
7: amplify # AI高频词 — 注释中应换成具体条件/行为
|
|
27
|
+
18: amplify # 书面/公文体 — 注释不需要公文口吻
|
|
28
|
+
19: suppress # 聊天机器人痕迹 — 注释中不适用
|
|
29
|
+
22: amplify # 填充表达 — 优先删除
|
|
30
|
+
ja:
|
|
31
|
+
7: amplify # AI語彙 — コメントでは具体的な動作へ置換
|
|
32
|
+
8: amplify # 「〜的」形容詞 — 条件・処理内容に分解
|
|
33
|
+
16: suppress # 敬語 — コードコメントでは不要
|
|
34
|
+
22: amplify # フィラー — 削除優先
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# 코드 주석/docstring 프로필 (`code-comment`)
|
|
38
|
+
|
|
39
|
+
코드 옆 텍스트는 산문이 아니라 유지보수 단서다. 이 프로필은 주석을 짧게 만들되, **왜 이 코드가 필요한지**, **어떤 edge case를 막는지**, **입출력·불변조건이 무엇인지**를 남긴다.
|
|
40
|
+
|
|
41
|
+
## 범위
|
|
42
|
+
|
|
43
|
+
- inline comment, block comment, docstring, JSDoc/TSDoc, TODO/FIXME 주석
|
|
44
|
+
- README, API 문서, 튜토리얼은 `technical` 또는 `instructional` 프로필을 쓴다.
|
|
45
|
+
- 커밋 메시지는 `commit-message`, 릴리스 노트는 `release-notes` 프로필을 쓴다.
|
|
46
|
+
|
|
47
|
+
## 적극 교정할 genre tell
|
|
48
|
+
|
|
49
|
+
1. **Stock preamble** — `This function...`, `Returns the...`, `This method is used to...`처럼 선언부를 반복하는 말.
|
|
50
|
+
2. **Uninformative inline summary** — 코드가 이미 말하는 내용을 그대로 읽는 주석.
|
|
51
|
+
3. **AI-flavored TODO** — `TODO: consider improving this later`처럼 담당자, 조건, 실패 모드가 없는 TODO.
|
|
52
|
+
4. **Decorative assurance** — `robustly`, `seamlessly`, `효율적으로`, `체계적으로` 같은 형용사만 있고 조건이 없는 설명.
|
|
53
|
+
|
|
54
|
+
## 작성 규칙
|
|
55
|
+
|
|
56
|
+
- 함수명·타입에서 이미 알 수 있는 말은 지운다.
|
|
57
|
+
- 남길 주석은 "왜" 또는 "주의할 조건"을 말해야 한다.
|
|
58
|
+
- TODO/FIXME는 owner, issue id, trigger condition 중 최소 하나를 포함한다.
|
|
59
|
+
- 예외·fallback·security boundary는 삭제하지 않는다. 간결하게 다시 쓴다.
|
|
60
|
+
|
|
61
|
+
## Before / After
|
|
62
|
+
|
|
63
|
+
### Stock preamble
|
|
64
|
+
|
|
65
|
+
**Before**
|
|
66
|
+
```js
|
|
67
|
+
// This function validates the user input and returns a boolean value.
|
|
68
|
+
function isValidUser(input) { ... }
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**After**
|
|
72
|
+
```js
|
|
73
|
+
// Reject empty OAuth subject IDs before they reach the account linker.
|
|
74
|
+
function isValidUser(input) { ... }
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Uninformative inline summary
|
|
78
|
+
|
|
79
|
+
**Before**
|
|
80
|
+
```js
|
|
81
|
+
count += 1; // increment count by one
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**After**
|
|
85
|
+
```js
|
|
86
|
+
count += 1;
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### AI-flavored TODO
|
|
90
|
+
|
|
91
|
+
**Before**
|
|
92
|
+
```js
|
|
93
|
+
// TODO: consider optimizing this in the future for better performance.
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**After**
|
|
97
|
+
```js
|
|
98
|
+
// TODO(#421): cache permission lookups once the authz key includes tenant_id.
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 보존 주의
|
|
102
|
+
|
|
103
|
+
- 주석을 지우기 전에 코드만으로 같은 정보를 회복할 수 있는지 확인한다.
|
|
104
|
+
- 보안, 데이터 손실, race condition, 호환성 우회 설명은 짧아져도 남겨야 한다.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
profile: commit-message
|
|
3
|
+
name: 커밋 메시지 프로필
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
scope: Git commit subject/body, squash message, revert message, PR squash summary
|
|
6
|
+
voice-overrides:
|
|
7
|
+
first-person: suppress # 작성자 중심 대신 변경 의도 중심
|
|
8
|
+
opinions: suppress # 평가보다 결정·근거·검증
|
|
9
|
+
rhythm-variation: reduce # 짧은 subject + 필요한 body
|
|
10
|
+
humor: suppress # 히스토리는 장기 기록
|
|
11
|
+
messiness: suppress # 모호한 WIP/cleanup 표현 억제
|
|
12
|
+
concrete-emotions: suppress # 감정 표현 비해당
|
|
13
|
+
intent-first: amplify # 왜 바꿨는지 먼저
|
|
14
|
+
pattern-overrides:
|
|
15
|
+
ko:
|
|
16
|
+
7: amplify # AI 고빈도 어휘 — 커밋에서는 특히 모호함
|
|
17
|
+
22: amplify # 필러 — 히스토리에서는 삭제
|
|
18
|
+
24: amplify # 낙관 결론 — 커밋 메시지에 불필요
|
|
19
|
+
31: amplify # 결론 신호어 — subject/body에서 제거
|
|
20
|
+
en:
|
|
21
|
+
7: amplify # AI vocabulary — commit history needs precise nouns/verbs
|
|
22
|
+
22: amplify # Filler — remove from commit bodies
|
|
23
|
+
24: amplify # Generic positive conclusions — not useful in history
|
|
24
|
+
31: amplify # Conclusion signals — no "In conclusion" in commits
|
|
25
|
+
zh:
|
|
26
|
+
7: amplify # AI高频词 — 提交记录需要具体动词
|
|
27
|
+
22: amplify # 填充表达 — 删除
|
|
28
|
+
24: amplify # 空泛乐观结尾 — 不适合提交历史
|
|
29
|
+
31: amplify # 结论信号词 — 删除
|
|
30
|
+
ja:
|
|
31
|
+
7: amplify # AI語彙 — コミット履歴では具体語へ
|
|
32
|
+
22: amplify # フィラー — 削除
|
|
33
|
+
24: amplify # 空虚な楽観結論 — 不要
|
|
34
|
+
31: amplify # 結論シグナル — 削除
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# 커밋 메시지 프로필 (`commit-message`)
|
|
38
|
+
|
|
39
|
+
커밋 메시지는 변경 diff의 제목이 아니라 미래 디버깅을 위한 결정 기록이다. subject는 **명령형 또는 의도형**으로 짧게 쓰고, body는 제약·검증·기각한 대안을 남긴다.
|
|
40
|
+
|
|
41
|
+
## 범위
|
|
42
|
+
|
|
43
|
+
Git commit subject/body, squash message, revert message, PR squash summary. 릴리스 노트나 사용자-facing changelog는 `release-notes` 프로필을 쓴다.
|
|
44
|
+
|
|
45
|
+
## 적극 교정할 genre tell
|
|
46
|
+
|
|
47
|
+
1. **AI narrator preamble** — `This commit...`, `This change...`, `이 커밋은...`으로 시작하는 설명.
|
|
48
|
+
2. **Meaningless cleanup subject** — `Refactor code`, `Update files`, `Improve implementation`처럼 diff를 다시 말하는 제목.
|
|
49
|
+
3. **Inflated future promise** — `sets the stage`, `paves the way`, `향후 발전을 위한 기반` 같은 근거 없는 전망.
|
|
50
|
+
4. **Verification fog** — 테스트를 했는지, 안 했는지 알 수 없는 `various tests were run`류 표현.
|
|
51
|
+
|
|
52
|
+
## 작성 규칙
|
|
53
|
+
|
|
54
|
+
- subject는 72자 안팎으로, 가능한 한 "왜"를 말한다.
|
|
55
|
+
- `This commit`으로 시작하지 않는다. 바로 의도나 보호하려는 invariant를 쓴다.
|
|
56
|
+
- body가 필요하면 `Tested:`, `Constraint:`, `Rejected:` 같은 짧은 trailer를 선호한다.
|
|
57
|
+
- issue/PR 번호, 마이그레이션 위험, 배포 순서가 있으면 보존한다.
|
|
58
|
+
|
|
59
|
+
## Before / After
|
|
60
|
+
|
|
61
|
+
### Preamble 제거
|
|
62
|
+
|
|
63
|
+
**Before**
|
|
64
|
+
```text
|
|
65
|
+
This commit refactors the auth code to improve reliability.
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**After**
|
|
69
|
+
```text
|
|
70
|
+
Auth retries need one owner for backoff state
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 모호한 cleanup 구체화
|
|
74
|
+
|
|
75
|
+
**Before**
|
|
76
|
+
```text
|
|
77
|
+
Improve tests and update files
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**After**
|
|
81
|
+
```text
|
|
82
|
+
Score gates need a fixture that fails on invented categories
|
|
83
|
+
|
|
84
|
+
Tested: npm test; npm run lint:syntax.
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 전망 부풀리기 제거
|
|
88
|
+
|
|
89
|
+
**Before**
|
|
90
|
+
```text
|
|
91
|
+
This change lays the foundation for a more robust and scalable future.
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**After**
|
|
95
|
+
```text
|
|
96
|
+
Persist cache keys with model and temperature
|
|
97
|
+
|
|
98
|
+
Constraint: cache entries must stay portable across API hosts.
|
|
99
|
+
```
|