| name | text-eval |
| description | Evaluate text for AI-generated signatures (AI tells) — em-dash overuse, rhetorical colons, pipeline artifacts, hedging cadence, sycophancy leakage — before it ships. Use when reviewing, scrubbing, or finishing written/communication output. Commands: scan (mechanical), evaluate (judgment-class), scrub (bounded fix loop). |
Text Evaluator
Detects AI-generated-text signatures so drafts read as written by a person, not a
model. Two-pass design: an uncapped mechanical character scan runs first on every
invocation, then a context-isolated reasoning evaluator handles the judgment-class
tiers. Severity/cluster/voice policy is canonical in skill-builder's
references/creative-integrity.md; this skill carries detection + workflow only.
Commands
| Command | Action |
|---|
/text-eval scan [path] | Mechanical character/punctuation pass only (em-/en-dash, rhetorical colons, invisible Unicode). Always emits the Verification Preamble. |
/text-eval evaluate [path] | Full evaluation: mechanical scan FIRST, then judgment-class tiers via the reasoning evaluator. |
/text-eval scrub [path] | Bounded fix loop (Nine Scrub Principles) — see references/finishing-chain.md. |
Directives
Invocation contract (closes the single-generic-agent bypass)
- The mechanical character-scanner runs FIRST, on every invocation. Any
evaluation — single-agent, multi-agent, scrub-loop, or improvised — whose output
lacks the character-scan Verification Preamble is invalid and discarded.
- A "context-isolated single evaluator" is NEVER an exemption from the mechanical
pass. Never run the reasoning evaluator alone without the character-scanner.
[hard] rows in references/text-tells.md (em-dash overuse, rhetorical colons,
pipeline artifacts, invisible Unicode) block by default and are immune to
voice-protection / cluster-density / human-presence demotion. The mechanical
scanner has no vocabulary for "house style" — it reports every occurrence.
- Judgment-class tiers cluster: 1 signal → CONSIDER, 2 → SHOULD FIX, 3+ → MUST FIX
(dedupe by mechanism). Absent a documented voice profile, voice-dependent
judgments are advisory-only.
Workflow
Model-Lane Preflight
CHECKPOINT — Model-Lane Preflight Gate (slim, advisory-only; fires at the TOP of this skill's workflow, before any generative step):
- SKIP silently IF ANY of:
/route dispatched this invocation after running its own lane preflight (a lane advisory OR ask already printed, route otherwise ASSESSED the lane this turn, or it was deliberately suppressed — route's coverage extends to the whole endeavor whether route asked, matched, or the user declined, including skills this one chains); this skill's frontmatter sets model-lane-gate: off; the session is headless / non-interactive; this gate is executing inside a subagent (a subagent is already model-pinned via its own frontmatter); OR an advisory for this LANE already printed this endeavor AND the active model is unchanged (advise at most once per (lane, active-model) pair per endeavor).
- Resolve this skill's lane (own
lane: frontmatter → the Skill→Lane table in .claude/skills/skill-builder/references/model-lanes.md → NO LANE) and the lane's Preferred Model. IF no lane resolves OR the preferred-model cell is empty → silent no-op (correctly absent, not a gap). IF this skill declares per-function lanes AND the invocation's resolved mode has its own row → that function's lane governs; otherwise the skill-level lane covers all modes.
- Read ACTIVE_MODEL from the session system-context line "The exact model ID is …" (strip
[1m]/[200k], lowercase — model-lanes.md § Active-Model Detection; never an env var or Bash probe). IF the Preferred Model is malformed or names a clearly superseded family → emit the one-line stale-mapping advisory and proceed; never advise from a stale mapping, never validate against a hardcoded list.
- Compare. Match → silent no-op. Mismatch → print ONE advisory line and PROCEED: "Lane advisory: this skill declares the
<lane> lane (preferred <preferred>); the active model is <active> — to align, run /model <preferred> and re-invoke; proceeding as-is." Naming the command is INFORMATIONAL (named-command advisory directive, 2026-06-11): NEVER an AskUserQuestion, never a blocking wait (No-Switch-Prompt directive, 2026-06-06). A skill can NEVER switch the session model and never asks the user to.
- Primary-lane scope. This gate fires ONCE per invocation, for the resolved PRIMARY lane. Cross-lane mid-workflow steps never re-advise — they delegate via this skill's LANE-AGENT-EMBED Delegation Map when present (see .claude/skills/skill-builder/references/lane-delegation.md). Delegation is never a substitute for THIS gate: creative primary work runs on the creative main model — never an analytical main session orchestrating creative-pinned agents to dodge the lane.
- Mechanical scan (always first). Spawn the
character-scanner agent (or run the
grep pass inline) over the target. It emits a Verification Preamble with per-character
counts and flags every —/– and rhetorical colon. No severity reasoning, no demotion.
- Reasoning evaluation. Spawn the
tell-evaluator agent in a clean context for the
judgment-class tiers, grounded on references/text-tells.md. It returns tiered findings.
- Combine + report. Merge the mechanical preamble (authoritative on
[hard] character
tells) with the reasoning tiers. Present, do not silently rewrite.
- Scrub (on request only). Run the bounded loop in
references/finishing-chain.md:
auto-fix MUST FIX + hard-directive flags only; snapshot → one atomic fix pass →
whole-document echo re-scan → re-validate → divergence abort to best-so-far →
humanity floor (advisory-only without a voice profile) → cycle cap 2.
Grounding
- references/text-tells.md — the portable AI-text-signature catalog (seed + gap-sync baseline)
- references/finishing-chain.md — the bounded scrub loop (Nine Scrub Principles)
- Policy (severity, cluster density, voice protection, scrub spec) is canonical in
.claude/skills/skill-builder/references/creative-integrity.md.