defluffisizer 1.0.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.
@@ -0,0 +1,25 @@
1
+ # Fact Preservation
2
+
3
+ This skill is allowed to change wording. It is not allowed to change the underlying claim set without explicit user approval.
4
+
5
+ ## Always preserve when present
6
+
7
+ - numbers
8
+ - dates
9
+ - names
10
+ - units
11
+ - placeholders such as `TBC`
12
+ - caveats
13
+ - scope limits
14
+ - legal or compliance language that appears intentional
15
+
16
+ ## If you must cut something
17
+
18
+ - cut framing before you cut facts
19
+ - cut duplicated summary lines before you cut evidence
20
+ - cut decorative transitions before you cut caveats
21
+
22
+ ## If a rewrite would drop a fact to save space
23
+
24
+ - keep the fact and tighten somewhere else
25
+ - if the space is hard limited, mention the tradeoff
@@ -0,0 +1,30 @@
1
+ # Format Safety
2
+
3
+ Respect the source format.
4
+
5
+ ## PowerPoint
6
+
7
+ - preserve slide order
8
+ - preserve text box boundaries when a writer exists
9
+ - preserve table cell boundaries
10
+ - do not rewrite chart labels unless the user asks
11
+ - in the extracted JSON, each `\n` separated line inside an element's `text` is one paragraph (one bullet). Editing text in place keeps that paragraph's indent level, bullet character, and alignment. Deleting a bullet's line entirely is safe; leaving a blank line in its place is not, it renders as an empty bullet.
12
+ - do not merge two bullets into one line or split one bullet into two unless the slide should visibly gain or lose a bullet
13
+ - `pptx_rewrite.py` matches each rewritten line back to its closest original paragraph by text similarity and resets any cached shrink to fit percentage, so indent, alignment, and font size recompute for the new text instead of inheriting stale values from the longer original
14
+
15
+ ## Documents
16
+
17
+ - preserve heading order
18
+ - preserve quoted material unless the user asks to rewrite it
19
+ - preserve list structure unless a simpler structure is clearly better
20
+
21
+ ## Spreadsheets
22
+
23
+ - edit only prose cells, headers, notes, and comments unless asked
24
+ - do not change formulas or row ordering
25
+
26
+ ## PDFs
27
+
28
+ - treat extraction as lossy
29
+ - preserve the visible order as best you can
30
+ - state when the output is paste back text instead of true layout preservation
@@ -0,0 +1,62 @@
1
+ # Format Capabilities
2
+
3
+ Use this file to choose a safe workflow for each source type.
4
+
5
+ ## Supported now
6
+
7
+ ### `.pptx`
8
+
9
+ - extract editable text to JSON
10
+ - rewrite slide by slide
11
+ - apply changes back into a real `.pptx`
12
+ - preserve slide order, text boxes, and table cells
13
+ - keep bullet indent level, bullet character, and alignment attached to the paragraph they belong to, even when bullets are added, dropped, or reordered, by matching rewritten lines back to the closest original paragraph
14
+ - drop rewritten lines that come out blank instead of writing an empty bulleted paragraph
15
+ - reset any cached shrink to fit percentage on a rewritten text box so PowerPoint recomputes font size for the new, usually shorter, text instead of keeping it artificially small
16
+
17
+ Primary tools:
18
+
19
+ - `scripts/document_text_io.py`
20
+ - `scripts/pptx_rewrite.py`
21
+
22
+ ### `.txt`, `.md`, `.csv`, `.tsv`
23
+
24
+ - extract directly
25
+ - rewrite directly
26
+ - write back directly
27
+
28
+ ### `.doc`, `.docx`, `.odt`, `.rtf`, `.html`
29
+
30
+ - extract with `textutil`
31
+ - rewrite as text
32
+ - apply back into a new document
33
+
34
+ Limit:
35
+
36
+ - this is content preserving, not layout faithful like the PowerPoint path
37
+ - `textutil` ships with macOS only. On Linux or Windows this path is not available yet; probe will still name the format, but extract and apply raise a clear error.
38
+
39
+ ### `.pdf`
40
+
41
+ - extract with `pdftotext`
42
+ - rewrite as text or markdown
43
+ - apply straight back into a real `.pdf` by default (same format in, same format out), or into `.docx`/`.txt`/`.md` if asked
44
+
45
+ Two ways to apply back to `.pdf`, both going through `scripts/pdf_write.py`:
46
+
47
+ - REWRITTEN is plain text (the normal case): wrapped in a minimal, clean, single-column page. Not a clone of the source's original design, faithful to the words, not the layout.
48
+ - REWRITTEN is an `.html` file: rendered as-is. Use this when the source has real visual design worth recreating (colors, tables, callout boxes) — build the styled HTML by hand with the defluffed content, matching the source's layout and colors as closely as makes sense, then apply with that `.html` file as REWRITTEN.
49
+
50
+ Limit:
51
+
52
+ - this is a new PDF built from HTML, not a byte-level edit of the original PDF's own content stream. Fonts, exact pixel positions, and embedded images from the source are not reused.
53
+ - `pdftotext` is not bundled and must be installed separately: `brew install poppler` (macOS) or `apt install poppler-utils` (Debian/Ubuntu). Needed for extract, not for apply.
54
+ - PDF output needs Google Chrome or Chromium installed (for headless rendering), not bundled either. Without it, apply to `.pdf` raises a clear error with an install hint, it does not fail silently or fall back to something worse.
55
+
56
+ When hand-building a one-page `.html` for `.pdf` output: if the content is close to a full page, Chrome's print pagination can add a near-empty trailing page even when everything visually fits, from a sub-pixel rounding overflow. Add `html, body { height: 11in; overflow: hidden; }` (adjust `11in` for a non-Letter page size) to force exactly one page instead of chasing the overflow by trial and error. Also give `.page`-level wrappers real padding rather than negative margins on full-bleed children (like a header band) that live outside that wrapper. A full-bleed child that is already a direct `<body>` child needs no margin trick at all, negative margins on it just overflow the page width and can distort pagination.
57
+
58
+ ## Safe fallbacks
59
+
60
+ - if you cannot preserve layout, return clean replacement copy
61
+ - if extraction is lossy, say so
62
+ - if a writer does not exist, stop at extracted form instead of pretending the original layout was preserved
@@ -0,0 +1,34 @@
1
+ # Stage 1: Intake and Scope
2
+
3
+ Goal: understand what the user wants, what format they gave you, and what must not change.
4
+
5
+ ## Inputs to identify
6
+
7
+ - source type
8
+ - audience
9
+ - output expectation
10
+ - whether the user wants review, rewrite, or both
11
+ - what facts, commitments, numbers, names, and tables must survive
12
+
13
+ ## Questions to answer silently before rewriting
14
+
15
+ 1. What is the actual job of this artifact
16
+ 2. What is fluff versus required tone or context
17
+ 3. Is layout preservation required or only nice to have
18
+ 4. Are there hard constraints such as slide count, cell count, or regulated wording
19
+
20
+ ## Scope rules
21
+
22
+ - Do not rewrite formulas or numerical tables unless the user asks.
23
+ - Do not infer missing evidence.
24
+ - Do not invent specificity to make the writing sound human.
25
+ - If the source is already tight, do a light pass instead of forcing a bigger rewrite.
26
+
27
+ ## Stage output
28
+
29
+ Produce a short internal inventory of:
30
+
31
+ - source format
32
+ - rewrite mode
33
+ - preservation requirements
34
+ - high leverage sections
@@ -0,0 +1,36 @@
1
+ # Stage 2: Extract and Map
2
+
3
+ Goal: get the text into an editable form without losing the structure you will need to restore later.
4
+
5
+ ## Routing
6
+
7
+ - `.pptx`: use `scripts/document_text_io.py extract file.pptx --out editable.json`
8
+ - `.doc`, `.docx`, `.odt`, `.rtf`, `.html`: use `scripts/document_text_io.py extract`
9
+ - `.pdf`: use `scripts/document_text_io.py extract`
10
+ - `.txt`, `.md`, `.csv`, `.tsv`: use `scripts/document_text_io.py extract` or read directly
11
+
12
+ ## Preservation inventory
13
+
14
+ Record:
15
+
16
+ - titles and headings
17
+ - bullet groups
18
+ - tables and cells that contain prose
19
+ - notes, captions, disclaimers, or footers with factual content
20
+ - sections that are mostly labels and should not be rewritten heavily
21
+
22
+ ## Mapping rule
23
+
24
+ When the source has structure, do not flatten it too early.
25
+
26
+ - In decks, keep slide and text box boundaries. Each line inside an element's `text` field is one bullet paragraph; the apply step reattaches its original indent and alignment by matching content, so keep bullet boundaries where they are unless you mean to add or remove a bullet.
27
+ - In tables, keep row and cell boundaries.
28
+ - In reports, keep heading hierarchy.
29
+
30
+ ## Stage output
31
+
32
+ Create one of these:
33
+
34
+ - editable JSON for `.pptx`
35
+ - extracted text for document like sources
36
+ - a line by line or cell by cell mapping when the format writer does not yet exist
@@ -0,0 +1,49 @@
1
+ # Stage 3: Rewrite and Defluff
2
+
3
+ Goal: remove synthetic padding and restore human signal without changing the truth.
4
+
5
+ ## Rewrite loop
6
+
7
+ 1. Delete obvious filler and repeated claims.
8
+ 2. Move the point to the top of the section, slide, or paragraph.
9
+ 3. Replace abstraction piles with named subjects, actions, and consequences.
10
+ 4. Restore chosen detail, stakes, tension, and asymmetry when the source contains them.
11
+ 5. Read the result once for rhythm and once for factual retention.
12
+
13
+ ## Human sounding does not mean
14
+
15
+ - slang
16
+ - typos
17
+ - fake vulnerability
18
+ - random sentence fragments
19
+ - forced informality
20
+
21
+ ## Human sounding usually does mean
22
+
23
+ - committed claims
24
+ - visible stakes
25
+ - concrete details
26
+ - natural variation in sentence length
27
+ - less smoothing between ideas
28
+
29
+ ## Mode behavior
30
+
31
+ - `review`: annotate the fluff and propose cuts, but do not rewrite the full artifact unless asked
32
+ - `compress`: default to deletion first and stop when meaning starts to drop
33
+ - `retitle`: focus on slide titles, section headings, bullet headers, and first sentences
34
+ - `rewrite`: rewrite the whole source where it helps, but use light edits on already good sections
35
+
36
+ ## Slide deck rules
37
+
38
+ - each slide should land one claim
39
+ - titles should carry the takeaway and be declerative
40
+ - bullets should be short and factual
41
+ - delete a bullet by removing its line, not by shrinking it to a blank or near blank fragment
42
+ - keep remaining bullets in a text box roughly even in length so the slide does not read as lopsided or cluttered
43
+
44
+ ## Stage output
45
+
46
+ Produce a rewritten artifact in extracted form:
47
+
48
+ - edited JSON for `.pptx`
49
+ - rewritten text for other document types
@@ -0,0 +1,43 @@
1
+ # Stage 4: Apply and Validate
2
+
3
+ Goal: write the cleaned text back into the target format when possible, then verify that the result is better and still faithful.
4
+
5
+ ## Apply
6
+
7
+ Use `scripts/document_text_io.py apply SOURCE REWRITTEN [--output-dir DIR]` for every format. With no `--output-dir`, it writes `{source_stem}_defluffed{ext}` next to `SOURCE` on its own and prints the path it wrote; there is no need to build that path by hand.
8
+
9
+ - `.pptx`: `scripts/document_text_io.py apply source.pptx editable.json` -> `source_defluffed.pptx` next to the source
10
+ - `.docx` and similar textutil formats: same command, same default naming, output stays in the source format
11
+ - `.pdf`: same command; defaults to a real `.pdf` (`report.pdf` -> `report_defluffed.pdf`), built from HTML via headless Chrome. Plain rewritten text becomes a minimal, clean, single-column page. For a source with real visual design worth recreating (colors, tables, callout boxes), build a styled `.html` file with the defluffed content instead and pass that as REWRITTEN — it renders as-is
12
+ - plain text formats: same command, output stays `.txt`/`.md`
13
+ - pass `--output-dir DIR` only when the user asked for a specific output directory; pass `--output PATH` only when the user asked for an exact filename
14
+
15
+ ## Validate
16
+
17
+ Run `scripts/defluff_lint.py` on meaningful before and after pairs.
18
+
19
+ Check for:
20
+
21
+ - shorter or clearly tighter writing
22
+ - preserved numbers and named entities
23
+ - fewer vague terms and repeated openings
24
+ - no accidental loss of commitments, caveats, or placeholders
25
+
26
+ ## Final caution
27
+
28
+ Passing lint is not the same as good writing.
29
+
30
+ Always do one last read of:
31
+
32
+ - the first paragraph
33
+ - the first slide
34
+ - section openings
35
+ - conclusions
36
+ - any table cells with critical facts
37
+
38
+ For `.pptx` output specifically, open the extracted JSON one more time (or reopen the deck) and check:
39
+
40
+ - no bullet reads as an empty or near empty fragment
41
+ - bullet indent levels still look like the original hierarchy, not flattened or randomly nested
42
+ - no text box looks tiny in a mostly empty box or crowded and overflowing its box
43
+ - slide titles are still centered or left aligned the way the source had them
@@ -0,0 +1,17 @@
1
+ Use the defluffisizer standard.
2
+
3
+ Your job is to rewrite text so it keeps the facts and loses AI sounding fluff.
4
+
5
+ Keep the meaning. Cut the padding. Put the point early. Use direct declarative sentences. Prefer actor, action, object, and consequence. Preserve numbers, dates, names, constraints, caveats, and real stakes.
6
+
7
+ Avoid tight em dashes with no space (word—word). Almost always eliminate them by rephrasing into two sentences, a comma, or a colon. If an em dash is genuinely the clearest option, space it normally (word — word); never leave it glued tight.
8
+
9
+ Avoid false contrast in any form: `not X, but Y`, `it's not X, it's Y`, `X, not just Y`, or the same move split across two sentences ("This is not X. It is Y."). If the positive claim stands on its own, delete the negative half instead of rephrasing it. Also cut defensive contrast against a criticism nobody raised ("no compromises," "not a shortcut," "a real answer, not a band-aid").
10
+
11
+ Avoid punchline fragments: a full sentence followed immediately by a short fragment riding its momentum for effect ("Strips the fluff. Keeps the facts."). If the fragment is not its own new claim, merge it into the sentence before it ("Strips the fluff and keeps the facts."). This is not a ban on short sentences or varied sentence length, both of which are good; it is specifically the fragment used as a closer or mic-drop.
12
+
13
+ Avoid ordinary hyphens in rewritten prose unless they are part of a fixed name or technical token. Avoid generic transitions, buzzwords, abstraction piles, stacked synonyms, rule-of-three padding, empty amplifiers (truly, really, simply), unearned superlatives (revolutionary, cutting edge, best in class), and fake enthusiasm.
14
+
15
+ If the source is bloated, delete before you paraphrase. If the source is already tight, edit lightly. If the format is a deck or sheet, keep the structure and make each title, bullet, or cell do one job.
16
+
17
+ Before you finish, check that the rewrite is clearer, usually shorter, and did not lose important specifics.
@@ -0,0 +1,128 @@
1
+ # AI Slop Signals
2
+
3
+ Read this reference when the source already sounds polished and you need a sharper standard for what to cut.
4
+
5
+ ## The pattern that gets missed most: false contrast
6
+
7
+ This is the single most recognizable AI tell, and it survives naive editing because it hides in more shapes than one banned phrase can cover. The core move: state a claim by contrasting it against a rejected alternative, instead of just stating the claim. It reads as confident. It is a crutch.
8
+
9
+ Every one of these is the same move wearing a different outfit:
10
+
11
+ - `not X, but Y` — "not a shortcut, but a full pipeline"
12
+ - `it's not X, it's Y` — "it's not a nice-to-have, it's existential"
13
+ - `X, not just Y` — "a real PDF, not just a downgrade to Word"
14
+ - split across two sentences, same shape — "This is not a find and replace shortcut. It is a pipeline that understands document structure." Splitting it across a period does not make it a different pattern. It is the same negate-then-restate move with the seam hidden.
15
+ - em dash version — "not a rewrite — a rebuild"
16
+ - `rather than` / `instead of` doing the same rhetorical work — "we validate instead of assuming it looks polished," when the point could just be "we validate the rewrite."
17
+
18
+ The fix is almost never to rephrase the contrast more smoothly. It is to delete the negative half and keep only the claim, if the claim survives on its own (it almost always does):
19
+
20
+ - "This is not a find and replace shortcut. It is a pipeline that understands document structure." → "It maps document structure before it touches a sentence." (or, if that idea already appeared in the previous sentence, delete the whole thing, it is redundant, not just repetitive)
21
+ - "It writes a real PDF back out, not just a downgrade to Word." → "It writes a real PDF back out."
22
+
23
+ A close relative worth naming separately: defensive contrast against a criticism nobody raised. "No compromises." "Not a shortcut." "A real solution, not a band-aid." These exist to pre-empt an objection the reader was never going to make. If the source doubles back to knock down its own strawman, cut the strawman, not just the phrasing around it.
24
+
25
+ Do not confuse this with a genuinely load-bearing contrast. "Revenue grew even though headcount shrank" is a real, informative contrast: two true things that would otherwise seem to disagree. "Not a shortcut, but a real pipeline" contrasts a claim against a rejected version of itself that no one proposed. If cutting the negative half loses no information, it was decoration.
26
+
27
+ This is not a minor stylistic tic. A Washington Post analysis of 328,744 ChatGPT messages (May 2024 to July 2025) found some version of "not just X, but Y" in 6 percent of all July 2025 messages, and researchers have found large language models use this "negative parallelism" roughly three times more often than human writers do. It is one of the most reliably machine-flagging patterns known, precisely because it is this common in model output and this rare in unprompted human writing.
28
+
29
+ ## The second pattern that gets missed: the punchline fragment
30
+
31
+ A full sentence, then a short fragment right after it, riding the first sentence's momentum for dramatic effect: "That's it. That's the whole thing." "Three words. That's it." "Strips the fluff. Keeps the facts." This has a name in the field now: dramatic fragmentation, or a staccato burst. It is distinct from ordinary short sentences, which are fine and often good.
32
+
33
+ The test: does the short sentence carry its own new claim, or is it a rhythmic tag riding on the sentence before it? If it is a tag, a real writer would have just joined it to the first sentence with "and," a comma, or nothing at all. "Strips the fluff. Keeps the facts." is not two ideas, it is one idea wearing a dramatic pause. Fix: merge them. "Strips the fluff and keeps the facts."
34
+
35
+ This is not the same complaint as "vary your sentence length," which is good, real advice from the human-signal side of this skill. The tell is specifically the fragment used as a closer or a mic-drop, especially stacked at the end of a paragraph or section, not sentence-length variation generally. A human writer who ends a paragraph short usually does it once, not as a running tic across every section.
36
+
37
+ ## Other patterns worth a second look
38
+
39
+ - Rule of three padding: three adjectives, clauses, or examples stacked for rhythm rather than because a third one adds something ("real, honest, and direct"). If the third item does not earn its place, cut to two or one.
40
+ - Empty amplifiers: "truly," "genuinely," "really," "very," "simply," "just" used as intensifiers rather than modifiers. They inflate confidence without adding a claim. Delete them and check whether the sentence lost anything; it usually did not.
41
+ - Filler adverbs as significance announcers: "Importantly," "Crucially," "Interestingly," opening a sentence to assert that what follows matters, instead of writing it so the reader can tell on their own.
42
+ - Unearned superlatives: "revolutionary," "game changing," "cutting edge," "best in class," "world class," "next generation." These are claims about how impressive something is, made instead of a claim about what it does. Replace with the concrete thing it does.
43
+ - Faux-insight framing: "What nobody tells you," "Here's the thing," "The part everyone misses." These announce that an insight is coming instead of just delivering one. If the sentence after the setup is a fairly ordinary point, cut the setup.
44
+ - Colon-launched drama: a short clause, a colon, then a reveal staged for effect ("The best part: it just works") rather than a colon used for a genuine list or explanation. If the part after the colon is not doing real explanatory work, use a period instead.
45
+ - Mid-sentence rhetorical question answered by the writer: "The fix? Simpler than it sounds." Manufactures a beat of suspense nobody asked for. State the point.
46
+ - Weasel attribution: "experts agree," "studies show," "research suggests" with no actual expert, study, or source named. If the source did not cite something specific, do not either; per [guardrails/fact_preservation.md](../guardrails/fact_preservation.md), never invent the citation to fix this, flag it as unsupported instead.
47
+ - Synonym cycling: calling the same thing by a different name every time it recurs ("platform," then "tool," then "system," then "solution") to dodge repetition. Plain repetition of the real name is clearer and less evasive than rotating synonyms.
48
+ - Hedge stacking and reflexive balance: qualifying every claim, or pairing every criticism with a softening concession, until the sentence commits to nothing. If the source has a real, uneven judgment, let the rewrite keep that judgment instead of sanding it flat.
49
+ - Tight em dashes as connective tissue: `word—word` used to link clauses that a period, comma, or colon would link more plainly. See the em dash rule below.
50
+ - Colon-launched restatement: "Simply put:" "In other words:" followed by a rephrasing of the sentence that just ended. If the second half says the same thing, delete the first half or the colon clause, not both halves kept.
51
+
52
+ ## Em dash rule
53
+
54
+ Tight em dashes with no surrounding space (`word—word`) are the strongest single tell on this list. Default action: eliminate the em dash by rephrasing, almost every time. Split into two sentences, or use a comma, colon, or period, whichever reads most like something a person would actually write.
55
+
56
+ Keep an em dash only when, after that rephrase, the sentence is genuinely worse: a real interruption or aside that a comma cannot carry cleanly. In that rare case, space it normally (`word — word`). Never leave the tight, glued form in rewritten prose; it is the version that reads as machine generated even when the sentence around it does not.
57
+
58
+ ## What tends to read as AI slop
59
+
60
+ These patterns show up often in research on machine generated writing and in plain language guidance. The point is not authorship detection. The point is better editing.
61
+
62
+ 1. Uniform rhythm and structure
63
+
64
+ Human writing usually shows more variation in sentence and paragraph length. AI prose often settles into a steadier cadence and repeated sentence shapes.
65
+
66
+ Implication for this skill: break up repetitive sentence scaffolds and let some sentences be blunt while others carry more detail.
67
+
68
+ 2. Formulaic transitions
69
+
70
+ Machine written text often leans on familiar bridges like "moreover," "furthermore," "in today's environment," and other templated pivots that smooth over weak logic rather than earn it.
71
+
72
+ Implication for this skill: keep transitions only when they signal a real causal, temporal, or contrastive move.
73
+
74
+ 3. Semantic redundancy
75
+
76
+ AI text often repeats the same point with near synonyms, adjacent abstractions, or summary lines that add no new information.
77
+
78
+ Implication for this skill: if two sentences cash out to the same claim, keep the stronger one.
79
+
80
+ 4. Inflated diction
81
+
82
+ Machine written prose often overuses elevated academic or business language, especially when a simple term would do.
83
+
84
+ Implication for this skill: swap ornamental wording for the shortest accurate phrase that preserves meaning.
85
+
86
+ 5. Weak agency and low specificity
87
+
88
+ AI slop often names frameworks, opportunities, ecosystems, transformations, or value without naming who did what, when, under what constraint, or with what evidence.
89
+
90
+ Implication for this skill: restore actor, action, object, and consequence. If the source lacks detail, do not invent it.
91
+
92
+ 6. Detached positivity
93
+
94
+ Many model outputs default to a generally upbeat, helpful tone even when the material is neutral, technical, or mixed.
95
+
96
+ Implication for this skill: remove praise, uplift, and confidence markers that the source did not earn.
97
+
98
+ ## What this skill should not overfit
99
+
100
+ - Clear structure is not proof of AI use. Good writers also use clear structure.
101
+ - Competent prose can be misread as artificial if reviewers rely on shallow heuristics.
102
+ - Non native English writers are more likely to be misclassified by detector style heuristics because lower linguistic variability can look machine generated.
103
+ - Do not inject mistakes or fake roughness. The target is clean human prose, not staged imperfection.
104
+ - Preserve technical terms when they carry exact meaning. Replace jargon only when a simpler term says the same thing.
105
+
106
+ ## Research basis consulted on 2026-09-01
107
+
108
+ Re-researched on this date at a user's request, specifically to replace anything older than 2024 with current sources. Two kinds of source below: peer-reviewed and preprint research on measurable stylistic differences, and practical pattern catalogs built by people who read large volumes of AI output for a living. Both are useful; neither is authoritative on its own.
109
+
110
+ Research:
111
+
112
+ - The Washington Post, "What are the clues that ChatGPT wrote something? We analyzed its style," November 2025. Analyzed 328,744 ChatGPT (gpt-4o) messages from May 2024 to July 2025. Found "not just X, but Y" style negative parallelism in 6 percent of July 2025 messages, and em dash usage climbing from under 10 percent of responses a year earlier to over half by summer 2025. https://www.washingtonpost.com/technology/interactive/2025/how-detect-chatgpt-em-dash/
113
+ - arXiv 2509.19163, "Measuring AI Slop in Text," submitted September 2025, revised January 2026. Builds a taxonomy of what makes AI-generated text read as low quality through expert interviews and span-level annotation, arguing there was previously no agreed-upon definition or measure. https://arxiv.org/abs/2509.19163
114
+ - arXiv 2510.05136, "Linguistic Characteristics of AI-Generated Text: A Survey," October 2025. Survey covering vocabulary, syntax, and stylistic differences between AI and human text across studies. https://arxiv.org/abs/2510.05136
115
+ - Tandfonline / Cogent, "Stylometric analysis of AI-generated texts: a comparative study of ChatGPT and DeepSeek," 2025. Comparative stylometric study across two model families. https://www.tandfonline.com/doi/full/10.1080/23311983.2025.2553162
116
+ - University College Cork news release on a literary stylometry study, December 2025. First study to apply literary stylometry (authorship-attribution methods) to compare human and LLM creative writing; found AI cannot fully match human stylistic range. https://www.ucc.ie/en/news/2025/new-study-reveals-that-ai-cannot-fully-write-like-a-human.html
117
+ - "Negative parallelism," Wikipedia, accessed 2026. Documents the "it's not X, it's Y" construction as a named, recognized rhetorical tell in machine generated text, with the term entering general use following coverage like the Washington Post piece above. https://en.wikipedia.org/wiki/Negative_parallelism
118
+
119
+ Practical pattern catalogs, built from reading large volumes of AI output rather than formal study, cross-checked against each other and against the research above before anything from them was added to this file:
120
+
121
+ - Peter Yang, "no-ai-slop" pattern list, GitHub, 2025. 20-plus named patterns including binary contrasts, faux-insight setups, colon reveals, and dramatic fragments. https://github.com/petergyang/no-ai-slop
122
+ - Charlie Guo, "The Field Guide to AI Slop," 2025. Names negative parallelism, snappy triads, unearned profundity, and monotony of cadence as recurring tics. https://www.ignorance.ai/p/the-field-guide-to-ai-slop
123
+ - Gaurav Tiwari, "Stop Slop" checklist, gauravtiwari.org, 2026. Nine tell patterns plus a pre-ship checklist; notably flags that em dash frequency alone is becoming a less reliable signal over time as it gets called out more. https://gauravtiwari.org/stop-slop-ai-slop/
124
+ - "LLM Prose Tells," a maintained list at git.eeqj.de, accessed 2026. 32 named patterns across sentence structure, word choice, rhetorical moves, and document structure, including the em-dash pivot and dramatic fragment patterns named directly above. https://git.eeqj.de/sneak/prompts/src/branch/main/prompts/LLM_PROSE_TELLS.md
125
+
126
+ ## Editing inference
127
+
128
+ The strongest practical editing rule is simple: cut repetition, cut abstraction, name the actor, name the action, and put the point early. That does more to defluff text than chasing any single tell.
@@ -0,0 +1,52 @@
1
+ # Evaluation Playbook
2
+
3
+ Use this reference when you want evidence that a rewrite improved the text.
4
+
5
+ ## What to measure
6
+
7
+ 1. Compression without loss
8
+
9
+ - A good rewrite is often shorter.
10
+ - As a rough guide, many bloated drafts improve when the final word count lands around 65 to 90 percent of the source.
11
+ - Do not force compression if the source is already tight.
12
+
13
+ 2. Banned pattern count
14
+
15
+ - Count em dashes.
16
+ - Count ordinary word to word hyphens in rewritten prose.
17
+ - Count `not X, but Y` constructions.
18
+ - Count filler phrases and vague buzzwords from the skill rules.
19
+
20
+ The goal is usually zero or near zero unless the text must preserve a quote or fixed term.
21
+
22
+ 3. Specificity retention
23
+
24
+ - Numbers should survive unless the rewrite removes a sentence that should be cut entirely.
25
+ - Names, dates, units, and concrete constraints should usually survive.
26
+ - If specifics disappear, verify whether they were actually expendable.
27
+
28
+ 4. Redundancy drop
29
+
30
+ - Repeated claims should fall.
31
+ - Repeated sentence openings should fall.
32
+ - Consecutive sentences that cash out to the same idea should collapse into one.
33
+
34
+ 5. Point first
35
+
36
+ - The first paragraph, slide title, or top cell should carry the actual point, not the setup.
37
+
38
+ ## Suggested workflow
39
+
40
+ 1. Keep the source as `before`.
41
+ 2. Produce the rewrite as `after`.
42
+ 3. Run `python3 scripts/defluff_lint.py --before before.txt --after after.txt`.
43
+ 4. Review any warnings about missing numbers, missing named terms, repeated openings, or banned patterns.
44
+ 5. Read the first paragraph or first slide only. If it still feels generic, rewrite the opening again.
45
+
46
+ ## Pass criteria
47
+
48
+ - The rewrite is shorter or materially clearer.
49
+ - It keeps the important facts.
50
+ - It removes almost all banned patterns.
51
+ - It lands the point earlier.
52
+ - It sounds more committed and less synthetic when read aloud.
@@ -0,0 +1,45 @@
1
+ # Format Playbook
2
+
3
+ Read this reference when the source format changes what a good rewrite looks like.
4
+
5
+ ## Notes, memos, and reports
6
+
7
+ - Lead with the point in the first paragraph.
8
+ - Make each paragraph carry one idea.
9
+ - Replace overview language with the actual claim, result, or ask.
10
+ - Keep evidence close to the claim it supports.
11
+ - Trim headings that only announce a topic. Prefer headings that name the takeaway.
12
+
13
+ ## Slide decks and speaker notes
14
+
15
+ - Give each slide one claim.
16
+ - Write slide titles as takeaways, not labels.
17
+ - Keep slide bullets short and factual.
18
+ - Cut scene setting language that burns space without moving the story.
19
+ - Move nuance into speaker notes only when it helps the presenter.
20
+ - If a slide has too many ideas, split the message before you rewrite the wording.
21
+ - When the source is a `.pptx`, extract the slide text, rewrite the text containers, and apply the edits back into the deck so the result stays in PowerPoint format.
22
+ - Cut whole bullets instead of hollowing one out to a near empty line. A slide with 3 tight bullets reads cleaner than one with 5 bullets where 2 are almost blank.
23
+ - Keep bullets close to even in length within one text box. One long bullet next to three fragments reads as uneven and cluttered even when every word earns its place.
24
+ - Do not leave a blank line where a bullet used to be. Remove the line so the paragraph is gone, not empty.
25
+
26
+ ## Spreadsheet text
27
+
28
+ - Edit only text cells, headers, comments, and notes unless the user asks for more.
29
+ - Do not change formulas, references, tabs, row order, or numeric values unless asked.
30
+ - Make headers short, literal, and easy to scan.
31
+ - If a cell contains a paragraph, compress it into one direct sentence when possible.
32
+ - If multiple cells repeat the same boilerplate, standardize it to the shortest accurate form.
33
+
34
+ ## PDFs and locked formats
35
+
36
+ - Extract the text you can access.
37
+ - Preserve the original section or slide order.
38
+ - Return clean replacement copy that can be pasted back into the file.
39
+ - If layout limits matter, state where the rewrite may still need manual fit checks.
40
+
41
+ ## Large files
42
+
43
+ - Prioritize the title, executive summary, section openings, slide titles, topic sentences, conclusions, and repeated boilerplate.
44
+ - After the spine is clean, tighten the supporting detail.
45
+ - If time or context is limited, fix the highest leverage sections first and say what remains.
@@ -0,0 +1,47 @@
1
+ # Human Signal Playbook
2
+
3
+ Read this reference when the draft is cleaner but still feels generic.
4
+
5
+ AI slop is about more than banned phrases. Missing human signal matters just as much.
6
+
7
+ ## Human signal to preserve or restore
8
+
9
+ 1. A point of view
10
+
11
+ Human writers usually lean somewhere. They rank what matters, they stress one risk more than another, and they do not give every sentence the same emotional weight.
12
+
13
+ Editing move: make the sentence carry the real judgment. If the point is that the launch slipped because approvals were late, say that.
14
+
15
+ 2. Specific stakes
16
+
17
+ Human writing often makes consequences visible. A choice delays the launch, raises cost, weakens confidence, or simplifies a workflow.
18
+
19
+ Editing move: replace abstract value claims with the actual consequence.
20
+
21
+ 3. Chosen detail
22
+
23
+ People often mention one or two distinctive details that show contact with the thing itself.
24
+
25
+ Editing move: keep exact numbers, dates, edge cases, named constraints, and concrete examples when they earn space.
26
+
27
+ 4. Asymmetry
28
+
29
+ Human writing is not perfectly balanced. One issue is usually more important than the others.
30
+
31
+ Editing move: let the writing put weight where the source puts weight. Do not flatten strong claims into neutral summaries.
32
+
33
+ 5. Real friction
34
+
35
+ Machine prose often removes conflict by smoothing all tradeoffs into generic coordination language.
36
+
37
+ Editing move: preserve disagreement, uncertainty, caveats, and cost when they are part of the truth.
38
+
39
+ 6. Controlled variation
40
+
41
+ Human sounding prose usually mixes blunt sentences with longer explanatory ones. It does not march in a perfect rhythm.
42
+
43
+ Editing move: vary sentence openings and lengths, but only after the content is strong.
44
+
45
+ ## Anti pattern
46
+
47
+ Do not simulate humanness by adding slang, typos, personal anecdotes, or fake vulnerability. That is theater, not better writing.