@mrclrchtr/supi-flow 0.6.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -20
- package/{src → extensions}/cli.ts +38 -27
- package/{src → extensions}/index.ts +29 -54
- package/{src → extensions}/tools/flow-tools.ts +59 -33
- package/{src → extensions}/tools/tndm-cli.ts +1 -44
- package/package.json +18 -12
- package/prompts/supi-coding-retro.md +52 -7
- package/skills/supi-flow-archive/SKILL.md +21 -24
- package/skills/supi-flow-plan/SKILL.md +2 -2
- package/skills/supi-flow-slop-detect/SKILL.md +0 -393
- package/skills/supi-flow-slop-detect/references/vocabulary.json +0 -161
- package/skills/supi-flow-slop-detect/scripts/slop-helpers.ts +0 -301
- package/skills/supi-flow-slop-detect/scripts/slop-scan-structural.ts +0 -269
- package/skills/supi-flow-slop-detect/scripts/slop-scan-vocab.ts +0 -161
- package/skills/supi-flow-slop-detect/scripts/slop-scan.ts +0 -209
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: supi-flow-archive
|
|
3
|
-
description: Verify implementation against the plan, update living documentation,
|
|
3
|
+
description: Verify implementation against the plan, update living documentation, and close out the change.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Archive and document
|
|
@@ -52,21 +52,7 @@ Update docs only where the change actually affects them.
|
|
|
52
52
|
3. Update them with grounded, specific language.
|
|
53
53
|
4. Reference actual file paths, commands, settings, or behavior when helpful.
|
|
54
54
|
|
|
55
|
-
## Step 4:
|
|
56
|
-
|
|
57
|
-
Load `/skill:supi-flow-slop-detect` and scan every edited documentation file.
|
|
58
|
-
|
|
59
|
-
Quality checks:
|
|
60
|
-
|
|
61
|
-
- no tier-1 slop words in edited docs
|
|
62
|
-
- claims are grounded in specifics
|
|
63
|
-
- wording is direct, not formulaic
|
|
64
|
-
- AI-sycophantic filler is removed
|
|
65
|
-
- the slop score is acceptable
|
|
66
|
-
|
|
67
|
-
If the scan fails, fix the docs and re-scan.
|
|
68
|
-
|
|
69
|
-
## Step 5: Verify doc accuracy
|
|
55
|
+
## Step 4: Verify doc accuracy
|
|
70
56
|
|
|
71
57
|
Do the docs match the actual code and workflow?
|
|
72
58
|
|
|
@@ -77,18 +63,29 @@ Do the docs match the actual code and workflow?
|
|
|
77
63
|
|
|
78
64
|
Do not assume documentation is correct just because it sounds right.
|
|
79
65
|
|
|
80
|
-
## Step
|
|
66
|
+
## Step 5: Close out
|
|
81
67
|
|
|
82
68
|
- Call `supi_flow_close { ticket_id: "<ID>", verification_results: "..." }` with the full verification evidence.
|
|
83
|
-
This will set status=done, tags=flow:done, store verification results in archive.md
|
|
69
|
+
This will set status=done, tags=flow:done, and store verification results in archive.md.
|
|
84
70
|
- There is no ticket-less closeout.
|
|
85
71
|
|
|
86
|
-
## Step
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
72
|
+
## Step 6: Commit or finish
|
|
73
|
+
|
|
74
|
+
```instructions
|
|
75
|
+
run("git status")
|
|
76
|
+
if only_changed(".tndm/"):
|
|
77
|
+
commit(".tndm/", "chore(tndm): close <ticket_id>")
|
|
78
|
+
say("The ticket is closed. All changes are committed.")
|
|
79
|
+
else:
|
|
80
|
+
ask_user("Commit all changes now, including .tndm/, or finish and commit manually?")
|
|
81
|
+
if user_chose_commit_now:
|
|
82
|
+
if skill_exists_matching("commit"):
|
|
83
|
+
use_skill_matching("commit")
|
|
84
|
+
else:
|
|
85
|
+
git_add_all()
|
|
86
|
+
git_commit()
|
|
87
|
+
else:
|
|
88
|
+
say("The ticket is closed. Remember to commit your changes when ready.")
|
|
92
89
|
```
|
|
93
90
|
|
|
94
91
|
## Red flags
|
|
@@ -49,10 +49,10 @@ Use enough detail that an agent can execute without guessing, but do not force h
|
|
|
49
49
|
|
|
50
50
|
```markdown
|
|
51
51
|
- [ ] **Task 1**: Create the CLI helper module
|
|
52
|
-
- File: `
|
|
52
|
+
- File: `extensions/cli.ts`
|
|
53
53
|
- Verification: `pnpm exec tsc --noEmit`
|
|
54
54
|
- [ ] **Task 2**: Register the tools
|
|
55
|
-
- File: `
|
|
55
|
+
- File: `extensions/tools/tndm-cli.ts`
|
|
56
56
|
- Verification: `pnpm exec vitest run`
|
|
57
57
|
```
|
|
58
58
|
|
|
@@ -1,393 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: supi-flow-slop-detect
|
|
3
|
-
description: Detect and fix AI-generated prose markers ("slop") in documentation. Use this whenever the user wants to check, review, or improve docs for AI-sounding language — slop detection, prose quality, writing review, AI text cleanup, documentation polish. Automatically loaded during /supi-flow-archive when updating docs.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Slop Detection
|
|
7
|
-
|
|
8
|
-
Scan documentation for AI-prose markers and fix them. Use during the archive phase after doc edits.
|
|
9
|
-
|
|
10
|
-
## Scan workflow
|
|
11
|
-
|
|
12
|
-
1. Read the edited documentation files
|
|
13
|
-
2. Classify each file by profile: skill, technical, or prose
|
|
14
|
-
3. Scan for vocabulary markers (Tiers 1-4) and structural patterns (below)
|
|
15
|
-
4. For each hit: substitute with specific, grounded language
|
|
16
|
-
5. Re-read the fixed text — does it still say the same thing with better words?
|
|
17
|
-
6. Re-scan to confirm score dropped below threshold
|
|
18
|
-
|
|
19
|
-
**Principles:**
|
|
20
|
-
- Preserve meaning — change how it's said, not what's said
|
|
21
|
-
- Match context — skill docs and technical docs need different thresholds than narrative prose
|
|
22
|
-
- Be specific — replace abstract adjectives with concrete claims (version numbers, file paths, measurements)
|
|
23
|
-
- Prefer active voice — "it validates input" not "input is validated"
|
|
24
|
-
- Keep useful technical shorthand when it improves clarity
|
|
25
|
-
- Never change code — only edit prose/docstrings/comments
|
|
26
|
-
|
|
27
|
-
## Document profiles
|
|
28
|
-
|
|
29
|
-
The scanner should not treat every Markdown file the same.
|
|
30
|
-
|
|
31
|
-
- **skill** — `**/skills/**/SKILL.md`; instructional, operational, list-heavy
|
|
32
|
-
- **technical** — READMEs, architecture docs, setup docs, reference material
|
|
33
|
-
- **prose** — narrative or essay-like documents
|
|
34
|
-
|
|
35
|
-
Profiles mostly affect structural scoring:
|
|
36
|
-
|
|
37
|
-
- **skill:** allow compact workflow notation, higher bullet density, and occasional clarifying em dashes
|
|
38
|
-
- **technical:** allow architecture and data-flow notation, but keep tighter structure checks
|
|
39
|
-
- **prose:** use the strictest structural thresholds
|
|
40
|
-
|
|
41
|
-
Vocabulary, hype, and sycophantic phrasing stay strict across all profiles.
|
|
42
|
-
|
|
43
|
-
## Vocabulary markers
|
|
44
|
-
|
|
45
|
-
### Tier 1: High-confidence markers (score 3 each)
|
|
46
|
-
|
|
47
|
-
| AI Word | Context | Replace with |
|
|
48
|
-
|---------|---------|-------------|
|
|
49
|
-
| delve | "delve into" | explore, examine, look at |
|
|
50
|
-
| tapestry | "rich tapestry" | mix, combination, variety |
|
|
51
|
-
| realm | "in the realm of" | in, within, regarding |
|
|
52
|
-
| embark | "embark on a journey" | start, begin |
|
|
53
|
-
| beacon | "a beacon of" | example, model |
|
|
54
|
-
| spearheaded | formal attribution | led, started |
|
|
55
|
-
| leverage | business jargon | use, apply |
|
|
56
|
-
| robust | quality signal | solid, strong, reliable |
|
|
57
|
-
| seamless | integration claim | smooth, easy, simple |
|
|
58
|
-
| pivotal | importance marker | key, important |
|
|
59
|
-
| multifaceted | complexity signal | complex, varied |
|
|
60
|
-
| comprehensive | scope claim | thorough, complete |
|
|
61
|
-
| nuanced | sophistication signal | subtle, detailed |
|
|
62
|
-
| meticulous | care signal | careful, detailed |
|
|
63
|
-
| intricate | complexity marker | detailed, complex |
|
|
64
|
-
| showcasing | display verb | showing, displaying |
|
|
65
|
-
| streamline | optimization verb | simplify, improve |
|
|
66
|
-
| facilitate | enablement verb | enable, help, allow |
|
|
67
|
-
| utilize | formal "use" | use |
|
|
68
|
-
|
|
69
|
-
### Tier 2: Context-dependent markers (score 2 each)
|
|
70
|
-
|
|
71
|
-
| Category | Words |
|
|
72
|
-
|----------|-------|
|
|
73
|
-
| Transition overuse | moreover, furthermore, indeed, notably, subsequently |
|
|
74
|
-
| Intensity clustering | significantly, substantially, fundamentally, profoundly |
|
|
75
|
-
| Hedging stacks | potentially, typically, often, might, perhaps |
|
|
76
|
-
| Action inflation | revolutionize, transform, unlock, unleash, elevate |
|
|
77
|
-
| Empty emphasis | crucial, vital, essential, paramount |
|
|
78
|
-
|
|
79
|
-
### Tier 3: Phrase patterns (score 2-4)
|
|
80
|
-
|
|
81
|
-
| Phrase | Score | Replacement |
|
|
82
|
-
|--------|-------|-------------|
|
|
83
|
-
| "In today's fast-paced world" | 4 | Delete — start with the point |
|
|
84
|
-
| "It's worth noting that" | 3 | Delete — just state the thing |
|
|
85
|
-
| "At its core" | 2 | "Fundamentally" or delete |
|
|
86
|
-
| "Cannot be overstated" | 3 | "is important because [reason]" |
|
|
87
|
-
| "Navigate the complexities" | 4 | "handle", "work through" |
|
|
88
|
-
| "Unlock the potential" | 4 | "enable", "make possible" |
|
|
89
|
-
| "A testament to" | 3 | "shows", "demonstrates" |
|
|
90
|
-
| "Treasure trove of" | 3 | "collection", "set" |
|
|
91
|
-
| "Game changer" | 3 | Delete — be specific |
|
|
92
|
-
| "Ever-evolving landscape" | 4 | Delete — be specific |
|
|
93
|
-
| "Look no further" | 4 | Delete — state the answer |
|
|
94
|
-
| "Hustle and bustle" | 3 | Delete — filler |
|
|
95
|
-
|
|
96
|
-
### Tier 4: Sycophantic markers (score 2 each)
|
|
97
|
-
|
|
98
|
-
Especially relevant in conversational or instructional content.
|
|
99
|
-
|
|
100
|
-
| Phrase | Issue |
|
|
101
|
-
|--------|-------|
|
|
102
|
-
| "I'd be happy to" | Servile opener |
|
|
103
|
-
| "Great question!" | Empty validation |
|
|
104
|
-
| "Absolutely!" | Over-agreement |
|
|
105
|
-
| "That's a wonderful point" | Flattery |
|
|
106
|
-
| "I'm glad you asked" | Filler |
|
|
107
|
-
| "You're absolutely right" | Sycophancy |
|
|
108
|
-
|
|
109
|
-
These phrases add no information and signal generated content.
|
|
110
|
-
|
|
111
|
-
## Structural patterns
|
|
112
|
-
|
|
113
|
-
### Em dash density
|
|
114
|
-
|
|
115
|
-
Em dashes are a weak signal by themselves. What matters is repetitive, decorative use.
|
|
116
|
-
|
|
117
|
-
Baseline guidance:
|
|
118
|
-
|
|
119
|
-
| Density | Signal |
|
|
120
|
-
|---------|--------|
|
|
121
|
-
| 0-2 | Normal |
|
|
122
|
-
| 3-5 | Elevated — review |
|
|
123
|
-
| 6+ | Strong AI signal in most docs |
|
|
124
|
-
|
|
125
|
-
Profile adjustments:
|
|
126
|
-
- **skill:** higher tolerance for compact instructional labels
|
|
127
|
-
- **technical/prose:** stricter review once density gets high
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
# Count em dashes in a file
|
|
131
|
-
grep -o '—' file.md | wc -l
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
_Also detected by `scripts/slop-scan-structural.ts` with profile-aware thresholds._
|
|
135
|
-
|
|
136
|
-
### Tricolon detection
|
|
137
|
-
|
|
138
|
-
AI loves groups of three adjectives with alliteration or similar sounds:
|
|
139
|
-
- "fast, efficient, and reliable" → pick the most accurate one
|
|
140
|
-
- "clear, concise, and compelling" → "clear and concise"
|
|
141
|
-
- "robust, reliable, and resilient" → "reliable"
|
|
142
|
-
|
|
143
|
-
Pattern: `adjective, adjective, and adjective` with similar sounds. Flag when >1 per 500 words.
|
|
144
|
-
|
|
145
|
-
### Sentence length clustering
|
|
146
|
-
|
|
147
|
-
AI clusters sentences in the 15-25 word range. Human writing varies from 3-word fragments to 40+ word complex sentences. AI avoids both extremes.
|
|
148
|
-
|
|
149
|
-
Check: if >70% of sentences fall in 15-25 word range → strong AI signal. Vary rhythm by adding short punchy sentences and occasional long ones.
|
|
150
|
-
|
|
151
|
-
### Paragraph symmetry
|
|
152
|
-
|
|
153
|
-
AI produces "blocky" text with uniform paragraph lengths. If most paragraphs cluster around the same word count (e.g., 40-60 words each) → flag. Break symmetry: vary paragraph length, use single-sentence paragraphs for emphasis.
|
|
154
|
-
|
|
155
|
-
_Detected by `scripts/slop-scan-structural.ts` as `paragraphUniformity` score (threshold: > 0.7)._
|
|
156
|
-
|
|
157
|
-
### Bullet-to-prose ratio
|
|
158
|
-
|
|
159
|
-
| Ratio | Signal |
|
|
160
|
-
|-------|--------|
|
|
161
|
-
| 0-30% | Normal |
|
|
162
|
-
| 30-50% | Elevated |
|
|
163
|
-
| 50-70% | High in technical/prose docs |
|
|
164
|
-
| 70%+ | Very high AI signal in most docs |
|
|
165
|
-
|
|
166
|
-
Profile adjustments:
|
|
167
|
-
- **skill:** allow a higher bullet ratio for checklists, procedures, and operator guidance
|
|
168
|
-
- **technical:** medium threshold
|
|
169
|
-
- **prose:** lowest threshold
|
|
170
|
-
|
|
171
|
-
Emoji-led bullets (e.g., `✅`, `❌`, `🔴`) in technical documentation are still a strong AI tell.
|
|
172
|
-
|
|
173
|
-
### Intro-body-conclusion structure
|
|
174
|
-
|
|
175
|
-
AI defaults to: intro paragraph + three body sections + conclusion that restates intro. Check for:
|
|
176
|
-
1. Opening paragraph that restates the question
|
|
177
|
-
2. Three distinct middle sections
|
|
178
|
-
3. Closing paragraph that summarizes without adding new information
|
|
179
|
-
|
|
180
|
-
If detected: cut the intro and conclusion. Start at the first paragraph with actual content.
|
|
181
|
-
|
|
182
|
-
_Detected by `scripts/slop-scan-structural.ts` as `introBodyConclusion`._
|
|
183
|
-
|
|
184
|
-
### Participial phrase tail-loading
|
|
185
|
-
|
|
186
|
-
AI appends present participial (-ing) phrases to sentence ends at 2-5x the human rate.
|
|
187
|
-
|
|
188
|
-
Pattern: `[Main clause], [present participle] [detail].`
|
|
189
|
-
|
|
190
|
-
Examples (all AI signals):
|
|
191
|
-
- "The framework processes requests, **enabling** developers to scale."
|
|
192
|
-
- "The policy was implemented, **marking** a shift in approach."
|
|
193
|
-
- "She published findings, **contributing** to the body of research."
|
|
194
|
-
|
|
195
|
-
Fix: split into two sentences or restructure. 3+ in a paragraph → rewrite.
|
|
196
|
-
|
|
197
|
-
### "From X to Y" range construction
|
|
198
|
-
|
|
199
|
-
AI uses this template to express scope at much higher rates:
|
|
200
|
-
- "From beginners to experts"
|
|
201
|
-
- "From simple scripts to complex applications"
|
|
202
|
-
|
|
203
|
-
Flag when >1 per 500 words. Replace with direct statement: "works for all skill levels."
|
|
204
|
-
|
|
205
|
-
_Detected by `scripts/slop-scan-structural.ts`._
|
|
206
|
-
|
|
207
|
-
### Correlative conjunction overuse
|
|
208
|
-
|
|
209
|
-
AI over-relies on correlative pairs in close proximity:
|
|
210
|
-
|
|
211
|
-
| Pattern | Example |
|
|
212
|
-
|---------|---------|
|
|
213
|
-
| "not only...but also" | "not only improves X, but also Y" |
|
|
214
|
-
| "whether...or" | "whether you're a beginner or expert" |
|
|
215
|
-
| "not just...but" | "not just a tool, but a platform" |
|
|
216
|
-
|
|
217
|
-
2+ correlative pairs in the same paragraph → flag.
|
|
218
|
-
|
|
219
|
-
### Colon addiction and semicolon avoidance
|
|
220
|
-
|
|
221
|
-
AI uses colons to introduce explanations at 3-5x the human rate. Meanwhile, AI rarely uses semicolons. The ratio of em dashes to semicolons is skewed compared to human writing.
|
|
222
|
-
|
|
223
|
-
Check: if em dashes > 5 and semicolons = 0 → strong AI signal.
|
|
224
|
-
|
|
225
|
-
### Arrow connectors
|
|
226
|
-
|
|
227
|
-
Arrow notation is context-sensitive.
|
|
228
|
-
|
|
229
|
-
**Allowed when used as compact technical notation:**
|
|
230
|
-
- workflow chains: `brainstorm → plan → apply`
|
|
231
|
-
- architecture or boundary descriptions: `CLI → tool → service`
|
|
232
|
-
- single-step technical transitions: `request → response`, `parser → AST`, `draft → published`
|
|
233
|
-
- data-flow or state-flow summaries
|
|
234
|
-
- diagrams, breadcrumbs, and type signatures
|
|
235
|
-
|
|
236
|
-
**Flag when used as vague prose shorthand:**
|
|
237
|
-
- "this change -> improves productivity"
|
|
238
|
-
- "the tool → makes things easier"
|
|
239
|
-
|
|
240
|
-
Rule of thumb: keep arrows when they connect short technical phrases. Replace them when they stand in for normal sentence prose.
|
|
241
|
-
|
|
242
|
-
```bash
|
|
243
|
-
# Detect arrows in prose (exclude code blocks)
|
|
244
|
-
awk '/^```/{c=!c}!c' file.md | rg -o '\s->\s|→' | wc -l
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
_Also detected by `scripts/slop-scan-structural.ts`, which separates technical chains from prose shorthand._
|
|
248
|
-
|
|
249
|
-
### Plus-sign conjunction
|
|
250
|
-
|
|
251
|
-
AI uses `+` as a conjunction ("X + Y") in prose instead of "and" or "with". Fine in code, math, and labels.
|
|
252
|
-
|
|
253
|
-
- "hooks + skills" (slop) → "hooks and skills" (human)
|
|
254
|
-
- "1 + 1 = 2" (fine, math)
|
|
255
|
-
|
|
256
|
-
Flag when >1 prose plus-sign appears outside code blocks.
|
|
257
|
-
|
|
258
|
-
_Also detected by `scripts/slop-scan-structural.ts` (included in structural score)._
|
|
259
|
-
|
|
260
|
-
### Conclusion mirroring
|
|
261
|
-
|
|
262
|
-
AI introductions and conclusions are near-paraphrases of each other. If the first and last paragraphs express the same idea using different words → cut the conclusion. Human writing ends with specifics, callbacks, questions, or simply stops.
|
|
263
|
-
|
|
264
|
-
### Perfect grammar signals
|
|
265
|
-
|
|
266
|
-
| Pattern | Human Range | AI Signal |
|
|
267
|
-
|---------|-------------|-----------|
|
|
268
|
-
| Contractions (don't, can't, it's) | Common | Rare/absent |
|
|
269
|
-
| Oxford commas | Variable | Always present |
|
|
270
|
-
| Typos | Occasional | None |
|
|
271
|
-
| Sentence fragments | Present | Rare |
|
|
272
|
-
| Starting sentences with "And" or "But" | Common | Rare |
|
|
273
|
-
| Register shifts (formal ↔ casual) | Present | Uniform |
|
|
274
|
-
|
|
275
|
-
Too-perfect grammar with no contractions, no fragments, uniform register → suspicious.
|
|
276
|
-
|
|
277
|
-
## Density scoring
|
|
278
|
-
|
|
279
|
-
```
|
|
280
|
-
vocab_score = (tier1_count × 3 + tier2_count × 2 + tier4_count × 2 + phrase_count × avg_phrase_score) / word_count × 100
|
|
281
|
-
|
|
282
|
-
structural_score:
|
|
283
|
-
+2 if em_dash_density exceeds the profile threshold
|
|
284
|
-
+2 if sentence_cluster_ratio > 0.7
|
|
285
|
-
+2 if bullet_ratio exceeds the profile threshold
|
|
286
|
-
+2 if paragraph_uniformity > 0.7
|
|
287
|
-
+1 if emoji_bullets present
|
|
288
|
-
+2 if participial_tail_count > 3 per 500 words
|
|
289
|
-
+2 if intro-body-conclusion structure detected (except relaxed skill profile)
|
|
290
|
-
+1 if correlative_pairs > 2
|
|
291
|
-
+1 if prose_arrow_connectors > 0
|
|
292
|
-
+1 if plus_conjunctions exceed the profile threshold
|
|
293
|
-
+1 if em_dashes exceed the profile threshold AND semicolons = 0
|
|
294
|
-
+1 if conclusion_mirroring detected
|
|
295
|
-
|
|
296
|
-
final_score = vocab_score + structural_score (cap at 10)
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
| Score | Rating | Action |
|
|
300
|
-
|-------|--------|--------|
|
|
301
|
-
| 0-1.0 | Clean | No action needed |
|
|
302
|
-
| 1.0-2.5 | Light | Spot remediation — fix individual markers |
|
|
303
|
-
| 2.5-5.0 | Moderate | Section rewrite recommended |
|
|
304
|
-
| 5.0+ | Heavy | Full document review — do not commit |
|
|
305
|
-
|
|
306
|
-
Target: score < 1.5 before committing documentation.
|
|
307
|
-
|
|
308
|
-
## Automated scripts
|
|
309
|
-
|
|
310
|
-
Cross-platform Node.js/TypeScript scripts in `scripts/` automate the detection. They run anywhere pi runs (macOS, Linux, Windows).
|
|
311
|
-
|
|
312
|
-
### Prerequisites
|
|
313
|
-
|
|
314
|
-
The scripts use `pnpm exec jiti` (already available in the SuPi workspace).
|
|
315
|
-
|
|
316
|
-
```bash
|
|
317
|
-
# From repo root
|
|
318
|
-
pnpm exec jiti packages/supi-flow/skills/supi-flow-slop-detect/scripts/slop-scan.ts <file>
|
|
319
|
-
|
|
320
|
-
# Or from anywhere via relative path
|
|
321
|
-
pnpm exec jiti path/to/scripts/slop-scan.ts <file>
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
### Available scripts
|
|
325
|
-
|
|
326
|
-
#### `slop-scan.ts` — Combined scanner
|
|
327
|
-
|
|
328
|
-
Runs vocabulary + structural detection, computes final density score (capped at 10).
|
|
329
|
-
|
|
330
|
-
```bash
|
|
331
|
-
# Human-readable summary
|
|
332
|
-
pnpm exec jiti scripts/slop-scan.ts README.md
|
|
333
|
-
|
|
334
|
-
# Machine-readable JSON (for agent post-processing)
|
|
335
|
-
pnpm exec jiti scripts/slop-scan.ts README.md --json-only
|
|
336
|
-
|
|
337
|
-
# Multiple files
|
|
338
|
-
pnpm exec jiti scripts/slop-scan.ts docs/*.md --json-only
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
Output fields consumed by the agent:
|
|
342
|
-
|
|
343
|
-
```json
|
|
344
|
-
{
|
|
345
|
-
"file": "README.md",
|
|
346
|
-
"profile": "technical",
|
|
347
|
-
"adjustments": ["technical-doc thresholds", "workflow arrow chains relaxed"],
|
|
348
|
-
"wordCount": 1612,
|
|
349
|
-
"vocabScore": 11.10,
|
|
350
|
-
"structuralScore": 7,
|
|
351
|
-
"finalScore": 10.00,
|
|
352
|
-
"rating": "heavy",
|
|
353
|
-
"recommendation": "Full document review — do not commit without fixing.",
|
|
354
|
-
"vocab": { "hits": [...] },
|
|
355
|
-
"structural": { "flags": [...], "metrics": {...} }
|
|
356
|
-
}
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
#### `slop-scan-vocab.ts` — Vocabulary-only scan
|
|
360
|
-
|
|
361
|
-
Scans for Tier 1-4 vocabulary markers (AI-prose vocabulary, phrases, and sycophantic language).
|
|
362
|
-
|
|
363
|
-
```bash
|
|
364
|
-
pnpm exec jiti scripts/slop-scan-vocab.ts README.md
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
#### `slop-scan-structural.ts` — Structural-only scan
|
|
368
|
-
|
|
369
|
-
Analyzes structural patterns with profile-aware thresholds: em dash density, bullet ratios, sentence clustering, participial tails, arrow usage, correlative pairs, plus-sign conjunctions, five-paragraph essay structure, conclusion mirroring, and more.
|
|
370
|
-
|
|
371
|
-
```bash
|
|
372
|
-
pnpm exec jiti scripts/slop-scan-structural.ts README.md
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
### Script location
|
|
376
|
-
|
|
377
|
-
```
|
|
378
|
-
skills/supi-flow-slop-detect/
|
|
379
|
-
├── SKILL.md
|
|
380
|
-
├── references/
|
|
381
|
-
│ └── vocabulary.json # Single source of truth for vocabulary markers
|
|
382
|
-
└── scripts/
|
|
383
|
-
├── slop-helpers.ts # Shared detection utilities
|
|
384
|
-
├── slop-scan-vocab.ts # Vocabulary marker detection (reads vocabulary.json)
|
|
385
|
-
├── slop-scan-structural.ts # Structural pattern detection
|
|
386
|
-
└── slop-scan.ts # Combined scanner + density scoring
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
### Tips
|
|
390
|
-
|
|
391
|
-
- **For agents**: Pipe `--json-only` output into `jq` or parse directly from the tool call.
|
|
392
|
-
- **For manual use**: Omit `--json-only` for the human-readable summary with score bar and metrics table.
|
|
393
|
-
- The SKILL.md itself scores high because it documents all slop patterns in its tables. Normal docs should score < 1.5.
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"tier1": [
|
|
3
|
-
{
|
|
4
|
-
"term": "delve",
|
|
5
|
-
"score": 3,
|
|
6
|
-
"context": "\"delve into\"",
|
|
7
|
-
"replacement": "explore, examine, look at"
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"term": "tapestry",
|
|
11
|
-
"score": 3,
|
|
12
|
-
"context": "\"rich tapestry\"",
|
|
13
|
-
"replacement": "mix, combination, variety"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"term": "realm",
|
|
17
|
-
"score": 3,
|
|
18
|
-
"context": "\"in the realm of\"",
|
|
19
|
-
"replacement": "in, within, regarding"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"term": "embark",
|
|
23
|
-
"score": 3,
|
|
24
|
-
"context": "\"embark on a journey\"",
|
|
25
|
-
"replacement": "start, begin"
|
|
26
|
-
},
|
|
27
|
-
{ "term": "beacon", "score": 3, "context": "\"a beacon of\"", "replacement": "example, model" },
|
|
28
|
-
{
|
|
29
|
-
"term": "spearheaded",
|
|
30
|
-
"score": 3,
|
|
31
|
-
"context": "formal attribution",
|
|
32
|
-
"replacement": "led, started"
|
|
33
|
-
},
|
|
34
|
-
{ "term": "leverage", "score": 3, "context": "business jargon", "replacement": "use, apply" },
|
|
35
|
-
{
|
|
36
|
-
"term": "robust",
|
|
37
|
-
"score": 3,
|
|
38
|
-
"context": "quality signal",
|
|
39
|
-
"replacement": "solid, strong, reliable"
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"term": "seamless",
|
|
43
|
-
"score": 3,
|
|
44
|
-
"context": "integration claim",
|
|
45
|
-
"replacement": "smooth, easy, simple"
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"term": "pivotal",
|
|
49
|
-
"score": 3,
|
|
50
|
-
"context": "importance marker",
|
|
51
|
-
"replacement": "key, important"
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"term": "multifaceted",
|
|
55
|
-
"score": 3,
|
|
56
|
-
"context": "complexity signal",
|
|
57
|
-
"replacement": "complex, varied"
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"term": "comprehensive",
|
|
61
|
-
"score": 3,
|
|
62
|
-
"context": "scope claim",
|
|
63
|
-
"replacement": "thorough, complete"
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"term": "nuanced",
|
|
67
|
-
"score": 3,
|
|
68
|
-
"context": "sophistication signal",
|
|
69
|
-
"replacement": "subtle, detailed"
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
"term": "meticulous",
|
|
73
|
-
"score": 3,
|
|
74
|
-
"context": "care signal",
|
|
75
|
-
"replacement": "careful, detailed"
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
"term": "intricate",
|
|
79
|
-
"score": 3,
|
|
80
|
-
"context": "complexity marker",
|
|
81
|
-
"replacement": "detailed, complex"
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"term": "showcasing",
|
|
85
|
-
"score": 3,
|
|
86
|
-
"context": "display verb",
|
|
87
|
-
"replacement": "showing, displaying"
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
"term": "streamline",
|
|
91
|
-
"score": 3,
|
|
92
|
-
"context": "optimization verb",
|
|
93
|
-
"replacement": "simplify, improve"
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
"term": "facilitate",
|
|
97
|
-
"score": 3,
|
|
98
|
-
"context": "enablement verb",
|
|
99
|
-
"replacement": "enable, help, allow"
|
|
100
|
-
},
|
|
101
|
-
{ "term": "utilize", "score": 3, "context": "formal \"use\"", "replacement": "use" }
|
|
102
|
-
],
|
|
103
|
-
"tier2": [
|
|
104
|
-
{ "term": "moreover", "score": 2, "category": "Transition overuse" },
|
|
105
|
-
{ "term": "furthermore", "score": 2, "category": "Transition overuse" },
|
|
106
|
-
{ "term": "indeed", "score": 2, "category": "Transition overuse" },
|
|
107
|
-
{ "term": "notably", "score": 2, "category": "Transition overuse" },
|
|
108
|
-
{ "term": "subsequently", "score": 2, "category": "Transition overuse" },
|
|
109
|
-
{ "term": "significantly", "score": 2, "category": "Intensity clustering" },
|
|
110
|
-
{ "term": "substantially", "score": 2, "category": "Intensity clustering" },
|
|
111
|
-
{ "term": "fundamentally", "score": 2, "category": "Intensity clustering" },
|
|
112
|
-
{ "term": "profoundly", "score": 2, "category": "Intensity clustering" },
|
|
113
|
-
{ "term": "potentially", "score": 2, "category": "Hedging stacks" },
|
|
114
|
-
{ "term": "typically", "score": 2, "category": "Hedging stacks" },
|
|
115
|
-
{ "term": "might", "score": 2, "category": "Hedging stacks" },
|
|
116
|
-
{ "term": "perhaps", "score": 2, "category": "Hedging stacks" },
|
|
117
|
-
{ "term": "revolutionize", "score": 2, "category": "Action inflation" },
|
|
118
|
-
{ "term": "transform", "score": 2, "category": "Action inflation" },
|
|
119
|
-
{ "term": "unlock", "score": 2, "category": "Action inflation" },
|
|
120
|
-
{ "term": "unleash", "score": 2, "category": "Action inflation" },
|
|
121
|
-
{ "term": "elevate", "score": 2, "category": "Action inflation" },
|
|
122
|
-
{ "term": "crucial", "score": 2, "category": "Empty emphasis" },
|
|
123
|
-
{ "term": "vital", "score": 2, "category": "Empty emphasis" },
|
|
124
|
-
{ "term": "essential", "score": 2, "category": "Empty emphasis" },
|
|
125
|
-
{ "term": "paramount", "score": 2, "category": "Empty emphasis" }
|
|
126
|
-
],
|
|
127
|
-
"tier3": [
|
|
128
|
-
{
|
|
129
|
-
"term": "in today's fast-paced world",
|
|
130
|
-
"score": 4,
|
|
131
|
-
"replacement": "Delete — start with the point"
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
"term": "it's worth noting that",
|
|
135
|
-
"score": 3,
|
|
136
|
-
"replacement": "Delete — just state the thing"
|
|
137
|
-
},
|
|
138
|
-
{ "term": "at its core", "score": 2, "replacement": "\"Fundamentally\" or delete" },
|
|
139
|
-
{
|
|
140
|
-
"term": "cannot be overstated",
|
|
141
|
-
"score": 3,
|
|
142
|
-
"replacement": "\"is important because [reason]\""
|
|
143
|
-
},
|
|
144
|
-
{ "term": "navigate the complexities", "score": 4, "replacement": "handle, work through" },
|
|
145
|
-
{ "term": "unlock the potential", "score": 4, "replacement": "enable, make possible" },
|
|
146
|
-
{ "term": "a testament to", "score": 3, "replacement": "shows, demonstrates" },
|
|
147
|
-
{ "term": "treasure trove of", "score": 3, "replacement": "collection, set" },
|
|
148
|
-
{ "term": "game changer", "score": 3, "replacement": "Delete — be specific" },
|
|
149
|
-
{ "term": "ever-evolving landscape", "score": 4, "replacement": "Delete — be specific" },
|
|
150
|
-
{ "term": "look no further", "score": 4, "replacement": "Delete — state the answer" },
|
|
151
|
-
{ "term": "hustle and bustle", "score": 3, "replacement": "Delete — filler" }
|
|
152
|
-
],
|
|
153
|
-
"tier4": [
|
|
154
|
-
{ "term": "I'd be happy to", "score": 2, "issue": "Servile opener" },
|
|
155
|
-
{ "term": "Great question!", "score": 2, "issue": "Empty validation" },
|
|
156
|
-
{ "term": "Absolutely!", "score": 2, "issue": "Over-agreement" },
|
|
157
|
-
{ "term": "That's a wonderful point", "score": 2, "issue": "Flattery" },
|
|
158
|
-
{ "term": "I'm glad you asked", "score": 2, "issue": "Filler" },
|
|
159
|
-
{ "term": "You're absolutely right", "score": 2, "issue": "Sycophancy" }
|
|
160
|
-
]
|
|
161
|
-
}
|