@lvlup-sw/axiom 0.2.5 → 0.2.7
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/.claude-plugin/plugin.json +2 -2
- package/package.json +1 -1
- package/skills/audit/SKILL.md +4 -3
- package/skills/audit/references/composition-guide.md +3 -2
- package/skills/backend-quality/SKILL.md +2 -1
- package/skills/backend-quality/references/deterministic-checks.md +62 -0
- package/skills/backend-quality/references/dimensions.md +30 -1
- package/skills/humanize/SKILL.md +79 -0
- package/skills/humanize/references/ai-writing-patterns.md +243 -0
- package/skills/humanize/references/severity-guide.md +98 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "axiom",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "Backend code quality skills for Claude Code.
|
|
3
|
+
"version": "0.2.7",
|
|
4
|
+
"description": "Backend code quality skills for Claude Code. Seven skills that audit, critique, harden, simplify, and humanize your architecture — the backend half of impeccable.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "LevelUp Software"
|
|
7
7
|
},
|
package/package.json
CHANGED
package/skills/audit/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: audit
|
|
3
|
-
description: "Run a comprehensive backend quality audit across all
|
|
3
|
+
description: "Run a comprehensive backend quality audit across all eight dimensions. Orchestrates scan, critique, harden, distill, verify, and humanize skills, deduplicates findings, and produces a unified report with verdict. Use when assessing overall codebase health. Triggers: 'audit backend', 'full quality check', 'run audit', or /axiom:audit. Do NOT use for targeted checks — use individual skills instead."
|
|
4
4
|
user-invokable: true
|
|
5
5
|
metadata:
|
|
6
6
|
author: lvlup-sw
|
|
@@ -14,7 +14,7 @@ metadata:
|
|
|
14
14
|
|
|
15
15
|
## Overview
|
|
16
16
|
|
|
17
|
-
The anchor skill that orchestrates all other axiom skills to produce a comprehensive backend quality report. Runs deterministic checks and qualitative assessments across all
|
|
17
|
+
The anchor skill that orchestrates all other axiom skills to produce a comprehensive backend quality report. Runs deterministic checks and qualitative assessments across all 8 dimensions, deduplicates findings, computes per-dimension metrics, and delivers a unified verdict.
|
|
18
18
|
|
|
19
19
|
## Triggers
|
|
20
20
|
|
|
@@ -52,6 +52,7 @@ Run each specialized skill in sequence, passing the scope:
|
|
|
52
52
|
2. **`axiom:harden`** — Observability (DIM-2) + Resilience (DIM-7)
|
|
53
53
|
3. **`axiom:distill`** — Hygiene (DIM-5) + Topology (DIM-1)
|
|
54
54
|
4. **`axiom:verify`** — Test Fidelity (DIM-4) + Contracts (DIM-3)
|
|
55
|
+
5. **`axiom:humanize`** — Prose Quality (DIM-8)
|
|
55
56
|
|
|
56
57
|
Each skill produces findings in the standard format: `@skills/backend-quality/references/findings-format.md`
|
|
57
58
|
|
|
@@ -65,7 +66,7 @@ Merge findings from all skills using these rules:
|
|
|
65
66
|
|
|
66
67
|
### Step 5: Coverage Check
|
|
67
68
|
|
|
68
|
-
Verify all
|
|
69
|
+
Verify all 8 dimensions were assessed. If any dimension has zero findings and zero checks:
|
|
69
70
|
- **Warning:** "DIM-N ({name}) was not assessed — no checks or findings produced"
|
|
70
71
|
- This may indicate the scope doesn't contain code relevant to that dimension
|
|
71
72
|
|
|
@@ -13,6 +13,7 @@ The audit skill invokes a fixed set of specialized skills:
|
|
|
13
13
|
| 3 | `axiom:harden` | Observability, Resilience |
|
|
14
14
|
| 4 | `axiom:distill` | Hygiene, Topology |
|
|
15
15
|
| 5 | `axiom:verify` | Test Fidelity, Contracts |
|
|
16
|
+
| 6 | `axiom:humanize` | Prose Quality |
|
|
16
17
|
|
|
17
18
|
**Execution order matters:** `scan` runs first so specialized skills can reference its deterministic findings when layering qualitative assessment.
|
|
18
19
|
|
|
@@ -41,7 +42,7 @@ When `scan` and a qualitative skill both flag the same issue, merge them. The de
|
|
|
41
42
|
After deduplication, compute the coverage matrix:
|
|
42
43
|
|
|
43
44
|
```text
|
|
44
|
-
For each dimension (DIM-1 through DIM-
|
|
45
|
+
For each dimension (DIM-1 through DIM-8):
|
|
45
46
|
- deterministic_checks: count of scan checks run for this dimension
|
|
46
47
|
- qualitative_assessed: was a specialized skill invoked for this dimension?
|
|
47
48
|
- finding_count: total findings (post-dedup)
|
|
@@ -83,7 +84,7 @@ const verdict = (HIGH_count > 0 || MEDIUM_count > 5)
|
|
|
83
84
|
### Finding Ordering
|
|
84
85
|
|
|
85
86
|
Within each severity tier, order findings by:
|
|
86
|
-
1. Dimension (DIM-1 first, DIM-
|
|
87
|
+
1. Dimension (DIM-1 first, DIM-8 last)
|
|
87
88
|
2. Evidence file path (alphabetical)
|
|
88
89
|
3. Evidence line number (ascending)
|
|
89
90
|
|
|
@@ -15,7 +15,7 @@ This skill defines the shared foundation for all axiom backend quality skills. I
|
|
|
15
15
|
|
|
16
16
|
## Dimension Taxonomy
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Eight canonical quality dimensions: `@skills/backend-quality/references/dimensions.md`
|
|
19
19
|
|
|
20
20
|
| ID | Name | What it assesses |
|
|
21
21
|
|----|------|-----------------|
|
|
@@ -26,6 +26,7 @@ Seven canonical quality dimensions: `@skills/backend-quality/references/dimensio
|
|
|
26
26
|
| DIM-5 | Hygiene | Dead code, vestigial patterns, evolutionary leftovers |
|
|
27
27
|
| DIM-6 | Architecture | SOLID, coupling, cohesion, dependency direction |
|
|
28
28
|
| DIM-7 | Resilience | Resource management, timeouts, failure handling |
|
|
29
|
+
| DIM-8 | Prose Quality | AI-writing patterns, documentation authenticity |
|
|
29
30
|
|
|
30
31
|
## Finding Format
|
|
31
32
|
|
|
@@ -170,6 +170,68 @@ Each check has: ID, pattern, what it detects, severity, and false-positive guida
|
|
|
170
170
|
- **Detects:** Retry logic that could loop forever
|
|
171
171
|
- **False positives:** Loops with break conditions that aren't pattern-matched
|
|
172
172
|
|
|
173
|
+
## DIM-8: Prose Quality
|
|
174
|
+
|
|
175
|
+
### PQ-8.1: AI vocabulary clustering
|
|
176
|
+
- **Pattern:** Count of `(additionally|crucial|delve|foster|garner|intricate|landscape|pivotal|tapestry|testament|underscore|vibrant)` per paragraph; flag if >=3
|
|
177
|
+
- **Severity:** MEDIUM
|
|
178
|
+
- **Detects:** Clustering of words disproportionately used by language models
|
|
179
|
+
- **False positives:** Technical contexts where "landscape" means literal landscape, or "crucial" is genuinely appropriate
|
|
180
|
+
|
|
181
|
+
### PQ-8.2: Chatbot collaborative artifacts
|
|
182
|
+
- **Pattern:** `(I hope this helps|Of course!|Certainly!|You're absolutely right|Would you like|let me know if|here is a)`
|
|
183
|
+
- **Severity:** HIGH
|
|
184
|
+
- **Detects:** Chatbot correspondence language left in shipped content
|
|
185
|
+
- **False positives:** Legitimate user-facing chat interfaces; FAQ sections
|
|
186
|
+
|
|
187
|
+
### PQ-8.3: Knowledge-cutoff disclaimers
|
|
188
|
+
- **Pattern:** `(as of (my|this|the) (last|latest)|up to my last training|based on available information|while specific details are (limited|scarce))`
|
|
189
|
+
- **Severity:** HIGH
|
|
190
|
+
- **Detects:** AI model disclaimers about incomplete knowledge left in documentation
|
|
191
|
+
- **False positives:** Legitimate date-scoped statements ("as of the latest release")
|
|
192
|
+
|
|
193
|
+
### PQ-8.4: Sycophantic openers
|
|
194
|
+
- **Pattern:** `^(Great question|That's a great|Excellent point|Absolutely[!,]|What a (great|wonderful|fantastic))`
|
|
195
|
+
- **Severity:** HIGH
|
|
196
|
+
- **Detects:** People-pleasing language inappropriate for technical documentation
|
|
197
|
+
- **False positives:** None in technical docs; rare in any professional writing
|
|
198
|
+
|
|
199
|
+
### PQ-8.5: Em dash density
|
|
200
|
+
- **Pattern:** Count of `\u2014` (em dash) per file; flag if density > 1 per 100 words
|
|
201
|
+
- **Severity:** LOW
|
|
202
|
+
- **Detects:** Overuse of em dashes mimicking punchy sales writing
|
|
203
|
+
- **False positives:** Quoted dialogue; style guides that favor em dashes
|
|
204
|
+
|
|
205
|
+
### PQ-8.6: Superficial -ing analyses
|
|
206
|
+
- **Pattern:** `(highlighting|underscoring|emphasizing|ensuring|reflecting|symbolizing|contributing to|cultivating|fostering|encompassing|showcasing)\s+(the|its|a|an)`
|
|
207
|
+
- **Severity:** MEDIUM
|
|
208
|
+
- **Detects:** Present participle phrases tacked on for fake depth
|
|
209
|
+
- **False positives:** Active voice descriptions of ongoing processes
|
|
210
|
+
|
|
211
|
+
### PQ-8.7: Inflated significance
|
|
212
|
+
- **Pattern:** `(serves as a testament|stands as a reminder|pivotal (role|moment)|indelible mark|key turning point|evolving landscape|setting the stage|focal point of)`
|
|
213
|
+
- **Severity:** MEDIUM
|
|
214
|
+
- **Detects:** Inflated language that elevates mundane topics to cosmic importance
|
|
215
|
+
- **False positives:** Historical or genuinely significant events
|
|
216
|
+
|
|
217
|
+
### PQ-8.8: Promotional language
|
|
218
|
+
- **Pattern:** `(boasts a|in the heart of|groundbreaking|renowned|breathtaking|must-visit|stunning|nestled)`
|
|
219
|
+
- **Severity:** MEDIUM
|
|
220
|
+
- **Detects:** Loss of neutral tone, especially on cultural/heritage topics
|
|
221
|
+
- **False positives:** Marketing copy where promotional tone is intentional
|
|
222
|
+
|
|
223
|
+
### PQ-8.9: Filler phrases
|
|
224
|
+
- **Pattern:** `(in order to|due to the fact that|at this point in time|in the event that|has the ability to|it is worth noting that|it is important to note)`
|
|
225
|
+
- **Severity:** LOW
|
|
226
|
+
- **Detects:** Wordy phrases that can be simplified
|
|
227
|
+
- **False positives:** Legal or formal contexts where precision requires verbosity
|
|
228
|
+
|
|
229
|
+
### PQ-8.10: Generic positive conclusions
|
|
230
|
+
- **Pattern:** `(the future looks bright|exciting times|looking forward to|great potential|paving the way|on the right track)`
|
|
231
|
+
- **Severity:** MEDIUM
|
|
232
|
+
- **Detects:** Vague upbeat endings without substance
|
|
233
|
+
- **False positives:** Genuine forward-looking statements with specific plans attached
|
|
234
|
+
|
|
173
235
|
## Extensibility
|
|
174
236
|
|
|
175
237
|
Projects can add custom checks via `.axiom/checks.md` at the repo root. Format matches this file — one section per dimension, each check with pattern, severity, description, and false-positive guidance. Custom checks are loaded alongside the built-in catalog by the `scan` skill.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Backend Quality Dimensions
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Eight canonical dimensions for assessing backend architectural health. Each dimension is independently assessable — no dimension requires another's output to produce findings.
|
|
4
4
|
|
|
5
5
|
## DIM-1: Topology
|
|
6
6
|
|
|
@@ -196,11 +196,40 @@ Seven canonical dimensions for assessing backend architectural health. Each dime
|
|
|
196
196
|
|
|
197
197
|
---
|
|
198
198
|
|
|
199
|
+
## DIM-8: Prose Quality
|
|
200
|
+
|
|
201
|
+
**Definition:** The absence of detectable AI-writing patterns in documentation, comments, user-facing strings, and prose content. Prose quality violations erode trust, signal unreviewed AI output, and make content feel generic rather than purposeful.
|
|
202
|
+
|
|
203
|
+
**Invariants:**
|
|
204
|
+
- Documentation reads as written by a domain expert, not generated by a language model
|
|
205
|
+
- No chatbot correspondence artifacts (sycophantic openers, "let me know" closers)
|
|
206
|
+
- Technical writing is direct and specific, not padded with filler phrases or hedging
|
|
207
|
+
|
|
208
|
+
**Detectable Signals:**
|
|
209
|
+
- AI vocabulary clustering (additionally, crucial, delve, landscape, tapestry, testament, underscore, vibrant)
|
|
210
|
+
- Collaborative communication artifacts ("I hope this helps", "Certainly!", "Would you like...")
|
|
211
|
+
- Knowledge-cutoff disclaimers ("as of [date]", "based on available information")
|
|
212
|
+
- Structural tells (em dash overuse, rule of three, inline-header vertical lists, title case headings)
|
|
213
|
+
- Content inflation (inflated significance, promotional language, superficial -ing analyses)
|
|
214
|
+
- Filler and hedging (generic positive conclusions, excessive hedging, wordy phrases)
|
|
215
|
+
|
|
216
|
+
**Severity Guide:**
|
|
217
|
+
- **HIGH:** Chatbot artifacts or knowledge-cutoff disclaimers left in shipped content
|
|
218
|
+
- **MEDIUM:** AI vocabulary clustering (3+ AI-typical words in a paragraph) or structural tells
|
|
219
|
+
- **LOW:** Isolated filler phrases or mild hedging
|
|
220
|
+
|
|
221
|
+
**Examples:**
|
|
222
|
+
- Violation: "This crucial module serves as a testament to the team's commitment to fostering robust architecture. It delves into the intricate tapestry of event-sourced workflows."
|
|
223
|
+
- Healthy: "This module handles event-sourced workflow state. It stores events in SQLite and rebuilds state on read."
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
199
227
|
## Dimension Independence
|
|
200
228
|
|
|
201
229
|
Each dimension can be assessed in isolation. However, some findings may span multiple dimensions:
|
|
202
230
|
|
|
203
231
|
- A lazy fallback constructor (DIM-1: Topology) may also be a silent error (DIM-2: Observability)
|
|
204
232
|
- Dead code (DIM-5: Hygiene) may also be a test fidelity issue if tests reference it (DIM-4)
|
|
233
|
+
- AI-generated prose (DIM-8: Prose Quality) may also be a hygiene issue if it contains dead documentation (DIM-5)
|
|
205
234
|
|
|
206
235
|
When a finding spans dimensions, it should be reported under the **primary** dimension (the one most directly violated) with a cross-reference note. The `audit` skill handles deduplication when the same evidence appears under multiple dimensions.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: humanize
|
|
3
|
+
description: "Scan for AI writing patterns in markdown, docs, comments, and user-facing strings. Detects 24 cataloged AI-writing tells across content, language, style, communication, and filler categories. Triggers: 'check prose', 'AI writing', 'humanize', or /axiom:humanize. Do NOT use for code quality — use other axiom skills."
|
|
4
|
+
user-invokable: true
|
|
5
|
+
metadata:
|
|
6
|
+
author: lvlup-sw
|
|
7
|
+
version: 0.1.0
|
|
8
|
+
category: assessment
|
|
9
|
+
dimensions:
|
|
10
|
+
- prose-quality
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Humanize — Prose Quality Assessment
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
Detects signs of AI-generated writing in prose content. Based on Wikipedia's "Signs of AI writing" guide maintained by WikiProject AI Cleanup. Covers 24 patterns across 5 categories: content, language/grammar, style, communication, and filler/hedging.
|
|
18
|
+
|
|
19
|
+
## Triggers
|
|
20
|
+
|
|
21
|
+
**Use when:**
|
|
22
|
+
- Reviewing documentation, README files, or user-facing copy
|
|
23
|
+
- Checking comments and docstrings for AI tells
|
|
24
|
+
- User says "humanize", "check prose", "AI writing patterns", "de-slop"
|
|
25
|
+
|
|
26
|
+
**Do NOT use when:**
|
|
27
|
+
- Reviewing code logic or architecture (use `axiom:critique`)
|
|
28
|
+
- Checking error handling (use `axiom:harden`)
|
|
29
|
+
- Running full quality audit (use `axiom:audit`, which includes humanize)
|
|
30
|
+
|
|
31
|
+
## Process
|
|
32
|
+
|
|
33
|
+
### Step 1: Scope Resolution
|
|
34
|
+
|
|
35
|
+
Determine assessment scope:
|
|
36
|
+
- **File:** Assess a single file
|
|
37
|
+
- **Directory:** Assess all prose-containing files (recursive)
|
|
38
|
+
- **Codebase:** Assess the entire project
|
|
39
|
+
|
|
40
|
+
Default file scope: `*.md`, `*.txt`, `*.mdx`, plus comments and user-facing strings in source files (`*.ts`, `*.js`, `*.py`, etc.).
|
|
41
|
+
|
|
42
|
+
Exclude: `node_modules/`, `dist/`, `.git/`, `CHANGELOG.md`, lock files, binary files, generated files.
|
|
43
|
+
|
|
44
|
+
### Step 2: Deterministic Scan
|
|
45
|
+
|
|
46
|
+
Run `axiom:scan` with `dimensions: prose-quality` for the resolved scope. This executes the PQ-* check catalog against the content.
|
|
47
|
+
|
|
48
|
+
### Step 3: Qualitative Assessment
|
|
49
|
+
|
|
50
|
+
Layer qualitative assessment on top of scan results:
|
|
51
|
+
- Read flagged sections in context -- some patterns are acceptable in certain contexts
|
|
52
|
+
- Check for pattern clustering (multiple AI tells in the same paragraph/section is worse than isolated occurrences)
|
|
53
|
+
- Assess overall tone -- does the content read as expert-written or machine-generated?
|
|
54
|
+
- Apply false-positive filtering per guidance in `@skills/humanize/references/ai-writing-patterns.md`
|
|
55
|
+
|
|
56
|
+
### Step 4: Produce Findings
|
|
57
|
+
|
|
58
|
+
Output findings in standard format: `@skills/backend-quality/references/findings-format.md`
|
|
59
|
+
|
|
60
|
+
Each finding includes:
|
|
61
|
+
- `dimension: "prose-quality"`
|
|
62
|
+
- `severity: HIGH | MEDIUM | LOW` per `@skills/humanize/references/severity-guide.md`
|
|
63
|
+
- `title`: Pattern name and location
|
|
64
|
+
- `evidence`: File path and line numbers
|
|
65
|
+
- `explanation`: What pattern was detected and why it matters
|
|
66
|
+
- `suggestion`: Concrete rewrite suggestion
|
|
67
|
+
|
|
68
|
+
## Error Handling
|
|
69
|
+
|
|
70
|
+
- **No prose files in scope:** Return "No prose content found in scope" with no findings
|
|
71
|
+
- **Binary/generated files:** Skip silently
|
|
72
|
+
- **Large files (>10K lines):** Sample first 1000 and last 1000 lines
|
|
73
|
+
|
|
74
|
+
## References
|
|
75
|
+
|
|
76
|
+
- Pattern catalog: `@skills/humanize/references/ai-writing-patterns.md`
|
|
77
|
+
- Severity mapping: `@skills/humanize/references/severity-guide.md`
|
|
78
|
+
- Finding format: `@skills/backend-quality/references/findings-format.md`
|
|
79
|
+
- Dimension taxonomy: `@skills/backend-quality/references/dimensions.md`
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# AI Writing Patterns Catalog
|
|
2
|
+
|
|
3
|
+
24 cataloged patterns for detecting AI-generated prose, organized into 5 categories. Based on Wikipedia's "Signs of AI writing" guide maintained by WikiProject AI Cleanup.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Category 1: Content Patterns
|
|
8
|
+
|
|
9
|
+
### PQ-1.1: Inflated Significance
|
|
10
|
+
|
|
11
|
+
- **Detection keywords/regex:** `(serves as a testament|pivotal (role|moment)|indelible mark|setting the stage|key turning point|evolving landscape)`
|
|
12
|
+
- **Problem:** Elevates mundane topics to cosmic importance. AI models default to grandiose framing because training data over-represents formal and promotional writing.
|
|
13
|
+
- **Before:** "This module serves as a testament to the team's commitment to fostering robust architecture."
|
|
14
|
+
- **After:** "This module handles event routing."
|
|
15
|
+
- **False-positive guidance:** Historical or genuinely significant events may warrant strong language. If the subject is a literal turning point (e.g., a major version migration), the phrase may be appropriate.
|
|
16
|
+
|
|
17
|
+
### PQ-1.2: Notability Emphasis
|
|
18
|
+
|
|
19
|
+
- **Detection keywords/regex:** `(independent coverage|leading expert|active social media presence|widely recognized|notable for)`
|
|
20
|
+
- **Problem:** Asserts notability without evidence. AI models insert Wikipedia-style notability markers to make subjects sound important.
|
|
21
|
+
- **Before:** "The library has received independent coverage from leading experts in the field."
|
|
22
|
+
- **After:** "The library is used by 200+ projects on GitHub."
|
|
23
|
+
- **False-positive guidance:** Legitimate when backed by specific citations. Flag only when the claim is vague or unsourced.
|
|
24
|
+
|
|
25
|
+
### PQ-1.3: Superficial -ing Analyses
|
|
26
|
+
|
|
27
|
+
- **Detection keywords/regex:** `(highlighting|underscoring|emphasizing|ensuring|reflecting|symbolizing|contributing to|cultivating|fostering|encompassing|showcasing)\s+(the|its|a|an)`
|
|
28
|
+
- **Problem:** Present participle phrases tacked on to create an illusion of depth. The -ing verb adds no information -- it just restates the obvious in fancier terms.
|
|
29
|
+
- **Before:** "The error handler catches exceptions, ensuring the application remains stable while highlighting the importance of robust error handling."
|
|
30
|
+
- **After:** "The error handler catches exceptions and returns a 500 status code."
|
|
31
|
+
- **False-positive guidance:** Active voice descriptions of ongoing processes are fine ("the service is currently processing requests"). Flag when the -ing phrase adds no new information.
|
|
32
|
+
|
|
33
|
+
### PQ-1.4: Promotional Language
|
|
34
|
+
|
|
35
|
+
- **Detection keywords/regex:** `(boasts a|vibrant|rich\s+(history|tradition|culture|ecosystem)|profound|nestled|in the heart of|groundbreaking|renowned|breathtaking|must-visit|stunning)`
|
|
36
|
+
- **Problem:** Loss of neutral, technical tone. AI models default to promotional language especially for cultural, geographic, or heritage topics.
|
|
37
|
+
- **Before:** "The framework boasts a vibrant ecosystem of plugins and a rich tradition of community-driven development."
|
|
38
|
+
- **After:** "The framework has 340 plugins maintained by 50+ contributors."
|
|
39
|
+
- **False-positive guidance:** Marketing copy where promotional tone is intentional. Technical docs should almost never use these words.
|
|
40
|
+
|
|
41
|
+
### PQ-1.5: Vague Attributions
|
|
42
|
+
|
|
43
|
+
- **Detection keywords/regex:** `(Industry reports|Observers have cited|Experts argue|Some critics argue|Many believe|It is widely believed|According to sources)`
|
|
44
|
+
- **Problem:** Creates false authority by attributing claims to unnamed experts. AI models use vague attribution when they lack specific sources.
|
|
45
|
+
- **Before:** "Experts argue that this approach represents a paradigm shift."
|
|
46
|
+
- **After:** "Martin Fowler's 2019 article 'Microservices Trade-Offs' argues this approach reduces deployment coupling."
|
|
47
|
+
- **False-positive guidance:** Legitimate when the vagueness is intentional (e.g., summarizing a debate without taking sides). Flag when used to bolster a specific claim.
|
|
48
|
+
|
|
49
|
+
### PQ-1.6: Formulaic Sections
|
|
50
|
+
|
|
51
|
+
- **Detection keywords/regex:** `(Despite its.*faces several challenges|Despite these challenges|Future Outlook|Looking Ahead|In Conclusion)`
|
|
52
|
+
- **Problem:** Template-like section transitions that signal generated structure. Real writers don't mechanically alternate between positive and negative sections.
|
|
53
|
+
- **Before:** "Despite its many strengths, the framework faces several challenges. Despite these challenges, the future looks bright."
|
|
54
|
+
- **After:** "Two open issues affect production use: memory leaks under high concurrency (#234) and missing ARM64 support (#567)."
|
|
55
|
+
- **False-positive guidance:** "In Conclusion" is conventional in academic writing. Flag primarily in technical documentation and README files.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Category 2: Language/Grammar Patterns
|
|
60
|
+
|
|
61
|
+
### PQ-2.1: AI Vocabulary Words
|
|
62
|
+
|
|
63
|
+
- **Detection keywords/regex:** `(additionally|align with|crucial|delve|emphasizing|enduring|enhance|fostering|garner|highlight\b|interplay|intricate|intricacies|key\s+(aspect|component|feature|element)|landscape\b|pivotal|showcase|tapestry|testament|underscore\b|valuable|vibrant)`
|
|
64
|
+
- **Problem:** These words appear far more frequently in AI output than in human writing. Individually they are fine; clustered together they create an unmistakable AI fingerprint.
|
|
65
|
+
- **Before:** "This crucial module delves into the intricate tapestry of event-sourced workflows, highlighting the interplay between producers and consumers."
|
|
66
|
+
- **After:** "This module stores events in SQLite and rebuilds state on read."
|
|
67
|
+
- **False-positive guidance:** Any single occurrence is fine. Flag when 3+ appear in the same paragraph. In technical writing, "key" as an adjective and "landscape" as a metaphor are the most common false positives.
|
|
68
|
+
|
|
69
|
+
### PQ-2.2: Copula Avoidance
|
|
70
|
+
|
|
71
|
+
- **Detection keywords/regex:** `(serves as|stands as|marks a|represents a|constitutes a|functions as|acts as a)\s+(a |an |the )`
|
|
72
|
+
- **Problem:** AI models avoid simple "is/are" constructions in favor of fancier verbs. This makes prose feel stilted and over-formal.
|
|
73
|
+
- **Before:** "This module serves as a bridge between the event store and the query layer."
|
|
74
|
+
- **After:** "This module is the bridge between the event store and the query layer." (Or better: "This module connects the event store to the query layer.")
|
|
75
|
+
- **False-positive guidance:** "Acts as" and "functions as" are sometimes genuinely clearer than "is" when describing behavior rather than identity.
|
|
76
|
+
|
|
77
|
+
### PQ-2.3: Negative Parallelisms
|
|
78
|
+
|
|
79
|
+
- **Detection keywords/regex:** `(Not only.*but (also)?|It's not just about.*it's (also)?|more than just|goes beyond)`
|
|
80
|
+
- **Problem:** Formulaic rhetorical structure that AI uses to build artificial momentum. Rarely adds meaning.
|
|
81
|
+
- **Before:** "It's not just about handling errors, it's about building a culture of reliability."
|
|
82
|
+
- **After:** "The error handler retries transient failures and circuits open after 3 consecutive timeouts."
|
|
83
|
+
- **False-positive guidance:** Legitimate in persuasive writing (blog posts, conference talks). Flag in technical docs and code comments.
|
|
84
|
+
|
|
85
|
+
### PQ-2.4: Rule of Three Overuse
|
|
86
|
+
|
|
87
|
+
- **Detection keywords/regex:** Three comma-separated items in a row, especially adjectives or abstract nouns. Manual check -- no single regex.
|
|
88
|
+
- **Problem:** AI models force ideas into groups of three for rhetorical effect, even when only two points exist or four would be more accurate.
|
|
89
|
+
- **Before:** "The system is fast, reliable, and scalable." (when only speed was measured)
|
|
90
|
+
- **After:** "The system handles 10K requests/second with p99 latency under 50ms."
|
|
91
|
+
- **False-positive guidance:** Three items is often natural. Flag only when items feel padded to reach three, or when the third item is vague/generic.
|
|
92
|
+
|
|
93
|
+
### PQ-2.5: Elegant Variation
|
|
94
|
+
|
|
95
|
+
- **Detection keywords/regex:** Manual check -- look for excessive synonym cycling within a paragraph (e.g., "users"/"individuals"/"people"/"stakeholders" all referring to the same group).
|
|
96
|
+
- **Problem:** AI models cycle through synonyms to avoid repetition, creating confusion about whether different terms refer to different things.
|
|
97
|
+
- **Before:** "Users configure the system. Individuals can customize their preferences. People set up notifications. Stakeholders manage access."
|
|
98
|
+
- **After:** "Users configure the system, customize preferences, set up notifications, and manage access."
|
|
99
|
+
- **False-positive guidance:** Technical writing should use consistent terms. Some variation is natural in longer prose. Flag when variation creates ambiguity.
|
|
100
|
+
|
|
101
|
+
### PQ-2.6: False Ranges
|
|
102
|
+
|
|
103
|
+
- **Detection keywords/regex:** `(from\s+\w+\s+to\s+\w+|range from|spanning from)`
|
|
104
|
+
- **Problem:** AI creates artificial ranges where the endpoints are not on a meaningful scale. "From beginners to experts" or "from development to production" are usually filler.
|
|
105
|
+
- **Before:** "The tool serves everyone from beginners to seasoned professionals."
|
|
106
|
+
- **After:** "The tool requires no prior experience with event sourcing."
|
|
107
|
+
- **False-positive guidance:** Legitimate when describing an actual continuum with meaningful endpoints. Flag when the range is vague or the endpoints are not comparable.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Category 3: Style Patterns
|
|
112
|
+
|
|
113
|
+
### PQ-3.1: Em Dash Overuse
|
|
114
|
+
|
|
115
|
+
- **Detection keywords/regex:** Count of `\u2014` (em dash) per file; flag if density > 1 per 100 words.
|
|
116
|
+
- **Problem:** ChatGPT overuses em dashes to create punchy, sales-copy-like rhythm. Natural writing uses them sparingly.
|
|
117
|
+
- **Before:** "The system handles events -- all of them -- in real time -- no exceptions."
|
|
118
|
+
- **After:** "The system handles all events in real time."
|
|
119
|
+
- **False-positive guidance:** Quoted dialogue and some editorial styles favor em dashes. Check overall density rather than flagging individual occurrences.
|
|
120
|
+
|
|
121
|
+
### PQ-3.2: Boldface Overuse
|
|
122
|
+
|
|
123
|
+
- **Detection keywords/regex:** Count of `\*\*[^*]+\*\*` per section; flag if >3 bold phrases per paragraph.
|
|
124
|
+
- **Problem:** AI models mechanically emphasize phrases. Too much boldface reduces its impact and creates visual noise.
|
|
125
|
+
- **Before:** "The **event store** provides **reliable** persistence with **guaranteed** ordering and **automatic** compaction."
|
|
126
|
+
- **After:** "The event store provides reliable persistence with guaranteed ordering and automatic compaction."
|
|
127
|
+
- **False-positive guidance:** Reference docs and API documentation often use bold for parameter names. Flag only in prose paragraphs, not in structured reference material.
|
|
128
|
+
|
|
129
|
+
### PQ-3.3: Inline-Header Vertical Lists
|
|
130
|
+
|
|
131
|
+
- **Detection keywords/regex:** `^\s*[-*]\s+\*\*[^*]+\*\*:` (bulleted items with bolded headers followed by colons)
|
|
132
|
+
- **Problem:** AI defaults to this format for any list, even when a simple bulleted list or a paragraph would be clearer. The pattern creates unnecessary visual weight.
|
|
133
|
+
- **Before:**
|
|
134
|
+
```
|
|
135
|
+
- **Performance:** The system is fast
|
|
136
|
+
- **Reliability:** The system is reliable
|
|
137
|
+
- **Scalability:** The system scales
|
|
138
|
+
```
|
|
139
|
+
- **After:** "The system is fast, reliable, and scales horizontally."
|
|
140
|
+
- **False-positive guidance:** This format is appropriate for glossaries, API parameter docs, and reference material. Flag when used for simple lists that would read better as prose.
|
|
141
|
+
|
|
142
|
+
### PQ-3.4: Title Case Headings
|
|
143
|
+
|
|
144
|
+
- **Detection keywords/regex:** Headings where all major words are capitalized (e.g., `^#+\s+([A-Z][a-z]+\s+){2,}[A-Z]`)
|
|
145
|
+
- **Problem:** AI defaults to title case headings. Most modern style guides (Google, Microsoft, AP) recommend sentence case for headings in technical writing.
|
|
146
|
+
- **Before:** `## Getting Started With Event Sourcing`
|
|
147
|
+
- **After:** `## Getting started with event sourcing`
|
|
148
|
+
- **False-positive guidance:** Title case is correct for proper nouns, product names, and some style guides (APA). This is a style preference, not a hard rule. Flag only when the project's own style guide prefers sentence case.
|
|
149
|
+
|
|
150
|
+
### PQ-3.5: Emojis in Prose
|
|
151
|
+
|
|
152
|
+
- **Detection keywords/regex:** Unicode emoji characters in headings or bullet points (excluding code blocks and quoted strings).
|
|
153
|
+
- **Problem:** AI models decorate headings and lists with emojis. Professional technical writing almost never uses emojis in headings or body text.
|
|
154
|
+
- **Before:** "## Features", "- Fast performance", "- Easy setup"
|
|
155
|
+
- **After:** "## Features", "- Fast performance", "- Easy setup" (identical but without emojis)
|
|
156
|
+
- **False-positive guidance:** Some projects intentionally use emojis (changelogs, README badges). Check project conventions before flagging.
|
|
157
|
+
|
|
158
|
+
### PQ-3.6: Curly Quotation Marks
|
|
159
|
+
|
|
160
|
+
- **Detection keywords/regex:** `[\u2018\u2019\u201C\u201D]` (Unicode curly single and double quotes)
|
|
161
|
+
- **Problem:** ChatGPT uses curly (typographic) quotation marks instead of straight quotes. In code-adjacent documentation, straight quotes are standard.
|
|
162
|
+
- **Before:** \u201CThis is a string\u201D
|
|
163
|
+
- **After:** "This is a string"
|
|
164
|
+
- **False-positive guidance:** Curly quotes are correct in published prose (books, articles). Flag only in technical documentation and code-adjacent content.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Category 4: Communication Patterns
|
|
169
|
+
|
|
170
|
+
### PQ-4.1: Collaborative Artifacts
|
|
171
|
+
|
|
172
|
+
- **Detection keywords/regex:** `(I hope this helps|Of course!|Certainly!|You're absolutely right|Would you like|let me know if|here is a|feel free to|don't hesitate to|happy to help)`
|
|
173
|
+
- **Problem:** Chatbot correspondence language left in shipped content. These phrases only make sense in a conversation between a user and an AI assistant.
|
|
174
|
+
- **Before:** "I hope this helps! Let me know if you'd like me to explain anything else."
|
|
175
|
+
- **After:** (Delete entirely -- this is chatbot conversation, not documentation.)
|
|
176
|
+
- **False-positive guidance:** Legitimate in user-facing chat interfaces and FAQ sections where conversational tone is intentional. Flag in all other documentation.
|
|
177
|
+
|
|
178
|
+
### PQ-4.2: Knowledge-Cutoff Disclaimers
|
|
179
|
+
|
|
180
|
+
- **Detection keywords/regex:** `(as of (my|this|the) (last|latest)|up to my last training|based on available information|while specific details are (limited|scarce)|at the time of (writing|this response))`
|
|
181
|
+
- **Problem:** AI model disclaimers about incomplete knowledge left in documentation. These reveal unreviewed AI output.
|
|
182
|
+
- **Before:** "As of my last training update, the API supports three endpoints."
|
|
183
|
+
- **After:** "The API supports three endpoints (v2.3.0)."
|
|
184
|
+
- **False-positive guidance:** "As of the latest release" or "at the time of writing" with a specific date are legitimate. Flag only when the phrasing reveals an AI knowledge cutoff.
|
|
185
|
+
|
|
186
|
+
### PQ-4.3: Sycophantic Tone
|
|
187
|
+
|
|
188
|
+
- **Detection keywords/regex:** `(Great question|That's a great|Excellent point|Absolutely[!,]|What a (great|wonderful|fantastic)|You're right to|Good thinking)`
|
|
189
|
+
- **Problem:** People-pleasing language that is inappropriate in technical documentation. Signals unreviewed AI output pasted directly from a chat session.
|
|
190
|
+
- **Before:** "Great question! The event store uses SQLite for persistence."
|
|
191
|
+
- **After:** "The event store uses SQLite for persistence."
|
|
192
|
+
- **False-positive guidance:** None in technical docs. Rare in any professional writing. Almost always an AI tell.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Category 5: Filler/Hedging Patterns
|
|
197
|
+
|
|
198
|
+
### PQ-5.1: Filler Phrases
|
|
199
|
+
|
|
200
|
+
- **Detection keywords/regex:** `(in order to|due to the fact that|at this point in time|in the event that|has the ability to|it is worth noting that|it is important to note|it should be noted that|needless to say)`
|
|
201
|
+
- **Problem:** Wordy phrases that can be simplified without losing meaning. AI models use them to pad output length.
|
|
202
|
+
- **Before:** "In order to ensure that the system has the ability to handle errors, it is important to note that..."
|
|
203
|
+
- **After:** "To handle errors..."
|
|
204
|
+
- **Simplification table:**
|
|
205
|
+
| Filler | Replacement |
|
|
206
|
+
|--------|-------------|
|
|
207
|
+
| In order to | To |
|
|
208
|
+
| Due to the fact that | Because |
|
|
209
|
+
| At this point in time | Now |
|
|
210
|
+
| In the event that | If |
|
|
211
|
+
| Has the ability to | Can |
|
|
212
|
+
| It is worth noting that | (delete or rephrase) |
|
|
213
|
+
| It is important to note | (delete or rephrase) |
|
|
214
|
+
- **False-positive guidance:** Legal or formal contexts where precision requires verbosity. "In order to" is sometimes clearer than "to" when the infinitive could be misread.
|
|
215
|
+
|
|
216
|
+
### PQ-5.2: Excessive Hedging
|
|
217
|
+
|
|
218
|
+
- **Detection keywords/regex:** `(could potentially|might possibly|may potentially|it could be argued|one might suggest|there is a possibility|to some extent|in some cases|it is possible that)`
|
|
219
|
+
- **Problem:** Over-qualifying statements strips them of usefulness. Technical docs should be direct.
|
|
220
|
+
- **Before:** "It could potentially be argued that this approach might possibly offer some advantages in certain scenarios."
|
|
221
|
+
- **After:** "This approach reduces memory usage by 40%."
|
|
222
|
+
- **False-positive guidance:** Some hedging is appropriate when genuinely uncertain (e.g., "performance may vary depending on hardware"). Flag stacked hedges (2+ qualifying phrases in one sentence).
|
|
223
|
+
|
|
224
|
+
### PQ-5.3: Generic Positive Conclusions
|
|
225
|
+
|
|
226
|
+
- **Detection keywords/regex:** `(the future looks bright|exciting times|looking forward to|great potential|paving the way|on the right track|poised for|well-positioned)`
|
|
227
|
+
- **Problem:** Vague upbeat endings without substance. AI models default to optimistic conclusions that say nothing specific.
|
|
228
|
+
- **Before:** "The future looks bright for this framework, and we look forward to exciting times ahead."
|
|
229
|
+
- **After:** "The v3.0 roadmap includes WebSocket support (Q2) and horizontal scaling (Q3)."
|
|
230
|
+
- **False-positive guidance:** Genuine forward-looking statements with specific plans attached are fine. Flag only when the conclusion is vague and could apply to anything.
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Frequency-Based Escalation
|
|
235
|
+
|
|
236
|
+
Not all occurrences warrant the same severity. Use these escalation rules:
|
|
237
|
+
|
|
238
|
+
| Pattern Type | 1 occurrence | 3+ in paragraph | 5+ in paragraph | 3+ in file |
|
|
239
|
+
|-------------|-------------|-----------------|-----------------|------------|
|
|
240
|
+
| AI vocabulary (PQ-2.1) | Ignore | MEDIUM | HIGH | MEDIUM |
|
|
241
|
+
| Structural tells (PQ-3.x) | LOW | MEDIUM | MEDIUM | MEDIUM |
|
|
242
|
+
| Filler phrases (PQ-5.1) | Ignore | LOW | MEDIUM | LOW |
|
|
243
|
+
| Communication (PQ-4.x) | HIGH | HIGH | HIGH | HIGH |
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Prose Quality Severity Guide
|
|
2
|
+
|
|
3
|
+
Severity mappings for each AI-writing pattern, with rationale and frequency-based escalation rules.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## HIGH Severity
|
|
8
|
+
|
|
9
|
+
Dead giveaways of unreviewed AI output. These should never appear in shipped content.
|
|
10
|
+
|
|
11
|
+
| Pattern ID | Pattern Name | Rationale |
|
|
12
|
+
|-----------|-------------|-----------|
|
|
13
|
+
| PQ-4.1 | Collaborative artifacts | Chatbot language ("I hope this helps") in documentation is an obvious copy-paste from an AI session |
|
|
14
|
+
| PQ-4.2 | Knowledge-cutoff disclaimers | "As of my last training update" in docs reveals AI-generated content that was never reviewed |
|
|
15
|
+
| PQ-4.3 | Sycophantic tone | "Great question!" in technical docs is inappropriate in any context |
|
|
16
|
+
| PQ-2.1 | AI vocabulary (5+ cluster) | Five or more AI-typical words in one paragraph creates an unmistakable AI fingerprint |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## MEDIUM Severity
|
|
21
|
+
|
|
22
|
+
Patterns that cluster to create an AI-generated feel. Individually tolerable, but multiple occurrences signal low editorial effort.
|
|
23
|
+
|
|
24
|
+
| Pattern ID | Pattern Name | Rationale |
|
|
25
|
+
|-----------|-------------|-----------|
|
|
26
|
+
| PQ-1.1 | Inflated significance | Grandiose framing makes mundane topics sound absurd |
|
|
27
|
+
| PQ-1.3 | Superficial -ing analyses | Participial phrases that restate the obvious in fancier terms |
|
|
28
|
+
| PQ-1.4 | Promotional language | Loss of neutral, technical tone |
|
|
29
|
+
| PQ-2.1 | AI vocabulary (3-4 cluster) | Noticeable AI fingerprint but not overwhelming |
|
|
30
|
+
| PQ-2.2 | Copula avoidance | Over-formal "serves as" / "stands as" instead of simple "is" |
|
|
31
|
+
| PQ-2.3 | Negative parallelisms | "Not only...but also" rhetorical formula |
|
|
32
|
+
| PQ-5.3 | Generic positive conclusions | Vague upbeat endings with no substance |
|
|
33
|
+
| PQ-1.5 | Vague attributions | False authority via unnamed experts |
|
|
34
|
+
| PQ-1.6 | Formulaic sections | Template-like section transitions |
|
|
35
|
+
| PQ-2.4 | Rule of three overuse | Forced triadic groupings |
|
|
36
|
+
| PQ-2.6 | False ranges | Artificial ranges with non-comparable endpoints |
|
|
37
|
+
| PQ-1.2 | Notability emphasis | Unsubstantiated notability claims |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## LOW Severity
|
|
42
|
+
|
|
43
|
+
Minor style issues. Worth fixing in a polish pass but not urgent.
|
|
44
|
+
|
|
45
|
+
| Pattern ID | Pattern Name | Rationale |
|
|
46
|
+
|-----------|-------------|-----------|
|
|
47
|
+
| PQ-3.1 | Em dash overuse | Style preference; only a problem at high density |
|
|
48
|
+
| PQ-3.5 | Emojis in prose | May be intentional per project conventions |
|
|
49
|
+
| PQ-5.1 | Filler phrases (isolated) | Single occurrences of wordy phrases are minor |
|
|
50
|
+
| PQ-5.2 | Excessive hedging (isolated) | Some hedging is appropriate for uncertainty |
|
|
51
|
+
| PQ-3.2 | Boldface overuse | Visual noise but does not affect meaning |
|
|
52
|
+
| PQ-3.3 | Inline-header vertical lists | Format preference; appropriate in some contexts |
|
|
53
|
+
| PQ-3.4 | Title case headings | Style guide dependent |
|
|
54
|
+
| PQ-3.6 | Curly quotation marks | Typographic preference |
|
|
55
|
+
| PQ-2.5 | Elegant variation | Confusing synonym cycling |
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Frequency-Based Escalation Rules
|
|
60
|
+
|
|
61
|
+
Base severity can be escalated based on pattern density:
|
|
62
|
+
|
|
63
|
+
### AI Vocabulary (PQ-2.1)
|
|
64
|
+
- **1 occurrence in paragraph:** Ignore (no finding)
|
|
65
|
+
- **3-4 occurrences in paragraph:** MEDIUM
|
|
66
|
+
- **5+ occurrences in paragraph:** HIGH
|
|
67
|
+
- **3+ occurrences across file (non-clustered):** MEDIUM
|
|
68
|
+
|
|
69
|
+
### Structural Tells (PQ-3.x)
|
|
70
|
+
- **1-2 occurrences in file:** LOW
|
|
71
|
+
- **3+ occurrences in file:** MEDIUM
|
|
72
|
+
|
|
73
|
+
### Filler Phrases (PQ-5.1)
|
|
74
|
+
- **1 occurrence in paragraph:** Ignore
|
|
75
|
+
- **3+ in paragraph:** LOW
|
|
76
|
+
- **5+ in paragraph:** MEDIUM
|
|
77
|
+
- **3+ across file:** LOW
|
|
78
|
+
|
|
79
|
+
### Communication Patterns (PQ-4.x)
|
|
80
|
+
- **Any occurrence:** HIGH (no escalation needed; always critical)
|
|
81
|
+
|
|
82
|
+
### Content Patterns (PQ-1.x)
|
|
83
|
+
- **Isolated occurrence:** Base severity
|
|
84
|
+
- **3+ in same section:** Escalate one level (LOW -> MEDIUM, MEDIUM -> HIGH)
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Context Modifiers
|
|
89
|
+
|
|
90
|
+
Severity may be adjusted based on where the pattern appears:
|
|
91
|
+
|
|
92
|
+
| Context | Modifier |
|
|
93
|
+
|---------|----------|
|
|
94
|
+
| User-facing documentation (README, guides) | No change (base severity) |
|
|
95
|
+
| Internal comments and docstrings | Reduce one level |
|
|
96
|
+
| Marketing copy or landing pages | Promotional language (PQ-1.4) acceptable; reduce to LOW |
|
|
97
|
+
| Changelogs and release notes | Formulaic sections (PQ-1.6) acceptable; reduce to LOW |
|
|
98
|
+
| Chat interface copy | Collaborative artifacts (PQ-4.1) acceptable; reduce to LOW |
|