Skip to content

v0.6.0

Choose a tag to compare

@benjaminjackson benjaminjackson released this 08 Sep 17:04
· 175 commits to main since this release

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
    marketplace benjaminjackson/sloplint and install sloplint; the plugin
    carries the Ruby source with it, so nothing is installed from a package
    index and it works where gem install cannot 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 at info: Thoreau and Melville write it too.

Fixed

  • check now reads files and stdin as UTF-8 whatever the locale says. A
    sandbox with no LANG set — 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 with invalid 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-whole now takes value and fix after "that's the whole",
    alongside point, game, thing, deal and story. The contracted
    closer is the one an agent writes in technical prose ("That's the whole
    value of the info tier", "That's the whole fix"), and is-the-whole-x
    sees only the uncontracted "is", so the sentence slipped both rules. The
    uncontracted "That is the whole fix." moves with it, from info under
    is-the-whole-x to warning. 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-whole leaves "value chain", "value-add" and "fix list" alone
    however the line wraps (is-the-whole-x still reads the uncontracted
    "That is the whole value chain" at info, as it did), and a curly
    apostrophe now counts as a contraction. Both rules interpolate one WHOLE_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 with empty 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 --markdown blanks 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/sloplint to exe/sloplint. claude.ai
    rejects a plugin with a top-level bin/ directory, which would block
    organization distribution. gem install sloplint is unaffected.

  • exe/sloplint now checks RUBY_VERSION before loading anything and aborts
    with an explanation, rather than raising NoMethodError from Data.define.
    The Ruby macOS ships at /usr/bin/ruby is 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) is thats-the-whole on 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 one the-x-is-the-x uses, 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 --markdown cannot 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 like rule-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-x and most-honest-x (rhetorical-tic, warning) answer
    the "honest" habit the way cleanly, clean-x and cleanest-x answer the
    "clean" one. honestly takes the manner adverb closing on a full stop or
    comma ("these two rows compare honestly"); honest-x takes the adjective in
    front of the writer's own construction ("an honest comparison", "the honest
    framing"); most-honest-x takes the self-ranking superlative.

    honestly is 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, and and-nothing-else flags
    every refrain in "The Raven". Expect to dismiss it on fiction and on quoted
    verse.