Methodology
How Étincel works
Every claim on this site traces back to code you can read. This page walks through the method: how a voice gets measured and composed, how the audit scores a piece, and what happens when you connect it. No trade secrets, no hidden model call deciding what counts as a tell.
green This page scored 0/100 on its own audit, the same one described below.
Two systems, one rule
Étincel is two separate systems joined by one rule: nothing happens without a reason you can inspect.train_style and get_style_guide build and read a voice. audit_text scores a draft against a corpus of known AI-writing patterns. Neither one calls a model. Both are plain functions over text, so the same input always produces the same output, and every finding traces back to a specific rule, not a judgment call made on the fly.
How a voice gets built
Measuring mechanics
Training starts with real writing samples, not a description of your style. Each sample gets measured for eight mechanical traits: average sentence length and how much it varies, paragraph length variance, contraction rate, em-dash and semicolon use per thousand words, sentence-fragment rate, question rate, and structural entropy, how much sentence openers and punctuation vary, a proxy for a real draft's shape against a templated one. Train again with more samples and the new measurements fold into the existing ones, weighted by word count, so a voice sharpens instead of resetting.
Inferring persona, not just mechanics
A trained voice also carries three persona dials: formality, warmth, and directness, each on a 0-10 scale. The first time you train a voice, Étincel infers a starting point for these from the samples themselves: formality from contraction rate and average word length, directness from sentence length and fragment rate, warmth from how often the writing addresses the reader directly, ‘you,’ ‘we.’ Adjust any of the three later and the guide recomposes around the new values.
Capturing lexicon, not just rhythm
Rhythm alone doesn't sound like a specific person; word choice does. Étincel tracks the words and two-word phrases a voice reaches for more than a general baseline would predict, scored by lift, observed rate divided by an expected rate, not raw frequency. A phrase that repeats because it's the topic of the moment, ‘next week,’ ‘the budget,’ doesn't drown out a phrase that repeats because it's how this person talks.
Composing the guide
get_style_guide doesn't return a data dump. It composes plain drafting instructions: a paragraph on persona, warm and personable, address the reader directly, a paragraph on mechanics, sentences run long on average, keep that variance, and the distinctive phrasing captured above. A preset works the same way, hand-written instead of measured, so a trained voice and a preset read the same way to the model drafting from them.
Checking a draft against it
check_voice_match re-measures a draft and compares it dial by dial against the voice's baseline. The verdict is driven by whichever is worse: the average drift across all dials, or the single largest outlier. One dial badly off, zero contractions from a voice that always contracts, can't get averaged away into a passing score by seven dials that are fine.
Catching self-repetition
Separately, check_self_repetition compares a new draft against a voice's own last twenty training samples for two things: opening the same way, and reusing a characteristic phrase. Both need to clear a real threshold, a pattern shared across several recent pieces, not one coincidence, before they're worth mentioning. Only the local install tracks this history today.
How the audit works
The corpus
audit_text runs three kinds of checks against a piece of text: hard-ban vocabulary, words that read as AI-written on sight, weighted heavily, soft-flag vocabulary, context-dependent phrases that only count once they show up more than once, and structural patterns, regular expressions that catch shapes rather than words: a triple negative in a row, a bolded-term bullet, a formulaic essay opener, chatbot boilerplate that leaked into the text. Two whole-piece checks look at rhythm across the entire draft: paragraph-length uniformity and sentence-length burstiness.
Scoring, calibrated to length
Every match adds weighted strength to a running total, then that total gets converted to a density, strength per thousand words, and passed through a curve that saturates rather than climbing forever, so a document isn't penalized without bound for being long. The density calculation also smooths for short pieces: without it, a single flagged word in a three-paragraph email would score the same as ten flagged words in a long report, purely because the email has fewer words to divide by. The result lands in one of four tiers: green, yellow, orange, red.
Register
Some structural patterns are correct in one kind of writing and a tell in another. A Markdown heading is normal in a README and out of place in an email. Passing a register, docs, email, blog, memo, essay, social, tells the audit which patterns to suppress; the command-line tool defaults any .md file to the docs register on its own.
Strengths, the other side of the ledger
Every finding from the checks above is a deduction, which only pushes toward blandness if that's the only signal in the room. audit_text also reports a strengths block: specificity density, proper-noun-like words and numbers per thousand words, a concrete-to-abstract ratio, specific detail against abstract nominalizations, words ending in -tion, -ment, -ity, and sentence-rhythm variation. A piece with a real strength and one minor flag is a case for leaving it alone, not a case for a bigger rewrite.
Your own dictionary
Beyond the built-in corpus, you can maintain banned and always-allowed word lists, scoped globally or to a single style, and, for the CLI or a local install, in a .etincelrc file committed to a repo instead of an account setting: reviewable in code review, versioned, not gone when someone leaves the team.
How it reaches you
The same audit and the same trained voices are available in three places, and all three call the same underlying functions. The audit doesn't change depending on where it runs.
Any MCP client
Claude Code, Claude Desktop, Cursor, ChatGPT, or any other MCP client reaches for seventeen tools directly inside the conversation.
The command line
npx etincel-nonfiction lint 'docs/**/*.md' scans a repo and exits non-zero above a threshold you set.
CI
A GitHub Action wraps the same check for every pull request, so prose gets reviewed the way code does.
What it won't do
Étincel never rewrites text on its own. Every tool returns findings, a verdict, or a guide: information for the model or the person doing the drafting to act on, not a finished replacement. That's a limit by design, not a missing feature. A tool that quietly rewrites your words is a tool you stop trusting the first time it gets something wrong.
green 0/100