Repository navigation
v0.6.0
The catalog grows from 50 rules to 75, and sloplint ships as a Claude Code
plugin as well as a gem.
Added
- sloplint now ships as a Claude Code plugin as well as a gem. Add the
marketplacebenjaminjackson/sloplintand installsloplint; the plugin
carries the Ruby source with it, so nothing is installed from a package
index and it works wheregem installcannot reach the network — Claude
Cowork above all. The plugin adds one skill,/sloplint:check, which runs
the scanner and reports what it returns. The skill refuses to assess prose
on its own when the scanner cannot run, because a review with no scan
behind it reads exactly like one with a scan behind it. not-by-x-but-by-y: the corrective frame on a repeated preposition, "not
by luck, but by design". The copula rules cannot see it because nothing
anchors "not" but a verb or a dash, so the anchor is the preposition, which
must repeat after "but". Ships atinfo: Thoreau and Melville write it too.
Fixed
checknow reads files and stdin as UTF-8 whatever the locale says. A
sandbox with noLANGset — Claude Cowork's, among others — leaves Ruby's
default external encoding at US-ASCII, and the first em dash in a draft then
failed the whole scan withinvalid input: invalid byte sequence in US-ASCII. Prose is the only input sloplint takes, so UTF-8 is the
assumption rather than the locale's guess. Genuinely invalid UTF-8 is still
exit 2.
Changed
-
thats-the-wholenow takesvalueandfixafter "that's the whole",
alongsidepoint,game,thing,dealandstory. The contracted
closer is the one an agent writes in technical prose ("That's the whole
value of theinfotier", "That's the whole fix"), andis-the-whole-x
sees only the uncontracted "is", so the sentence slipped both rules. The
uncontracted "That is the whole fix." moves with it, frominfounder
is-the-whole-xtowarning. The two new nouns must end the sentence or
the paragraph, or run into one of the words a closer trails off on, so
thats-the-wholeleaves "value chain", "value-add" and "fix list" alone
however the line wraps (is-the-whole-xstill reads the uncontracted
"That is the whole value chain" atinfo, as it did), and a curly
apostrophe now counts as a contraction. Both rules interpolate oneWHOLE_CLOSERS
fragment, so the lists cannot drift, and a spec walks every noun through
every form the two wrappers treat differently. Neither noun appears after
"that's the whole" in 1.55M words of public-domain prose. -
Empty or whitespace-only input
is now exit 2 withempty input: nothing to check in ..., instead of exit 0. Reporting a scan of nothing as a clean
scan is the same trap a mistyped rule id sets, and gets the same answer. The
text is tested before--markdownblanks code and URLs, so a file holding
only a fenced code block still exits 0; and only an all-empty set of sources
is an error, so one empty file among several named ones is left alone. -
The executable moved from
bin/sloplinttoexe/sloplint. claude.ai
rejects a plugin with a top-levelbin/directory, which would block
organization distribution.gem install sloplintis unaffected. -
exe/sloplintnow checksRUBY_VERSIONbefore loading anything and aborts
with an explanation, rather than raisingNoMethodErrorfromData.define.
The Ruby macOS ships at/usr/bin/rubyis 2.6 and hits this.
New rules
-
from-x-to-y-chain(rhetorical-tic, warning) flags two or more
comma-separated "from X to Y" spans in a row: "from guessing to measuring,
from hoping to knowing". Each span names two poles and nothing between
them, and stacking them sweeps across a change without describing it. Two
human shapes are skipped: the relay, where each span starts where the last
ended ("from the egg to the worm, from the worm to the fly"), and the
reduplication, where a span has the same word at both ends ("from hummock
to hummock"). Operands must open with a letter, so a list of ranges ("from
1990 to 1995, from 1997 to 2001") is not a chain. With those out it flags once in 2.4M words of pre-2022
Hacker News (a geographic sweep) and once in 1.25M words of public-domain
prose (Joyce). -
one-x-one-y(rhetorical-tic, warning) flags three or more "one X" items
in a comma chain that stands on its own: "One owner, one repository, one
weekly prune." The word does no counting; it sets a rhythm. The chain must
open a sentence or follow a colon, because after a verb ("the flat has one
bedroom, one bathroom, one balcony") the word is counting. Items are
letter-led, so an enumeration over numbers is out; the distributive "one
for you, one for me, one for the pot" is skipped at any length. Nothing in
2.4M words of pre-2022 Hacker News or 1.25M words of public-domain prose. -
everyone-nobody(structure, warning) flags the comma-spliced antithesis
on quantifier subjects: "Everyone wants the dashboard, nobody maintains
it." The
balance is what makes the diagnosis sound settled. The comma splice is
required (with "and" it is a sentence, with a period it is two), the two
subjects must differ in polarity, and the second clause must close the
sentence. Nothing in 2.4M words of pre-2022 Hacker News or 1.25M words of
public-domain prose. -
and-what-it-should(rhetorical-tic, warning) flags the elliptical tail:
"List what the assistant knows about the client, and what it should." The
second clause borrows its verb from the first and closes on a bare modal
or a negated auxiliary, so the sentence ends on a contrast it never
states. The comma, the conjunction, and the full stop right after the
modal are all required; the affirmative copula and do-verb ("and what he
does.") are complete clauses and stay out, and so does a question.
Nothing in 2.4M words of pre-2022 Hacker News or 1.25M words of
public-domain prose. -
abstract-lives-in(rhetorical-tic, info) flags an abstraction given an
address: "the craft that lives between the two desks", "its context lives
in a folder nobody else can open", "the value sits in the follow-up". The
subject list is closed and abstract, so people and dogs living and sitting
places never match, and a capitalised subject is a proper noun. "with" is
left out of the prepositions because "the decision sits with the board" is
ordinary English for who is responsible, "at" because "the value sits at
ten million" is a quantity, and "lies in" because "the problem lies in
the assumption" is where a fault is. It ships at info because the same
shape says where information literally is ("the knowledge lives in our
heads"), and a sample of pre-2022 Hacker News biased toward the
construction turns up a few of those per million words, all human. A
draft that keeps giving ideas addresses should be read as a warning. -
np-fragment-and(structure, info) flags a whole sentence made of two
noun phrases and an "and": "A named owner and a quarterly review." It is
the fix half of a model's problem-then-fix pair with the verb left out,
and its usual habitat is a bulleted list, so a list marker may open it.
Each phrase is one to three words, and no auxiliary or modal may appear,
contractions included. It ships at info because a lexical verb is
invisible to the pattern: "A car and a truck collided." has the same
shape and flags. That sentence is rare in the corpora (nothing in 2.4M
words of pre-2022 Hacker News, once in 1.25M words of public-domain
prose), but it is a sentence, so one flag is a question; a draft full of
them should be read as a warning. -
the-x-is-the-x(rhetorical-tic, warning) flags the repeated-head
equative: "the reason it holds up is the reason the other half happens",
"the problem with the tool is the problem with the team". A backreference
catches the same abstract head noun on both sides of the copula, so the
sentence equates two things while naming neither. The head list holds
only nouns that cannot name an object, since "the key to the front door
is the key on the red fob" is an identity statement; the two heads must
share a clause, so an earlier "the cost was low, but shipping is the
cost" never pairs; and the second head must be followed by a preposition,
determiner, quantifier, pronoun, plural noun or punctuation, so "the
answer key" is not a repeat. Once in 2.4M words of pre-2022 Hacker News;
nothing in 1.25M words of public-domain prose. -
same-determiner-chain(rhetorical-tic, info) is the quiet cousin of
one-x-one-y: three or more comma-separated items opening on the same
determiner or quantifier, "every file, every branch, every deploy", caught
with a backreference. The narrative possessives (my, his, her, their, its)
are left out, since "his fame, his position, his life" is every
novelist's. It ships at info because the device is one humans use on
purpose: about 8 per million words of pre-2022 Hacker News and 14 per
million
in public-domain prose. One is a question; several in a draft should be
read as a warning. -
quip-question(structure, info) flags the verbless question that opens
a pitch: "No invite?", "New to the tool?", "Still stuck?". It must start a
sentence, open on one of a short list of words, and close on the question
mark within four more words with no auxiliary or contraction, so a real
question stays out; "Need" and "Want" are left off the list because "Need
help?" is a question with its verb elided. Ships at info: about six per
million words of pre-2022 Hacker News, all of them replies asking the
same shape of a person; nothing in public-domain prose outside Joyce's
dialogue. Several in a draft should be read as a warning. -
is-the-whole-x(rhetorical-tic, info) isthats-the-wholeon any
subject: "That periodicity is the whole tell.", "Consistency is the real
test." It yields only the exact sentences the two older rules own
("that/this is the whole point/game/thing/deal/story" and "is the entire
point/game/thing/deal/story"), so nothing is reported twice and "This is
the real test." is not lost. An interrogative subject is out, since a
question is not a closer; "only", "deal", "thing" and "cost" are left out
because "is the only thing", "the real deal", "the real thing" and "the
whole cost" are ordinary speech. Ships at info: about three per million words of
pre-2022 Hacker News, nothing in public-domain prose. Several in a draft
should be read as a warning. -
bare-equative(rhetorical-tic, info) flags a sentence that opens on an
abstract head noun and equates it with a definite noun phrase: "The tell
here is the periodicity.", "The lesson is the handoff." The head list is
the onethe-x-is-the-xuses, so "The key is the brass thing on the hook"
is a definition and stays out; the copula (including "isn't") must be
followed by "the" and a lowercase word, so "The problem is real", "The
answer is a mess", "the same", "the first" and "the Slack thread" are all
out; a list marker may open it. Ships at info: about four per million
words of pre-2022 Hacker News, nothing in public-domain prose. Several in
a draft should be read as a warning. -
mic-drop-closer(structure, info) flags the kicker: a sentence of sixty
or more characters, then a two-to-eight-word closer that ends the
paragraph and opens on a quantifier or deictic, "Nothing here needs a new
login.", "Most teams end up with two." A blank line or the end of the
text must follow the closer, so a bullet followed by another bullet is
not one; both sentences may be hard-wrapped; and whitespace runs in the
long sentence are capped, so a URL blanked by--markdowncannot make it.
Ships at info because people end paragraphs this way too, at about 150
per million words of pre-2022 Hacker News (a comment ends on a verdict);
one flag means nothing. A draft where it repeats paragraph after
paragraph is the tell, and the rationale tells the agent to read that as
a warning. -
short-run(structure, info) flags three consecutive sentences of thirty
characters or fewer, each closing on a full stop with no quotation mark:
"Nobody used it. A named owner. Then a review." The run must start at a
real sentence boundary, so the short tail of a hard-wrapped sentence never
opens one; dialogue is out by the boundary, sentences with digits as data,
initials and abbreviations as not sentence ends, consecutive bullets as a
list, and questions and exclamations by design. Ships at info: a staccato
run is a device people use on purpose, at about thirty per million words
of pre-2022 Hacker News. A draft that keeps doing it is the tell, and the
rationale tells the agent to read that as a warning. -
epistrophe(rhetorical-tic, info, off by default) flags two clauses
that end on the same two-word phrase, the second closing the sentence:
"built for one desk, and almost no job is done at one desk." Two
backreferences catch the repeat, so the phrase may be hard-wrapped; an
article-led phrase, a short second word, a long or punctuated second
clause, and a clause made of blanked Markdown are all out. It is off by
default likerule-of-three: the figure is one Emerson and Marcus
Aurelius use on purpose, and on pre-2022 Hacker News most of the 42 hits
per million words are plain phrase reuse. Select it when a draft is
suspected of leaning on it; several then should be read as a warning. -
intersection-of(rhetorical-tic, warning) flags "the intersection of X and
Y" used as positioning: a writer placed between two fields, saying nothing
about either. "at" is not required, so "explores the intersection of art and
technology" flags the same as "sits at the intersection of". Two guards keep
the literal senses out. A street corner names capitalised streets ("Elm",
"Broadway", "Highway 12"), so the word after "of" must be lowercase or an
all-caps acronym; "AI", "UX" and "HCI" are the metaphor's usual operands and
no street is spelled that way. Geometry and set arithmetic name their operands,
so a literal noun ("curves", "lines", "arrays", "ranges", "roads") within two
words of "of" drops the note. -
and-nothing-else(rhetorical-tic, warning) flags a sentence that closes on
", and nothing else", ", nothing more", ", nothing further" or ", and no
more". A model told to return one thing and nothing else carries the phrasing
into the prose it writes afterwards, where the exclusion repeats what the
sentence already said. -
nothing-else-frag(rhetorical-tic, warning) flags the same exclusion built
as a fragment: "Return the JSON. Nothing else." -
honestly,honest-xandmost-honest-x(rhetorical-tic, warning) answer
the "honest" habit the waycleanly,clean-xandcleanest-xanswer the
"clean" one.honestlytakes the manner adverb closing on a full stop or
comma ("these two rows compare honestly");honest-xtakes the adjective in
front of the writer's own construction ("an honest comparison", "the honest
framing");most-honest-xtakes the self-ranking superlative.honestlyis anchored on position alone, so a dialogue tag ("said Isabel
honestly") and the sentence-final hedge of casual speech ("it's beyond boring
honestly") both match. Both are rare: twice in 3.65M words of public-domain
prose and ten times in 6.07M words of pre-2022 Hacker News. The two noun
rules flag nothing in either corpus; "an honest answer" and "an honest
assessment" are left out because on Hacker News they mean a person telling
the truth, not a writer praising their own framing.Both rules are wide on purpose. There is no verb list and no imperative
requirement, so the only narrowing is structural, and English has always used
this tail: the pair flags three times in 1.92M words of public-domain prose
and twice in 461k words of pre-2022 Hacker News, andand-nothing-elseflags
every refrain in "The Raven". Expect to dismiss it on fiction and on quoted
verse.