llm-slop-detector 0.8.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/CHANGELOG.md +20 -0
- package/README.md +12 -3
- package/builtin-packs/grok.json +2 -1
- package/builtin-packs/openai.json +34 -0
- package/builtin-packs/puffery.json +19 -0
- package/builtin-packs/security.json +19 -4
- package/extension-browser/manifest.json +1 -1
- package/out/core/rules.js +1 -1
- package/package.json +6 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.10.0](https://github.com/mandakan/llm-slop-detector/compare/llm-slop-detector-v0.9.0...llm-slop-detector-v0.10.0) (2026-05-31)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add openai pack, citation-artifact tokens, and missing invisibles ([#92](https://github.com/mandakan/llm-slop-detector/issues/92)) ([8b41050](https://github.com/mandakan/llm-slop-detector/commit/8b41050c5c613635a1debf397e0e49ea46497cda))
|
|
9
|
+
* add puffery pack for promotional LLM phrasing ([#94](https://github.com/mandakan/llm-slop-detector/issues/94)) ([f54a711](https://github.com/mandakan/llm-slop-detector/commit/f54a711f6f8b325a04d39adea9adb58f0d5a1201))
|
|
10
|
+
|
|
11
|
+
## [0.9.0](https://github.com/mandakan/llm-slop-detector/compare/llm-slop-detector-v0.8.1...llm-slop-detector-v0.9.0) (2026-05-30)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* skip NBSP detection in rich-text editors by default ([#79](https://github.com/mandakan/llm-slop-detector/issues/79)) ([ba90929](https://github.com/mandakan/llm-slop-detector/commit/ba90929299e3cc84845901c7091b104ff98e185c))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Bug Fixes
|
|
20
|
+
|
|
21
|
+
* **deps:** bump vulnerable transitive deps flagged by dependabot ([#95](https://github.com/mandakan/llm-slop-detector/issues/95)) ([90228a7](https://github.com/mandakan/llm-slop-detector/commit/90228a7a468840e06f47ea64be839af90695eb25))
|
|
22
|
+
|
|
3
23
|
## [0.8.1](https://github.com/mandakan/llm-slop-detector/compare/llm-slop-detector-v0.8.0...llm-slop-detector-v0.8.1) (2026-04-24)
|
|
4
24
|
|
|
5
25
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# LLM Slop Detector
|
|
2
2
|
|
|
3
3
|
[](https://marketplace.visualstudio.com/items?itemName=thias-se.llm-slop-detector)
|
|
4
|
+
[](https://chromewebstore.google.com/detail/llm-slop-detector/ancpfnfeflffphhpaejhpggfhjmafeid)
|
|
5
|
+
[](https://addons.mozilla.org/en-US/firefox/addon/llm-slop-detector/)
|
|
4
6
|
[](LICENSE)
|
|
5
7
|
|
|
6
8
|
A VS Code extension and CLI that flag invisible Unicode, AI-style punctuation, and telltale LLM phrases in `markdown` and `plaintext` files. The CLI shares its rule engine with the editor, so local and CI findings stay in sync.
|
|
@@ -15,7 +17,12 @@ No install needed -- paste text into the [web playground](https://mandakan.githu
|
|
|
15
17
|
|
|
16
18
|
A WebExtension that scans `<textarea>`, text inputs, and `contenteditable` elements (Gmail compose, vanilla rich-text widgets) as you type on any webpage. Findings are highlighted inline with colour-coded marks -- textarea marks are tinted background, contenteditable marks are wavy underlines so they don't disturb reading of styled content. A small "N slop" badge next to each editor opens a per-finding popover with severity, reason, source pack, per-finding "Fix this" buttons, and a "Fix all chars" button that applies every deterministic character replacement (em dash, curly quotes, zero-width, etc.) at once. For contenteditables the fix goes through `execCommand('insertText')` so the host editor's undo stack still works (`Cmd+Z`). Runs entirely in the browser -- no network calls, no telemetry.
|
|
17
19
|
|
|
18
|
-
**Install from
|
|
20
|
+
**Install from a store:**
|
|
21
|
+
|
|
22
|
+
- **Chrome / Arc / Edge / Brave:** [Chrome Web Store listing](https://chromewebstore.google.com/detail/llm-slop-detector/ancpfnfeflffphhpaejhpggfhjmafeid). Chromium forks accept the same package.
|
|
23
|
+
- **Firefox:** [Firefox Add-ons listing](https://addons.mozilla.org/en-US/firefox/addon/llm-slop-detector/).
|
|
24
|
+
|
|
25
|
+
**Install from source (for hacking on the rules):**
|
|
19
26
|
|
|
20
27
|
```sh
|
|
21
28
|
npm ci
|
|
@@ -45,7 +52,7 @@ Turn this off in the options page if you only want to lint your own writing. The
|
|
|
45
52
|
|
|
46
53
|
- Flags zero-width, BOM, non-breaking spaces, and other invisible Unicode that hides in text and wrecks diffs
|
|
47
54
|
- Flags AI-style punctuation: em and en dashes, curly quotes, horizontal ellipsis, angle quotes
|
|
48
|
-
- Configurable phrase rules: ~40 built-in core rules plus
|
|
55
|
+
- Configurable phrase rules: ~40 built-in core rules plus thirteen opt-in packs (`academic`, `cliches`, `puffery`, `fiction`, `claudeisms`, `structural`, `security`, `openai`, `gemini`, `deepseek`, `llama`, `qwen`, `grok`) totalling 500+ curated regex patterns
|
|
49
56
|
- Markdown-aware: skips fenced and inline code, link URLs, and YAML frontmatter so technical prose doesn't drown in false positives
|
|
50
57
|
- Inline-ignore comments (`<!-- slop-disable -->`, `<!-- slop-disable-next-line -->`, `<!-- slop-disable-line -->`) for one-off exceptions
|
|
51
58
|
- Hover over any flagged range for the rule selector plus a ready-to-copy `slop-disable-next-line` snippet
|
|
@@ -181,13 +188,15 @@ The core list is deliberately conservative: ~40 phrase rules covering the buzzwo
|
|
|
181
188
|
|
|
182
189
|
- **`academic`** -- words over-represented in LLM-authored academic writing (`bolster`, `elucidate`, `facilitate`, `showcase`, `noteworthy`, ~90 entries). Severity `hint` so the Problems panel stays usable. Derived from [`berenslab/llm-excess-vocab`](https://github.com/berenslab/llm-excess-vocab) (MIT).
|
|
183
190
|
- **`cliches`** -- general LLM cliche vocabulary (`captivating`, `pinnacle`, `galvanize`, journey/landscape/symphony metaphors). Derived from [`nanxstats/llm-cliches`](https://github.com/nanxstats/llm-cliches) (MIT).
|
|
191
|
+
- **`puffery`** -- promotional / editorializing puffery: `rich cultural heritage`, `nestled in the heart of`, `boasts`, `enduring legacy`, `leaves an indelible mark`, `deeply rooted`, `diverse array of`, copula-avoidance flourishes. Original content.
|
|
184
192
|
- **`fiction`** -- fiction and creative-writing tells (breath hitched, heart hammering, shivers down spine, chestnut eyes, LLM-cliche character names). **Includes adult-fiction markers.** Derived from [`SicariusSicariiStuff/SLOP_Detector`](https://github.com/SicariusSicariiStuff/SLOP_Detector) (Apache-2.0).
|
|
185
193
|
- **`claudeisms`** -- Claude-specific mannerisms: sycophantic openers, consent-theater phrasing, "important to note that" hedges. Derived from SLOP_Detector.
|
|
186
194
|
- **`structural`** -- structural LLM tells: "not X but Y" negation pivots, sycophantic line openers, "in this section we'll" meta-commentary, "at the end of the day" closers. Original content.
|
|
187
|
-
- **`security`** -- LLM-weaponized invisibles above the BMP: tag characters (U+E0020-U+E007F, used in ASCII-smuggler prompt injection) and variation selectors (U+FE00-U+FE0E + U+E0100-U+E01EF, used for arbitrary-data smuggling in emoji and CJK). Severity `error
|
|
195
|
+
- **`security`** -- LLM-weaponized invisibles above the BMP: tag characters (U+E0020-U+E007F, used in ASCII-smuggler prompt injection) and variation selectors (U+FE00-U+FE0E + U+E0100-U+E01EF, used for arbitrary-data smuggling in emoji and CJK), plus invisible math operators (U+2061-U+2064), deprecated format controls (U+206A-U+206F), the combining grapheme joiner (U+034F), Mongolian free variation selectors (U+180B-U+180D), and the Braille blank (U+2800). Severity `error` (`warning` for the few code points with rare legitimate use). Skips U+FE0F (emoji presentation selector) to avoid false positives. Opt in if you copy-paste LLM output into files you don't fully trust.
|
|
188
196
|
|
|
189
197
|
Model-family packs flag mannerisms specific to one vendor's models. Mix and match:
|
|
190
198
|
|
|
199
|
+
- **`openai`** -- OpenAI GPT / ChatGPT: citation-markup artifact leaks (`oaicite`, `oai_citation`, `contentReference`, `turn0search0`-style web-tool tokens), AI-identity and knowledge-cutoff disclaimers (`as an AI language model`, `knowledge cutoff`), refusal boilerplate (`I cannot fulfill that request`), and stock opener/closer/hedge scaffolding (`Certainly!`, `here's a comprehensive overview`, `I hope this helps`). Original content.
|
|
191
200
|
- **`gemini`** -- Google Gemini / Bard: breakdown-happy structure (`here's a breakdown`, `let's break it down`), analogy openers (`think of it as`, `imagine a`), `I hope this helps` closers, and identity / knowledge-cutoff / professional-advice disclaimers.
|
|
192
201
|
- **`deepseek`** -- DeepSeek V3 / R1: `<think>` tag leaks, R1 reasoning tics leaking into final output (`Wait,`, `Hmm,`, `Let me reconsider`, `the user is asking`), DeepSeek special-token leaks (`<|begin_of_thought|>`, `<|EOT|>`).
|
|
193
202
|
- **`llama`** -- Meta Llama: `as an AI` identity disclaimers, Llama-Guard refusal boilerplate (`I cannot provide`, `it would not be appropriate`), and Llama2 / Llama3 chat-template token leaks (`[INST]`, `<|eot_id|>`, `<<SYS>>`, `<|python_tag|>`).
|
package/builtin-packs/grok.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pack:grok",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "xAI Grok mannerisms: conversational 'look,' openers, forced edginess, Hitchhiker's Guide references, and Elon/X name-drops.",
|
|
5
5
|
"phrases": [
|
|
6
6
|
{ "pattern": "^\\s*look,?\\s", "reason": "Grok opener" },
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
{ "pattern": "\\bdon'?t panic\\b", "reason": "Grok Hitchhiker's reference" },
|
|
36
36
|
{ "pattern": "\\bhitchhiker'?s guide\\b", "reason": "Grok Hitchhiker's reference" },
|
|
37
37
|
{ "pattern": "\\bmostly harmless\\b", "reason": "Grok Hitchhiker's reference" },
|
|
38
|
+
{ "pattern": "\\bgrok_card\\b", "reason": "Grok citation-markup artifact leak", "severity": "warning" },
|
|
38
39
|
{ "pattern": "\\bi'?m grok\\b", "reason": "Grok identity disclaimer" },
|
|
39
40
|
{ "pattern": "\\bi am grok\\b", "reason": "Grok identity disclaimer" },
|
|
40
41
|
{ "pattern": "\\bas grok,?\\b", "reason": "Grok identity disclaimer" },
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pack:openai",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OpenAI GPT / ChatGPT tells: citation-markup artifact leaks (oaicite, contentReference), AI-identity and knowledge-cutoff disclaimers, refusal boilerplate, and stock opener/closer/hedge scaffolding. Original content -- regexes hand-authored to match commonly-observed stock phrasing; no third-party rule set incorporated.",
|
|
5
|
+
"phrases": [
|
|
6
|
+
{ "pattern": "\\boaicite\\b", "reason": "ChatGPT citation-markup artifact leak" },
|
|
7
|
+
{ "pattern": "\\boai_citation\\b", "reason": "ChatGPT citation-markup artifact leak" },
|
|
8
|
+
{ "pattern": "\\bcontentReference\\b", "reason": "ChatGPT citation-markup artifact leak", "severity": "warning" },
|
|
9
|
+
{ "pattern": ":contentReference\\[oaicite", "reason": "ChatGPT citation-markup artifact leak", "severity": "warning" },
|
|
10
|
+
{ "pattern": "\\bturn\\d+(search|news|view|image|forecast|finance)\\d+\\b", "reason": "ChatGPT web-tool citation token leak", "severity": "warning" },
|
|
11
|
+
{ "pattern": "\\bas an? (AI|artificial intelligence)(,| developed| created| trained| language model| assistant)", "reason": "GPT identity disclaimer", "severity": "warning" },
|
|
12
|
+
{ "pattern": "\\bas a large language model\\b", "reason": "GPT identity disclaimer", "severity": "warning" },
|
|
13
|
+
{ "pattern": "\\bas of my last (knowledge |training )?(update|cutoff|knowledge update)\\b", "reason": "GPT knowledge-cutoff disclaimer", "severity": "warning" },
|
|
14
|
+
{ "pattern": "\\bknowledge cut[- ]?off\\b", "reason": "GPT knowledge-cutoff disclaimer", "severity": "warning" },
|
|
15
|
+
{ "pattern": "\\bmy (training data|training|knowledge)( only)? (includes|extends|goes|is limited|cuts off|stops)\\b", "reason": "GPT knowledge-cutoff disclaimer", "severity": "warning" },
|
|
16
|
+
{ "pattern": "\\bI (don'?t|do not) have (access to |the ability to )?(real[- ]time|live|up[- ]to[- ]date|current|personal)\\b", "reason": "GPT capability disclaimer", "severity": "warning" },
|
|
17
|
+
{ "pattern": "\\bI (can'?t|cannot|am unable to|am not able to) (fulfill|comply with|assist with|help with) (that|this) request\\b", "reason": "GPT refusal boilerplate", "severity": "warning" },
|
|
18
|
+
{ "pattern": "\\bI'?m (sorry|afraid),? but (as|I)\\b", "reason": "GPT refusal boilerplate" },
|
|
19
|
+
{ "pattern": "^\\s*Certainly[!,]", "reason": "GPT opener" },
|
|
20
|
+
{ "pattern": "^\\s*Sure(?: thing)?[!,]", "reason": "GPT opener" },
|
|
21
|
+
{ "pattern": "^\\s*Sure,? (here'?s|here is|I can|let me)\\b", "reason": "GPT opener" },
|
|
22
|
+
{ "pattern": "\\bGreat question[!.]", "reason": "GPT opener" },
|
|
23
|
+
{ "pattern": "\\bI'?d be (happy|glad) to (help|assist)\\b", "reason": "GPT opener" },
|
|
24
|
+
{ "pattern": "\\bhere'?s a (comprehensive|detailed|quick|brief|step[- ]by[- ]step) (overview|breakdown|rundown|guide|look)\\b", "reason": "GPT framing" },
|
|
25
|
+
{ "pattern": "\\blet me break (this|it) down( for you)?\\b", "reason": "GPT framing" },
|
|
26
|
+
{ "pattern": "\\bI hope (this|that) (helps|information helps|answers your question)\\b", "reason": "GPT closer" },
|
|
27
|
+
{ "pattern": "\\blet me know if (you (have|need)|there'?s|you'?d like|you want)\\b", "reason": "GPT closer" },
|
|
28
|
+
{ "pattern": "\\b(feel free|don'?t hesitate) to (ask|reach out|let me know)\\b", "reason": "GPT closer" },
|
|
29
|
+
{ "pattern": "\\bis there anything else (I can|you'?d like)\\b", "reason": "GPT closer" },
|
|
30
|
+
{ "pattern": "\\bgenerally speaking,?\\b", "reason": "GPT hedge" },
|
|
31
|
+
{ "pattern": "\\bit'?s (important|worth|essential) to (note|remember|keep in mind|mention) that\\b", "reason": "GPT hedge" },
|
|
32
|
+
{ "pattern": "\\bdepending on (the|your) (context|specific|particular|needs|situation)\\b", "reason": "GPT hedge" }
|
|
33
|
+
]
|
|
34
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pack:puffery",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Promotional / editorializing puffery common in LLM prose: 'rich cultural heritage', 'nestled in the heart of', 'boasts', 'enduring legacy', 'leaves an indelible mark', and copula-avoidance flourishes. Original content -- regexes hand-authored, no third-party rule set incorporated.",
|
|
5
|
+
"phrases": [
|
|
6
|
+
{ "pattern": "\\brich (cultural|literary|artistic|musical|architectural|natural|historical|spiritual) heritage\\b", "reason": "puffery" },
|
|
7
|
+
{ "pattern": "\\b(stands|serves|stood|served) as a testament\\b", "reason": "puffery" },
|
|
8
|
+
{ "pattern": "\\bleaves? an indelible mark\\b", "reason": "puffery" },
|
|
9
|
+
{ "pattern": "\\bvaluable insights?\\b", "reason": "LLM filler" },
|
|
10
|
+
{ "pattern": "\\bnestled (in|between|among|amid|along|within|atop|beside|deep)\\b", "reason": "travel-writing puffery" },
|
|
11
|
+
{ "pattern": "\\benduring (legacy|appeal|charm|popularity|influence|presence|significance)\\b", "reason": "puffery" },
|
|
12
|
+
{ "pattern": "\\bvibrant (community|culture|tapestry|atmosphere|scene|hub|ecosystem|nightlife|array|mix|blend)\\b", "reason": "puffery" },
|
|
13
|
+
{ "pattern": "\\bboasts? (a|an|the|its|some|several|numerous|over|more than|impressive|stunning|an array|a range)\\b", "reason": "copula-avoidance puffery" },
|
|
14
|
+
{ "pattern": "\\bdeeply rooted\\b", "reason": "puffery" },
|
|
15
|
+
{ "pattern": "\\bsetting the stage for\\b", "reason": "LLM transition cliche" },
|
|
16
|
+
{ "pattern": "\\b(a |an )?diverse array of\\b", "reason": "puffery" },
|
|
17
|
+
{ "pattern": "\\bbreathtaking (views?|scenery|beauty|landscapes?|vistas?)\\b", "reason": "puffery" }
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pack:security",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "LLM-weaponized invisibles above the BMP: tag characters (ASCII-smuggler prompt injection)
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "LLM-weaponized invisibles above the BMP: tag characters (ASCII-smuggler prompt injection), variation selectors (arbitrary-data smuggling), invisible math operators, and deprecated/zero-width format controls used to hide instructions or smuggle data. Severity: error (warning for chars with rare legitimate use).",
|
|
5
5
|
"chars": [
|
|
6
6
|
{"char":"","name":"LANGUAGE TAG (U+E0001)","severity":"error","replacement":""},
|
|
7
7
|
{"char":"","name":"TAG \" \" (U+E0020)","severity":"error","replacement":""},
|
|
@@ -354,6 +354,21 @@
|
|
|
354
354
|
{"char":"󠇬","name":"VARIATION SELECTOR-253 (U+E01EC)","severity":"error","replacement":""},
|
|
355
355
|
{"char":"󠇭","name":"VARIATION SELECTOR-254 (U+E01ED)","severity":"error","replacement":""},
|
|
356
356
|
{"char":"󠇮","name":"VARIATION SELECTOR-255 (U+E01EE)","severity":"error","replacement":""},
|
|
357
|
-
{"char":"󠇯","name":"VARIATION SELECTOR-256 (U+E01EF)","severity":"error","replacement":""}
|
|
357
|
+
{"char":"󠇯","name":"VARIATION SELECTOR-256 (U+E01EF)","severity":"error","replacement":""},
|
|
358
|
+
{"char":"","name":"FUNCTION APPLICATION (U+2061)","severity":"error","replacement":""},
|
|
359
|
+
{"char":"","name":"INVISIBLE TIMES (U+2062)","severity":"error","replacement":""},
|
|
360
|
+
{"char":"","name":"INVISIBLE SEPARATOR (U+2063)","severity":"error","replacement":""},
|
|
361
|
+
{"char":"","name":"INVISIBLE PLUS (U+2064)","severity":"error","replacement":""},
|
|
362
|
+
{"char":"͏","name":"COMBINING GRAPHEME JOINER (U+034F)","severity":"warning","replacement":""},
|
|
363
|
+
{"char":"","name":"INHIBIT SYMMETRIC SWAPPING (U+206A)","severity":"error","replacement":""},
|
|
364
|
+
{"char":"","name":"ACTIVATE SYMMETRIC SWAPPING (U+206B)","severity":"error","replacement":""},
|
|
365
|
+
{"char":"","name":"INHIBIT ARABIC FORM SHAPING (U+206C)","severity":"error","replacement":""},
|
|
366
|
+
{"char":"","name":"ACTIVATE ARABIC FORM SHAPING (U+206D)","severity":"error","replacement":""},
|
|
367
|
+
{"char":"","name":"NATIONAL DIGIT SHAPES (U+206E)","severity":"error","replacement":""},
|
|
368
|
+
{"char":"","name":"NOMINAL DIGIT SHAPES (U+206F)","severity":"error","replacement":""},
|
|
369
|
+
{"char":"᠋","name":"MONGOLIAN FREE VARIATION SELECTOR ONE (U+180B)","severity":"warning","replacement":""},
|
|
370
|
+
{"char":"᠌","name":"MONGOLIAN FREE VARIATION SELECTOR TWO (U+180C)","severity":"warning","replacement":""},
|
|
371
|
+
{"char":"᠍","name":"MONGOLIAN FREE VARIATION SELECTOR THREE (U+180D)","severity":"warning","replacement":""},
|
|
372
|
+
{"char":"⠀","name":"BRAILLE PATTERN BLANK (U+2800)","severity":"warning","replacement":""}
|
|
358
373
|
]
|
|
359
|
-
}
|
|
374
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "LLM Slop Detector",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.10.0",
|
|
5
5
|
"description": "Flags invisible Unicode, AI-style punctuation, and telltale LLM phrases as you type -- or in any page you're reading. Local only.",
|
|
6
6
|
"permissions": [
|
|
7
7
|
"storage"
|
package/out/core/rules.js
CHANGED
|
@@ -4,7 +4,7 @@ exports.BUILTIN_PACKS = exports.LOCAL_RULES_FILENAME = void 0;
|
|
|
4
4
|
exports.parseSeverityOverrides = parseSeverityOverrides;
|
|
5
5
|
exports.loadRules = loadRules;
|
|
6
6
|
exports.LOCAL_RULES_FILENAME = '.llmsloprc.json';
|
|
7
|
-
exports.BUILTIN_PACKS = ['academic', 'cliches', 'fiction', 'claudeisms', 'structural', 'security', 'gemini', 'deepseek', 'llama', 'qwen', 'grok'];
|
|
7
|
+
exports.BUILTIN_PACKS = ['academic', 'cliches', 'puffery', 'fiction', 'claudeisms', 'structural', 'security', 'openai', 'gemini', 'deepseek', 'llama', 'qwen', 'grok'];
|
|
8
8
|
function parseSeverity(s, fallback) {
|
|
9
9
|
switch (s) {
|
|
10
10
|
case 'error': return 'error';
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "llm-slop-detector",
|
|
3
3
|
"displayName": "LLM Slop Detector",
|
|
4
4
|
"description": "Highlights invisible Unicode, AI-style punctuation, and telltale LLM phrases in markdown and plain text.",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.10.0",
|
|
6
6
|
"publisher": "thias-se",
|
|
7
7
|
"engines": {
|
|
8
8
|
"vscode": "^1.95.0"
|
|
@@ -75,10 +75,12 @@
|
|
|
75
75
|
"enum": [
|
|
76
76
|
"academic",
|
|
77
77
|
"cliches",
|
|
78
|
+
"puffery",
|
|
78
79
|
"fiction",
|
|
79
80
|
"claudeisms",
|
|
80
81
|
"structural",
|
|
81
82
|
"security",
|
|
83
|
+
"openai",
|
|
82
84
|
"gemini",
|
|
83
85
|
"deepseek",
|
|
84
86
|
"llama",
|
|
@@ -88,10 +90,12 @@
|
|
|
88
90
|
"enumDescriptions": [
|
|
89
91
|
"Words over-represented in LLM-authored academic writing (derived from berenslab/llm-excess-vocab, MIT)",
|
|
90
92
|
"General LLM cliche adjectives/nouns/verbs (derived from nanxstats/llm-cliches, MIT)",
|
|
93
|
+
"Promotional / editorializing puffery: 'rich cultural heritage', 'nestled in the heart of', 'boasts', 'enduring legacy', 'leaves an indelible mark', copula-avoidance flourishes. Original content.",
|
|
91
94
|
"Fiction and creative-writing LLM tells, including NSFW markers (derived from SicariusSicariiStuff/SLOP_Detector, Apache-2.0)",
|
|
92
95
|
"Claude-specific mannerisms and sycophantic consent-theater phrasing (derived from SicariusSicariiStuff/SLOP_Detector, Apache-2.0)",
|
|
93
96
|
"Structural LLM tells: 'not X but Y', sycophantic openers, meta-commentary",
|
|
94
|
-
"Flags LLM-weaponized invisibles above the BMP: tag chars (ASCII-smuggler prompt injection) and variation selectors (arbitrary-data smuggling). Severity: error.",
|
|
97
|
+
"Flags LLM-weaponized invisibles above the BMP: tag chars (ASCII-smuggler prompt injection) and variation selectors (arbitrary-data smuggling), plus invisible math operators and deprecated format controls. Severity: error/warning.",
|
|
98
|
+
"OpenAI GPT / ChatGPT tells: citation-markup artifact leaks (oaicite, contentReference), AI-identity and knowledge-cutoff disclaimers, refusal boilerplate, and stock opener/closer/hedge scaffolding",
|
|
95
99
|
"Google Gemini / Bard tells: breakdown-happy structure, 'I hope this helps' closers, identity and knowledge-cutoff disclaimers",
|
|
96
100
|
"DeepSeek V3/R1 tells, notably <think> tags and R1 reasoning tics ('Wait,', 'Hmm,', 'Let me reconsider') leaking into output",
|
|
97
101
|
"Meta Llama tells: 'as an AI' disclaimers, Llama-Guard refusal boilerplate, and Llama2/Llama3 chat-template token leaks ([INST], <|eot_id|>, etc.)",
|