Skip to content

Configuration

slopscore reads configuration from a slopscore.toml file or a [tool.slopscore] section in pyproject.toml. Precedence (highest first): CLI flags → slopscore.toml → pyproject.toml [tool.slopscore] → built-in defaults. Show the effective config with slopscore-lint config.

# slopscore.toml  (or under [tool.slopscore] in pyproject.toml)
profile = "blog"            # blog | essay | academic | marketing | technical | social
strictness = "conservative" # conservative | balanced | sensitive
scorer = "rules"            # rules (default) | ml
min_reliable_words = 300
suggest = false             # include opt-in rewrite suggestions
broad = false               # include the opt-in broad rule tier (higher false-positive rate)

# CI gate. Either condition exits 1. Abstained documents (under 100 words, non-English) never
# fail on score, because their number is not a confident label.
fail_on = "none"            # none | low | medium | high: any rule hit at this severity fails
score_threshold = 50        # any non-abstained document at or above this score fails

# Batch walker filters (directory and multi-file scans). `exclude` REPLACES the defaults
# (node_modules, .venv, venv, .git, vendor, dist, build, __pycache__, .tox, .mypy_cache,
# .ruff_cache, site); patterns are root-relative globs or bare directory names.
include = ["docs/*", "*.md"]
exclude = ["node_modules", "build", "*.generated.md"]

# Turn a whole dimension off (it then scores 0 and emits no findings):
disabled_dimensions = ["formatting_tells"]

# Turn individual rules off, or override their severity:
disabled_rules = ["FORMULAIC_IN_CONCLUSION"]
rule_severity = { "COPULA_SERVES_AS" = "low" }

CLI flags (--profile, --strictness, --scorer, --suggest, --broad, --fail-on, --fail-on-score, --include, --exclude) override the file. Use --config PATH to point at an explicit file.

Reading the score breakdown

Every JSON report carries a breakdown: one row per dimension with its value, weight, profile multiplier, corroboration gate, and the logit it contributed, plus a statistical flag on the four span-less dimensions (genericity, cadence, redundancy, human signals) and their summed statistical_logit. Those four dimensions also emit low-severity summary evidence (GENERIC_SENTENCE, CADENCE_UNIFORM_RUN, REDUNDANT_ADJACENT_PAIR) pointing at the passage that drove them. Summaries explain the score; they are not rule hits, so they never trip --fail-on, never enter SARIF, and never count as new findings against a baseline.

--broad enables an opt-in tier of higher-false-positive rules (rationalist/essayist jargon in insight_signaling; bare quantifiers, hedges, and intensifiers in weasel_attribution; bare sincerity adverbs such as "genuinely" and "honestly" in performative_candor; bare code glosses such as "that is to say" and clause-initial "Overall," in metadiscourse). It is off by default because those bare words also appear in ordinary and non-native English; treat it as a self-editing highlighter, not an accusation.