Community写作与编辑github.com

an2n/ghostwriter

Writes text in your own voice instead of generic AI prose, with a check and polish pass built in. Works with Claude Code, Codex CLI, and any agent that reads skills off the filesystem.

ghostwriter 是什么?

ghostwriter is a Claude Code agent skill that writes text in your own voice instead of generic AI prose, with a check and polish pass built in. Works with Claude Code, Codex CLI, and any agent that reads skills off the filesystem.

兼容平台Claude CodeCodex CLI~Cursor
npx skills add an2n/ghostwriter

Installed? Explore more 写作与编辑 skills: steipete/notion, affaan-m/seo, affaan-m/brand-voice · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Check

Reads a piece of text and reports how strongly it reads as AI-written, with a concrete list of what fired and why. This is a find-only skill - it never rewrites anything. See polish for the fix side.

How the scoring works

Every check below is a tell: something that either fires or doesn't. Each tell carries a fixed weight - 1 (weak), 2 (moderate), or 3 (strong) - based on how reliable it is as evidence on its own. Add up the weights of everything that fires, then divide by the text's length in hundreds of words to get a tell density: points per 100 words. A 2,000-word article and a 40-word reply shouldn't be judged on the same raw total, so density normalizes for length. For anything under 100 words - the common case for a single post or reply - skip the division and use the raw total directly against the same bands, with confidence capped lower given the small sample.

Density (points per 100 words)Verdict
0 - 1Reads human
1 - 3Mostly human
3 - 6Mixed signals
6 - 10Reads AI
10+Heavily AI

A phrase can count toward at most two tells when it's genuinely diagnostic for both (e.g. "it is important to note that" is both stock vocabulary and reflexive hedging) - never double-count it twice within the same tell.

Cluster 1: Word choice

Vocabulary and phrase-level tells - wrong regardless of what sentence they sit in.

Stock AI vocabulary (weight 1 each, capped at 3 points total for this tell even if more fire): delve, leverage (verb), utilize, robust, comprehensive, streamline, foster/fostering, facilitate, pivotal, nuanced, notable/notably, enduring, garner, valuable, vibrant, intricate/intricacies, interplay, tapestry (abstract noun), testament (figurative), underscore (verb), showcase (verb), key (as a vague adjective), align with, emphasizing, enhance, quietly (as a hedge-flavored adverb), multifaceted, in the realm of, the landscape of (abstract noun), a myriad of, a plethora of, actually (as filler), additionally (as an opener), it is worth noting, it is important to note. Cite the exact word that fired.

Copula avoidance (weight 2): swapping "is/are/has" for something fancier - "serves as", "stands as", "marks", "represents", "boasts", "features", "offers". "The bakery serves as a neighborhood fixture" should just be "The bakery is a neighborhood fixture."

Inflated significance (weight 2): dressing an ordinary fact up as historically important - "stands as a testament to", "marks a pivotal moment", "indelible mark", "evolving landscape", "setting the stage for", "deeply rooted in", "a key turning point". "The shop opened in 2003, marking a pivotal moment in the block's retail history" should just be "The shop opened in 2003."

Brochure language (weight 2): ad copy leaking into plain prose - "nestled in the heart of", "boasts a rich heritage", "renowned for", "breathtaking", "must-visit", "stunning". Reads like a travel pamphlet regardless of the subject.

Elegant variation (weight 2): relabeling the same person or thing across sentences instead of reusing the name or a pronoun - "the founder... the entrepreneur... the visionary... the businessman" for one person across four sentences. A repetition-penalty sampling artifact; real writers reuse the noun or say "she"/"they."

Padding participles (weight 1): a plain fact given a trailing "-ing" clause that adds nothing - "...symbolizing its enduring connection to the community" tacked onto a sentence that already stated the fact. Remove the clause and check whether anything was actually lost.

Hyphenated-pair overuse (weight 1): "third-party", "cross-functional", "data-driven" hyphenated even after the noun, where grammar doesn't call for it ("the report is data-driven" should be "data driven").

Vague relation words (weight 1): "in connection with", "associated with", "connected to" standing in for a real preposition or verb ("of", "for", "by", "caused by") to avoid stating the actual relationship directly.

Cluster 2: Rhythm

How sentence length and softening language behave across the whole piece.

Flat sentence rhythm (weight 3): three or more consecutive sentences within 5 words of each other in length, or nothing under 8 words anywhere in a 150-word stretch, or a total absence of short fragments. Read it aloud - a steady pulse instead of natural variation is the tell. Report the actual word-count sequence as evidence (e.g. "14, 16, 13, 15, 17").

Reflexive hedging (weight 2): "often", "generally", "typically", "it can be argued", "it is worth mentioning" softening a claim that didn't need it, versus genuine uncertainty expressed personally ("I'm not sure this holds when..."). Diplomatic non-answers to obvious tradeoffs ("while X has benefits, it also presents challenges") count too.

Cluster 3: Shape

Document- and paragraph-architecture patterns imposed regardless of content.

Three-beat symmetry (weight 3): three items or beats with identical grammatical shape, split across sentences or comma-joined inside one ("fix the bug, write the tests, open the PR"). A perfectly symmetrical triplet is a tell either way - real writers vary the shape or use two items.

Suspiciously clean paragraph arcs (weight 2): every paragraph does exactly one job and lands cleanly, nothing left unresolved. Real writing has at least one paragraph that does two jobs or doesn't fully close.

Fake urgency arc in async messages (weight 2): for Slack/chat-style text - accomplishment, then caveat, then next-steps, mapped directly onto intro/body/conclusion. Real messages loop back, add an afterthought, or end somewhere the structure didn't set up.

Leading with the negative (weight 2): "The case for X isn't about Y, it's about Z" - naming what something isn't before saying what it is. Real writers lead with the actual point.

Formatting as substance (weight 2): bold mini-headings on every bullet, title-case section headers, decorative emoji on list items. Individually weak, but stacked together they signal a document assembled from a template rather than written.

Stock "challenges" section (weight 2): "Despite its [positive framing], X faces several challenges... Despite these challenges, X continues to..." - a rigid formula that restates vagueness instead of adding facts.

Heading that just repeats itself (weight 1): a heading followed by one line that only restates the heading ("## Performance" / "Speed matters.") before real content starts.

Fake range (weight 1): presenting two things as endpoints of a spectrum when they aren't one ("from the founding to the future, from the first customer to the thousandth").

Empty uplift ending (weight 2): closing on vague optimism instead of the last concrete fact ("the future looks bright, exciting times are ahead").

Left-in blanks (weight 3): a bracketed or parenthetical fill-in-the-blank nobody replaced - "[Company Name]", "(insert client testimonial here)". Near-certain on its own.

Documenting the old behavior (weight 1): comments or docs describing what something used to do instead of what it does now, outside an actual changelog or migration note.

Cluster 4: Voice and construction

Whether the piece sounds like it came from somewhere, plus the sentence-level rhetorical moves AI leans on hardest. These last ones are the toughest to catch - they read as good writing.

No personal trace (weight 2): no first person where it would be natural, no second person in instructional content, a uniformly polished tone with zero roughness or informality spikes, an opening that reads like a thesis instead of a scene.

Register collapse (weight 3): casual markers (lmk, ~60%) sitting on top of fully-formed, grammatically polished sentences. Real casual writing has fragments underneath the shorthand, not just shorthand sprinkled onto formal prose.

Sudden polish or dialect jump (weight 1): a noticeable jump in grammatical polish partway through, or an English-variety mismatch with the piece's own context (American idiom in a clearly British-context piece). Plenty of innocent explanations exist - weak alone, moderate stacked with other tells in the same section.

Scaffolding left in from a chat session (weight 3, fires as a strong tell even alone): "I hope this helps!", "Of course!", "Want me to expand on any section?", "Here is an overview of X" - a chatbot's greeting or offer that belongs to the conversational turn, not the document. Also covers older refusal residue ("As an AI language model, I can't directly...").

Literal chatbot markup or tracking artifacts (weight 3, fires as a strong tell even alone): raw technical residue from a chatbot's output, unresolved - :contentReference[oaicite:0]{index=0}, turn0search0/turn0image0, grok_card, [cite: 1], lenticular brackets (【...†...】), ppl-ai-file-upload, UTM params like utm_source=chatgpt.com or referrer=grok.com, or raw Markdown syntax (**bold**, # heading, ---) leaked into a format that isn't Markdown.

Disclaiming instead of answering (weight 2): "As of [date]", "specific details are limited in available sources," followed by a confident-sounding guess dressed as fact.

Praise before the answer (weight 2): "Great question! You're absolutely right that..." - agreeing with the reader before actually answering.

Staged honesty (weight 1): "Honestly?", "Look,", "Here's the thing," used as a standalone hook rather than mid-sentence, claiming candor before an ordinary point.

Curly punctuation (weight 1): typographic quotes/apostrophes where straight ones are the register norm. Weak alone, moderate stacked with anything else.

Mechanical connectors (weight 2): "Furthermore," "Moreover," "Additionally," as paragraph openers; "it is clear that"; "as previously mentioned"; more than one "however" per 200 words.

Manufactured reveal (weight 2): "Turns out the config had a different timeout" - a dramatic-discovery frame around a fact that didn't need one. State it directly instead.

Naming the pattern before showing it (weight 1): "The pattern is almost always the same," followed by the pattern. Just show it.

Announcement before the point (weight 1): "The rule I use:", "What I didn't expect was...", "Let's dive in" - signposting the reveal instead of making it, with or without the colon.

Fake depth (weight 1): "The real question is," "at its core," "fundamentally" - dressing an ordinary claim as a hidden truth.

Dash-wrap overuse (weight 2): more than one em dash per 300 words, especially the double-wrap ("X — like this — Y"). This fires identically when written with a plain or spaced hyphen instead of an em dash - swapping the character to satisfy a "no em dash" rule doesn't remove the construction, so check for the shape, not the glyph.

Semicolons joining independent clauses (weight 1): outside academic or legal register, basically always a tell.

Mid-clause colon (weight 1): "The problem: nobody tests this" - the colon interrupting an incomplete clause instead of following a full one.

Over-smooth paragraphs (weight 2): every sentence connects so cleanly to the next that nothing could be removed without the paragraph flowing better. Real writing has at least one sentence per paragraph that leaves a small gap if you pull it. Down-weight this in registers that genuinely reward tight coherence - legal briefs, abstracts.

Manufactured escalation (weight 2): three items with no conjunctions, each longer and heavier than the last, building emotional weight artificially.

Balanced opposite pairs (weight 2): "X constantly, Y only once" - an amplifier paired against a diminisher for rhetorical symmetry. Also covers the closer form: two consecutive sentences with mirrored subjects ("The code is one thing. Maintaining it is another.").

Punchy paragraph-closer (weight 2): a short, quotable fragment landing the "lesson" of a paragraph - "That's the part that stuck." Delete it and let the evidence stand alone.

"Is the real work" framing (weight 1): a formulaic landing phrase for delivering a conclusion.

Reframe-as-insight pivot (weight 2): "Seen this way, the whole thing reads differently" - a participial pivot manufacturing the appearance of insight the sentence didn't earn.

Frame-first opener (weight 1): starting with the thesis ("X is the hard part") instead of the actual experience.

Repeated question-shape list (weight 2): four parallel "what/why" clauses inside one sentence instead of varied noun phrasing.

Self-aware parenthetical (weight 1): "(which I choose to read as progress)" - naming your own interpretation instead of just stopping at the observation.

Matched reason-chains (weight 1): three consecutive sentences all shaped "X because Y," even across different subjects.

Comparative framing instead of direct description (weight 2): "more X than Y," or its reversed cousin "X rather than Y" - describing something by contrast with an opposite instead of just describing it.

Negating before asserting (weight 2): "not just X," "not X, it's Y" - naming what something isn't before saying what it is.

Setup without a colon (weight 1): "What surprised me was..." - an announcement sentence, colon or not.

Quotable closer or mirrored reversal (weight 2): either a standalone-wisdom closing line, or full chiasmus ("specific about being wrong" mirrored against "vague about being right") - real insight is asymmetric.

Repeated opener (weight 2): the same sentence-starter two or three times in a row for emphasis. Collapse or vary it.

Clean binary where there's a spectrum (weight 1): "either X or Y" presented as the only options, including the symmetric-tradeoff variant "(X, but Y) or (A, but B)."

Choppy fragment run (weight 1): three or more very short sentences in a row (under 7 words each) with no longer counterweight - the inverse rhythm problem, same family as forced dramatic-fragment punchlines.

Aphorism dressed as insight (weight 1): "X is the language of Y" mid-paragraph, not just as a closer.

Answering nobody (weight 1): "This isn't mainly about X," "to be clear" - rebutting a position that appears nowhere else in the piece.

Straw option, quickly dismissed (weight 1): "A tempting approach would be X, but..." introducing an option no reader would seriously consider and never mentioning it again.

What doesn't count on its own

Every one of these needs corroboration from something else before it moves the verdict:

  • Perfect grammar - plenty of writers are professionals or edited.
  • Mixed casual/formal register in one piece - can reflect field, age, or habit.
  • Generic dry prose without any of the tells above - dryness alone isn't a tell.
  • Formal or academic vocabulary outside the stock-vocabulary list.
  • Salutations and sign-offs on a letter or email - these predate ChatGPT by centuries.
  • A single "however," "moreover," or "additionally" - only piled-up use counts.
  • Curly quotes alone - many editors and CMSes auto-curl.
  • Em dashes alone - many professional editors use them; only the construction (paired with other tells) is evidence.
  • One short sentence for emphasis - only three or more in a row counts.
  • Deliberate repeated openings for rhythm ("She came. She saw. She conquered.") - only flag repetition that adds nothing.
  • A named, answered objection - the "answering nobody" tell requires the objection to come from nowhere.
  • Unsourced claims - common in ordinary human writing; not evidence alone.
  • Anything from before November 30, 2022 (ChatGPT's public launch) - with rare exceptions, not AI-written regardless of score.

Weigh these the other direction - toward human, even against fired tells:

  • Specific, unusual, hard-to-invent details (a real address, an odd direct quote).
  • Mixed feelings or unresolved tension stated directly.
  • Dated, era-bound slang or in-jokes tied to a specific year - models lag current slang.
  • Genuine self-corrections mid-sentence.
  • Real sentence-length variety, not an even mid-length cadence.

Calibration

  • Texts under 100 words have fewer tells available to fire at all - cap confidence lower regardless of the density result.
  • Technical writing with domain jargon can suppress the word-choice cluster even in AI text - don't penalize accurate domain vocabulary.
  • Academic or legal writing legitimately uses hedges and semicolons - down-weight those tells in that register.
  • ESL writing can mimic some of these patterns (uniform sentence length, hedge-heavy) - note when that's plausible.
  • The voice-and-construction cluster fires on patterns that read as good writing - don't discount them for that reason. That's precisely why they're the hardest tells: AI learned them from skilled human writers.
  • A single well-turned closing line in a long personal essay is less diagnostic than the identical pattern in a 200-word post where it's the only memorable sentence.

Non-English text

Most of the catalog is conceptual, not lexical, and transfers across languages fine. Clusters 2-4 (rhythm, shape, voice and construction) test structural and rhetorical patterns - flat sentence rhythm, three-beat symmetry, inflated significance, brochure language - not English trigger phrases. Evaluate these directly against the source-language text, judging whether the pattern is present, not string-matching against the English examples given for each tell. Do this in the language the text was actually written in - don't translate first. Translating before checking rhythm or structure means scoring the translation's sentence shape, not the original writer's.

Cluster 1 (stock AI vocabulary) is the one genuinely English-locked part of the catalog - a literal word list ("delve," "leverage," "robust"), not a transferable concept, and there's no verified equivalent list for other languages here. For that cluster only, producing a literal, non-idiomatic gloss and checking it against the English word list is allowed as a corroborating signal, never as the primary read. Weight anything found this way at half its normal points, and never let a gloss-only hit move the verdict on its own

  • it needs a cluster 2-4 finding from the actual source text to corroborate it, same principle as "what doesn't count on its own" above. Keep the gloss literal and mechanical, not a fluent translation: an idiomatic, natural-sounding translation risks manufacturing false positives, an ordinary phrase in the source language can read as a cliché once flattened into English by a good translation.

Report which parts happened - conceptual read on the source text, plus (if used) a gloss-based check on vocabulary only. Confidence still caps lower than English text even with this approach; it corroborates, it doesn't fully close the calibration gap.

Known ceilings on this method (and on any rule-based check)

  • Raw, non-instruction-tuned base-model output reads as human to current detectors - what they actually key on is RLHF/instruction-tuning residue (polite hedging, structured enumeration, "helpful assistant" register), not "AI-ness" itself. If the text plausibly came from a base model or a lightly-paraphrased attack, cap confidence lower even when surface tells look clean.
  • Zero-shot detectors have a documented blind spot on Claude-generated text specifically (much lower detection rates than on other model families) - treat a clean result on plausibly-Claude text with extra caution.
  • Text run through one or more paraphrase passes defeats most surface checks, this one included - if the user mentions the text was paraphrased, down-weight everything.
  • Non-English text gets miscalibrated badly by most detectors, including this one - see "Non-English text" above for what still applies (clusters 2-4, read directly) and what doesn't (cluster 1, gloss-corroborated only). Even done right, confidence stays capped below what the same approach gets on English text.

Output

For every tell that fires, one line: name, a quote or description, and its weight. Skip anything scoring 0 - don't list what didn't fire. Follow with two to four sentences in plain language naming the strongest tells - specific about which phrases or absences mattered, not just a density number. If the verdict lands at "Reads AI" or "Heavily AI," add up to three concrete fixes as compact bullets, not a full rewritten sample.

If another skill invoked this one internally (e.g. ghost running a pre-check or verification pass) rather than the user directly asking to check a piece of text, skip printing any of this. Still run the full analysis for real, but hand back only the verdict and total density for the caller to build its own one-line status.

What a clean result actually means

A clean result here means no known, rule-based tell fired. It is not proof the text would pass a real trained classifier (Pangram, GPTZero) - this is a self-graded checklist applied by the same kind of model that may have drafted the text, and it can miss patterns a learned classifier catches, or flag things a learned classifier wouldn't. Don't report a clean pass as "this is safe" or "this will pass detection" - say what it actually means: no rule violations found here, risk from anything this checklist doesn't cover still possible.

相关技能

steipete/notion

Notion CLI/API for pages, Markdown content, data sources, files, comments, search, Workers, and raw API calls.

community

affaan-m/seo

Audit, plan, and implement SEO improvements across technical SEO, on-page optimization, structured data, Core Web Vitals, and content strategy. Use when the user wants better search visibility, SEO remediation, schema markup, sitemap/robots work, or keyword mapping.

community

affaan-m/brand-voice

Build a source-derived writing style profile from real posts, essays, launch notes, docs, or site copy, then reuse that profile across content, outreach, and social workflows. Use when the user wants voice consistency without generic AI writing tropes.

community

affaan-m/crosspost

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

community

affaan-m/x-api

X/Twitter API integration for posting tweets, threads, reading timelines, search, and analytics. Covers OAuth auth patterns, rate limits, and platform-native content posting. Use when the user wants to interact with X programmatically.

community

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

community