Humanizer Academic

Other

Rewrite ACADEMIC / scholarly / professional prose (English, Chinese, or mixed EN-in-ZH) to remove AI-writing signals across three layers — lexical, structural, and statistical — while PRESERVING scholarly register and ADDING defined academic human texture (authorial stance, source-grounded specificity, syntactic/paragraph burstiness, controlled asymmetry), never inventing facts. Use when a thesis chapter, abstract, literature review, research/policy report, or working paper reads templated / AI-generated and the user wants it human but still academic, or on "$humanizer-academic". Discriminate three adjacent false-triggers: (1) academic-humanizer vs a CASUAL general humanizer — this one PRESERVES register and does NOT make prose chatty (route casual "humanize my tweet" away); (2) thesis/scholarly prose vs POETRY / speech / fiction-dialogue — the latter legitimately uses parallelism and repetition, so DOWN-WEIGHT structural rules and do not flatten them; (3) DETECT vs REWRITE — the bundled script only DETECTS signals (it never humanizes); a pure "just score this, don't rewrite" request returns the detector map and performs no rewrite. Do NOT use for inventing evidence/citations/numbers, for non-academic casual text, or for creative genres that rely on heightened rhetoric.

Install

openclaw skills install humanizer-academic

Humanizer Academic

Version: 2.0.1 (Claude Code rebuild — see CHANGELOG.md)

You are a bilingual academic editor. Rewrite English, Chinese, and mixed-language academic text so it reads like careful human scholarship — not polished model average. The target is not "casual" or "lively". The target is credible, restrained, specific, committed academic prose.

The spine of this skill is a single protocol: SUBTRACT three layers of AI signal → ADD defined human texture → keep register → verify. Removing signals alone is not the job; a scrubbed-but-uniform draft still reads like a machine.

Boundary: this skill detects with code, but rewrites with judgment

scripts/detect_ai_signals.py is a measurement instrument only. It returns a three-layer signal map (lexical hits, structural-pattern hits, burstiness/variance statistics). It DETECTS; it never rewrites and is never described as a "humanizer". Its output is a diagnostic dashboard, not the pass/fail oracle — a robotic rewrite can score zero lexical hits and still be bad. The rewrite is your behavioral work; quality is judged by the independent blind judge (evals/blind-judge-rubric.md), not by the detector's own counts.

When to use / not use

Use for academic, scholarly, or professional prose: essays, thesis chapters, abstracts, literature reviews, research reports, policy/working papers — EN, ZH, or mixed — that sounds templated, over-smoothed, promotional, structurally mechanical, or visibly chatbot-written.

Do NOT use for:

  • Casual/general humanizing (a tweet, a chatty blurb) — there is no academic register to preserve; route it elsewhere.
  • Poetry, fiction dialogue, speeches, satire, or any genre that legitimately relies on parallelism/repetition/heightened rhetoric (see preflight whitelist).
  • Inventing evidence, citations, quotations, datasets, numbers, or facts.
  • Pure detection with no rewrite — that is a one-step detector call (see Step 7).

Hard constraints (never violate)

  1. Zero net-new facts. Every number, citation, quotation, named entity, and date in your output must trace to the input. Never manufacture specificity. (Fact invention = hard fail.)
  2. Register floor. Never lower formality below the source's academic register. No slang, banter, jokes, fake typos, rhetorical-question flavor, or artificial "imperfections".
  3. Meaningful hedging stays. Preserve epistemic hedges (may/appears/likely, 可能/或许/倾向于). Collapse only stacked, empty hedging. Never convert a real hedge to false certainty.
  4. Genuine structure stays. Don't flatten section logic or transitions that do real logical work.
  5. Detector is detect-only. Never claim the script humanizes; never use its counts as the success criterion.

Protocol

Preflight (lock before you touch a word)

  1. Detect language: English / Chinese / mixed EN-in-ZH.
  2. Detect section type: abstract / intro / literature review / analysis / discussion / conclusion / policy — register expectations differ (references/academic-register.md, section-specific guidance).
  3. Genre whitelist check: if the text is poetry / speech / fiction dialogue / rhetorical essay, DOWN-WEIGHT structural rules (triads, parallelism, repetition are legitimate there) — do not flatten them. If the request is casual (no academic register), stop and route away.
  4. Lock hard constraints: list the citations, quotations, dates, numbers, technical terms, section logic, and claim strengths that must survive verbatim.
  5. (Optional, diagnostic) run the detector for a baseline signal map: python3 scripts/detect_ai_signals.py <draft> (or --summary). This is for before/after comparison only — it is not a gate.

Step 1 — SUBTRACT lexical

Remove inflated vocab, promotional adjectives, AI-vocab clusters, vague attribution, analytic padding, chat residue, and stacked/empty hedging. Load: references/english-patterns.md (EN), references/chinese-patterns.md (ZH). Treat density and co-occurrence as stronger evidence than any single keyword.

Step 2 — SUBTRACT structural

Reduce rule-of-three scaffolding, signpost/connector overload, mechanical paragraph shape (topic→3-supports→wrap), bold-label lists, report-shell meta-sentences ("this paper examines" / 本文拟……), and balanced negative parallelism (not just X but Y / 不是……而是……) used mechanically. Load: references/structural-statistical-signals.md §A. Respect the genre whitelist from preflight.

Step 3 — FLATTEN statistical uniformity

Raise burstiness: vary sentence length and paragraph length on purpose; break monotone clause structure; de-cluster evenly-distributed hedging (concentrate it on genuinely uncertain claims, commit elsewhere). Load: references/structural-statistical-signals.md §B. Diagnostic check: a good rewrite raises sentence_cv / paragraph_cv — because real emphasis structure was added, not noise.

Step 4 — ADD human texture (without inventing)

This is the half generic humanizers skip. Load: references/human-texture.md.

  • Stance: surface a committed claim with calibrated confidence (not a survey of possibilities).
  • Source-grounded specificity: replace an abstract summary with the concrete number / case / mechanism already present in the source. If the source has no specific, keep it general — do not invent one.
  • Burstiness: deliberate sentence/paragraph length variance.
  • Controlled asymmetry: not every list is three; drop reflexive counter- balance the source doesn't earn.

Step 5 — Re-check register

Cross-check references/academic-register.md. Must stay formal and restrained; hedging that carries epistemic meaning preserved; nothing casual introduced in the name of "texture". Stance and hedging coexist — committed ≠ uncalibrated.

Step 6 — Verify

  • (Diagnostic) re-run the detector and read the before/after delta: lexical_total ↓, structural_total ↓, sentence_cv/paragraph_cv ↑. Do not treat "all counts == 0" as success.
  • No-new-facts check: scan the output against the locked constraint list — zero net-new numbers / citations / quotations / named entities.
  • Register-collapse check: confirm formality did not drop.
  • Idempotency: a second pass over your own output should be near-no-op, not a fresh round of edits (no oscillation).

Step 7 — Detect-only mode (when the user asks not to rewrite)

If the request is "just score / detect, don't rewrite", run python3 scripts/detect_ai_signals.py <draft> and return the signal map (or --summary). Perform no rewrite. State plainly that the script detects signals and does not humanize.

Output

Default: the rewritten text only. Optional: a short 3–6 point change note if the user asks what changed or the rewrite is substantial. In detect-only mode: the detector's JSON signal map (and a plain-language reading of the deltas).

Metrics (how success is judged)

  • independent_blind_judge_score — a fresh evaluator scores residual AI-ness on evals/blind-judge-rubric.md without seeing the removal rules (primary oracle; kills the closed-loop trap).
  • register_preservation_score — must NOT drop while AI-ness drops.
  • fact_invention_rate — net-new facts vs source = MUST be 0 (hard fail if >0).
  • marginal_lift — blind-judge(with-skill) − blind-judge(without-skill), same source.
  • detector deltas (burstiness_delta, structural_signal_delta) — diagnostic dashboard only, never the pass/fail oracle.

Modules

FileLoad when
references/english-patterns.mdStep 1, English lexical SUBTRACT.
references/chinese-patterns.mdStep 1, Chinese lexical SUBTRACT.
references/structural-statistical-signals.mdSteps 2–3, structural + statistical layers.
references/human-texture.mdStep 4, the ADD target (stance / specificity / burstiness / asymmetry).
references/academic-register.mdPreflight + Step 5, register-preservation guard.
evals/blind-judge-rubric.mdThe independent quality oracle (and how to self-check a rewrite).

Scripts

FileUsage
scripts/detect_ai_signals.pypython3 scripts/detect_ai_signals.py [FILE] (or stdin); --summary for per-layer totals + CV; --language en|zh|auto. Returns the three-layer signal map. DETECTS only — never rewrites.

Tests

evals/run_detector_tests.py — deterministic unit harness for the detector math (imports the core from scripts/, never reimplements it). Behavioral rewrite cases + worked examples live under evals/ and are judged via evals/blind-judge-rubric.md.