Skip to content

string-audit v0.3.0 — copy-hygiene suite + data-driven AI-tells

Choose a tag to compare

@bdelanghe bdelanghe released this 23 Jun 03:09
Immutable release. Only release title and notes can be modified.
6caa3ba

string-audit v0.3.0 — copy-hygiene suite + data-driven AI-tells

Adds a deterministic copy-hygiene layer to the auditor — the cold-read editorial
rules, run on every symbol, free and offline — and makes severity first-class.

New prose checks (zero-API, uncached, every symbol)

  • ai-isms — formulaic machine-written tells: it isn't X — it's Y antithesis,
    the easy part … the hard part, rule-of-three triads + gerund tricolons, em-dash
    cadence, rhetorical teaser fragments, chatbot artifacts/placeholders, and buzzword
    filler. Patterns + lexicon are data in ai-tells.json (seeded from the
    vale-signs-of-ai-writing corpus), so they track upstream instead of living in code.
  • overclaims — absolute, unprovable language bound to a coverage term (every privileged effect, always enforced); the prose analogue of the grounding check.
  • proofread — mechanical slips spell/grammar miss: doubled words, stray/missing
    spaces, space-before-punctuation, repeated punctuation, mixed straight + curly quotes.
  • readability — over-long sentences and (for body/meta) dense prose by Flesch
    reading-ease — a proxy for "why am I reading this?".

First-class severity

Every finding now carries { level, msg }error ✗ (correctness/honesty) ·
warn ⚠ (ai-ism/proofread) · suggestion ·. audit.mjs renders the glyph from
level (à la Vale severities). The keyed Anthropic auditor is told the same rules.

Quality

  • spellCheck no longer flags English contractions (isn't, we're) as misspellings.

Prior art (issue #6)

Vale + vale-signs-of-ai-writing cover AI-tell linting at scale; our lexicon is seeded
from it. spikes/ holds the data-driven port (now promoted) and an optional vale
shell-out provider. The differentiator stays: typed-symbol catalog, content-hash cache,
and grounding/overclaim checking.

Changelog: #5 · #7 · #8 · #9