humanizer-lint 1.1.0 → 1.2.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/README.md +24 -5
- package/SKILL.md +7 -5
- package/package.json +3 -2
- package/rules/de-slop.json +190 -0
- package/rules/en-slop.json +50 -49
- package/rules/es-slop.json +190 -0
- package/rules/fr-slop.json +190 -0
- package/rules/id-slop.json +58 -57
- package/rules/ms-slop.json +190 -0
- package/rules/pt-slop.json +190 -0
- package/rules/zh-slop.json +190 -0
- package/scripts/analyze.mjs +9 -3
- package/scripts/core/analyzer-core.mjs +51 -24
- package/scripts/utils/tokenizer.mjs +149 -82
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# humanizer-lint
|
|
4
4
|
|
|
5
|
-
### Deterministic prose and Markdown style linting
|
|
5
|
+
### Deterministic multi-language prose and Markdown style linting
|
|
6
6
|
|
|
7
7
|
Detect repetitive LLM phrasing, uniform sentence rhythm, structural clichés, and voice-profile drift without sending text to an external service.
|
|
8
8
|
|
|
@@ -23,7 +23,7 @@ Detect repetitive LLM phrasing, uniform sentence rhythm, structural clichés, an
|
|
|
23
23
|
|
|
24
24
|
</div>
|
|
25
25
|
|
|
26
|
-
**humanizer-lint is an open-source natural-text and Markdown prose linter
|
|
26
|
+
**humanizer-lint is an open-source natural-text and Markdown prose linter. Native `Intl.Segmenter` provides local sentence and word boundaries; eight bundled anti-slop packs cover English, Indonesian, Spanish, Malay, French, German, Portuguese, and Mandarin. Other ISO 639-1 inputs use universal stylometric checks. It is a style validator, not an authorship detector.**
|
|
27
27
|
|
|
28
28
|
```sh
|
|
29
29
|
npx skills add yanstd888/humanizer-lint
|
|
@@ -52,13 +52,20 @@ It works locally with zero runtime dependencies. Instead of rewriting text throu
|
|
|
52
52
|
|
|
53
53
|
It can serve as a CLI text humanizer guardrail, automated writing style linter, or CI/CD documentation linter. The bundled rules flag overused AI clichés such as `delve` and `tapestry` without rewriting the source.
|
|
54
54
|
|
|
55
|
+
## Language support
|
|
56
|
+
|
|
57
|
+
| Tier | Languages | Checks |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| Tier 1 — rule packs | `en`, `id`, `es`, `ms`, `fr`, `de`, `pt`, `zh` | Universal stylometric metrics plus lexical, definitional-opening, and structural-cliché packs; Indonesian keeps its morphology rules. |
|
|
60
|
+
| Tier 2 — universal | `universal` or another ISO 639-1 code such as `tr`, `ja`, or `ar` | Universal stylometry through native `Intl.Segmenter`: burstiness, adjacent rhythm delta, adaptive MATTR, paragraph symmetry, repeated starters, and compression ratio. |
|
|
61
|
+
|
|
55
62
|
## What it does
|
|
56
63
|
|
|
57
64
|
`humanizer-lint` analyzes prose after removing or neutralizing common non-prose Markdown structures. It then combines lexical rules, sentence-length statistics, structural checks, Indonesian morphology checks, and an optional voice profile into a score from 0 to 100.
|
|
58
65
|
|
|
59
66
|
The project includes:
|
|
60
67
|
|
|
61
|
-
-
|
|
68
|
+
- Eight reviewable lexical and structural rule packs for EN, ID, ES, MS, FR, DE, PT, and ZH.
|
|
62
69
|
- Sentence-length burstiness, adjacent rhythm delta, short/long sentence ratios, and adaptive MATTR.
|
|
63
70
|
- Repetition checks based on paragraph symmetry, repeated sentence starters, and compression ratio.
|
|
64
71
|
- Indonesian nominalization, passive-voice, loanword, and translation-style opening checks.
|
|
@@ -192,12 +199,24 @@ No dependency installation or build step is required.
|
|
|
192
199
|
|
|
193
200
|
## Quick start
|
|
194
201
|
|
|
195
|
-
Analyze one file:
|
|
202
|
+
Analyze one file with auto-detection:
|
|
196
203
|
|
|
197
204
|
```sh
|
|
198
205
|
humanizer-lint --file draft.md --lang auto
|
|
199
206
|
```
|
|
200
207
|
|
|
208
|
+
Force universal stylometry for a language without a bundled pack:
|
|
209
|
+
|
|
210
|
+
```sh
|
|
211
|
+
humanizer-lint --file draft.md --lang universal
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Request an ISO 639-1 language directly:
|
|
215
|
+
|
|
216
|
+
```sh
|
|
217
|
+
humanizer-lint --file draft.md --lang es
|
|
218
|
+
```
|
|
219
|
+
|
|
201
220
|
Return machine-readable JSON:
|
|
202
221
|
|
|
203
222
|
```sh
|
|
@@ -265,7 +284,7 @@ Untuk contoh ini, skor naik dari **38** menjadi **100** setelah frasa template d
|
|
|
265
284
|
### Analyzer
|
|
266
285
|
|
|
267
286
|
```text
|
|
268
|
-
humanizer-lint (--file <path> | --stdin) [--lang
|
|
287
|
+
humanizer-lint (--file <path> | --stdin) [--lang auto|universal|<ISO-639-1>] [--profile <path>] [--json]
|
|
269
288
|
```
|
|
270
289
|
|
|
271
290
|
| Option | Required | Description |
|
package/SKILL.md
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: humanizer-lint
|
|
3
|
-
description: Deterministic
|
|
4
|
-
version: 1.
|
|
3
|
+
description: Deterministic universal multi-language stylometric analyzer and anti-slop prose linter. Uses native Intl.Segmenter plus eight built-in EN, ID, ES, MS, FR, DE, PT, and ZH lexical rule packs with a zero-dependency local Node.js CLI validator.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
license: MIT
|
|
6
6
|
compatibility: Node.js >= 18.3.0 (zero external dependencies)
|
|
7
7
|
allowed-tools: Bash(node:*) Read Write
|
|
8
8
|
metadata:
|
|
9
|
-
version: "1.
|
|
9
|
+
version: "1.2.0"
|
|
10
10
|
author: "yanstd888"
|
|
11
11
|
domain: "writing"
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
# Humanizer Lint
|
|
15
15
|
|
|
16
|
-
Use this skill when writing or revising
|
|
16
|
+
Use this skill when writing or revising prose that must avoid uniform agent rhythm, repeated stock phrases, and excessive translation-style structure. The local analyzer is mandatory. Native `Intl.Segmenter` handles sentence and word boundaries; EN, ID, ES, MS, FR, DE, PT, and ZH use bundled lexical packs, while other ISO 639-1 languages use universal stylometry. It uses only Node.js built-ins and sends no text over the network.
|
|
17
17
|
|
|
18
18
|
## When to use
|
|
19
19
|
|
|
@@ -34,6 +34,8 @@ Use this skill for requests such as:
|
|
|
34
34
|
- "increase sentence burstiness and perplexity"
|
|
35
35
|
- "lint markdown documentation prose"
|
|
36
36
|
- "humanizer bahasa Indonesia"
|
|
37
|
+
- "humanize Spanish, Malay, French, German, Portuguese, or Chinese prose"
|
|
38
|
+
- "check Japanese, Arabic, or another language with universal stylometry"
|
|
37
39
|
- "perbaiki tulisan AI yang kaku"
|
|
38
40
|
- "match author voice profile"
|
|
39
41
|
|
|
@@ -50,7 +52,7 @@ These intents apply across Claude Code, Cursor, Windsurf, Cline, Codex, and Gemi
|
|
|
50
52
|
### 1. Resolve context
|
|
51
53
|
|
|
52
54
|
1. Resolve `<skill_dir>` from this `SKILL.md`; never assume the current working directory.
|
|
53
|
-
2. Determine `
|
|
55
|
+
2. Determine `auto`, `universal`, or a two-letter ISO 639-1 code. `auto` selects a bundled pack when evidence is strong; otherwise it uses `universal`.
|
|
54
56
|
3. If `<skill_dir>/profiles/custom-voice.json` exists, pass it with `--profile`. Otherwise use the bundled default profile.
|
|
55
57
|
4. Keep source facts, names, numbers, dates, quotations, citations, and technical terms unchanged unless the user explicitly requests a factual edit.
|
|
56
58
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "humanizer-lint",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Universal multi-language stylometric linter and anti-AI-slop diagnostic engine with native Intl.Segmenter",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
7
7
|
"node": ">=18.3.0"
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"stylometry",
|
|
37
37
|
"burstiness",
|
|
38
38
|
"mattr",
|
|
39
|
+
"multilingual-nlp",
|
|
39
40
|
"indonesian-nlp",
|
|
40
41
|
"claude-code",
|
|
41
42
|
"cursor-skill",
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
{
|
|
2
|
+
"language": "de",
|
|
3
|
+
"stopwords": [
|
|
4
|
+
"der",
|
|
5
|
+
"die",
|
|
6
|
+
"und",
|
|
7
|
+
"in",
|
|
8
|
+
"den",
|
|
9
|
+
"von",
|
|
10
|
+
"zu",
|
|
11
|
+
"das",
|
|
12
|
+
"mit",
|
|
13
|
+
"sich",
|
|
14
|
+
"des",
|
|
15
|
+
"auf",
|
|
16
|
+
"für",
|
|
17
|
+
"ist",
|
|
18
|
+
"im",
|
|
19
|
+
"dem",
|
|
20
|
+
"nicht",
|
|
21
|
+
"ein",
|
|
22
|
+
"eine",
|
|
23
|
+
"als"
|
|
24
|
+
],
|
|
25
|
+
"patterns": [
|
|
26
|
+
{
|
|
27
|
+
"id": "DE001",
|
|
28
|
+
"type": "SLOP_PHRASE",
|
|
29
|
+
"pattern": "in\\s+der\\s+heutigen\\s+schnelllebigen\\s+Welt",
|
|
30
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "DE002",
|
|
34
|
+
"type": "SLOP_PHRASE",
|
|
35
|
+
"pattern": "es\\s+ist\\s+wichtig\\s+zu\\s+beachten",
|
|
36
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "DE003",
|
|
40
|
+
"type": "SLOP_PHRASE",
|
|
41
|
+
"pattern": "zusammenfassend\\s+lässt\\s+sich\\s+sagen",
|
|
42
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "DE004",
|
|
46
|
+
"type": "SLOP_PHRASE",
|
|
47
|
+
"pattern": "darüber\\s+hinaus",
|
|
48
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "DE005",
|
|
52
|
+
"type": "SLOP_PHRASE",
|
|
53
|
+
"pattern": "nicht\\s+zuletzt",
|
|
54
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "DE006",
|
|
58
|
+
"type": "SLOP_PHRASE",
|
|
59
|
+
"pattern": "spielt\\s+eine\\s+entscheidende\\s+Rolle",
|
|
60
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "DE007",
|
|
64
|
+
"type": "SLOP_PHRASE",
|
|
65
|
+
"pattern": "ein\\s+Beweis\\s+dafür",
|
|
66
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "DE008",
|
|
70
|
+
"type": "SLOP_PHRASE",
|
|
71
|
+
"pattern": "in\\s+einer\\s+sich\\s+ständig\\s+verändernden",
|
|
72
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "DE009",
|
|
76
|
+
"type": "SLOP_PHRASE",
|
|
77
|
+
"pattern": "nicht\\s+nur",
|
|
78
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "DE010",
|
|
82
|
+
"type": "SLOP_PHRASE",
|
|
83
|
+
"pattern": "sondern\\s+auch",
|
|
84
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "DE011",
|
|
88
|
+
"type": "SLOP_PHRASE",
|
|
89
|
+
"pattern": "im\\s+digitalen\\s+Zeitalter",
|
|
90
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "DE012",
|
|
94
|
+
"type": "SLOP_PHRASE",
|
|
95
|
+
"pattern": "es\\s+lässt\\s+sich\\s+nicht\\s+leugnen",
|
|
96
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "DE013",
|
|
100
|
+
"type": "SLOP_PHRASE",
|
|
101
|
+
"pattern": "es\\s+ist\\s+erwähnenswert",
|
|
102
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "DE014",
|
|
106
|
+
"type": "SLOP_PHRASE",
|
|
107
|
+
"pattern": "in\\s+der\\s+heutigen\\s+Zeit",
|
|
108
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "DE015",
|
|
112
|
+
"type": "SLOP_PHRASE",
|
|
113
|
+
"pattern": "eine\\s+Vielzahl\\s+von",
|
|
114
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "DE016",
|
|
118
|
+
"type": "SLOP_PHRASE",
|
|
119
|
+
"pattern": "in\\s+der\\s+modernen\\s+Welt",
|
|
120
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "DE017",
|
|
124
|
+
"type": "SLOP_PHRASE",
|
|
125
|
+
"pattern": "den\\s+Weg\\s+ebnen",
|
|
126
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "DE018",
|
|
130
|
+
"type": "SLOP_PHRASE",
|
|
131
|
+
"pattern": "die\\s+Spielregeln\\s+ändern",
|
|
132
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"id": "DE019",
|
|
136
|
+
"type": "SLOP_PHRASE",
|
|
137
|
+
"pattern": "nahtlos",
|
|
138
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "DE020",
|
|
142
|
+
"type": "SLOP_PHRASE",
|
|
143
|
+
"pattern": "ganzheitlicher\\s+Ansatz",
|
|
144
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"id": "DE021",
|
|
148
|
+
"type": "SLOP_PHRASE",
|
|
149
|
+
"pattern": "wertvolle\\s+Einblicke",
|
|
150
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"id": "DE022",
|
|
154
|
+
"type": "SLOP_PHRASE",
|
|
155
|
+
"pattern": "in\\s+der\\s+sich\\s+entwickelnden\\s+Landschaft",
|
|
156
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "DE023",
|
|
160
|
+
"type": "SLOP_PHRASE",
|
|
161
|
+
"pattern": "am\\s+Ende\\s+des\\s+Tages",
|
|
162
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "DE024",
|
|
166
|
+
"type": "SLOP_PHRASE",
|
|
167
|
+
"pattern": "ohne\\s+Zweifel",
|
|
168
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"id": "DE025",
|
|
172
|
+
"type": "SLOP_PHRASE",
|
|
173
|
+
"pattern": "von\\s+entscheidender\\s+Bedeutung",
|
|
174
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "DE026",
|
|
178
|
+
"type": "DEFINITIONAL_OPENING",
|
|
179
|
+
"pattern": "^(?:Im Kontext von|Im Bereich von|In der Welt von) [\\w\\s]+,",
|
|
180
|
+
"scope": "paragraph-start",
|
|
181
|
+
"fixInstruction": "Start with the specific subject or event instead of a generic framing clause."
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"id": "DE027",
|
|
185
|
+
"type": "STRUCTURAL_CLICHE",
|
|
186
|
+
"pattern": "\\bnicht\\s+nur\\b[\\s\\S]{0,100}?\\bsondern\\s+auch\\b",
|
|
187
|
+
"fixInstruction": "State both claims directly without the stock paired construction."
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
}
|
package/rules/en-slop.json
CHANGED
|
@@ -1,49 +1,50 @@
|
|
|
1
|
-
{
|
|
2
|
-
"language": "en",
|
|
3
|
-
"
|
|
4
|
-
|
|
5
|
-
{"id":"
|
|
6
|
-
{"id":"
|
|
7
|
-
{"id":"
|
|
8
|
-
{"id":"
|
|
9
|
-
{"id":"
|
|
10
|
-
{"id":"
|
|
11
|
-
{"id":"
|
|
12
|
-
{"id":"
|
|
13
|
-
{"id":"
|
|
14
|
-
{"id":"
|
|
15
|
-
{"id":"
|
|
16
|
-
{"id":"
|
|
17
|
-
{"id":"
|
|
18
|
-
{"id":"
|
|
19
|
-
{"id":"
|
|
20
|
-
{"id":"
|
|
21
|
-
{"id":"
|
|
22
|
-
{"id":"
|
|
23
|
-
{"id":"
|
|
24
|
-
{"id":"
|
|
25
|
-
{"id":"
|
|
26
|
-
{"id":"
|
|
27
|
-
{"id":"
|
|
28
|
-
{"id":"
|
|
29
|
-
{"id":"
|
|
30
|
-
{"id":"
|
|
31
|
-
{"id":"
|
|
32
|
-
{"id":"
|
|
33
|
-
{"id":"
|
|
34
|
-
{"id":"
|
|
35
|
-
{"id":"
|
|
36
|
-
{"id":"
|
|
37
|
-
{"id":"
|
|
38
|
-
{"id":"
|
|
39
|
-
{"id":"
|
|
40
|
-
{"id":"
|
|
41
|
-
{"id":"
|
|
42
|
-
{"id":"
|
|
43
|
-
{"id":"
|
|
44
|
-
{"id":"
|
|
45
|
-
{"id":"
|
|
46
|
-
{"id":"
|
|
47
|
-
{"id":"
|
|
48
|
-
|
|
49
|
-
|
|
1
|
+
{
|
|
2
|
+
"language": "en",
|
|
3
|
+
"stopwords": ["the", "and", "of", "to", "in", "is", "that", "for", "it", "with", "as", "on", "are", "this", "by", "be", "at", "or", "from", "an"],
|
|
4
|
+
"patterns": [
|
|
5
|
+
{"id":"EN001","type":"SLOP_PHRASE","pattern":"\\bdelve\\b","fixInstruction":"Name the exact action or subject instead."},
|
|
6
|
+
{"id":"EN002","type":"SLOP_PHRASE","pattern":"\\btapestry\\b","fixInstruction":"Replace the metaphor with a concrete description."},
|
|
7
|
+
{"id":"EN003","type":"SLOP_PHRASE","pattern":"\\btestament\\b","fixInstruction":"State the evidence directly."},
|
|
8
|
+
{"id":"EN004","type":"SLOP_PHRASE","pattern":"\\bunderscore(?:s|d|ing)?\\b","fixInstruction":"State what the evidence shows."},
|
|
9
|
+
{"id":"EN005","type":"SLOP_PHRASE","pattern":"\\bpivotal\\b","fixInstruction":"Describe the actual consequence without inflated significance."},
|
|
10
|
+
{"id":"EN006","type":"SLOP_PHRASE","pattern":"\\bcrucial\\b","fixInstruction":"Explain why the item matters in this context."},
|
|
11
|
+
{"id":"EN007","type":"SLOP_PHRASE","pattern":"\\bfoster(?:s|ed|ing)?\\b","fixInstruction":"Name the concrete behavior or outcome."},
|
|
12
|
+
{"id":"EN008","type":"SLOP_PHRASE","pattern":"\\blandscape\\b","fixInstruction":"Name the field or conditions directly."},
|
|
13
|
+
{"id":"EN009","type":"SLOP_PHRASE","pattern":"\\brealm\\b","fixInstruction":"Name the actual domain."},
|
|
14
|
+
{"id":"EN010","type":"SLOP_PHRASE","pattern":"\\bbeacon\\b","fixInstruction":"Replace the metaphor with a supported fact."},
|
|
15
|
+
{"id":"EN011","type":"SLOP_PHRASE","pattern":"\\bsymphony\\b","fixInstruction":"Describe the relationship without a decorative metaphor."},
|
|
16
|
+
{"id":"EN012","type":"SLOP_PHRASE","pattern":"\\bunlock(?:s|ed|ing)?\\b","fixInstruction":"Name what becomes possible and how."},
|
|
17
|
+
{"id":"EN013","type":"SLOP_PHRASE","pattern":"\\belevate(?:s|d|ing)?\\b","fixInstruction":"State the measurable improvement."},
|
|
18
|
+
{"id":"EN014","type":"SLOP_PHRASE","pattern":"\\bunleash(?:es|ed|ing)?\\b","fixInstruction":"Describe the actual capability or result."},
|
|
19
|
+
{"id":"EN015","type":"SLOP_PHRASE","pattern":"\\bgame[- ]changer\\b","fixInstruction":"State the specific change and its effect."},
|
|
20
|
+
{"id":"EN016","type":"SLOP_PHRASE","pattern":"\\bparadigm shift\\b","fixInstruction":"Describe what changed in concrete terms."},
|
|
21
|
+
{"id":"EN017","type":"SLOP_PHRASE","pattern":"\\bmoreover\\b","fixInstruction":"Connect the sentences by their actual relationship."},
|
|
22
|
+
{"id":"EN018","type":"SLOP_PHRASE","pattern":"\\bfurthermore\\b","fixInstruction":"Connect the sentences by their actual relationship."},
|
|
23
|
+
{"id":"EN019","type":"SLOP_PHRASE","pattern":"\\bin conclusion\\b","fixInstruction":"End on the final concrete point."},
|
|
24
|
+
{"id":"EN020","type":"SLOP_PHRASE","pattern":"\\bit is important to note\\b","fixInstruction":"Remove the announcement and state the fact."},
|
|
25
|
+
{"id":"EN021","type":"SLOP_PHRASE","pattern":"\\bit is worth noting\\b","fixInstruction":"Remove the announcement and state the fact."},
|
|
26
|
+
{"id":"EN022","type":"SLOP_PHRASE","pattern":"\\bin today['’]s fast-paced\\b","fixInstruction":"Name the current condition precisely."},
|
|
27
|
+
{"id":"EN023","type":"SLOP_PHRASE","pattern":"\\bever-evolving\\b","fixInstruction":"Name the change and its time frame."},
|
|
28
|
+
{"id":"EN024","type":"SLOP_PHRASE","pattern":"\\bseamless(?:ly)?\\b","fixInstruction":"Describe the missing step, delay, or transition precisely."},
|
|
29
|
+
{"id":"EN025","type":"SLOP_PHRASE","pattern":"\\brobust\\b","fixInstruction":"Name the failure mode or capacity the system handles."},
|
|
30
|
+
{"id":"EN026","type":"SLOP_PHRASE","pattern":"\\bcutting[- ]edge\\b","fixInstruction":"Name the specific technical capability."},
|
|
31
|
+
{"id":"EN027","type":"SLOP_PHRASE","pattern":"\\brevolutionary\\b","fixInstruction":"Describe the concrete difference without promotional language."},
|
|
32
|
+
{"id":"EN028","type":"SLOP_PHRASE","pattern":"\\bnext[- ]generation\\b","fixInstruction":"Name the new behavior or version."},
|
|
33
|
+
{"id":"EN029","type":"SLOP_PHRASE","pattern":"\\btransformative\\b","fixInstruction":"State what changed and for whom."},
|
|
34
|
+
{"id":"EN030","type":"SLOP_PHRASE","pattern":"\\bjourney\\b","fixInstruction":"Name the process or sequence directly."},
|
|
35
|
+
{"id":"EN031","type":"SLOP_PHRASE","pattern":"\\bempower(?:s|ed|ing)?\\b","fixInstruction":"Name the action users can now take."},
|
|
36
|
+
{"id":"EN032","type":"SLOP_PHRASE","pattern":"\\bharness(?:es|ed|ing)?\\b","fixInstruction":"State how the resource is used."},
|
|
37
|
+
{"id":"EN033","type":"SLOP_PHRASE","pattern":"\\bnavigate(?:s|d|ing)? the complexities\\b","fixInstruction":"Name the specific difficulty and response."},
|
|
38
|
+
{"id":"EN034","type":"SLOP_PHRASE","pattern":"\\bholistic approach\\b","fixInstruction":"List the parts included in the approach."},
|
|
39
|
+
{"id":"EN035","type":"SLOP_PHRASE","pattern":"\\bvaluable insights\\b","fixInstruction":"State the finding itself."},
|
|
40
|
+
{"id":"EN036","type":"SLOP_PHRASE","pattern":"\\bplays? a (?:key|vital|crucial) role\\b","fixInstruction":"Describe the action or consequence directly."},
|
|
41
|
+
{"id":"EN037","type":"SLOP_PHRASE","pattern":"\\bthe future looks bright\\b","fixInstruction":"End on a supported plan or concrete fact."},
|
|
42
|
+
{"id":"EN038","type":"SLOP_PHRASE","pattern":"\\bexciting times (?:lie|are) ahead\\b","fixInstruction":"Replace optimism with a supported next step."},
|
|
43
|
+
{"id":"EN039","type":"SLOP_PHRASE","pattern":"\\bstands as a testament\\b","fixInstruction":"State the evidence directly."},
|
|
44
|
+
{"id":"EN040","type":"SLOP_PHRASE","pattern":"\\bmarking a (?:pivotal|significant) moment\\b","fixInstruction":"State what happened and its direct effect."},
|
|
45
|
+
{"id":"EN041","type":"STRUCTURAL_CLICHE","pattern":",\\s+[a-z]+ing\\s+(?:a|the|its|their|this|that)\\s+[a-z]+","fixInstruction":"Split or rewrite the participial tail as a supported clause."},
|
|
46
|
+
{"id":"EN042","type":"STRUCTURAL_CLICHE","pattern":"\\bnot only[\\s\\S]{0,100}?but also\\b","fixInstruction":"State both claims directly without the binary formula."},
|
|
47
|
+
{"id":"EN043","type":"STRUCTURAL_CLICHE","pattern":"\\bit['’]s not just about[\\s\\S]{0,100}?it['’]s about\\b","fixInstruction":"State the positive claim directly."},
|
|
48
|
+
{"id":"EN044","type":"STRUCTURAL_CLICHE","pattern":"(?:—|--)","maxOccurrences":1,"perWords":250,"fixInstruction":"Replace repeated dashes with the punctuation that matches the relationship."}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
{
|
|
2
|
+
"language": "es",
|
|
3
|
+
"stopwords": [
|
|
4
|
+
"de",
|
|
5
|
+
"la",
|
|
6
|
+
"que",
|
|
7
|
+
"el",
|
|
8
|
+
"en",
|
|
9
|
+
"los",
|
|
10
|
+
"del",
|
|
11
|
+
"las",
|
|
12
|
+
"por",
|
|
13
|
+
"un",
|
|
14
|
+
"para",
|
|
15
|
+
"con",
|
|
16
|
+
"no",
|
|
17
|
+
"una",
|
|
18
|
+
"su",
|
|
19
|
+
"al",
|
|
20
|
+
"es",
|
|
21
|
+
"como",
|
|
22
|
+
"más",
|
|
23
|
+
"pero"
|
|
24
|
+
],
|
|
25
|
+
"patterns": [
|
|
26
|
+
{
|
|
27
|
+
"id": "ES001",
|
|
28
|
+
"type": "SLOP_PHRASE",
|
|
29
|
+
"pattern": "en\\s+el\\s+vertiginoso\\s+mundo\\s+actual",
|
|
30
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "ES002",
|
|
34
|
+
"type": "SLOP_PHRASE",
|
|
35
|
+
"pattern": "en\\s+la\\s+era\\s+digital\\s+actual",
|
|
36
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "ES003",
|
|
40
|
+
"type": "SLOP_PHRASE",
|
|
41
|
+
"pattern": "cabe\\s+destacar\\s+que",
|
|
42
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "ES004",
|
|
46
|
+
"type": "SLOP_PHRASE",
|
|
47
|
+
"pattern": "es\\s+importante\\s+recordar",
|
|
48
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "ES005",
|
|
52
|
+
"type": "SLOP_PHRASE",
|
|
53
|
+
"pattern": "no\\s+se\\s+puede\\s+negar\\s+que",
|
|
54
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "ES006",
|
|
58
|
+
"type": "SLOP_PHRASE",
|
|
59
|
+
"pattern": "un\\s+tapiz\\s+de",
|
|
60
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "ES007",
|
|
64
|
+
"type": "SLOP_PHRASE",
|
|
65
|
+
"pattern": "en\\s+conclusión",
|
|
66
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "ES008",
|
|
70
|
+
"type": "SLOP_PHRASE",
|
|
71
|
+
"pattern": "en\\s+resumen",
|
|
72
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "ES009",
|
|
76
|
+
"type": "SLOP_PHRASE",
|
|
77
|
+
"pattern": "además",
|
|
78
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "ES010",
|
|
82
|
+
"type": "SLOP_PHRASE",
|
|
83
|
+
"pattern": "por\\s+otro\\s+lado",
|
|
84
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "ES011",
|
|
88
|
+
"type": "SLOP_PHRASE",
|
|
89
|
+
"pattern": "sin\\s+lugar\\s+a\\s+dudas",
|
|
90
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "ES012",
|
|
94
|
+
"type": "SLOP_PHRASE",
|
|
95
|
+
"pattern": "juega\\s+un\\s+papel\\s+crucial",
|
|
96
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "ES013",
|
|
100
|
+
"type": "SLOP_PHRASE",
|
|
101
|
+
"pattern": "un\\s+testimonio\\s+de",
|
|
102
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "ES014",
|
|
106
|
+
"type": "SLOP_PHRASE",
|
|
107
|
+
"pattern": "sumergirse\\s+en",
|
|
108
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "ES015",
|
|
112
|
+
"type": "SLOP_PHRASE",
|
|
113
|
+
"pattern": "no\\s+solo",
|
|
114
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "ES016",
|
|
118
|
+
"type": "SLOP_PHRASE",
|
|
119
|
+
"pattern": "sino\\s+también",
|
|
120
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "ES017",
|
|
124
|
+
"type": "SLOP_PHRASE",
|
|
125
|
+
"pattern": "en\\s+el\\s+panorama\\s+actual",
|
|
126
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "ES018",
|
|
130
|
+
"type": "SLOP_PHRASE",
|
|
131
|
+
"pattern": "es\\s+fundamental",
|
|
132
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"id": "ES019",
|
|
136
|
+
"type": "SLOP_PHRASE",
|
|
137
|
+
"pattern": "vale\\s+la\\s+pena\\s+señalar",
|
|
138
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "ES020",
|
|
142
|
+
"type": "SLOP_PHRASE",
|
|
143
|
+
"pattern": "a\\s+medida\\s+que",
|
|
144
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"id": "ES021",
|
|
148
|
+
"type": "SLOP_PHRASE",
|
|
149
|
+
"pattern": "en\\s+última\\s+instancia",
|
|
150
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"id": "ES022",
|
|
154
|
+
"type": "SLOP_PHRASE",
|
|
155
|
+
"pattern": "en\\s+un\\s+mundo\\s+en\\s+constante\\s+evolución",
|
|
156
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "ES023",
|
|
160
|
+
"type": "SLOP_PHRASE",
|
|
161
|
+
"pattern": "abre\\s+la\\s+puerta\\s+a",
|
|
162
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "ES024",
|
|
166
|
+
"type": "SLOP_PHRASE",
|
|
167
|
+
"pattern": "cambiar\\s+las\\s+reglas\\s+del\\s+juego",
|
|
168
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"id": "ES025",
|
|
172
|
+
"type": "SLOP_PHRASE",
|
|
173
|
+
"pattern": "sin\\s+problemas",
|
|
174
|
+
"fixInstruction": "Replace this stock phrase with the concrete fact, actor, or action."
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "ES026",
|
|
178
|
+
"type": "DEFINITIONAL_OPENING",
|
|
179
|
+
"pattern": "^(?:En el contexto de|En el ámbito de|En el mundo de) [\\w\\s]+,",
|
|
180
|
+
"scope": "paragraph-start",
|
|
181
|
+
"fixInstruction": "Start with the specific subject or event instead of a generic framing clause."
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"id": "ES027",
|
|
185
|
+
"type": "STRUCTURAL_CLICHE",
|
|
186
|
+
"pattern": "\\bno\\s+solo\\b[\\s\\S]{0,100}?\\bsino\\s+también\\b",
|
|
187
|
+
"fixInstruction": "State both claims directly without the stock paired construction."
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
}
|