@cleocode/skills 2026.5.84 → 2026.5.86
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/package.json +1 -1
- package/skills/ct-adr-recorder/SKILL.md +74 -0
- package/skills/ct-adr-recorder/__tests__/skill-adr-recorder.test.ts +65 -0
- package/skills/ct-docs-lookup/SKILL.md +116 -1
- package/skills/ct-docs-lookup/references/ctx7-workflow.md +198 -0
- package/skills/ct-docs-lookup/references/library-id-resolution.md +217 -0
- package/skills/ct-docs-lookup/references/version-specific-docs.md +220 -0
- package/skills/ct-docs-review/SKILL.md +133 -1
- package/skills/ct-docs-review/__tests__/skill-docs-review.test.ts +53 -0
- package/skills/ct-docs-review/references/inline-comment-patterns.md +268 -0
- package/skills/ct-docs-review/references/pr-review-mode.md +270 -0
- package/skills/ct-docs-review/references/style-violations.md +341 -0
- package/skills/ct-docs-write/SKILL.md +157 -1
- package/skills/ct-docs-write/__tests__/skill-docs-write.test.ts +55 -0
- package/skills/ct-docs-write/references/audience-targeting.md +305 -0
- package/skills/ct-docs-write/references/cleo-style-guide.md +234 -0
- package/skills/ct-docs-write/references/markdown-patterns.md +329 -0
- package/skills/ct-documentor/SKILL.md +11 -0
- package/skills/ct-documentor/references/anti-patterns.md +216 -0
- package/skills/ct-documentor/references/chain-orchestration.md +194 -0
- package/skills/ct-documentor/references/doc-types-and-templates.md +301 -0
- package/skills/ct-documentor/references/style-coordination.md +195 -0
- package/skills/ct-research-agent/SKILL.md +9 -0
- package/skills/ct-research-agent/references/anti-patterns.md +154 -0
- package/skills/ct-research-agent/references/citation-and-evidence.md +140 -0
- package/skills/ct-research-agent/references/source-strategy.md +116 -0
- package/skills/ct-research-agent/references/triggers-and-routing.md +93 -0
- package/skills/ct-skill-validator/SKILL.md +19 -0
- package/skills/ct-skill-validator/scripts/check_depth.py +306 -0
- package/skills/ct-spec-writer/SKILL.md +71 -1
- package/skills/ct-spec-writer/__tests__/skill-spec-writer.test.ts +60 -0
- package/skills/ct-spec-writer/references/anti-patterns.md +176 -0
- package/skills/ct-spec-writer/references/rfc2119-language.md +138 -0
- package/skills/ct-spec-writer/references/spec-templates.md +233 -0
- package/skills/ct-spec-writer/references/traceability-matrix.md +145 -0
- package/skills/ct-task-executor/SKILL.md +10 -0
- package/skills/ct-task-executor/references/acceptance-criteria-mapping.md +163 -0
- package/skills/ct-task-executor/references/anti-patterns.md +201 -0
- package/skills/ct-task-executor/references/common-failures.md +193 -0
- package/skills/ct-task-executor/references/evidence-and-gates.md +179 -0
- package/skills/ct-task-executor/references/implementation-patterns.md +160 -0
- package/skills/ct-validator/SKILL.md +9 -0
- package/skills/ct-validator/references/anti-patterns.md +194 -0
- package/skills/ct-validator/references/compliance-reports.md +199 -0
- package/skills/ct-validator/references/schema-checking.md +191 -0
- package/skills/ct-validator/references/validation-modes.md +185 -0
- package/skills/manifest.json +46 -8
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# PR Review Mode
|
|
2
|
+
|
|
3
|
+
When the GitHub MCP tools are available, ct-docs-review uses the
|
|
4
|
+
pending-review workflow to post all findings as one cohesive GitHub
|
|
5
|
+
review. This reference codifies the workflow, the comment format,
|
|
6
|
+
and the integration with `gh` CLI for the cases where MCP tools are
|
|
7
|
+
not available.
|
|
8
|
+
|
|
9
|
+
## Mode Detection
|
|
10
|
+
|
|
11
|
+
The mode is determined by tool availability:
|
|
12
|
+
|
|
13
|
+
| Available | Mode | Output target |
|
|
14
|
+
|-----------|------|---------------|
|
|
15
|
+
| `mcp__github__create_pending_pull_request_review` | PR mode | GitHub PR review |
|
|
16
|
+
| Not available | Local mode | Conversation / file |
|
|
17
|
+
|
|
18
|
+
The skill MUST check tool availability before review starts. If a
|
|
19
|
+
review is conducted in the wrong mode, the findings won't reach the
|
|
20
|
+
reader.
|
|
21
|
+
|
|
22
|
+
## PR Mode Workflow
|
|
23
|
+
|
|
24
|
+
### Step 1: Start a Pending Review
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
Tool: mcp__github__create_pending_pull_request_review
|
|
28
|
+
Args: { owner, repo, pull_number }
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This creates a draft review that doesn't appear on the PR until
|
|
32
|
+
submitted. The draft accumulates comments without spamming the PR.
|
|
33
|
+
|
|
34
|
+
### Step 2: Fetch the Diff
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
Tool: mcp__github__get_pull_request_diff
|
|
38
|
+
Args: { owner, repo, pull_number }
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The diff tells you which file paths and line numbers to use for each
|
|
42
|
+
inline comment. Comments tied to lines that don't appear in the diff
|
|
43
|
+
are rejected by GitHub.
|
|
44
|
+
|
|
45
|
+
### Step 3: Collect All Findings First
|
|
46
|
+
|
|
47
|
+
Read through the entire diff. Identify every violation worth flagging.
|
|
48
|
+
Number them sequentially: Issue 1, Issue 2, Issue 3, etc.
|
|
49
|
+
|
|
50
|
+
Do NOT post comments as you find them. Collect first, post second.
|
|
51
|
+
|
|
52
|
+
### Step 4: Add Comments in Parallel
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
Tool: mcp__github__add_pull_request_review_comment_to_pending_review
|
|
56
|
+
Args: { owner, repo, pull_number, path, line, body }
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
CRITICAL: Post ALL comments in a SINGLE response, in parallel tool
|
|
60
|
+
calls. Posting them one-at-a-time across multiple responses creates
|
|
61
|
+
visual flicker and may cause GitHub to throttle.
|
|
62
|
+
|
|
63
|
+
Each comment body starts with:
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
**Issue N: [Brief title]**
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Followed by the description and suggested fix.
|
|
70
|
+
|
|
71
|
+
### Step 5: Submit the Review
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
Tool: mcp__github__submit_pending_pull_request_review
|
|
75
|
+
Args: { owner, repo, pull_number, event: "COMMENT" }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Use `event: "COMMENT"` (non-blocking) — NOT `REQUEST_CHANGES`. The
|
|
79
|
+
non-blocking event lets the author address comments without
|
|
80
|
+
forcing a re-review.
|
|
81
|
+
|
|
82
|
+
Do NOT include a `body` parameter. The pending-review workflow
|
|
83
|
+
already attaches each finding inline; a summary body just clutters
|
|
84
|
+
the PR.
|
|
85
|
+
|
|
86
|
+
## Comment Format
|
|
87
|
+
|
|
88
|
+
### Standard Comment
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
**Issue 1: Formal tone**
|
|
92
|
+
|
|
93
|
+
Line 15 uses "cannot" — CLEO docs prefer the contraction "can't" for
|
|
94
|
+
conversational tone.
|
|
95
|
+
|
|
96
|
+
Suggested fix:
|
|
97
|
+
|
|
98
|
+
```diff
|
|
99
|
+
-You cannot run this command on a dirty tree.
|
|
100
|
+
+You can't run this command on a dirty tree.
|
|
101
|
+
```
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Comment with Multiple Examples
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
**Issue 3: Vague headings**
|
|
108
|
+
|
|
109
|
+
The headings "Setup" (line 8) and "Configuration" (line 47) don't
|
|
110
|
+
tell the reader what each section is for.
|
|
111
|
+
|
|
112
|
+
Suggested fixes:
|
|
113
|
+
|
|
114
|
+
- "Setup" → "Install dependencies and run init"
|
|
115
|
+
- "Configuration" → "Configure release pipeline before first ship"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Comment with Diff Suggestion
|
|
119
|
+
|
|
120
|
+
GitHub supports rendered diff suggestions when the comment is on a
|
|
121
|
+
specific line. Use this format:
|
|
122
|
+
|
|
123
|
+
````text
|
|
124
|
+
**Issue 5: User-construct**
|
|
125
|
+
|
|
126
|
+
Line 22 uses "users" — CLEO docs say "people".
|
|
127
|
+
|
|
128
|
+
```suggestion
|
|
129
|
+
people can configure the cache by setting `cacheTimeout`.
|
|
130
|
+
```
|
|
131
|
+
````
|
|
132
|
+
|
|
133
|
+
The `suggestion` block becomes a "Commit suggestion" button for the
|
|
134
|
+
author. Use sparingly — only when the fix is a one-line replacement.
|
|
135
|
+
|
|
136
|
+
## Local Mode Workflow
|
|
137
|
+
|
|
138
|
+
When MCP tools aren't available, output the same findings in the
|
|
139
|
+
conversation using numbered markdown:
|
|
140
|
+
|
|
141
|
+
```markdown
|
|
142
|
+
## Issues
|
|
143
|
+
|
|
144
|
+
**Issue 1: Formal tone**
|
|
145
|
+
Line 15: This could be more conversational. Consider: "You can't..."
|
|
146
|
+
instead of "You cannot..."
|
|
147
|
+
|
|
148
|
+
**Issue 2: Vague heading**
|
|
149
|
+
Line 8: The heading could be more specific. Try stating the point
|
|
150
|
+
directly: "Run migrations before upgrading" vs "Upgrade process"
|
|
151
|
+
|
|
152
|
+
**Issue 3: Patronizing qualifier**
|
|
153
|
+
Line 23: Remove "easy" — it patronizes the reader. Let the steps
|
|
154
|
+
speak for themselves.
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### gh CLI Fallback
|
|
158
|
+
|
|
159
|
+
If MCP tools aren't available but `gh` CLI is, you can still post a
|
|
160
|
+
PR review via shell:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
gh pr review <PR_NUMBER> --comment --body "$(cat <<'EOF'
|
|
164
|
+
## Issues
|
|
165
|
+
|
|
166
|
+
**Issue 1: Formal tone**
|
|
167
|
+
Line 15: This could be more conversational...
|
|
168
|
+
|
|
169
|
+
**Issue 2: Vague heading**
|
|
170
|
+
Line 8: The heading could be more specific...
|
|
171
|
+
EOF
|
|
172
|
+
)"
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
The shell route uses a single overall comment rather than inline
|
|
176
|
+
comments. Less precise but still useful when MCP isn't an option.
|
|
177
|
+
|
|
178
|
+
## Numbering Discipline
|
|
179
|
+
|
|
180
|
+
Every issue MUST be numbered sequentially starting from Issue 1.
|
|
181
|
+
|
|
182
|
+
```text
|
|
183
|
+
GOOD:
|
|
184
|
+
Issue 1: ...
|
|
185
|
+
Issue 2: ...
|
|
186
|
+
Issue 3: ...
|
|
187
|
+
|
|
188
|
+
BAD (skipping numbers):
|
|
189
|
+
Issue 1: ...
|
|
190
|
+
Issue 3: ...
|
|
191
|
+
|
|
192
|
+
BAD (random labels):
|
|
193
|
+
Issue A: ...
|
|
194
|
+
Issue 2: ...
|
|
195
|
+
Issue Important: ...
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Sequential numbering lets the author say "fix issues 1, 3, and 5"
|
|
199
|
+
unambiguously. It also lets them track which feedback they've
|
|
200
|
+
addressed.
|
|
201
|
+
|
|
202
|
+
## Materiality Before Numbering
|
|
203
|
+
|
|
204
|
+
Before assigning Issue numbers, run the materiality filter (see
|
|
205
|
+
`style-violations.md` §Materiality Filter). Issues that would not
|
|
206
|
+
make a meaningful difference to the reader are SKIPPED, not numbered
|
|
207
|
+
and labeled "minor".
|
|
208
|
+
|
|
209
|
+
The materiality filter exists because flooding the author with low-
|
|
210
|
+
value flags trains them to ignore the review. Be selective up front;
|
|
211
|
+
flag only what matters.
|
|
212
|
+
|
|
213
|
+
## Review Length Guidelines
|
|
214
|
+
|
|
215
|
+
| Doc size | Typical issue count |
|
|
216
|
+
|----------|---------------------|
|
|
217
|
+
| Small (< 100 lines) | 0-3 issues |
|
|
218
|
+
| Medium (100-300 lines) | 0-8 issues |
|
|
219
|
+
| Large (300+ lines) | 0-15 issues |
|
|
220
|
+
|
|
221
|
+
A review with 30 issues on a 200-line doc signals one of:
|
|
222
|
+
|
|
223
|
+
- The doc is genuinely in bad shape (needs deep rewrite, not nits)
|
|
224
|
+
- The reviewer is over-flagging low-value stuff
|
|
225
|
+
|
|
226
|
+
If you find yourself at 20+ issues on a medium doc, step back and
|
|
227
|
+
ask: is the materiality filter being applied? Are these the issues
|
|
228
|
+
that matter?
|
|
229
|
+
|
|
230
|
+
## Workflow Discipline
|
|
231
|
+
|
|
232
|
+
| Step | Anti-pattern | Correct |
|
|
233
|
+
|------|--------------|---------|
|
|
234
|
+
| Start | Begin posting comments immediately | Start pending review first |
|
|
235
|
+
| Identify | Post issues one-by-one as found | Collect ALL, then post in parallel |
|
|
236
|
+
| Format | Plain text bodies | `**Issue N: [Title]**` prefix |
|
|
237
|
+
| Submit | `event: REQUEST_CHANGES` blocks PR | `event: COMMENT` is non-blocking |
|
|
238
|
+
| Body | Long summary body on submit | Empty body — let inline comments speak |
|
|
239
|
+
|
|
240
|
+
## Re-Review After Fix
|
|
241
|
+
|
|
242
|
+
When the author addresses feedback and pushes new commits, run the
|
|
243
|
+
review again on the updated diff. Don't re-flag issues that are
|
|
244
|
+
already fixed; do flag new issues introduced in the fix.
|
|
245
|
+
|
|
246
|
+
For re-reviews, start the comment with a status line:
|
|
247
|
+
|
|
248
|
+
```text
|
|
249
|
+
**Issue 2 (UPDATED): Vague heading**
|
|
250
|
+
|
|
251
|
+
The previous fix changed "Setup" to "Setup Steps" — still vague.
|
|
252
|
+
Try "Install dependencies, then run init".
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
The "(UPDATED)" tag signals to the author that this is iteration,
|
|
256
|
+
not a brand-new flag.
|
|
257
|
+
|
|
258
|
+
## When Review Should Block
|
|
259
|
+
|
|
260
|
+
The default event is `COMMENT` (non-blocking). Use `REQUEST_CHANGES`
|
|
261
|
+
only when the PR contains issues that, if shipped, would actively
|
|
262
|
+
harm readers:
|
|
263
|
+
|
|
264
|
+
- Broken code examples that would fail when copy-pasted
|
|
265
|
+
- Outdated security guidance
|
|
266
|
+
- Links to deprecated APIs in setup instructions
|
|
267
|
+
- Patronizing language to vulnerable audiences
|
|
268
|
+
|
|
269
|
+
For everything else, use COMMENT. Trust the author to take feedback
|
|
270
|
+
seriously without being forced.
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
# Style Violations
|
|
2
|
+
|
|
3
|
+
The taxonomy of style violations that ct-docs-review catches. Each
|
|
4
|
+
violation type carries a detection pattern, an issue title format,
|
|
5
|
+
and a remediation message. The numbering scheme below (V-NNN) is
|
|
6
|
+
informational — issues in reviews are numbered sequentially per
|
|
7
|
+
review, not by global ID.
|
|
8
|
+
|
|
9
|
+
## Violation Categories
|
|
10
|
+
|
|
11
|
+
| Category | Examples | Severity |
|
|
12
|
+
|----------|----------|----------|
|
|
13
|
+
| Forbidden phrases | "easy", "simple", "just", "click here" | High |
|
|
14
|
+
| Tone and voice | "we" referring to CLEO, formal language | Medium |
|
|
15
|
+
| Structure | Buried lead, vague heading, no clear purpose | Medium |
|
|
16
|
+
| Links | Bare-word links, link-in-heading | High |
|
|
17
|
+
| Formatting | Missing language tag, full-width screenshot | Low |
|
|
18
|
+
| Code examples | Don't run, out of order | High |
|
|
19
|
+
| Sentence construction | Pronoun overuse, missing serial comma | Low |
|
|
20
|
+
|
|
21
|
+
Severity drives prioritization but not categorical filtering — review
|
|
22
|
+
flags everything worth fixing. The final filter is the materiality
|
|
23
|
+
test: "would fixing this make a meaningful difference to the reader?"
|
|
24
|
+
|
|
25
|
+
## Forbidden Phrases
|
|
26
|
+
|
|
27
|
+
The hardest-to-shake violations. They sneak into drafts because they
|
|
28
|
+
feel natural — and they're banned because they're patronizing.
|
|
29
|
+
|
|
30
|
+
### "easy" / "simple" / "just"
|
|
31
|
+
|
|
32
|
+
**Detection pattern.**
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
grep -inE '\b(easy|simple|just|easily|simply)\b' <file>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Issue title.** `Patronizing qualifier: "<word>"`
|
|
39
|
+
|
|
40
|
+
**Remediation message.**
|
|
41
|
+
|
|
42
|
+
> Line X uses "<word>" — this assumes the reader's context. Remove it
|
|
43
|
+
> and let the steps speak for themselves.
|
|
44
|
+
|
|
45
|
+
**Examples.**
|
|
46
|
+
|
|
47
|
+
| Before | After |
|
|
48
|
+
|--------|-------|
|
|
49
|
+
| Setting up SAML is easy. | Set up SAML by following these steps. |
|
|
50
|
+
| Just run `cleo init`. | Run `cleo init`. |
|
|
51
|
+
| The CLI makes this simple. | Use the CLI: `cleo verify`. |
|
|
52
|
+
|
|
53
|
+
### "obviously" / "of course"
|
|
54
|
+
|
|
55
|
+
**Detection pattern.**
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
grep -inE '\b(obviously|of course|clearly|naturally)\b' <file>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Issue title.** `Condescending qualifier: "<word>"`
|
|
62
|
+
|
|
63
|
+
**Remediation message.**
|
|
64
|
+
|
|
65
|
+
> Line X uses "<word>" — patronizing the reader. If it's truly obvious,
|
|
66
|
+
> the doc doesn't need to say so; if it's not, calling it obvious feels
|
|
67
|
+
> condescending.
|
|
68
|
+
|
|
69
|
+
### "click here" / "read more here"
|
|
70
|
+
|
|
71
|
+
**Detection pattern.**
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
grep -inE '\[(click here|here|read more here|this|more info)\]\(' <file>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Issue title.** `Non-descriptive link text: "<text>"`
|
|
78
|
+
|
|
79
|
+
**Remediation message.**
|
|
80
|
+
|
|
81
|
+
> Line X uses "<text>" as the link text. Link text MUST describe the
|
|
82
|
+
> destination. Replace with descriptive text such as
|
|
83
|
+
> "the [SAML configuration guide]".
|
|
84
|
+
|
|
85
|
+
### "etc." / "and so on"
|
|
86
|
+
|
|
87
|
+
**Detection pattern.**
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
grep -inE '\b(etc\.|and so on|and more)\b' <file>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Issue title.** `Trailing list: "<phrase>"`
|
|
94
|
+
|
|
95
|
+
**Remediation message.**
|
|
96
|
+
|
|
97
|
+
> Line X ends a list with "<phrase>" — this signals incomplete thinking.
|
|
98
|
+
> Either enumerate the items completely, or restate the sentence
|
|
99
|
+
> without the trailing phrase.
|
|
100
|
+
|
|
101
|
+
## Tone and Voice Violations
|
|
102
|
+
|
|
103
|
+
### "we" referring to CLEO
|
|
104
|
+
|
|
105
|
+
**Detection pattern.**
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Tricky — "we" + verb usually means CLEO
|
|
109
|
+
grep -inE '\bwe (will|can|use|do|have|are|provide|deliver|run|build|deploy)' <file>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Issue title.** `First-person plural referring to CLEO`
|
|
113
|
+
|
|
114
|
+
**Remediation message.**
|
|
115
|
+
|
|
116
|
+
> Line X uses "we" — when talking about CLEO features, say "CLEO" or
|
|
117
|
+
> "it". "We" is for the human team; "CLEO" is for the system.
|
|
118
|
+
|
|
119
|
+
### Formal language
|
|
120
|
+
|
|
121
|
+
**Detection pattern.**
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
grep -inE '\b(utilize|leverage|reference|offerings|provisions|delineate)\b' <file>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Issue title.** `Formal/corporate language: "<word>"`
|
|
128
|
+
|
|
129
|
+
**Remediation message.**
|
|
130
|
+
|
|
131
|
+
> Line X uses "<word>" — too formal. Use the everyday word: "<replacement>".
|
|
132
|
+
|
|
133
|
+
| Formal | Everyday |
|
|
134
|
+
|--------|----------|
|
|
135
|
+
| utilize | use |
|
|
136
|
+
| leverage | use |
|
|
137
|
+
| reference (verb) | see, look at |
|
|
138
|
+
| offerings | products, features |
|
|
139
|
+
| provisions | settings |
|
|
140
|
+
| delineate | describe, list |
|
|
141
|
+
|
|
142
|
+
### Missing contractions
|
|
143
|
+
|
|
144
|
+
**Detection pattern.**
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
grep -inE '\b(cannot|do not|will not|is not|are not|does not|did not)\b' <file>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Issue title.** `Missing contraction: "<phrase>"`
|
|
151
|
+
|
|
152
|
+
**Remediation message.**
|
|
153
|
+
|
|
154
|
+
> Line X uses "<phrase>" — CLEO docs USE contractions. Change to
|
|
155
|
+
> "<contracted form>" for the conversational tone.
|
|
156
|
+
|
|
157
|
+
This is the one rule that surprises writers most often. CLEO is opposite
|
|
158
|
+
to many style guides on this point.
|
|
159
|
+
|
|
160
|
+
### "users" instead of "people"
|
|
161
|
+
|
|
162
|
+
**Detection pattern.**
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Standalone "users" — careful not to match "end-users" or "user-agent"
|
|
166
|
+
grep -inE '(?<!end-)\busers?\b(?!-)' <file>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Issue title.** `User-construct instead of human: "<word>"`
|
|
170
|
+
|
|
171
|
+
**Remediation message.**
|
|
172
|
+
|
|
173
|
+
> Line X uses "<word>" — CLEO docs say "people" or "companies", not
|
|
174
|
+
> "users". "User" is a system construct; "people" centers the human.
|
|
175
|
+
|
|
176
|
+
Note: compound terms keep "user" — "end-user", "user-agent", "user-space".
|
|
177
|
+
|
|
178
|
+
## Structure Violations
|
|
179
|
+
|
|
180
|
+
### Buried lead
|
|
181
|
+
|
|
182
|
+
**Detection pattern.** (Manual — no regex.)
|
|
183
|
+
|
|
184
|
+
Read the first paragraph of each section. Does the action / definition
|
|
185
|
+
appear in the first sentence? If not, the lead is buried.
|
|
186
|
+
|
|
187
|
+
**Issue title.** `Buried lead in §<section>`
|
|
188
|
+
|
|
189
|
+
**Remediation message.**
|
|
190
|
+
|
|
191
|
+
> The action / definition is not stated until line X. Lead with it.
|
|
192
|
+
> Move the explanation after.
|
|
193
|
+
|
|
194
|
+
### Vague heading
|
|
195
|
+
|
|
196
|
+
**Detection pattern.** (Manual — needs semantic reading.)
|
|
197
|
+
|
|
198
|
+
Read each heading. Does it state the point or just the topic?
|
|
199
|
+
|
|
200
|
+
| Vague | Specific |
|
|
201
|
+
|-------|----------|
|
|
202
|
+
| Configuration | Configure release pipeline before first ship |
|
|
203
|
+
| Authentication | Authenticate with API tokens |
|
|
204
|
+
| Notes | Use environment variables for secrets |
|
|
205
|
+
| Setup | Install dependencies and run init |
|
|
206
|
+
| Performance | Set timeout to 30s on slow networks |
|
|
207
|
+
|
|
208
|
+
**Issue title.** `Vague heading: "<heading>"`
|
|
209
|
+
|
|
210
|
+
**Remediation message.**
|
|
211
|
+
|
|
212
|
+
> Heading "<heading>" doesn't tell the reader what the section is for.
|
|
213
|
+
> State the action or claim: e.g., "<specific replacement>".
|
|
214
|
+
|
|
215
|
+
### Paragraph without purpose
|
|
216
|
+
|
|
217
|
+
**Detection pattern.** (Manual.)
|
|
218
|
+
|
|
219
|
+
For each paragraph, ask "what does this contribute?" If the answer is
|
|
220
|
+
"none — it restates the previous paragraph or sets up the next one
|
|
221
|
+
without adding information", flag it.
|
|
222
|
+
|
|
223
|
+
**Issue title.** `Paragraph without clear purpose at line X`
|
|
224
|
+
|
|
225
|
+
**Remediation message.**
|
|
226
|
+
|
|
227
|
+
> The paragraph at line X restates / sets up without adding new
|
|
228
|
+
> information. Cut it or merge with adjacent content.
|
|
229
|
+
|
|
230
|
+
## Link Violations
|
|
231
|
+
|
|
232
|
+
### Link in heading
|
|
233
|
+
|
|
234
|
+
**Detection pattern.**
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
grep -inE '^#+ .*\[.*\]\(' <file>
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
**Issue title.** `Link inside heading: "<heading>"`
|
|
241
|
+
|
|
242
|
+
**Remediation message.**
|
|
243
|
+
|
|
244
|
+
> Line X has a link inside the heading. Headings should be plain text;
|
|
245
|
+
> move the link to the body. Exception: if the entire heading is the
|
|
246
|
+
> link (no surrounding text), it's allowed.
|
|
247
|
+
|
|
248
|
+
### Ampersands
|
|
249
|
+
|
|
250
|
+
**Detection pattern.**
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
grep -inE ' & ' <file>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**Issue title.** `Ampersand instead of "and"`
|
|
257
|
+
|
|
258
|
+
**Remediation message.**
|
|
259
|
+
|
|
260
|
+
> Line X uses "&" — spell out "and" unless the ampersand is part of a
|
|
261
|
+
> proper noun (e.g., "AT&T").
|
|
262
|
+
|
|
263
|
+
## Formatting Violations
|
|
264
|
+
|
|
265
|
+
### Missing language tag
|
|
266
|
+
|
|
267
|
+
**Detection pattern.**
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
# Find fenced blocks with no language tag
|
|
271
|
+
grep -inP '^```$' <file>
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Issue title.** `Code block without language tag`
|
|
275
|
+
|
|
276
|
+
**Remediation message.**
|
|
277
|
+
|
|
278
|
+
> Code block at line X has no language tag. Add `bash`, `typescript`,
|
|
279
|
+
> `python`, `json`, etc., for syntax highlighting.
|
|
280
|
+
|
|
281
|
+
### Abbreviated language tag
|
|
282
|
+
|
|
283
|
+
**Detection pattern.**
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
grep -inE '^```(ts|js|py|rs|md)\s*$' <file>
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**Issue title.** `Abbreviated language tag: "<tag>"`
|
|
290
|
+
|
|
291
|
+
**Remediation message.**
|
|
292
|
+
|
|
293
|
+
> Code block at line X uses "<tag>" — use the full name. Mapping:
|
|
294
|
+
> ts → typescript, js → javascript, py → python, rs → rust,
|
|
295
|
+
> md → markdown.
|
|
296
|
+
|
|
297
|
+
## Code Example Violations
|
|
298
|
+
|
|
299
|
+
### Example doesn't run
|
|
300
|
+
|
|
301
|
+
**Detection pattern.** (Manual + tool.)
|
|
302
|
+
|
|
303
|
+
For TypeScript/JavaScript/Python code blocks that contain runnable
|
|
304
|
+
snippets, attempt to dry-run them (TS: `tsc --noEmit`; Python: `python
|
|
305
|
+
-c`). For shell snippets, sanity-check the syntax.
|
|
306
|
+
|
|
307
|
+
**Issue title.** `Example at line X doesn't compile / run`
|
|
308
|
+
|
|
309
|
+
**Remediation message.**
|
|
310
|
+
|
|
311
|
+
> The code at line X has <error>. Either fix the example to compile/run,
|
|
312
|
+
> or mark it as pseudocode with a comment.
|
|
313
|
+
|
|
314
|
+
### Commands out of order
|
|
315
|
+
|
|
316
|
+
**Detection pattern.** (Manual.)
|
|
317
|
+
|
|
318
|
+
In a sequence of shell commands, check that each command's
|
|
319
|
+
prerequisites are stated before it.
|
|
320
|
+
|
|
321
|
+
**Issue title.** `Commands out of dependency order at line X`
|
|
322
|
+
|
|
323
|
+
**Remediation message.**
|
|
324
|
+
|
|
325
|
+
> Command at line X depends on output of command at line Y, but appears
|
|
326
|
+
> before it. Reorder, or split into separate code blocks with prose
|
|
327
|
+
> between.
|
|
328
|
+
|
|
329
|
+
## Materiality Filter
|
|
330
|
+
|
|
331
|
+
After collecting all detected violations, apply the materiality filter:
|
|
332
|
+
"Would fixing this make a meaningful difference to the reader?"
|
|
333
|
+
|
|
334
|
+
- High-severity violations always pass the filter.
|
|
335
|
+
- Medium-severity: pass if the doc is end-user-facing or the violation
|
|
336
|
+
appears in a prominent location (heading, intro, summary).
|
|
337
|
+
- Low-severity: pass if there are several together (signals a quality
|
|
338
|
+
problem); otherwise SKIP.
|
|
339
|
+
|
|
340
|
+
Flag only what passes the filter. A flood of low-severity flags
|
|
341
|
+
overwhelms the reviewer — be selective.
|