/faircopy

Rules reference

The default regex rules and optional NLP rules.

faircopy ships with three fast regex rules enabled by default. It also offers an optional NLP pack for semantic checks that need part-of-speech tagging.

Default rules

no-em-dash

Bans the em-dash character (, U+2014).

Example violation:

The product ships this week — we hope.

Fix: split at the break. Use a period, semicolon, or parenthesis.

The product ships this week. We hope.

Em-dashes are a stylistic tell. Sentences with them often hide two shorter sentences that would read more directly on their own.

Options:

rules: {
  'no-em-dash': ['error', {
    flagEnDash: true,         // also flag – (U+2013). Default false.
    flagDoubleHyphen: true,   // also flag --. Default false.
  }],
}

no-weasel-words

Bans reinforcement adverbs that defend a claim instead of making it.

Default words: actually, truly, really, literally.

Example violation:

Our platform is fast.

If you write that sentence and your instinct is to stiffen it with “our platform is really fast”, the real problem is that “fast” on its own reads weak. Delete the adverb; if the sentence now reads unconvincing, rewrite the claim.

Options:

rules: {
  'no-weasel-words': ['error', {
    words: ['actually', 'truly', 'really', 'literally', 'just', 'simply'],
  }],
}

no-rhetorical-scaffolding

Catches two formulaic patterns:

  1. X is Y, not Z constructions.
  2. Without X... With X... sentence pairs.

Both spend a clause denying a straw man or performing a reveal instead of landing the claim. Drop the setup. Keep the claim.

Example violations:

  • “Our platform is a workflow, not a product.”
  • “Without structure, chaos. With structure, clarity.”

Fix: state the claim directly.

  • “Our platform organizes the team’s daily workflow.”
  • “Structure turns chaos into clarity.”

Options:

rules: {
  'no-rhetorical-scaffolding': ['error', {
    allowIsNotConstruction: false,        // disable pattern 1
    allowWithoutWithConstruction: false,  // disable pattern 2
    extraPatterns: ['\\bnot\\s+your\\s+\\w+\\b'], // extra regex patterns
  }],
}

Optional NLP rules

Install the NLP pack when you want semantic checks in addition to the default rules.

npm install -D @faircopy/rules-nlp

These rules use compromise for lightweight POS tagging and browser-safe pattern matching. They are opt-in, so add the NLP ruleset and enable the rules you want in faircopy.config.ts.

no-filter-words

Flags distancing phrases that announce a perspective or pad the sentence instead of landing the claim.

Default phrases: I think, it seems, basically, in order to.

Example violations:

  • “I think this is the fastest way to onboard a team.”
  • “We added this layer in order to simplify approvals.”

Fix: remove the framing phrase and make the claim directly.

  • “This is the fastest way to onboard a team.”
  • “We added this layer to simplify approvals.”

Options:

rules: {
  'no-filter-words': ['error', {
    phrases: ['I think', 'it seems', 'basically', 'in order to', 'sort of'],
  }],
}

no-empty-transformation-claims

Flags broad transformation claims that promise a feeling instead of naming the concrete outcome.

It catches phrases like “transform the way teams work”, “unlock your productivity”, and “take your workflow to the next level”.

Example violations:

  • “Faircopy transforms the way teams work.”
  • “Unlock your productivity.”
  • “Take your workflow to the next level.”

Fix: name the workflow, metric, or customer outcome that changes.

  • “Faircopy flags vague launch copy before review.”
  • “The dashboard shows every blocked approval.”
  • “The workflow cuts status meetings from launch reviews.”

Options:

rules: {
  'no-empty-transformation-claims': ['warn', {
    allowedPhrases: ['transforms the way teams work'],
  }],
}

no-passive-voice

Flags likely passive voice with a copula or auxiliary followed by a past-tense verb.

Default severity is warn.

Example violation:

The rollout was delayed by unclear ownership.

Fix: name the actor when it matters.

Unclear ownership delayed the rollout.

Passive voice often hides who acted and adds drag. The warning is a prompt to inspect the sentence, not a claim that every match is wrong.

Options:

rules: {
  'no-passive-voice': ['warn', {
    allowedAuxiliaries: ['is', 'are', 'was', 'were', 'be', 'been', 'being'],
  }],
}

no-weak-modals

Flags hedged modal claims where a modal verb weakens an outcome claim.

Default modals: can, could, may, might.

Default verbs: boost, drive, enable, help, improve, increase, make, reduce, support, transform, unlock.

Example violation:

The workflow can help teams unlock better launches.

Fix: say what the workflow does, or name the proof behind the claim.

The workflow gives teams a launch checklist for every approval.

Options:

rules: {
  'no-weak-modals': ['warn', {
    modals: ['can', 'could', 'may', 'might'],
    verbs: ['help', 'improve', 'unlock'],
  }],
}

no-stacked-adjectives

Flags noun phrases with multiple adjectives before the noun.

Example violation:

The adaptive intelligent workflow engine keeps projects aligned.

Fix: keep the one descriptor that earns its place, or replace the phrase with concrete evidence.

The workflow engine keeps projects aligned.

Options:

rules: {
  'no-stacked-adjectives': ['warn', {
    allowedPhrases: ['continuous integration server'],
  }],
}

no-nominalized-phrases

Flags nominalized X of Y phrases that hide an action inside a noun.

Default suffixes: tion, sion, ment, ance, ence, ity.

Example violation:

The optimization of onboarding reduced support tickets.

Fix: turn the buried noun back into a verb.

Optimizing onboarding reduced support tickets.

Options:

rules: {
  'no-nominalized-phrases': ['warn', {
    suffixes: ['tion', 'sion', 'ment', 'ance', 'ence', 'ity'],
    allowedWords: ['accessibility', 'reliability', 'security'],
  }],
}

no-expletive-openers

Flags sentence openings that delay the real subject with phrases like “there are” and “there will be”.

Example violation:

There are faster ways to review launch copy.

Fix: start with the actor, product, or benefit.

Faster review starts with specific launch copy checks.

Options:

rules: {
  'no-expletive-openers': ['warn', {
    phrases: ['there is', 'there are', 'there was', 'there were', 'there will be'],
  }],
}

no-redundant-pairs

Flags fixed phrases that repeat the same idea twice.

Default phrases include first and foremost, end result, past history, and future plans.

Example violation:

First and foremost, remove the end result from your future plans.

Fix: keep the stronger word or replace the phrase with a specific claim.

Remove the result from your plan.

Options:

rules: {
  'no-redundant-pairs': ['warn', {
    phrases: ['first and foremost', 'end result', 'future plans'],
  }],
}

no-pronoun-led-claims

Flags vague sentence openers where a pronoun and generic verb carry the claim.

Default pronouns: this, that, it, these, those.

Default verbs: helps, enables, allows, lets, makes, drives, supports, improves, boosts, transforms, unlocks.

Example violation:

This helps teams move faster.

Fix: name the thing that helps and the concrete outcome.

The checklist shows teams which launch approvals are blocked.

Options:

rules: {
  'no-pronoun-led-claims': ['warn', {
    pronouns: ['this', 'that', 'it'],
    verbs: ['helps', 'enables', 'unlocks'],
  }],
}

no-buzzword-stacks

Flags sentences overloaded with abstract benefit nouns instead of concrete product behavior.

Default terms include platform, productivity, collaboration, transformation, innovation, and growth.

Example violation:

Our platform drives productivity, collaboration, and transformation.

Fix: name the workflow or evidence behind the claim.

The review queue shows owners, blockers, and approvals for each launch.

Options:

rules: {
  'no-buzzword-stacks': ['warn', {
    terms: ['platform', 'productivity', 'collaboration', 'transformation'],
    maxTermsPerSentence: 2,
  }],
}

no-hedge-words

Flags hedge words that soften a claim before the copy gives evidence.

Default hedges include kind of, sort of, somewhat, fairly, pretty, arguably, relatively, and more or less.

Example violation:

This is kind of fast, somewhat useful, and more or less ready.

Fix: remove the hedge or replace it with a specific proof point.

The workflow loads in 120ms, covers approvals, and is ready for launch review.

Options:

rules: {
  'no-hedge-words': ['warn', {
    hedges: ['kind of', 'somewhat', 'more or less'],
  }],
}

no-vague-quantifiers

Flags bare quantifiers that make claims hard to evaluate without a number, range, or concrete scope.

Default quantifiers include many, several, various, multiple, some, a number of, a range of, tons of, and lots of.

Example violation:

Many teams see several wins across a range of workflows.

Fix: replace the quantifier with a number or concrete scope.

Twelve launch teams cut review time across onboarding, approvals, and release notes.

Options:

rules: {
  'no-vague-quantifiers': ['warn', {
    quantifiers: ['many', 'several', 'a range of', 'tons of', 'lots of'],
  }],
}

no-meaningless-modifiers

Flags intensifiers that inflate a claim without adding evidence.

Default modifiers include very, really, actually, basically, literally, essentially, truly, definitely, clearly, and obviously.

Example violation:

This is very fast and obviously better.

Fix: delete the modifier or replace it with concrete detail.

The cached workflow loads in 120ms and cuts review steps from six to three.

Options:

rules: {
  'no-meaningless-modifiers': ['warn', {
    modifiers: ['very', 'really', 'clearly', 'obviously'],
  }],
}

Example config

import { defineConfig } from '@faircopy/config'
import { astro } from '@faircopy/astro'

export default defineConfig({
  files: ['src/**/*.astro'],
  adapters: [astro()],
  rulesets: ['@faircopy/rules-nlp'],
  rules: {
    'no-em-dash': 'error',
    'no-weasel-words': 'error',
    'no-rhetorical-scaffolding': 'error',
    'no-filter-words': 'error',
    'no-empty-transformation-claims': 'warn',
    'no-passive-voice': 'warn',
    'no-weak-modals': 'warn',
    'no-stacked-adjectives': 'warn',
    'no-nominalized-phrases': 'warn',
    'no-expletive-openers': 'warn',
    'no-redundant-pairs': 'warn',
    'no-pronoun-led-claims': 'warn',
    'no-buzzword-stacks': 'warn',
    'no-hedge-words': 'warn',
    'no-vague-quantifiers': 'warn',
    'no-meaningless-modifiers': 'warn',
  },
})