simple_english 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7c05cc78b762e2b44f4c841ef5a78537e91d9bcd408ed8739fcc00f3538f14eb
4
+ data.tar.gz: 9abac46821a9260b3ec7312a1c258464e08a943262eaccab893383104479dcee
5
+ SHA512:
6
+ metadata.gz: 6c4ac5c79f9a62c848ae37977dfb48ec2b815b27e5a38af7ab448a489206b14b8b26dec4f560b5115dd5be3c3688bfed254ebecbfd5e57c83c84d4a545367780
7
+ data.tar.gz: 699067a5a056a54186fe40d62ee17dd358492409dd86a76fc17cd2e1be8d110ee1147daa3ecb5f4d8b995cfd98f4108e96adbf6ed96603a43566ee820fd48729
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 tony.hsu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,193 @@
1
+ # simple_english
2
+
3
+ > Write for human readers, not for reviewers or another AI.
4
+
5
+ AI writes your docs and code comments in seconds. This linter cuts
6
+ the slop it leaves behind. Every finding says what to write
7
+ instead.
8
+
9
+ ```console
10
+ $ printf 'You should leverage this tool in order to make sure that your docs are readable.' > note.md
11
+ $ se note.md
12
+ note.md:1: [SE_MODAL_RESTRICTED] Use can, will, or must. State the requirement exactly.
13
+ note.md:1: [SE_SLOP_IN_ORDER_TO] Write "to".
14
+ note.md:1: [SE_SLOP_LEVERAGE] Write "use".
15
+ ```
16
+
17
+ Markdown prose plus code comments in Python, Ruby, JavaScript,
18
+ TypeScript, Go, Rust, Java, C#, Kotlin, bash, and YAML. Output as plain
19
+ text, JSON, or SARIF.
20
+
21
+ ## The rules
22
+
23
+ - **Voice:** say who does the action.
24
+ - **Tense:** simple tenses only, no present perfect.
25
+ - **Modals:** `can`, `will`, `must` only.
26
+ - **Punctuation:** no em-dashes, no semicolons.
27
+ - **Contractions:** write every word in full.
28
+ - **Sentence shape:** condition before command, no `-ing` phrase after a comma.
29
+ - **Word choice:** about 50 substitution rules, from `leverage` to `in conclusion`. `make sure that` keeps its "that".
30
+ - **Code comments:** same pattern rules, with line and column.
31
+ - **Counts (Markdown only):** 20 words per sentence in list items, 25 in paragraphs, six sentences per paragraph at most.
32
+
33
+ The full list, with a wrong and a right example for each rule:
34
+ [docs/RULES.md](docs/RULES.md).
35
+
36
+ ## Install
37
+
38
+ **Requirements:** Ruby 3.3 or newer, Java 11 or newer for
39
+ LanguageTool. The Docker image bundles both.
40
+
41
+ ### Ruby gem
42
+
43
+ ```bash
44
+ gem install simple_english
45
+ se setup # run once: downloads LanguageTool, locates Java, verifies both
46
+ se README.md
47
+ ```
48
+
49
+ `se setup` puts LanguageTool into `~/.cache/se` and touches nothing
50
+ in your shell profile. Pass `--dir PATH` or set `SE_CACHE_DIR` to
51
+ put the cache somewhere else. If `java` is not on PATH, set `SE_JAVA`
52
+ to your java binary.
53
+
54
+ ### Container
55
+
56
+ The image holds Ruby, Java, and LanguageTool, so it needs no setup:
57
+
58
+ ```bash
59
+ docker run -v "$PWD":/work ghcr.io/tonycthsu/simple-english:latest docs/
60
+ ```
61
+
62
+ Or keep the daemon in a container and lint through it:
63
+
64
+ ```bash
65
+ docker run -d --name se-daemon -p 8181:8181 ghcr.io/tonycthsu/simple-english:latest serve
66
+ SE_SERVER_URL=http://localhost:8181 se lint docs/
67
+ ```
68
+
69
+ ### Git repository
70
+
71
+ Run `bundle install`, then use `bin/se`.
72
+
73
+ ## Usage
74
+
75
+ Lint files, directories, or stdin. From a checkout, the same commands
76
+ run through `bin/se`:
77
+
78
+ ```bash
79
+ se README.md
80
+ se docs/ # every .md, .py, .rb, .yaml, .yml, ... under docs/
81
+ se - < notes.md # stdin (Markdown)
82
+ ```
83
+
84
+ Lint only what changed:
85
+
86
+ ```bash
87
+ git diff --name-only --diff-filter=ACM main | xargs se
88
+ ```
89
+
90
+ ### Outputs
91
+
92
+ Findings print as `file:line: [RULE_ID] message`. Code-comment findings also carry a column in `--format json` and `--format sarif`:
93
+
94
+ ```bash
95
+ se --format json docs/
96
+ se --format sarif src/ > results.sarif
97
+ ```
98
+
99
+ ### Exit codes
100
+
101
+ - `0`: no findings
102
+ - `1`: findings
103
+ - `2`: setup error
104
+
105
+ ### CI
106
+
107
+ Gate the docs in the pull request that changes them. The plain run
108
+ fails the build on findings, and the SARIF report puts them inline:
109
+
110
+ ```yaml
111
+ name: lint-docs
112
+ on: [pull_request]
113
+ permissions:
114
+ security-events: write
115
+ jobs:
116
+ lint:
117
+ runs-on: ubuntu-latest
118
+ steps:
119
+ - uses: actions/checkout@v7
120
+ - uses: ruby/setup-ruby@v1
121
+ - run: gem install simple_english
122
+ - run: se setup
123
+ - run: se --format sarif . > lint.sarif
124
+ - run: se .
125
+ - uses: github/codeql-action/upload-sarif@v3
126
+ with:
127
+ sarif_file: lint.sarif
128
+ if: always()
129
+ ```
130
+
131
+ ## Config and suppressions
132
+
133
+ ### Config file
134
+
135
+ `.simple-english.yml` in the working directory:
136
+
137
+ ```yaml
138
+ ignore:
139
+ - vendor/**
140
+ disabled-rules:
141
+ - SE_NO_EMDASH
142
+ ```
143
+
144
+ `ignore` globs: `**` crosses directories, `*` stays in one segment.
145
+
146
+ ### Inline suppressions
147
+
148
+ A line containing `se: ignore` suppresses findings reported on that
149
+ line. Use `se: ignore=RULE1,RULE2` to scope it to rules. Pattern
150
+ findings cite the line of the match, so put the directive on the line the
151
+ finding reports.
152
+
153
+ In Markdown:
154
+
155
+ ```markdown
156
+ The daemon keeps it's own lock. <!-- se: ignore=SE_NO_CONTRACTIONS -->
157
+ ```
158
+
159
+ In a code comment:
160
+
161
+ ```ruby
162
+ # Don't touch this constant. se: ignore=SE_NO_CONTRACTIONS
163
+ ```
164
+
165
+ ## The daemon
166
+
167
+ The first lint starts the daemon automatically (about 15 seconds
168
+ once, then you need Java and one run of `se setup`). Later lints hit
169
+ the running daemon and take milliseconds. To start it ahead of time:
170
+
171
+ ```bash
172
+ se serve --port 8181 &
173
+ ```
174
+
175
+ Any tool or language can lint through its HTTP API:
176
+
177
+ ```bash
178
+ curl -d "text=Don't do this." http://localhost:8181/lint
179
+ # [{"line":1,"column":null,"rule":"SE_NO_CONTRACTIONS","message":"..."}]
180
+ ```
181
+
182
+ The full wire format: [docs/DAEMON.md](docs/DAEMON.md).
183
+
184
+ ## Scope
185
+
186
+ The rule set comes from the Plain-mode rules of the MIT-licensed
187
+ SimpleEnglish project. This tool does not check ASD-STE100 compliance.
188
+ This repo holds no ASD-STE100 text. If you need full compliance, read
189
+ the free standard at <https://www.asd-ste100.org/>.
190
+
191
+ ## Develop
192
+
193
+ To change the linter, add rules, or run the tests, read [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md).
data/bin/se ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "../lib/simple_english/cli"
5
+
6
+ exit(SimpleEnglish::CLI.start(ARGV) || 0)
data/docs/RULES.md ADDED
@@ -0,0 +1,496 @@
1
+ # Rules
2
+
3
+ Generated by `bin/render-rules`. Do not edit by hand. The source
4
+ of truth is `rules/simple-english.xml` and
5
+ `lib/simple_english/counts.rb`.
6
+
7
+ ## Pattern rules
8
+
9
+ ### SE_NO_CONTRACTIONS: No contractions
10
+
11
+ Write the words in full. No contractions.
12
+
13
+ - Wrong: You don't need this file.
14
+ - Right: You do not need this file.
15
+
16
+ ### SE_NO_SEMICOLON: No semicolons
17
+
18
+ Write two sentences, or name the relation.
19
+
20
+ - Wrong: Start the tool; then read the log.
21
+ - Right: Start the tool. Then read the log.
22
+
23
+ ### SE_NO_EMDASH: No em-dashes
24
+
25
+ Write two sentences, or use a comma.
26
+
27
+ - Wrong: The tool is fast—it also works.
28
+ - Right: The tool is fast. It also works.
29
+
30
+ ### SE_MODAL_RESTRICTED: Only can, will, must
31
+
32
+ Use can, will, or must. State the requirement exactly.
33
+
34
+ - Wrong: You should restart the service.
35
+ - Right: You must restart the service.
36
+
37
+ ### SE_ACTIVE_VOICE: Active voice
38
+
39
+ Use the active voice. Say who does the action.
40
+
41
+ - Wrong: The log was written by the worker.
42
+ - Right: The worker wrote the log.
43
+
44
+ ### SE_PRESENT_PERFECT: Simple tenses only
45
+
46
+ Use the simple past. Say when it happened.
47
+
48
+ - Wrong: The job has completed.
49
+ - Right: The job completed.
50
+
51
+ ### SE_ING_AFTER_COMMA: No -ing after a comma
52
+
53
+ Start a new sentence instead of the -ing phrase.
54
+
55
+ - Wrong: The tool runs, making it easy.
56
+ - Right: The tool runs. It is easy.
57
+
58
+ ### SE_KEEP_THAT: make sure that
59
+
60
+ Write "make sure that".
61
+
62
+ - Wrong: Make sure the file exists.
63
+ - Right: Make sure that the file exists.
64
+
65
+ ### SE_CONDITION_FIRST: Condition before command
66
+
67
+ Put the condition first: "If the build fails, read the log."
68
+
69
+ - Wrong: Read the log if the build fails.
70
+ - Right: If the build fails, read the log.
71
+
72
+ ### SE_SLOP_LEVERAGE: use, not leverage
73
+
74
+ Write use.
75
+
76
+ - Wrong: Utilize the registry file.
77
+ - Right: Use the registry file.
78
+
79
+ ### SE_SLOP_IN_ORDER_TO: to, not in order to
80
+
81
+ Write to.
82
+
83
+ - Wrong: Run the tool in order to build the file.
84
+ - Right: Run the tool to build the file.
85
+
86
+ ### SE_SLOP_PRIOR_TO: before, not prior to
87
+
88
+ Write before.
89
+
90
+ - Wrong: Read the file prior to the upgrade.
91
+ - Right: Read the file before the upgrade.
92
+
93
+ ### SE_SLOP_ENSURE: make sure that, not ensure
94
+
95
+ Write make sure that.
96
+
97
+ - Wrong: Ensure the file exists.
98
+ - Right: Make sure that the file exists.
99
+
100
+ ### SE_SLOP_FUNCTIONALITY: function, not functionality
101
+
102
+ Write function or feature.
103
+
104
+ - Wrong: Add the functionality first.
105
+ - Right: Add the function first.
106
+
107
+ ### SE_SLOP_ENABLES_YOU: you can, not enables you to
108
+
109
+ Write you can.
110
+
111
+ - Wrong: The tool enables you to build the file.
112
+ - Right: You can build the file with the tool.
113
+
114
+ ### SE_SLOP_FACILITATE: help, not facilitate
115
+
116
+ Write help or make possible.
117
+
118
+ - Wrong: The tool facilitates the build.
119
+ - Right: The tool helps the build.
120
+
121
+ ### SE_SLOP_DELVE: read, not delve into
122
+
123
+ Write read or examine.
124
+
125
+ - Wrong: Delve into the config file.
126
+ - Right: Read the config file.
127
+
128
+ ### SE_SLOP_WHEN_IT_COMES: for, not when it comes to
129
+
130
+ Write for.
131
+
132
+ - Wrong: When it comes to builds, use the tool.
133
+ - Right: For builds, use the tool.
134
+
135
+ ### SE_SLOP_IN_THE_EVENT: if, not in the event that
136
+
137
+ Write if.
138
+
139
+ - Wrong: In the event that the build fails, read the log.
140
+ - Right: If the build fails, read the log.
141
+
142
+ ### SE_SLOP_DUE_TO_FACT: because, not due to the fact that
143
+
144
+ Write because.
145
+
146
+ - Wrong: Due to the fact that the port is closed, the tool fails.
147
+ - Right: Because the port is not open, the tool fails.
148
+
149
+ ### SE_SLOP_AND_OR: no and/or
150
+
151
+ Pick one. Or write "X, or Y, or both".
152
+
153
+ - Wrong: Set the flag and/or the port.
154
+ - Right: Set the flag, or the port, or both.
155
+
156
+ ### SE_SLOP_LATIN: no Latin abbreviations
157
+
158
+ #### e.g.
159
+
160
+ Write "for example", or name the items.
161
+
162
+ - Wrong: Set the flag, e.g. the port.
163
+ - Right: Set the flag, for example the port.
164
+
165
+ #### i.e.
166
+
167
+ Write "that is", or name the items.
168
+
169
+ - Wrong: Set the flag, i.e. the port.
170
+ - Right: Set the flag, that is the port.
171
+
172
+ #### etc.
173
+
174
+ Name the items.
175
+
176
+ - Wrong: Set the flag, etc.
177
+ - Right: Set the flag or the port.
178
+
179
+ ### SE_SLOP_OUT_OF_BOX: by default, not out of the box
180
+
181
+ Write by default.
182
+
183
+ - Wrong: The tool works out of the box.
184
+ - Right: The tool works by default.
185
+
186
+ ### SE_SLOP_UNDER_HOOD: internally, not under the hood
187
+
188
+ Write internally.
189
+
190
+ - Wrong: Under the hood, the tool builds a file.
191
+ - Right: Internally, the tool builds a file.
192
+
193
+ ### SE_SLOP_STREAMLINE: make simpler, not streamline
194
+
195
+ Write make simpler or make faster.
196
+
197
+ - Wrong: The tool streamlines the build.
198
+ - Right: The tool makes the build simpler.
199
+
200
+ ### SE_SLOP_PLETHORA: many, not plethora
201
+
202
+ Write many.
203
+
204
+ - Wrong: The file has a plethora of rows.
205
+ - Right: The file has many rows.
206
+
207
+ ### SE_SLOP_ADDRESSES: corrects, not addresses the issue
208
+
209
+ Write corrects the fault or removes the error.
210
+
211
+ - Wrong: The tool addresses the issue.
212
+ - Right: The tool corrects the fault.
213
+
214
+ ### SE_SLOP_PIVOTAL: important, not pivotal
215
+
216
+ Write important.
217
+
218
+ - Wrong: The flag is crucial.
219
+ - Right: The flag is important.
220
+
221
+ ### SE_SLOP_TAPESTRY: no tapestry, testament, synergy
222
+
223
+ Delete it. State the fact.
224
+
225
+ - Wrong: The design is a testament to the team.
226
+ - Right: The design shows the work of the team.
227
+
228
+ ### SE_SLOP_INTERPLAY: interaction, not interplay
229
+
230
+ Write interaction, or delete it.
231
+
232
+ - Wrong: The interplay of the two tools is complex.
233
+ - Right: The interaction of the two tools is complex.
234
+
235
+ ### SE_SLOP_INTRICATE: complex, not intricate
236
+
237
+ Write complex.
238
+
239
+ - Wrong: The config is intricate.
240
+ - Right: The config is complex.
241
+
242
+ ### SE_SLOP_VIBRANT: delete vibrant, nuanced, multifaceted
243
+
244
+ Delete it, or name the parts.
245
+
246
+ - Wrong: The tool is nuanced.
247
+ - Right: The tool reads three file types.
248
+
249
+ ### SE_SLOP_REALM: area, not realm or landscape
250
+
251
+ Write area.
252
+
253
+ - Wrong: In the realm of builds, use the tool.
254
+ - Right: In the area of builds, use the tool.
255
+
256
+ ### SE_SLOP_GROUNDBREAKING: new, not groundbreaking
257
+
258
+ Write new, or delete it.
259
+
260
+ - Wrong: The tool is groundbreaking.
261
+ - Right: The tool is new.
262
+
263
+ ### SE_SLOP_TRANSFORMATIVE: say what changes, not transformative
264
+
265
+ Delete it. Say what changes.
266
+
267
+ - Wrong: The tool is transformative.
268
+ - Right: The tool cuts the build time in half.
269
+
270
+ ### SE_SLOP_REVOLUTIONIZE: change, not revolutionize
271
+
272
+ Write change.
273
+
274
+ - Wrong: The tool revolutionizes the build.
275
+ - Right: The tool changes the build.
276
+
277
+ ### SE_SLOP_SHOWCASE: show, not showcase
278
+
279
+ Write show.
280
+
281
+ - Wrong: The log showcases the error.
282
+ - Right: The log shows the error.
283
+
284
+ ### SE_SLOP_FOSTER: help, not foster
285
+
286
+ Write help, support, or let.
287
+
288
+ - Wrong: The tool fosters growth.
289
+ - Right: The tool supports growth.
290
+
291
+ ### SE_SLOP_HARNESS: use, not harness
292
+
293
+ Write use.
294
+
295
+ - Wrong: Harness the API.
296
+ - Right: Use the API.
297
+
298
+ ### SE_SLOP_ENHANCE: improve, not enhance
299
+
300
+ Write improve.
301
+
302
+ - Wrong: The tool enhances the build.
303
+ - Right: The tool improves the build.
304
+
305
+ ### SE_SLOP_ELEVATE: increase, not elevate
306
+
307
+ Write increase.
308
+
309
+ - Wrong: The tool elevates the speed.
310
+ - Right: The tool increases the speed.
311
+
312
+ ### SE_SLOP_FURTHERMORE: also, not furthermore
313
+
314
+ Write also.
315
+
316
+ - Wrong: Furthermore, the tool reads the log.
317
+ - Right: The tool also reads the log.
318
+
319
+ ### SE_SLOP_EMBARK: start, not embark
320
+
321
+ Write start or try.
322
+
323
+ - Wrong: Embark on the build.
324
+ - Right: Start the build.
325
+
326
+ ### SE_SLOP_METICULOUS: careful, not meticulous
327
+
328
+ Write careful or carefully.
329
+
330
+ - Wrong: The tool checks the file meticulously.
331
+ - Right: The tool checks the file carefully.
332
+
333
+ ### SE_SLOP_HOLISTIC: full, not holistic
334
+
335
+ Write full.
336
+
337
+ - Wrong: The tool gives a holistic view.
338
+ - Right: The tool gives a full view.
339
+
340
+ ### SE_SLOP_PARADIGM: model, not paradigm
341
+
342
+ Write model.
343
+
344
+ - Wrong: The tool changes the paradigm.
345
+ - Right: The tool changes the model.
346
+
347
+ ### SE_SLOP_BOASTS: has, not boasts
348
+
349
+ Write has.
350
+
351
+ - Wrong: The tool boasts a log.
352
+ - Right: The tool has a log.
353
+
354
+ ### SE_SLOP_NOTWITHSTANDING: but, not that being said
355
+
356
+ Write but.
357
+
358
+ - Wrong: The tool works. That being said, it is slow.
359
+ - Right: The tool works, but it is slow.
360
+
361
+ ### SE_SLOP_NOTWITHSTANDING2: but, not notwithstanding
362
+
363
+ Write but.
364
+
365
+ - Wrong: Notwithstanding the log, the tool fails.
366
+ - Right: The log exists, but the tool fails.
367
+
368
+ ### SE_SLOP_DELETE_ADVERBS: delete empty adverbs
369
+
370
+ Delete it. It carries no fact.
371
+
372
+ - Wrong: The tool works seamlessly.
373
+ - Right: The tool works.
374
+
375
+ ### SE_SLOP_JUST: delete just
376
+
377
+ Delete it. It carries no fact.
378
+
379
+ - Wrong: The tool just works.
380
+ - Right: The tool works.
381
+
382
+ ### SE_SLOP_DELETE_ADJ: delete empty adjectives
383
+
384
+ Delete it, or give the measurable property.
385
+
386
+ - Wrong: The tool is robust.
387
+ - Right: The tool retries three times, then stops.
388
+
389
+ ### SE_SLOP_WORTH_NOTING: delete it is worth noting
390
+
391
+ Delete it. State the fact.
392
+
393
+ - Wrong: It is worth noting that the tool is slow.
394
+ - Right: The tool is slow.
395
+
396
+ ### SE_SLOP_IMPORTANT_TO: delete it is important to
397
+
398
+ Delete it. State the fact.
399
+
400
+ - Wrong: It is important to read the log.
401
+ - Right: Read the log.
402
+
403
+ ### SE_SLOP_DESIGNED_TO: delete is designed to
404
+
405
+ Say what the tool does.
406
+
407
+ - Wrong: The tool is designed to read logs.
408
+ - Right: The tool reads logs.
409
+
410
+ ### SE_SLOP_AIMS_TO: delete aims to
411
+
412
+ Say what the tool does.
413
+
414
+ - Wrong: The tool aims to read logs.
415
+ - Right: The tool reads logs.
416
+
417
+ ### SE_SLOP_AS_NEEDED: state the condition, not as needed
418
+
419
+ State the condition.
420
+
421
+ - Wrong: Restart the tool as needed.
422
+ - Right: Restart the tool every day.
423
+
424
+ ### SE_SLOP_GRACEFULLY: say what it does, not gracefully handles
425
+
426
+ Say what the tool does: "retries three times, then stops".
427
+
428
+ - Wrong: The tool gracefully handles the error.
429
+ - Right: The tool retries three times, then stops.
430
+
431
+ ### SE_SLOP_IN_CONCLUSION: delete in conclusion
432
+
433
+ Delete it. State the fact.
434
+
435
+ - Wrong: In conclusion, the tool works.
436
+ - Right: The tool works.
437
+
438
+ ### SE_SLOP_IN_SUMMARY: delete in summary
439
+
440
+ Delete it. State the fact.
441
+
442
+ - Wrong: In summary, the tool works.
443
+ - Right: The tool works.
444
+
445
+ ### SE_SLOP_AT_END_OF_DAY: delete at the end of the day
446
+
447
+ Delete it. State the fact.
448
+
449
+ - Wrong: At the end of the day, the tool works.
450
+ - Right: The tool works.
451
+
452
+ ### SE_SLOP_NESTLED: give the location, not nestled
453
+
454
+ Give the location.
455
+
456
+ - Wrong: The file is nestled in the folder.
457
+ - Right: The file sits in the folder.
458
+
459
+ ### SE_SLOP_BUSTLING: busy, not bustling
460
+
461
+ Write busy.
462
+
463
+ - Wrong: The bustling market has many files.
464
+ - Right: The busy market has many files.
465
+
466
+ ### SE_SLOP_HOPE_HELPS: delete I hope this helps
467
+
468
+ Delete it.
469
+
470
+ - Wrong: I hope this helps. Read the log.
471
+ - Right: Read the log.
472
+
473
+ ### SE_SLOP_DIVE_IN: delete let's dive in
474
+
475
+ Delete it.
476
+
477
+ - Wrong: let's dive in. Read the log.
478
+ - Right: Read the log.
479
+
480
+ ## Counting rules
481
+
482
+ These rules run in Ruby on Markdown text. Code comments do not use
483
+ them. Procedural text is a list item. Descriptive text is every
484
+ other paragraph.
485
+
486
+ ### SE_SENTENCE_TOO_LONG
487
+
488
+ A sentence with more than 20 words in
489
+ procedural text, or more than 25 words
490
+ in descriptive text.
491
+
492
+ ### SE_PARAGRAPH_TOO_LONG
493
+
494
+ A paragraph with more than 6
495
+ sentences in descriptive text.
496
+