Re-ran the adversary against the revised skill with the inverted incentive (prove the fix is cosmetic). Verdict: thesis REFUTED, high confidence. Faithful rewrites of five inputs under the revised skill score 0 anti_slop_register violations and preserve nuance; the reconstructed old register still trips both detectors. Gold "After" examples tripping the detectors went 8 -> 0. - SKILL.md: the validation step now treats an anti_slop_register hit and a Staccato cadence flag as blocking (rewrite before returning), closing the one residual (R2): the checks are soft, so a non-compliant model could otherwise still ship the old register. - ADVERSARIAL-WRITING-ANALYSIS.md: recorded the re-test verdict, the per-input scorecard, and residuals R1/R2.
8.1 KiB
Adversarial Analysis: unslop's Writing Quality
A red-team audit of the writing the skill produces, not just its detection. An incentivized adversary was tasked to prove a single thesis and to attack faithful skill outputs (generated first, so the critique isn't a strawman). Every claim below was reproduced by hand before acting on it.
Thesis tested
"unslop does not make text sound human. It trades one detectable register (corporate AI slop) for a different, equally-detectable register — clipped fragments, fake punchiness, 'Not X. Y.' contrasts, manufactured folksiness — while quietly deleting nuance, hedges, and information. And it passes its own scanner precisely because the scanner doesn't know its own house style is a tell."
Verdict: supported (high confidence). The skill's own gold examples and two of
four presets prove the register swap, and the scanner scored those gold outputs at
0 violations. The validation pipeline cannot see the semantic facts (negations,
scope, conditionals) its own fact-preservation.md calls must-preserve. This was
the most important finding of the project: a "clean" verdict was partly an artifact
of the detector being blind to the skill's house style and to meaning.
Findings, evidence, and what changed
| ID | Severity | Finding (verified) | Status |
|---|---|---|---|
| B1 | blocker | Scanner blind to its own house style. Gold "Building products is hard. Not the technology. The people." → 0; clause form "The problem isn't meetings. It's unclear agendas." → 1. Staccato triplet "Move fast. Handle uncertainty. Use what you're good at." → 0. |
Fixed. New anti_slop_register scanner patterns (fragment contrast + staccato run, soft) now flag both; AS-01/02 + FP-12 guard it. |
| B2 | blocker | Validation is theater for semantic facts. extract_constraints on "X does not support Y. Most users (73%) prefer it. If A, then B. See Section 12(b)." returned only 73% (+ junk). A rewrite dropping the negation and Section 12(b) reported passed: true. |
Fixed/mitigated. References now extracted + hard-validated (PRES-08/09); negation/scope/conditional drops emit warnings (SEM-01); SKILL.md no longer claims validation covers meaning. |
| B3 | blocker | De-hedging destroys text where the hedge is the content (medical/legal/scientific). "preliminary / observational / not causal / confounders" deleted; output reads as casual overclaim. | Mitigated. SKILL.md "Register & genre guards" forbids de-hedging regulated/technical content; behavioral evals SKILL-HEDGE-03, SKILL-LEGAL-02 guard it. Genuinely hard to enforce mechanically. |
| B4 | major | Em-dash "default to zero" contradicted by 2/4 presets' gold examples, and obeying it manufactures comma splices. | Fixed. SKILL.md rule rewritten: sparing appositive dash allowed, never trade a dash for a splice. SKILL-EMDASH-01 guards. |
| B5 | major | "When in doubt, cut" + crisp 20-word cap delete causal caveats / scope ("in most cases", "can", named evidence). diff_check flags 60% over-edit but it's advisory and the 0-violation scan overrides it. |
Mitigated. Scope-word drops now warn (B2 machinery); SKILL-OVEREDIT-01 + SKILL-STACCATO-01 guard. Making the over-edit gate hard is left as a follow-up. |
| B6 | major | personality-guide models first-person quirk ("I don't put on pants until noon"); applied to impersonal copy this invents content and is its own tell. | Mitigated. SKILL.md guard: don't fabricate first-person experience. SKILL-NOINVENT-01 guards. |
| B7 | minor | Readability rhythm flags gated behind sentence_count > 3, so short staccato outputs passed clean. |
Fixed. New staccato flag (longest run of ≤5-word sentences ≥ 3, or avg < 6) with no count gate. AS-03 guards. |
| B8 | minor | Warm-email rewrite strips warmth into curtness ("No rush if not."); the warm preset conflates AI enthusiasm with human warmth. | Mitigated. SKILL.md "match register, don't flatten it"; SKILL-WARMTH-01 guards. |
New-register tell phrases the scanner could not see (now: can)
All scored 0 violations before this round; the anti_slop_register patterns
now catch the first two families. The rest are punch-endings/aphorisms that remain
hard to detect without false positives and are addressed via the SKILL guards and
behavioral evals rather than the regex:
Not the technology. The people.— bare fragment contrast (now flagged)Move fast. Handle uncertainty. Use what you're good at.— staccato triplet (now flagged)The rest guess./Adapt or fall behind.— two/three-word punch closersGood teams fail fast. Bad teams avoid failure.— symmetric antithesisOpen offices are where focus goes to die.— manufactured edgy aphorismI don't put on pants until noon and accomplish nothing.— forced folksy quirk
The structural signature the scanner was blind to: sentence fragments, sub-five-word sentences, and antithesis without a connective. That is the "anti-slop" voice — and the skill's own edit-library and personality-guide teach it.
What's fixable vs. unfixable by design
- Fixable (done): B1, B7 (detectors), B2 references + warnings, B4 em-dash rule.
- Mitigated, not solved: B3, B5, B6, B8 are register/judgment problems a regex can't enforce. The defense is (a) explicit SKILL guards and (b) behavioral evals that a human/LLM judge checks. A faithful operator can now follow the guards; the defaults no longer push them off a cliff.
- By design / open: the deepest tension is that the skill's aesthetic ideal
(punchy, compressed, fragment-friendly) is itself a detectable register. Truly
fixing it means revising the gold examples in
edit-library.mdandpersonality-guide.mdtoward genuine sentence-length variety — a content change to the skill's taste, not just its tooling. Flagged for follow-up.
Re-test after the fixes — thesis now refuted
The gold examples in edit-library.md, crisp-human.md, and warm-human.md were
then revised toward varied rhythm (the skill had been teaching the anti-slop
register), and a fresh adversary was pointed at the updated skill with the inverted
incentive: prove the revisions are cosmetic and the thesis still holds.
Verdict: thesis refuted (high confidence). Faithful rewrites of five inputs
(including the medical caveat and the it-depends argument) under the revised skill
scored 0 anti_slop_register violations and no staccato flag, while a
deliberately reconstructed old-register version of the same input still tripped
both detectors — clean separation. Nuance survived in all five (medical caveats,
the write-contention qualifier, the it-depends structure, the email's warmth).
| Input | Faithful output trips anti_slop_register? |
Nuance survived? |
|---|---|---|
| L1 (LinkedIn) | no | yes |
| A1 (technical) | no | yes |
| MED1 (medical caveat) | no | yes |
| ARG1 (it-depends argument) | no | yes |
| E1 (warm email) | no | yes |
The fix is a closed loop: the guidance steers away from the register, the scanner catches it, and the gold examples model the replacement. Measured: gold "After" examples tripping the detectors went from 8 → 0.
Residuals: (R1, low) a dense argument can trip the readability "high reading level"
flag — the opposite of staccato, a tolerated tradeoff, not bloat. (R2) the
anti-slop checks are soft, so a non-compliant model could still emit the old
register; the SKILL.md validation step now treats an anti_slop_register hit and a
Staccato cadence flag as blocking (rewrite before returning), closing that gap
as far as instructions can.
Method note
A neutral executor produced faithful skill rewrites of six diverse inputs (LinkedIn slop, a nuance-heavy technical paragraph, a personal narrative, a sensitive email, already-decent prose, a compression-prone argument); the adversary independently generated its own faithful outputs and attacked them, ran them back through the scanner, and built worst-case inputs (medical, legal, dialogue). The strongest claims (B1, B2, B7) were re-verified directly in this repo before any change.