@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.
Files changed (47) hide show
  1. package/package.json +1 -1
  2. package/skills/ct-adr-recorder/SKILL.md +74 -0
  3. package/skills/ct-adr-recorder/__tests__/skill-adr-recorder.test.ts +65 -0
  4. package/skills/ct-docs-lookup/SKILL.md +116 -1
  5. package/skills/ct-docs-lookup/references/ctx7-workflow.md +198 -0
  6. package/skills/ct-docs-lookup/references/library-id-resolution.md +217 -0
  7. package/skills/ct-docs-lookup/references/version-specific-docs.md +220 -0
  8. package/skills/ct-docs-review/SKILL.md +133 -1
  9. package/skills/ct-docs-review/__tests__/skill-docs-review.test.ts +53 -0
  10. package/skills/ct-docs-review/references/inline-comment-patterns.md +268 -0
  11. package/skills/ct-docs-review/references/pr-review-mode.md +270 -0
  12. package/skills/ct-docs-review/references/style-violations.md +341 -0
  13. package/skills/ct-docs-write/SKILL.md +157 -1
  14. package/skills/ct-docs-write/__tests__/skill-docs-write.test.ts +55 -0
  15. package/skills/ct-docs-write/references/audience-targeting.md +305 -0
  16. package/skills/ct-docs-write/references/cleo-style-guide.md +234 -0
  17. package/skills/ct-docs-write/references/markdown-patterns.md +329 -0
  18. package/skills/ct-documentor/SKILL.md +11 -0
  19. package/skills/ct-documentor/references/anti-patterns.md +216 -0
  20. package/skills/ct-documentor/references/chain-orchestration.md +194 -0
  21. package/skills/ct-documentor/references/doc-types-and-templates.md +301 -0
  22. package/skills/ct-documentor/references/style-coordination.md +195 -0
  23. package/skills/ct-research-agent/SKILL.md +9 -0
  24. package/skills/ct-research-agent/references/anti-patterns.md +154 -0
  25. package/skills/ct-research-agent/references/citation-and-evidence.md +140 -0
  26. package/skills/ct-research-agent/references/source-strategy.md +116 -0
  27. package/skills/ct-research-agent/references/triggers-and-routing.md +93 -0
  28. package/skills/ct-skill-validator/SKILL.md +19 -0
  29. package/skills/ct-skill-validator/scripts/check_depth.py +306 -0
  30. package/skills/ct-spec-writer/SKILL.md +71 -1
  31. package/skills/ct-spec-writer/__tests__/skill-spec-writer.test.ts +60 -0
  32. package/skills/ct-spec-writer/references/anti-patterns.md +176 -0
  33. package/skills/ct-spec-writer/references/rfc2119-language.md +138 -0
  34. package/skills/ct-spec-writer/references/spec-templates.md +233 -0
  35. package/skills/ct-spec-writer/references/traceability-matrix.md +145 -0
  36. package/skills/ct-task-executor/SKILL.md +10 -0
  37. package/skills/ct-task-executor/references/acceptance-criteria-mapping.md +163 -0
  38. package/skills/ct-task-executor/references/anti-patterns.md +201 -0
  39. package/skills/ct-task-executor/references/common-failures.md +193 -0
  40. package/skills/ct-task-executor/references/evidence-and-gates.md +179 -0
  41. package/skills/ct-task-executor/references/implementation-patterns.md +160 -0
  42. package/skills/ct-validator/SKILL.md +9 -0
  43. package/skills/ct-validator/references/anti-patterns.md +194 -0
  44. package/skills/ct-validator/references/compliance-reports.md +199 -0
  45. package/skills/ct-validator/references/schema-checking.md +191 -0
  46. package/skills/ct-validator/references/validation-modes.md +185 -0
  47. 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.