`human-writing`: The Repo That Turns AI Prose Into a Writing System
A deep dive into the Skill that fights AI flavor with material checks, rhetorical rules, and a Python linter for sentence rhythm.
- `human-writing` treats AI prose as a systems problem, so it governs input, structure, and revision instead of just swapping words.
- Its sharpest rule is simple: if there is not enough material, the model should refuse to pad the text.
- The project moves beyond keyword blacklists by banning rhetorical behaviors like fake reversals and empty balancing.
- A small Python linter extends the idea into rhythm checks, which makes prose feel less machine-regular and more sentence-by-sentence human.
Most AI writing tools start with fluency and hope the result passes. `human-writing` starts with the opposite assumption: prose can sound smooth and still be empty. So the repo builds a gate around the whole act of writing, from material intake to revision checks, and treats “human-sounding Chinese” as an engineering problem.
That is why the project feels more like a writing constitution than a prompt pack. It does not merely say what to write. It decides whether there is enough substance to write at all, what kinds of rhetorical moves are allowed, and how the output should be inspected before it goes out the door.
Why AI-Flavored Chinese Feels Wrong
The repo targets a familiar failure mode in Chinese LLM output: sentences that are too even, transitions that feel prepackaged, and paragraphs that keep balancing one half against another without adding anything new. The writing is technically coherent, but it feels translated, over-smoothed, and strangely airless.
| Signal | AI-flavored prose | Human-flavored prose |
|---|---|---|
| Rhythm | Sentences arrive with near-identical length and cadence. | Sentence length shifts naturally with the thought. |
| Structure | Each paragraph leans on tidy reversals and balanced formulas. | The prose can wander, compress, or break pattern when the point demands it. |
| Substance | Padding fills space when the material runs thin. | The text refuses to stretch beyond what the source material can support. |
| Tone | Corporate, translated, and over-explained. | Specific, situated, and willing to sound slightly irregular. |
In other words, `human-writing` is not trying to make AI sound like a polished brochure. It is trying to make it sound like someone with a point of view, a memory, and a reason to choose one sentence shape over another.
让模型写出来的文章读起来像一个具体的人在说话——知道一些事,有判断,偶尔岔开一句,还能接回来。
The Gatekeeper: Material Before Fluency
The core rule in `SKILL.md` is a material check. Before the model expands a draft, it has to answer a basic question: is there enough factual or narrative material to justify the length? If the answer is no, the system should not pad. It should ask for more input, more research, or a narrower scope.
Material check
├── enough facts or scene detail?
│ ├── yes → draft
│ └── no → ask for more material
└── enough provenance for claims?
├── yes → continue
└── no → separate reality from invention
That rule is the sharpest part of the project. It turns filler from a style problem into a permission problem. The model is not invited to hallucinate its way toward length.
How the Repo Is Organized Like a Writing Stack
The repository is modular in a way that mirrors the job it wants the model to do. `SKILL.md` acts like the kernel. The `references/` directory holds genre rules, `scripts/` contains the linter, `dist/` provides a lighter version for direct use, and `agents/` handles integration for agent workflows.
That structure matters because the project is not only teaching language. It is separating responsibilities. One layer decides what counts as acceptable material, another layer governs genre and provenance, and another layer audits the final rhythm.
The Real Innovation: Banning Rhetorical Moves
The project’s best idea is not that it bans a few bad phrases. It is that it starts banning rhetorical actions. That matters because AI prose often does not fail at vocabulary. It fails at posture. It sets up fake opposition, performs tidy reversals, and creates a sense of depth without adding evidence.
The quoted changelog line makes that explicit: version 1.1 moves the defense from the surface to the move itself. In practice, that means the system is less interested in detecting whether a sentence says “not A, but B” than in catching the deeper habit of manufacturing a false problem just to stage a neat solution.
1.1 把防线从字面挪到动作:禁的是「先给读者立一个他没有的误解,再推翻它」这件事本身,不管穿什么外衣。
That shift is what makes the repo feel unusually mature. It is not playing whack-a-mole with surface patterns. It is trying to outlaw a class of rhetorical shortcuts.
The linter closes the loop
`scripts/check_prose.py` makes the philosophy measurable. The script looks for forbidden patterns, but it also looks for rhythm. Repeated sentence lengths are a warning sign because machine prose often settles into a steady, over-controlled cadence.
| What the linter catches | What it cannot catch |
|---|---|
| Obvious forbidden structures and repeated phrasing. | Genuine insight delivered in a clunky sentence. |
| Over-regular sentence lengths. | A clever paragraph that still feels lifeless. |
| Lazy reversal moves and pattern-heavy prose. | A smart writer who intentionally uses repetition well. |
| Mechanical pacing that resembles output from a template. | The full social context that tells a reader why prose feels sincere. |
That limitation is not a flaw. It is the point. A linter can surface risk, but it cannot replace editorial judgment. `human-writing` respects that boundary even as it tries to automate as much of the check as possible.
Where It Stands Among Other Writing Tools
The easiest comparison is with tools that chase detector bypasses or swap one voice for another. Those products often optimize for camouflage. `human-writing` optimizes for method. It asks how the draft is built, not how to make a finished paragraph look less synthetic.
| Approach | Goal | Method | Weakness | How `human-writing` differs |
|---|---|---|---|---|
| Keyword blacklist | Remove obvious AI markers | Ban specific words or phrases | Easy to evade and too shallow | Bans rhetorical behaviors, not just strings |
| Humanizer tools | Make output pass as human | Rewrite for surface plausibility | Can preserve fluff and emptiness | Refuses padding when material is thin |
| Voice-prompt packs | Imitate a style or personality | Prompt for tonal mimicry | Often ignores structure and evidence | Treats writing as a workflow with gates and checks |
| `human-writing` | Produce grounded, human-feeling prose | Material gating, genre rules, revision, linting | More rigid than generic tools | Methodology-first, not detector-first |
That is why the repo stands out. It is not trying to win a stealth game against classifiers. It is trying to codify editorial discipline.
The bigger implication is simple: writing quality can be operationalized. Not perfectly, not universally, but enough to make a real difference in whether a draft feels alive or merely finished.
What This Repo Says About the Future of Writing
`human-writing` suggests a future where good prose is less about taste alone and more about enforceable constraints. Material has to justify length. Genre has to define what counts as evidence. Rhythm has to vary enough to feel spoken. That is a narrow definition of writing, but it is a useful one.
The project does not claim to make AI writing indistinguishable from human writing. It aims lower and sharper than that: make the model stop reaching for empty polish, and make it earn every paragraph it produces.