john mark lowry
§ ai tools · 2026

proofing guardrail

AI-assisted editorial QA where every model suggestion passes a meaning-drift gate before a human sees it.

team one internal tool, deployed in production on the agency's internal aws/eks platform. rule packs and brand specifics sanitized.

01 · the moment

Editorial and proofing errors slip through before delivery, and the obvious fix is worse than the problem: pure-LLM “fix my copy” tools quietly change meaning while fixing grammar. In client work, a tool that silently rewrites a legal disclaimer is not a productivity gain — it's a liability with a chat interface.

02 · the reframe

The risk isn't missing typos — it's an AI altering intent. So the gate, not the suggestion, is the product: every model suggestion must prove it didn't drift the meaning before a human ever sees it, and every decision the system makes must be traceable afterward.

03 · the routes

Deterministic first, semantic second. Mode A runs without any LLM: linting engines, custom rules, glossary enforcement, and exact-match disclaimer checking. Mode B — LLM critique for fuzzy disclaimer matching, recurring feedback patterns, and brand voice — sees only the rules Mode A could not resolve, and may only flag issues that cite an active rule. No freelancing.

The meaning-drift gate is mostly deterministic too. Every Mode B suggestion is checked on token-level diff size, contiguous-word-run limits, and protected-entity preservation, with an optional semantic-similarity check — and lands as pass, review, or reject, with reasons recorded. Suggestions are minimal-span edits by design; anything that might alter meaning gets routed to a human.

Rules resolve through a hierarchy. Seven layers — legal and compliance at the top, down through global, agency, brand, product, campaign, and the individual deliverable — compile into one effective rule set per document, so a brand exception legitimately overrides an agency default and the system can say exactly which rule fired and from which layer.

04 · the architecture

Documents parse into anchored spans; the rule hierarchy compiles; Mode A resolves the mechanical; Mode B critiques the semantic through a server-side model gateway (provider SDKs and keys never reach the browser — CI fails the build if one appears in the bundle); the drift gate filters; humans review issue by issue — accept, reject, edit, or escalate; exports ship with an audit receipt. Provider call logs, rule hits, review actions, and drift checks are all first-class records.

Decision flow: document through deterministic Mode A, unresolved rules to LLM Mode B, every suggestion through the meaning-drift gate to the human review queue, export with audit receipt
the gate sequence — rejected suggestions never reach a human
05 · the outcome

Live in production with an 800+ test suite passing, and the accuracy bar written into the spec as hard gates: zero auto-applied edits, semantic drift under 1% among accepted suggestions, and 100% of issues anchored to the source and cited to a rule. The working estimate — stated as the spec's estimate, not a measured result — is 20–35% proofing time saved from the deterministic pass alone, pushing toward 35–50% with the gated semantic pass.

06 · the rebuild — a trust engine around the wrong problem

Six weeks in production taught the uncomfortable thing: v1 was a well-built trust engine around an unvalidated problem. Code grade B — ~2,400 test assertions, ~14.6k lines, 24 tables, 57 endpoints — and the job wasn't general editorial QA. The job, as the proofers actually do it, is disclaimer and spec compliance on copydecks: is the legally required disclaimer present and exact, does the spec match the model year, did a net-new year introduce a fact the reference data doesn't know yet. The decision was rebuild, not retrofit — the code is fine; it just solves a different product.

Two products on one engine: a proofer tool and a self-serve portal (disclaimers hard-off in self-serve). A change taxonomy with each category mapped to a source of truth. Three lanes in order — deterministic checks (linting, spelling, a confusion-pair layer for their/they're) → reference joins (the disclaimer catalog via the vehicle API, live model-year data, a spec-deck parse for net-new years, with the written “self-authoring caveat” that our own published data is not an oracle) → an optional guardrailed model pass. “The server never mutates a source document” is an output-invariant test; an acceptance-criteria-to-test traceability matrix has a CI drift guard; output is a tracked- changes document. Eleven work packages, each assigned to an agent against its criteria; thirty-six commits in two weeks; live in August. And the same platform lesson the fleet kept finding: PDF uploads hit the ~60-second ingress cap and returned 502 — moved to a background pipeline with the language server in parallel.

Trust in AI tools is an architecture decision. Deterministic rules first, semantic critique second, a drift gate between the model and the human — and no silent edits, ever.

the insight
ran onPython + FastAPI · Vale + LanguageTool · LLM gateway (server-side) · React

← all work