Skip to content

chore(deps): update vale-styles - #40

Open
tbhb-dev-renovate[bot] wants to merge 1 commit into
mainfrom
renovate/vale-styles
Open

tbhb-dev-renovate[bot] wants to merge 1 commit into
mainfrom
renovate/vale-styles

Conversation

@tbhb-dev-renovate

@tbhb-dev-renovate tbhb-dev-renovate Bot commented Aug 9, 2026 •

Copy link
Copy Markdown
Contributor

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Update Change
errata-ai/Google minor v0.6.3 → v0.7.1
tbhb/vale-ai-tells minor v1.27.2 → v1.37.0

Release Notes

errata-ai/Google (errata-ai/Google)

v0.7.1

Compare Source

Full Changelog: vale-cli/Google@v0.7.0...v0.7.1

v0.7.0

Compare Source

What's Changed

New Contributors

Full Changelog: vale-cli/Google@v0.6.3...v0.7.0

tbhb/vale-ai-tells (tbhb/vale-ai-tells)

v1.37.0

Compare Source

Added
  • FigurativeWorth (ai-tells): New rule. Every spelling of "worth," banned outright: a subject graded as deserving the reader's attention or the writer's effort, with the grade standing in for the fact ("Naming is worth knowing about," "the migration is worth the effort," "the complexity is worth it," "whether a fix is worth making," "one thing worth pointing out," "a tool worth its weight," a sentence-initial "Worth noting"). Four rules had each read an edge of the figure, and a real noun as the subject or any complement outside their short lists fell through all four. The reader-directed complements agent prose writes ("worth knowing," "worth understanding," "worth remembering," "worth a closer look," "worth your time") measure zero across the seven pre-LLM corpora. The hedge band is established there ("worth noting" forty-four times, "worth pointing out" ten, most under a dummy "it" the hedge rules already flagged), and so is the tradeoff band ("worth it" sixty-four times, "worth the effort" and "worth the complexity" about twenty, "worth making," "worth having," and "worth adding" about forty); every one is the construction, so every one fires on the maintainer's call. The quantity idiom ("a buffer's worth of data," "two days' worth of logs"), the corpora's only other use at twenty-four hits, stays quiet through a lookahead, and "net worth" and "self-worth" through lookbehinds; disable the rule for finance or commerce writing. Up to two words of complement ride along in the finding so it shows which spelling fired.
Changed
  • HedgingPhrases, MicDrop, FormalTransitions, AnthropomorphicJustification (ai-tells): The worth tokens moved to FigurativeWorth, so a finding reports once. HedgingPhrases gave up the "It's worth noting that" family, MicDrop the sentence-final "It's worth it." and "This is worth noting.", FormalTransitions the sentence-initial "Worth noting," and AnthropomorphicJustification "worth its weight." The comma appositive that closes with the figure (", a detail worth noting") still reports under SummativeAppositive as well, which reads the appositive rather than the word.
  • FigurativeCarries (ai-tells): A second documentation audit found the open-subject tokens missing most of the figure in one documentation tree. The determiner list now includes "no," "one," "any," "some," and the possessive ("no set carries the name," "Gravity's badge carries a leading icon"); the subject window takes two modifiers, a hyphen, an apostrophe, or a leading digit inside one, and an adverb before the verb ("the virtual config module carries the option," "an inline suppression always carries an adjacent comment," "a 63-unit brand glyph carries detail"); the cargo tokens' modifier slot takes the same hyphen ("carries a per-illustration prefix"); a code span in or as the subject matches through the asterisk run the parser masks it to ("the Match comparison carries the weight," "Icon carries its own box"). Four new subject shapes join: the pronoun ("no z-index it carries changes that," "what carries the choice"), an auxiliary before the bare verb ("has to carry the scope," "will not carry the control," "didn't carry before"), the bare plural with no determiner ("Expanded forms carry a negation"), and the plural pronouns on the relative token ("These carry offsets"). "Carries the weight" and "carries some weight" join the weight token. The openings measure zero across the seven pre-LLM corpora except three: the two-modifier window adds three hits, one a plural noun and one a gerund the preposition lookahead now refuses; the pronoun shape adds six human uses of the figure; and the auxiliary shape adds about twenty-five ("does not carry a Go type," "this break can carry a value"), the construction itself, flagged on the maintainer's call, with the two arithmetic uses refused by the lookahead. "Carried on" joins the phrasal exclusions.

Full Changelog: tbhb/vale-ai-tells@v1.36.0...v1.37.0

v1.36.0

Compare Source

Changed
  • BareNames (ai-tells): The imperative, an instruction to state or give a thing ("Name the version in the changelog," "Name the command behind every reported figure," "name what you tried," "Name every path," "then name the grant this merge goes under"), reports under the designation message, at the start of a sentence or after a colon, a comma, a semicolon, or a coordinator. The plain verb is "state," "give," or "say which." Agent-written skill and runbook prose puts it at three to five per ten thousand words. The seven pre-LLM corpora have it eleven times, every one the literal act of giving a name ("Name the new file pep-9999.rst," "Name the logger after the package," "name the result parameter _"); a lookahead keeps out the object that a code span, a quoted name, or "after" follows within three words, which reads eight of the eleven, and the three that fire ("Name these methods along the lines of," "name the result parameter, and use a naked return," "Name all the threads to the emitter") are the literal act with the name out of a regex's reach, flagged on the maintainer's call. The message now says to tell the reader to state the thing, and the thirty-nine rule messages that used the verb in their own instruction, whether opening it or following a comma or a coordinator ("Name the actor and use an active verb," "Name the literal action") now say, state, give, use, or describe instead.

Full Changelog: tbhb/vale-ai-tells@v1.35.0...v1.36.0

v1.35.0

Compare Source

Added
  • ConsequenceClause (ai-tells): New rule. The mechanism-and-inference sentence: a clause states what something does, then ", so" introduces a second clause with a fresh full-noun subject and its own present-tense verb that draws the conclusion for the reader ("a replay checks out every commit it moves, so the sandbox deny applies to a staged change too," "the styles ship as release assets, so the version pins itself," "each test file names its subject, so a rename fails the test"). ConsequenceParticiple reads the same move with a participle in place of the conjunction. Human technical prose uses ", so" constantly and follows it with a pronoun or a purpose clause (", so it," ", so you," ", so that"), which agent prose almost never writes; the gate is what follows the conjunction: a determiner, a noun phrase of up to three words, and a third-person present verb that is not a copula or a modal, so "so the order doesn't matter," "so its installation is more involved," and "so you can rebase" stay out, as does a plural noun read as the verb ("so the results are not comparable") and the first half of a hyphenated compound ("so an apples-to-apples comparison"). Fifty-eight hits across the seven pre-LLM corpora ("so the matcher uses the fallback language," "so the invariant holds trivially," "so the traceback proceeds normally," "so the compiler accepts less code than it should"), each the construction, at 0.3 per ten thousand words or less, against about six per ten thousand in agent-written documentation. The bare conjunction, the pronoun subject, ", so that," the copula clause, and the elliptical "so no writes yet" measured out as ordinary English at hundreds to thousands per corpus.
  • UnderRegime (ai-tells): New rule. The regime opener: a sentence that starts with "Under" and a bare name, making a tool, a decision label, or a layout the jurisdiction the clause holds inside of ("Under cog the same text is configurable twice," "Under mise the mechanism is chosen by where vendir writes the file," "Under layout the file lands in the vendored directory," "Under D15 the endpoint stays on the loopback interface"). The plain form leads with the subject and names the tool after the verb. The gate is the shape: sentence-initial "Under," one bare name with no determiner, then the determiner or pronoun that opens the clause, so "Under this proposal," "Under the hood," and "Under normal circumstances" never match, and the bare condition idioms ("under load," "under test," "under review," "under way," "under fire") sit in the exceptions. The name slot takes a lowercase word, a letter-and-digit label, or a code span, since that is what agent prose puts there; a capitalized proper noun ("Under Windows, the DEFAULT parameter can be used") is the corpora's own platform conditional and stays out. The determiner-led opener is ordinary prose at twenty-nine hits across the seven pre-LLM corpora, nineteen of them Rust RFCs arguing a design; a bare name of any case followed by a determiner matches four times, a platform conditional ("Under Windows, the"), an acronym in a Rust RFC, a Go identifier line the verb exclusions keep out, and an all-caps status note the exceptions hold, and the two openers among them are capitalized, so the case gate takes the count to zero, against four in agent-written documentation of half the size.
  • PointVerdict (ai-tells): New rule. "The point" as a verdict: a copula with "the point" as its complement, grading whatever came before as the purpose of the design ("Speed is the point," "That's the whole point," "This is exactly the point," "Determinism was the point," "The retry is the whole point of the wrapper"), and the intensified purpose statement that fronts the same noun ("The whole point of the cache is to avoid the read"). The reader has just read what the thing does; the sentence adds that this was the intent and says nothing about what the intent bought. The plain form says what the thing does or what it is for. Four rules had read an edge of the figure, Metacommentary's "This is the point," MicDrop's "And that's the point.," SummativeAppositive's comma relative, and ContrastiveFormulas' "X isn't the point; Y is," and the demonstrative, the noun subject, and every intensified spelling fell through them. Any subject fires, the modifier slot admits "whole," "entire," "very," "real," and "key," and the lookahead keeps out the literal position ("the point at which," "the point where," "the point following the borrow"), the question ("what is the point?"), and the bare possessive purpose ("the point of the cache"). The copula shape matches twice across the seven pre-LLM corpora, a Go blog post's "this is the key point" and a Rust RFC's "that's the whole point," and "the whole point of" matches eleven times, eight of them Rust RFCs arguing a design ("the whole point of this RFC is to get rid of the embedded flag"), each the construction, so it stays and is flagged.
  • FigurativeMints (ai-tells): New rule. Every form of "mint," banned outright: a step that "mints" an identifier, a workflow that "mints an app token," a "newly minted" release, "the minted installation token," "token minting," keys that "are minted." The determiner gate the verb carried in MotionMetaphors read "mints a token" and "minting a short-lived token" and missed the passive, the attributive participle, the gerund noun, the pronoun and bare-plural objects, and the "newly minted" idiom; a survey of agent-written documentation found the figure forty-odd times, almost all the GitHub App token idiom, with the gate reading about half. The verb appears once across the seven pre-LLM corpora, as "Linux Mint 18.3" in a PEP's platform list, which a lookbehind leaves alone, and a lookahead leaves "mint condition," "mint green," and "mint tea" alone too. The literal coinage fires; disable the rule for currency prose. The mint token moved here from MotionMetaphors.
Changed
  • FigurativeOwns (ai-tells): Possession spelled with "keep" ("a snapshot keeps its own task," "the consumer keeps its own config," "each layer keeps its own reasoning") reports under the ownership message. Four hits across the seven pre-LLM corpora, each a thread or a library keeping its own state; the stack lands in the existing exceptions and the other three sit in the runtime register that already disables the rule.
  • AnthropomorphicCognition (ai-tells): The accountable artifact, "answers to" with a rule, a style, or a gate as the authority ("the sentence-case rule that every other heading here answers to," "a squash message answers to the same styles," "a draft under the scratch directory answers to nothing," "what a commit answers to"), joins the judgment family. A lookahead refuses the noun sense, an answer to a question or a problem ("the answers to these two questions," "finding answers to Go questions"), the singular spelling keeps "an answer to the query" out, and a stranded token reads the relative-clause tail. The verb matches nowhere across the seven pre-LLM corpora.
  • Metacommentary and MicDrop (ai-tells): The "This is the point" token and the "And that's the point." coda moved to PointVerdict, which reads the whole copula family, so one span reports under one rule.
Fixed
  • EnforcementMetaphors (ai-tells): The kept-honest family now reads a bare demonstrative, a second-person or first-person object, and the reflexives ("keeps this honest," "keeps that honest," "keeps you honest," "keep ourselves honest," "keep everything honest"). The pronoun token listed five words and the determiner token required a noun after "this," so the bare demonstrative passed between them. The new forms match twice across the seven pre-LLM corpora, a Go proposal's linker that will "keep everything honest" and a Go comment stripping a variable "to keep ourselves honest," each the figure.

Full Changelog: tbhb/vale-ai-tells@v1.34.0...v1.35.0

v1.34.0

Compare Source

Added
  • FigurativeShape (ai-tells): New rule. "Shape" as a stand-in for whichever concrete noun the writer skipped: a data structure, a message format, a review's size, a regular expression, a prose rhythm ("fires on the shape rather than the provenance," "those two numbers pick the review shape," "the rules that shape an analysis," "calls of the same shape," "the wrong shape," "code-shaped"). A documentation-corpus census ranked it the most frequent figurative noun with no rule reading it, and this package's own rule comments and README rows used the word the same way for every token pattern, so the sweep that landed the rule reworded those too. A determiner-gated noun with an optional modifier, the bare "shape of," the verb in its gerund and relative forms ("shaping the direction of the API," "what shapes the output"), the hyphenated compound past the geometry prefixes, and the gated plural; the sculptor with a determined subject ("the pass shapes the output") stays with MotionMetaphors, the modifier slot refuses the Go compiler's "GC shape" and the turtle module's drawn shape, and the trailing check refuses the generics vocabulary ("shape type," "shape instantiation") and the geometric heads ("the shape of the curve"). The count is high and flagged on the maintainer's call: about sixty-five hits across the seven pre-LLM corpora, most of them the figure in argument prose ("the particular shape of the parse trees," "the shape of the portable SIMD API") plus the array-dimension term the typing PEPs use ("generic in its shape"), which no trailing check separates from the figure.
  • FusionMetaphors (ai-tells): New rule. Merging described as matter joining: a change that "folds" a helper "into" the caller, rules that "collapse into" one, a token that "absorbs" a sibling, a fix that "fuses" two paths, a flag that "couples" the cache "to" the writer. The plain verbs are merged, combined, added, and joined, with both things named. Every token gates on the verb plus a determined object or destination, so "a fold," "the collapse," and "tight coupling" stay out; the family measures nine across the seven pre-LLM corpora, each the figure. Disable the rule for physics or chemistry prose.
  • DepletionMetaphors (ai-tells): New rule. Failure and slowdown described as a body or an engine giving out: a loop that "exhausts its budget," a retry that "starves" the writer "of" slots, a job that "stalls on" a lock, a query that "degrades on" large inputs. The plain sentence says what ran out, what waited, and on which limit. Each token gates on the complement that makes the verb figurative and measures zero across the seven pre-LLM corpora. Disable the rule for prose about engines or nutrition.
  • AnthropomorphicAdjectives (ai-tells): New rule. Character grades applied to a mechanism: a default that is "benign," a test that is "brittle," a heap target that is "noisy," a timeout that is "generous," a cache that "stays healthy," a claim that is "honest about its limits." AnthropomorphicJustification reads the merit verbs and nothing read the adjectives, which a documentation-corpus census found to be a class of their own. An attributive token gated on a determiner, refusing the heads that take the adjective literally (a person, a tumor, a tip, a room), and a predicative token gated on a copula, with "honest" only there since EnforcementMetaphors reads the honest count. The census offered sixteen adjectives and the rest measured out: "naive," "aggressive," "conservative," "expensive," "fragile," "greedy," "smart," "graceful," "elegant," and "happy" are the corpora's own vocabulary or belong to other rules. The six kept match fourteen times across the seven pre-LLM corpora ("generous upper limit," "noisy heap target," "brittle workarounds," "benign snippet"), each the figure. Disable the rule for medical or community prose.
Changed
  • Installation: The README snippet now installs ai-tells by name. Vale's package catalog lists the style, so Packages = ai-tells reaches the latest release without a version in the line. A release URL still pins a version, and ai-tells-commits keeps one because the catalog does not list it; Vale syncs a list that mixes the two forms.
  • FigurativeSurfaces (ai-tells): The bare verb behind a modal, an infinitive marker, or a negation now fires ("tooling to surface changes," "will surface reports," "can surface bugs," "doesn't surface the failure"). A documentation-corpus census found the uninflected form escaping, since every token read an inflected one. Thirteen hits across the seven pre-LLM corpora, each the figure.
  • FigurativeNouns (ai-tells): "Surface" as what a reader or a caller sees joins the noun list ("the prose surface," "its canonical surface," "a reader-facing surface," "the whole surface"), the census's second-ranked figurative noun with no rule reading it. The modifier slot refuses the exported-names term ("the API surface," "the attack surface," "its public surface") and the lookahead the physical and linguistic compounds ("surface area," "surface syntax," "the surface language," "the surface of the moon"); it fires seven times in the Rust RFCs and PEPs, five making the same figure and two on the bare "on the surface."
  • FigurativeReaches (ai-tells): The imperative ("Reach for it in a script," "Reach for a slice when the skip doesn't cover it") and the second-person or generic-human subject ("you might reach for a git dependency," "users reach for the path form," "one reaches for the same helper") now fire. A documentation-corpus census counted the imperative as the form agent prose uses most, with nothing in the rule reading it. The sentence or list-item start gates the imperative, which measures zero across the seven pre-LLM corpora; the human-subject token reverses the rule's earlier ruling that left the bare human idiom alone, and fires five times, four Rust RFCs and one Go comment making the same selection figure. "People" and "person" left the exceptions for the same reason; a hand, a child, a climber, and a robot still reach literally and stay excepted.
  • MotionMetaphors, EnforcementMetaphors, FigurativeQuiet, FigurativeRides, JourneyMetaphors, and FigurativeIdioms (ai-tells): The one-token verbs a documentation-corpus census found no rule reading. MotionMetaphors takes the seated passenger and the lagging runner ("the loader seats the record in the cache," "the mirror trails the newest release"); EnforcementMetaphors the setting in office and the failure climbing the chain of command ("the flag governs whether the cache writes," "a warning escalates to an error"); FigurativeQuiet the muting verb ("the flag silences the warning"); FigurativeRides the chain as a ridden mechanism ("the lookup rides the chain"); JourneyMetaphors the counted stretch and the tier vocabulary ("walks three tiers," "walks each level of precedence"); and FigurativeIdioms burial ("buried in the config," "buries the error"). Governs matches four times across the pre-LLM corpora, escalates five, burial five, silences nine (the Rust RFCs and Python sources writing "silence the lint" and "silence this exception"), and the rest zero.
  • FigurativeNouns (ai-tells): The census's remaining figurative nouns join the list: "grain" as granularity ("one grain of the analysis," "at a coarser grain"), "lens" as a point of view ("through a security lens"), "headline" as the quoted number ("the headline number"), "cascade" as a chain of consequences ("a cascade of retries"), the spatial pair "dead end" and "blind spot," and "seam" as a join between components ("the injection seam"). Each gates on a determiner or a compound and refuses the physical senses ("a grain of sand," "the lens cap," "seam allowance"). Grain matches seven times across the pre-LLM corpora, the Rust RFCs arguing error recovery "at a coarse grain" and a PEP offering "finer grain control," each the figure; the rest match once or twice apiece or not at all. "Strata" stays out as the statistics term for a sampling layer, and "pre-flight" and "heartbeat" stay out as terms of art.
  • FigurativePays (ai-tells): The count as an invoice: a false-positive tally, a match count, or a line count presented as a price ("costs thirteen corpus hits," "the cost is five hits," "at zero corpus hits," "the cost is real"). The maintainer spotted the formula across this package's own rule comments and README rows, the third limb of the "measured cost" family, and the sweep that landed the tokens reworded those to say what matched and how often. Every spelling measures zero across the seven pre-LLM corpora, which report a count as a count.
  • NegatedObject (ai-tells): The perception verbs join the list ("finds no match," "found no examples," "sees no difference"). Both had been measured out on the two standard libraries; a documentation-corpus census showed them everywhere in agent prose, and on the seven pre-LLM corpora the finding verb matches ten times (the Go survey posts writing "found no differences," the runtime "finds no elements to flush") and the seeing verb six times, each the construction itself, so they are flagged on the maintainer's call. The same lookahead drops the degree and idiom phrases ("no more," "no reason," "no way").
  • AnthropomorphicJustification (ai-tells): The standing family gains the intransitive and third-person forms: "stands alone," "stand by itself," "stand on their own," "holds up on its own," "speaks for themselves," and "carries" or "pulls its own weight." "Stand on its own" and "stand on their own" match four times across the seven pre-LLM corpora, each the self-sufficient sense ("the deprecation message should be able to stand on its own"), and the verb phrase "stand alone" matches another four. A lookbehind keeps the adjective ("a stand alone top-level window") out. The rest match nowhere.
Fixed
  • EmphaticCopula (ai-tells): Bold markup no longer fires the rule. Every asterisk token was a bare regular expression, and a doubled-asterisk span contains the same shape a single-asterisk one does once the outer pair is counted in, so a sentence carrying bold and no italics at all raised an alert whose message asked for italics to be removed. Each asterisk token now requires an unpaired asterisk on either side, which leaves single-asterisk emphasis as the only match and drops the bold-italic triple along with bold. The underscore tokens are unchanged, because a doubled-underscore run never contains the space-prefixed shape they require. A bold-markup case in test-false-positives.md covers the regression.

Full Changelog: tbhb/vale-ai-tells@v1.33.0...v1.34.0

v1.33.0

Compare Source

Added
  • CoordinatedReveal (ai-tells): New rule. The reveal by quantifier: a claim stated once in compressed form, then ", and", then the same claim again with a totality word doing the turn. "For search that join reverses, and a chunk that ranks well maps back to every blob that contains it," "content-addressed and append-only, and a blob's bytes never change once captured," "and only the sweeper," "and nothing else has it," and the universal with the anaphoric relative delivered as its own sentence ("each caller that reads them"). It is the "not X, it's Y" formula with the negation deleted, the same two-beat pivot with "and" doing the work of "but" or a colon, and it surfaced once ContrastiveFormulas and ContrastiveNegation caught the spelled-out versions. Vale cannot see a restatement, so the tokens take the reveal clause; the five shapes cost nine hits across the Go and Python standard libraries, each the construction itself.
  • ConsequenceParticiple (ai-tells): New rule. The consequence participle tail, "which means" with the "which means" deleted: a clause ends, then a comma and a present participle restate its effect. "The sweeper drops the row, leaving the cache cold," "rebuilds the index on every write, making every read a miss," "giving the caller one row per blob," "meaning the index is stale," "letting the reader skip the scan," "forcing a second pass," "saving a round-trip," "costing one extra read," "turning every lookup into a scan," and the prepositional spellings "resulting in," "leading to," and "ending up with," which no other rule named. ParticipialPadding catches the press-release lexicon and never saw this plainer register. The gate is the participle plus a determiner, pronoun, or quantifier, so "making sure," "leaving aside," "giving up," and "meaning of" stay quiet, and "making a best effort" and "making it possible" are measured out; the kept participles cost about a hundred hits across the Go and Python standard libraries, each the construction itself, while "allowing," "causing," and "creating" stay out as the ordinary docs spelling of a side effect.
  • ShellNounCopula (ai-tells): New rule. The shell noun and its copula: an abstract noun, "is" or "was," and a that-clause that carries the whole claim. "The problem is that the index goes stale," "The difference was that the second build read the cache," "One catch is that the daemon keeps the lock," "The question is whether a restart clears the cache," "The only reason is that the flag defaults to off," and the "here" spelling ("The real issue here is that the socket closes early"). It is LabelAndExplain's colon written out as a copula, and it surfaced on the pages that had already lost their colons. The noun list is curated to the shells, so "the rule is that" and "the invariant is that" stay out as the definitions human docs write; the kept shapes cost about eighty hits across the Go and Python standard libraries, each the construction itself.
  • SummativeAppositive (ai-tells): New rule. The summative appositive: a finished clause, a comma, and an abstraction noun that names what the clause just was, with a relative clause hung off it. "Rebuilt on every read, a cost that shows up in the benchmarks," "sees one row, a distinction the old path never made," "drops the header, something no caller expects," "a detail worth noting," "which is exactly the point." The sentence had ended; the appositive reopens it to grade the claim and repeat it, the padding beat's "and that matters because" turn delivered without any of the words that used to mark it, and the sibling of CoordinatedReveal, where the same restatement rides on ", and". The label nouns are the evaluative abstractions agent prose reaches for, so an ordinary appositive naming a thing stays quiet, and "which is what" and "which is why" stay out as the human afterthought at forty corpus hits; the kept shapes cost two across the Go and Python standard libraries, each the construction itself.
  • AbstractionSubject (ai-tells): New rule. The anaphoric abstraction subject: the prior sentence compressed into an abstract noun with a demonstrative on it, and that noun made the subject of a comment. "That asymmetry is the point," "This inversion buys the reverse lookup," "That gap is where the second read happens," "This separation is deliberate," "That symmetry is not an accident," "This coupling is the price," and the plural "These asymmetries are the whole reason the cache exists." The plain form names the thing and says what it does. Metacommentary already took "This X matters." and "This X means," and MicDrop took "This is the point," so this rule covers the abstraction noun ahead of the copula and ahead of any other verb of comment, over a measured list of fifty nouns. A passive after the copula stays quiet as docs English ("is enforced by the database"), a measurement stays quiet ("is 4 bytes"), and lowercase "that" never fires; the kept shapes cost three hits across the Go and Python standard libraries, each the construction itself.
  • StrawmanContrast (ai-tells): New rule. The strawman contrast tail: the "not X" half of the "not X, it's Y" formula moved to the end of the clause, refuting an alternative nobody proposed. "The reader walks the index, rather than walking the whole tree," "it reads the offsets directly, instead of re-reading each file," "the join goes from chunk to blob, not the other way around," "the lookup is one read, rather than a scan," "it keeps one copy, not one per caller." ContrastiveFormulas and ContrastiveNegation catch the spelled-out and telegraphic versions, and this is where the contrast went once they did. "Rather than" and "instead of" are ordinary English at about 1,750 hits across the Go and Python standard libraries, and the comma alone still costs 150, so the gates are the comma and the shape after it held to the end of the sentence: a gerund ("rather than walking") or a determiner and its noun phrase ("rather than a scan"), plus the reversal, per-unit, and totality tails behind ", not". The kept shapes cost about thirty corpus hits, each the construction itself in human hands, and the gerund tail is the loudest token in the family.
  • ScopePartition (ai-tells): New rule. The scope partition, the setup that makes a reveal possible: the writer splits the world in two and fronts each half with a comma-fenced label. "On the read side, the lookup is one hop. On the write side, every blob is hashed," "Read-side, the join is one hop," "At index time, the tokenizer runs once. At query time, it runs again," and the coordinator-gated lowercase spellings ("and on the write side,"). It is the two-beat pivot CoordinatedReveal and ContrastiveFormulas catch, delivered as stage directions rather than a contrast word, so it survived when the contrast words were suppressed. The comma is the gate: "on the right-hand side of," "at link time, before we," and "at run time" without the fronting comma are ordinary technical English and stay out; the kept shapes cost eight hits across the Go and Python standard libraries, each the construction itself. StackedAnaphora gains the paired "For X, ... For Y," opener across two consecutive sentences ("For search, that join reverses. For writes, the table takes one append"), with the discourse markers ("For example," "For now,") excluded; one corpus hit, the fmt docs.
  • PseudoCleft (ai-tells): New rule. The pseudo-cleft: a free relative as subject, a copula, then a claim short enough to have stood alone. "What changed is the direction," "What you get is one row per blob," "What remains is the offset," "All you need is the offset," "All that's required is a token," "The only thing that changes is the direction," "Where this pays off is the read path," and the bare-verb spelling "all it does is call the hook." It is the "Here's what" lead of ExplainerLeads with the demonstrative dropped, and it surfaced once the announcing spellings were suppressed. ExplainerLeads keeps the determiner-fronted form, RestatementMarkers "What this means is," and ColloquialAssessments the "matters" verdicts, so the tokens here take the pronoun and bare-verb subjects, the "all" and "the only" frames, and "Where" with a payoff verb; a question mark in the sentence and a determiner gate after the copula keep questions and predicate adjectives out. The six shapes cost about twenty-eight hits across the Go and Python standard libraries, each the construction itself.
Changed
  • RestatementMarkers (ai-tells): Now catches the restatement after its formal openers were suppressed: the parallel restatement ("The same holds for writes," "The same is true of the index," "The same applies to the reader," "The same goes for every caller"), the framing opener that promises a practical or net reading and then repeats the claim ("In practice, the index is one file"; "In effect, the join reverses"; "In the end, one read"), the gloss openers "Put another way" and "which is to say," and the sentence-initial "Meaning" gloss ("Meaning, the cache is cold" and the fragment "Meaning the cache is cold"). The framing openers gate on the capital and the comma, because mid-sentence "in practice" and "in effect" are ordinary docs English; the kept shapes cost about fifty hits across the Go and Python standard libraries, each the construction itself. "That is," measures out at a hundred and sixty sentence-initial hits as the Go doc-comment house gloss, and "Likewise" and "That is to say" stay in FormalTransitions. The message gained a second action for the parallel case: name both cases in the sentence that makes the point.

Full Changelog: tbhb/vale-ai-tells@v1.32.0...v1.33.0

v1.32.0

Compare Source

Added
  • NegatedPair (ai-tells): New rule. The coordinated negated pair, a fact stated by naming two absences: "with no database and no network," "needs neither the database nor a round-trip," "runs without a database or a round-trip," "doesn't need credentials and doesn't call the network," the "nor" continuation ("nor does it call the network"), the sentence-initial pair with its own verb ("Neither the database nor the network is required"), and the asyndetic badge copy ("no setup, no config, no fuss"). A documentation-corpus audit of 171 files named it the construction reviewers push back on most, and the prepositional spellings had no verb for NegatedObject to gate on. The determiner gates "without a X or a Y," because bare "without X or Y" is docs English eighty times over in the Go and Python standard libraries, and "has neither" stays out with "has no"; the kept shapes cost about thirty corpus hits, a third of them one repeated Go license comment.
  • BareHolds (ai-tells): New rule. The bare possession verb, a data structure with hands: "the table holds every stage's tables," "two records hold identical bytes," "whatever the store holds," "the counts the aux tables already hold," "code held as a config value," "a directory holding one." The same audit counted 133 of these, the highest-frequency violation in its corpus and the one that drew the strongest reviewer objection; FigurativeHolds gates on the idiom complement and never saw the container sense. An open determiner-gated subject with the object inside the span, so the exceptions can name the concurrency register (a goroutine holds the lock, a caller holds a reference) and the physical world (a hand, a jar, a clamp). Split from FigurativeHolds because the cost is large: about 160 hits across the standard libraries, the container idiom of pre-LLM programming prose, flagged on the maintainer's call and documented as the loudest rule in the package on ordinary technical writing. A project that keeps the container sense disables it per file.
  • BareReaches (ai-tells): New rule. The bare arrival verb with an inanimate subject: "only referenced records reach the store," "an orphan never reaches an extractor," "the stage hasn't reached that record yet," "a fragment reaches nothing," "the items a query reaches." The audit counted 180 of these; FigurativeReaches takes only the selection sense ("reaches for"). An open determiner-gated subject with a bare plural, the perfect tenses, and the clause-final relative clause as companions; beings, vehicles, and the physics register sit in the exceptions, and the measurement senses ("reaches zero," "reaches EOF," "reaches its limit," "the timeout is reached") stay quiet. Split from FigurativeReaches so the selection tokens keep their zero corpus cost while this one carries about fifty hits, the transport idiom of runtime prose.
  • MortalityMetaphors (ai-tells): New rule. Life, death, and survival handed to a process or a row: a run that "dies part way through," a process that "can die mid-write," a row that "survives unchanged," a file that "survives the rebase untouched" (moved here from FigurativeIdioms), a cache entry that "outlives" the request, a record kept "for its whole life." An open determiner-gated subject with the beings, plants, batteries, and bulbs that literally die in the exceptions; threads and processes are not excepted, so the runtime register ("if the parent dies," about twenty corpus hits) and the compiler's "outlives" (nineteen, all escape analysis) fire on the maintainer's call. "Dead values" and "dead code" stay out as compiler vocabulary.
  • MotionMetaphors (ai-tells): New rule. Motion and force verbs applied to data or control flow: a pipeline that "feeds" a stage, a row that "strands," rows that "swamp" an index, a table that "dwarfs" the rest, a stage that "crowds out" the rest, a planner that "leans on" an index, a step that "mints" an identifier, a default "baked in," a config that "drives" the build, a pass that "shapes" the output, "cracks open," "sheds." Each verb gates on the shape the audit saw, at zero to two corpus hits apiece; "comes from," "arrives," "routes," "flows," "brings," "seeds," "fuses," and the sponge register's "squeezes" and "absorbs" measured out.
  • FigurativeNouns (ai-tells): New rule. Nominalized figuration, which every verb-anchored rule misses: "reach" as a retrieval path ("its primary reach," "per-rule reach," "picks between two reaches"), "wrinkle" as a complication, "story" as a design ("the migration story"), and "knob" as an option. Each gates on the determiner or compound that makes the noun figurative, at zero to two corpus hits apiece; "heartbeat," "waterfall," and "gap" stay out as terms of art or too ordinary to gate.
  • FigurativeKeeps (ai-tells): New rule. The upkeep frame: "keeps a re-run cheap," "keeps search fast," "keeps the index small," "keeps an orphan away from every extractor," "keeps the rest clear of it," "keeps a reader from mistaking one for the other." The adjective list is the gate, since "keep the buffer small" is ordinary English with most adjectives; the kept ones cost seven corpus hits. The causative "keeps X from being invoked" and "keeps X out of Y" stay out as the corpora's own "prevents."
  • FigurativeEarns (ai-tells): New rule. Every form of "earn," banned outright: a rule that "earns its keep," a helper that "earns a caveat," a shell that "earns full branch coverage," trust that "is earned," a "well-earned" promotion. The earning shapes lived in AnthropomorphicJustification as curated possessive idioms, grant-object lists, and a determiner-gated subject shape, and each gate let another inflection through ("Every shell earns full branch coverage" slipped the determiner list), so the maintainer banned the verb instead: one bare token flags every form, the literal person-subject uses included. The Go standard library uses no form of the verb at all, and the Python standard library's only occurrences are one repeated spam-email test fixture, so technical prose loses nothing. The nominal vocabulary stays quiet ("earnings," "earner," "earnest"); payroll, tax, and finance prose disables the rule, and a dedicated rule means doing so costs none of AnthropomorphicJustification's remaining coverage.
  • BareNames (ai-tells): New rule. The designation verb with an inanimate subject: "the manifest names the tag," "the field names the target," "the plain sentence names the step," "a recipe names a gate," "it names a kind of file," "the rejections named figurative language," "an identifier naming an object." AnthropomorphicJustification had left the verb alone on corpus evidence, because Go and Python documentation use it for what an identifier denotes ("the path names a directory"), and CommitFigurativeVerbs covered it only where a commit message is the text; the maintainer then met it in every document that passed under the package and asked for the verb flagged wherever a thing names a thing. An open determiner-gated subject with the pronoun and relative subjects, the bare plural, the modal, the gerund, and a dotted filename ("vendir.yml names the tag") as companions; the object gates on its own determiner so the plural noun ("the type names that appear") stays quiet, and the people and bodies that literally give or publish a name sit in the exceptions. The cost is about fifteen hits across the two standard libraries, flagged on the maintainer's call; API reference prose disables the rule per file.
  • NamedAdjective (ai-tells): New rule. "Named" as a pointer adjective: "the named file," "the named recipe," "each named rule," "its named target," the same designation as BareNames worn as a modifier, flagged on the maintainer's ask alongside the verb. Takes "named" from EmptyPadding and EmptyPaddingStacked, whose tagger-driven pair flagged every "named pipe" with an instruction to delete the word. Gated on the definite determiner, so "a named type," "named pipes," and "a named tuple" (a thing that has a name, as opposed to an anonymous one) stay quiet, with a lookahead over the terms of art that keep that sense under "the" too ("the named group"); the participle ("the file named foo") never puts the adjective beside the determiner, and the legal and meteorology terms ("the named party," "the named storm") sit in the exceptions. The cost is the API idiom itself, about 230 hits across the Go and Python standard libraries, most of them "the named file" and "the named directory"; with BareHolds it is one of the loudest rules in the package on reference prose, and a project documenting an API disables it per file.
Fixed
  • SentenceStartRepetition, SentenceStartEntropy, SentenceLengthVariance, ParagraphLengthVariance, ContentDuplication, ContractionAvoidance, PassiveDensity, TransitionRepetition, and TricolonDensityDocument (ai-tells-experimental): The raw-scope scripts now strip the markup an MDX or HTML document puts between paragraphs before measuring: JSX and HTML tags with their attributes, MDX expression lines and comments, import and export statements, and a frontmatter block. Left in place, a component tag read as the first word of the sentence after it, so a page built from repeated <Callout> blocks tripped SentenceStartRepetition on the tag rather than the prose, and a self-closing <Image /> line on its own entered the paragraph-split scripts as a paragraph. A new test-mdx.md fixture holds such a page, and the test gate raises every raw-scope rule to error over it. The fixture keeps a .md extension because Vale parses .mdx through the external mdx2vast tool, which the pinned toolchain lacks, while the scripts read the raw text whatever the extension.
Changed
  • EmptyPadding and EmptyPaddingStacked (ai-tells): "Named" left both modifier lists for the new NamedAdjective, which gates it on the definite determiner and keeps the terms of art ("a named pipe," "named types," "a named tuple") quiet. The tagger-driven pair had flagged every one, and the README listed "named pipe" as a known cost; the other modifiers are unchanged.
  • NegatedSubject (ai-tells): A documentation-corpus audit found the copula token missing the "gets" auxiliary ("No row ever gets deleted"), an adjective predicate ("No freeze is anonymous"), an intransitive verb ("No operational driver appears in the code"), the pronoun subjects "Nothing," "None of," and "Neither," and the relative-clause negated subject ("a row whose key no root reaches," "a file that no manifest names"), which is lowercase by nature and gates the word before "no" so NegatedObject's shapes stay with it. All five joined at about fifty corpus hits between them, the same human caveat register the copula token already accepts. Then, on the maintainer's ask to strengthen the negation pair past the audit, the copula slot took the modal, perfect, and progressive auxiliaries ("No data will be collected," "No lock needs to be held"), the intransitive verb took a modal ("No warning should occur"), "Nothing" took the copula ("Nothing is collected"), the "Zero" spelling joined with the curated predicates ("Zero configuration is required," while "Zero padding is allowed" stays quiet), the intensified subject joined ("Not a single line is wasted"), and the mid-sentence declarative after "and," "but," or "because" joined in lowercase ("and no data is lost"); "so no adjustment is needed" stays out as the consequence idiom and "None is returned" as Python's literal.
  • NegatedObject (ai-tells): The "nothing" spelling of the shifted negation now fires over the operations and possession verbs ("writes nothing of its own," "costs nothing," "deletes nothing," "holds nothing but derived data"), at about thirty corpus hits; "does nothing" stays out at 134 as the corpora's own name for a no-op. On the maintainer's ask, each verb token also takes an intensifier ahead of "no" ("requires absolutely no configuration," "adds virtually no overhead"), the bare intensified absence fires on its own ("absolutely no data"), and the prepositional spelling fires behind the verbs that make a reassurance of it ("ships with no dependencies," "runs with zero configuration," "installs without any changes") and behind the reassurance nouns whatever the verb ("with no configuration," "with no vendor lock-in"); "with no changes" stays out as the diff register.
  • PassiveVoice, PassiveVoiceAdverb, and PassiveDensity (ai-tells-experimental): The "get" passive ("gets created," "got deleted," "get compared") joins the auxiliary list in all three, after the audit found every one of those escaping.
  • FigurativeCarries (ai-tells): The bare "carry" a plural subject or a relative pronoun proves is the verb now fires ("the machine formats carry the score columns," "the blobs that carry no state rows," "the tier other stages carry"), at one corpus hit for the plural and two for the relative shape, both the arithmetic verb the trailing lookahead now refuses. The bare plural with no determiner stays out, because the arithmetic noun sits in that slot sixteen times over.
  • FigurativeSurfaces, FigurativeClears, FigurativeQuiet, FigurativeFires, EvasionMetaphors, FigurativeTravels, and FigurativeSweeps (ai-tells): The one-token misses the audit found. FigurativeSurfaces takes a bare-noun object ("Surfaces skills whose definition matches"); FigurativeClears takes the bound and pass nouns ("clears the target," "cleared the run") and the intransitive "clears on the next run," while "clears it" stays out as the deletion sense; FigurativeQuiet takes "silent" and "mute" beside "quiet" and the imposed silence "keeps the console quiet"; FigurativeFires takes the pronoun subject ("they fire nothing," "so it fires nothing") and "misfire"; EvasionMetaphors takes "lets violations into," "past," "by," and "out"; FigurativeTravels replaces its curated data-noun subject with an open determiner-gated one and a widened destination set ("the precomputed digests travel into that bundle"); and FigurativeSweeps takes the bare removal of records ("Sweep the failures," "sweeps every stranded row"). Every addition measures at zero to three corpus hits.
  • FigurativeSits, FigurativeOwns, FigurativeLives, FigurativeStays, FigurativeFalls, and FigurativeWins (ai-tells): The subject-shape gaps the audit found. FigurativeSits admits a modifier in the open subject ("an orphan row sits on a record"), a pronoun subject ("these sit ahead of"), the inverted order ("over each column sits an index," "beside it sit flat columns"), and the posture complement ("sits quoted and escaped"). FigurativeOwns takes the component that owns the table it writes ("the table it owns," "it owns three tables," "the columns each stage owns," "the docs that own the decision cut," "no owning component"), at eleven corpus hits in the runtime register the exceptions already name. FigurativeLives takes the bare-noun subject ("Free-block bloat lives in the file layout," "operator mechanics live elsewhere") and the "as" complement, leaving "this lives in" and the compiler's liveness vocabulary out. FigurativeStays replaces its eight curated adjectives with an open determiner-gated state complement plus a grown bare-verb list ("stays complete," "stays optional," "stays deterministic," "stays put"), at about twenty-five corpus hits with "remains" or "is" as the plain word, leaving "stays in sync" out. FigurativeFalls takes the bare category sort ("falls into one of three dispositions"), the bounded placement ("falls within the window"), and the numeric floor ("fell under the floor"); "falls back to" stays out at 219 corpus hits as the plain name for a second choice. FigurativeWins now fires on the contest with an inanimate subject ("a lower index wins," "one item per group wins as primary," "losers then split," "picking a winner," "outranks," "beats an explicit flag") and on "kicks off," reversing the earlier call that left the precedence sense alone, at twenty-four corpus hits each and on the maintainer's direction; the beings who literally win sit in new exceptions, and "races" and "dominates" stay out as the data race and the dominator tree.
  • AnthropomorphicCognition (ai-tells): The judgment verbs behind the determiner-gated subject ("a record's bytes decide which extractor runs," "the library decides for itself," "prose answers questions," "determinism forbids a model," "arbitrates," "cedes," "adopts"), the fallible artifact ("the loader could mistake X for Y," "one scan can't prove," "the parser guesses"), the artifact that asks for, hunts, or pretends, the failure text that "tells you to" refresh, and transitive "confuse" ("characters that confuse tokenization") all join, with "decides" at twenty-three corpus hits and "confuse" at fifteen the loud ones. The ditransitive teaching frame ("would teach a reviewer the wrong contract," "teaches the reviewer a contract") takes a lookahead-only span listed ahead of the general token, because the general token puts the pupil inside its span and the human-pupil exceptions were dropping it. Bare "behave" (twenty-eight hits, no complement to gate on), "objects" as a verb (its noun floods every gate), and "refuses" (the plain verb this package recommends for a check that rejects its input) stay out.
  • UniversalObject and UniversalSubject (ai-tells): UniversalObject admits the base verb behind a plural subject directly ahead of it ("content rules cover every input"), the one base form that is a claim rather than aspiration, at one corpus hit. UniversalSubject takes the quantified subject doing one thing to one object ("Every predicate reads a live root," "All rows carry a timestamp"), a curated-verb shape that costs about twenty-five hits in the spec-truth register the copula token already accepts.
  • FigurativeIdioms, ColloquialAssessments, JourneyMetaphors, FigurativePays, EnforcementMetaphors, and FigurativeQuantities (ai-tells): The idioms and figures the audit found clearing every rule. FigurativeIdioms takes "lines up with," "doubles as," "double duty," "the whole trick," "a step further," "meets that bar," "on hand," "went missing," "went away," "for good" (with "for good measure" refused), "made that call," "judgment call," "takes a while," "gets it backwards," "picks up on," "from two angles," "stands up a service," and the bare "fans out"; "survives the rebase untouched" moved to MortalityMetaphors, and "goes away" stays out at sixty-one hits. ColloquialAssessments takes "handy for" and "comes in handy." JourneyMetaphors takes "made it through," "makes it into," and "walks the workflow." FigurativePays takes the invoice spelled with "cost" ("never pays that cost," "at no cost," "would pay to compare," "spends work"), leaving bare "cheap" out at fifty-two hits. EnforcementMetaphors takes candor credited to a number ("an honest count," "the honest decode," "keeps a before-and-after comparison honest") and gating as a verb ("the root that gates it," "the live roots gate every table," "to gate a security control"), at eight Go-comment hits. FigurativeQuantities takes distance standing in for a count ("how far one label reaches").
  • FillerPhrases (ai-tells) and CommitOverexplanation (ai-tells-commits): Both messages said the flagged phrase "adds nothing," which the new NegatedObject token flags in the message linter; each now says the sentence reads the same without it.
  • FigurativeCarries (ai-tells): A negated-cargo token now takes the object left open ("it carries no counts and no dates," "carries zero overhead"). NegatedObject leaves "carries no" to this rule, but the content and policy tokens gate on head-noun lists and the open-subject shape gates on a determiner-fronted subject, so a pronoun subject with an unlisted noun escaped both. The Go and Python standard libraries show the open shape once across 1.3M lines ("carry no data," which the content token already flags), and NegatedObject's degree and count lookahead gates carry over, so "carries no more than three" and "carries zero or more" stay q

✂ Note

PR body was truncated to here.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • "on sunday"
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate.

@tbhb-dev-renovate
tbhb-dev-renovate Bot requested a review from a team as a code owner August 9, 2026 01:53
@tbhb-dev-renovate
tbhb-dev-renovate Bot force-pushed the renovate/vale-styles branch from adf0c49 to cad5152 Compare August 9, 2026 20:35
@tbhb-dev-renovate
tbhb-dev-renovate Bot force-pushed the renovate/vale-styles branch 2 times, most recently from c16d82c to f8fddfa Compare August 21, 2026 21:23
@tbhb-dev-renovate
tbhb-dev-renovate Bot force-pushed the renovate/vale-styles branch 3 times, most recently from 4e9de42 to 3339b7b Compare September 12, 2026 16:49
@tbhb-dev-renovate
tbhb-dev-renovate Bot force-pushed the renovate/vale-styles branch 2 times, most recently from 67975af to ca0ed94 Compare September 19, 2026 17:03
Signed-off-by: proofhouse-renovate[bot] <289255489+proofhouse-renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants